1. 项目概述
这个基于SpringBoot和微信小程序的学生评教系统,本质上是一个轻量级的教学质量反馈平台。我在实际开发中发现,这类系统最核心的价值在于解决了传统纸质评教的三痛点:数据统计滞后、样本回收率低、评价维度单一。
系统采用前后端分离架构,后端用SpringBoot提供RESTful API,前端用微信小程序作为入口。这种组合的优势很明显:微信小程序无需安装,学生打开即用;SpringBoot的自动化配置让后端开发效率极高,特别适合高校这种需求明确但开发资源有限的场景。
2. 技术选型解析
2.1 为什么选择SpringBoot
SpringBoot的starter机制在这个项目中发挥了巨大作用。比如:
- 集成MyBatis-Plus时,只需引入
mybatis-plus-boot-starter - 处理跨域问题用
spring-boot-starter-web自带的@CrossOrigin - 监控用
spring-boot-starter-actuator
实测发现,从零搭建到第一个接口跑通,熟练开发者不超过30分钟。这种快速启动的特性,对学期中需要紧急上线的评教项目特别友好。
2.2 微信小程序的特殊处理
小程序端有几个关键配置需要注意:
// app.json必须配置评教相关页面 { "pages": [ "pages/evaluate/list", "pages/evaluate/detail" ], "permission": { "scope.userInfo": { "desc": "需要获取您的身份信息以关联评教记录" } } }特别注意:小程序request域名必须备案,且需在微信公众平台配置合法域名。这是新手最容易踩的坑。
3. 核心功能实现
3.1 评教表单动态加载
数据库设计采用元数据模式:
CREATE TABLE `eval_question` ( `id` bigint NOT NULL COMMENT '雪花ID', `course_type` varchar(20) COMMENT '课程类型(通识/专业/实验)', `question_type` tinyint COMMENT '1-单选 2-多选 3-文本', `content` varchar(255) COMMENT '问题内容', `options` json COMMENT '选项(仅选择题需要)' );后端接口示例:
@GetMapping("/questions") public Result<List<QuestionVO>> getQuestions( @RequestParam String courseType) { // 根据课程类型返回不同问题集 return Result.success(questionService.getByType(courseType)); }3.2 防刷机制设计
为防止学生重复提交或恶意评价,我们实现了三重校验:
- 微信openid绑定学号(首次需认证)
- Redis记录提交状态(过期时间设为评教周期)
- 服务端幂等处理(基于评教记录ID)
核心代码片段:
public synchronized Result submitEvaluation(EvalDTO dto) { String key = "eval:" + dto.getOpenid(); if (redisTemplate.opsForValue().get(key) != null) { return Result.fail("请勿重复提交"); } // ...处理提交逻辑 redisTemplate.opsForValue().set(key, "1", 30, TimeUnit.DAYS); }4. 数据统计与分析
4.1 实时数据看板
采用SpringBoot+ECharts实现的教学质量热力图:
@GetMapping("/stats/heatmap") public Result<HeatmapVO> getHeatmapData( @RequestParam String semester) { // 从数据库聚合查询 List<EvaluationStats> stats = evalMapper.selectStatsBySemester(semester); // 转换为ECharts需要的格式 return Result.success(StatsConverter.toHeatmapVO(stats)); }4.2 异常评价检测
通过算法识别异常评价(如全满分/全低分):
# 伪代码示例 def detect_abnormal(evaluations): scores = [e.score for e in evaluations] mean = np.mean(scores) std = np.std(scores) return [e for e in evaluations if abs(e.score - mean) > 2*std]5. 部署实践
5.1 多环境配置
SpringBoot的profile机制非常适合高校多环境需求:
# application-dev.yml wx: appid: 开发环境APPID secret: 开发环境SECRET # application-prod.yml wx: appid: 生产环境APPID secret: 生产环境SECRET启动时指定profile:
java -jar evaluation.jar --spring.profiles.active=prod5.2 性能优化经验
- 小程序端:
- 使用分包加载,评教主包控制在1MB内
- 图片全部走CDN
- 接口数据gzip压缩
- 服务端:
- 评价列表接口添加二级缓存
- 使用HikariCP连接池
- 定时任务异步生成报表
6. 踩坑实录
- 微信登录态维护:
- 首次需要button触发getUserInfo
- 后续可用checkSession检测
- 建议维护双token(access_token + refresh_token)
- 并发提交问题:
- 数据库添加唯一索引:
UNIQUE KEYuk_openid_course(openid,course_id) - 服务端加分布式锁(Redis实现)
- 数据导出内存溢出:
- 改用POI的SXSSFWorkbook模式
- 分页查询+分批写入
- 添加服务器内存监控
这个项目最让我意外的是教师端的接受度。通过将抽象的打分转化为直观的雷达图展示,并增加个性化评语展示,教师查看评教结果的积极性提高了60%以上。一个小技巧:在导出Excel时,自动将文字评价中的高频关键词生成词云图附加在报告末尾,这个设计获得了教务处的高度评价。