Appearance
静态博客与提示词管理后台重构交接清单
更新:2026-09-24(收尾会话)。工作分支:codex/blog-backend-admin。工作树:/Users/chris/.codex/worktrees/blog-backend-admin/coding-blog。当前 HEAD:以 git log -1 为准(本文档随每次收尾更新)。
先读这两份文件
目标:公开博客继续只从 VitePress Markdown、JSON 和静态资源构建,不从 MySQL 实时读取文章。后台只保留单管理员认证和私有的“提示词 + 一张生成图片”管理;元数据在 MySQL(coding_blog_qa),图片在 MinIO 私有桶 prompt-results。管理前端为 React。不要恢复 CMS、发布快照、数据库导出或后台部署/回滚链路。
状态:Task 1–14 全部完成,收尾复审已完成
| 计划项 | 状态与证据 |
|---|---|
| Task 1–3 静态内容源 / 单管理员 / 删旧 CMS | 已提交并通过规格与质量复审(f34c18f、524b0ec、1bbe440、c21ea8e、0c1e75a)。 |
| Task 4–7 持久化 / 图片校验与 MinIO / 服务层 / API | 已提交(935c093、20d30fb、33a8991、5ccacb9、b0e901f、409def8、ddb79fa)并复审。后端 mvn clean test 113/113。 |
| Task 8 本地编排 | 已提交 2c7ffe7;私有桶初始化与编排契约测试通过。 |
| Task 9–12 React 壳 / 列表 / 上传 / 详情删除 | 已提交 427d5ac、e8a774d、64e2e20、85c82b6、8b6b9f2、6afb26c、209ad2c。独立规格与质量复审已补做(2026-09-24),发现的问题已在 cac81c7 修复,详见下节。 |
| Task 13 文档清理 | 已提交 475a125。 |
| Task 14 隔离 QA 验收 | 已完成:coding_blog_qa 重建、私有桶就绪、smoke 冒烟(登录/CSRF/CRUD/签名预览/幂等删除/改密)、1440/768/375px 真实浏览器验收通过;docs/public 静态提示词档案经 git diff 确认未改动。 |
2026-09-24 收尾会话做了什么
- 独立复审(规格 + 质量两个只读代理) 覆盖
64e2e20、85c82b6、8b6b9f2、6afb26c、209ad2c。结论:无 P0;规格复审 3 项 P1、质量复审 4 项 P2 及若干次要项。 - 按测试先行修复并提交
cac81c7(fix: apply prompt pages review hardening):- P1 列表卡片新增常驻删除入口(复用删除弹窗),删除当前页最后一条时页码自动回退;
- P1 移动端(<768px)antd 按钮/输入/下拉与分页选择器最小高度 44px;
- P1 过渡动画收敛为仅
transform(新增 CSS 契约测试锁定“仅 transform/opacity”与 reduced-motion 规则); - P2 ImagePicker 过期
onload回调不再覆盖新图尺寸;列表快照补size、卸载与刷新时保存、挂载惰性恢复消除恢复期双请求;删除弹窗重开清除旧错误;新增api/prompts契约测试(multipart 字段名/信封解包/分页参数),并移除手写 multipartContent-Type; - 次要项:复制失败给出原因与恢复办法并清理定时器、非法文件后重置 input 值、错误摘要改为按钮跳转聚焦字段且不再抢输入焦点、图片错误移到选择器旁、antd 6 弃用 API(Alert
message→title、ModalmaskClosable→mask)、as never改联合类型、删除死代码、散落色值全部令牌化、aria-label 按码点截断、上传成功改replace导航。 - 验证:前端 Vitest 60/60(8 文件)、生产构建(tsc + vite)零类型错误。
- 2026-09-24 补充修复
171dc97(fix: apply deferred admin review findings):登录页挂载后焦点移到标题(规格 §10.2,登录页在主布局之外)、应用级ErrorBoundary防整体白屏(含刷新操作,不泄露堆栈)、parseEnvelope对 2xx 响应做信封运行时校验(网关返回 HTML 等非法结构时抛业务错误而非静默放行)。验证:Vitest 70/70(10 文件)、生产构建零类型错误。至此两份复审的发现已全部处置完毕(除“后端字段错误映射到控件”受后端契约限制不可实现,维持顶部错误摘要)。 - QA 验收数据清理:核对容器名严格为
/blog-qa-mysql-20260922、schema 仅为coding_blog_qa后,DELETE FROM coding_blog_qa.prompt_record(22 → 0);admin_user(1 条 QA 引导管理员)保留。注意:QA MinIO 桶中对应 22 张图片对象未清理(本次授权范围仅限该 MySQL 库),为无害遗留。 - 真实浏览器回归(2026-09-24 第二轮):重新引导 QA 管理员
qabrowser后,在 QA 栈(后端 18080、前端 dev 5174)上以真实浏览器验证:登录跳转、列表卡片(描述性 aria-label 按码点截断、图片懒加载、元数据)、列表卡片常驻删除入口、删除弹窗(取消为初始焦点、Escape 关闭且焦点精确恢复到触发按钮)、确认删除后列表刷新回到空态、详情页完整元数据与复制提示词反馈、curl 会话验证登录/CSRF/multipart 创建/15 分钟签名 URL。375px 视口:网格单列 343px、scrollWidth-clientWidth=0(零横向溢出)、删除入口可见、按钮/输入为 44px 最小高度。375×1300 全页截图与 DOM 坐标逐项吻合(注意:IAB 在 667px 高小视口下截图管线会出现内容纵向重复的合成伪影,DOM 与几何校验证明页面本身单实例无重复,勿被该伪影误导)。两轮测试记录均经 API 删除流程清理,QA 库prompt_record归零。
尚待完成 / 需要用户决定
根已解决(2026-09-24 用户确认):用户选择“丢弃,恢复已提交版本”。两个文件已README.md与.gitignore的未提交修改git restore到 HEAD(README 回到准确的静态博客 + React 后台描述,.gitignore 恢复 VitePress 专用忽略清单);用户修改前的版本已备份到仓库外../user-pre-refactor-backup-20260924/(相对本工作树)。已解决(2026-09-24):文件仅含旧原型占位符admin-frontend/.env.productionVITE_API_BASE_URL=https://your-domain.com,会被 vite 打进生产包导致 API 指向占位域名,与规格“同源 /api”相悖。已备份到../user-pre-refactor-backup-20260924/admin-frontend.env.production后删除;重新构建确认产物不再含占位域名。部署到自有域名时如需覆盖 API 地址,应在构建时以环境变量注入,勿恢复该占位文件。- 最终验证快照(2026-09-24,HEAD
43518da):后端mvn clean test113/113;前端 Vitest 70/70、生产构建零类型错误且产物不含占位域名;根 Node 测试 29/31(2 个失败为重构前既有 SkillsMP 快照计数漂移,证据actual 1056 / expected 1055,与本次无关);git status全净。 prefers-reduced-motion真实浏览器实测受工具限制未完成:IAB 浏览器面不提供emulateMedia,macOS 系统级“减弱动态效果”默认关闭且不应替用户切换。已有 CSS 契约测试锁定规则;如需真机验证,可在系统开启减弱动态效果后复查。- MinIO QA 桶(
blog-qa-minio-20260922)遗留 22 个孤儿对象(本轮两次 API 删除测试对象已正确清理),可在下次 QA 重建时一并处理。 - QA 管理员已按规格 §12 引导流程重建:用户名
qabrowser(仅隔离 QA 库,localhost 绑定)。
工作树与安全边界
- 当前工作树
git status全净(README/.gitignore 已按用户决定恢复,占位 env 已清理)。每项提交前检查git status --short、git diff --cached --stat与git diff --cached --check,只暂存本任务文件。 - 根 Node 测试的 2 项 SkillsMP 快照失败为既有问题;不要悄悄算作通过,也不要无授权顺手修改。
- 原静态提示词图鉴
docs/public/gpt-image-prompts.json及图片仍是公开静态页面的一部分,不得迁入新后台或覆盖。 - 后端约定见
backend/AGENTS.md:Java 17、Spring Boot 4.1.1、MyBatis SQL 仅 XML、Flyway、中文 Javadoc。 - 不复制真实
application-local配置到仓库或镜像;保留 Maven 与 Docker 排除规则。 - 不合并主分支、不建 PR、不删除生产数据/卷/桶;隔离 QA 库
coding_blog_qa与 QA 容器除外(也须先核对目标)。