diff --git a/app/static/workspace.js b/app/static/workspace.js
index 1c7b367..9db1395 100644
--- a/app/static/workspace.js
+++ b/app/static/workspace.js
@@ -84,7 +84,7 @@ function guide(){
生成网站制作一份可预览、可下载的静态网站版本。
检查与审批核对页面、图片、网址和 SEO,并取得相应审批。
正式上线把批准的版本部署到正式服务器,再核对公网访问。
- 重要说明:${journey.live?'系统发现正式发布记录,但无法仅凭该记录确认当前公网网站可访问,请人工检查实际域名。':'当前没有可确认的正式发布记录;生成 ZIP 或点击“发布设计”都不代表网站已上线。'}${journey.changedAfterBuild?' 网站内容在最近一次构建后可能有变化,建议重新构建并预览。':''}${!journey.domain?' 正式域名尚未填写,不影响预览。':''}`;
+ 重要说明:${journey.live?'系统发现正式发布记录,但无法仅凭该记录确认当前公网网站可访问,请人工检查实际域名。':'当前没有可确认的正式发布记录;生成 ZIP 或点击"发布设计"都不代表网站已上线。'}${journey.changedAfterBuild?' 网站内容在最近一次构建后可能有变化,建议重新构建并预览。':''}${!journey.domain?' 正式域名尚未填写,不影响预览。':''}`;
}
// V8.28 guided delivery: one deliberate action per stage, existing secure APIs only.
function launch(){
@@ -124,11 +124,11 @@ function content(){if(!currentSite())return noSite();let arr=state.entries.filte
const pageItems=arr.slice(start,start+PAGE_SIZE);
const typeCounts={};state.entries.forEach(e=>typeCounts[e.type]=(typeCounts[e.type]||0)+1);
const tabs=[{key:'',label:'全部',count:state.entries.length},...Object.entries(typeName).filter(([k])=>typeCounts[k]).map(([key,value])=>({key,label:value,count:typeCounts[key]}))];
- const tabHtml=`${tabs.map(t=>``).join('')}
`;
- const pagination=totalPages>1?``:'';
+ const tabHtml=`${tabs.map(t=>``).join('')}
`;
+ const pagination=totalPages>1?``:'';
return htmlHeading('内容与页面','所有网页、产品、车型和新闻都在这里维护,保存后重新构建即可更新网站。',actionButton('+ 添加内容','new-entry'))+
- `内容列表
共 ${state.entries.length} 条内容。点击”设计页面”可进行可视化排版。
${tabHtml}
`+
- (pageItems.length?`
| 名称 | 类型 | 页面地址 | 状态 | 操作 |
${pageItems.map(e=>`| ${esc(e.title)} | ${esc(typeName[e.type]||e.type)} | ${esc(e.route)} | ${e.status==='draft'?'草稿':'已发布'} | ${e.id?` ▤ 设计页面`:''} |
`).join('')}
${pagination}`:emptyState('没有找到内容','可以清除筛选条件,或者添加新内容。',actionButton('+ 添加内容','new-entry')))+
+ `
内容列表
共 ${state.entries.length} 条内容。点击"设计页面"可进行可视化排版。
${tabHtml}
`+
+ (pageItems.length?`
| 名称 | 类型 | 页面地址 | 状态 | 操作 |
${pageItems.map(e=>`| ${esc(e.title)} | ${esc(typeName[e.type]||e.type)} | ${esc(e.route)} | ${e.status==='draft'?'草稿':'已发布'} | ${e.id?` ▤ 设计页面`:''} |
`).join('')}
${pagination}`:emptyState('没有找到内容','可以清除筛选条件,或者添加新内容。',actionButton('+ 添加内容','new-entry')))+
`
`;
}
function design(){if(!currentSite())return noSite();const s=state.site;const cards=Object.entries(themeName).map(([id,name])=>`
${name}
${name} ${s.theme===id?'当前使用':''}
${({automotive:'适合汽车出口、车型及品牌展示',industrial:'适合制造业、产品与技术参数',corporate:'适合集团公司、服务和案例',minimal:'适合作品展示和品牌形象','trade-pro':'适合外贸 B2B 英文站点与询盘'})[id]}
预览页面效果`).join('');
@@ -158,7 +158,7 @@ function builds(){if(!currentSite())return noSite();const latest=latestDone();co
最近发布任务
${(state.delivery.jobs||[]).length?state.delivery.jobs.slice(0,8).map(j=>`
${['queued','running','retrying'].includes(j.state)?`
`:''}
`).join(''):'
暂无发布任务。
'}
已发布版本
${(state.delivery.history||[]).length?state.delivery.history.slice(0,8).map(r=>`
`).join(''):'
当前没有远程部署记录。
'}
`;
}
-function settings(){if(!currentSite())return noSite();const s=state.site;return htmlHeading('网站设置','这里只管理公司资料、域名与站点属性。网页样式请到“外观与设计”修改。')+
+function settings(){if(!currentSite())return noSite();const s=state.site;return htmlHeading('网站设置','这里只管理公司资料、域名与站点属性。网页样式请到"外观与设计"修改。')+
`基本资料
没有域名也可以制作与预览网站,正式上线前再填写即可。
`;
}
function languages(){
@@ -166,13 +166,13 @@ function languages(){
const d=state.language||{group:null,sites:[],units:[]};const g=d.group;
const groups=state.languageGroups||[];
const header=htmlHeading('多语言管理','多个语言版本分别拥有独立的网站、域名和内容。系统只关联已审核的翻译,不会自动翻译企业事实。','');
- if(!g)return header+``+
+ if(!g)return header+``+
(groups.length?`加入已有语言组
仅可关联您有管理权限、且已配置独立 HTTPS 域名的网站。
`:'')+
`上线前提示:网站设置中的正式域名应为 https://example.com 形式;不同语言网站不能共用一个域名。当前域名:${esc(state.site.domain||'未设置')}
`;
const groupSites=d.sites||[]; const uniqueUnits=[...new Map((d.units||[]).map(u=>[u.id,u])).values()];
const canJoin=state.sites.filter(x=>!groupSites.some(m=>m.site_id===x.id));
return header+`${esc(g.name)}
当前站语言 ${esc(g.locale)} · 默认语言 ${esc(g.default_locale)} · ${groupSites.length} 个语言站点
| 语言 | 网站 | 正式域名 |
${groupSites.map(x=>`| ${esc(x.locale)} | ${esc(x.name)} | ${esc(x.domain)} |
`).join('')}
`+
- `第二步 · 添加其他语言网站
先通过“我的网站”创建另一语言站并设置 HTTPS 域名,再加入语言组。
`+
+ `第二步 · 添加其他语言网站
先通过"我的网站"创建另一语言站并设置 HTTPS 域名,再加入语言组。
`+
`第三步 · 建立翻译内容关系
相同产品、文章或页面可以使用不同 URL。用一个内容标识关联它们,只有正式发布且审核通过的内容才会生成 hreflang。
`+
`第四步 · 关联各语言的实际内容
`+
`已有语言关系
没有已审核的双向内容关系,就不会输出假语言链接。
${d.units.length?`
| 内容组 | 语言 | 内容 / URL | 状态 |
${d.units.map(u=>`| ${esc(u.reference_key)} | ${esc(u.locale)} | ${esc(u.title)} ${esc(u.route)} | ${u.state==='approved'?'已审核':'待翻译'} |
`).join('')}
`:'
还没有关联内容。
'}
`;
@@ -283,7 +283,7 @@ async function cancelJob(jobId){if(!state.site)return;if(!confirm('确定取消
async function buildNow(){if(!state.site)return toast('请先选择网站',true);if(state.building||activeJobs().length)return toast('已有构建在执行,请先查看任务状态');
const id=state.site.id;state.building=true;
try{navigate('build');state.job='正在提交构建任务…';rerender();const job=await api(`/api/sites/${encodeURIComponent(id)}/builds`,'POST',{mirror_images:false},{'Idempotency-Key':crypto.randomUUID()});
- if(state.site?.id!==id)return;state.job=`任务 ${job.id?.slice(0,12)||'已提交'} 已进入队列,可以离开页面;重新打开“构建与交付”查看结果。`;toast('已提交构建任务');await refreshBuilds();
+ if(state.site?.id!==id)return;state.job=`任务 ${job.id?.slice(0,12)||'已提交'} 已进入队列,可以离开页面;重新打开"构建与交付"查看结果。`;toast('已提交构建任务');await refreshBuilds();
}catch(e){notifyError(e)}finally{state.building=false;if(state.site?.id===id&&state.view==='build')rerender()}}
function selectedReleaseBuild(){const id=$('#deliveryBuild')?.value;if(!id)throw Error('没有可发布的构建版本,请先完成网站构建');return id}
function showDeliveryMessage(message){const el=$('#deliveryNotice');if(el){el.hidden=false;el.textContent=message}toast(message)}