# P6 后续工作手册 > 版本:1.0 > 日期:2026-07-08 > 状态:待执行 > 执行环境:`e:\Desktop\Edu` > 维护者:架构组 > 关联文档: > > - [004 架构影响地图](./architecture/004_architecture_impact_map.md) > - [项目规则](../../.trae/rules/project_rules.md)(已修复,迁至 `.trae/rules/`) > - [迁移指南](../../MIGRATION_GUIDE.md) > - [P6 硬化 Runbook](./runbooks/p6-hardening.md) --- ## 目录 1. [执行前必读](#一执行前必读) 2. [环境准备](#二环境准备) 3. [依赖安装](#三依赖安装) 4. [代码质量校验](#四代码质量校验) 5. [arch.db 同步](#五archdb-同步) 6. [修复 project_rules.md(P0 紧急)](#六修复-project_rulesmd-p0-紧急) 7. [修复 004 架构图](#七修复-004-架构图) 8. [P6 集成测试补充](#八p6-集成测试补充) 9. [Helm Chart 演化](#九helm-chart-演化) 10. [文档同步](#十文档同步) 11. [故障排查](#十一故障排查) 12. [验收清单](#十二验收清单) --- ## 一、执行前必读 ### 1.1 工作目录 **所有命令在 `e:\Desktop\Edu` 目录下执行**(除非另注)。 ```powershell Set-Location 'e:\Desktop\Edu' ``` ### 1.2 当前已知问题 | # | 问题 | 严重度 | 修复任务 | | --- | ------------------------------------------------------------------------- | ------ | ---------- | | 1 | `project_rules.md` 文件损坏(仅 72 字节乱码残片,从 P1 提交时就损坏) | P0 | 第六节 | | 2 | `004_architecture_impact_map.md` 1.1 架构图只有技术分层图,缺业务领域视角 | P1 | 第七节 | | 3 | 004 缺少视口四层模型说明(L1 导航/L2 路由/L3 组件/L4 数据) | P1 | 第七节 | | 4 | P6 暂存文件已部署但未运行依赖安装和 arch:scan | P2 | 第三、五节 | | 5 | P6 集成测试缺失(熔断器/限流/备份脚本) | P2 | 第八节 | | 6 | K8s 骨架未演化为 Helm chart | P3 | 第九节 | | 7 | known-issues 工作经验日志未更新 | P3 | 第十节 | ### 1.3 工具链版本要求 | 工具 | 最低版本 | 验证命令 | | ------- | -------- | ------------------ | | Node.js | 20+ | `node --version` | | pnpm | 9.12+ | `pnpm --version` | | Go | 1.22+ | `go version` | | Python | 3.12+ | `python --version` | | uv | 0.5+ | `uv --version` | --- ## 二、环境准备 ### 2.1 安装 pnpm(如未安装) ```powershell npm install -g pnpm@9.12.0 --registry=https://registry.npmmirror.com pnpm --version # 验证:应输出 9.12.0 ``` ### 2.2 安装 Go(如未安装) ```powershell winget install GoLang.Go --accept-source-agreements --accept-package-agreements # 刷新 PATH $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") go version # 验证:应输出 go1.26+ windows/amd64 ``` ### 2.3 安装 uv(如未安装) ```powershell pip install uv -i https://pypi.tuna.tsinghua.edu.cn/simple uv --version # 验证:应输出 uv 0.11+ ``` ### 2.4 配置镜像加速(推荐) ```powershell # npm 镜像 npm config set registry https://registry.npmmirror.com # Go 镜像 go env -w GOPROXY=https://goproxy.cn,direct go env -w GOSUMDB=off # Python 镜像(uv 会继承 pip 配置) pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ``` --- ## 三、依赖安装 ### 3.1 TypeScript 依赖(pnpm workspace) ```powershell Set-Location 'e:\Desktop\Edu' pnpm install ``` **预期**:10 个 workspace 项目(services/_、apps/_、packages/_、scripts/_)依赖安装完成。 **验证**: ```powershell # 检查 node_modules 是否生成 Test-Path 'e:\Desktop\Edu\node_modules' # True Test-Path 'e:\Desktop\Edu\services\classes\node_modules' # True ``` ### 3.2 Go 依赖(每个 Go 服务独立) ```powershell # api-gateway Set-Location 'e:\Desktop\Edu\services\api-gateway' go mod tidy # push-gateway Set-Location 'e:\Desktop\Edu\services\push-gateway' go mod tidy # 验证 go.sum 生成 Test-Path 'e:\Desktop\Edu\services\api-gateway\go.sum' # True Test-Path 'e:\Desktop\Edu\services\push-gateway\go.sum' # True ``` **关键依赖**: - `github.com/sony/gobreaker/v2 v2.1.0`(P6 熔断器,已在 go.mod 声明,需 `go mod tidy` 拉取) - `github.com/gin-gonic/gin v1.10.0` - `github.com/google/uuid v1.6.0` ### 3.3 Python 依赖(每个 Python 服务独立) ```powershell # data-ana 服务 Set-Location 'e:\Desktop\Edu\services\data-ana' uv sync # ai 服务 Set-Location 'e:\Desktop\Edu\services\ai' uv sync # 验证 .venv 生成 Test-Path 'e:\Desktop\Edu\services\data-ana\.venv' # True Test-Path 'e:\Desktop\Edu\services\ai\.venv' # True ``` ### 3.4 protobuf 工具链(可选,如需重新生成代码) ```powershell # 安装 buf npm install -g @bufbuild/buf # 生成代码 Set-Location 'e:\Desktop\Edu\packages\shared-proto' buf generate ``` --- ## 四、代码质量校验 ### 4.1 TypeScript 校验 ```powershell Set-Location 'e:\Desktop\Edu' pnpm run lint # ESLint pnpm run typecheck # tsc --noEmit(各服务独立) ``` **预期**:0 errors。如有错误,逐个修复。 ### 4.2 Go 校验 ```powershell Set-Location 'e:\Desktop\Edu\services\api-gateway' go vet ./... go build ./... Set-Location 'e:\Desktop\Edu\services\push-gateway' go vet ./... go build ./... ``` ### 4.3 Python 校验 ```powershell # 安装 ruff(如未安装) pip install ruff Set-Location 'e:\Desktop\Edu\services\data-ana' ruff check src/ Set-Location 'e:\Desktop\Edu\services\ai' ruff check src/ ``` --- ## 五、arch.db 同步 ### 5.1 扫描代码结构 ```powershell Set-Location 'e:\Desktop\Edu' pnpm run arch:scan ``` **预期**:扫描 TS/Go/Python/Proto 文件,生成 `arch.db`(SQLite)。 ### 5.2 验证扫描结果 ```powershell # 查询统计 pnpm run arch:query -- stats # 查询模块列表 pnpm run arch:query -- modules # 查询架构违规 pnpm run arch:query -- violations ``` **预期**: - 模块数 ≥ 10(api-gateway、push-gateway、teacher-bff、iam、classes、core-edu、content、msg、data-ana、ai) - 符号数 ≥ 100 - 违规数:记录但暂不强制修复(已知技术债) ### 5.3 自定义 SQL 查询示例 ```powershell # 查询所有服务 pnpm run arch:query -- sql "SELECT name, language, path FROM modules WHERE type='service'" # 查询跨服务依赖 pnpm run arch:query -- sql "SELECT * FROM dependencies WHERE source_module != target_module" ``` --- ## 六、修复 project_rules.md(P0 紧急) ### 6.1 问题现状 ``` 文件路径:e:\Desktop\Edu\project_rules.md 当前大小:72 字节(损坏) 当前内容:4. 若代码结构变??`pnpm run arch:scan` 确认 arch.db 已更?(乱码残片) Git 历史:从 P1 提交(2ba4250)时就损坏,无完整版本 ``` ### 6.2 修复方案 **目标路径**:`e:\Desktop\Edu\.trae\rules\project_rules.md`(按用户要求放到 `.trae/rules/` 下) **内容来源**:从 CICD 项目(`e:\Desktop\CICD\.trae\rules\project_rules.md`)的完整版迁移,按 MIGRATION_GUIDE 4.1 策略矩阵调整。 ### 6.3 调整对照表 | 章节 | CICD 原版 | Edu 微服务版调整 | | ----------------- | ----------------------------- | ---------------------------------------------------------- | | 架构图优先规则 | `npm run arch:scan` | `pnpm run arch:scan`(多语言扫描器) | | 架构文档清单 | 004/006/007/008/roadmap/audit | 004 + roadmap/ + runbooks/ + 0010 蓝图 | | arch.db 规则 | TS 单语言 | TS + Go + Python + Proto 多语言 | | 编码规范-架构分层 | `app → modules → shared` 三层 | Gateway → BFF → Services → Data 微服务分层 | | 编码规范-模块结构 | `src/modules/[module]/` | `services/[service]/src/[domain]/` DDD 限界上下文 | | TypeScript 规则 | `cacheFn` + Server Action | NestJS Cache + `@RequirePermission()` 装饰器 | | 命名规范 | 单语言 | 多语言(TS/Go/Python 各自规范) | | 安全规范 | NextAuth + httpOnly Cookie | JWT RS256 + httpOnly Cookie + Gateway 校验 | | 新增规则 | — | 契约先行(protobuf+buf)、Outbox 事件驱动、多语言 monorepo | | 命令前缀 | `npm run` | `pnpm run`(TS)/ `go mod`(Go)/ `uv`(Python) | ### 6.4 执行步骤 ```powershell # 1. 创建 .trae/rules 目录 New-Item -Path 'e:\Desktop\Edu\.trae\rules' -ItemType Directory -Force # 2. 参考 CICD 完整版(可读取参考) # CICD 源文件:e:\Desktop\CICD\.trae\rules\project_rules.md # 3. 创建 Edu 版 project_rules.md(内容见 6.5 节模板) # 用编辑器创建 e:\Desktop\Edu\.trae\rules\project_rules.md # 4. 删除损坏的根目录 project_rules.md Remove-Item 'e:\Desktop\Edu\project_rules.md' -Force # 5. 更新所有引用(004、MIGRATION_GUIDE 等) # 搜索:project_rules.md # 替换:.trae/rules/project_rules.md ``` ### 6.5 project_rules.md 模板结构 完整内容应包含以下 13 章(参照 CICD 版调整): ```markdown # Edu 项目规则(微服务版) ## 1. 架构图优先规则 - 任何任务开始前,先查 004_architecture_impact_map.md - 运行 `pnpm run arch:scan` 更新 arch.db - 改码必同步图 ## 2. 架构元数据库规则(arch.db) - 多语言扫描:TS (ts-morph) + Go (tree-sitter-go) + Python (tree-sitter-python) + Proto - 查询命令:`pnpm run arch:query -- ` ## 3. 架构文档清单 | 文档 | 用途 | | ------------------------------------------------ | ------------ | | docs/architecture/004_architecture_impact_map.md | 架构设计意图 | | docs/architecture/0010_architecture.md | 理想蓝图 | | docs/architecture/roadmap/ | 长远规划 | | docs/architecture/runbooks/ | 运维手册 | | docs/troubleshooting/known-issues.md | 已知问题速查 | ## 4. 编码规范 ### 4.1 架构分层规则 - Gateway → BFF → Services → Data 微服务分层 - 依赖方向单向:Gateway → BFF → Services → Data - 服务间通过 protobuf gRPC 通信,禁止直接访问对方 DB ### 4.2 模块标准结构(DDD) services/[service]/src/ ├─ [domain]/ # 限界上下文 │ ├─ *.controller.ts # Controller(HTTP/gRPC 入口) │ ├─ *.service.ts # Application Service(编排层) │ ├─ *.repository.ts # Repository(数据访问) │ ├─ *.schema.ts # Zod 验证 │ └─ *.dto.ts # DTO ├─ config/ # 配置 ├─ shared/ # 共享(errors/observability/health/lifecycle) └─ main.ts # 入口 ### 4.3 TypeScript 规则 - 禁止 any:用 unknown + 类型守卫 - 禁止 as 断言(除 unknown 转换) - 函数返回值必须显式标注 Promise - import type 用于类型导入 - ESM .js 后缀(NestJS ESM 模式) ### 4.4 Go 规则 - 包名小写单词 - 导出函数必须有 doc comment - 错误处理:if err != nil { return err } - 不使用 interface{},用 any(Go 1.18+) ### 4.5 Python 规则 - 类型注解强制 - FastAPI 路由用 APIRouter - 异步优先:async def ### 4.6 命名规范 - 目录:kebab-case - TS 组件:PascalCase - Go 文件:lowercase - Python 文件:snake_case - 常量:UPPER_SNAKE_CASE ### 4.7 Server Action → Controller 规范 - 每个 Controller 方法必须用 @RequirePermission() 装饰器 - 输入用 Zod / class-validator 验证 - 返回 protobuf message(结构同 ActionState) - 错误统一走 GlobalErrorFilter ### 4.8 Tailwind 规范 - 使用 cn() 工具函数 - 禁止字符串拼接动态类名 - 设计令牌在 packages/shared-tokens/ ### 4.9 设计令牌规范 - 禁止硬编码颜色 #hex - 禁止硬编码字体 'Inter'/'Fraunces' - 禁止 Tailwind 任意值 w-[Npx] - 三层令牌:primitive → semantic → tailwind-theme ## 5. 安全规范 - JWT RS256(IAM 签发,Gateway 公钥校验) - httpOnly + Secure + SameSite=Strict Cookie - 服务端环境变量不加 NEXT_PUBLIC_ - 禁止 dangerouslySetInnerHTML(如必须,先用 DOMPurify 清洗) ## 6. 契约规范 - 契约先行:protobuf + buf v2 - 服务间通信先定 .proto,再写实现 - buf lint STANDARD 规则 - buf breaking FILE 级别检查 ## 7. 事件驱动规范 - Outbox 模式:事务内写业务+outbox,独立 publisher 投递到 Kafka - 事件命名:.(如 ExamCreated) - TOPIC_MAP 路由:每个服务维护事件→topic 映射 - 幂等性:Kafka producer idempotent + transactionalId ## 8. 提交规范 - Conventional Commits: feat(scope): description - scope: 服务名或包名(iam/classes/core-edu/content/msg/ai/api-gateway/...) - 提交前必须运行 pnpm run lint + pnpm run typecheck ## 9. Git 工作流 - trunk-based 分支策略 - commitlint + husky 强制校验 - 直接提交 main 分支(小项目),大型团队改 PR ## 10. 问题记录规则 - 所有工作完成后,记录到 docs/troubleshooting/known-issues.md - 索引式表格:场景→技术/规则映射 - 工作经验日志:日期+模块+做了什么+学到什么 ## 11. AI 工作强制流程 ### 阶段 1: 上下文加载 1. `pnpm run arch:scan` 更新 arch.db 2. `pnpm run arch:query -- module-deps` 查模块依赖 3. 阅读 services/[service]/README.md 4. 查 known-issues.md 相关经验 ### 阶段 2: 执行工作 1. 按规划执行 2. 修改代码后立即 `pnpm run arch:scan` 3. 运行 pnpm run lint + pnpm run typecheck ### 阶段 3: 经验沉淀 1. 在 known-issues.md 追加工作经验日志 2. 若发现新场景→技术映射,提炼到对应分区 3. 若架构变化,更新 004 ## 12. 多语言 monorepo 规则 - pnpm workspace(TS)+ go.work(Go)+ pyproject.toml(uv) - 共享包:packages/shared-proto / shared-ts / shared-go / shared-py - 跨语言契约通过 protobuf ## 13. 可观测性规范 - 日志:pino(TS)/ zap(Go)/ structlog(Python) - 指标:prom-client(TS)/ prometheus(Go)/ prometheus-client(Python) - 链路:OpenTelemetry SDK + OTLP exporter - 三支柱必须同时启用 ``` ### 6.6 验证 ```powershell # 验证文件存在且内容完整 Get-Item 'e:\Desktop\Edu\.trae\rules\project_rules.md' | Select-Object Name, Length # 预期:Length > 5000 字节 # 验证根目录损坏文件已删除 Test-Path 'e:\Desktop\Edu\project_rules.md' # False # 搜索所有引用并更新 Get-ChildItem 'e:\Desktop\Edu' -Recurse -Include '*.md' | Select-String -Pattern 'project_rules.md' | Select-Object Path, LineNumber, Line ``` --- ## 七、修复 004 架构图 ### 7.1 问题现状 - **1.1 系统边界图**:只有一张技术分层图,Users 层按角色分(Teacher/Student/Parent/Admin) - **缺业务领域视角**:MIGRATION_GUIDE 3.2 和 0010 蓝图用的是 6 业务领域(身份/教学组织/教学核心/内容分析/沟通/智能洞察) - **5.x 认证与权限**:缺视口四层模型说明 ### 7.2 修复方案:双图并存 #### 7.2.1 保留 1.1a 技术分层图(修改注释) 将当前 1.1 改名为 **1.1a 技术分层视角**,修改: - Users 层标注改为"场景域用户"(不是角色分类) - TeacherPortal 标注"教学场景域(教师/教导主任/教研组长共用)" - StudentPortal 标注"学习场景域" - ParentPortal 标注"家长场景域" - AdminPortal 标注"管理场景域" - BFF 层标注"按使用场景域分 BFF(不是按角色分)" - 添加说明:"本图展示部署分层结构。业务领域视角见 1.1b" #### 7.2.2 新增 1.1b 业务领域视角图 在 1.1a 后新增 **1.1b 业务领域视角**,mermaid 图: ```mermaid graph TB subgraph D1["身份认证领域"] IAM[iam 服务] IAM_M[users / roles / permissions
refresh_tokens / sessions] end subgraph D2["教学组织领域"] ORG[core-edu 服务
classes 模块] ORG_M[classes / subjects / enrollment] end subgraph D3["教学核心领域"] TEACH[core-edu 服务
exams/homework/grades] TEACH_M[exams / homework / grades
courses / lessons / schedule / attendance] end subgraph D4["内容资源领域"] CONTENT[content 服务] CONTENT_M[textbooks / knowledge-points
questions / grading / search(ES)] end subgraph D5["沟通通知领域"] MSG[msg 服务] MSG_M[messaging / notifications / announcements] end subgraph D6["智能洞察领域"] DATA[data-ana 服务] AI[ai 服务] DATA_M[analytics / dashboard / diagnostic(ClickHouse)] AI_M[ai 备课/出题/分析 / search] end D1 --> D2 D1 --> D3 D1 --> D4 D1 --> D5 D2 --> D3 D3 --> D4 D3 --> D5 D4 --> D6 D3 --> D6 ``` #### 7.2.3 1.2 服务清单表格新增"业务领域"列 在 1.2 服务清单表格中,"限界上下文"列后新增"业务领域"列: | 类别 | 服务名 | 语言/框架 | 限界上下文 | **业务领域** | 阶段 | | -------- | ----------- | ---------------- | ---------- | ----------------------- | ---- | | 基础设施 | api-gateway | Go (Gin) | 网关 | — | P1 | | BFF | teacher-bff | TS (NestJS) | 教师聚合 | 教学场景域 | P2 | | 业务 | iam | TS (NestJS) | 身份认证 | **身份认证** | P2 | | 业务 | core-edu | TS (NestJS) | 教学核心 | **教学组织 + 教学核心** | P3 | | 业务 | content | TS (NestJS) | 内容资源 | **内容资源** | P4 | | 业务 | data-ana | Python (FastAPI) | 数据分析 | **智能洞察** | P4 | | 业务 | msg | TS (NestJS) | 消息通知 | **沟通通知** | P5 | | 业务 | ai | Python (FastAPI) | AI 网关 | **智能洞察** | P5 | | ... | ... | ... | ... | ... | ... | #### 7.2.4 新增 5.4 视口四层模型 在 5.3 DataScope 6 级数据范围后,新增 **5.4 视口四层模型**: ```markdown ### 5.4 视口四层模型 视口(Viewport)是用户在特定场景域下的可见范围。视口既可独立配置(RoleViewport 表), 也可由权限推导(permission → viewport 默认映射)。新角色只需配置权限集,视口自动推导; 需要差异化时再显式配置视口。 | 层级 | 含义 | 配置载体 | 示例 | | ------- | ---------------- | ---------------------------------- | -------------------------------------------- | | L1 导航 | 侧边栏菜单项 | navigation_config 表 | 教导主任看到"全校成绩分析"菜单 | | L2 路由 | 可访问路由 | route_permission 表 + Gateway 校验 | 教导主任可访问 /admin/grade-analysis | | L3 组件 | 页面内组件可见性 | usePermission().hasPermission() | 教导主任看到"导出全校报表"按钮 | | L4 数据 | 数据行级过滤 | DataScope 枚举 | 教导主任 DataScope=grade_managed(管辖年级) | **场景域 BFF 复用策略**: 按"使用场景域"分 BFF,而非按角色分。新角色复用现有 BFF,通过视口差异化。 | BFF | 场景域 | 复用角色 | | ----------- | -------- | ------------------------ | | Teacher BFF | 教学场景 | 教师、教导主任、教研组长 | | Student BFF | 学习场景 | 学生 | | Parent BFF | 家长场景 | 家长 | | Admin BFF | 管理场景 | 系统管理员、校管理员 | **实现**:教导主任归入 Teacher BFF + 额外管理视口(L1 导航增加管理菜单项,L4 数据范围扩大到年级)。 **iam 服务职责**: - 认证:登录/登出/JWT/2FA - RBAC:角色/权限/角色-权限映射 CRUD - 视口配置:导航/路由/组件级视口配置 CRUD - DataScope:数据范围解析(all/grade_managed/class_taught/children/owned + 自定义) - 权限解析 API:getEffectivePermissions(userId) → {permissions, viewports, dataScope} ``` ### 7.3 执行步骤 ```powershell # 1. 编辑 004_architecture_impact_map.md # 路径:e:\Desktop\Edu\docs\architecture\004_architecture_impact_map.md # 2. 按上述方案修改: # - 1.1 → 1.1a(改注释) # - 新增 1.1b(业务领域图) # - 1.2 表格新增"业务领域"列 # - 5.3 后新增 5.4(视口四层模型) # 3. 验证 mermaid 语法 # 可在 VS Code 安装 Mermaid Previewer 插件预览 # 4. 更新目录(如有章节编号变化) ``` --- ## 八、P6 集成测试补充 ### 8.1 熔断器状态机测试 **文件**:`services/api-gateway/internal/middleware/circuit-breaker_test.go` ```go package middleware import ( "net/http" "net/http/httptest" "testing" "time" "github.com/gin-gonic/gin" ) func TestCircuitBreaker_ClosedToOpen(t *testing.T) { // 模拟 5 秒窗口内错误率 > 50%,验证状态从 CLOSED → OPEN } func TestCircuitBreaker_OpenToHalfOpen(t *testing.T) { // 验证 OPEN 状态 30 秒后转 HALF_OPEN,允许 1 个探测请求 } func TestCircuitBreaker_HalfOpenToClosed(t *testing.T) { // 验证 HALF_OPEN 探测成功后转 CLOSED } func TestCircuitBreaker_HalfOpenToOpen(t *testing.T) { // 验证 HALF_OPEN 探测失败后转 OPEN } func TestCircuitBreaker_4xxNotCounted(t *testing.T) { // 验证 4xx 响应不计入熔断失败计数 } ``` ### 8.2 限流桶测试 **文件**:`services/api-gateway/internal/middleware/ratelimit_test.go` ```go package middleware import ( "net/http" "net/http/httptest" "testing" "time" "github.com/gin-gonic/gin" ) func TestRateLimit_AllowUnderBurst(t *testing.T) { // 验证突发请求 ≤ burst 时全部放行 } func TestRateLimit_RejectOverBurst(t *testing.T) { // 验证突发请求 > burst 时返回 429 } func TestRateLimit_RefillTokens(t *testing.T) { // 验证令牌按 rps 速率补充 } func TestRateLimit_PerIPIsolation(t *testing.T) { // 验证不同 IP 的桶相互独立 } func TestRateLimit_CleanupExpiredBuckets(t *testing.T) { // 验证 10 分钟无访问的桶被清理 } ``` ### 8.3 备份脚本 dry-run 测试 **文件**:`infra/backup/test-backup-mysql.sh` ```bash #!/bin/bash # dry-run 模式测试备份脚本 # 不实际执行 mysqldump,仅验证参数解析和路径创建 set -euo pipefail # 测试 --service 参数缺失 ./backup-mysql.sh 2>&1 | grep -q "service is required" # 测试 --keep 默认值 ./backup-mysql.sh --service test 2>&1 | grep -q "keep=7" # 测试无效 service ./backup-mysql.sh --service invalid 2>&1 | grep -q "unknown service" ``` ### 8.4 执行测试 ```powershell # Go 测试 Set-Location 'e:\Desktop\Edu\services\api-gateway' go test ./internal/middleware/... -v -cover # Shell 测试(需要 bash 环境,如 WSL 或 Git Bash) # bash infra/backup/test-backup-mysql.sh ``` --- ## 九、Helm Chart 演化 ### 9.1 现状 `infra/k8s/` 下有骨架 manifest: - `namespace.yaml`:4 命名空间 - `api-gateway-deployment.yaml`:Deployment + Service ### 9.2 演化路线 ``` infra/k8s/ ├─ namespace.yaml # 保留(基础资源) ├─ api-gateway-deployment.yaml # 删除(迁移到 Helm) └─ helm/ # 新增 ├─ edu-platform/ # 平台级 chart │ ├─ Chart.yaml │ ├─ values.yaml # 全局默认值 │ ├─ values-dev.yaml # 开发环境覆盖 │ ├─ values-staging.yaml │ ├─ values-prod.yaml │ └─ templates/ │ ├─ namespace.yaml │ ├─ configmap.yaml │ ├─ secret.yaml │ ├─ ingress.yaml │ └─ hpa.yaml ├─ api-gateway/ # 服务级 chart │ ├─ Chart.yaml │ ├─ values.yaml │ └─ templates/ │ ├─ deployment.yaml │ ├─ service.yaml │ ├─ configmap.yaml │ └─ hpa.yaml ├─ iam/ ├─ core-edu/ ├─ content/ ├─ msg/ ├─ data-ana/ └─ ai/ ``` ### 9.3 执行步骤 ```powershell # 1. 安装 Helm(如未安装) winget install Helm.Helm # 2. 创建 chart 骨架 Set-Location 'e:\Desktop\Edu\infra\k8s' New-Item -Path 'helm' -ItemType Directory helm create helm/edu-platform helm create helm/api-gateway # ... 其他服务 # 3. 将现有 manifest 迁移到 templates/ # 4. 参数化 values.yaml # 5. 验证 helm lint helm/api-gateway helm template helm/api-gateway ``` --- ## 十、文档同步 ### 10.1 更新 known-issues.md **文件**:`docs/troubleshooting/known-issues.md` 在"工作经验日志"区追加: ```markdown ### 2026-07-08 P6 后续工作 | 日期 | 模块 | 做了什么 | 学到什么 | | ---------- | ----------- | -------------------------------------- | -------------------------------------------------------------- | | 2026-07-08 | 全局 | pnpm install 失败(ENOENT _tmp_ 文件) | pnpm 在 Windows 下需配置 PNPM_HOME 和 TMP 环境变量 | | 2026-07-08 | 全局 | project_rules.md 损坏(72 字节乱码) | 迁移文件后必须验证完整性,git commit 前运行 cat 检查 | | 2026-07-08 | api-gateway | gobreaker v2.1.0 版本验证 | GitHub releases 页面确认版本存在性,避免 go mod tidy 失败 | | 2026-07-08 | 004 | 架构图视角讨论(技术分层 vs 业务领域) | 双图并存:1.1a 技术分层(部署视角)+ 1.1b 业务领域(DDD 视角) | | 2026-07-08 | 004 | 视口四层模型补充 | L1 导航/L2 路由/L3 组件/L4 数据,场景域 BFF 复用策略 | ``` ### 10.2 同步 004 架构文档 按第七节修复后,检查 004 其他章节是否需要同步更新: - 1.2 服务清单:新增"业务领域"列 - 5.4 视口四层模型:新增章节 - 14 附录:确认 6 阶段路线图与实际交付一致 ### 10.3 更新模块 README 检查 9 个服务 README 是否需要补充: - P6 新增的 health/lifecycle 模块说明 - 中间件链说明(api-gateway) - 健康检查端点说明(所有服务) --- ## 十一、故障排查 ### 11.1 pnpm install 失败 **错误**:`ENOENT: no such file or directory, open 'E:\Desktop\Edu\_tmp_xxxxx'` **原因**:pnpm 在 Windows 下临时文件路径问题。 **解决**: ```powershell # 设置环境变量 $env:PNPM_HOME = 'C:\Users\xiner\.pnpm' $env:TMP = 'C:\Users\xiner\AppData\Local\Temp' $env:TEMP = 'C:\Users\xiner\AppData\Local\Temp' # 重试 pnpm install ``` ### 11.2 pnpm "This project is configured to use npm" **错误**:`ERROR This project is configured to use npm` **原因**:项目根有 `.npmrc` 或 package.json 的 `packageManager` 字段冲突。 **解决**: ```powershell # 检查 .npmrc Get-Content 'e:\Desktop\Edu\.npmrc' -ErrorAction SilentlyContinue # 如有 .npmrc 含 "package-manager=npm",删除或改为 pnpm # 或强制使用 pnpm pnpm install --ignore-scripts ``` ### 11.3 go mod tidy 网络失败 **错误**:`go: module github.com/sony/gobreaker/v2: downloading ... timeout` **解决**: ```powershell go env -w GOPROXY=https://goproxy.cn,direct go env -w GOSUMDB=off go mod tidy ``` ### 11.4 uv sync 失败 **错误**:`error: Failed to download ...` **解决**: ```powershell # 配置镜像 $env:UV_INDEX_URL = 'https://pypi.tuna.tsinghua.edu.cn/simple' uv sync ``` ### 11.5 arch:scan 报错 **错误**:`Error: Cannot find module 'tsx'` **解决**: ```powershell # 确保 tsx 已安装 pnpm add -D tsx # 或用 npx npx tsx scripts/arch-scan/scanner.ts ``` --- ## 十二、验收清单 完成所有任务后,逐项验证: ### 12.1 环境与依赖 - [ ] `pnpm --version` 输出 9.12+ - [ ] `go version` 输出 1.22+ - [ ] `uv --version` 输出 0.5+ - [ ] `pnpm install` 成功,无错误 - [ ] `go mod tidy`(api-gateway、push-gateway)成功 - [ ] `uv sync`(data-ana、ai)成功 ### 12.2 代码质量 - [ ] `pnpm run lint` 0 errors - [ ] `pnpm run typecheck` 0 errors - [ ] `go vet ./...`(api-gateway、push-gateway)0 errors - [ ] `ruff check src/`(data-ana、ai)0 errors ### 12.3 arch.db - [ ] `pnpm run arch:scan` 成功 - [ ] `pnpm run arch:query -- stats` 输出模块数 ≥ 10 - [ ] arch.db 文件存在且非空 ### 12.4 project_rules.md 修复 - [ ] `.trae/rules/project_rules.md` 存在且 > 5000 字节 - [ ] 根目录 `project_rules.md` 已删除 - [ ] 所有引用已更新为 `.trae/rules/project_rules.md` ### 12.5 004 架构图修复 - [ ] 1.1a 技术分层图保留,注释改为"场景域用户" - [ ] 1.1b 业务领域视角图新增(6 领域) - [ ] 1.2 服务清单新增"业务领域"列 - [ ] 5.4 视口四层模型章节新增 - [ ] mermaid 语法正确 ### 12.6 P6 测试 - [ ] circuit-breaker_test.go 5 个测试用例通过 - [ ] ratelimit_test.go 5 个测试用例通过 - [ ] backup 脚本 dry-run 测试通过 ### 12.7 文档同步 - [ ] known-issues.md 追加 P6 工作经验日志 - [ ] 9 个服务 README 检查并补充(如需要) ### 12.8 Git 提交 - [ ] 所有修复提交到 main 分支 - [ ] 提交信息:`fix(docs): repair project_rules.md and 004 architecture diagrams` - [ ] 推送到远程 --- ## 附录:快速执行脚本 如需一键执行所有任务,可创建 PowerShell 脚本: ```powershell # e:\Desktop\Edu\scripts\post-p6-followup.ps1 # 在 Edu 目录下运行:.\scripts\post-p6-followup.ps1 Set-Location 'e:\Desktop\Edu' $ErrorActionPreference = 'Continue' Write-Host '=== 1. 依赖安装 ===' -ForegroundColor Cyan pnpm install Set-Location 'services\api-gateway'; go mod tidy; Set-Location '..\..' Set-Location 'services\push-gateway'; go mod tidy; Set-Location '..\..' Set-Location 'services\data-ana'; uv sync; Set-Location '..\..' Set-Location 'services\ai'; uv sync; Set-Location '..\..' Write-Host '=== 2. arch.db 同步 ===' -ForegroundColor Cyan pnpm run arch:scan pnpm run arch:query -- stats Write-Host '=== 3. 代码质量校验 ===' -ForegroundColor Cyan pnpm run lint pnpm run typecheck Write-Host '=== 完成 ===' -ForegroundColor Green Write-Host '注意:project_rules.md 和 004 架构图修复需手动执行(见文档第六、七节)' ``` --- **文档结束。按顺序执行各节任务,遇问题参考第十一节故障排查。**