# 学生选课管理系统设计说明 ## 1. 项目概述 学生选课管理系统基于 RuoYi-Vue 3.9.0 脚手架进行扩展,实现高校学生选课的全流程数字化管理。系统延续现有的前后端分离架构、RBAC 权限体系与代码生成能力,新增选课业务所需的数据库表、菜单权限、角色配置以及前端路由。设计目标是在保持框架简洁可维护的前提下,覆盖学生选课的核心业务流程(学期规划 → 开课计划 → 学生选课 → 成绩登记)。 ## 2. 业务目标与角色 ### 2.1 业务目标 - **统一管理学期与开课信息**:教务部门集中维护课程、班级、选课窗口,避免信息孤岛。 - **提升选课效率与体验**:为学生提供实时选课、冲突校验、容量提示等能力。 - **保障教学执行与质量**:教师可查看班级名单、录入成绩,辅导员掌握学生选课动态。 - **沉淀数据支持决策**:选课结果与统计数据为培养方案调整提供依据。 ### 2.2 角色及职责 | 角色 | 权限标识 | 数据范围 | 核心职责 | |------|----------|----------|----------| | 教务管理员 | `edu_admin` | 全部数据 | 维护基础档案、发布学期与开课计划、处理选课异常 | | 教师角色 | `teacher` | 个人关联数据 | 查看授课课程、管理课内学生名单、录入成绩 | | 学生角色 | `student` | 个人数据 | 浏览可选课程、提交选课/退课、查看个人课表与成绩 | | 辅导员 | `counselor` | 本部门及以下 | 审核学生选课情况、协助处理退补选 | > 权限与菜单配置对应 `student/edu_auth_init.sql`,沿用 RuoYi RBAC 模型。 ## 3. 功能规划 ### 3.1 模块划分 | 模块 | 子功能 | 描述 | |------|--------|------| | 基础信息 | 学生档案、教师档案、课程信息、教室管理 | 维护选课所需的基础主数据,支持导入/导出 | | 学期与开课 | 学期设置、开课计划、节次安排 | 规划选课时间窗口、生成开课班级、配置教室与节次 | | 选课服务 | 选课中心、选课校验、退课申请 | 学生在线选课、冲突与容量校验、退课与锁定控制 | | 教学执行 | 班级名单、选课结果、成绩登记 | 教师/辅导员查看选课名单,教师录入成绩并导出 | | 统计分析 | 选课统计、课程热度 | 选课数据可视化,为教务决策提供支撑(后续扩展) | ### 3.2 用例流程(概述) 1. **基础档案维护**:教务管理员导入学生、教师、课程、教室数据 → 自动关联 RuoYi 用户信息。 2. **学期发布**:设置学期、选课起止时间,发布后开放选课入口。 3. **开课计划**:为课程创建班级,指定教师、教室、节次与人数上限,发布后进入可选状态。 4. **在线选课**:学生在选课中心搜索课程 → 系统校验时间冲突/容量 → 选课成功写入选课记录。 5. **退课与调剂**:学生或教务发起退课 → 更新选课记录、回收名额;特殊场景由教务管理员手动调整。 6. **成绩登记**:课程结课后教师录入成绩 → 学生查看个人成绩 → 教务导出成绩归档。 ## 4. 系统架构设计 ### 4.1 整体架构 ``` ┌───────────────────────────────────────────────────┐ │ 前端(ruoyi-ui 扩展模块) │ │ Vue2 + ElementUI + Vuex + Axios │ │ ├─ education/student ├─ education/course │ │ ├─ education/semester ├─ education/courseClass │ │ ├─ education/enroll └─ education/grade │ └───────────────────────────────────────────────────┘ ⇅ JSON/REST ┌───────────────────────────────────────────────────┐ │ 后端(ruoyi-admin 扩展) │ │ Spring Boot 2.5 + MyBatis + Spring Security + JWT │ │ ├─ controller.education.* │ │ ├─ service.education.* │ │ └─ mapper.education.* │ └───────────────────────────────────────────────────┘ ⇅ ┌───────────────────────────────────────────────────┐ │ 数据层:MySQL + Redis + Druid │ │ ├─ 新增业务表:edu_* │ │ ├─ 字典扩展:edu_*_status 等 │ │ └─ 权限拓展:sys_role/menu/menu_role │ └───────────────────────────────────────────────────┘ ``` ### 4.2 模块对照 | 层次 | 扩展点 | 说明 | |------|--------|------| | 前端 | `src/views/education/*` | 新增菜单对应页面组件,沿用 RuoYi CRUD 页面范式 | | 后端 Controller | `com.ruoyi.web.controller.education` | 新增 REST 接口,合并安全注解与数据范围控制 | | Service | `com.ruoyi.education.service` | 实现业务逻辑、选课冲突校验、容量控制 | | Mapper | `com.ruoyi.education.mapper` | 定义 SQL 映射,命名规范沿用表前缀 `Edu*Mapper` | | 安全 | `@PreAuthorize` + 数据范围切面 | 新增权限标识以 `education:*` 开头,复用 DataScope | ### 4.3 接口设计原则 - **RESTful 风格**:列表 `GET`、新增 `POST`、修改 `PUT`、删除 `DELETE`。 - **统一响应**:沿用 `AjaxResult` 与 `TableDataInfo`。 - **参数校验**:`@Validated` + 自定义业务校验(如容量、时间冲突)。 - **幂等控制**:选课提交接口使用 Redis 分布式锁避免重复提交。 ## 5. 数据库设计 详见 `student/edu_schema.sql`,以下为关键表摘要: | 表名 | 说明 | 关键字段 | |------|------|----------| | `edu_semester` | 学期与选课窗口 | `status`(0草稿/1进行中/2归档)、`enroll_*_time` | | `edu_student` | 学生档案 | 关联 `sys_user.user_id`,学籍状态 `status` | | `edu_teacher` | 教师档案 | 关联 `sys_user.user_id`、职称 `title` | | `edu_classroom` | 教室信息 | `room_type` 字典(理论/实验/多媒体) | | `edu_course` | 课程基础信息 | 课程类型 `course_type`(必修/选修/公选) | | `edu_course_class` | 开课计划 | `capacity`、`enrolled_count`、`status`、`teacher_id` | | `edu_course_schedule` | 节次安排 | `weekday`、`period_start/end`、`weeks` | | `edu_enrollment` | 学生选课记录 | `status`(已选/已退)、`score`、`eval_status` | ### 5.1 关系说明 - `edu_student.user_id`、`edu_teacher.user_id` 与 `sys_user` 一一对应。 - `edu_course_class` 关联 `edu_course`、`edu_semester`、`edu_teacher`、`edu_classroom`。 - `edu_course_schedule` 与 `edu_course_class` 为一对多关系。 - `edu_enrollment` 与 `edu_course_class`、`edu_student` 为多对一关系,复合唯一键 `(class_id, student_id)` 防重复选课。 ### 5.2 字典与状态 `edu_schema.sql` 已新增字典类型/数据(ID 11-17),用于驱动前端下拉选择与状态高亮,包括:学期状态、开课状态、课程类型、学籍状态、教师状态、选课记录状态、教室类型。 ## 6. 权限与菜单设计 - 新增根菜单 `选课管理`(menuId=2000),子菜单对应业务模块。 - 权限命名统一为 `education:<资源>:<操作>`,确保与 RuoYi 命名空间隔离。 - 新角色:教务管理员、教师、学生、辅导员;脚本位于 `student/edu_auth_init.sql`。 - 通过 `sys_role_menu` 赋权,其中超级管理员与教务管理员拥有全量菜单,教师与学生仅拥有面向自身的菜单与按钮权限。 ## 7. 实施路径 | 阶段 | 目标 | 主要工作 | |------|------|----------| | 准备阶段 | 环境与规划 | 初始化数据库、导入 SQL、配置角色菜单、确认账号策略 | | 开发阶段 | 功能实现 | 按模块迭代后端接口与前端页面,补充单元测试与 API 文档 | | 联调阶段 | 集成与验证 | 进行选课冲突、容量、权限、性能等专项测试,准备演示数据 | | 上线阶段 | 发布与推广 | 数据初始化(导入学生/课程)、配置选课窗口、发布公告 | | 运营阶段 | 监控与优化 | 监控日志与性能指标、迭代统计分析、收集用户反馈 | ## 8. 风险与控制 | 风险 | 影响 | 应对措施 | |------|------|----------| | 选课高并发导致锁冲突 | 影响提交体验 | Redis 分布式锁 + 容量缓存、对选课接口限流 | | 数据一致性 | 产生错误名单 | 关键操作启用事务与行级锁,容量使用原子更新 | | 角色权限配置遗漏 | 造成越权或缺权 | SQL 初始化脚本自动赋权,发布前回归权限用例 | | 课程冲突判定复杂 | 学生无法选课 | 统一冲突算法(节次 + 教室 + 时间),服务层复用 | ## 9. 交付物清单 | 文件 | 说明 | |------|------| | `student/edu_schema.sql` | 业务表结构、字典数据脚本 | | `student/edu_auth_init.sql` | 菜单、角色、权限初始化脚本 | | `student/学生选课管理系统设计说明.md` | 本设计文档 | 执行顺序建议:先运行 `ry_20250522.sql` 初始化基础库 → 执行 `edu_schema.sql` → 执行 `edu_auth_init.sql`。 ## 10. 后续扩展建议 - 接入代码生成器模板,快速生成 CRUD 页面与后端骨架。 - 引入课表视图(周历展示),提升学生端体验。 - 增加选课统计图表(选课热度、容量利用率)。 - 与消息中心联动,发送选课结果、退课提醒。 - 结合流程引擎(如 Flowable)支撑特殊申请审批。 --- 如需进一步协助实现接口、前端页面或测试方案,可在现有设计基础上继续细化任务。