- V3.0 总体方案、主题与板块设计、实施计划 - cms 现状差距分析 V2.0(V1.0 已标注作废)与复用评估 V1.0 - 纵向切片设计规格(路线 C:全新架构 + 白名单资产移植) - .gitignore 先行(storage/artifacts/env 永不入库) Co-Authored-By: Claude Code <noreply@anthropic.com>
22 KiB
SiteForge 现有 CMS 项目复用评估 V1.0
评估对象:
D:\project\cms
目标项目:D:\project\cms-one(SiteForge)
评估日期:2026-10-20
依据:现有源码、数据库 Schema、测试、构建脚本、基础设施配置,以及 SiteForge V3.0 方案与实施计划。
1. 结论
D:\project\cms 不是简单样例,而是一个已经具备管理后台、控制 API、WordPress 迁移、内容模型、Astro 静态站运行时和基础测试的早期平台原型。
它与 SiteForge 的目标高度同源,适合作为代码底座和经验来源,不建议把 SiteForge 完全从零重写。但它当前仍然是“单站 MVP 向平台化演进”的状态,部分文档设计明显领先于实际代码,因此不能整体原样搬入。
推荐原则:
- SiteForge V3.0 方案继续作为当前项目的唯一产品与架构基线。
- 选择性继承
cms中已经验证的代码,不继承其过时的权限、发布、路由和数据边界。 - 优先复用迁移解析、内容版本、管理后台壳、Astro 组件、测试夹具等高价值资产。
- 对认证、发布、路由注册、主题架构、媒体安全和表单服务进行结构性重构。
- 不复制缓存、依赖目录、构建产物、真实客户数据和历史存储文件。
2. 当前项目可以直接参考或复用的部分
2.1 Monorepo 工程骨架
来源:
D:\project\cms\package.jsonD:\project\cms\pnpm-workspace.yamlD:\project\cms\turbo.jsonD:\project\cms\.github\workflows
可复用内容:
- pnpm Workspace + Turborepo 的项目组织方式。
- 管理后台、控制 API、构建 Worker、站点运行时和公共包的目录边界。
- TypeScript、Vitest、CI 的基础配置。
- 统一执行
typecheck、test、build的任务编排。
需要调整:
- CI 安装应使用冻结锁文件,而不是
--no-frozen-lockfile。 - 增加数据库迁移校验、OpenAPI 契约校验、静态站质量门禁、安全扫描和产物校验。
- 不复制
node_modules、.turbo、.data、本地日志和构建输出。
复用等级:高,可以直接作为工程骨架参考。
2.2 Art Design Pro 管理后台基础
来源:D:\project\cms\apps\admin-web
已有能力:
- Vue 3 + TypeScript + Element Plus。
- Art Design Pro 布局、菜单、路由、Pinia、Axios 和通用组件。
- 站点列表、站点管理、内容管理、媒体、导航、设置、线索和迁移页面。
- WordPress 迁移的步骤式界面。
建议保留:
- 登录后主布局、导航、标签页、请求封装、异常处理和基础表格表单组件。
- 站点切换、站点列表、迁移向导和媒体选择器的交互结构。
- Element Plus 设计体系以及 Art Design Pro 已有的工程规范。
必须精简:
- 删除注册、找回密码、动态权限演示和多角色菜单逻辑。
- 用户角色只保留一个全局
super_admin,不设计复杂 RBAC。 - 清理仪表盘、电商演示、Mock 页面和无关组件。
- 将体积过大的站点管理页面拆成独立领域页面和复用组件。
- 内容表单由硬编码逐步改为 Schema 驱动。
- 复用前确认 Art Design Pro 及第三方资源的许可证适用范围。
复用等级:高,建议直接继承后台壳和通用能力,业务页面按新方案重构。
2.3 NestJS + Fastify + Drizzle 后端基础
来源:D:\project\cms\services\control-api
已有模块:
- 认证。
- 站点管理。
- 内容类型、内容条目和内容版本。
- 媒体管理。
- WordPress 迁移。
- 线索管理。
- 构建触发。
可复用内容:
- NestJS 模块化结构和 Fastify 适配。
- Drizzle + PostgreSQL 的访问方式。
- Zod 输入校验思路。
- 显式
site_id上下文和站点隔离测试。 - 内容版本不可变、草稿与发布版本分离的基础设计。
- 站点模板初始化和默认导航生成逻辑。
需要重构:
- 用户表当前为站点级并带历史角色字段,应改为平台级单超管模型。
- 自制 HMAC Token 缺少成熟的过期、刷新、撤销和 MFA 机制,应替换。
- 审计日志、发布记录、构建任务和路由记录需要成为正式数据表,而不是内存或 JSON 附属数据。
- API 应补齐 OpenAPI、统一错误码、幂等键、操作审计和敏感操作二次确认。
复用等级:高,适合作为后端起点,但认证和发布领域不可原样沿用。
2.4 WordPress REST/WXR 迁移能力
来源:
D:\project\cms\services\control-api\src\migrationD:\project\cms\apps\admin-web\src\views\sites\migrate-tab.vueD:\project\cms\tests
已有能力:
- WordPress REST API 拉取。
- WXR 文件解析。
- 文章、产品等内容转换为中间结构。
- 媒体下载、去重和关联。
- 类型映射、迁移预览、批次导入和结果报告。
- 基于旧地址生成部分重定向。
- 幂等迁移和相关端到端测试。
这是旧项目中最值得保留的资产之一。现有文档还记录了多个真实网站迁移规模,说明相关代码不是纯概念设计。
必须调整:
- 迁移后不能自动发布,必须进入“导入批次 → 校验 → 人工审核 → 预览 → 发布”的流程。
- 旧 URL 不能只保存在
siteSettingsJSON 中,应写入正式的route_registry。 - 页面、分类、标签、自定义文章类型、附件和 SEO 元数据需要统一映射策略。
- 不能把无法映射的旧页面一律跳转首页,应进入冲突清单并人工处理。
- 语言不能硬编码为
en/es,应使用站点 Locale 配置。 - 增加断点续传、失败重试、限流、增量迁移、差异报告和可回滚批次。
- 从 HTML 提取内容时增加 XSS 清理和资源地址标准化。
复用等级:很高,保留解析器、UniversalRow 思路、媒体抓取和测试夹具,重做迁移编排。
2.5 内容模型、版本与导入幂等
来源:
D:\project\cms\services\control-api\src\contentD:\project\cms\services\control-api\src\dbD:\project\cms\docs\contracts\导入模板V1.md
可复用内容:
- 内容类型定义与内容条目分离。
- 多语言内容记录。
- 不可变版本记录。
- 通过
externalRef、Slug 等键进行幂等合并。 - 导入预校验、错误报告、状态机和 CSV 安全方面的设计经验。
建议作为 SiteForge 内容中台的起点,但需要补充:
- 内容发布状态机。
- 计划发布和撤回。
- 关联内容完整性。
- Slug/URL 冲突检测。
- 导入批次与每条记录的来源追踪。
- 批次级回滚。
- 删除保护和引用检查。
复用等级:高。
2.6 Astro 静态站运行时和页面质量门禁
来源:D:\project\cms\runtimes\astro-site-runtime
已有能力:
- Astro 5 静态站构建。
- 首页、产品、分类、新闻、项目、关于、联系、支持和 Sitemap 页面。
- Header、Footer、Hero、分页、表单、卡片网格、CTA 等组件。
- 基础主题 Token。
- Title、Description、Canonical、H1、内部链接、图片和 Sitemap 检查。
- 重定向文件生成。
- 版本化构建产物和基础回滚脚本。
可直接复用:
- Astro 的构建基础。
- 现有语义组件和样式 Token 的代码经验。
- 门禁脚本和重定向生成器作为第一版基础。
- SEO 页面输出和 Sitemap 生成思路。
必须重构:
- 页面不能继续依赖硬编码站点配置和默认内容。
- 编译器必须读取冻结的发布快照,而不是构建过程中读取变化中的在线数据。
- 主题应拆成主题包、主题清单、Token、布局、区块注册表和站点配置。
- 区块应由统一 Block Renderer 渲染,不能每个网站复制页面文件。
- 构建产物切换要使用真正的原子发布机制,而不是删除后复制。
- 门禁检查应使用 HTML 解析器而不是仅靠正则,并增加重复元数据、结构化数据、hreflang、孤链、重定向环、状态码和性能预算。
复用等级:中高,适合作为静态运行时原型,不应直接作为最终主题架构。
2.7 主题 Token 和组件契约文档
来源:
D:\project\cms\docs\contracts\ThemeToken契约V1.mdD:\project\cms\docs\contracts\组件契约V1.md
值得吸收的内容:
- 使用语义 Token,而不是在组件中直接写颜色和尺寸。
- 主题变体、版本号和升级迁移规则。
- 组件输入、插槽、SEO、可访问性和懒加载约束。
- Hero、CardGrid、FeatureGrid、CTA 等组件的标准化思路。
- WCAG 2.2 AA 作为可访问性目标。
与 SiteForge 的结合方式:
- 把“组件契约”升级为正式的 Block Manifest。
- 每个组件声明字段 Schema、默认值、允许的布局、SEO 行为、资源依赖和兼容版本。
- 区分基础 UI 组件、内容区块、页面模板和站点主题四个层级。
- 主题只能组合和覆盖,不得复制修改公共组件源码。
复用等级:高,适合作为当前主题与组件规范的补充输入。
2.8 PostgreSQL、Redis、MinIO 基础设施
来源:D:\project\cms\infrastructure
建议沿用:
- PostgreSQL:业务数据库。
- Redis:队列、分布式锁、缓存和限流。
- MinIO:本地开发的 S3 兼容对象存储。
需要修改:
- 生产环境使用受控对象存储或独立部署的兼容服务。
- 镜像必须固定版本,不能长期使用
latest。 - 开发密码不得用于生产。
- 增加备份、恢复演练、生命周期、跨环境配置和 Secret 管理。
复用等级:高。
3. 可以参考,但必须重构后使用的部分
3.1 认证与权限
旧项目保留了多角色和站点级用户的历史痕迹,而 SiteForge 已明确只需要一个超级管理员。
新设计应为:
- 平台只有一个
super_admin权限模型。 - 可允许配置一个或少量超级管理员账号,但权限完全一致,不建立角色矩阵。
- 使用成熟密码哈希、短期访问凭证、刷新/撤销机制、MFA、登录限流和安全日志。
- 所有高风险操作记录操作者、站点、对象、前后差异、IP、User-Agent 和时间。
旧认证代码只能参考接口结构,不能作为生产安全方案直接使用。
3.2 构建、发布与回滚
旧项目当前主要问题:
- 构建记录保存在进程内存中。
- API 进程直接启动构建命令。
- 构建锁仅在单进程内有效。
- Build Worker 目录基本还是占位。
- 发布替换并非严格原子操作。
- 回滚没有完整持久化的 Release 记录。
SiteForge 应改为:
- API 创建持久化 Build Job。
- Redis/BullMQ Worker 异步消费。
- 同站点使用分布式发布锁。
- 构建读取不可变 Site Snapshot。
- 产物写入版本目录或对象存储。
- 门禁通过后原子切换当前 Release 指针。
- 每次发布记录输入快照、代码版本、主题版本、产物校验和和日志。
- 回滚只切换到已验证 Release,不重新现场构建。
可继承的是构建命令、Astro 产物组织和基础门禁;发布编排需要重做。
3.3 路由与 SEO
旧项目能生成重定向文件,但路由仍是附属设置,不足以支撑“原路径不变”的核心要求。
SiteForge 必须建立独立的 route_registry:
- 每条公开 URL 都有唯一注册记录。
- 保存站点、Locale、路径、资源类型、资源 ID、状态、Canonical 和历史来源。
- 写入内容时先预占或校验路由。
- 迁移前导入完整旧站 URL 清单。
- 构建时从注册表生成页面和重定向。
- 发布门禁对旧 URL 覆盖率、404、重定向环和多跳重定向进行检查。
旧项目的 Redirect 生成脚本可以保留,但数据源应切换到路由注册表。
3.4 媒体系统
旧媒体模块已有 Sharp 缩略图和来源 URL 去重,可以保留处理经验,但存在以下缺口:
- 主要依赖本地磁盘。
- SVG 缺少严格清理。
- 删除时缺少完整引用检查。
- 未形成原文件、变体、Hash、使用关系和删除状态的完整模型。
SiteForge 应实现:
- S3 兼容对象存储。
- 文件 Hash 去重和 MIME 魔数校验。
- SVG 清理或默认禁用上传。
- 图片尺寸、格式、焦点、Alt 和变体管理。
media_usage引用关系。- 软删除、延迟物理删除和可恢复窗口。
- WebP/AVIF 等派生资源异步生成。
3.5 表单与线索
旧 Lead 模块只适合作为简单 CRUD 示例,尚不等于可对公网开放的 Form API。
SiteForge 应补充:
- 表单定义和字段 Schema。
- 来源页面、UTM、Referrer、站点和 Locale。
- 服务端校验、蜜罐、验证码、频率限制和重复提交保护。
- 隐私同意记录和可配置保留期限。
- 通知重试、Webhook 签名和失败队列。
- CSV 导出安全处理。
- 所有更新必须同时按
site_id和记录 ID 定位。
3.6 站点主题与页面编辑
旧运行时已有 Token 和组件,但页面结构仍偏硬编码。SiteForge 应建立四层结构:
- 基础组件层:Button、Container、Image、RichText 等。
- 业务区块层:Hero、ProductGrid、NewsList、FAQ、CTA、ContactForm 等。
- 页面模板层:首页、产品列表、产品详情、新闻列表、文章详情和普通页面。
- 主题层:Token、字体、间距、装饰样式、默认区块组合和可用模板清单。
主题包至少包含:
theme.manifest.tstokens.tsblocks/layouts/templates/styles/migrations/
后台编辑的是结构化区块配置,前台由 Block Renderer 统一渲染。这样才能同时做到不同网站效果不同、组件可复用、数据可迁移和主题可升级。
4. 当前阶段不建议复用或应暂缓的部分
4.1 数据分析和客户身份体系
旧文档中包含事件网关、ClickHouse、Tracking Plan、客户画像和增长分析等设计。这些能力会显著增加系统复杂度,但不是 SiteForge 第一阶段完成网站迁移、发布和维护的必要条件。
建议:
- V1 只保留基础访问统计接入位和必要操作日志。
- Event Gateway、ClickHouse、统一客户身份和高级分析延后到独立阶段。
4.2 复杂 RBAC、多租户商业化和计费
当前需求已经明确只需超级管理员,因此暂不建设:
- 角色与权限矩阵。
- 团队邀请和成员管理。
- 租户套餐、用量计费和支付。
- 审批流。
数据库可保留未来扩展空间,但不应为了可能的需求增加当前实现负担。
4.3 旧项目的真实数据与运行目录
不得直接复制:
.datastoragenode_modules.turbo.playwright-mcp- 构建产物和运行日志
- 客户网站内容、媒体、线索和导入文件
.env、Token、密码及其他 Secret
确需使用真实迁移样本时,应先获得授权并完成脱敏,再转换为最小测试夹具。
4.4 历史文档的权威地位
旧项目文档中有大量值得借鉴的设计,但部分功能只存在于文档,代码尚未实现;也有部分规则与 SiteForge 当前单超管、统一路由和冻结快照发布模型冲突。
因此:
- SiteForge V3.0 方案是当前项目的权威基线。
- 旧项目文档仅作为输入和参考。
- 任何旧设计进入实现前,都要映射到 SiteForge 的领域模型和验收标准。
5. 复用优先级矩阵
| 能力 | 现状 | 复用建议 | 优先级 |
|---|---|---|---|
| pnpm/Turborepo 工程骨架 | 已成型 | 直接参考/继承 | P0 |
| Art Design Pro 后台壳 | 已成型 | 保留壳,清理演示与多角色 | P0 |
| NestJS/Fastify/Drizzle | 已成型 | 作为 API 基础 | P0 |
| 站点上下文与隔离测试 | 已有实现 | 保留并扩大覆盖 | P0 |
| WordPress REST/WXR 解析 | 已有实现和测试 | 重点继承,重做迁移流程 | P0 |
| 内容类型和版本 | 基本可用 | 扩展状态机与发布模型 | P0 |
| Astro 静态运行时 | 原型可用 | 保留构建基础,重构主题架构 | P0 |
| 主题 Token/组件契约 | 文档较完整 | 纳入新主题规范 | P0 |
| Redirect 生成 | 已有脚本 | 改用 route_registry 数据源 | P0 |
| SEO Gate | 基础版本 | 保留并增强 | P0 |
| PostgreSQL/Redis/MinIO | 已配置 | 直接沿用技术选型 | P0 |
| 导入幂等和报告 | 有基础 | 扩展为批次、回滚、差异报告 | P1 |
| 媒体缩略图处理 | 有基础 | 保留 Sharp,重构存储与安全 | P1 |
| 站点模板初始化 | 有基础 | 改造成站点蓝图/主题初始化 | P1 |
| Lead CRUD | 简单实现 | 仅参考,重做公网 Form API | P1 |
| BuildService | 原型 | 不直接复用,改为队列 Worker | P1 |
| Event Gateway | 占位/早期 | 暂缓 | P3 |
| ClickHouse/增长分析 | 超出当前范围 | 暂缓 | P3 |
| 多角色 RBAC | 与需求冲突 | 不采用 | 不做 |
6. 推荐落地方式
方案 A:以旧项目代码为技术底座进行净化和重构(推荐)
做法:
- 保留旧项目 Git 历史或创建一条新的 SiteForge 开发分支/仓库。
- 删除缓存、数据、演示页面和超出范围的模块。
- 以 SiteForge V3.0 的数据模型、模块边界和实施计划逐步替换旧实现。
- 每完成一个领域,就补齐迁移脚本、测试和验收门禁。
优点:
- 最大化利用已经写好的管理后台、迁移解析器、API 和 Astro 代码。
- 保留真实问题的修复经验和测试用例。
- 比从空目录重建更快进入可运行状态。
风险:
- 必须主动偿还旧原型留下的结构债务。
- 不能为了短期速度保留内存发布、JSON 路由、自制 Token 等关键缺陷。
方案 B:保持 cms-one 为全新仓库,选择性移植源码
适用于希望彻底清理历史包袱的情况。
建议只移植:
- 后台通用壳和基础组件。
- WordPress/WXR 解析器与测试夹具。
- 内容版本、幂等导入的核心逻辑。
- Astro 通用组件、主题 Token 和门禁脚本。
- PostgreSQL/Redis/MinIO 开发环境配置。
不要整目录复制。每次移植都应有对应的模块边界、测试和依赖清单。
综合成本与风险,推荐采用方案 A 的代码继承方式 + 方案 B 的选择性净化原则:把旧项目当成可运行底座,但按 SiteForge 方案逐域重构,而不是延续旧项目产品定义。
7. 第一批实际迁移任务
第 1 批:建立干净基线
- 确认源码许可证和第三方资产许可证。
- 导出仅包含受版本控制源码的干净代码副本。
- 排除数据、媒体、日志、缓存、依赖和 Secret。
- 删除后台演示页面、多角色路由和无关分析模块。
- 固化 Node、pnpm、PostgreSQL、Redis 和 MinIO 版本。
- 跑通 lint、typecheck、unit、e2e 和静态站构建基线。
第 2 批:修正核心架构
- 实现平台级单超级管理员认证。
- 建立
route_registry、import_batches、build_jobs、releases、publish_locks等核心表。 - 将构建改为持久化队列 Worker。
- 将静态站编译输入改为冻结 Site Snapshot。
- 建立对象存储媒体模型和引用关系。
第 3 批:迁移与主题平台化
- 把现有 WordPress REST/WXR 代码接入导入批次。
- 建立全量 URL 清单、映射、冲突和覆盖率报告。
- 将现有 Astro 组件整理为基础组件和业务区块。
- 实现 Theme Manifest、Block Manifest 和 Block Renderer。
- 完成第一个真实站点的迁移、预览、门禁和原子发布。
第 4 批:运营能力
- Schema 驱动内容表单。
- 产品、新闻、普通页面和导航维护。
- 安全的公网 Form API 和线索后台。
- 发布历史、差异查看、一键回滚和审计日志。
- 备份恢复、监控告警和灾难恢复演练。
8. 需要优先修复的已发现风险
- 发布记录在内存中:服务重启会丢失构建历史和锁状态。
- API 进程直接构建:资源隔离、并发、重试和故障恢复不足。
- 迁移即发布:不满足人工审核、预览和可回滚要求。
- 路由保存在 JSON 设置中:无法可靠保证所有旧路径不变。
- 自制 Token 能力不足:缺少完整过期、撤销、MFA 和会话管理。
- 本地媒体存储和直接删除:生产可靠性和引用安全不足。
- SVG 缺少清理:存在持久化 XSS 风险。
- Lead 更新条件不完整:部分操作需同时限定
site_id。 - 页面和 Locale 存在硬编码:无法稳定支持不同站点和语言组合。
- 文档数据库模型多于实际 Schema:必须以迁移文件和运行代码确认真实能力。
- 正则式 HTML Gate 有边界缺陷:需要 DOM 解析和浏览器级补充验证。
- 所谓原子发布仍有删除后复制窗口:生产切换需要重新设计。
9. 最终建议
当前 SiteForge 项目应把 D:\project\cms 定位为:
- 实现底座:复用工程骨架、后台壳、API 基础、迁移解析和 Astro 运行时。
- 经验库:复用真实迁移中沉淀的测试、映射和质量门禁经验。
- 非权威需求来源:产品范围、权限、发布和主题架构以 SiteForge V3.0 为准。
预计最能节省工期的五项资产是:
- WordPress REST/WXR 迁移解析和测试。
- Art Design Pro 管理后台基础。
- NestJS/Fastify/Drizzle 内容 API 基础。
- Astro 静态站组件与 SEO Gate。
- 内容版本、幂等导入和站点隔离测试。
预计最不能直接继承的五项是:
- 当前认证与多角色模型。
- 内存式构建和发布流程。
- JSON 化重定向与非正式路由管理。
- 本地媒体删除和安全策略。
- 迁移完成后直接发布的工作流。
按这个边界执行,可以保留旧项目的大部分有效研发投入,同时避免把原型阶段的关键技术债带入 SiteForge 的正式版本。