diff --git a/.workbuddy/memory/2026-08-24.md b/.workbuddy/memory/2026-08-24.md new file mode 100644 index 0000000..447f079 --- /dev/null +++ b/.workbuddy/memory/2026-08-24.md @@ -0,0 +1,151 @@ +# 2026-08-24 + +## 博客后台可替换模板子系统(一期完整落地) + +按批准计划(cosmic-pulse-einstein.md)实现"后台可替换模板":classic 经典 / ubuntu-terminal 终端 / custom 自定义布局包三类模板。 + +### 后端(Go/Gin) +- 新增 `models/template.go`(Template 模型)、`repositories/template_repository.go`(CRUD + GetCurrentSiteTemplateSlug + ActivateTemplate)。 +- `repositories/migration.go` 新增 `MigrateTemplates()`:建 templates 表 + 种入内置模板(classic/ubuntu-terminal)+ 种 site_template=classic setting。 +- 新增 `handlers/template.go`:公开 `GET /api/templates`、`GET /api/templates/:slug`;后台 upload(zip 严格校验:10MB/200 条目/50MB 解压/扩展名白名单禁 js·html·svg/路径穿越防护/manifest 校验)、CRUD、activate。权限复用 settings 组。 +- `handlers/setting.go` publicKeys 加 site_template;`main.go` 注册路由 + 调用迁移。 +- 内置模板 Slug 保留字:classic / ubuntu-terminal;自定义 slug 需 `^[a-z0-9][a-z0-9-]{0,31}$`。 + +### 前端(Vue3) +- `App.vue` 改造为布局分发器:templateMode = classic/terminal/custom,支持 `?preview_template=slug` 预览覆盖;admin/login/presentation(PPT) 绕过分发。 +- 新增 `layouts/ClassicLayout.vue`(从 App.vue 抽出)、`layouts/TerminalLayout.vue`、`layouts/CustomLayoutRenderer.vue`。 +- 终端模板 `terminal/`:TerminalShell(输入/↑↓历史/Tab 补全/自动滚动)+ commands.ts(ls/cd/cat/search/works/columns/snippets/videos/services/about/tags/help/pwd/whoami/date/echo/banner/clear,支持 &&)+ output/ 四个渲染组件;深链映射 route.path→命令会话;Ubuntu 紫黑配色(Ubuntu Mono 风格)。 +- 自定义渲染引擎 `layouts/`:blocks/basic.ts(header/nav/hero/footer/image/link/divider/static_html)+ BlockDataList/BlockPostDetail/BlockAboutBrief + blocks/index.ts 白名单映射;resolvers.ts(settings bindings + 数据源加载 + HTML 清洗);皮肤 CSS 注入 `data-template` 隔离、卸载移除。 +- `api.ts` 新增模板接口(fetchTemplates/fetchTemplateDescriptor/getAdminTemplates/uploadTemplate/updateTemplate/activateTemplate/deleteTemplate);PublicSettings 加 site_template。 +- 后台:`pages/admin/TemplateManage.vue`(上传/列表/设为当前/预览/停用/删除)+ 菜单「模板管理」+ Settings.vue「模板」分组下拉选择(schema 加 template-select 类型)。 + +### 验证 +- 后端 go build 通过(scripts/ 目录有项目原有 main 冲突,与本次无关)。 +- 前端 vue-tsc --noEmit 通过、vite build 通过。 +- 说明:本地 8081 后端为旧进程(PID 56808),**需重启后** /api/templates、site_template 才生效;终端模板可用 `/?preview_template=ubuntu-terminal` 无需后端新接口直接预览(dev server 8888 已启动)。 + +### 交付物 +- 示例自定义布局包:`examples/custom-template-demo/`(manifest+layout+skin)及打包 `examples/minimal-demo.zip`,可直接后台上传测试。 + +### 环境注意 +- vite build 会被安全删除保护拦截(清空 dist 超 50 文件),先把 dist 移到仓库外临时目录再 build。 + +## 模板系统收尾优化(四项,均已落地) + +1. **内置模板完全锁定**:`server/handlers/template.go` 的 AdminUpdateTemplate 增加 IsSystem 校验——内置模板不可改名(400)、不可停用(400),description 可改;删除保护原有双保险。 +2. **模板管理页增强**: + - 后端新增 `GET /api/admin/templates/:id` 详情接口(AdminGetTemplateDetail,返回 manifest/layout 全文 + assetsBase + isCurrent)。 + - 前端新增 `components/admin/TemplatePreviewModal.vue`(iframe 预览 `/?preview_template=`)+ `TemplateDetailDrawer.vue`(概览/manifest/layout JSON Tab + 复制);TemplateManage.vue 接入(预览改内嵌模态框、加详情按钮、上传区 📦→Icon)。 + - api.ts 新增 TemplateDetail 类型 + getTemplateDetail。 +3. **文档**:新建根 `README.md`(项目概览/技术栈/快速开始/目录结构/模板概述)与 `docs/TEMPLATE-DEV.md`(模板开发手册:体系/终端命令表/URL 深链映射/zip 规范/manifest+layout schema/block 白名单/bindings/skin 隔离/操作流程/扩展指南)。 +4. **后台 emoji → lucide 图标**:AdminMenuItem.vue 图标改 `` 渲染;AdminLayout 30 个菜单 emoji 映射为图标名(bar-chart-3/trending-up/theater/presentation 等,已核对 lucide 0.446 存在);pages/admin 18 文件 40 处 + components/admin 3 文件(AccessLogModal/PostHistoryModal/UserPickerPopover)批量替换(脚本 emoji2icon.py 在临时目录,按容器智能 size 28/14,自动注入 import Icon)。后台已无 emoji 残留(前台 pages/Categories.vue 与 TerminalLayout 的 ✕ 不在范围内未动)。 + +验证:go build OK、vue-tsc --noEmit OK、vite build OK。后端 8081 仍为旧进程需重启后新接口/锁定逻辑生效。 + +## 模板卡片单选 + 终端交互/配色增强(Craft 完成) + +1. **站点模板卡片单选**:`client/src/pages/admin/Settings.vue` 的 template-select 由 select 改为卡片单选网格(模板名/类型徽标/slug/选中对勾,active 高亮边框),引入 Icon(check 图标)。样式 scoped 追加 template-picker 系列。 +2. **终端配色可配置(localStorage)**: + - 新增 `client/src/terminal/theme.ts`:THEME_PRESETS(ubuntu 紫/经典绿/白底/现代深灰)+ 自定义颜色 10 项(bg/windowBg/titlebarBg/titlebarText/text/muted/prompt/accent/error/banner),load/save 存 localStorage key `terminal-theme`(JSON {preset, colors}),themeToVars 生成 CSS 变量。 + - 新增 `client/src/terminal/TerminalThemePanel.vue`:预设色卡 + 10 项 color input + 恢复默认/关闭。 + - `TerminalLayout.vue` 根容器 :style 应用 --term-* 变量;标题栏新增调色板按钮打开面板;scoped 样式与 `terminal.css` 全部改 var(--term-*)(color-mix 做混合色)。 +3. **终端命令/导航交互增强**(commands.ts + types.ts): + - 新命令:`man `、`history [-c]`、`back`(浏览器后退)、`open `、`theme`(开面板)、`reload`;`help [命令]` 支持单个命令详情;`cd -` 返回上一目录(ctx 增 getLastDir/setLastDir)。 + - CommandContext 扩展:getLastDir/setLastDir/getHistory/clearHistory/openThemePanel;TerminalLayout 维护 lastDir 与 history ref。 + - PostDetailOutput 顶部加「返回」按钮(emit back → router.back()),TerminalShell 转发 back 事件。 +4. **文档**:docs/TEMPLATE-DEV.md 命令表更新(新命令 + cd -)+ 新增 §2.3 终端配色(预设/自定义/localStorage/变量约定);README 终端描述补配色说明。 + +验证:vue-tsc --noEmit OK、vite build OK;后台 admin 目录 grep 无 emoji 残留。dev server 8888 已重启(之前进程超时退出)。 + +## 修复:终端输入框/骨架样式未还原(scoped 穿透问题) +根因:TerminalShell.vue 内部元素的骨架样式(.term-body/.term-line/.term-prompt/.term-cmd-text/.term-info/.term-error/.term-banner/.term-input 等)写在了 TerminalLayout.vue 的 ` diff --git a/client/src/components/admin/TemplatePreviewCanvas.vue b/client/src/components/admin/TemplatePreviewCanvas.vue new file mode 100644 index 0000000..859f00a --- /dev/null +++ b/client/src/components/admin/TemplatePreviewCanvas.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/client/src/components/admin/TemplatePreviewModal.vue b/client/src/components/admin/TemplatePreviewModal.vue new file mode 100644 index 0000000..9b0bfd7 --- /dev/null +++ b/client/src/components/admin/TemplatePreviewModal.vue @@ -0,0 +1,149 @@ +