1. 项目概述:SpringBoot+微信小程序的任务打卡系统
去年团队内部推行OKR考核时,我开发了一套任务打卡系统来解决日报周报的追踪难题。这个基于SpringBoot后端+微信小程序前端的全栈项目,实现了任务创建、进度追踪、数据统计等核心功能。相比传统Excel汇报方式,系统上线后任务完成率提升了37%,特别适合中小团队进行敏捷管理。
系统采用经典的MVC架构:微信小程序负责用户交互,SpringBoot处理业务逻辑,MySQL存储数据。这种组合既保证了移动端便捷性,又具备服务端的高可靠性。下面我会从技术选型、功能实现到部署运维,完整复盘这个项目的开发过程。
2. 技术架构设计
2.1 为什么选择SpringBoot
后端选用SpringBoot主要考虑三点因素:
- 快速启动:内嵌Tomcat和自动配置让服务部署变得极其简单
- 生态丰富:Spring Data JPA简化数据库操作,Spring Security处理权限
- 微服务友好:未来扩展为分布式架构时能平滑过渡
核心依赖配置示例(pom.xml节选):
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.2</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.8</version> </dependency> </dependencies>2.2 微信小程序选型要点
小程序端开发特别注意了这些方面:
- 使用WXML+WXSS+JS标准开发模式
- 采用Flex布局适配不同设备
- 通过wx.login获取用户唯一标识
- 利用云开发能力处理文件存储
重要提示:小程序上线前务必在app.json中配置合法域名,否则API请求会被拦截。这是我们踩过的第一个坑。
3. 核心功能实现
3.1 任务管理模块
采用DDD领域驱动设计,主要包含:
- Task实体:记录任务名称、内容、起止时间
- TaskRepository:基于JPA的数据库操作接口
- TaskService:业务逻辑处理层
实体类设计示例:
@Entity public class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; @Enumerated(EnumType.STRING) private TaskStatus status; @ManyToOne private User creator; // 省略getter/setter }3.2 打卡签到功能
打卡逻辑处理流程:
- 小程序端获取用户位置信息
- 调用wx.uploadFile上传现场照片
- 服务端校验时间/地点是否符合要求
- 生成打卡记录并更新任务进度
关键代码片段:
@PostMapping("/checkin") public Result checkIn(@RequestBody CheckInDTO dto) { // 1. 验证用户身份 User user = userService.getCurrentUser(); // 2. 校验任务状态 Task task = taskRepository.findById(dto.getTaskId()) .orElseThrow(() -> new BusinessException("任务不存在")); // 3. 保存打卡记录 CheckIn record = new CheckIn(); record.setUser(user); record.setTask(task); record.setCheckTime(LocalDateTime.now()); checkInRepository.save(record); // 4. 更新任务进度 task.setProgress(calculateProgress(task)); return Result.success(); }4. 数据统计与分析
4.1 周报自动生成
通过Spring Schedule定时任务,每周日23:00自动生成周报:
@Scheduled(cron = "0 0 23 ? * SUN") public void generateWeeklyReport() { // 1. 查询本周数据 LocalDate now = LocalDate.now(); LocalDate start = now.with(DayOfWeek.MONDAY); List<ReportData> data = reportService.collectData(start, now); // 2. 生成PDF报告 byte[] pdf = pdfGenerator.generate(data); // 3. 邮件发送给相关人员 emailService.sendReport(pdf); }4.2 可视化图表
使用ECharts实现小程序端数据展示:
// pages/report/report.js function initChart() { const chart = echarts.init(this, 'main'); chart.setOption({ tooltip: {}, xAxis: { data: ['周一', '周二', '周三', '周四', '周五'] }, series: [{ name: '任务量', type: 'bar', data: [5, 8, 12, 6, 9] }] }); }5. 部署与运维
5.1 后端部署方案
推荐两种部署方式:
- 传统服务器部署:
nohup java -jar task-system.jar --spring.profiles.active=prod & - Docker容器化(推荐):
FROM openjdk:11 COPY target/task-system.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
5.2 小程序发布流程
- 开发版本测试:使用微信开发者工具真机调试
- 体验版审核:供团队内部成员验证
- 提交微信审核:准备完整的测试账号信息
- 全量发布:建议选择分阶段发布
6. 常见问题排查
6.1 微信登录失败
典型错误场景:
- 现象:获取openid返回40029
- 原因:code被重复使用或过期
- 解决方案:
- 检查code是否有效(5分钟有效期)
- 确保AppID和Secret配置正确
- 不要在前端暴露Secret
6.2 文件上传异常
处理方案对照表:
| 错误码 | 可能原因 | 解决方案 |
|---|---|---|
| 40001 | 文件超过10MB | 压缩图片或分片上传 |
| 40002 | 非图片格式 | 添加文件类型校验 |
| 50001 | 服务器存储失败 | 检查磁盘空间和权限 |
7. 性能优化实践
7.1 数据库优化
- 索引优化:为常用查询字段添加索引
@Entity @Table(indexes = @Index(name = "idx_task_user", columnList = "creator_id")) public class Task { ... } - 使用JPA二级缓存:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
7.2 小程序端优化
- 图片懒加载:
<image lazy-load src="{{imgUrl}}"></image> - 使用分包加载:
{ "subpackages": [ { "root": "packageA", "pages": ["pages/report", "pages/analysis"] } ] }
这套系统经过三个迭代周期后趋于稳定,日均处理2000+打卡请求。最大的收获是理解了如何平衡快速迭代和系统稳定性——初期采用MVP模式快速验证核心功能,中期引入DDD规范代码结构,后期通过CI/CD保证交付质量。对于想尝试全栈开发的同学,这个项目组合非常值得实践。