From 41b02da9984133304fb1d50cadf9d90c007aae3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Wed, 28 Oct 2026 14:39:24 +0800 Subject: [PATCH] fix: replace 82 smart quotes with straight quotes in workspace.js --- app/static/workspace.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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?`
第 ${state.page} / ${totalPages} 页 · 共 ${arr.length} 条
`:''; + const tabHtml=`
${tabs.map(t=>``).join('')}
`; + const pagination=totalPages>1?``:''; return htmlHeading('内容与页面','所有网页、产品、车型和新闻都在这里维护,保存后重新构建即可更新网站。',actionButton('+ 添加内容','new-entry'))+ - `

内容列表

共 ${state.entries.length} 条内容。点击”设计页面”可进行可视化排版。

${tabHtml}
`+ - (pageItems.length?`
${pageItems.map(e=>``).join('')}
名称类型页面地址状态操作
${esc(e.title)}${esc(typeName[e.type]||e.type)}${esc(e.route)}${e.status==='draft'?'草稿':'已发布'}${e.id?` ▤ 设计页面`:''}
${pagination}`:emptyState('没有找到内容','可以清除筛选条件,或者添加新内容。',actionButton('+ 添加内容','new-entry')))+ + `

内容列表

共 ${state.entries.length} 条内容。点击"设计页面"可进行可视化排版。

${tabHtml}
`+ + (pageItems.length?`
${pageItems.map(e=>``).join('')}
名称类型页面地址状态操作
${esc(e.title)}${esc(typeName[e.type]||e.type)}${esc(e.route)}${e.status==='draft'?'草稿':'已发布'}${e.id?` ▤ 设计页面`:''}
${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=>`
${j.kind==='remote_rollback'?'回滚':'部署'} · ${esc(buildStatusLabel(j.state))}

${esc(j.id.slice(0,12))} · ${esc(j.created_at)}${j.error?' · '+esc(j.error):''}

${['queued','running','retrying'].includes(j.state)?``:''}
`).join(''):'

暂无发布任务。

'}

已发布版本

${(state.delivery.history||[]).length?state.delivery.history.slice(0,8).map(r=>`
${esc(r.target)} · ${esc(r.release_id)}

构建 ${esc(r.build_id.slice(0,12))} · ${esc(r.deployed_at)}

`).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=>``).join('')}
语言网站正式域名
${esc(x.locale)}${esc(x.name)}${esc(x.domain)}
`+ - `

第二步 · 添加其他语言网站

先通过“我的网站”创建另一语言站并设置 HTTPS 域名,再加入语言组。

`+ + `

第二步 · 添加其他语言网站

先通过"我的网站"创建另一语言站并设置 HTTPS 域名,再加入语言组。

`+ `

第三步 · 建立翻译内容关系

相同产品、文章或页面可以使用不同 URL。用一个内容标识关联它们,只有正式发布且审核通过的内容才会生成 hreflang。

`+ `

第四步 · 关联各语言的实际内容

`+ `

已有语言关系

没有已审核的双向内容关系,就不会输出假语言链接。

${d.units.length?`
${d.units.map(u=>``).join('')}
内容组语言内容 / URL状态
${esc(u.reference_key)}${esc(u.locale)}${esc(u.title)}
${esc(u.route)}
${u.state==='approved'?'已审核':'待翻译'}
`:'

还没有关联内容。

'}
`; @@ -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)}