# 道路救援企业培训系统 - 产品需求文档 (PRD) > 版本:V1.0.1 > 更新日期:2026-01-13 > 状态:已确认 --- ## 版本更新记录 ### V1.0.1 (2026-01-13) **【培训计划】多考试任务支持** | 变更项 | 变更前 | 变更后 | |-------|-------|-------| | 考试任务数量 | 最多关联1个考试 | 支持关联多个考试 | | 考试属性 | 无 | 支持设置必考/选考 | | 考试排序 | 无 | 支持自定义排序 | **功能说明:** - 创建/编辑培训计划时,可添加多个考试任务 - 每个考试可设置为"必考"或"选考" - 学员端展示所有关联考试及通过状态 - 列表页显示考试任务总数 **数据库变更:** - 新增 `tr_plan_exam` 关联表 - 移除 `tr_plan` 表的 `exam_id` 字段 - ⚠️ 不兼容历史数据,需重新初始化数据库 --- ### V1.0.0 (2026-01-08) - 初始版本发布 - 包含:系统基础、人员管理、知识库、考题管理、试卷管理、考试管理、培训计划六大模块 --- ## 一、核心目标 (Mission) **为道路救援企业打造一站式内部培训平台,通过知识沉淀、在线考核、培训管理三大核心能力,提升500名员工的专业技能水平和服务标准化程度。** --- ## 二、用户画像 (Persona) | 角色 | 人数估算 | 核心痛点 | 使用场景 | |------|----------|----------|----------| | **管理员** | 3-5人 | 人员管理分散,培训效果难追踪 | 配置系统、管理组织架构、分配权限 | | **讲师(技师)** | 30-50人 | 知识传承依赖口口相传,出题组卷效率低 | 上传知识文档、创建题库、发布考试 | | **学员** | 450人左右 | 学习资料分散、考试不便、进度不清晰 | 查阅知识库、完成培训任务、参加考试 | --- ## 三、版本规划 ### V1:最小可行产品 (MVP) #### 模块一:系统基础与人员管理 | 功能 | 说明 | |----------|-----------------------------| | 企业微信授权登录 | 企业微信授权登录 | | 组织架构管理 | 中心 → 部门(≤8)→ 小组(≤10/部门)三级结构 | | 员工管理 | 管理员手动录入员工信息,分配角色(管理员/讲师/学员) | | 权限控制 | 基于角色的权限隔离,数据按部门隔离 | #### 模块二:知识库(重点) | 功能 | 说明 | |------|------| | 分类目录 | 支持多级分类(如:安全规范 > 高速救援 > 操作手册)| | 文档管理 | 支持上传 PDF/Word/Excel/PPT 等常见文档格式 | | 视频管理 | 支持上传视频文件,在线播放 | | 在线预览 | 文档、视频无需下载即可在线查看 | | 状态管理 | 草稿 → 已发布 → 已下架 | | 部门隔离 | 各部门只能查看本部门的知识内容 | #### 模块三:考题管理 | 功能 | 说明 | |------|------| | 题型支持 | 单选题、多选题、判断题 | | 题目解析 | 每道题必须填写答案解析 | | 题库分类 | 按分类/章节管理题目 | | 状态管理 | 草稿 → 已发布 → 已下架 | | 部门隔离 | 讲师只能管理本部门题库 | #### 模块四:试卷管理 | 功能 | 说明 | |------|------| | 手动组卷 | 讲师手动从题库选题组成试卷 | | 自动组卷 | 设置规则(单选X题+多选Y题+判断Z题),系统随机抽题 | | 试卷配置 | 设置总分、题目分值、考试时长 | | 试卷预览 | 组卷完成后可预览试卷效果 | | 状态管理 | 草稿 → 已发布 → 已下架 | #### 模块五:考试管理 | 功能 | 说明 | |------|------| | 发布考试 | 选择试卷,设置考试名称、时间窗口(开始~结束时间)| | 指定对象 | 支持指定部门 / 小组 / 个人参加考试 | | 考试规则 | 设置及格线、限制考试次数、考试时长 | | 在线答题 | 学员在线作答,自动计时,超时自动交卷 | | 成绩查看 | 交卷后立即显示成绩和答案解析 | #### 模块六:培训计划 | 功能 | 说明 | |------|------| | 创建培训计划 | 设置计划名称、培训周期、培训目标 | | 关联知识/考试 | 一个培训计划可包含多个知识文档 + 多场考试(V1.0.1+) | | 考试属性设置 | 每个考试可设置必考/选考、自定义排序(V1.0.1+) | | 分配学员 | 指定部门/小组/个人参加培训计划 | | 进度跟踪 | 学员可查看自己的学习进度和考试状态 | | 计划状态 | 未开始 / 进行中 / 已结束 | ### V2 及以后版本 (Future Releases) | 版本 | 功能 | 价值 | |------|------|------| | **V2** | 统计报表中心 | 培训完成率、考试通过率、部门排名等数据看板 | | **V2** | 线下培训签到 | 扫码签到/签退,记录实际培训时长 | | **V2** | 错题本 | 学员自动收集错题,巩固薄弱知识点 | | **V3** | 知识库增强 | 收藏、点赞、评论、全文搜索 | | **V3** | 奖励体系 | 积分、勋章、学习排行榜 | | **V3** | 证书管理 | 培训/考试 --- ## 四、关键业务逻辑 (Business Rules) ### 4.1 权限规则 ``` 管理员: ├── 管理所有中心、部门、小组 ├── 管理所有用户(增删改查、角色分配) ├── 查看全平台数据 └── 系统配置 讲师: ├── 管理本部门知识库(上传/编辑/删除) ├── 管理本部门题库(增删改查) ├── 创建/管理本部门试卷和考试 ├── 创建/管理本部门培训计划 └── 查看本部门学员成绩 学员: ├── 查看本部门知识库(只读) ├── 参加分配给自己的培训计划 ├── 参加分配给自己的考试 └── 查看个人学习记录和成绩 ``` ### 4.2 内容状态流转 ``` ┌─────────┐ 发布 ┌─────────┐ 下架 ┌─────────┐ │ 草稿 │ ───────────▶ │ 已发布 │ ───────────▶ │ 已下架 │ │ DRAFT │ │PUBLISHED │ │ OFFLINE │ └─────────┘ └─────────┘ └─────────┘ ▲ │ │ │ │ 重新上架 │ │ ◀────────────────────────┘ │ └──────── 可继续编辑 ─────────────────────────────┘ ``` | 状态 | 说明 | 学员可见 | |------|------|----------| | **草稿 (DRAFT)** | 讲师编辑中,未完成 | ❌ 不可见 | | **已发布 (PUBLISHED)** | 正式生效,可被使用 | ✅ 可见 | | **已下架 (OFFLINE)** | 临时隐藏,保留数据 | ❌ 不可见 | ### 4.3 考试规则 | 规则 | 说明 | |------|------| | 时间窗口 | 只有在考试开放时间内才能进入考试 | | 限时作答 | 超过考试时长自动交卷 | | 限制次数 | 达到最大次数后不可再考,取最高分 | | 及格判定 | 分数 ≥ 及格线 为通过 | | 答题顺序 | 自动组卷时题目顺序随机打乱 | ### 4.4 数据隔离规则 | 数据类型 | 隔离方式 | |----------|----------| | 知识库 | 按部门隔离,只能看本部门 | | 题库 | 按部门隔离,讲师只能操作本部门 | | 试卷/考试 | 按部门隔离 | | 培训计划 | 按部门隔离 | | 员工信息 | 管理员可见全部,讲师可见本部门 | ### 4.5 引用保护规则 | 场景 | 规则 | |------|------| | 题目下架 | 已被试卷引用的题目,下架前需确认警告 | | 试卷下架 | 已被考试引用的试卷,下架前需确认警告 | | 知识下架 | 已被培训计划引用的知识,下架前需确认警告 | --- ## 五、数据契约 (Data Contract) ### 5.1 核心实体 #### 用户 (sys_user) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | wx_userid | String | 企业微信用户ID | | real_name | String | 姓名 | | phone | String | 手机号 | | role | Enum | 角色:ADMIN/LECTURER/STUDENT | | department_id | Long | 所属部门 | | group_id | Long | 所属小组(可空) | | status | Enum | 状态:ENABLED/DISABLED | | create_time | DateTime | 创建时间 | #### 组织架构 (sys_center / sys_department / sys_group) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | name | String | 名称 | | parent_id | Long | 上级ID(部门关联中心,小组关联部门) | | sort_order | Integer | 排序 | | create_time | DateTime | 创建时间 | #### 知识分类 (km_category) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | name | String | 分类名称 | | parent_id | Long | 父分类ID | | department_id | Long | 所属部门 | | sort_order | Integer | 排序 | #### 知识 (km_knowledge) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | title | String | 标题 | | category_id | Long | 所属分类 | | type | Enum | 类型:DOCUMENT/VIDEO | | file_url | String | 文件地址 | | file_size | Long | 文件大小 | | department_id | Long | 所属部门 | | status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | | creator_id | Long | 创建人 | | create_time | DateTime | 创建时间 | | publish_time | DateTime | 发布时间 | #### 题目 (ex_question) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | type | Enum | 题型:SINGLE/MULTIPLE/JUDGE | | content | String | 题干 | | options | JSON | 选项列表(判断题为空) | | answer | String | 正确答案 | | analysis | String | 解析 | | category_id | Long | 所属分类 | | department_id | Long | 所属部门 | | status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | | creator_id | Long | 创建人 | | create_time | DateTime | 创建时间 | | publish_time | DateTime | 发布时间 | #### 试卷 (ex_paper) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | title | String | 试卷名称 | | total_score | Integer | 总分 | | duration | Integer | 考试时长(分钟) | | pass_score | Integer | 及格分 | | department_id | Long | 所属部门 | | status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | | creator_id | Long | 创建人 | | create_time | DateTime | 创建时间 | | publish_time | DateTime | 发布时间 | #### 试卷题目关联 (ex_paper_question) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | paper_id | Long | 试卷ID | | question_id | Long | 题目ID | | score | Integer | 该题分值 | | sort_order | Integer | 排序 | #### 考试 (ex_exam) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | title | String | 考试名称 | | paper_id | Long | 关联试卷 | | start_time | DateTime | 开始时间 | | end_time | DateTime | 结束时间 | | max_attempts | Integer | 最大考试次数 | | department_id | Long | 所属部门 | | status | Enum | 状态:NOT_STARTED/IN_PROGRESS/ENDED | | creator_id | Long | 创建人 | | create_time | DateTime | 创建时间 | #### 考试对象 (ex_exam_target) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | exam_id | Long | 考试ID | | target_type | Enum | 对象类型:DEPARTMENT/GROUP/USER | | target_id | Long | 对象ID | #### 考试记录 (ex_exam_record) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | exam_id | Long | 考试ID | | user_id | Long | 学员ID | | attempt_no | Integer | 第几次考试 | | score | Integer | 得分 | | passed | Boolean | 是否通过 | | start_time | DateTime | 开始时间 | | submit_time | DateTime | 提交时间 | | answers | JSON | 答题详情 | #### 培训计划 (tr_plan) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | title | String | 计划名称 | | description | String | 计划描述 | | start_date | Date | 开始日期 | | end_date | Date | 结束日期 | | department_id | Long | 所属部门 | | exam_id | Long | 关联考试(可空) | | status | Enum | 状态:NOT_STARTED/IN_PROGRESS/ENDED | | creator_id | Long | 创建人 | | create_time | DateTime | 创建时间 | #### 培训计划-知识关联 (tr_plan_knowledge) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | plan_id | Long | 计划ID | | knowledge_id | Long | 知识ID | | required | Boolean | 是否必修 | | sort_order | Integer | 排序 | #### 培训计划-对象 (tr_plan_target) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | plan_id | Long | 计划ID | | target_type | Enum | 对象类型:DEPARTMENT/GROUP/USER | | target_id | Long | 对象ID | #### 培训进度 (tr_plan_progress) | 字段 | 类型 | 说明 | |------|------|------| | id | Long | 主键 | | plan_id | Long | 计划ID | | user_id | Long | 学员ID | | knowledge_id | Long | 知识ID | | completed | Boolean | 是否完成 | | complete_time | DateTime | 完成时间 | --- ## 六、原型设计(方案A - 经典管理后台风格) ### 6.1 设计理念 左侧固定导航 + 右侧内容区,层级分明,适合功能复杂的企业管理系统。学习成本低,用户容易上手。 ### 6.2 布局结构 ``` ┌────────────────────────────────────────────────────────────────────────────┐ │ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ ├──────────────────┬─────────────────────────────────────────────────────────┤ │ │ │ │ 📊 工作台 │ 内容区域 │ │ │ │ │ 👥 人员管理 ▶ │ │ │ ├ 组织架构 │ │ │ ├ 员工管理 │ │ │ └ 讲师管理 │ │ │ │ │ │ 📚 知识库 ▶ │ │ │ ├ 知识分类 │ │ │ └ 知识列表 │ │ │ │ │ │ ✏️ 考题管理 ▶ │ │ │ ├ 题库分类 │ │ │ └ 题目列表 │ │ │ │ │ │ 📄 试卷管理 │ │ │ │ │ │ 📝 考试管理 │ │ │ │ │ │ 📅 培训计划 │ │ │ │ │ │ ────────────── │ │ │ ⚙️ 系统设置 │ │ │ │ │ └──────────────────┴─────────────────────────────────────────────────────────┘ ``` ### 6.3 核心页面原型 #### 工作台首页 ``` ┌────────────────────────────────────────────────────────────────────────────┐ │ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ ├──────────────────┬─────────────────────────────────────────────────────────┤ │ │ │ │ 📊 工作台 ● │ 欢迎回来,张三 2026年1月8日 │ │ │ │ │ 👥 人员管理 ▶ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ 待学习课程 │ │ 待完成考试 │ │ 培训进度 │ │ │ 📚 知识库 ▶ │ │ │ │ │ │ │ │ │ │ │ 12 │ │ 3 │ │ 75% │ │ │ ✏️ 考题管理 ▶ │ │ │ │ │ │ ████░░ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ 📄 试卷管理 │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ 📝 考试管理 │ │ 我的培训计划 │ │ │ │ ├──────────────────────────────────────────────────┤ │ │ 📅 培训计划 │ │ 📋 2026年Q1安全规范培训 进行中 60% │ │ │ │ │ 📋 新员工入职培训 进行中 30% │ │ │ │ │ 📋 高速救援操作规范 未开始 -- │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ │ 待完成考试 │ │ │ │ ├──────────────────────────────────────────────────┤ │ │ │ │ 📝 安全规范考核 截止: 1月15日 [进入考试] │ │ │ │ │ 📝 月度技能测试 截止: 1月20日 [进入考试] │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ └──────────────────┴─────────────────────────────────────────────────────────┘ ``` #### 知识库列表页 ``` ┌────────────────────────────────────────────────────────────────────────────┐ │ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ ├──────────────────┬─────────────────────────────────────────────────────────┤ │ │ │ │ 📊 工作台 │ 知识库 > 安全规范 │ │ │ ───────────────────────────────────────────────── │ │ 👥 人员管理 ▶ │ │ │ │ [+ 新增知识] [所有状态 ▼] [🔍 搜索知识...] │ │ 📚 知识库 ▼ │ │ │ ┌ 知识分类 │ ┌────────────────────────────────────────────────┐ │ │ └ 知识列表 ● │ │ 标题 类型 状态 更新时间 操作│ │ │ │ ├────────────────────────────────────────────────┤ │ │ ✏️ 考题管理 ▶ │ │ 高速救援SOP 📄文档 已发布 01-05 编辑│ │ │ │ │ 安全操作视频 🎬视频 已发布 01-03 编辑│ │ │ 📄 试卷管理 │ │ 应急处理流程 📄文档 草稿 01-02 编辑│ │ │ │ │ 设备使用手册 📄文档 已下架 12-28 编辑│ │ │ 📝 考试管理 │ └────────────────────────────────────────────────┘ │ │ │ │ │ 📅 培训计划 │ 共 24 条记录 < 1 2 3 4 5 > │ │ │ │ └──────────────────┴─────────────────────────────────────────────────────────┘ ``` #### 在线考试页 ``` ┌────────────────────────────────────────────────────────────────────────────┐ │ 📝 2026年Q1安全规范考试 剩余时间: 45:23 │ ├────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ 第 3 题 / 共 20 题 [单选题] │ │ │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ │ │ │ │ 高速公路救援作业时,警示标志应放置在故障车辆后方多少米处? │ │ │ │ │ │ │ │ ○ A. 50米 │ │ │ │ ● B. 150米 │ │ │ │ ○ C. 200米 │ │ │ │ ○ D. 100米 │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ 答题卡: │ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ │ ✓1 ✓2 ●3 ○4 ○5 ○6 ○7 ○8 ○9 ○10 │ │ │ │ ○11 ○12 ○13 ○14 ○15 ○16 ○17 ○18 ○19 ○20 │ │ │ └────────────────────────────────────────────────────────────────────┘ │ │ │ │ [< 上一题] [下一题 >] [交卷] │ │ │ └────────────────────────────────────────────────────────────────────────────┘ ``` #### 试卷组卷页 ``` ┌────────────────────────────────────────────────────────────────────────────┐ │ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ ├──────────────────┬─────────────────────────────────────────────────────────┤ │ │ │ │ 📊 工作台 │ 创建试卷 > 第2步:选择题目 │ │ │ ═══════════════════════════════════════════════════ │ │ 👥 人员管理 ▶ │ ① 基本信息 ────── ② 选择题目 ────── ③ 预览确认 │ │ │ ● │ │ 📚 知识库 ▶ │ │ │ │ ┌─────────────────────┐ ┌────────────────────────┐ │ │ ✏️ 考题管理 ▶ │ │ 📂 题库 │ │ 📋 已选题目 (15) │ │ │ │ │ ┌─────────────────┐ │ │ │ │ │ 📄 试卷管理 ● │ │ │ [全选] 安全(48) │ │ │ 单选题 x10 30分 │ │ │ │ │ │ ☑ 高速警示... │ │ │ 多选题 x3 15分 │ │ │ 📝 考试管理 │ │ │ ☑ 夜间灯光... │ │ │ 判断题 x2 5分 │ │ │ │ │ │ ☐ 拖车规范... │ │ │ ─────────────── │ │ │ 📅 培训计划 │ │ └─────────────────┘ │ │ 总分: 50分 │ │ │ │ │ │ │ │ │ │ │ │ ── 或自动组卷 ── │ │ [自动组卷] │ │ │ │ │ 单选: [10] 题 │ │ 单选: [10] 题 │ │ │ │ │ 多选: [ 5] 题 │ │ 多选: [ 5] 题 │ │ │ │ │ 判断: [ 5] 题 │ │ 判断: [ 5] 题 │ │ │ │ │ [随机抽题] │ │ [确认随机抽取] │ │ │ │ └─────────────────────┘ └────────────────────────┘ │ │ │ │ │ │ [上一步] [下一步:预览] │ └──────────────────┴─────────────────────────────────────────────────────────┘ ``` --- ## 七、架构设计蓝图 ### 7.1 系统架构总览 ``` ┌─────────────────────────────────────────────────────────────────────────┐ │ 客户端层 │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ PC浏览器 │ │ 企业微信H5 │ │ 移动端浏览器 │ │ │ │ (管理员/讲师) │ │ (学员) │ │ (学员) │ │ │ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ └───────────┼─────────────────────┼─────────────────────┼─────────────────┘ │ │ │ └─────────────────────┼─────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 网关层 │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ Spring Boot 应用 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ JWT认证 │ │ 权限拦截 │ │ 日志记录 │ │ 异常处理 │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 业务层 │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ 认证模块 │ │ 组织模块 │ │ 知识库模块│ │ 考试模块 │ │ 培训模块 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ·企微登录 │ │ ·组织架构 │ │ ·分类管理 │ │ ·题库管理 │ │ ·计划管理 │ │ │ │ ·Token管理│ │ ·员工管理 │ │ ·知识CRUD │ │ ·试卷管理 │ │ ·任务分配 │ │ │ │ ·权限校验 │ │ ·角色管理 │ │ ·文件上传 │ │ ·考试管理 │ │ ·进度跟踪 │ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 数据层 │ │ ┌─────────────────────────┐ ┌─────────────────────────┐ │ │ │ MySQL 8.0 │ │ 文件存储服务 │ │ │ │ (MyBatis Plus ORM) │ │ (本地/OSS/MinIO) │ │ │ └─────────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ ``` ### 7.2 核心流程图 #### 用户登录流程(企业微信OAuth) ```mermaid sequenceDiagram participant U as 用户 participant FE as 前端页面 participant BE as 后端服务 participant WX as 企业微信API participant DB as 数据库 U->>FE: 点击"企业微信登录" FE->>WX: 跳转企微授权页面 WX->>U: 显示授权确认 U->>WX: 确认授权 WX->>FE: 回调返回code FE->>BE: 携带code请求登录 BE->>WX: 用code换取access_token WX-->>BE: 返回access_token BE->>WX: 获取用户信息(userid) WX-->>BE: 返回用户信息 BE->>DB: 查询用户是否存在 alt 用户存在 DB-->>BE: 返回用户信息 BE->>BE: 生成JWT Token BE-->>FE: 返回Token+用户信息 FE->>FE: 存储Token,跳转工作台 else 用户不存在 BE-->>FE: 返回错误:用户未录入 FE->>U: 提示联系管理员 end ``` #### 在线考试流程 ```mermaid sequenceDiagram participant S as 学员 participant FE as 前端页面 participant BE as 后端服务 participant DB as 数据库 S->>FE: 进入考试列表 FE->>BE: 获取我的考试列表 BE->>DB: 查询分配给该学员的考试 DB-->>BE: 返回考试列表 BE-->>FE: 返回考试列表(含剩余次数) S->>FE: 点击"开始考试" FE->>BE: 请求开始考试 BE->>DB: 校验考试状态/次数/时间窗口 alt 校验通过 BE->>DB: 创建考试记录(开始时间) BE->>DB: 获取试卷题目 DB-->>BE: 返回题目列表 BE-->>FE: 返回试卷内容+考试时长 FE->>FE: 启动倒计时 loop 答题过程 S->>FE: 选择/修改答案 FE->>FE: 本地暂存答案 FE->>BE: 定时自动保存(每30秒) BE->>DB: 更新答题记录 end alt 主动交卷 S->>FE: 点击"交卷" else 时间到 FE->>FE: 倒计时结束 end FE->>BE: 提交试卷 BE->>BE: 自动判分(客观题) BE->>DB: 保存成绩+答案详情 BE-->>FE: 返回考试成绩 FE->>S: 显示成绩+答案解析 else 校验失败 BE-->>FE: 返回错误(次数用尽/不在时间窗口) FE->>S: 提示无法参加考试 end ``` #### 培训计划执行流程 ```mermaid flowchart TB subgraph 讲师操作 A[创建培训计划] --> B[设置基本信息] B --> C[关联知识内容] C --> D[关联考试-可选] D --> E[指定培训对象] E --> F[发布培训计划] end subgraph 学员学习 F --> G[学员收到培训通知] G --> H[进入培训计划] H --> I[学习知识内容] I --> J{知识学完?} J -->|否| I J -->|是| K{有关联考试?} K -->|否| L[培训完成] K -->|是| M[参加考试] M --> N{考试通过?} N -->|是| L N -->|否| O{还有考试次数?} O -->|是| M O -->|否| P[培训未通过] end subgraph 进度追踪 I --> Q[更新学习进度] M --> R[记录考试成绩] L --> S[标记培训完成] end ``` ### 7.3 技术选型 | 层次 | 技术 | 版本 | 说明 | |------|------|------|------| | **构建** | Maven | 3.8+ | 依赖管理 | | **框架** | Spring Boot | 3.1.2 | 主框架 | | **ORM** | MyBatis Plus | 3.5.3+ | 简化CRUD | | **数据库** | MySQL | 8.0 | 主数据库 | | **认证** | java-jwt | 4.4+ | JWT Token生成验证 | | **加密** | Spring Security | 6.x | BCrypt密码加密 | | **文档** | Springdoc OpenAPI | 2.2+ | API文档 | | **工具** | Lombok | 1.18+ | 简化代码 | | **JSON** | Jackson | 内置 | JSON序列化 | | **文件** | 本地存储 / MinIO | - | V1先用本地,V2可扩展 | | **前端** | HTML + CSS + JS | - | 原生技术栈 | #### 关键依赖库 | 用途 | 库 | 说明 | |------|-----|------| | 企业微信SDK | weixin-java-cp | 企业微信Java SDK | | 文件预览 | kkFileView / OnlyOffice | 文档在线预览(可选外部服务) | | 视频播放 | video.js | 前端视频播放器 | | Excel导入导出 | EasyExcel | 阿里开源,性能好 | | 工具库 | Hutool | 常用工具集合 | ### 7.4 风险评估 | 风险点 | 等级 | 描述 | 应对策略 | |--------|------|------|----------| | **企业微信对接** | 🟡 中 | 需要企业微信管理员配置应用 | 提前准备配置文档,预留账号密码登录作为备选 | | **文件预览** | 🟡 中 | 不同格式文档预览兼容性 | V1优先支持PDF+图片+视频,复杂格式提示下载 | | **大文件上传** | 🟡 中 | 视频文件可能较大 | 限制单文件大小,支持分片上传 | | **考试并发** | 🟢 低 | 500人规模并发压力不大 | 合理设计索引,必要时加缓存 | | **数据隔离** | 🟢 低 | 部门数据隔离逻辑 | 统一在Service层实现隔离过滤 | ### 7.5 项目结构 ``` training-system/ ├── pom.xml ├── src/ │ └── main/ │ ├── java/com/sino/training/ │ │ ├── TrainingApplication.java # 启动类 │ │ │ │ │ ├── common/ # 通用模块 │ │ │ ├── config/ # 配置类 │ │ │ ├── exception/ # 异常处理 │ │ │ ├── result/ # 统一响应 │ │ │ ├── interceptor/ # 拦截器 │ │ │ └── utils/ # 工具类 │ │ │ │ │ ├── module/ # 业务模块 │ │ │ ├── auth/ # 认证模块 │ │ │ ├── system/ # 系统管理 │ │ │ ├── knowledge/ # 知识库模块 │ │ │ ├── exam/ # 考试模块 │ │ │ └── training/ # 培训模块 │ │ │ │ │ └── integration/ # 外部集成 │ │ └── wechat/ # 企业微信 │ │ │ └── resources/ │ ├── application.yml # 主配置 │ ├── application-dev.yml # 开发环境 │ ├── application-prod.yml # 生产环境 │ ├── mapper/ # MyBatis XML │ ├── static/ # 静态资源 │ └── templates/ # 页面模板 │ ├── docs/ │ └── PRD.md # 产品需求文档 │ └── sql/ └── init.sql # 数据库初始化脚本 ``` --- ## 八、附录 ### 8.1 角色菜单权限对照表 | 菜单 | 管理员 | 讲师 | 学员 | |------|--------|------|------| | 工作台 | ✅ | ✅ | ✅ | | 组织架构管理 | ✅ | ❌ | ❌ | | 员工管理 | ✅ | 👁️ 本部门只读 | ❌ | | 讲师管理 | ✅ | ❌ | ❌ | | 知识库-分类管理 | ✅ | ✅ 本部门 | ❌ | | 知识库-知识列表 | ✅ | ✅ 本部门 | 👁️ 本部门已发布 | | 考题管理-题库分类 | ✅ | ✅ 本部门 | ❌ | | 考题管理-题目列表 | ✅ | ✅ 本部门 | ❌ | | 试卷管理 | ✅ | ✅ 本部门 | ❌ | | 考试管理 | ✅ | ✅ 本部门 | 👁️ 我的考试 | | 培训计划 | ✅ | ✅ 本部门 | 👁️ 我的培训 | | 系统设置 | ✅ | ❌ | ❌ | ### 8.2 状态枚举定义 ```java // 内容状态 public enum ContentStatus { DRAFT, // 草稿 PUBLISHED, // 已发布 OFFLINE // 已下架 } // 用户角色 public enum UserRole { ADMIN, // 管理员 LECTURER, // 讲师 STUDENT // 学员 } // 用户状态 public enum UserStatus { ENABLED, // 启用 DISABLED // 禁用 } // 题目类型 public enum QuestionType { SINGLE, // 单选题 MULTIPLE, // 多选题 JUDGE // 判断题 } // 知识类型 public enum KnowledgeType { DOCUMENT, // 文档 VIDEO // 视频 } // 考试/培训目标类型 public enum TargetType { DEPARTMENT, // 部门 GROUP, // 小组 USER // 个人 } // 考试状态 public enum ExamStatus { NOT_STARTED, // 未开始 IN_PROGRESS, // 进行中 ENDED // 已结束 } // 培训计划状态 public enum PlanStatus { NOT_STARTED, // 未开始 IN_PROGRESS, // 进行中 ENDED // 已结束 } ``` --- **文档状态:已确认,等待开发启动**