diff --git a/app/static/workspace.js b/app/static/workspace.js index 9db1395..3b47813 100644 --- a/app/static/workspace.js +++ b/app/static/workspace.js @@ -135,7 +135,8 @@ function design(){if(!currentSite())return noSite();const s=state.site;const car return htmlHeading('外观与设计','先选一套网站风格,再打开可视化编辑器修改图文、导航和手机端布局。')+ `

第一步 · 选择行业主题

更换主题不会删除您已经录入的业务内容和 URL。

查看完整主题预览 ↗
${cards}
`+ `

第二步 · 导航菜单

自定义网站的顶部导航:添加、删除、排序菜单项,支持三级下拉。

`+ - `

第三步 · 设计网页

挑选要修改的页面;可在设计器中编辑导航、页眉、页脚及各设备布局。

选择要设计的页面

修改先保存为草稿,正式发布设计后才会参与下一次静态构建。

${state.entries.filter(e=>e.type==='page').slice(0,8).map(e=>`▤

${esc(e.title)}

${esc(e.route)}

›
`).join('')||'
尚无页面,请先添加内容。
'}
提示:网站设置用于公司信息和域名;可视化编辑器用于调整页面外观。两者不会混在同一表单里。
`; + `

第三步 · 品牌标识

上传 Logo 和设置顶部联系按钮。

🏷 Logo 与联系按钮

Logo 显示在网站顶部左侧;联系按钮显示在导航右侧。

${s.logo?`Logo`:'
暂无 Logo
'}
${s.logo?' ':''}
`+ + `

第四步 · 设计网页

挑选要修改的页面;可在设计器中编辑导航、页眉、页脚及各设备布局。

选择要设计的页面

修改先保存为草稿,正式发布设计后才会参与下一次静态构建。

${state.entries.filter(e=>e.type==='page').slice(0,8).map(e=>`▤

${esc(e.title)}

${esc(e.route)}

›
`).join('')||'
尚无页面,请先添加内容。
'}
提示:网站设置用于公司信息和域名;可视化编辑器用于调整页面外观。两者不会混在同一表单里。
`; } function imports(){if(!currentSite())return noSite();return htmlHeading('导入与迁移','根据您已有的资料选择操作方式:Excel 产品、WordPress 网站,或者外部 API / 数据库。')+ `
▤

导入 Excel / CSV

推荐先预览字段、检查冲突,再确认提交。

安全导入与批次回滚 →
⇄

迁移 WordPress 旧站

迁移会话、文章采集、图片与 SEO 检查。

打开迁移工作台 ↗
⌘

API / XML / MySQL

连接外部业务系统,进行字段映射和分批导入。

进入高级导入 ↗
`+ @@ -375,4 +376,27 @@ function addNavItem(){navItems.push({title:'新菜单',route:'/'});drawNavEditor function removeNav(i){navItems.splice(i,1);drawNavEditor()} function moveNav(i,dir){const t=navItems[i];navItems[i]=navItems[i+dir];navItems[i+dir]=t;drawNavEditor()} window.W={addNavItem,removeNav,moveNav,saveNavDraft,publishNav}; +// Logo 上传与 CTA 设置 +async function uploadLogo(file){if(!file||!state.site)return;try{ + const form=new FormData();form.append('file',file); + const r=await api(`/api/sites/${state.site.id}/media`,{method:'POST',body:form}); + await api(`/api/sites/${state.site.id}`,{method:'PATCH',body:JSON.stringify({logo:r.url})}); + await refreshSiteKeepView();rerender();toast('Logo 已上传并生效'); +}catch(e){toast('Logo 上传失败:'+e.message,true)}} +async function removeLogo(){if(!state.site)return;try{ + await api(`/api/sites/${state.site.id}`,{method:'PATCH',body:JSON.stringify({logo:''})}); + await refreshSiteKeepView();rerender();toast('Logo 已移除'); +}catch(e){toast(e.message,true)}} +async function saveCta(){if(!state.site)return;try{ + const text=$('#ctaTextInput')?.value?.trim()||'Contact Us'; + const href=$('#ctaHrefInput')?.value?.trim()||'/contact-us/'; + const show=$('#ctaShowInput')?.checked!==false; + const d=await api(`/api/sites/${state.site.id}/site-design`); + const config=d.config||{};config.header=config.header||{}; + config.header.cta_text=text;config.header.cta_href=href;config.header.show_cta=show; + await api(`/api/sites/${state.site.id}/site-design`,{method:'PUT',body:JSON.stringify({config,expected_revision:d.revision})}); + const r2=await api(`/api/sites/${state.site.id}/site-design/publish`,{method:'POST',body:JSON.stringify({expected_revision:(d.revision||0)+1})}); + toast('联系按钮已保存,重新构建后生效'); +}catch(e){toast('保存失败:'+e.message,true)}} +window.W.uploadLogo=uploadLogo;window.W.removeLogo=removeLogo;window.W.saveCta=saveCta; document.addEventListener('DOMContentLoaded',init);