fix(docs): 004 架构图补充分层/领域双视角与视口四层模型

- 1.1a 技术分层视角:用户层标注改为场景域用户
- 1.1b 业务领域视角:新增 6 领域 subgraph(D1-D6)
- 1.2 服务清单新增业务领域列
- 5.4 新增视口四层模型章节(L1-L4 + 场景域 BFF 复用策略)
This commit is contained in:
SpecialX
2026-07-08 12:50:13 +08:00
parent 3fbb97791d
commit bc3176cb05

View File

@@ -5,8 +5,9 @@
> 状态:基线发布
> 适用范围Edu 微服务架构DDD + EDA + CQRS
> 关联文档:
>
> - [理想蓝图](./0010_architecture.md)
> - [项目规则](../../project_rules.md)
> - [项目规则](../../.trae/rules/project_rules.md)
> - [路线图](./roadmap/README.md)
---
@@ -32,22 +33,25 @@
## 1. 项目概述
### 1.1 系统边界
### 1.1a 技术分层视角(系统边界
> 本图展示**部署分层结构**(自上而下:用户 → 微前端 → 网关 → BFF → 业务服务 → 总线 → 数据)。
> 用户层按"使用场景域"标注BFF 层按场景域分(不是按角色分)。业务领域视角见 [1.1b](#11b-业务领域视角)。
```mermaid
graph TB
subgraph Users["用户层"]
Teacher[教师]
Student[学生]
Parent[家长]
Admin[管理员]
subgraph Users["用户层(场景域用户)"]
Teacher["教学场景域用户<br/>(教师 / 教导主任 / 教研组长 共用)"]
Student["学习场景域用户<br/>(学生)"]
Parent["家长场景域用户<br/>(家长)"]
Admin["管理场景域用户<br/>(系统管理员 / 校管理员)"]
end
subgraph MFE["微前端层Module Federation"]
TeacherPortal[teacher-portal]
StudentPortal[student-portal]
ParentPortal[parent-portal]
AdminPortal[admin-portal]
TeacherPortal["teacher-portal<br/>教学场景域前端"]
StudentPortal["student-portal<br/>学习场景域前端"]
ParentPortal["parent-portal<br/>家长场景域前端"]
AdminPortal["admin-portal<br/>管理场景域前端"]
end
subgraph Gateway["网关层Go"]
@@ -55,10 +59,10 @@ graph TB
PushGateway[push-gateway<br/>WebSocket/SSE]
end
subgraph BFF["BFF 聚合层NestJS"]
TeacherBFF[teacher-bff<br/>GraphQL]
StudentBFF[student-bff<br/>GraphQL]
ParentBFF[parent-bff<br/>GraphQL]
subgraph BFF["BFF 聚合层NestJS<br/>按使用场景域分 BFF不是按角色分"]
TeacherBFF["teacher-bff<br/>教学场景域聚合"]
StudentBFF["student-bff<br/>学习场景域聚合"]
ParentBFF["parent-bff<br/>家长场景域聚合"]
end
subgraph Services["业务微服务NestJS + FastAPI"]
@@ -128,34 +132,90 @@ graph TB
CoreEdu --> Redis
```
### 1.1b 业务领域视角
> 本图按 **DDD 限界上下文**展示 6 个业务领域及其依赖关系。同一服务可横跨多个领域(如 core-edu 同时承载"教学组织"与"教学核心")。
> 技术分层视角见 [1.1a](#11a-技术分层视角系统边界)。
```mermaid
graph TB
subgraph D1["D1 身份认证领域"]
IAM[iam 服务]
IAM_M[users / roles / permissions<br/>refresh_tokens / sessions]
end
subgraph D2["D2 教学组织领域"]
ORG[core-edu 服务<br/>classes 模块]
ORG_M[classes / subjects / enrollment]
end
subgraph D3["D3 教学核心领域"]
TEACH[core-edu 服务<br/>exams/homework/grades]
TEACH_M[exams / homework / grades<br/>courses / lessons / schedule / attendance]
end
subgraph D4["D4 内容资源领域"]
CONTENT[content 服务]
CONTENT_M[textbooks / knowledge-points<br/>questions / grading / search(ES)]
end
subgraph D5["D5 沟通通知领域"]
MSG[msg 服务]
MSG_M[messaging / notifications / announcements]
end
subgraph D6["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
```
**双图并存说明**
- **1.1a 技术分层**:描述部署、流量路径、网络边界,关注"如何部署与调用"
- **1.1b 业务领域**:描述 DDD 限界上下文、聚合根、领域依赖,关注"业务边界与归属"
- 两图互补,分别服务于运维/SRE 与产品/架构视角
### 1.2 服务清单
| 类别 | 服务名 | 语言/框架 | 限界上下文 | 阶段 |
|------|--------|-----------|-----------|------|
| 基础设施 | api-gateway | Go (Gin) | 网关 | P1 |
| 基础设施 | push-gateway | Go (Gin) | 推送 | P5 |
| BFF | teacher-bff | TS (NestJS) | 教师聚合 | P2 |
| BFF | student-bff | TS (NestJS) | 学生聚合 | P3 |
| BFF | parent-bff | TS (NestJS) | 家长聚合 | P4 |
| 业务 | 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 |
| 微前端 | teacher-portal | TS (Next.js) | 教师端 | P2 |
| 微前端 | student-portal | TS (Next.js) | 学生端 | P3 |
| 微前端 | parent-portal | TS (Next.js) | 家长端 | P4 |
| 微前端 | admin-portal | TS (Next.js) | 管理端 | P6 |
| 共享包 | shared-proto | TS | protobuf 契约 | P1 |
| 共享包 | shared-ts | TS | TS 共享工具 | P1 |
| 共享包 | shared-go | Go | Go 共享工具 | P1 |
| 共享包 | shared-py | Python | Python 共享工具 | P4 |
| 类别 | 服务名 | 语言/框架 | 限界上下文 | 业务领域 | 阶段 |
| -------- | -------------- | ---------------- | --------------- | ----------------------------- | ---- |
| 基础设施 | api-gateway | Go (Gin) | 网关 | — | P1 |
| 基础设施 | push-gateway | Go (Gin) | 推送 | — | P5 |
| BFF | teacher-bff | TS (NestJS) | 教师聚合 | 教学场景域 | P2 |
| BFF | student-bff | TS (NestJS) | 学生聚合 | 学习场景域 | P3 |
| BFF | parent-bff | TS (NestJS) | 家长聚合 | 家长场景域 | P4 |
| 业务 | iam | TS (NestJS) | 身份认证 | **D1 身份认证** | P2 |
| 业务 | core-edu | TS (NestJS) | 教学核心 | **D2 教学组织 + D3 教学核心** | P3 |
| 业务 | content | TS (NestJS) | 内容资源 | **D4 内容资源** | P4 |
| 业务 | data-ana | Python (FastAPI) | 数据分析 | **D6 智能洞察** | P4 |
| 业务 | msg | TS (NestJS) | 消息通知 | **D5 沟通通知** | P5 |
| 业务 | ai | Python (FastAPI) | AI 网关 | **D6 智能洞察** | P5 |
| 微前端 | teacher-portal | TS (Next.js) | 教师端 | 教学场景域 | P2 |
| 微前端 | student-portal | TS (Next.js) | 学生端 | 学习场景域 | P3 |
| 微前端 | parent-portal | TS (Next.js) | 家长端 | 家长场景域 | P4 |
| 微前端 | admin-portal | TS (Next.js) | 管理端 | 管理场景域 | P6 |
| 共享包 | shared-proto | TS | protobuf 契约 | — | P1 |
| 共享包 | shared-ts | TS | TS 共享工具 | — | P1 |
| 共享包 | shared-go | Go | Go 共享工具 | — | P1 |
| 共享包 | shared-py | Python | Python 共享工具 | — | P4 |
### 1.3 CICD → Edu 模块映射
| CICD 模块(旧) | Edu 服务(新) | 迁移阶段 |
|----------------|---------------|----------|
| ----------------------------------------- | -------------- | -------- |
| auth + users + rbac | iam | P2 |
| classes + subjects + enrollment | core-edu | P3 |
| courses + lessons + schedule + attendance | core-edu | P3 |
@@ -174,7 +234,7 @@ graph TB
### 2.1 多语言技术栈矩阵
| 层级 | 语言 | 框架 | 用途 |
|------|------|------|------|
| -------- | --------------- | ------------------------------ | -------------------------- |
| 网关层 | Go 1.22+ | Gin | API Gateway、Push Gateway |
| 业务服务 | TypeScript 5.5+ | NestJS 10 | IAM、CoreEdu、Content、Msg |
| 分析/AI | Python 3.12+ | FastAPI | DataAna、AI 网关 |
@@ -185,7 +245,7 @@ graph TB
### 2.2 多存储矩阵
| 存储 | 用途 | 使用服务 |
|------|------|----------|
| ------------- | ------------------------ | -------------------------- |
| MySQL 8 | 写模型主库(每服务独占) | IAM、CoreEdu、Content、Msg |
| Redis 7 | 缓存、会话、限流计数 | 全部服务 |
| ClickHouse | 读模型宽表、分析聚合 | DataAna、CoreEdu读模型 |
@@ -195,7 +255,7 @@ graph TB
### 2.3 基础设施矩阵
| 组件 | 用途 |
|------|------|
| ------------- | ----------------------------------- |
| Kafka | 事件总线,领域事件异步通信 |
| Debezium | CDCMySQL Binlog → Kafka 实时同步 |
| Temporal | 工作流编排考试生命周期、AI 编排) |
@@ -260,6 +320,7 @@ L1 客户端 → L2 微前端 → L3 网关 → L4 BFF → L5 业务服务 → L
```
**严格规则**
1. L3 网关层只做路由、鉴权、限流、熔断,**不写业务逻辑**
2. L4 BFF 层只做聚合、裁剪、协议转换,**不持有业务状态**
3. L5 业务服务之间通过 gRPC同步或 Kafka 事件(异步)通信,**不直接访问对方数据库**
@@ -340,7 +401,7 @@ graph TB
### 4.1 服务间通信矩阵
| 调用方 → 被调用方 | 协议 | 场景 |
|-------------------|------|------|
| ------------------ | ---------- | ---------------- |
| api-gateway → BFF | gRPC | 请求路由 |
| BFF → 业务服务 | gRPC | 同步查询聚合 |
| CoreEdu → Content | Kafka 事件 | 教学内容变更通知 |
@@ -390,7 +451,7 @@ sequenceDiagram
### 5.2 三层角色模型
| 层级 | 来源 | 示例 | 优先级 |
|------|------|------|--------|
| -------- | ------------- | ------------------------------- | ------ |
| 系统角色 | 系统预设 | admin、teacher、student、parent | 最高 |
| 组织角色 | 学校/班级分配 | 年级组长、班主任、学科组长 | 中 |
| 临时角色 | 临时授权 | 代课教师、临时代理 | 最低 |
@@ -400,7 +461,7 @@ sequenceDiagram
### 5.3 DataScope 6 级数据范围
| 级别 | 名称 | 数据范围 | 典型角色 |
|------|------|----------|----------|
| ---- | -------- | ---------- | ------------ |
| L0 | SELF | 仅本人数据 | 学生、家长 |
| L1 | CLASS | 本班数据 | 班主任、学生 |
| L2 | GRADE | 本年级数据 | 年级组长 |
@@ -410,6 +471,40 @@ sequenceDiagram
**实现**:业务服务在 Repository 层根据 dataScope 级别动态注入 WHERE 条件。
### 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 + 自定义)
- 权限解析 APIgetEffectivePermissions(userId) → {permissions, viewports, dataScope}
---
## 6. 数据访问与缓存
@@ -462,7 +557,7 @@ flowchart TD
### 6.3 缓存策略矩阵
| 数据类型 | 存储 | TTL | 失效策略 |
|----------|------|-----|----------|
| ------------- | ---------- | ------- | ------------ |
| 用户会话 | Redis | 30 分钟 | 滑动过期 |
| 权限列表 | Redis | 5 分钟 | 事件驱动失效 |
| 班级/年级列表 | Redis | 5 分钟 | 事件驱动失效 |
@@ -521,7 +616,7 @@ graph LR
### 7.2 事件 Topic 分类
| Topic 模式 | 示例 | 生产者 | 消费者 |
|-----------|------|--------|--------|
| ----------------------------------- | ---------- | ------- | ------------ |
| `edu.identity.user.created` | 用户创建 | IAM | CoreEdu、Msg |
| `edu.identity.user.updated` | 用户更新 | IAM | CoreEdu、Msg |
| `edu.org.class.created` | 班级创建 | CoreEdu | DataAna |
@@ -534,7 +629,7 @@ graph LR
### 7.3 核心领域事件
| 事件 | 触发场景 | 消费者动作 |
|------|----------|-----------|
| --------------------- | -------------- | ------------------------------------------------ |
| UserRegistered | 新用户注册 | CoreEdu 初始化默认班级关联Msg 发送欢迎通知 |
| ExamPublished | 考试发布 | Msg 推送考试通知给学生DataAna 创建考试分析骨架 |
| HomeworkSubmitted | 学生提交作业 | DataAna 记录提交行为Msg 通知教师 |
@@ -768,6 +863,7 @@ flowchart LR
```
**规则**
- 所有跨服务调用必须透传 W3C Trace Context
- Kafka 事件必须将 traceId 写入消息 header
- 日志必须包含 traceId 用于关联查询
@@ -822,7 +918,7 @@ graph TB
### 11.2 契约规则
| 规则 | 说明 |
|------|------|
| -------- | -------------------------------------- |
| 包命名 | `edu.[context].[aggregate].v[version]` |
| 版本化 | 破坏性变更必须升版本v1 → v2 |
| 字段编号 | 禁止复用已删除字段编号,使用 reserved |
@@ -866,7 +962,7 @@ graph LR
### 12.1 服务独立性约束
| 约束 | 说明 |
|------|------|
| ----------- | -------------------------------------- |
| 数据库独占 | 每个微服务独占自身数据库,禁止跨库联表 |
| 契约先行 | 所有跨服务通信必须先定义 protobuf 契约 |
| Outbox 强制 | 所有领域事件必须通过 Outbox 模式发布 |
@@ -877,7 +973,7 @@ graph LR
### 12.2 通信约束
| 场景 | 允许 | 禁止 |
|------|------|------|
| -------------------- | ---------------- | ------------------- |
| 客户端 → Gateway | REST + WebSocket | 直连业务服务 |
| Gateway → BFF | gRPC | REST |
| BFF → 业务服务 | gRPC | 直接访问 DB |
@@ -888,7 +984,7 @@ graph LR
### 12.3 数据一致性约束
| 场景 | 一致性级别 | 实现 |
|------|-----------|------|
| ------ | ---------- | --------------------- |
| 聚合内 | 强一致 | 单事务 |
| 聚合间 | 最终一致 | Kafka 事件 |
| 服务间 | 最终一致 | Kafka 事件 / Saga |
@@ -900,7 +996,7 @@ graph LR
## 13. ADR 记录
| 编号 | 决策 | 原因 | 状态 |
|------|------|------|------|
| ------- | ----------------------------- | --------------------------------- | ------ |
| ADR-001 | 采用 DDD 限界上下文划分服务 | 业务边界清晰,独立演进 | 已采纳 |
| ADR-002 | 采用 NestJS 作为业务服务框架 | TS 生态成熟,装饰器 + DI 适合 DDD | 已采纳 |
| ADR-003 | 采用 Go 作为网关语言 | 高并发、低内存、适合网关场景 | 已采纳 |
@@ -934,7 +1030,7 @@ graph LR
### 14.2 服务与阶段映射
| 阶段 | 周期 | 交付服务 | 退出标准 |
|------|------|----------|----------|
| ----------- | ------- | ----------------------------------------------------- | ------------------------------ |
| P1 地基 | M1-M3 | api-gateway、classes黄金模板、shared-proto | classes 域 CRUD 端到端跑通 |
| P2 身份 | M4-M6 | iam、teacher-bff、teacher-portal 骨架 | 教师可登录并看到空白 Dashboard |
| P3 核心教学 | M7-M10 | core-edu合并 classes、student-bff、student-portal | 考试→作答→批改→成绩全链路 |