1. 项目背景与核心需求
高校班级管理系统是当前教育信息化建设中的重要一环。作为一名长期从事校园信息化系统开发的工程师,我观察到传统班级管理存在几个痛点:纸质考勤效率低下、通知传达不及时、活动组织协调困难、学生信息分散存储。这些问题在高校扩招背景下愈发突出。
基于微信小程序的解决方案具有天然优势:
- 无需安装,扫码即用
- 依托微信生态,用户覆盖率高
- 开发成本低,迭代速度快
- 支持离线使用和数据缓存
我们设计的系统需要满足以下核心场景:
- 辅导员视角:班级成员管理、通知发布、请假审批
- 班干部视角:活动组织、考勤记录、资料共享
- 学生视角:课表查询、成绩查看、班级社交
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,这是当前企业级应用的主流方案:
前端技术栈:
- 微信小程序(主体框架)
- Vant Weapp组件库(UI加速开发)
- ECharts for Weixin(数据可视化)
- WXS(小程序脚本语言处理复杂逻辑)
后端技术栈:
- Spring Boot 2.7(后端主框架)
- MyBatis-Plus 3.5(数据访问层)
- Redis 6.2(缓存与Session管理)
- JWT(认证与授权)
- Swagger 3.0(API文档)
数据库:
- MySQL 8.0(主数据库)
- 阿里云OSS(文件存储)
提示:选择MyBatis-Plus而非JPA是考虑到高校业务中复杂报表查询较多,需要更灵活的SQL控制能力。
2.2 小程序端关键技术点
页面架构设计:
pages/ ├── index/ // 主页 ├── schedule/ // 课表模块 ├── attendance/ // 考勤模块 ├── notice/ // 通知模块 ├── activity/ // 活动模块 └── profile/ // 个人中心性能优化方案:
- 使用分包加载技术,将课表、考勤等低频模块独立分包
- 重要数据本地缓存(利用wx.setStorageSync)
- 图片资源使用CDN加速
- 采用骨架屏技术提升用户体验
3. 后端核心实现
3.1 SpringBoot工程结构
标准Maven多模块设计:
class-manage ├── class-common // 公共模块 ├── class-system // 系统模块 ├── class-admin // 管理模块 └── class-wechat // 小程序接口模块关键配置示例(application.yml):
spring: datasource: url: jdbc:mysql://localhost:3306/class_db?useSSL=false username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: 127.0.0.1 port: 6379 password: database: 03.2 安全认证方案
采用JWT+Redis双Token机制:
- AccessToken(有效期2小时)
- RefreshToken(有效期7天)
核心认证流程:
@PostMapping("/login") public Result login(@RequestBody LoginDTO dto) { // 1. 验证学号和密码 Student student = studentService.verify(dto.getStudentId(), dto.getPassword()); // 2. 生成双Token String accessToken = JwtUtil.createAccessToken(student); String refreshToken = JwtUtil.createRefreshToken(student); // 3. Redis存储关联关系 redisTemplate.opsForValue().set( "token:"+student.getId(), refreshToken, 7, TimeUnit.DAYS); // 4. 返回结果 return Result.success(new TokenVO(accessToken, refreshToken)); }注意:RefreshToken需要加密存储,建议采用AES对称加密,密钥定期轮换。
4. 数据库设计
4.1 核心表结构
学生表(student)
CREATE TABLE `student` ( `id` bigint NOT NULL AUTO_INCREMENT, `student_id` varchar(20) NOT NULL COMMENT '学号', `name` varchar(50) NOT NULL, `gender` tinyint DEFAULT '0' COMMENT '0未知 1男 2女', `class_id` bigint NOT NULL COMMENT '所属班级', `avatar` varchar(255) DEFAULT NULL COMMENT '头像URL', `password` varchar(100) NOT NULL COMMENT '加密密码', `salt` varchar(50) NOT NULL COMMENT '加密盐值', `status` tinyint DEFAULT '1' COMMENT '0禁用 1正常', PRIMARY KEY (`id`), UNIQUE KEY `idx_student_id` (`student_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;班级表(class)
CREATE TABLE `class` ( `id` bigint NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL COMMENT '班级名称', `code` varchar(20) NOT NULL COMMENT '班级代码', `college` varchar(100) DEFAULT NULL COMMENT '所属学院', `major` varchar(100) DEFAULT NULL COMMENT '专业', `adviser_id` bigint DEFAULT NULL COMMENT '辅导员ID', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;4.2 业务表设计要点
- 考勤表(attendance)需要记录地理位置信息
- 活动表(activity)需要支持多人组织者
- 通知表(notice)需要区分已读/未读状态
- 所有表必须包含逻辑删除字段(is_deleted)
5. 典型功能实现
5.1 微信小程序登录集成
小程序端代码示例:
// 登录逻辑 wx.login({ success: res => { if (res.code) { wx.request({ url: 'https://api.yourserver.com/auth/wxlogin', method: 'POST', data: { code: res.code }, success: (resp) => { // 存储返回的token wx.setStorageSync('token', resp.data.data.token) } }) } } })后端验证逻辑:
@PostMapping("/wxlogin") public Result wxLogin(@RequestParam String code) { // 1. 调用微信接口获取openid String url = "https://api.weixin.qq.com/sns/jscode2session"; Map<String, String> params = new HashMap<>(); params.put("appid", appId); params.put("secret", appSecret); params.put("js_code", code); params.put("grant_type", "authorization_code"); String response = HttpUtil.get(url, params); JSONObject json = JSON.parseObject(response); String openid = json.getString("openid"); // 2. 查询或创建用户 Student student = studentService.getByOpenid(openid); if(student == null) { student = new Student(); student.setOpenid(openid); studentService.save(student); } // 3. 生成token String token = JwtUtil.createToken(student); return Result.success(token); }5.2 考勤签到功能实现
业务流程:
- 教师/班干部发起签到
- 生成带有地理围栏的签到任务
- 学生进入签到范围后提交位置信息
- 系统校验位置并记录结果
关键代码:
// 距离计算算法 public static boolean checkDistance(double lat1, double lng1, double lat2, double lng2, double radius) { double radLat1 = Math.toRadians(lat1); double radLat2 = Math.toRadians(lat2); double a = radLat1 - radLat2; double b = Math.toRadians(lng1) - Math.toRadians(lng2); double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2))); s = s * 6378137.0; // 地球半径 return s <= radius; }6. 项目部署方案
6.1 小程序发布流程
开发环境配置
- 微信开发者工具
- 配置合法域名(需HTTPS)
- 申请小程序AppID
测试阶段
- 使用体验版进行测试
- 配置测试人员白名单
- 真机调试各功能模块
正式发布
- 提交代码审核(约1-3工作日)
- 配置服务器域名白名单
- 灰度发布观察效果
6.2 后端服务部署
推荐采用Docker Compose方案:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - ./mysql/data:/var/lib/mysql ports: - "3306:3306" redis: image: redis:6.2 ports: - "6379:6379" app: build: . ports: - "8080:8080" depends_on: - mysql - redis构建脚本示例:
FROM openjdk:11-jre WORKDIR /app COPY target/class-manage.jar . EXPOSE 8080 ENTRYPOINT ["java", "-jar", "class-manage.jar"]7. 项目优化与扩展
7.1 性能优化实践
接口响应优化:
- 启用Gzip压缩
- 使用@Cacheable注解缓存热点数据
- 分页查询优化(避免count(*))
数据库优化:
- 建立合适的索引
- 使用连接池(HikariCP)
- 慢SQL监控与优化
小程序端优化:
- 图片懒加载
- 数据预加载
- 减少setData调用频率
7.2 功能扩展方向
- 接入校园统一认证
- 增加AI考勤识别(人脸/语音)
- 开发管理端Web界面
- 集成课程评价系统
- 添加数据分析看板
在实际开发中,我们遇到了微信小程序审核不通过的问题,原因是"深度合成"功能未报备。解决方案是:
- 移除涉及人脸识别的功能
- 重新提交审核时明确说明功能范围
- 提供完整的测试账号供审核人员验证
另一个常见问题是Token过期后的用户体验问题。我们的解决方案是:
- 在请求拦截器中自动刷新Token
- 设置合理的Token过期时间(AccessToken 2小时,RefreshToken 7天)
- 重要操作前检查Token有效期
这个项目从技术选型到最终上线历时3个月,最大的收获是理解了教育场景下的特殊需求。比如考勤功能需要考虑合班上课的情况,通知系统需要确保重要消息的送达率。这些业务细节是教科书上不会写的,却直接影响系统的实用性。