1. 项目概述
这个基于SpringBoot和微信小程序的任务打卡系统,是我最近完成的一个实际项目。系统核心功能围绕"习惯养成"展开,通过日记和周报的形式帮助用户追踪任务完成情况。作为一名全栈开发者,我在项目中负责了从架构设计到前后端实现的全流程开发。
系统采用前后端分离架构,后端基于SpringBoot 2.7提供RESTful API,前端使用微信小程序原生开发框架。数据库选用MySQL 8.0,通过MyBatis-Plus进行数据访问层优化。特别值得一提的是周报可视化模块,它能直观展示用户一周的任务完成率和时间分布,这个功能在实际使用中获得了用户的高度评价。
2. 技术栈选型解析
2.1 后端技术栈
选择SpringBoot作为后端框架主要基于以下几个考量:
- 快速启动:内嵌Tomcat服务器,无需额外配置
- 自动配置:根据pom依赖自动配置相关组件
- 生态丰富:整合了Spring Security、Spring Data等常用模块
java复制// SpringBoot启动类示例
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
数据库访问层采用MyBatis-Plus而非原生MyBatis,主要因为:
- 内置通用CRUD操作,减少30%以上的样板代码
- 强大的条件构造器,简化复杂查询
- 分页插件开箱即用
2.2 前端技术栈
微信小程序选择原生开发而非第三方框架,主要考虑:
- 性能更优:直接调用微信原生API
- 兼容性更好:避免框架版本兼容问题
- 开发体验:微信开发者工具提供完整调试支持
javascript复制// 小程序页面生命周期示例
Page({
data: {
tasks: []
},
onLoad() {
this.loadTasks()
},
loadTasks() {
wx.request({
url: 'https://api.example.com/tasks',
success: (res) => {
this.setData({tasks: res.data})
}
})
}
})
3. 核心功能实现
3.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证,相比传统Session方案:
- 服务端无需存储会话信息
- 天然支持跨域
- 易于扩展(支持多端登录)
java复制// JWT生成代码
public String generateToken(Long userId, String username, String role) {
// 使用HS256算法,设置1小时过期
return Jwts.builder()
.setSubject(userId.toString())
.claim("username", username)
.claim("role", role)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
3.2 任务打卡功能
打卡功能设计要点:
- 支持文字、图片多种记录形式
- 自动记录打卡时间戳
- 关联任务分类标签
数据库表设计:
sql复制CREATE TABLE `task_record` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`task_id` bigint(20) NOT NULL,
`content` text,
`images` varchar(1000) DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_task` (`user_id`,`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.3 周报生成逻辑
周报生成算法核心流程:
- 查询当周所有打卡记录
- 按任务分类统计完成情况
- 计算每日完成率曲线
- 生成可视化图表数据
java复制public WeekReport generateWeekReport(Long userId, Date weekStart) {
// 获取当周日期范围
Date weekEnd = DateUtils.addDays(weekStart, 6);
// 查询打卡记录
List<TaskRecord> records = recordMapper.selectByUserAndDateRange(
userId, weekStart, weekEnd);
// 统计计算
WeekReport report = new WeekReport();
report.setTotalTasks(records.size());
report.setCompletionRate(calculateCompletionRate(records));
report.setDailyStats(generateDailyStats(records));
return report;
}
4. 关键问题与解决方案
4.1 微信小程序登录流程优化
初期方案问题:
- 每次请求都需要微信登录校验
- 网络延迟影响用户体验
优化方案:
- 首次登录后获取openid
- 与系统账号绑定
- 使用JWT维持登录状态
javascript复制// 小程序登录优化代码
App({
login() {
return new Promise((resolve) => {
wx.login({
success: (res) => {
wx.request({
url: '/api/auth/wxlogin',
data: {code: res.code},
success: (res) => {
wx.setStorageSync('token', res.data.token)
resolve()
}
})
}
})
})
}
})
4.2 高并发打卡场景处理
问题现象:
- 整点时段打卡请求集中
- 数据库出现短暂连接瓶颈
解决方案:
- 引入Redis缓存热门任务数据
- 使用消息队列削峰填谷
- 数据库连接池优化配置
yaml复制# application.yml连接池配置
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
5. 系统测试与优化
5.1 性能测试指标
通过JMeter进行压力测试:
- 单节点QPS:320(无缓存)
- 添加Redis后QPS:850
- 平均响应时间:<200ms
5.2 关键测试用例
登录功能测试矩阵:
| 测试场景 | 输入数据 | 预期结果 | 实际结果 |
|---|---|---|---|
| 正常登录 | 正确账号密码 | 登录成功 | 通过 |
| 错误密码 | 正确账号+错误密码 | 提示密码错误 | 通过 |
| 空用户名 | 空账号+任意密码 | 提示输入用户名 | 通过 |
| 过期Token | 过期Token访问 | 返回401 | 通过 |
5.3 前端性能优化
小程序端优化措施:
- 图片懒加载
- 数据分页加载
- 本地缓存策略
- 减少setData调用频率
javascript复制// 分页加载实现
loadMore() {
if (this.data.loading || !this.data.hasMore) return
this.setData({loading: true})
wx.request({
url: '/api/tasks',
data: {page: this.data.page + 1},
success: (res) => {
this.setData({
tasks: [...this.data.tasks, ...res.data.list],
page: res.data.page,
hasMore: res.data.hasMore,
loading: false
})
}
})
}
6. 部署与运维
6.1 服务器环境配置
推荐配置:
- 2核4G云服务器(开发环境)
- 4核8G集群(生产环境)
- MySQL主从复制
- Redis哨兵模式
6.2 监控方案
实施监控项目:
- SpringBoot Actuator健康检查
- Prometheus + Grafana监控面板
- 微信小程序错误日志收集
xml复制<!-- Actuator依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
7. 项目总结与反思
在开发过程中,有几个关键点值得特别注意:
- 微信小程序限制:
- 网络请求必须使用HTTPS
- 图片上传有大小限制(10MB)
- 部分API需要用户主动触发
- 时间处理陷阱:
- 微信小程序与服务器时区差异
- 日期格式化兼容性问题
- 周计算逻辑(ISO标准与常规差异)
- 性能优化经验:
- 小程序setData操作非常昂贵
- 避免在页面onshow中频繁请求
- 善用wx.nextTick控制渲染时机
这个项目从技术选型到最终上线历时3个月,期间遇到了不少挑战,但也积累了宝贵的全栈开发经验。特别是微信小程序与SpringBoot的整合方案,经过多次迭代已经形成了一套稳定的开发模式。