1. 项目背景与核心价值
这个微信小程序健康管理系统是我在本科毕业设计期间完成的一个全栈项目。当时选择这个方向主要基于三个现实考量:首先,校园体检数据分散在各个科室,学生无法便捷查看历史记录;其次,市面上的健康管理App普遍功能臃肿,缺少针对学生群体的轻量化解决方案;最重要的是,微信小程序无需安装的特性特别适合这种低频但刚需的使用场景。
系统采用SpringBoot+MySQL后端与微信小程序前端的技术组合,实现了体检报告可视化、健康趋势分析、异常指标预警等核心功能。在技术验证阶段,我对比了三种方案:
- 纯前端方案(仅用小程序本地存储)
- 传统JavaWeb(Servlet+JSP)
- SpringBoot+RESTful API
最终选择方案3是因为:微信小程序需要HTTPS接口,SpringBoot的内置Tomcat简化了SSL证书部署;RESTful架构更适配小程序的数据请求模式;MyBatis-Plus的ActiveRecord模式能快速开发数据访问层。
经验提示:小程序开发必须提前准备已备案域名和SSL证书,这是很多课程设计容易忽略的合规要求。我最初用测试域名开发,临演示前才紧急迁移,导致大量接口路径需要修改。
2. 系统架构设计详解
2.1 技术栈选型依据
前端技术矩阵:
- 微信小程序原生框架(非uniapp):虽然跨平台方案开发效率更高,但考虑到毕业设计需要展示原生API掌握程度,且微信官方文档案例更丰富
- ECharts-for-Weixin:专门适配小程序的图表库,体检数据可视化核心依赖
- Vant Weapp:采用有赞的UI组件库加速界面开发
后端技术组合:
- SpringBoot 2.7.4:选择LTS版本避免踩坑新版本兼容性问题
- MyBatis-Plus 3.5.1:简化CRUD操作,特别适合学生信息管理这类标准表单
- Redis 6.2:缓存体检指标参考范围数据,降低数据库压力
- Hutool 5.8.5:国产工具包,处理日期格式转换等边缘需求
数据库设计要点:
sql复制CREATE TABLE `student_health` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`student_id` varchar(20) NOT NULL COMMENT '学号',
`check_date` date NOT NULL COMMENT '体检日期',
`height` decimal(5,2) DEFAULT NULL COMMENT '身高(cm)',
`weight` decimal(5,2) DEFAULT NULL COMMENT '体重(kg)',
`blood_pressure` varchar(20) DEFAULT NULL COMMENT '血压(mmHg)',
`vision_left` decimal(3,1) DEFAULT NULL COMMENT '左眼视力',
`abnormal_flags` varchar(255) DEFAULT NULL COMMENT '异常指标标记',
PRIMARY KEY (`id`),
KEY `idx_student` (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 核心功能实现路径
体检报告同步流程:
- 校医院导出Excel体检数据
- 通过Admin后台批量导入(使用EasyExcel处理大数据量)
- 后端定时任务每天凌晨2点生成异常指标报告
- 小程序端下拉刷新获取最新报告
关键技术难点突破:
- 微信小程序登录与学号绑定:通过获取微信开放数据中的unionId,与学校教务系统做关联
- 历史数据对比算法:采用滑动窗口算法计算同一指标的年环比变化率
- 体检报告PDF生成:使用wkhtmltopdf将HTML模板转为PDF,缓存至阿里云OSS
3. 开发踩坑实录
3.1 微信授权流程的巨坑
初期直接调用wx.getUserProfile获取用户信息,上线后发现iOS设备频繁报错。排查发现:
- 2022年10月后该API需要用户主动点击按钮触发
- 必须配合
<button open-type="getUserInfo">使用 - 用户拒绝授权后需要设计降级方案
最终解决方案:
javascript复制// 正确授权代码示例
const handleAuth = () => {
wx.getUserProfile({
desc: '用于绑定学籍信息',
success: (res) => {
this.setData({ userInfo: res.userInfo })
this.bindStudentId() // 执行后续绑定逻辑
},
fail: () => {
wx.showToast({ title: '授权失败', icon: 'none' })
this.showGuestMode() // 降级为游客模式
}
})
}
3.2 MyBatis-Plus分页失效问题
在实现体检记录分页查询时,发现PageHelper始终不生效。根本原因是:
- 项目中同时存在SpringDataJPA和MyBatis-Plus
- 两者分页实现机制冲突
- 自动配置类被JPA优先接管
解决方案:
java复制// 显式声明使用MyBatis分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
4. 毕业论文写作技巧
4.1 技术章节编排建议
第三章 系统设计应包含:
- 架构设计图(建议使用PlantUML绘制类图)
- 数据库ER图(PowerDesigner导出)
- 核心接口Swagger文档截图
- 关键算法伪代码(如指标异常检测逻辑)
第四章 实现与测试重点:
- 微信小程序页面路由设计表
- 接口压力测试数据(JMeter报告)
- 兼容性测试矩阵(不同微信版本、机型)
4.2 答辩PPT制作要点
- 技术架构图用颜色区分前端/后端/数据库
- 演示视频提前录制关键路径:
- 微信授权登录 → 学号绑定 → 查看报告
- 历史数据对比操作
- 异常指标提醒推送
- 代码量统计使用cloc工具生成报表
- 创新点陈述要具体,例如:
- 基于滑动窗口的健康趋势预测
- 多维度异常指标关联分析
5. 项目优化方向
5.1 已实现的进阶功能
-
双Token无感刷新:
- accessToken过期时间设为2小时
- refreshToken有效期7天
- 使用axios拦截器自动处理令牌刷新
-
体检报告OCR识别:
- 集成腾讯云OCR服务
- 预处理校医院常见的扫描件畸变
- 关键字段正则校验
5.2 待完善功能规划
- 家属健康档案共享功能
- 基于LBS的校医院导航
- 健康知识图谱构建
- 对接智能穿戴设备数据
整套源码已整理成标准Maven多模块项目,包含完整的Jenkinsfile持续集成配置。数据库使用Docker-Compose编排,方便快速部署。在演示视频中特别展示了从零环境搭建到系统启动的全过程,这对毕业答辩中的环境搭建问题非常有说服力。
