新增学生选课管理系统相关文档和脚本

- 新增数据库表结构脚本:edu_schema.sql,定义教育模块数据表
- 新增权限初始化脚本:edu_auth_init.sql,配置模块权限和菜单
- 新增系统设计文档:学生选课管理系统设计说明.md,详细说明系统架构和功能
- 完善项目文档结构,便于开发和维护
This commit is contained in:
Leo 2025-09-28 21:50:17 +08:00
parent df30b17846
commit d9203524ab
3 changed files with 519 additions and 0 deletions

133
student/edu_auth_init.sql Normal file
View File

@ -0,0 +1,133 @@
-- ------------------------------------------------------------
-- 学生选课管理系统 - 角色、菜单与权限初始化脚本
-- 依赖基础库RuoYi-Vue 3.9.0ry_20250522.sql
-- ------------------------------------------------------------
-- 1. 菜单目录与页面
INSERT INTO sys_menu VALUES('2000', '选课管理', '0', '5', 'education', NULL, '', '', 1, 0, 'M', '0', '0', '', 'education', 'admin', SYSDATE(), '', NULL, '学生选课管理根目录');
INSERT INTO sys_menu VALUES('2001', '学生档案', '2000', '1', 'student', 'education/student/index', '', 'EducationStudent', 1, 0, 'C', '0', '0', 'education:student:list', 'peoples', 'admin', SYSDATE(), '', NULL, '学生档案管理');
INSERT INTO sys_menu VALUES('2002', '教师档案', '2000', '2', 'teacher', 'education/teacher/index', '', 'EducationTeacher', 1, 0, 'C', '0', '0', 'education:teacher:list', 'user', 'admin', SYSDATE(), '', NULL, '教师档案管理');
INSERT INTO sys_menu VALUES('2003', '课程信息', '2000', '3', 'course', 'education/course/index', '', 'EducationCourse', 1, 0, 'C', '0', '0', 'education:course:list', 'education', 'admin', SYSDATE(), '', NULL, '课程基础信息');
INSERT INTO sys_menu VALUES('2004', '学期设置', '2000', '4', 'semester', 'education/semester/index', '', 'EducationSemester', 1, 0, 'C', '0', '0', 'education:semester:list', 'calendar', 'admin', SYSDATE(), '', NULL, '学期与选课窗口');
INSERT INTO sys_menu VALUES('2005', '开课计划', '2000', '5', 'courseClass', 'education/courseClass/index', '', 'EducationCourseClass', 1, 0, 'C', '0', '0', 'education:courseClass:list', 'schedule', 'admin', SYSDATE(), '', NULL, '开课及排课管理');
INSERT INTO sys_menu VALUES('2006', '选课中心', '2000', '6', 'center', 'education/enroll/center', '', 'EducationCenter', 1, 0, 'C', '0', '0', 'education:center:list', 'shopping-cart', 'admin', SYSDATE(), '', NULL, '学生在线选课门户');
INSERT INTO sys_menu VALUES('2007', '选课结果', '2000', '7', 'result', 'education/enroll/result', '', 'EducationResult', 1, 0, 'C', '0', '0', 'education:enroll:list', 'list', 'admin', SYSDATE(), '', NULL, '选课结果统计');
INSERT INTO sys_menu VALUES('2008', '成绩登记', '2000', '8', 'grade', 'education/grade/index', '', 'EducationGrade', 1, 0, 'C', '0', '0', 'education:grade:list', 'edit', 'admin', SYSDATE(), '', NULL, '教师成绩录入');
-- 2. 按钮权限
-- 学生档案
INSERT INTO sys_menu VALUES('2101', '学生查询', '2001', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:student:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2102', '学生新增', '2001', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:student:add', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2103', '学生修改', '2001', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:student:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2104', '学生删除', '2001', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:student:remove', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2105', '学生导出', '2001', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:student:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 教师档案
INSERT INTO sys_menu VALUES('2111', '教师查询', '2002', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:teacher:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2112', '教师新增', '2002', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:teacher:add', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2113', '教师修改', '2002', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:teacher:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2114', '教师删除', '2002', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:teacher:remove', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2115', '教师导出', '2002', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:teacher:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 课程信息
INSERT INTO sys_menu VALUES('2121', '课程查询', '2003', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:course:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2122', '课程新增', '2003', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:course:add', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2123', '课程修改', '2003', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:course:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2124', '课程删除', '2003', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:course:remove', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2125', '课程导出', '2003', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:course:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 学期设置
INSERT INTO sys_menu VALUES('2131', '学期查询', '2004', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:semester:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2132', '学期新增', '2004', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:semester:add', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2133', '学期修改', '2004', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:semester:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2134', '学期删除', '2004', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:semester:remove', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2135', '学期发布', '2004', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:semester:publish', '#', 'admin', SYSDATE(), '', NULL, '');
-- 开课计划
INSERT INTO sys_menu VALUES('2141', '计划查询', '2005', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2142', '计划新增', '2005', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:add', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2143', '计划修改', '2005', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2144', '计划删除', '2005', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:remove', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2145', '计划发布', '2005', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:publish', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2146', '容量调整', '2005', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:capacity', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2147', '计划导出', '2005', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'education:courseClass:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 选课中心
INSERT INTO sys_menu VALUES('2151', '课程检索', '2006', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:center:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2152', '选课提交', '2006', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:center:select', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2153', '退课申请', '2006', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:center:drop', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2154', '选课锁定', '2006', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:center:lock', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2155', '选课导出', '2006', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'education:center:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 选课结果
INSERT INTO sys_menu VALUES('2156', '结果查询', '2007', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:enroll:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2157', '结果导出', '2007', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:enroll:export', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2158', '手动调整', '2007', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:enroll:adjust', '#', 'admin', SYSDATE(), '', NULL, '');
-- 成绩登记
INSERT INTO sys_menu VALUES('2161', '成绩查询', '2008', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'education:grade:query', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2162', '成绩录入', '2008', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'education:grade:edit', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2163', '成绩导入', '2008', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'education:grade:import', '#', 'admin', SYSDATE(), '', NULL, '');
INSERT INTO sys_menu VALUES('2164', '成绩导出', '2008', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'education:grade:export', '#', 'admin', SYSDATE(), '', NULL, '');
-- 3. 角色定义
INSERT INTO sys_role VALUES('3', '教务管理员', 'edu_admin', 3, '1', 1, 1, '0', '0', 'admin', SYSDATE(), '', NULL, '负责整体选课业务');
INSERT INTO sys_role VALUES('4', '教师角色', 'teacher', 4, '5', 1, 1, '0', '0', 'admin', SYSDATE(), '', NULL, '授课老师使用');
INSERT INTO sys_role VALUES('5', '学生角色', 'student', 5, '5', 1, 1, '0', '0', 'admin', SYSDATE(), '', NULL, '学生选课登录');
INSERT INTO sys_role VALUES('6', '辅导员', 'counselor', 6, '4', 1, 1, '0', '0', 'admin', SYSDATE(), '', NULL, '学生事务辅导员');
-- 4. 角色与部门(示例绑定)
INSERT INTO sys_role_dept VALUES('3', '100');
INSERT INTO sys_role_dept VALUES('4', '103');
INSERT INTO sys_role_dept VALUES('5', '103');
INSERT INTO sys_role_dept VALUES('6', '103');
-- 5. 角色菜单授权
-- 超级管理员追加新菜单
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, menu_id FROM sys_menu WHERE menu_id BETWEEN 2000 AND 2164
ON DUPLICATE KEY UPDATE menu_id = VALUES(menu_id);
-- 教务管理员拥有全部选课功能
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 3, menu_id FROM sys_menu WHERE menu_id BETWEEN 2000 AND 2164
ON DUPLICATE KEY UPDATE menu_id = VALUES(menu_id);
-- 教师角色
INSERT INTO sys_role_menu VALUES ('4', '2000');
INSERT INTO sys_role_menu VALUES ('4', '2003');
INSERT INTO sys_role_menu VALUES ('4', '2004');
INSERT INTO sys_role_menu VALUES ('4', '2005');
INSERT INTO sys_role_menu VALUES ('4', '2007');
INSERT INTO sys_role_menu VALUES ('4', '2008');
INSERT INTO sys_role_menu VALUES ('4', '2121');
INSERT INTO sys_role_menu VALUES ('4', '2131');
INSERT INTO sys_role_menu VALUES ('4', '2141');
INSERT INTO sys_role_menu VALUES ('4', '2147');
INSERT INTO sys_role_menu VALUES ('4', '2156');
INSERT INTO sys_role_menu VALUES ('4', '2157');
INSERT INTO sys_role_menu VALUES ('4', '2161');
INSERT INTO sys_role_menu VALUES ('4', '2162');
INSERT INTO sys_role_menu VALUES ('4', '2164');
-- 学生角色
INSERT INTO sys_role_menu VALUES ('5', '2000');
INSERT INTO sys_role_menu VALUES ('5', '2006');
INSERT INTO sys_role_menu VALUES ('5', '2007');
INSERT INTO sys_role_menu VALUES ('5', '2151');
INSERT INTO sys_role_menu VALUES ('5', '2152');
INSERT INTO sys_role_menu VALUES ('5', '2153');
INSERT INTO sys_role_menu VALUES ('5', '2156');
-- 辅导员角色
INSERT INTO sys_role_menu VALUES ('6', '2000');
INSERT INTO sys_role_menu VALUES ('6', '2001');
INSERT INTO sys_role_menu VALUES ('6', '2006');
INSERT INTO sys_role_menu VALUES ('6', '2007');
INSERT INTO sys_role_menu VALUES ('6', '2101');
INSERT INTO sys_role_menu VALUES ('6', '2103');
INSERT INTO sys_role_menu VALUES ('6', '2105');
INSERT INTO sys_role_menu VALUES ('6', '2151');
INSERT INTO sys_role_menu VALUES ('6', '2156');
INSERT INTO sys_role_menu VALUES ('6', '2157');

220
student/edu_schema.sql Normal file
View File

@ -0,0 +1,220 @@
-- ------------------------------------------------------------
-- 学生选课管理系统 - 业务数据结构初始化脚本
-- 依赖基础库RuoYi-Vue 3.9.0ry_20250522.sql
-- ------------------------------------------------------------
-- 1. 学期信息表
DROP TABLE IF EXISTS edu_semester;
CREATE TABLE edu_semester (
semester_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学期ID',
semester_code VARCHAR(20) NOT NULL COMMENT '学期编码,例如 2024-2025-1',
semester_name VARCHAR(50) NOT NULL COMMENT '学期名称',
start_date DATE NOT NULL COMMENT '教学开始日期',
end_date DATE NOT NULL COMMENT '教学结束日期',
enroll_start_time DATETIME NOT NULL COMMENT '统一选课开始时间',
enroll_end_time DATETIME NOT NULL COMMENT '统一选课结束时间',
status CHAR(1) DEFAULT '0' COMMENT '状态0草稿 1进行中 2已归档',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (semester_id),
UNIQUE KEY uk_semester_code (semester_code)
) ENGINE=InnoDB COMMENT='学期信息表';
-- 2. 学生档案表
DROP TABLE IF EXISTS edu_student;
CREATE TABLE edu_student (
student_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学生ID',
user_id BIGINT(20) NOT NULL COMMENT '关联系统用户ID',
student_no VARCHAR(30) NOT NULL COMMENT '学号',
real_name VARCHAR(50) NOT NULL COMMENT '姓名',
gender CHAR(1) DEFAULT '0' COMMENT '性别0男 1女 2未知',
dept_id BIGINT(20) DEFAULT NULL COMMENT '院系部门ID关联sys_dept',
major VARCHAR(100) DEFAULT NULL COMMENT '专业名称',
grade VARCHAR(20) DEFAULT NULL COMMENT '年级例如2022',
class_name VARCHAR(50) DEFAULT NULL COMMENT '行政班',
enroll_year VARCHAR(10) DEFAULT NULL COMMENT '入学年份',
contact_phone VARCHAR(20) DEFAULT NULL COMMENT '联系方式',
contact_email VARCHAR(50) DEFAULT NULL COMMENT '联系邮箱',
status CHAR(1) DEFAULT '0' COMMENT '学籍状态0在籍 1休学 2退学',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (student_id),
UNIQUE KEY uk_student_no (student_no),
UNIQUE KEY uk_student_user (user_id)
) ENGINE=InnoDB COMMENT='学生档案表';
-- 3. 教师档案表
DROP TABLE IF EXISTS edu_teacher;
CREATE TABLE edu_teacher (
teacher_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '教师ID',
user_id BIGINT(20) NOT NULL COMMENT '关联系统用户ID',
teacher_no VARCHAR(30) NOT NULL COMMENT '工号',
real_name VARCHAR(50) NOT NULL COMMENT '姓名',
gender CHAR(1) DEFAULT '0' COMMENT '性别0男 1女 2未知',
dept_id BIGINT(20) DEFAULT NULL COMMENT '所属院系关联sys_dept',
title VARCHAR(50) DEFAULT NULL COMMENT '职称',
contact_phone VARCHAR(20) DEFAULT NULL COMMENT '联系方式',
contact_email VARCHAR(50) DEFAULT NULL COMMENT '联系邮箱',
entry_date DATE DEFAULT NULL COMMENT '入职日期',
status CHAR(1) DEFAULT '0' COMMENT '任职状态0在职 1离职 2停职',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (teacher_id),
UNIQUE KEY uk_teacher_no (teacher_no),
UNIQUE KEY uk_teacher_user (user_id)
) ENGINE=InnoDB COMMENT='教师档案表';
-- 4. 教室信息表
DROP TABLE IF EXISTS edu_classroom;
CREATE TABLE edu_classroom (
classroom_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '教室ID',
building VARCHAR(100) DEFAULT '' COMMENT '楼宇',
room_no VARCHAR(30) NOT NULL COMMENT '教室编号',
capacity INT(6) DEFAULT 0 COMMENT '容量',
room_type VARCHAR(20) DEFAULT 'theory' COMMENT '教室类型theory理论 lab实验 multi多媒体',
status CHAR(1) DEFAULT '0' COMMENT '状态0可用 1停用',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (classroom_id),
UNIQUE KEY uk_room (building, room_no)
) ENGINE=InnoDB COMMENT='教室信息表';
-- 5. 课程信息表
DROP TABLE IF EXISTS edu_course;
CREATE TABLE edu_course (
course_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '课程ID',
course_code VARCHAR(30) NOT NULL COMMENT '课程编码',
course_name VARCHAR(100) NOT NULL COMMENT '课程名称',
course_type VARCHAR(20) DEFAULT 'elective' COMMENT '课程类型字典edu_course_type',
credit DECIMAL(4,1) DEFAULT 0 COMMENT '学分',
total_hours INT(4) DEFAULT 0 COMMENT '总学时',
theory_hours INT(4) DEFAULT 0 COMMENT '理论学时',
practice_hours INT(4) DEFAULT 0 COMMENT '实验学时',
dept_id BIGINT(20) DEFAULT NULL COMMENT '开课院系关联sys_dept',
status CHAR(1) DEFAULT '0' COMMENT '状态0启用 1停用',
description VARCHAR(500) DEFAULT NULL COMMENT '课程简介',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (course_id),
UNIQUE KEY uk_course_code (course_code)
) ENGINE=InnoDB COMMENT='课程信息表';
-- 6. 开课计划表
DROP TABLE IF EXISTS edu_course_class;
CREATE TABLE edu_course_class (
class_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '开课ID',
course_id BIGINT(20) NOT NULL COMMENT '课程ID',
semester_id BIGINT(20) NOT NULL COMMENT '学期ID',
teacher_id BIGINT(20) NOT NULL COMMENT '授课教师ID',
class_code VARCHAR(30) NOT NULL COMMENT '班级编号',
capacity INT(4) NOT NULL DEFAULT 50 COMMENT '容量上限',
enroll_limit INT(4) DEFAULT 0 COMMENT '选课人数上限0表示同容量',
enrolled_count INT(4) DEFAULT 0 COMMENT '已选人数',
classroom_id BIGINT(20) DEFAULT NULL COMMENT '授课教室',
enroll_start_time DATETIME DEFAULT NULL COMMENT '选课开始时间',
enroll_end_time DATETIME DEFAULT NULL COMMENT '选课结束时间',
teach_start_date DATE DEFAULT NULL COMMENT '开课日期',
teach_end_date DATE DEFAULT NULL COMMENT '结课日期',
weekday VARCHAR(20) DEFAULT NULL COMMENT '上课星期描述,例如 周一',
time_slot VARCHAR(50) DEFAULT NULL COMMENT '上课节次描述,例如 第1-2节',
status CHAR(1) DEFAULT '0' COMMENT '状态0待发布 1可选课 2已满额 3已结课',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (class_id),
UNIQUE KEY uk_class_code (class_code),
KEY idx_class_course (course_id),
KEY idx_class_semester (semester_id),
KEY idx_class_teacher (teacher_id)
) ENGINE=InnoDB COMMENT='开课计划表';
-- 7. 节次安排表
DROP TABLE IF EXISTS edu_course_schedule;
CREATE TABLE edu_course_schedule (
schedule_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '节次ID',
class_id BIGINT(20) NOT NULL COMMENT '开课ID',
weekday TINYINT(2) NOT NULL COMMENT '周几1-7',
period_start TINYINT(2) NOT NULL COMMENT '开始节次',
period_end TINYINT(2) NOT NULL COMMENT '结束节次',
weeks VARCHAR(100) DEFAULT NULL COMMENT '上课周次,例如 1-16',
classroom_id BIGINT(20) DEFAULT NULL COMMENT '教室ID',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (schedule_id),
KEY idx_schedule_class (class_id)
) ENGINE=InnoDB COMMENT='开课节次安排表';
-- 8. 选课记录表
DROP TABLE IF EXISTS edu_enrollment;
CREATE TABLE edu_enrollment (
enrollment_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '选课记录ID',
class_id BIGINT(20) NOT NULL COMMENT '开课ID',
student_id BIGINT(20) NOT NULL COMMENT '学生ID',
select_time DATETIME NOT NULL COMMENT '选课时间',
status CHAR(1) DEFAULT '0' COMMENT '记录状态0已选 1已退',
drop_time DATETIME DEFAULT NULL COMMENT '退课时间',
score DECIMAL(5,2) DEFAULT NULL COMMENT '课程成绩',
eval_status CHAR(1) DEFAULT '0' COMMENT '评价状态0未评 1已评',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_by VARCHAR(64) DEFAULT '' COMMENT '创建者',
create_time DATETIME COMMENT '创建时间',
update_by VARCHAR(64) DEFAULT '' COMMENT '更新者',
update_time DATETIME COMMENT '更新时间',
PRIMARY KEY (enrollment_id),
UNIQUE KEY uk_enrollment (class_id, student_id),
KEY idx_enroll_student (student_id),
KEY idx_enroll_status (status)
) ENGINE=InnoDB COMMENT='选课记录表';
-- 9. 字典类型扩展
INSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark) VALUES
(11, '学期状态', 'edu_semester_status', '0', 'admin', SYSDATE(), '学期状态字典'),
(12, '课程类型', 'edu_course_type', '0', 'admin', SYSDATE(), '课程类型字典'),
(13, '开课状态', 'edu_course_class_status', '0', 'admin', SYSDATE(), '开课计划状态字典'),
(14, '学籍状态', 'edu_student_status', '0', 'admin', SYSDATE(), '学生状态字典'),
(15, '教师状态', 'edu_teacher_status', '0', 'admin', SYSDATE(), '教师状态字典'),
(16, '选课记录状态', 'edu_enrollment_status', '0', 'admin', SYSDATE(), '选课记录状态字典'),
(17, '教室类型', 'edu_classroom_type', '0', 'admin', SYSDATE(), '教室类型字典');
-- 10. 字典数据扩展
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) VALUES
(30, 1, '草稿', '0', 'edu_semester_status', 'Y', '0', 'admin', SYSDATE(), '未发布'),
(31, 2, '进行中', '1', 'edu_semester_status', 'N', '0', 'admin', SYSDATE(), '当前学期'),
(32, 3, '已归档', '2', 'edu_semester_status', 'N', '0', 'admin', SYSDATE(), '历史学期'),
(33, 1, '必修课', 'required', 'edu_course_type', 'Y', '0', 'admin', SYSDATE(), ''),
(34, 2, '选修课', 'elective', 'edu_course_type', 'N', '0', 'admin', SYSDATE(), ''),
(35, 3, '公选课', 'public', 'edu_course_type', 'N', '0', 'admin', SYSDATE(), ''),
(36, 1, '待发布', '0', 'edu_course_class_status', 'Y', '0', 'admin', SYSDATE(), ''),
(37, 2, '可选课', '1', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
(38, 3, '已满额', '2', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
(39, 4, '已结课', '3', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
(40, 1, '在籍', '0', 'edu_student_status', 'Y', '0', 'admin', SYSDATE(), ''),
(41, 2, '休学', '1', 'edu_student_status', 'N', '0', 'admin', SYSDATE(), ''),
(42, 3, '退学', '2', 'edu_student_status', 'N', '0', 'admin', SYSDATE(), ''),
(43, 1, '在职', '0', 'edu_teacher_status', 'Y', '0', 'admin', SYSDATE(), ''),
(44, 2, '离职', '1', 'edu_teacher_status', 'N', '0', 'admin', SYSDATE(), ''),
(45, 3, '停职', '2', 'edu_teacher_status', 'N', '0', 'admin', SYSDATE(), ''),
(46, 1, '已选', '0', 'edu_enrollment_status', 'Y', '0', 'admin', SYSDATE(), ''),
(47, 2, '已退', '1', 'edu_enrollment_status', 'N', '0', 'admin', SYSDATE(), ''),
(48, 1, '理论课', 'theory', 'edu_classroom_type', 'Y', '0', 'admin', SYSDATE(), ''),
(49, 2, '实验室', 'lab', 'edu_classroom_type', 'N', '0', 'admin', SYSDATE(), ''),
(50, 3, '多媒体', 'multi', 'edu_classroom_type', 'N', '0', 'admin', SYSDATE(), '');

View File

@ -0,0 +1,166 @@
# 学生选课管理系统设计说明
## 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支撑特殊申请审批。
---
如需进一步协助实现接口、前端页面或测试方案,可在现有设计基础上继续细化任务。