1. 项目概述
作为一名长期从事教育信息化系统开发的工程师,我最近完成了一个基于SpringBoot的中小学生课后服务管理系统。这个项目源于当前中小学课后服务普遍存在的管理痛点:课程安排混乱、报名流程繁琐、家校沟通不畅等问题。通过三个月的开发与迭代,我们最终交付了一套覆盖课程管理、学生报名、教师考勤、家校互动全流程的解决方案。
系统采用经典的三层架构设计,前端使用Vue.js实现响应式布局,后端基于SpringBoot+MyBatis-Plus技术栈,数据库选用MySQL 8.0。特别值得一提的是,我们在权限控制模块创新性地采用了RBAC与ABAC混合模型,既保证了角色权限的清晰划分,又能满足复杂场景下的细粒度控制需求。
2. 核心功能设计
2.1 系统架构设计
系统采用前后端分离架构,整体分为五层:
- 表现层:Vue3+Element Plus实现多端适配
- API网关层:Spring Cloud Gateway统一路由
- 业务逻辑层:SpringBoot+MyBatis-Plus
- 数据访问层:MyBatis-Plus+Redis缓存
- 数据存储层:MySQL主从集群
这种分层设计带来了三个显著优势:
- 前后端开发完全解耦,提升并行开发效率
- 各层职责明确,便于后期维护扩展
- 通过网关层统一鉴权,安全性更有保障
2.2 数据库设计要点
数据库设计遵循第三范式,核心表包括:
- 用户表(sys_user):采用垂直分表设计,将基础信息与敏感信息分离
- 课程表(service_course):包含课程状态机设计(草稿/已发布/已下线)
- 报名表(service_registration):建立学生-课程多对多关系
- 考勤表(service_attendance):每日考勤记录与统计
特别设计的索引策略:
sql复制-- 为高频查询字段创建组合索引
CREATE INDEX idx_course_status ON service_course(status, start_time);
CREATE INDEX idx_registration_user ON service_registration(user_id, course_id);
3. 关键技术实现
3.1 动态权限控制
系统采用Pinia进行状态管理,权限控制核心代码如下:
javascript复制// 路由过滤函数
export function filterRoutes(routes, roles) {
return routes.filter(route => {
if (route.meta?.roles) {
return route.meta.roles.some(role => roles.includes(role))
}
return true
})
}
实现特点:
- 前端路由动态注册,避免未授权访问
- 菜单按权限实时过滤,界面更简洁
- 路由元信息缓存,减少重复计算
3.2 高并发报名处理
针对报名高峰期的并发问题,我们采用三级防护:
- 前端防抖+按钮禁用
- 乐观锁控制:
java复制@Update("UPDATE service_course SET remain = remain-1 WHERE id=#{id} AND remain>0")
int reduceRemain(@Param("id") Long id);
- Redis分布式锁兜底
实测可支持3000+QPS的报名请求,无超卖现象。
4. 典型问题解决方案
4.1 家校消息延迟
初期采用短轮询导致服务器压力大,最终方案:
java复制// 使用SSE实现服务器推送
@GetMapping("/notifications")
public SseEmitter streamNotifications(@AuthenticationPrincipal User user) {
SseEmitter emitter = new SseEmitter(3600000L);
notificationService.addEmitter(user.getId(), emitter);
return emitter;
}
优化效果:
- 消息延迟从平均5s降至200ms内
- 服务器负载降低60%
4.2 复杂课表查询
为解决跨多表的课表查询性能问题,我们:
- 使用MyBatis-Plus的QueryWrapper构建动态SQL
- 添加冗余字段减少关联查询
- 采用二级缓存策略
java复制public Page<CourseVO> queryCoursePage(CourseQuery query) {
return courseMapper.selectCoursePage(new Page<>(query.getPage(), query.getSize()), query);
}
5. 部署与运维实践
5.1 容器化部署
采用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
部署优势:
- 一键环境初始化
- 资源隔离更安全
- 弹性扩缩容方便
5.2 监控方案
搭建Prometheus+Grafana监控体系,重点关注:
- JVM内存使用率
- MySQL连接池状态
- API响应时间P99
配置告警规则示例:
yaml复制- alert: HighErrorRate
expr: rate(http_server_requests_error_total[1m]) > 0.1
for: 5m
6. 项目优化方向
经过实际运行,下一步计划:
- 引入Elasticsearch实现课程全文检索
- 开发微信小程序端提升家长使用体验
- 使用Apache POI优化Excel报表生成性能
特别在安全方面,我们正在测试JWT令牌的自动续期机制,解决长期登录的安全隐患。核心思路是在令牌过期前自动发起静默刷新,对用户完全无感知。