Files
Edu/MIGRATION_GUIDE.md
SpecialX 3fbb97791d fix(docs): 修复 project_rules.md P0 损坏并同步所有引用
- 根目录 project_rules.md 损坏(72 字节乱码),已删除
- 从 CICD 项目迁移完整版至 .trae/rules/project_rules.md(17881 字节)
- 更新 MIGRATION_GUIDE/README/coding-standards 引用至 .trae/rules/
- P0 紧急修复,影响所有 AI 工作流程
2026-07-08 12:50:00 +08:00

30 KiB
Raw Permalink Blame History

迁移指南CICD → Edu

版本1.0 日期2026-07-07 状态:基线发布 维护者:架构组 关联文档:


目录

  1. 迁移背景
  2. 原始项目说明
  3. 新项目说明
  4. 迁移策略矩阵
  5. 文档体系映射表
  6. 六阶段路线图概览
  7. 原始项目可复用资产清单
  8. 迁移验收标准

一、迁移背景

1.1 迁移动机

原始项目 CICD 是基于 Next.js 16 的单应用架构,承载 K12 智慧教务系统 35 个业务模块。随着业务规模扩张与团队增长,单应用架构在以下方面暴露瓶颈:

维度 单应用瓶颈 微服务目标
团队协作 35 模块挤在同一仓库,合并冲突频繁 按领域拆分6 领域团队独立迭代
部署节奏 全量构建发布,单模块变更牵动全站 服务粒度独立部署,故障爆炸半径缩小
技术选型 TypeScript 单语言AI/分析场景受限 TS业务+ Go网关+ PythonAI/分析)各取所长
数据规模 单 MySQL跨模块联表与读放大 读写分离 + CQRSClickHouse 承载分析负载
可演进性 模块间隐式耦合,重构成本高 DDD 限界上下文显式契约,演化可控

1.2 迁移原则

  1. 契约先行:服务间通信先定 protobuf 契约,再写实现,禁止"先实现再补契约"
  2. 资产复用设计令牌、权限模型、缓存策略、UI 组件模式等优质资产尽量平移,不重复造轮子
  3. ** strangler fig**:不一次性切流,按阶段灰度迁移,旧系统与新系统在过渡期并存
  4. 数据自治:每个微服务独占自身数据库,跨服务查询走 BFF 聚合或读模型
  5. 可观测优先:迁移同步建立 tracing/metrics/logging 三件套,禁止"先上线后补监控"

二、原始项目说明CICD

2.1 基本概况

属性
仓库路径 e:\Desktop\CICD
技术栈 Next.js 16 + React 19 + Tailwind v4 + Drizzle ORM
语言 TypeScript全栈
架构 单应用 + 严格模块化app → modules → shared 三层)
业务模块数 35 个
数据库 MySQL单库
认证 NextAuth.js
部署 Gitea Actions + Docker standalone

2.2 模块清单(按领域归类)

领域 模块
身份与权限 auth、users、onboarding、settings、permissions
教学组织 classes、teachers、students、parents、subjects
教学核心 courses、lessons、schedule、attendance、leave-requests
考试评价 exams、questions、grading、scores、analytics
作业内容 homework、textbooks、resources
沟通通知 messaging、notifications、announcements
智能辅助 ai备课/出题/分析、search
系统支撑 audit-logs、reports、dashboard、layout

2.3 已沉淀的工程资产

  • arch.db 架构元数据库:通过 npm run arch:scan 扫描得到模块、函数、调用关系、依赖关系、技术标签的结构化数据
  • 设计令牌体系primitive / semantic-light / semantic-dark / 模块命名空间 / Tailwind 暴露 五层分层
  • 权限模型requirePermission() 服务端校验 + usePermission().hasPermission() 客户端校验,权限点常量集中维护
  • 缓存策略cacheFnReact cache() + 自定义缓存层),权限数据不跨请求缓存
  • ActionState 模式Server Action 统一返回 { success, message, errors, data } 结构
  • 5 层状态模型URLnuqs→ ServerTanStack Query→ Client BusinessZustand→ Global UIZustand→ Formreact-hook-form
  • A11y 工具集useA11yIdmergeA11yPropsdescribeInputloadingAria、aria-live Hook、focus-trap 组件
  • CI/CD 流水线CI + 安全扫描 + 灾备演练三套 Gitea Actions 工作流
  • 审计日志三件套login-loggerchange-loggeraudit-logger

三、新项目说明Edu

3.1 基本概况

属性
仓库路径 e:\Desktop\Edu
远程仓库 https://git.eazygame.cn/xiner/Edu.git
架构范式 DDD + EDA + CQRS 微服务
语言 TypeScriptNestJS 10+ GoGin 网关)+ PythonFastAPI 分析/AI
前端 React + Next.js + Module Federation4 微前端)
monorepo 策略 pnpm workspace + go.work + pyproject.toml (uv)
事件总线 Kafka + Debezium CDC
契约 protobuf + buf
存储 MySQL / Redis / ClickHouse / Neo4j / Elasticsearch

3.2 整体架构

flowchart TB
    subgraph Client[客户端]
        WEB[Web 浏览器]
        APP[移动端]
    end

    subgraph Gateway[网关层 Go Gin]
        GW[API Gateway<br/>路由/鉴权/限流/熔断]
    end

    subgraph BFF[聚合层 BFF]
        BFF1[Admin BFF]
        BFF2[Teacher BFF]
        BFF3[Student/Parent BFF]
    end

    subgraph Services[业务微服务 NestJS]
        S1[identity 身份]
        S2[org 教学组织]
        S3[teaching 教学核心]
        S4[content 内容分析]
        S5[comm 沟通]
        S6[insight 智能洞察]
    end

    subgraph Infra[基础设施服务]
        I1[auth 认证授权]
        I2[notification 通知]
    end

    subgraph EventBus[事件总线]
        K[Kafka]
        DBZ[Debezium CDC]
    end

    subgraph Storage[存储]
        MY[(MySQL)]
        RD[(Redis)]
        CH[(ClickHouse)]
        NEO[(Neo4j)]
        ES[(Elasticsearch)]
    end

    Client --> GW
    GW --> BFF
    BFF --> Services
    Services --> Infra
    Services <--> K
    DBZ --> K
    Services --> Storage
    Infra --> Storage

3.3 微前端与领域服务映射

微前端 路由前缀 对接 BFF 主要消费的服务
Admin Shell /admin Admin BFF identity、org、insight
Teacher Shell /teacher Teacher BFF teaching、content、comm
Student Shell /student Student/Parent BFF teaching、content
Parent Shell /parent Student/Parent BFF teaching、comm
微服务 原始模块映射 主存储 对外契约
identity auth、users、onboarding、settings、permissions MySQL + Redis identity.proto
org classes、teachers、students、parents、subjects MySQL org.proto
teaching courses、lessons、schedule、attendance、leave-requests、exams、homework MySQL teaching.proto
content textbooks、resources、questions、grading MySQL + Elasticsearch content.proto
comm messaging、notifications、announcements MySQL + Redis comm.proto
insight scores、analytics、ai、search、reports、dashboard ClickHouse + Neo4j insight.proto
auth基础设施 NextAuth 逻辑下沉 MySQL + Redis auth.proto
notification基础设施 notifications channel 抽离 MySQL + Redis notification.proto

四、迁移策略矩阵

按"直接迁移 / 调整迁移 / 重写 / 新建"四档分类。

4.1 规范类资产

资产 策略 说明
项目规则project_rules 调整 架构图优先保留,分层规则从三层改为微服务分层,新增 DDD/契约/事件驱动规则
编码规范coding-standards 调整 TS 部分保留并补充 NestJS 装饰器/DI 规则,新增 Go、Python、protobuf 章节
Git 工作流 调整 trunk-based 替代分支策略scope 改为服务/包名,新增多语言 monorepo 提交规则
提交规范Conventional Commits 直接迁移 类型与格式完全沿用
设计令牌规范 调整 分层模型保留,分布位置从 src/app/styles/tokens/ 改为微前端共享包
安全规范 直接迁移 Cookie 策略、env 校验、XSS 防护、权限校验规则全部沿用
问题记录规则 直接迁移 known-issues.md 索引式速查手册模式沿用
A11y 规范 直接迁移 WCAG 2.2 AA 目标与工具集沿用

4.2 代码类资产

资产 策略 说明
Zod schema 定义 直接迁移 各模块 schema.ts 平移至对应微服务,复用验证规则
权限点常量Permissions 直接迁移 集中迁入 identity 服务共享包
Drizzle schema表结构 调整 按领域拆分到各微服务独占库,关系型字段保持不变
ActionState 类型 直接迁移 升级为 protobuf message结构不变
Server Actions 重写 改写为 NestJS Controller + Service + Application Service 三层
data-access 层 重写 改写为 NestJS Repository + Domain Entity
UI 组件shared/components 直接迁移 平移至微前端共享包,保持 PascalCase 命名
HookuseAuth、usePermission 调整 改为通过 BFF/gRPC client 获取,接口签名保持不变
缓存层cacheFn 重写 改为 NestJS Cache 模块 + Redis去除 React cache()
arch:scan 工具 调整 扫描器扩展为多语言TS+Go+Python数据库结构保持
审计日志三件套 直接迁移 平移至 notification 服务,日志结构保持
CI/CD 流水线 重写 Gitea Actions 改为多服务并行流水线,新增契约校验阶段

4.3 文档类资产

资产 策略 说明
架构影响地图004 重写 从单应用模块图改为微服务限界上下文图
K12 功能清单006 直接迁移 功能清单与架构无关,直接平移
差距审计报告007 调整 重新审计各微服务的功能完成度
模块角色映射008 直接迁移 角色权限矩阵不变
路线图roadmap/ 重写 6 阶段微服务路线图
known-issues.md 直接迁移 经验日志平移,新增"微服务"分区
各模块 README 重写 改为各微服务 README按 DDD 上下文描述

五、文档体系映射表

CICD 文档 Edu 对应文档 关系
.trae/rules/project_rules.md project_rules.md 调整(微服务版)
docs/standards/coding-standards.md docs/standards/coding-standards.md 调整(多语言版)
—(散落在 project_rules docs/standards/git-workflow.md 新建
docs/architecture/004_architecture_impact_map.md docs/architecture/001_architecture_overview.md 重写
docs/architecture/006_k12_feature_checklist.md docs/architecture/feature_checklist.md 直接迁移
docs/architecture/007_gap_audit_report.md docs/architecture/gap_audit.md 调整
docs/architecture/008_module_role_mapping.md docs/architecture/role_mapping.md 直接迁移
docs/architecture/roadmap/README.md docs/architecture/roadmap/README.md 重写
docs/architecture/roadmap/tech-debt.md docs/architecture/roadmap/tech-debt.md 重写
docs/architecture/roadmap/decoupling.md docs/architecture/roadmap/migration_phases.md 重写(迁移阶段化)
docs/troubleshooting/known-issues.md docs/troubleshooting/known-issues.md 直接迁移 + 新分区
src/modules/[module]/README.md services/[service]/README.md 重写
docs/standards/coding-standards.md §A11y docs/standards/accessibility.md 拆分独立

六、六阶段路线图概览

6.1 阶段总览

gantt
    title Edu 微服务迁移六阶段路线图
    dateFormat  YYYY-MM-DD
    axisFormat  %m月

    section P1 地基
    仓库结构/契约/CI/可观测    :p1, 2026-07-01, 30d

    section P2 身份
    identity/auth/notification :p2, after p1, 30d

    section P3 核心教学
    org/teaching/content       :p3, after p2, 45d

    section P4 内容分析
    insight+CQRS读模型/ES      :p4, after p3, 30d

    section P5 沟通AI
    comm/AI增强                 :p5, after p4, 30d

    section P6 硬化
    安全/灾备/性能/混沌        :p6, after p5, 30d

6.2 各阶段目标

阶段 名称 目标 关键交付物 验收信号
P1 地基 仓库骨架、契约工具链、CI、可观测平台 monorepo 结构、buf 配置、Kafka 集群、OpenTelemetry 契约生成 + 一次端到端 trace
P2 身份 identity + auth + notification 三服务打通 JWT 颁发、RBAC、邮件/短信/站内通知 用户注册→登录→收到通知
P3 核心教学 org + teaching + content 班级/课表/作业/题库/考试 教师创建作业→学生提交→批改闭环
P4 内容分析 insight + CQRS 读模型 + ES 全文检索 ClickHouse 报表、ES 搜索、Neo4j 知识图谱 多维分析报表 + 全文搜索可用
P5 沟通AI comm + AI 辅助 站内信/通知中心、AI 备课/出题/答疑 教师用 AI 出题并发布到班级
P6 硬化 安全加固、灾备、性能、混沌工程 WAF、定期备份、压测报告、混沌演练 RPO≤15min、RTO≤30min、P99≤500ms

6.3 阶段交付门槛

每个阶段进入下一阶段前必须满足:

  1. 契约稳定:本阶段涉及服务的 protobuf 契约冻结breaking change 走 deprecation 流程
  2. 可观测完整tracing 覆盖率 ≥ 95%关键业务指标QPS/延迟/错误率)接入 Grafana
  3. 测试覆盖:单元测试 ≥ 80%,关键流程 E2E 通过
  4. 文档同步:服务 README + 004 架构图 + known-issues 已更新
  5. arch.db 同步pnpm run arch:scan 已扫描最新代码状态

七、原始项目可复用资产清单

7.1 设计令牌思路

复用方式:将 CICD 的 src/app/styles/tokens/ 五层分层模型平移至微前端共享包。

CICD 位置 Edu 位置 调整
src/app/styles/tokens/primitive.css packages/ui-tokens/primitive.css 直接平移
src/app/styles/tokens/semantic-light.css packages/ui-tokens/semantic-light.css 直接平移
src/app/styles/tokens/semantic-dark.css packages/ui-tokens/semantic-dark.css 直接平移
src/app/styles/tokens/lesson-preparation.css packages/ui-tokens/lesson-preparation.css 直接平移
src/app/styles/tokens/tailwind-theme.css packages/ui-tokens/tailwind-theme.css 直接平移

强制规则保持不变

  • 禁止硬编码颜色(#hex
  • 禁止硬编码字体('Inter'/'Fraunces'/'JetBrains Mono'
  • 禁止硬编码字号(font-size: Npx
  • 禁止 Tailwind 任意值(w-[Npx]
  • ESLint no-restricted-syntax + design-tokens/no-hardcoded-fonts 规则沿用

7.2 UI 组件模式

复用方式:将 CICD 的 src/shared/components/ui/ 平移至 packages/ui-components/,作为 Module Federation 共享依赖。

组件类别 CICD 路径 Edu 路径 复用要点
基础组件Button/Input/Dialog shared/components/ui/ packages/ui-components/ 全部平移,保持 PascalCase 命名
A11y 组件 shared/components/a11y/ packages/ui-components/a11y/ skip-link、visually-hidden、focus-trap、aria-status 全部平移
图表组件 各模块内 packages/ui-components/charts/ 收集 recharts 封装,统一暴露
表单组件 react-hook-form 封装 packages/ui-components/form/ 与 zod resolver 一同平移

复用规则

  • 组件必须为纯函数,使用 function 声明
  • 不使用 React.FC,直接用函数声明 + 显式标注 props 类型
  • 默认服务端组件(微前端 host需要交互时才添加 "use client"
  • 组件行数 ≤ 500 行(复杂表单/大型表格可放宽至 800 行)

7.3 权限模型

复用方式:将 CICD 的 requirePermission() + usePermission().hasPermission() 模式平移至 identity 服务 + auth 基础设施服务。

CICD 资产 Edu 位置 调整
shared/lib/auth-guard.tsrequirePermission services/auth/src/guards/permission.guard.tsNestJS Guard 改为 NestJS Guard 装饰器
shared/types/permissions.ts(权限点常量) packages/contracts/src/permissions.ts 集中到 contracts 包,多服务共享
usePermission Hook packages/ui-components/hooks/use-permission.ts 通过 BFF 拉取权限Hook 接口不变
角色权限矩阵008 docs/architecture/role_mapping.md 直接平移

强制规则保持不变

  • 每个 Controller/Action 必须调用 requirePermission() 等价物
  • 前端组件禁止使用 role === "xxx" 硬编码,统一使用 usePermission().hasPermission()

7.4 缓存策略

复用方式CICD 的 cacheFnReact cache() + 自定义缓存层)改为 NestJS Cache 模块 + Redis权限数据不跨请求缓存的规则沿用。

CICD 模式 Edu 模式 备注
cacheFnReact cache NestJS @UseInterceptors(CacheInterceptor) + Redis 单请求内缓存改为 NestJS REQUEST scope
unstable_cache 禁用 CICD 已禁用Edu 沿用禁用决策
权限数据缓存 仅在 auth 服务内部缓存TTL ≤ 60s 跨服务不缓存权限
静态资源缓存 CDN + 短缓存 配置不变

7.5 Server Action 模式 → Application Service 模式

复用方式CICD 的 Server Action 编排模式(权限 + Zod 验证 + 调用 data-access + revalidate平移为 NestJS Application Service 编排模式。

CICD Server Action 步骤 NestJS Application Service 对应
requirePermission(perm) @RequirePermission(perm) 装饰器 + Guard
Zod safeParse ValidationPipe + DTO class-validator
调用 data-access 调用 Domain Service / Repository
revalidatePath 发布领域事件触发读模型更新
返回 ActionState<T> 返回 protobuf message结构同 ActionState

7.6 状态管理 5 层模型

复用方式CICD 的 5 层状态模型平移至微前端 host 应用。

层级 CICD 方案 Edu 方案 备注
L1 URL nuqs nuqs 直接平移
L2 Server TanStack Query TanStack Query 直接平移
L3 Client Business Zustand slice Zustand slice 直接平移
L4 Global UI Zustand ui-store + ModalRoot Zustand ui-store + ModalRoot 直接平移
L5 Form react-hook-form + zodResolver react-hook-form + zodResolver 直接平移

7.7 A11y 工具集

复用方式:全部平移至 packages/ui-components/a11y/

  • useA11yId:自动生成唯一 ARIA ID
  • mergeA11yProps:合并 ARIA props
  • describeInput:关联 input 与描述
  • loadingAria:加载状态 ARIA 属性
  • useAriaLivearia-live 区域管理 Hook
  • skip-linkvisually-hiddenfocus-traparia-status 组件

目标WCAG 2.2 AA 合规,eslint-plugin-jsx-a11y 设为 error

7.8 审计日志三件套

复用方式:平移至 notification 服务,日志结构保持。

CICD 资产 Edu 位置 备注
shared/lib/login-logger.ts services/notification/src/loggers/login-logger.ts 登录尝试日志
shared/lib/change-logger.ts services/notification/src/loggers/change-logger.ts 数据变更日志(监听领域事件)
shared/lib/audit-logger.ts services/notification/src/loggers/audit-logger.ts 关键业务操作日志

7.9 CI/CD 流水线模式

复用方式三套工作流模式沿用CI + 安全扫描 + 灾备演练),但执行方式改为多服务并行。

CICD 工作流 Edu 工作流 调整
ci.yml .gitea/workflows/ci.yml 单体改为矩阵并行(每个服务一个 job
security.yml .gitea/workflows/security.yml 新增 Trivy 扫描 Docker 镜像
dr-drill.yml .gitea/workflows/dr-drill.yml 灾备演练改为多服务恢复顺序演练

CI 必须包含(沿用 CICD 规则):

  1. 安装依赖多语言pnpm install / go mod download / uv sync
  2. Lint 检查ESLint + golangci-lint + ruff
  3. 类型检查tsc --noEmit + go vet + mypy
  4. 契约校验buf lint + buf breaking
  5. 单元测试 + 覆盖率
  6. 构建(多服务并行)
  7. 安全审计npm audit + Snyk + Trivy
  8. E2E 测试(仅主分支)

八、迁移验收标准

8.1 阶段验收清单

每个阶段完成时必须勾选所有项:

  • 本阶段服务的 protobuf 契约已冻结并通过 buf breaking 校验
  • 服务 README 已编写,包含限界上下文图与依赖关系
  • docs/architecture/001_architecture_overview.md 已同步更新
  • docs/troubleshooting/known-issues.md 已追加本阶段经验日志
  • pnpm run arch:scan 已扫描最新代码状态(含 TS+Go+Python
  • 单元测试覆盖率 ≥ 80%
  • tracing 覆盖率 ≥ 95%,关键指标已接入 Grafana
  • pnpm run lintpnpm run typecheck 零错误
  • 安全扫描无高危漏洞

8.2 整体迁移完成标准

  • 6 阶段全部交付且验收通过
  • CICD 35 个业务模块全部在对应微服务中找到归宿
  • 旧系统流量完全切流至新系统strangler fig 完成)
  • RPO ≤ 15minRTO ≤ 30min
  • P99 延迟 ≤ 500ms
  • 全链路追踪可用,任意请求可一键定位调用链
  • 文档体系完整架构图、契约、README、known-issues 全部同步

8.3 回滚预案

每个阶段均需准备回滚方案:

  1. P1 地基基础设施回滚Kafka/可观测平台降级)
  2. P2 身份:双写期间保留 CICD NextAuth 作为 fallback
  3. P3 核心教学:双写 + 读流量按比例切流,异常即回切
  4. P4 内容分析CQRS 读模型失败时降级为直查 MySQL
  5. P5 沟通AIAI 服务降级为兜底响应,不影响主流程
  6. P6 硬化:混沌演练发现问题后回滚至上一稳定版本

附录:迁移过程中的关键决策点

决策点 选择 理由
服务拆分粒度 6 业务 + 2 基础设施 平衡团队规模与拆分收益,避免过细导致 RPC 开销
通信协议 gRPC内部+ RESTBFF 对外) 内部高性能,外部兼容性
事件总线 Kafka + Debezium CDC CDC 减少业务代码侵入Outbox 模式保证一致性
契约工具 protobuf + buf 多语言代码生成breaking change 检测
前端架构 Module Federation 微前端独立部署,运行时共享依赖
状态管理 沿用 5 层模型 团队熟悉度高,迁移成本低
数据库拆分 每服务独占库 杜绝跨服务联表,强制契约化通信
缓存策略 NestJS Cache + Redis 替代 React cache(),规则(权限不跨请求缓存)沿用
迁移方式 strangler fig 风险可控,渐进式切换
arch.db 多语言扫描扩展 复用 CICD 元数据库思路,扩展 Go/Python 扫描器