1. 项目概述
这个健身房预约平台小程序是我去年指导的一个本科毕业设计项目,采用SpringBoot后端+微信小程序前端的技术架构。整套系统从需求分析到上线部署耗时3个月,最终实现了会员管理、课程预约、设备维护等核心功能模块。特别值得一提的是,我们针对高校健身房场景做了深度定制,比如增加了课程冲突检测、器材使用频率统计等实用功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型解析
2.1 后端技术栈
选择SpringBoot 2.7.5版本主要基于以下考量:
- 内嵌Tomcat服务器简化部署
- 自动配置特性快速集成MyBatis-Plus 3.5.1
- 与微信小程序接口对接方便
数据库使用MySQL 8.0,关键表设计:
sql复制CREATE TABLE `course_booking` (
`id` bigint NOT NULL AUTO_INCREMENT,
`member_id` varchar(32) NOT NULL COMMENT '微信openid',
`course_id` bigint NOT NULL,
`book_time` datetime NOT NULL,
`status` tinyint DEFAULT '0' COMMENT '0-待确认 1-已预约 2-已取消',
PRIMARY KEY (`id`),
KEY `idx_member` (`member_id`),
KEY `idx_course` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 小程序端开发
采用原生微信小程序开发而非uni-app,主要考虑:
- 性能更优,特别是列表页滚动体验
- 直接调用微信原生API(如获取用户手机号)
- 避免多端适配带来的额外工作量
关键页面使用自定义组件:
- 预约日历组件(支持周/月视图切换)
- 器材状态指示灯组件(红/黄/绿三色)
- 会员等级徽章组件
3. 核心功能实现
3.1 会员管理系统
采用微信开放能力实现一站式注册:
javascript复制// 小程序端获取用户信息
wx.getUserProfile({
desc: '用于完善会员资料',
success: (res) => {
this.setData({ userInfo: res.userInfo })
}
})
后端采用JWT+Redis实现会话管理:
java复制// 生成带权限的token
public String createToken(Member member) {
Map<String, Object> claims = new HashMap<>();
claims.put("openid", member.getOpenid());
claims.put("role", member.getRole());
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}
3.2 课程预约模块
解决高并发预约的三大关键技术:
- 乐观锁控制库存
java复制@Transactional
public boolean bookCourse(Long courseId, String openid) {
Course course = courseMapper.selectById(courseId);
if (course.getRemain() > 0) {
int rows = courseMapper.updateRemain(courseId, course.getVersion());
if (rows == 0) throw new OptimisticLockingFailureException("预约冲突");
// 创建预约记录...
return true;
}
return false;
}
- Redis分布式锁防止重复提交
- 定时任务自动释放未支付名额
3.3 设备维护系统
物联网集成方案:
- 蓝牙4.0设备状态采集
- WebSocket实时推送告警
- 维护工单自动派发算法
4. 典型问题解决方案
4.1 微信登录态维护
常见问题:session_key过期导致解密失败
解决方案:
java复制// 双token机制
public class TokenPair {
private String accessToken; // 短期token(2h)
private String refreshToken; // 长期token(30d)
}
4.2 小程序包体积优化
通过以下手段将主包控制在1MB内:
- 图片资源全部走CDN
- 非必要组件按需引入
- 分包加载课程详情等次级页面
4.3 定时任务可靠性
使用Quartz集群部署解决:
properties复制# application.properties配置
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000
5. 部署与监控
5.1 生产环境部署
采用Docker Compose编排:
yaml复制version: '3'
services:
app:
image: gym-booking:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:6-alpine
ports:
- "6379:6379"
5.2 监控方案
- Spring Boot Admin监控JVM状态
- 微信小程序错误日志实时收集
- 业务指标埋点(预约转化率等)
6. 项目扩展方向
- 增加AI私教推荐功能(基于用户运动数据)
- 接入智能手环实时监测
- 开发管理端APP(使用Flutter跨平台)
这个项目最让我意外的是Redis的ZSET结构在解决课程抢购问题上表现出的优异性能。实际测试中,使用ZSET实现的排队系统比传统数据库方案吞吐量提升了8倍。建议在类似场景下优先考虑Redis的丰富数据结构。
