1. 项目概述:实习记录小程序的设计初衷
去年帮本地一所高校计算机系开发实习管理系统时,我发现纸质实习周报存在三个痛点:学生容易遗忘提交、教师批阅效率低下、实习过程数据难以追溯。这正是我们选择开发微信小程序版实习记录系统的原因——借助移动端随时记录的优势,配合后台管理系统实现全流程数字化。
这个小程序采用SSM(Spring+SpringMVC+MyBatis)作为后端框架,前端使用微信小程序原生开发。技术选型上特别考虑了高校IT环境的实际情况:服务器多为Windows Server搭配Tomcat,MySQL是标配数据库,而微信小程序无需安装即可使用的特性完美适配学生群体。
关键提示:在高校场景下,系统必须考虑学期制特点(如实习周期固定)、批量用户并发(集中提交周报)以及离线操作需求(偏远地区实习可能无网络)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 SSM框架组合的优势
我们放弃Spring Boot而选择传统SSM架构,主要基于以下实际考量:
- 高校信息中心通常已有Tomcat中间件部署,直接使用war包部署更符合运维习惯
- MyBatis的SQL可控性更适合需要复杂统计报表的场景(如实习成绩分析)
- 系统需要与既有教务系统对接,Spring的XML配置方式更便于管理外部依赖
典型的数据交互流程如下:
- 小程序端通过wx.request发起HTTPS请求
- Nginx反向代理到Tomcat服务器
- SpringMVC的DispatcherServlet处理路由
- MyBatis执行包含多表关联的SQL查询
- 返回JSON数据经Gzip压缩传输
2.2 微信小程序端的特殊处理
针对实习场景的特殊需求,我们做了这些关键实现:
- 离线存储:利用wx.setStorageSync缓存未提交的周报内容
- 富文本编辑:自行开发基于textarea的编辑器,支持图片上传(需先压缩至300KB以内)
- 日历组件:改造第三方组件实现实习周期可视化展示
javascript复制// 典型的小程序端API调用示例
wx.uploadFile({
url: 'https://api.example.com/weekly/upload',
filePath: tempFilePaths[0],
name: 'file',
formData: {
'userId': getApp().globalData.userId,
'compressRate': 0.7 // 图片压缩率参数
},
success(res) {
// 处理七牛云返回的CDN地址
}
})
3. 核心功能实现细节
3.1 实习周报的多状态管理
系统设计了6种周报状态,流转逻辑需要特别注意:
| 状态 | 触发条件 | 可执行操作 |
|---|---|---|
| 草稿 | 新建周报 | 保存/提交 |
| 待审核 | 学生提交 | 教师审核/退回 |
| 已通过 | 教师审核 | 生成评语 |
| 已退回 | 教师操作 | 学生修改 |
| 超时未交 | 截止时间到 | 仅查看 |
| 补交 | 超时后提交 | 特殊标记 |
状态机实现采用策略模式,在Service层通过StateContext类管理不同状态的行为规则。
3.2 批量处理性能优化
遇到期末集中审核时,系统需要处理200+并发请求。我们通过以下措施保障性能:
-
MySQL层面:
- 为status字段添加索引
- 使用批处理UPDATE语句
- 读写分离配置
-
Java层面:
- 采用Spring的@Async异步处理审核日志记录
- 使用Guava Cache缓存教师待审列表
xml复制<!-- MyBatis批量更新示例 -->
<update id="batchUpdateStatus">
UPDATE internship_weekly
SET status = #{status}
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
4. 部署过程中的实战经验
4.1 HTTPS证书的坑
微信小程序强制要求HTTPS接口,但在高校内网部署时遇到两个典型问题:
- 内网CA证书不被微信信任:最终采用Let's Encrypt证书+nginx反代方案
- 证书续期问题:编写自动续期脚本配合crontab运行
4.2 微信登录的适配问题
不同型号安卓手机获取openid可能失败,解决方案包括:
- 备用获取方案:当wx.login失败时,引导用户点击按钮重新授权
- 缓存机制:将unionid与学号绑定后存入localStorage
- 超时处理:设置15秒超时后显示二维码登录入口
5. 典型问题排查指南
5.1 图片上传失败排查流程
-
检查小程序端:
- 确认wx.chooseImage成功回调
- 查看tempFilePaths是否包含有效路径
-
检查服务端:
- Nginx检查client_max_body_size配置(建议20M)
- 查看Tomcat日志中的MaxUploadSizeExceededException
-
网络链路检查:
- 使用curl测试CDN接口可达性
- 检查七牛云token有效期
5.2 MyBatis缓存导致的数据不一致
现象:教师端看到的学生周报状态与实际不符
解决方案:
- 在mapper.xml中添加flushCache="true"
- 对状态变更操作添加@CacheEvict注解
- 配置二级缓存超时时间为5分钟
java复制@CacheEvict(value = "weeklyCache", allEntries = true)
public void approveWeekly(Long weeklyId) {
// 审核逻辑
}
6. 扩展建议
这套系统在实际运行半年后,我们根据师生反馈做了三个方向的扩展:
- 实习单位对接:开发企业端小程序,实现三方协同
- 数据分析:使用ECharts生成学生成长曲线图
- 模板库:积累各专业的实习周报优秀范例
对于想要二次开发的同行,建议特别注意微信小程序审核规范的变化。例如最新要求虚拟支付必须改为"费用说明"形式,我们通过动态生成PDF账单来解决这个问题
