SpringBoot与微信小程序构建智慧校园选课系统
1. 项目概述:基于SpringBoot与微信小程序的智慧校园选课系统
这个项目本质上是一个打通校园教务系统与学生移动端的桥梁。我们团队用SpringBoot构建后端服务,配合微信小程序前端,实现了学生随时随地进行课程查询、选课、退课等操作。相比传统PC端选课系统,这套方案解决了高峰期服务器崩溃、界面操作复杂、地理位置限制等痛点。
从技术架构来看,系统采用经典的三层架构:微信小程序作为展示层,SpringBoot处理业务逻辑,MySQL进行数据存储。特别之处在于我们针对校园场景做了深度优化——比如选课高峰期采用Redis缓存课程余量信息,使用RabbitMQ异步处理选课请求来应对并发压力。
2. 核心功能模块解析
2.1 微信小程序端功能实现
小程序端采用MINA框架开发,主要包含三大功能模块:
- 课程展示模块:
- 使用scroll-view实现课程列表无限滚动加载
- 通过wx.request调用后端API获取课程JSON数据
- 采用flex布局适配不同尺寸屏幕
// 示例:获取课程列表的JS代码 wx.request({ url: 'https://yourdomain.com/api/courses', method: 'GET', success(res) { this.setData({ courses: res.data }) } })选课操作模块:
- 实现防重复点击机制(按钮禁用+loading动画)
- 加入选课冲突检测(时间冲突、先修课检测)
- 采用微信支付接口模拟选课积分扣除
个人课表模块:
- 使用echarts-for-weixin绘制可视化课表
- 支持周视图/日视图切换
- 集成日历组件实现按日期筛选
2.2 SpringBoot后端设计
后端采用SpringBoot 2.7 + MyBatis-Plus架构,主要技术亮点:
- 分布式锁解决超选问题:
public boolean selectCourse(Long courseId, Long studentId) { String lockKey = "lock:course:" + courseId; try { // 使用Redis分布式锁 Boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { // 检查课程余量 Course course = courseMapper.selectById(courseId); if (course.getRemainSeats() > 0) { // 扣减余量 courseMapper.updateRemainSeats(courseId, -1); // 记录选课关系 studentCourseMapper.insert(new StudentCourse(studentId, courseId)); return true; } } return false; } finally { redisTemplate.delete(lockKey); } }接口安全设计:
- 采用JWT进行身份认证
- 使用Spring Security配置权限拦截
- 敏感参数进行SQL注入过滤
性能优化措施:
- 课程列表接口添加二级缓存(Redis + Caffeine)
- 使用HikariCP连接池管理数据库连接
- 启用Gzip压缩响应数据
3. 数据库设计与优化
3.1 核心表结构
| 表名 | 主要字段 | 索引设计 |
|---|---|---|
| t_course | id, name, teacher_id, max_seats, remain_seats, time_slot | 联合索引(teacher_id, time_slot) |
| t_student | id, wx_openid, name, class_id | 唯一索引(wx_openid) |
| t_student_course | id, student_id, course_id, select_time | 联合索引(student_id, course_id) |
3.2 查询优化实践
- 分页查询优化:
-- 避免使用LIMIT offset, size SELECT * FROM t_course WHERE id > #{lastId} ORDER BY id ASC LIMIT #{size}统计查询优化:
- 为选课人数统计添加物化视图
- 热点数据预计算存储
事务隔离级别选择:
- 选课操作使用REPEATABLE_READ
- 课程查询使用READ_COMMITTED
4. 部署与运维方案
4.1 服务器环境配置
我们推荐以下生产环境配置:
- 阿里云ECS 2核4G(至少)
- CentOS 7.6+
- JDK 17
- MySQL 8.0 with读写分离
- Redis 6.x集群
4.2 持续集成部署
使用Jenkins构建自动化部署流水线:
- Git Hook触发代码检查
- Maven打包并运行单元测试
- Docker镜像构建
- Kubernetes滚动更新
# 示例Dockerfile FROM openjdk:17-jdk COPY target/course-system-0.0.1.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]4.3 监控与告警
- 使用Spring Boot Admin监控应用健康状态
- 配置Prometheus + Grafana监控面板
- 关键指标告警:
- 选课接口成功率 < 99.9%
- 数据库连接数 > 80%
- 平均响应时间 > 500ms
5. 典型问题排查手册
5.1 微信小程序常见问题
真机调试白屏:
- 检查域名是否备案
- 确认TLS版本≥1.2
- 排查证书链完整性
iOS视频播放失败:
- 确保视频源支持HTTPS
- 添加referrer白名单
- 使用官方video组件替代web-view
5.2 后端性能问题
选课接口超时:
- 检查Redis连接池配置
- 优化分布式锁粒度
- 考虑本地缓存+Redis二级缓存
数据库CPU飙升:
- 分析慢查询日志
- 检查是否缺少索引
- 评估是否需要分库分表
6. 扩展功能建议
对于想进一步开发的团队,可以考虑:
智能推荐选课:
- 基于协同过滤算法
- 结合学生历史选课数据
- 集成NLP处理课程评价
课堂签到系统:
- 蓝牙信标定位
- 微信小程序扫码签到
- 防代签人脸识别
学习分析看板:
- 使用Apache Doris构建实时数仓
- 可视化学生选课偏好
- 预测课程热度趋势
这个项目我们从零开始开发到上线用了3个月时间,期间最大的收获是认识到分布式事务在选课场景中的重要性。最初没有引入Redis锁时,在模拟500并发选课测试中出现了严重的超卖问题。后来通过Redis分布式锁+数据库乐观锁的双重保障,最终在压力测试中实现了零差错。
