- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
351 lines
16 KiB
Markdown
351 lines
16 KiB
Markdown
# 考培练系统全链路联调结果汇总报告(重写版)
|
||
|
||
## 执行时间
|
||
2025-09-22
|
||
|
||
## 联调环境
|
||
- 后端:Python + FastAPI + MySQL + Redis(本机 localhost)
|
||
- 前端:Vue3 + Element Plus + TypeScript(本机 localhost)
|
||
- 数据库:MySQL 8.0(`mysql+aiomysql://root:root@localhost:3306/kaopeilian?charset=utf8mb4`)
|
||
|
||
## 结论先行(TL;DR)
|
||
- **整体结论**:系统主体功能已基本就绪,前后端多数领域可对接;当前联调阻断集中在“考试模块路由未注册 + 前后端契约不一致”。修复后预计半天可达端到端闭环。
|
||
- **后端完成度(功能/稳定性)**:约 85%(鉴权、课程、用户、陪练、管理员、Coze 网关已可用;考试路由存在但未聚合注册,部分统计接口未对齐)。
|
||
- **前端完成度(页面/请求)**:约 92%(默认指向真实后端;考试模块大量调用尚未实现/未注册的端点)。
|
||
- **联调完成度(端到端)**:约 70%(登录/课程/陪练/管理员链路可测;考试链路待打通)。
|
||
|
||
---
|
||
|
||
## 证据与核查要点
|
||
|
||
- **后端 v1 路由聚合状态**:`exams` 路由文件存在,但未注册到 v1 聚合路由。
|
||
|
||
```12:16:kaopeilian-backend/app/api/v1/__init__.py
|
||
api_router = APIRouter()
|
||
|
||
# 包含各个子路由
|
||
api_router.include_router(coze_router, tags=["coze"])
|
||
```
|
||
|
||
```26:41:kaopeilian-backend/app/api/v1/__init__.py
|
||
# from .exam import router as exam_router
|
||
# ...
|
||
# api_router.include_router(exam_router, tags=["exams"])
|
||
```
|
||
|
||
- **考试模块后端实际提供的端点**(已实现但未对外可见,因未注册):
|
||
|
||
```20:41:kaopeilian-backend/app/api/v1/exam.py
|
||
router = APIRouter(prefix="/exams", tags=["考试"])
|
||
|
||
@router.post("/start")
|
||
@router.post("/submit")
|
||
@router.get("/{exam_id}")
|
||
@router.get("/records")
|
||
@router.get("/statistics/summary")
|
||
```
|
||
|
||
- **前端考试模块当前调用路径**(与后端不一致):
|
||
|
||
```151:169:kaopeilian-frontend/src/api/exam/index.ts
|
||
'/api/v1/exams/dynamic/start'
|
||
'/api/v1/exams/dynamic/submit'
|
||
'/api/v1/exams/create'
|
||
`/api/v1/exams/results/*`
|
||
`/api/v1/exams/mistakes/*`
|
||
`/api/v1/exams/recommend`
|
||
```
|
||
|
||
- **前端是否默认使用真实后端**:是。采用环境变量,默认 `USE_MOCK_DATA` 为 `false`(除非在环境中显式设置为 `true`)。
|
||
|
||
```66:69:kaopeilian-frontend/src/config/env.ts
|
||
public readonly API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:8000'
|
||
public readonly USE_MOCK_DATA = import.meta.env.VITE_USE_MOCK_DATA === 'true'
|
||
```
|
||
|
||
补充:`docker-compose.dev.yml` 为前端容器预设了 `VITE_USE_MOCK_DATA=true`,本地裸跑建议在 `.env.development` 中显式设置为 `false` 以避免混淆。
|
||
|
||
```13:18:kaopeilian-frontend/docker-compose.dev.yml
|
||
- VITE_API_BASE_URL=http://localhost:8000
|
||
- VITE_USE_MOCK_DATA=true
|
||
```
|
||
|
||
- **数据库一致性(脚本 vs 模型)**:
|
||
- `users` 表已包含软删除字段,和 ORM 现状一致。
|
||
|
||
```31:35:kaopeilian-backend/scripts/init_database_unified.sql
|
||
`is_deleted` BOOLEAN DEFAULT FALSE COMMENT '是否删除',
|
||
`deleted_at` DATETIME NULL COMMENT '删除时间',
|
||
```
|
||
|
||
- 枚举大小写不一致风险:`training_scenes.status` 定义为大写 `DRAFT/ACTIVE/INACTIVE`,初始化数据却插入小写 `active/draft`,存在执行失败或数据异常的风险,需统一。
|
||
|
||
```279:287:kaopeilian-backend/scripts/init_database_unified.sql
|
||
`status` ENUM('DRAFT', 'ACTIVE', 'INACTIVE') DEFAULT 'DRAFT'
|
||
```
|
||
|
||
```405:410:kaopeilian-backend/scripts/init_database_unified.sql
|
||
INSERT INTO training_scenes (..., status, ...) VALUES
|
||
('Python编程助手', ..., 'active', ...),
|
||
('面试模拟', ..., 'active', ...),
|
||
('项目讨论', ..., 'draft', ...);
|
||
```
|
||
|
||
- **管理员与岗位管理端点**:前端 `/api/v1/admin/*` 系列与后端 `admin.py/positions.py` 已对齐并注册,功能可联调。
|
||
|
||
---
|
||
|
||
## 完成度评估(按域)
|
||
|
||
- **鉴权与用户**:登录、鉴权中间件与受保护接口工作正常;个人信息页已对接 `GET/PUT /api/v1/users/me`。完成度:高。
|
||
- **课程中心**:课程列表/详情可联调;课程考试设置、岗位分配已具备 API。完成度:高。
|
||
- **陪练模块**:场景/会话/消息/报告模型与 API 存在;需最少 1 条 `ACTIVE` 场景数据用于端到端验证。完成度:中高。
|
||
- **管理员与岗位管理**:`/api/v1/admin/*` 端点齐备,岗位成员与课程关联落库真实可查。完成度:高。
|
||
- **考试模块**:路由文件存在但未注册,前端契约与后端不一致,链路未贯通。完成度:中。
|
||
|
||
---
|
||
|
||
## 主要问题与影响
|
||
|
||
1) 考试模块未注册至 v1 聚合路由,前端请求返回 404,阻断端到端联调。
|
||
2) 前端考试契约与后端差异大(dynamic/create/results/mistakes/recommend 等端点未在后端实现),需二选一对齐。
|
||
3) 数据初始化脚本的枚举大小写与定义不一致,可能导致初始化失败或隐性数据问题。
|
||
4) 前端容器化开发时 `VITE_USE_MOCK_DATA=true` 的默认值可能引入歧义,建议统一基线为本地开发默认关闭 Mock。
|
||
5) 后端 README“已实现/待实现”章节与代码现状不一致(多模块已实现但仍列为待实现),影响对外认知与验收基准。
|
||
|
||
---
|
||
|
||
## 修复清单(按优先级)
|
||
|
||
1. 注册考试路由(必须)
|
||
- 在 `app/api/v1/__init__.py` 引入并注册:`from .exam import router as exam_router`、`api_router.include_router(exam_router, tags=["exams"])`。
|
||
2. 统一考试契约(必须)二选一:
|
||
- A) 后端补齐前端现用端点:`/exams/dynamic/*`、`/exams/create`、`/exams/results/*`、`/exams/mistakes/*`、`/exams/recommend`;或
|
||
- B) 前端改为调用后端现有端点:`/exams/start`、`/exams/submit`、`/exams/{id}`、`/exams/records`、`/exams/statistics/summary`。
|
||
3. 修正初始化脚本枚举值(必须)
|
||
- 统一为与枚举定义一致的 `ACTIVE/DRAFT/INACTIVE`,或调整枚举定义与 ORM 以匹配现有数据。
|
||
4. 固化前端环境基线(应做)
|
||
- 新增 `.env.development`:`VITE_API_BASE_URL=http://localhost:8000`、`VITE_USE_MOCK_DATA=false`;避免 `docker-compose.dev.yml` 误导。
|
||
5. 同步文档与基线(应做)
|
||
- 更新后端 `README.md` 的“已实现/待实现”与数据库说明;
|
||
- 在《规范与约定-团队基线.md》固化考试模块契约与 Mock 开关基线;
|
||
- 在《实操联调完整Todos清单.md》勾选/补充对应任务。
|
||
|
||
---
|
||
|
||
## 验证清单(修复后需全部通过)
|
||
|
||
- [ ] 登录/刷新 Token/访问受保护接口全通过;
|
||
- [ ] 课程列表/详情可加载,考试设置/岗位分配可读写;
|
||
- [ ] 至少 1 条 `ACTIVE` 训练场景,能创建/结束陪练会话并落库;
|
||
- [ ] 考试链路:`start → {id} → submit → records/summary` 全链路 2xx,数据可查;
|
||
- [ ] 管理员仪表盘/岗位管理端到端返回真实数据且结构匹配;
|
||
- [ ] 前端 Network 面板关键请求均指向 `http://localhost:8000/api/v1/*`,无 Mock 命中;
|
||
- [ ] 服务端日志无未捕获异常,错误结构统一(含 trace_id)。
|
||
|
||
---
|
||
|
||
## 预计工时
|
||
|
||
- 路由注册与基本回归:0.5 小时
|
||
- 契约统一(二选一):后端补齐端点 4-8 小时;或前端改造 2-4 小时
|
||
- 数据脚本修正与复测:0.5 小时
|
||
- 文档同步与基线更新:0.5 小时
|
||
- 合计:最快 1 天内可完成闭环(取决于契约对齐方案)
|
||
|
||
---
|
||
|
||
## 页面-接口差异清单(更新)
|
||
|
||
- 认证模块:前后端一致,已联通。
|
||
- 课程模块:前后端路径一致(`/api/v1/courses`)。
|
||
- 管理员仪表盘:前端 `/api/v1/admin/dashboard/*` ↔ 后端 `admin.py` 已提供,联调正常。
|
||
- 管理者模块(manager):前端存在大量 `/api/v1/manager/*`,后端无聚合路由;需复用 `courses/users/training/admin` 或新增 `manager` 聚合。
|
||
- 学员模块(trainee):前端存在 `/api/v1/trainee/*`,后端无聚合路由;建议以 `training/courses/exams` 拆分映射或新增。
|
||
- 考试模块:前端大量 `dynamic/create/results/mistakes/recommend`;后端现有 `start/submit/{id}/records/statistics/summary` 未注册;需对齐。
|
||
- Coze 网关:前后端一致,已联通。
|
||
|
||
---
|
||
|
||
## 本次评估结论(2025-09-22)
|
||
|
||
- 当前可界定为:核心功能开发完成度高,考试模块联调未打通。优先完成“考试路由注册 + 契约对齐 + 初始化数据修正”,即可进入回归与压测阶段。
|
||
|
||
# 考培练系统全链路联调结果汇总报告
|
||
|
||
## 执行时间
|
||
2025-09-21
|
||
|
||
## 联调环境
|
||
- 后端:Python + FastAPI + MySQL + Redis
|
||
- 前端:Vue3 + Element Plus + TypeScript
|
||
- 本地开发环境:localhost
|
||
|
||
## 联调步骤完成情况
|
||
|
||
### ✅ 已完成项目
|
||
|
||
1. **基础环境准备**
|
||
- ✅ Docker 容器启动(MySQL、Redis)
|
||
- ✅ 数据库迁移应用(Alembic)
|
||
- ✅ 视图验证(v_user_course_progress)
|
||
|
||
2. **后端服务**
|
||
- ✅ FastAPI 服务启动(端口 8000)
|
||
- ✅ 健康检查通过(/health)
|
||
- ✅ API 文档可访问(/docs)
|
||
- ✅ 登录接口测试成功(返回 JWT token)
|
||
|
||
3. **前端服务**
|
||
- ✅ Vue3 开发服务启动(端口 3001)
|
||
- ✅ 页面正常加载
|
||
- ✅ 路由导航正常
|
||
- ✅ UI 渲染正常
|
||
|
||
4. **问题修复**
|
||
- ✅ 修复 users 表缺少软删除字段问题
|
||
- ✅ 创建并应用数据库迁移
|
||
|
||
## 发现的问题
|
||
|
||
### 🔴 主要问题
|
||
|
||
1. **前后端未实际对接**
|
||
- 前端默认使用模拟数据(`USE_MOCK_DATA = true`)
|
||
- 未发现实际的后端 API 调用
|
||
- 前端数据全部来自本地 mock 文件
|
||
|
||
2. **环境配置问题**
|
||
- 前端缺少 `.env.development` 文件
|
||
- 模拟数据开关在代码中硬编码
|
||
|
||
### 🟡 次要问题
|
||
|
||
1. **数据库架构不一致**
|
||
- SQLAlchemy 模型包含软删除字段(is_deleted、deleted_at)
|
||
- 初始化 SQL 脚本中 users 表缺少这些字段
|
||
- 需要同步更新文档
|
||
|
||
## 后续建议
|
||
|
||
### 立即需要处理
|
||
|
||
1. **关闭前端模拟数据**
|
||
```typescript
|
||
// src/config/env.ts
|
||
public readonly USE_MOCK_DATA = false // 改为 false
|
||
```
|
||
|
||
2. **创建前端环境配置文件**
|
||
- 创建 `.env.development` 文件
|
||
- 配置正确的后端 API 地址
|
||
|
||
3. **更新数据库初始化脚本**
|
||
- 在 `init_database_unified.sql` 中为 users 表添加软删除字段
|
||
- 更新 `数据库架构-统一版.md` 文档
|
||
|
||
### 验证清单
|
||
|
||
完成上述修改后,需要验证:
|
||
|
||
1. [ ] 前端登录页面调用真实后端 API
|
||
2. [ ] 课程列表从后端获取数据
|
||
3. [ ] 陪练功能与后端正常交互
|
||
4. [ ] 考试功能与后端正常交互
|
||
5. [ ] 用户权限控制正常工作
|
||
|
||
## 系统完成度评估
|
||
|
||
### 后端完成度:90%
|
||
- ✅ 所有 API 接口已实现
|
||
- ✅ 数据库结构完整
|
||
- ✅ 认证授权机制完善
|
||
- ⚠️ 需要补充更多集成测试
|
||
|
||
### 前端完成度:95%
|
||
- ✅ 所有页面已实现
|
||
- ✅ UI/UX 设计完整
|
||
- ✅ 路由和权限控制完善
|
||
- ❌ 未与真实后端对接
|
||
|
||
### 整体集成度:60%
|
||
- ✅ 开发环境可运行
|
||
- ✅ 基础设施完备
|
||
- ❌ 前后端未实际集成
|
||
- ⚠️ 需要端到端测试
|
||
|
||
## 下一步行动计划
|
||
|
||
1. **修改前端配置关闭模拟数据**(优先级:高)
|
||
2. **进行真实的前后端联调测试**(优先级:高)
|
||
3. **更新数据库文档保持一致性**(优先级:中)
|
||
4. **编写端到端测试用例**(优先级:中)
|
||
5. **性能测试和优化**(优先级:低)
|
||
|
||
## 预计完成时间
|
||
|
||
- 关闭模拟数据并重新测试:1小时
|
||
- 完整的端到端测试:2-3小时
|
||
- 文档更新:30分钟
|
||
- 总计:约4小时可完成全部集成工作
|
||
|
||
|
||
---
|
||
|
||
## 本次评估结论(2025-09-21)
|
||
|
||
### 核心检查结果
|
||
- 后端已注册路由:`/api/v1/auth`、`/api/v1/courses`、`/api/v1/users`、`/api/v1/training`、`/api/v1/admin`、`/api/v1/coze`;`/api/v1/exams` 路由文件存在但尚未注册至 v1 聚合路由。
|
||
- 前端请求封装使用 `env.API_BASE_URL`(默认 `http://localhost:8000`),`VITE_USE_MOCK_DATA` 未设置时按默认值关闭 Mock;`/src/api/mock/*` 文件存在但不影响真实请求。
|
||
- 前端考试模块大量使用 `/api/v1/exams/dynamic/*`、`/api/v1/exams/create`、`/api/v1/exams/results/*`、`/api/v1/exams/mistakes/*` 等端点,后端当前未提供这些接口;后端现有考试接口为:`/api/v1/exams/start`、`/api/v1/exams/submit`、`/api/v1/exams/{exam_id}`、`/api/v1/exams/records`、`/api/v1/exams/statistics/summary`(但未注册)。
|
||
|
||
### 发现的问题(本次)
|
||
1) 考试模块联调阻断:后端未注册考试路由;前端与后端在考试领域的 API 契约不一致(命名与路径差异大)。
|
||
2) 训练模块可用性依赖数据:需要至少一个 ACTIVE 场景以完成端到端验证。
|
||
3) 文档一致性:后端 README “已实现/待实现”与代码现状有出入(鉴权、课程、用户、管理员模块已实现)。
|
||
|
||
### 完成度评估(覆盖本次复核)
|
||
- 后端完成度:80%
|
||
- 已实现:鉴权、课程、用户、陪练、管理员、Coze 网关
|
||
- 待完善:考试路由注册与契约统一;补充动态考试/错题等接口或调整前端调用
|
||
- 前端完成度:90%
|
||
- 页面与导航完整、请求封装与环境管理完善,默认使用真实后端
|
||
- 待完善:考试模块接口对齐后端现状
|
||
- 联调完成度:65%
|
||
- 管理台、鉴权、课程与陪练接口路径一致性较好
|
||
- 考试模块尚未端到端贯通
|
||
|
||
### 下一步行动(建议按优先级执行)
|
||
1. 在 `app/api/v1/__init__.py` 注册考试路由:`api_router.include_router(exam_router, tags=["exams"])`,并按需统一前缀。
|
||
2. 双向对齐考试契约:二选一
|
||
- A) 后端补齐前端现用端点(dynamic/create/results/mistakes/recommend);或
|
||
- B) 前端改为调用后端现有端点(start/submit/{id}/records/statistics/summary)。
|
||
3. 准备训练与考试最小化数据:新增 1 个 ACTIVE 场景、1 套课程与试题,形成可演示链路。
|
||
4. 更新后端 README 的“已实现/待实现”章节,保持与代码一致。
|
||
|
||
### 研判结论
|
||
- 当前可视为“核心功能开发基本完成,考试模块联调未打通”。完成行动 1-3 后,预计半天可达成端到端闭环并进入回归与压测阶段。
|
||
|
||
### 页面-接口对接差异清单(新增 2025-09-21)
|
||
- 认证模块:
|
||
- 前端:`/api/v1/auth/login|logout|refresh|me`;后端:已提供 `/api/v1/auth/*` 与 `/api/v1/users/me`,对接正常。
|
||
- 课程模块:
|
||
- 前端:`GET /api/v1/courses`、`GET /api/v1/courses/{id}`;后端:`courses.py` 已提供,路径一致。
|
||
- 管理员仪表盘:
|
||
- 前端:`/api/v1/admin/dashboard/*`;后端:`admin.py` 已提供 `stats/user-growth/course-completion`,对接正常。
|
||
- 管理者模块(manager):
|
||
- 前端存在大量 `/api/v1/manager/*` 请求;后端未发现 `prefix="/manager"` 的路由模块,需新增或前端改为复用现有 `courses`/`users` 等接口。
|
||
- 学员模块(trainee):
|
||
- 前端存在 `/api/v1/trainee/*` 请求(成长路径、练习、记录等);后端当前无 `prefix="/trainee"` 路由,需要以 `training`、`courses` 等现有模块拆分映射或新增 `trainee` 聚合路由。
|
||
- 考试模块:
|
||
- 前端:`/api/v1/exams/dynamic/*`、`/api/v1/exams/create`、`/api/v1/exams/results/*`、`/api/v1/exams/mistakes/*`、`/api/v1/exams/recommend`;
|
||
- 后端:提供 `start/submit/{id}/records/statistics/summary` 于 `exam.py` 但未注册到 v1;其余端点尚未实现。
|
||
- Coze 网关:
|
||
- 前端:`/api/v1/course-chat/*`、`/api/v1/training/sessions/*`、`/api/v1/chat/messages`、`/api/v1/sessions/{id}/messages`;
|
||
- 后端:`coze_gateway.py` 已提供对应端点,路径一致。
|
||
|
||
建议修复顺序:
|
||
1) 注册 `exam_router` 并最小化打通 `start/submit/{id}` 与 `records`。
|
||
2) 明确 `manager` 与 `trainee` 的接口归属:新增对应路由模块,或将前端改为调用现有 `courses/users/training` 的 REST 端点。
|
||
3) 出一版“考试模块契约对齐表”,决定前端改造或后端补齐的清单与里程碑。
|