1. 系统架构设计思路
这个基于SpringBoot和Vue的教师排课学生选课系统,采用了典型的前后端分离架构。后端使用SpringBoot框架构建RESTful API,前端采用Vue.js实现用户交互界面,两者通过HTTP协议进行数据通信。
1.1 技术选型考量
选择SpringBoot作为后端框架主要基于以下考虑:
- 自动配置特性简化了Spring应用的初始搭建和开发过程
- 内嵌Tomcat服务器,无需额外部署
- 丰富的starter依赖可以快速集成常用组件
- 完善的生态和社区支持
Vue.js作为前端框架的优势在于:
- 渐进式框架,可以逐步采用
- 响应式数据绑定和组件化开发
- 轻量级且性能优秀
- 丰富的周边生态(Vuex、Vue Router等)
1.2 系统功能模块划分
系统主要分为以下几个核心模块:
- 用户管理模块:处理教师、学生和管理员的身份认证和权限控制
- 课程管理模块:课程信息的增删改查
- 排课管理模块:教师排课功能实现
- 选课管理模块:学生选课功能实现
- 课表查询模块:各类课表展示
- 系统管理模块:基础数据维护
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与实现
2.1 核心数据表结构
系统主要包含以下数据表:
- 用户表(user):存储所有用户基本信息
- 教师表(teacher):扩展存储教师特有信息
- 学生表(student):扩展存储学生特有信息
- 课程表(course):存储课程基本信息
- 教学班表(teaching_class):教师排课结果
- 选课记录表(selection_record):学生选课结果
- 教室表(classroom):教室资源信息
- 时间表(time_slot):排课时段定义
2.2 关键表关系设计
- 教师与教学班:一对多关系
- 学生与选课记录:一对多关系
- 课程与教学班:一对多关系
- 教学班与选课记录:一对多关系
- 教室与教学班:多对多关系(通过中间表实现)
注意:数据库设计时特别注意了避免排课冲突,通过唯一约束确保同一教室同一时段只能安排一个教学班。
3. 后端实现细节
3.1 SpringBoot核心配置
java复制@SpringBootApplication
@MapperScan("com.example.scheduling.mapper")
public class SchedulingApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulingApplication.class, args);
}
}
3.2 关键API设计示例
- 排课API:
java复制@RestController
@RequestMapping("/api/schedule")
public class ScheduleController {
@Autowired
private ScheduleService scheduleService;
@PostMapping
public ResponseEntity<?> createSchedule(@RequestBody ScheduleDTO dto) {
try {
return ResponseEntity.ok(scheduleService.createSchedule(dto));
} catch (ConflictException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
// 其他API方法...
}
- 选课API:
java复制@RestController
@RequestMapping("/api/selection")
public class SelectionController {
@PostMapping
public ResponseEntity<?> selectCourse(@RequestBody SelectionDTO dto) {
try {
return ResponseEntity.ok(selectionService.selectCourse(dto));
} catch (FullException e) {
return ResponseEntity.badRequest().body("该教学班已满");
}
}
// 其他API方法...
}
3.3 业务逻辑实现
排课业务逻辑主要处理以下约束:
- 教师时间冲突检查
- 教室占用冲突检查
- 课程时间合理性检查
- 特殊排课规则处理
选课业务逻辑主要处理:
- 选课时间范围验证
- 课程容量检查
- 先修课程要求验证
- 冲突课程检查
4. 前端实现细节
4.1 Vue项目结构
code复制src/
├── api/ # API请求封装
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
├── utils/ # 工具函数
├── views/ # 页面组件
│ ├── teacher/ # 教师相关页面
│ ├── student/ # 学生相关页面
│ └── admin/ # 管理员页面
└── App.vue # 根组件
4.2 关键组件实现
- 排课组件示例:
vue复制<template>
<div class="schedule-form">
<el-form :model="form" :rules="rules" ref="form">
<el-form-item label="课程" prop="courseId">
<el-select v-model="form.courseId">
<el-option
v-for="course in courses"
:key="course.id"
:label="course.name"
:value="course.id">
</el-option>
</el-select>
</el-form-item>
<!-- 其他表单字段 -->
<el-button @click="submit">提交</el-button>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
form: {
courseId: '',
// 其他字段
},
rules: {
courseId: [{ required: true, message: '请选择课程' }]
},
courses: []
}
},
methods: {
async submit() {
try {
await this.$refs.form.validate()
await this.$api.schedule.create(this.form)
this.$message.success('排课成功')
} catch (error) {
this.$message.error(error.message)
}
}
}
}
</script>
- 选课组件关键逻辑:
javascript复制async checkPrerequisites(courseId) {
const res = await this.$api.course.getPrerequisites(courseId)
const completed = await this.$api.student.getCompletedCourses()
return res.every(pre => completed.includes(pre))
}
5. 系统特色功能实现
5.1 智能排课算法
系统实现了基于约束满足问题(CSP)的排课算法,主要步骤包括:
- 定义变量:教学班、时间、教室等
- 定义约束条件:
- 教师不能同时上两门课
- 教室同一时间只能安排一个教学班
- 特定课程的特殊要求
- 使用回溯算法寻找可行解
5.2 冲突检测机制
系统实现了多层次的冲突检测:
- 前端实时冲突提示
- 后端提交时严格验证
- 数据库唯一约束保障
冲突检测主要考虑:
- 时间冲突
- 教室冲突
- 教师冲突
- 学生课程冲突
5.3 可视化课表展示
使用ECharts实现课表可视化:
- 横轴为星期
- 纵轴为节次
- 不同颜色区分不同课程
- 支持点击查看详情
6. 系统部署方案
6.1 后端部署
- 打包SpringBoot应用:
bash复制mvn clean package
- 使用Docker部署:
dockerfile复制FROM openjdk:8-jdk-alpine
COPY target/scheduling-*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
6.2 前端部署
- 构建生产环境代码:
bash复制npm run build
- Nginx配置示例:
nginx复制server {
listen 80;
server_name scheduling.example.com;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
7. 开发中的经验总结
-
前后端分离开发时,建议:
- 使用Swagger维护API文档
- 约定统一的数据格式和错误处理机制
- 建立Mock服务并行开发
-
排课算法优化经验:
- 先处理约束最多的课程
- 使用记忆化存储中间结果
- 设置合理的超时机制
-
性能优化点:
- 课表查询使用缓存
- 批量操作使用事务
- 合理设计数据库索引
-
常见问题处理:
- 跨域问题:配置CORS
- 时区问题:统一使用UTC时间
- 并发选课:使用乐观锁控制
8. 系统扩展方向
- 移动端适配:开发响应式界面或单独移动应用
- 微信小程序:提供便捷的选课入口
- 数据分析:基于选课数据进行教学分析
- 智能推荐:根据学生历史选课推荐课程
- 消息通知:选课结果、调课通知等
提示:在扩展功能时,建议采用微服务架构,将不同功能拆分为独立服务,便于维护和扩展。
