10404dbb36
同步工作区剩余变更,主要包括: - 营销页面组件与布局持续优化(about/news/services/solutions/team 等) - 详情页四层叙事组件、布局组件、UI 组件调整 - CMS 数据模型、API 路由、权限、工作流、站内通知、媒体管理扩展 - 新增/补充单元测试与 E2E 测试(cms-workflow.spec.ts 等) - ESLint 9 迁移、jest/tsconfig 配置更新、依赖调整 - 新增 ADR、CMS 评估文档、Release Review / Acceptance 报告 - 移除水墨装饰组件与大体积未使用字体文件
191 lines
12 KiB
Markdown
191 lines
12 KiB
Markdown
# CMS 内容管理系统集成评估
|
||
|
||
## 已确认决策
|
||
|
||
本次评估基于以下 grilling 会话确定的架构决策:
|
||
|
||
| 决策项 | 结论 | 影响 |
|
||
|--------|------|------|
|
||
| 部署模式 | **混合渲染(SSR/ISR)** | CMS 草稿、实时预览、一键发布可直接落地,无需每次都触发全站构建 |
|
||
| CMS 路线 | **坚持自研轻量 Headless CMS** | 基于 `src/lib/cms/` + Prisma + Next.js API 继续建设,不引入 Strapi/Payload 等开源方案 |
|
||
| RBAC 范围 | **模型级 + 操作级权限** | 支持“角色 × 内容模型 × create/read/update/delete/publish”矩阵,不做到字段级 |
|
||
| 多语言 | **现在预留 locale 字段** | `ContentItem` 默认 `zh-CN`,数据模型一次成型,未来可扩展 |
|
||
| 内容迁移范围 | **按页面类型全量迁移** | 新闻、案例、团队、产品、方案、服务、法律页全部进入 CMS,不再保留“结构层常量 + 运营字段 CMS”的混合方案 |
|
||
| 媒体存储 | **本地 + OSS 双写** | `MediaAsset` 同时支持 `local`/`oss`/`s3`,开发/测试用本地,生产用 OSS |
|
||
| 工作流通知 | **仅站内消息** | 管理后台显示待审核 badge 与通知列表,不上邮件或企业 IM |
|
||
|
||
## 评估结论
|
||
|
||
基于当前项目实际(Next.js 14 App Router + Prisma/SQLite + 已搭建但尚未完全落地的 `src/lib/cms/` 层),标准官网 CMS 的核心功能模块(内容发布、媒体管理、模板驱动、版本控制、基础权限)**能够满足当前及可预见未来的大部分需求**。本次评估不再给出单一百分比匹配度,而是按模块给出 **满足 / 部分满足 / 不满足** 的定性判断,并在“必须补齐的缺口”中按优先级排序。
|
||
|
||
**最终建议**:继续基于已有 `src/lib/cms/` 层建设一个**字段可配置、RBAC 可扩展、支持多语言预留的轻量 Headless CMS**,配合 Next.js 混合渲染(ISR)实现内容实时发布与预览。无需采购重型商业 CMS,也无需引入开源 Headless CMS 替代当前实现。
|
||
|
||
## 项目现状速览
|
||
|
||
| 维度 | 当前状态 |
|
||
|------|---------|
|
||
| 技术栈 | Next.js 14、React 18、TypeScript、Tailwind CSS、Prisma + SQLite |
|
||
| 部署约束 | **混合渲染(SSR/ISR)已确认**、Nginx 反向代理、独立子域名 |
|
||
| 内容现状 | 营销页内容仍来自 `src/lib/constants/*.ts`;CMS 数据层已定义,页面侧未全面切换;计划按页面类型全量迁移 |
|
||
| CMS 基础设施 | 已存在 `ContentModel`、`ContentItem`、`ContentZone`、`MediaAsset`、`AuditLog` 等类型,以及 `/api/admin/*`、`/api/cms/*` 路由 |
|
||
| 核心约束 | 本地字体、品牌红 #C41E3A 克制使用、移动端优先、四层叙事结构 |
|
||
|
||
## 分项匹配度评估
|
||
|
||
### 1. 内容更新频率
|
||
|
||
**项目需求**:官网内容(产品、方案、服务、新闻、案例、团队、联系信息)更新频率中等,新闻/案例相对高频,产品/方案页面相对低频但可能伴随版本迭代调整。
|
||
|
||
**匹配度:高**
|
||
|
||
- 标准 CMS 的内容发布流程(草稿 → 审核 → 发布)对新闻、案例、团队动态等中等频度更新非常合适。
|
||
- 产品/方案页面的字段化建模(`productFields`、`solutionFields` 已定义)可支持非研发人员调整文案、标签、状态等。
|
||
- 部署模式已确认为 **混合渲染(SSR/ISR)**,CMS 发布后可通过 `revalidate` 实时生效,不再受静态导出“每次更新必须全量构建”的限制。
|
||
|
||
### 2. 内容管理权限分配
|
||
|
||
**项目需求**:需要区分超管、内容编辑、市场运营等角色,避免所有人都能修改核心产品数据或法律条款。
|
||
|
||
**匹配度:中**
|
||
|
||
- 当前 API 层已有 `/api/auth/*` 与 `/api/admin/*`,但尚未实现基于角色的权限中间件(RBAC)。
|
||
- 已确认 RBAC 粒度为 **模型级 + 操作级**:即“角色 × 内容模型 × create/read/update/delete/publish”。例如“内容编辑”可以创建和修改新闻,但不能发布新闻;不能修改产品或法律条款。
|
||
- 不实现字段级权限,避免初期过度复杂;若未来确有字段级需求,可作为二期扩展。
|
||
|
||
### 3. 多角色协作编辑
|
||
|
||
**项目需求**:市场、产品、法务可能共同参与内容产出,需要审稿、留痕、避免覆盖。
|
||
|
||
**匹配度:中-高**
|
||
|
||
- 类型定义中已有 `ContentStatus`(draft/review/published/archived)、`version`、`createdBy/updatedBy`、`AuditLog`,设计层面已考虑协作。
|
||
- `review` 状态定义为:**已提交待审核**,仅拥有 publish 权限的角色可审核通过或驳回。
|
||
- 工作流通知已确认采用 **站内消息** 作为最低可用方案:管理后台显示待审核 badge 与通知列表,暂不上邮件或企业 IM。
|
||
- “内容日历”、“任务分配”等高级协作能力不在本期范围内。
|
||
|
||
### 4. 内容版本控制
|
||
|
||
**项目需求**:产品文案、法律条款、首页 Hero 等关键内容需要可回溯、可回滚。
|
||
|
||
**匹配度:高**
|
||
|
||
- `ContentItem` 已包含 `version` 字段;`hasVersions` 在模型级别已配置;`AuditLog` 记录 before/after。
|
||
- 回滚后通过 ISR `revalidate` 即可生效,无需触发全量构建。
|
||
|
||
### 5. 第三方系统集成
|
||
|
||
**项目需求**:目前可见的第三方需求主要是联系表单、微信公众号/企业微信、SEO/结构化数据、以及未来 NovaVis 等产品的文档/控制台跳转。
|
||
|
||
**匹配度:中**
|
||
|
||
- 标准 CMS 的 Webhook、API、插件生态可满足常见集成(表单通知、SEO、社交媒体)。
|
||
- **风险点**:项目有“独立子域名 + Nginx 反向代理”的硬性部署架构,若 CMS 是 SaaS 或独立服务,需要处理跨域、认证同步、静态构建时拉取内容等问题。
|
||
- 当前 `MediaAsset` 已预留 `local | oss | s3` 存储类型,说明对 OSS/CDN 已有规划,标准 CMS 的媒体管理可与此对接。
|
||
|
||
### 6. 响应式内容适配
|
||
|
||
**项目需求**:Mobile First,所有页面必须适配桌面/平板/移动。
|
||
|
||
**匹配度:高**
|
||
|
||
- 响应式主要由前端组件(Tailwind + 设计令牌)承担,CMS 只需提供“内容”而非“布局”。
|
||
- 当前 `ContentZoneSettings` 中的 `columns`、`layout` 已足够支持前端做响应式渲染。
|
||
- 若 CMS 支持按设备投放不同内容(如移动端 Hero 文案更短),会带来额外复杂度;当前项目不需要这种高级能力。
|
||
|
||
### 7. 未来功能扩展预期
|
||
|
||
**项目需求**:独立产品区、案例 L3 信任层、品牌故事页、可能的博客/白皮书下载、多语言(潜在)。
|
||
|
||
**匹配度:中**
|
||
|
||
- 当前 `content-types.ts` 已覆盖 news/service/product/solution/hero-banner/stat-item/about/team/contact/legal,扩展性较好。
|
||
- **多语言**已决定现在预留 `locale` 字段:`ContentItem` 默认 `zh-CN`,未来新增语言时只需添加翻译记录,无需重构数据模型。
|
||
- **独立产品详情页**的“硬核”风格与套装产品的字段差异较大,需要单独设计 `standalone-product` 内容模型,支持技术参数、合规认证等字段分组。
|
||
|
||
## 标准 CMS 功能模块逐项评估
|
||
|
||
| 模块 | 是否满足 | 说明 |
|
||
|------|---------|------|
|
||
| 内容发布流程 | ✅ 满足 | draft/review/published/archived 状态已设计;混合渲染下通过 ISR 实时生效 |
|
||
| 媒体资源管理 | ⚠️ 部分满足 | 已定义 `MediaAsset` 与 `local/oss/s3` 预留;需独立开发上传、缩略图、WebP/AVIF 转换、OSS 对接,工作量约 1-2 人周 |
|
||
| 模板系统 | ✅ 满足 | 项目本身四层叙事 + HSI 架构即模板系统;CMS 只需驱动内容填充 |
|
||
| 权限管理 | ⚠️ 部分满足 | 简单角色已满足;模型级 + 操作级 RBAC 需要新增权限中间件与数据模型 |
|
||
| 版本控制 | ✅ 满足 | 已设计 version + audit log;回滚后 ISR revalidate 即可生效 |
|
||
| SEO/元数据 | ✅ 满足 | 页面类型字段可扩展 meta title/description/og image |
|
||
| 多语言 | ✅ 预留满足 | 现在为 `ContentItem` 增加 `locale` 字段,默认 `zh-CN`,未来直接扩展 |
|
||
| 表单/线索管理 | ⚠️ 部分满足 | 联系表单已有独立 API;本期不纳入 CMS 统一管理 |
|
||
|
||
## 预算、技术栈与维护成本
|
||
|
||
### 预算
|
||
|
||
| 方案 | 开发成本 | 持续成本 | 本次决策 |
|
||
|------|---------|---------|---------|
|
||
| **自研轻量 CMS**(当前路线) | 中等(约 3-4 人周完成核心缺口) | 无订阅费,仅需维护 | **选中** |
|
||
| 开源 Headless CMS(Strapi/Payload/Directus) | 较低(可节省 30%-50% 开发时间) | 服务器、数据库、升级、安全补丁 | 不引入 |
|
||
| SaaS CMS(Sanity/Contentful/DatoCMS) | 最低 | 按席位/流量收费,长期不可控 | 不引入 |
|
||
|
||
### 技术栈兼容性
|
||
|
||
- **当前技术栈与混合渲染高度兼容**:Next.js 14 App Router 的 `fetch(revalidate)` + `/api/cms/revalidate` 已存在,CMS 内容发布后可直接刷新缓存。
|
||
- **Prisma + SQLite 已存在**,可直接作为 CMS 数据库;未来若流量/并发上升,可平滑迁移到 PostgreSQL,无需改动数据模型。
|
||
- `/api/cms/draft/*` 路由已存在,草稿预览能力可在混合渲染架构下直接复用。
|
||
|
||
### 维护成本
|
||
|
||
- 自研 CMS:核心功能可控,维护边界清晰;本期聚焦 RBAC、媒体管理、工作流、内容迁移四项,避免无限扩展。
|
||
- 标准 CMS:虽然管理后台成熟,但引入后会带来升级、插件兼容性、安全问题等持续投入;本次决定不引入。
|
||
|
||
## 最终建议
|
||
|
||
**当前项目不需要采购重型商业 CMS,也无需引入开源 Headless CMS 替代现有实现。** 最佳路径是:
|
||
|
||
> 基于已有的 `src/lib/cms/` + Prisma + Next.js API 路线,配合 **混合渲染(SSR/ISR)**,建设一个**字段可配置、RBAC 模型+操作级、多语言预留、支持本地+OSS 双写的 Headless CMS**。按页面类型全量迁移内容,不再保留“代码常量 + CMS 字段”的混合方案。
|
||
|
||
### 必须补齐的缺口(按优先级排序)
|
||
|
||
#### P0:数据模型扩展(阻塞其他所有任务)
|
||
|
||
1. **为 `ContentItem` 增加 `locale` 字段**
|
||
- 默认 `zh-CN`,为 `ContentItem` 增加唯一索引 `(slug, modelCode, locale)`(若 slug 存在)。
|
||
2. **新增 RBAC 数据模型**
|
||
- `Role`(角色:super_admin、content_admin、content_editor、reviewer、readonly)
|
||
- `Permission`(角色 × 内容模型 × 操作:create/read/update/delete/publish)
|
||
- 在 `/api/admin/*` 路由增加权限中间件。
|
||
3. **明确 `review` 状态语义**
|
||
- `review` = 已提交待审核;只有具备对应模型 `publish` 权限的角色可审核或驳回。
|
||
|
||
#### P1:核心能力补齐
|
||
|
||
4. **媒体管理模块**
|
||
- 完成 `/api/admin/media` 上传接口;
|
||
- 本地存储落盘到 `public/uploads/`(开发/测试),生产写入 OSS/S3;
|
||
- 生成缩略图、WebP/AVIF 派生格式;
|
||
- `MediaAsset` 记录原图与派生格式 URL。
|
||
5. **工作流引擎(最简版)**
|
||
- 状态机:draft → review → published / archived,支持驳回回 draft;
|
||
- 站内消息通知:审核人收到待审核 badge,提交人收到审核结果通知;
|
||
- `AuditLog` 记录状态流转与 before/after。
|
||
|
||
#### P2:内容迁移与页面切换
|
||
|
||
6. **按页面类型全量迁移**
|
||
- 依次为:legal → news → team → cases → services → solutions → products → standalone-products → homepage zones;
|
||
- 每个页面类型迁移时同步废弃 `src/lib/constants/*.ts` 中对应数据,改为从 CMS API 获取;
|
||
- 营销页面使用 ISR,后台发布/回滚后调用 `/api/cms/revalidate`。
|
||
7. **管理后台界面**
|
||
- 模型管理、内容编辑、媒体库、角色权限、工作流审核、通知中心。
|
||
|
||
### 风险与依赖
|
||
|
||
| 风险 | 等级 | 缓解措施 |
|
||
|------|------|---------|
|
||
| 全量迁移工作量大,可能挤压其他 7 月任务 | 高 | 按 P0 → P1 → P2 分阶段交付,优先完成模型扩展与 RBAC,内容迁移可逐页面进行 |
|
||
| 混合渲染对 Nginx 反向代理配置有新要求 | 中 | 更新 `nginx-static-production.conf`,确保 SSR/ISR 路径正确代理到 Next.js 服务 |
|
||
| SQLite 在高并发写入场景下可能成为瓶颈 | 中 | 当前后台管理并发低,可接受;若未来并发上升,平滑迁移至 PostgreSQL |
|
||
| 媒体文件 OSS 对接需要生产账号与 CDN 刷新策略 | 中 | 开发/测试阶段用本地存储,生产部署前完成 OSS 账号与 CDN 刷新脚本 |
|
||
|
||
### 建议创建的 ADR
|
||
|
||
- **ADR-0007:从纯静态导出迁移到混合渲染(SSR/ISR)以支撑 CMS**:记录放弃 `output: 'export'` 的原因、对 CMS 价值的提升、对 Nginx 配置的影响。见 [docs/adr/0007-hybrid-rendering-for-cms.md](../adr/0007-hybrid-rendering-for-cms.md)。
|