文章目录
-
-
- 1. 系统业务需求分析{#business-requirements}
-
- 1.1 核心用户角色与诉求{#user-roles}
- 1.2 核心业务需求明细{#core-business-requirements}
- 1.3 业务约束与规则{#business-constraints}
- 1.4 非功能需求规范{#non-functional-requirements}
- 2. 系统整体架构设计{#system-architecture}
-
- 2.1 技术栈选型{#tech-stack-selection}
- 2.2 分层架构设计{#layered-architecture}
- 2.3 核心功能模块划分{#core-module-division}
- 3. 核心功能模块详细设计{#core-module-design}
-
- 3.1 课程管理模块{#course-management-module}
- 3.2 学生选课模块{#course-selection-module}
- 3.3 成绩管理模块{#grade-management-module}
- 3.4 用户与权限模块{#user-permission-module}
- 3.5 统计分析模块{#statistical-analysis-module}
- 4. 数据库设计(核心表结构){#database-design}
- 5. 核心功能代码实现示例{#code-implementation}
- 6. 系统优化与部署建议{#optimization-deployment}
-
- 6.1 性能优化要点
- 6.2 部署建议
-
1. 系统业务需求分析{#business-requirements}
业务需求基于高校教学管理流程,围绕“选课-授课-成绩-统计”全链路展开,明确各角色核心诉求与业务规则,确保系统适配实际教学场景。
1.1 核心用户角色与诉求{#user-roles}
系统面向三类核心用户,角色诉求差异显著,需针对性设计功能模块:
| 学生 | 浏览课程列表、筛选心仪课程、提交选课申请、查看选课结果、退选/改选课程、查询成绩、查看个人选课记录 | 选课周期内课程报名、选课结果确认、成绩查询 |
| 教师 | 发布课程信息、审核学生选课申请、管理选课学生名单、录入/修改学生成绩、查看课程教学统计数据 | 课程信息维护、学生选课审核、成绩录入与提交 |
| 教务管理员 | 管控选课周期、审核课程信息、处理选课异常、管理用户权限、统计教学数据、导出报表 | 选课流程管控、课程与用户信息审核、教学数据统计 |
1.2 核心业务需求明细{#core-business-requirements}
按业务流程分为五大类需求,覆盖教学管理全链路:
课程管理需求:
-
教师可发布课程信息,含课程名称、学分、学时、先行课程、选课容量、课程介绍等核心字段,支持课程信息修改与上下架。
-
教务管理员审核教师发布的课程,确保课程信息合规,可强制下架违规课程。
-
支持课程分类管理(如必修课、选修课、专业核心课),便于学生筛选。
选课管理需求:
-
学生可按课程名称、教师、分类、学分筛选课程,提交选课申请,查看申请审核进度。
-
系统自动检测选课冲突(时间冲突、先行课程未修、超出选课学分上限),拦截无效申请。
-
支持选课周期内退选/改选操作,退选后释放课程容量,供其他学生选课。
-
教师可审核学生选课申请(部分课程需资格审核),控制选课人数不超过课程容量。
成绩管理需求:
-
教师可录入学生课程成绩,支持成绩修改、提交确认,提交后不可随意修改(需管理员授权)。
-
学生可查询个人已修课程成绩,查看成绩排名(可选匿名排名)。
-
教务管理员可查看所有课程成绩分布,处理成绩录入异常,导出成绩报表。
用户与权限需求:
-
管理员维护用户信息(学生、教师账号),支持批量导入、密码重置、账号禁用。
-
基于RBAC模型分配权限,确保学生仅能操作个人选课与成绩查询,教师仅能管理本人课程。
统计分析需求:
-
生成课程选课率、学生学分完成情况、成绩分布等统计数据,支持Excel导出。
-
为教务部门提供教学决策支持,如热门课程分析、教师教学负荷统计。
1.3 业务约束与规则{#business-constraints}
结合高校学分制管理特点,明确核心业务约束,确保选课流程合规:
-
学分约束:学生每学期选课学分需在规定范围(如15-25学分)内,超出范围无法提交选课申请。
-
先行课程约束:需修完先行课程且成绩合格,方可选修后续课程(如修完“数据结构”才能选修“数据库原理”)。
-
时间冲突约束:两门课程上课时间重叠时,系统自动拦截选课申请,提示学生调整。
-
容量约束:课程选课人数达到设定容量后,自动关闭选课通道,支持设置候补名额。
-
选课周期约束:仅在教务部门设定的选课周期内开放选课/退选功能,逾期无法操作。
1.4 非功能需求规范{#non-functional-requirements}
保障系统在教学场景下的稳定性、安全性与易用性:
-
性能需求:选课高峰期(如开学初)支持500+并发用户,课程查询响应时间≤500ms,选课申请处理时间≤1s;支持万级学生与千级课程数据存储。
-
安全性需求:用户密码采用MD5+盐值加密存储,成绩数据加密传输;操作日志保留至少90天,支持审计追溯;防止SQL注入、XSS攻击等安全风险。
-
稳定性需求:系统全年可用率≥99.5%,选课高峰期无宕机;数据实时备份,故障恢复时间≤30分钟,确保选课数据不丢失。
-
易用性需求:界面导航清晰,学生3分钟内可完成选课申请,教师可快速录入成绩;支持多终端适配(PC端为主,移动端为辅)。
2. 系统整体架构设计{#system-architecture}
采用“分层架构+模块化设计”思路,实现功能解耦与扩展灵活,适配高校教学管理业务的迭代需求。
2.1 技术栈选型{#tech-stack-selection}
选用成熟开源技术栈,兼顾开发效率、稳定性与维护成本,适配中小型高校场景:
| 后端开发 | Spring Boot 2.5.x + MyBatis-Plus | 开发效率高,支持复杂SQL操作与事务管理,适配多角色权限管控 |
| 前端开发 | Vue 2.x + Element UI + ECharts | 组件化开发,界面美观,适配管理端报表与用户端操作界面,图表展示能力强 |
| 数据库 | MySQL 5.7 + Redis | 开源稳定,支持多表关联;Redis缓存高频查询数据(课程列表、选课状态),提升响应速度 |
| 部署方式 | Docker容器化 + Tomcat 8.5 | 环境一致性强,部署简单,支持快速扩容,避免版本兼容问题 |
2.2 分层架构设计{#layered-architecture}
采用四层架构,层间低耦合、高内聚,便于开发维护与功能扩展:
表现层:用户交互入口,含学生端、教师端、管理员端界面,负责请求接收与结果展示,适配多终端操作习惯。
接口层:封装RESTful API,包含权限校验拦截器、异常处理器、请求参数校验器,负责请求分发与安全管控。
业务层:核心逻辑处理层,封装各模块业务服务(课程管理、选课管理、成绩管理等),实现业务规则校验与流程调度,是系统核心能力载体。
数据层:负责数据持久化与缓存,含MySQL数据库(存储用户、课程、选课记录等核心数据)、Redis缓存(高频查询数据),支持数据备份与恢复。
2.3 核心功能模块划分{#core-module-division}
按业务功能拆分五大核心模块,明确模块职责与关联关系,确保业务闭环:
-
课程管理模块:核心职责为课程信息发布、审核、维护与分类,是选课业务的基础数据支撑模块。
-
学生选课模块:核心职责为选课申请、退选/改选、冲突检测、选课结果展示,是系统核心业务流转模块。
-
成绩管理模块:核心职责为成绩录入、修改、提交、查询与统计,衔接选课与教学评价流程。
-
用户与权限模块:核心职责为用户信息维护、角色权限分配、账号管理,保障系统数据安全。
-
统计分析模块:核心职责为教学数据统计、报表生成与可视化展示,为教务决策提供支持。
3. 核心功能模块详细设计{#core-module-design}
明确各模块的业务逻辑、操作流程与关键约束,确保开发落地性与业务适配性。
3.1 课程管理模块{#course-management-module}
核心职责:实现课程全生命周期管理,从教师发布到管理员审核,同步维护课程基础信息与约束规则。
关键功能:
-
课程发布:教师填写课程信息,上传课程大纲,设置选课容量、先行课程、学分、上课时间等参数,提交审核。
-
课程审核:管理员校验课程信息完整性与合规性,审核通过则课程上线可被选课,驳回则反馈修改意见。
-
课程维护:教师可修改未开始选课的课程信息,管理员可强制下架违规课程,同步更新课程状态。
-
课程分类:支持按院系、课程类型(必修/选修)、学分区间分类,便于学生快速筛选。
3.2 学生选课模块{#course-selection-module}
核心职责:处理学生选课全流程,管控业务约束,确保选课流程合规有序。
关键功能与逻辑:
-
课程筛选:学生按课程名称、教师、分类、学分筛选课程,查看课程详情(容量、剩余名额、上课时间)。
-
选课申请:学生提交选课申请,系统自动执行三重校验:① 学分是否超出学期上限;② 是否存在时间冲突;③ 先行课程是否修完且合格。校验通过则生成申请记录,等待教师审核(无需审核的课程直接确认选课)。
-
退选/改选:选课周期内,学生可退选已选课程,释放课程容量;改选课程时,先退选原课程再选新课程,避免容量浪费。
-
选课结果展示:学生查看已选课程列表、上课时间、教师信息,确认选课最终结果。
-
候补选课:课程满员时,学生可加入候补队列,有人退选时按候补顺序自动补选并通知学生。
3.3 成绩管理模块{#grade-management-module}
核心职责:实现成绩录入、提交、查询与统计,保障成绩数据准确可追溯。
关键功能:
-
成绩录入:教师按课程查看选课学生名单,录入学生成绩(支持百分制、五级制),支持批量导入成绩。
-
成绩提交与修改:教师录入完成后提交成绩,提交后成绩不可修改;如需修改,需向管理员申请授权。
-
成绩查询:学生查看个人已修课程成绩、学分获取情况,支持按学期筛选;教师查看本人课程成绩分布。
-
成绩统计:管理员生成成绩报表(平均分、及格率、成绩分布),支持按课程、院系、年级统计,Excel导出。
3.4 用户与权限模块{#user-permission-module}
核心职责:维护用户信息完整性,管控角色权限,保障系统数据安全。
关键功能:
-
用户管理:管理员批量导入/新增学生、教师账号,重置用户密码,禁用违规账号;用户可修改个人联系方式、密码。
-
角色权限:基于RBAC模型,设置学生、教师、管理员三类角色,分配对应功能权限(如学生无课程审核权限,教师无用户管理权限)。
-
信息校验:用户账号与学号/工号绑定,确保唯一;录入学生信息时校验学号格式,教师信息校验工号与资质。
3.5 统计分析模块{#statistical-analysis-module}
核心职责:整合教学数据,生成可视化报表,为教务管理决策提供支持。
关键功能:
-
选课数据统计:统计各课程选课率、满课率、候补人数,分析热门课程与冷门课程。
-
学分统计:统计学生个人学分完成情况、各年级/院系学分达标率,预警未达标学生。
-
教学负荷统计:统计教师授课门数、学生人数,平衡教师教学任务。
-
报表可视化:用ECharts绘制柱状图、折线图、饼图,直观展示统计数据,支持报表导出。
4. 数据库设计(核心表结构){#database-design}
设计核心数据表,确保数据关联清晰、存储规范,优化查询性能,适配MySQL 5.7:
学生表(student):存储学生基础信息 CREATE TABLE student ( sno CHAR(10) PRIMARY KEY COMMENT '学号', sname NVARCHAR(50) NOT NULL COMMENT '姓名', ssex CHAR(2) NOT NULL DEFAULT '男' CHECK (ssex IN ('男','女')) COMMENT '性别', sdept NVARCHAR(100) NOT NULL COMMENT '所在院系', sage INT CHECK (sage > 0) COMMENT '年龄', stel CHAR(13) COMMENT '联系电话', password VARCHAR(100) NOT NULL COMMENT '加密密码(MD5+盐值)', total_credit INT DEFAULT 0 COMMENT '已修总学分', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) COMMENT '学生表'; CREATE INDEX idx_student_sname ON student (sname);
课程表(course):存储课程基础信息 CREATE TABLE course ( cno CHAR(10) PRIMARY KEY COMMENT '课程编号', cname NVARCHAR(100) NOT NULL COMMENT '课程名称', ccredit INT NOT NULL CHECK (ccredit > 0) COMMENT '学分', cpno CHAR(10) COMMENT '先行课程编号', teacher_id CHAR(10) NOT NULL COMMENT '授课教师工号', capacity INT NOT NULL COMMENT '选课容量', remaining INT NOT NULL COMMENT '剩余名额', course_type NVARCHAR(20) NOT NULL COMMENT '课程类型(必修/选修)', class_time NVARCHAR(200) NOT NULL COMMENT '上课时间', course_status TINYINT NOT NULL DEFAULT 0 COMMENT '课程状态:0-待审核,1-已上线,2-已下架', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', FOREIGN KEY (cpno) REFERENCES course(cno) ON DELETE SET NULL, FOREIGN KEY (teacher_id) REFERENCES teacher(tno) ON DELETE RESTRICT ) COMMENT '课程表'; CREATE INDEX idx_course_cname ON course (cname);
选课表(sc):存储选课与成绩信息 CREATE TABLE sc ( sno CHAR(10) NOT NULL COMMENT '学号', cno CHAR(10) NOT NULL COMMENT '课程编号', select_status TINYINT NOT NULL DEFAULT 0 COMMENT '选课状态:0-待审核,1-已通过,2-已驳回,3-已退选', grade INT CHECK (grade BETWEEN 0 AND 100) COMMENT '成绩', select_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '选课时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno) ON DELETE CASCADE, FOREIGN KEY (cno) REFERENCES course(cno) ON DELETE CASCADE ) COMMENT '选课表'; CREATE INDEX idx_sc_sno ON sc (sno); CREATE INDEX idx_sc_cno ON sc (cno);
教师表(teacher):存储教师基础信息 CREATE TABLE teacher ( tno CHAR(10) PRIMARY KEY COMMENT '教师工号', tname NVARCHAR(50) NOT NULL COMMENT '姓名', tdept NVARCHAR(100) NOT NULL COMMENT '所在院系', ttitle NVARCHAR(50) COMMENT '职称', ttel CHAR(13) COMMENT '联系电话', password VARCHAR(100) NOT NULL COMMENT '加密密码(MD5+盐值)', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) COMMENT '教师表'; CREATE INDEX idx_teacher_tname ON teacher (tname);
5. 核心功能代码实现示例{#code-implementation}
基于Spring Boot实现选课申请与冲突检测核心逻辑,代码规范且可复用:
选课冲突检测与申请处理: ` @Service @Transactional(rollbackFor = Exception.class) public class CourseSelectionService {
@Autowired private ScMapper scMapper; @Autowired private CourseMapper courseMapper; @Autowired private StudentMapper studentMapper;
/**
-
学生提交选课申请
-
@param sno 学号
-
@param cno 课程编号
-
@return 选课结果 */ public ResultVO submitSelection(String sno, String cno) { // 1. 校验课程状态与剩余名额 Course course = courseMapper.selectById(cno); if (course == null || course.getCourseStatus() != 1) { throw new BusinessException(“课程不存在或未上线”); } if (course.getRemaining() < 1) { // 加入候补队列,此处简化处理 return ResultVO.success(“课程已满,已加入候补队列”); }
// 2. 校验学生学分是否超出上限 Student student = studentMapper.selectById(sno); QueryWrapper creditQuery = new QueryWrapper<>(); creditQuery.eq(“sno”, sno) .eq(“select_status”, 1); List selectedCourses = scMapper.selectList(creditQuery); int selectedCredit = selectedCourses.stream() .mapToInt(sc -> courseMapper.selectById(sc.getCno()).getCcredit()) .sum(); if (selectedCredit + course.getCcredit() > 25) { throw new BusinessException(“选课学分超出学期上限(25学分)”); }
// 3. 检测时间冲突 String targetClassTime = course.getClassTime(); boolean timeConflict = selectedCourses.stream() .anyMatch(sc -> { Course selectedCourse = courseMapper.selectById(sc.getCno()); return isTimeConflict(targetClassTime, selectedCourse.getClassTime()); }); if (timeConflict) { throw new BusinessException(“所选课程与已选课程时间冲突”); }
// 4. 检测先行课程约束 String cpno = course.getCpno(); if (cpno != null) { QueryWrapper preCourseQuery = new QueryWrapper<>(); preCourseQuery.eq(“sno”, sno) .eq(“cno”, cpno) .ge(“grade”, 60); if (scMapper.selectCount(preCourseQuery) == 0) { throw new BusinessException(“未修完先行课程《” + courseMapper.selectById(cpno).getCname() + “》或成绩不合格”); } }
// 5. 提交选课申请(无需审核的课程直接设置为已通过) Sc sc = new Sc(); sc.setSno(sno); sc.setCno(cno); sc.setSelectStatus(1); // 1-已通过(如需审核设为0-待审核) sc.setSelectTime(LocalDateTime.now()); scMapper.insert(sc);
// 6. 更新课程剩余名额 course.setRemaining(course.getRemaining() – 1); courseMapper.updateById(course);
return ResultVO.success(“选课申请提交成功”); }
/**
- 时间冲突检测(简化逻辑,实际需解析具体上课时间)
- @param time1 目标课程时间
- @param time2 已选课程时间
- @return 是否冲突 */ private boolean isTimeConflict(String time1, String time2) { // 示例:如"周一第1-2节"与"周一第1-2节"判定为冲突 return time1.equals(time2); } }`
成绩录入功能实现: ` @Service public class GradeService {
@Autowired private ScMapper scMapper; @Autowired private CourseMapper courseMapper;
/**
-
教师录入学生成绩
-
@param teacherId 教师工号
-
@param cno 课程编号
-
@param gradeList 成绩列表(学号-成绩)
-
@return 录入结果 */ public ResultVO inputGrade(String teacherId, String cno, List gradeList) { // 校验教师是否有权限录入该课程成绩 Course course = courseMapper.selectById(cno); if (!course.getTeacherId().equals(teacherId)) { throw new BusinessException(“无权限录入该课程成绩”); }
// 批量录入成绩 for (GradeDTO dto : gradeList) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(“sno”, dto.getSno()) .eq(“cno”, cno) .eq(“select_status”, 1); Sc sc = scMapper.selectOne(queryWrapper); if (sc == null) { throw new BusinessException(“学号” + dto.getSno() + “未选该课程,无法录入成绩”); } // 成绩范围校验 if (dto.getGrade() < 0 || dto.getGrade() > 100) { throw new BusinessException(“学号” + dto.getSno() + “成绩超出范围(0-100)”); } sc.setGrade(dto.getGrade()); scMapper.updateById(sc); }
return ResultVO.success(“成绩录入成功”); }
// 成绩DTO @Data public static class GradeDTO { private String sno; // 学号 private Integer grade; // 成绩 } }`
6. 系统优化与部署建议{#optimization-deployment}
6.1 性能优化要点
-
缓存优化:将课程列表、选课状态等高频查询数据存入Redis,设置10分钟缓存有效期,减轻数据库压力。
-
并发控制:选课高峰期采用Redis分布式锁,防止同一课程同时被多名学生选课导致超容。
-
查询优化:为核心表字段建立索引(如选课表的学号、课程编号组合索引),优化多表关联查询效率。
-
批量处理:支持成绩批量导入、用户批量新增,减少数据库交互次数。
6.2 部署建议
-
小型高校(≤5000学生):采用单机部署,Docker容器化打包系统,MySQL与Redis部署在同一服务器,成本低、维护简单。
-
中型高校(5000-20000学生):采用服务器集群部署,Web服务与数据库分离,Redis缓存集群部署,提升并发处理能力。
-
安全部署:配置HTTPS加密传输,数据库定期自动备份,服务器开启防火墙,限制访问IP,保障数据安全。



