# 学生选课系统 **Repository Path**: PXY2333/StudentSelectClass ## Basic Information - **Project Name**: 学生选课系统 - **Description**: 学生选课系统是一款基于Java技术栈开发的Web应用,用于高校学生信息管理和课程选课服务。系统采用Spring Boot框架,支持多角色权限管理,提供完整的班级管理、学生管理、课程管理和选课管理功能。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-12-12 - **Last Updated**: 2026-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 学生选课系统 (Student Course Selection System) ## 项目简介 学生选课系统是一款基于Java技术栈开发的Web应用,用于高校学生信息管理和课程选课服务。系统采用Spring Boot框架,支持多角色权限管理,提供完整的班级管理、学生管理、课程管理和选课管理功能。 ## 技术栈 | 技术组件 | 版本 | 用途 | | :----------- | :---- | :----------- | | Spring Boot | 3.5.8 | 应用框架 | | Java | 17+ | 开发语言 | | MyBatis Plus | 3.5.6 | ORM框架 | | MySQL | 8.0+ | 关系型数据库 | | JSP/JSTL | 3.1 | 视图技术 | | Bootstrap | - | UI框架 | | jQuery | - | JavaScript库 | | Maven | 3.6+ | 项目构建 | ## 功能模块 ### 1. 班级管理 - 班级信息的增删改查 - 分页查询和条件筛选 - 班级人数统计 - 班级信息导入导出 ### 2. 学生管理 - 学生信息的增删改查 - 学生账户自动创建 - 多条件搜索和导出 - 与班级管理模块联动 ### 3. 课程管理 - 课程信息的增删改查 - 课程容量管理 - 课程安排管理 - 课程详情展示 ### 4. 选课管理 - 学生选课/退课 - 选课记录查询 - 课程容量自动更新 - 选课冲突检测 ### 5. 用户管理 - 多角色权限控制(管理员/学生) - 用户登录/注册/登出 - 密码重置和账户管理 ## 系统展示 ### 系统截图1 ![系统截图1](screenshots/screenshot_01.png) ### 系统截图2 ![系统截图2](screenshots/screenshot_02.png) ### 系统截图3 ![系统截图3](screenshots/screenshot_03.png) ### 系统截图4 ![系统截图4](screenshots/screenshot_04.png) ### 系统截图5 ![系统截图5](screenshots/screenshot_05.png) ### 系统截图6 ![系统截图6](screenshots/screenshot_06.png) > **说明**: > - 已嵌入screenshots目录下的系统截图 > - 测试账号:`student` / `123456`,`admin` / `123456` ## 快速开始 ### 环境要求 | 环境 | 版本要求 | 下载链接 | | :---- | :------- | :-------------------------------------------------------------------------------------------- | | JDK | 17+ | [Oracle JDK 17](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) | | MySQL | 8.0+ | [MySQL 8.0](https://dev.mysql.com/downloads/mysql/) | | Maven | 3.6+ | [Maven](https://maven.apache.org/download.cgi) | | Git | 2.0+ | [Git](https://git-scm.com/downloads) | ### 数据库配置 #### MySQL数据库部署 1. **下载并安装MySQL** - 访问MySQL官网下载页面:[MySQL 8.0 Downloads](https://dev.mysql.com/downloads/mysql/) - 根据你的操作系统选择合适的安装包(Windows/macOS/Linux) - 按照安装向导完成安装,记住设置的root用户密码 2. **启动MySQL服务** - **Windows**:在服务管理器中启动"MySQL80"服务 - **macOS**:使用系统偏好设置中的MySQL面板启动服务 - **Linux**:执行命令 `sudo systemctl start mysql` 3. **验证MySQL安装** ```bash # 登录MySQL(使用你安装时设置的密码) mysql -u root -p # 如果成功登录,会显示MySQL命令提示符 mysql> ``` #### 应用数据库配置(重要:必须修改) > **注意**:当前配置文件中使用的是开发环境的本地MySQL配置,请同事们根据自己的MySQL环境修改以下配置! 修改数据库连接配置文件 `SelectStudentClass/src/main/resources/application.properties`: ```properties # 数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/StudentClass?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC spring.datasource.username=root # 替换为你的MySQL用户名 spring.datasource.password=your_password # 替换为你的MySQL密码 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` **需要修改的配置项:** - `spring.datasource.username`:你的MySQL用户名(默认通常是root) - `spring.datasource.password`:你的MySQL用户密码(安装时设置的密码) - `spring.datasource.url`:如果MySQL服务不在本地或端口不是3306,需要相应修改 4. **首次运行说明** - 系统会在首次启动时自动创建数据库和表结构 - 初始测试数据会自动导入 - 确保MySQL用户有足够的权限创建数据库和表 5. **SQL文件位置** - **建表SQL语句**:`SelectStudentClass/src/main/resources/schema.sql` - **测试数据SQL**:`SelectStudentClass/src/main/resources/data.sql` - 这些文件会在系统启动时自动执行,无需手动运行 - 如果需要修改表结构或初始数据,可以直接编辑这些文件 #### 建表SQL语句内容 (schema.sql) ```sql -- 创建班级信息表 CREATE TABLE IF NOT EXISTS class_info ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '班级ID', class_name VARCHAR(50) NOT NULL COMMENT '班级名称', major VARCHAR(100) NOT NULL COMMENT '专业', head_teacher VARCHAR(20) NOT NULL COMMENT '班主任', class_size INT DEFAULT 0 COMMENT '班级人数', classroom VARCHAR(255) COMMENT '教室', created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级信息表'; -- 创建学生信息表 CREATE TABLE IF NOT EXISTS student ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '学生ID', student_number VARCHAR(20) NOT NULL UNIQUE COMMENT '学号', student_name VARCHAR(20) NOT NULL COMMENT '姓名', gender VARCHAR(10) NOT NULL COMMENT '性别', age INT COMMENT '年龄', email VARCHAR(100) COMMENT '邮箱', class_id BIGINT NOT NULL COMMENT '班级ID', contact VARCHAR(100) COMMENT '联系方式', created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', FOREIGN KEY (class_id) REFERENCES class_info(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表'; -- 创建课程表 CREATE TABLE IF NOT EXISTS course ( id BIGINT AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(255) NOT NULL, course_code VARCHAR(20) NOT NULL UNIQUE, teacher VARCHAR(50) NOT NULL, credits INT NOT NULL, schedule VARCHAR(255) NOT NULL, max_students INT NOT NULL, current_students INT DEFAULT 0, description TEXT COMMENT '课程描述', created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表'; -- 创建选课记录表 CREATE TABLE IF NOT EXISTS enrollment ( id BIGINT AUTO_INCREMENT PRIMARY KEY, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, enroll_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) NOT NULL, FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE, FOREIGN KEY (course_id) REFERENCES course(id) ON DELETE CASCADE, UNIQUE KEY unique_student_course (student_id, course_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='选课记录表'; -- 创建用户表 CREATE TABLE IF NOT EXISTS user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名', password VARCHAR(255) NOT NULL COMMENT '密码(已加密)', role VARCHAR(20) NOT NULL COMMENT '角色(admin/student)', student_id BIGINT COMMENT '关联的学生ID', created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; ``` #### 测试数据SQL内容 (data.sql) ```sql -- 插入班级信息数据 INSERT INTO class_info (class_name, major, head_teacher, class_size, classroom) VALUES ('计算机科学与技术1班', '计算机科学与技术', '张老师', 30, 'A101'), ('计算机科学与技术2班', '计算机科学与技术', '李老师', 28, 'A102'), ('软件工程1班', '软件工程', '王老师', 32, 'A201'), ('软件工程2班', '软件工程', '赵老师', 31, 'A202'), ('人工智能1班', '人工智能', '陈老师', 29, 'B101'), ('数据科学与大数据技术1班', '数据科学与大数据技术', '刘老师', 27, 'B201'), ('网络工程1班', '网络工程', '周老师', 33, 'C101') ON DUPLICATE KEY UPDATE class_name=VALUES(class_name), major=VALUES(major), head_teacher=VALUES(head_teacher), class_size=VALUES(class_size), classroom=VALUES(classroom); -- 插入学生信息数据 INSERT INTO student (student_number, student_name, gender, age, email, class_id, contact) VALUES ('20210001', '张三', '男', 20, 'zhangsan@example.com', 1, '13800138001'), ('20210002', '李四', '男', 20, 'lisi@example.com', 1, '13800138002'), ('20210003', '王五', '女', 19, 'wangwu@example.com', 1, '13800138003'), ('20210004', '赵六', '男', 21, 'zhaoliu@example.com', 2, '13800138004'), ('20210005', '钱七', '女', 20, 'qianqi@example.com', 2, '13800138005'), ('20210006', '孙八', '男', 19, 'sunba@example.com', 3, '13800138006'), ('20210007', '周九', '女', 20, 'zhoujiu@example.com', 3, '13800138007'), ('20210008', '吴十', '男', 21, 'wushi@example.com', 4, '13800138008'), ('20210009', '郑十一', '女', 20, 'zhengsiyi@example.com', 4, '13800138009'), ('20210010', '冯十二', '男', 19, 'fengshier@example.com', 5, '13800138010'), ('20210011', '陈十三', '女', 20, 'chenshisan@example.com', 5, '13800138011'), ('20210012', '褚十四', '男', 21, 'chushisi@example.com', 1, '13800138012'), ('20210013', '卫十五', '女', 20, 'weishiwu@example.com', 2, '13800138013'), ('20210014', '蒋十六', '男', 19, 'jiangshiliu@example.com', 3, '13800138014'), ('20210015', '沈十七', '女', 20, 'shenshiqi@example.com', 4, '13800138015'), ('20210016', '杨十八', '男', 20, 'yangshiba@example.com', 5, '13800138016'), ('20210017', '朱十九', '女', 21, 'zhushijiu@example.com', 2, '13800138017'), ('20210018', '秦二十', '男', 19, 'qinershi@example.com', 3, '13800138018'), ('20210019', '尤二十一', '女', 20, 'youershiyi@example.com', 6, '13800138019'), ('20210020', '许二十二', '男', 21, 'xuerershier@example.com', 6, '13800138020'), ('20210021', '何二十三', '女', 19, 'heershisan@example.com', 6, '13800138021'), ('20210022', '吕二十四', '男', 20, 'lvershisi@example.com', 7, '13800138022'), ('20210023', '施二十五', '女', 20, 'shiershiwu@example.com', 7, '13800138023'), ('20210024', '张二十六', '男', 21, 'zhangershiliu@example.com', 7, '13800138024') ON DUPLICATE KEY UPDATE student_name=VALUES(student_name), gender=VALUES(gender), age=VALUES(age), email=VALUES(email), class_id=VALUES(class_id), contact=VALUES(contact); -- 插入课程信息数据 INSERT INTO course (course_name, course_code, teacher, credits, schedule, max_students, current_students, description) VALUES ('高等数学', 'MATH101', '王教授', 4, '周一 08:00-09:40', 100, 45, '高等数学课程是计算机专业的基础课程,主要学习微积分、线性代数等内容。'), ('大学英语', 'ENG101', '李老师', 4, '周二 14:30-16:10', 100, 52, '大学英语课程旨在提高学生的英语听说读写能力。'), ('计算机基础', 'COMP101', '张老师', 3, '周三 08:00-09:40', 80, 72, '计算机基础课程介绍计算机的基本原理和使用方法。'), ('程序设计', 'COMP102', '赵老师', 4, '周四 14:30-17:00', 60, 58, '程序设计课程学习编程语言和编程思想。'), ('数据结构', 'COMP201', '刘老师', 4, '周五 08:00-10:30', 70, 65, '数据结构课程研究数据的组织和存储方式。'), ('操作系统', 'COMP301', '周老师', 4, '周一 14:30-17:00', 60, 55, '操作系统课程介绍计算机操作系统的原理和实现。'), ('数据库原理', 'COMP302', '吴老师', 4, '周三 14:30-17:00', 60, 52, '数据库原理课程学习数据库的设计和管理。'), ('人工智能', 'AI401', '陈老师', 3, '周二 08:00-09:40', 50, 48, '人工智能课程介绍人工智能的基本概念和应用。'), ('大数据技术', 'DATA301', '黄老师', 3, '周四 08:00-09:40', 50, 42, '大数据技术课程介绍大数据处理和分析的基本概念和技术。'), ('网络安全', 'NET301', '林老师', 4, '周五 14:30-16:10', 60, 45, '网络安全课程介绍网络安全的基本原理和防护技术。') ON DUPLICATE KEY UPDATE course_name=VALUES(course_name), teacher=VALUES(teacher), credits=VALUES(credits), schedule=VALUES(schedule), max_students=VALUES(max_students), description=VALUES(description); -- 初始化用户数据 -- 注意:密码已经使用SHA-256加密 (密码: 123456) INSERT INTO user (username, password, role) VALUES ('admin', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'admin') ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='admin'; INSERT INTO user (username, password, role, student_id) VALUES ('student', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 1) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=1; INSERT INTO user (username, password, role, student_id) VALUES ('lisi', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 2) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=2; INSERT INTO user (username, password, role, student_id) VALUES ('wangwu', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 3) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=3; INSERT INTO user (username, password, role, student_id) VALUES ('zhaoliu', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 4) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=4; INSERT INTO user (username, password, role, student_id) VALUES ('qianqi', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 5) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=5; INSERT INTO user (username, password, role, student_id) VALUES ('sunba', 'jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', 'student', 6) ON DUPLICATE KEY UPDATE password='jZae727K08KaOmKSgOaGzww/XVqGr/PKEgIMkjrcbJI=', role='student', student_id=6; -- 插入选课记录 INSERT INTO enrollment (student_id, course_id, status) VALUES (1, 1, 'active'), (1, 3, 'active'), (1, 4, 'active'), (2, 1, 'active'), (2, 2, 'active'), (2, 4, 'active'), (3, 1, 'active'), (3, 3, 'active'), (3, 5, 'active'), (4, 2, 'active'), (4, 4, 'active'), (4, 5, 'active'), (5, 1, 'active'), (5, 2, 'active'), (5, 6, 'active'), (6, 3, 'active'), (6, 4, 'active'), (6, 7, 'active'), (7, 5, 'active'), (7, 6, 'active'), (7, 8, 'active'), (8, 7, 'active'), (8, 8, 'active'), (8, 9, 'active'), (9, 9, 'active'), (9, 10, 'active'), (10, 8, 'active'), (10, 10, 'active') ON DUPLICATE KEY UPDATE status=VALUES(status); ``` ### 构建项目 在 `SelectStudentClass` 目录下执行以下命令: ```bash # 清理并构建项目(跳过测试) mvn clean package -DskipTests # 构建并运行测试 mvn clean package ``` ### 运行项目 #### 方法一:Maven直接运行 ```bash mvn spring-boot:run ``` #### 方法二:Java命令运行jar包 ```bash java -jar target/SelectStudentClass-0.0.1-SNAPSHOT.jar ``` #### 方法三:IDE中运行 1. 导入项目到IDE(IntelliJ IDEA或Eclipse) 2. 找到主类 `org.example.selectstudentclass.SelectStudentClassApplication` 3. 直接运行该类 ## 使用说明 ### 访问系统 项目启动后,通过以下地址访问系统: - 登录页面:http://localhost:8080/user/login ### 测试账号 | 用户名 | 密码 | 角色 | 权限说明 | | :------ | :----- | :----- | :------------------------- | | admin | 123456 | 管理员 | 可以访问所有功能和管理页面 | | student | 123456 | 学生 | 只能访问选课相关功能 | | lisi | 123456 | 学生 | 只能访问选课相关功能 | | wangwu | 123456 | 学生 | 只能访问选课相关功能 | ### 功能说明 #### 管理员功能 1. **班级管理**:查看、添加、修改、删除班级信息 2. **学生管理**:查看、添加、修改、删除学生信息 3. **课程管理**:查看、添加、修改、删除课程信息 4. **选课管理**:查看学生选课记录,管理选课流程 5. **用户管理**:管理用户账户和权限 #### 学生功能 1. **课程查询**:浏览可选课程,查看课程详情 2. **选课操作**:选择课程,查看已选课程 3. **退课操作**:退选已选课程 4. **个人信息**:查看和修改个人信息 ## 项目结构 ``` StudentSelectClass/ ├── .gitignore ├── .vscode/ ├── LICENSE ├── README.md ├── SelectStudentClass/ │ ├── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── example/ │ │ │ │ └── selectstudentclass/ │ │ │ │ ├── SelectStudentClassApplication.java # 项目主入口 │ │ │ │ ├── config/ # 配置类 │ │ │ │ ├── controller/ # 控制器 │ │ │ │ ├── entity/ # 实体类 │ │ │ │ ├── mapper/ # MyBatis映射接口 │ │ │ │ ├── service/ # 业务逻辑 │ │ │ │ └── util/ # 工具类 │ │ │ ├── resources/ │ │ │ │ ├── application.properties # 应用配置 │ │ │ │ ├── schema.sql # 数据库表结构 │ │ │ │ ├── data.sql # 初始数据 │ │ │ │ ├── mapper/ # MyBatis映射文件 │ │ │ │ ├── static/ # 静态资源 │ │ │ │ └── templates/ # 模板文件 │ │ │ └── webapp/ │ │ │ ├── WEB-INF/ │ │ │ │ └── views/ # JSP视图 │ │ │ ├── css/ # CSS样式 │ │ │ └── js/ # JavaScript文件 │ │ └── test/ # 测试代码 │ ├── pom.xml # Maven配置 │ ├── API_DOCUMENTATION.md # API文档 │ └── 快速入门.md # 详细使用说明 ├── target/ └── 需求.txt ``` ## 数据库结构 系统包含5个主要数据表: 1. **class_info** - 班级信息表 - class_id:班级ID - class_name:班级名称 - grade:年级 - department:院系 - student_count:学生人数 - create_time:创建时间 - update_time:更新时间 2. **student** - 学生信息表 - student_id:学生ID - student_name:学生姓名 - student_number:学号 - gender:性别 - class_id:班级ID - phone:手机号 - email:邮箱 - create_time:创建时间 - update_time:更新时间 3. **course** - 课程表 - course_id:课程ID - course_name:课程名称 - course_code:课程代码 - credit:学分 - teacher:授课教师 - capacity:课程容量 - current_enrollment:当前选课人数 - create_time:创建时间 - update_time:更新时间 4. **enrollment** - 选课记录表 - enrollment_id:选课记录ID - student_id:学生ID - course_id:课程ID - enrollment_time:选课时间 - create_time:创建时间 5. **user** - 用户表 - user_id:用户ID - username:用户名 - password:密码 - role:角色(admin/student) - student_id:关联学生ID - status:状态 - create_time:创建时间 - update_time:更新时间 数据库会在首次运行时自动创建,并初始化测试数据。 ## 注意事项 1. 确保MySQL服务已启动且配置正确 2. 首次运行会自动创建数据库和表结构 3. 测试账号密码均为123456,建议在生产环境修改 4. 系统支持自动数据初始化,请勿手动修改初始化SQL文件 5. 开发环境下禁用了Spring Security的完整认证,生产环境需加强安全配置 ## 联系方式 如有问题或建议,请通过以下方式联系: - 项目维护者:系统开发团队 - 项目地址:https://github.com/yourusername/StudentSelectClass