1. 项目概述
作为一名长期从事教育信息化系统开发的工程师,我最近完成了一个基于SpringBoot的舞蹈室管理系统项目。这个系统专为舞蹈培训机构设计,旨在解决传统舞蹈教室在学员管理、课程安排、教师调度等方面的手工操作痛点。
记得去年我参观本地一家舞蹈工作室时,看到前台老师还在用纸质本子记录学员报名信息,用Excel表格排课,经常出现课程冲突、学员找不到老师的情况。这让我意识到,舞蹈培训行业急需一套专业的数字化管理系统。
2. 系统架构设计
2.1 技术选型与考量
在技术选型上,我选择了以下技术栈:
- 后端:SpringBoot 2.7 + MyBatis Plus
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0
- 部署:Tomcat 9.0
选择SpringBoot主要基于以下几点考虑:
- 快速开发:自动配置和起步依赖大大减少了配置时间
- 生态丰富:有大量现成的starter可以集成常用功能
- 易于维护:约定优于配置的原则使代码结构清晰
2.2 系统模块划分
系统采用经典的三层架构,分为以下几个核心模块:
- 用户管理模块
- 教师管理模块
- 课程管理模块
- 排课管理模块
- 报名管理模块
- 通知管理模块
每个模块都遵循单一职责原则,通过RESTful API进行通信。
3. 核心功能实现
3.1 用户管理模块
用户管理采用RBAC权限模型,主要包含以下功能点:
- 用户注册/登录(使用JWT认证)
- 个人信息管理
- 密码修改
- 权限分配
关键代码示例(用户注册逻辑):
java复制@PostMapping("/register")
public Result register(@RequestBody User user) {
// 检查用户名是否已存在
if(userService.exists(user.getUsername())) {
return Result.error("用户名已存在");
}
// 密码加密
user.setPassword(passwordEncoder.encode(user.getPassword()));
// 设置默认角色
user.setRole(Role.STUDENT);
// 保存用户
userService.save(user);
return Result.success("注册成功");
}
3.2 课程管理模块
课程分为线上和线下两种类型:
线上课程特点:
- 支持视频上传和播放
- 提供课程讲解文档
- 学员可以收藏课程
线下课程特点:
- 关联具体教师
- 设置课程费用
- 需要安排教室和时间
课程状态机设计:
mermaid复制stateDiagram
[*] --> 未开始
未开始 --> 进行中: 课程开始
进行中 --> 已结束: 课程结束
未开始 --> 已取消: 取消课程
3.3 智能排课系统
排课是系统的核心难点,我们实现了以下功能:
-
冲突检测:
- 教师时间冲突
- 教室占用冲突
- 学员课程冲突
-
自动排课算法:
java复制public List<Schedule> autoArrange(List<Course> courses, List<Teacher> teachers) {
// 实现基于约束满足问题的排课算法
// 1. 收集所有约束条件
// 2. 使用回溯算法寻找可行解
// 3. 优化课程分布
}
- 课表可视化:
使用FullCalendar组件实现周视图、月视图的课表展示。
4. 数据库设计
4.1 主要表结构
用户表(users):
sql复制CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`real_name` varchar(50) DEFAULT NULL,
`gender` tinyint DEFAULT '0',
`age` int DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`role` varchar(20) DEFAULT 'STUDENT',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
课程表(courses):
sql复制CREATE TABLE `courses` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`type` enum('ONLINE','OFFLINE') NOT NULL,
`category_id` bigint DEFAULT NULL,
`teacher_id` bigint DEFAULT NULL,
`price` decimal(10,2) DEFAULT '0.00',
`description` text,
`cover_image` varchar(255) DEFAULT NULL,
`video_url` varchar(255) DEFAULT NULL,
`status` tinyint DEFAULT '0',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
KEY `idx_teacher` (`teacher_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 关键关联关系
- 用户-课程:多对多(通过报名表关联)
- 教师-课程:一对多
- 课程-课表:一对多
5. 系统部署与优化
5.1 部署方案
我们采用Docker容器化部署,主要包含以下服务:
- 前端服务:Nginx + Vue静态资源
- 后端服务:SpringBoot应用
- 数据库服务:MySQL主从
- 文件服务:MinIO对象存储
docker-compose.yml关键配置:
yaml复制version: '3'
services:
backend:
image: dance-studio-backend:latest
ports:
- "8080:8080"
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dance_studio
volumes:
- mysql_data:/var/lib/mysql
5.2 性能优化
-
缓存策略:
- 使用Redis缓存热门课程数据
- 实现二级缓存(Caffeine + Redis)
-
数据库优化:
- 添加合适的索引
- 使用读写分离
- 慢查询监控
-
前端优化:
- 组件懒加载
- 路由懒加载
- 图片压缩
6. 开发经验分享
6.1 遇到的典型问题
-
排课冲突检测:
最初只检测了教师时间冲突,忽略了教室冲突,导致实际使用时出现教室重复预订的问题。解决方案是实现多维度的冲突检测算法。 -
文件上传性能:
大视频文件上传经常超时。最终采用分片上传+断点续传的方案解决。 -
课表并发修改:
多个管理员同时修改课表导致数据不一致。通过乐观锁机制解决。
6.2 实用技巧
- SpringBoot配置技巧:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
- Vue性能优化:
javascript复制// 使用异步组件
const CourseList = () => import('./components/CourseList.vue')
// 使用keep-alive缓存组件
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
- 数据库查询优化:
java复制// 使用MyBatis Plus的LambdaQueryWrapper避免SQL注入
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.eq(User::getUsername, username)
.select(User::getId, User::getUsername, User::getPassword);
7. 系统扩展方向
-
移动端适配:
开发微信小程序版本,方便学员随时查看课表和上课。 -
智能推荐:
基于学员的选课历史和浏览行为,推荐合适的课程。 -
在线支付:
集成支付宝、微信支付,实现在线报名缴费。 -
考勤系统:
增加人脸识别签到功能,自动记录学员出勤情况。
这个项目从需求分析到最终上线历时3个月,期间遇到了不少挑战,但也积累了很多宝贵的经验。特别是在处理复杂的排课逻辑时,深刻体会到良好的系统设计的重要性。希望这个案例能为需要开发类似系统的同行提供一些参考。