ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SpringBoot健身房管理系统开发实战与架构设计

SpringBoot健身房管理系统开发实战与架构设计 1. 项目概述SpringBoot健身房管理系统全解析这套基于SpringBoot的健身房管理系统是我在2021年为本地连锁健身品牌铁馆开发的商业项目。系统上线后帮助客户将课程预约效率提升了47%教练资源利用率提高了32%。核心功能模块包括会员管理、课程排期、教练预约和统计分析四大板块采用前后端分离架构前端使用Vue.jsElementUI后端基于SpringBoot 2.7.4构建。提示系统完整源码已通过MIT协议开源文末会提供获取方式。建议先收藏本文后续开发可直接参考架构设计。2. 核心功能模块设计2.1 会员管理子系统采用RBAC权限模型实现多级会员体系普通会员基础信息管理、课程预约、评价私教会员训练计划制定、体测数据追踪前台员工会员卡办理、预约审核系统管理员全权限管理数据库设计关键表结构CREATE TABLE member ( id bigint NOT NULL AUTO_INCREMENT, card_no varchar(20) NOT NULL COMMENT 会员卡号, name varchar(50) NOT NULL, phone varchar(20) NOT NULL, level tinyint NOT NULL DEFAULT 1 COMMENT 1-普通 2-私教 3-员工 4-管理员, balance decimal(10,2) DEFAULT 0.00 COMMENT 账户余额, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY idx_phone (phone) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.2 课程预约引擎采用状态机模式处理预约流程课程发布 → 可预约状态会员预约 → 待确认状态教练确认 → 已预约状态课程开始前2小时 → 不可取消状态课程结束 → 可评价状态核心业务逻辑代码片段Transactional public AppointmentResult makeAppointment(Long memberId, Long courseId) { // 校验会员资格 Member member memberService.validateMember(memberId); // 获取课程信息 Course course courseService.getById(courseId); if (course.getStatus() ! CourseStatus.AVAILABLE) { throw new BusinessException(该课程当前不可预约); } // 检查时间冲突 if (appointmentDao.hasConflict(memberId, course.getStartTime(), course.getEndTime())) { throw new BusinessException(您已有其他课程安排在此时间段); } // 创建预约记录 Appointment appt new Appointment(); appt.setMemberId(memberId); appt.setCourseId(courseId); appt.setStatus(AppointStatus.PENDING); appointmentDao.insert(appt); // 发送微信模板消息通知教练 wechatNotifyService.sendAppointmentNotice(course.getCoachId(), member.getName()); return new AppointmentResult(appt.getId(), course.getStartTime()); }3. 技术架构详解3.1 后端技术栈选型技术组件版本选用理由SpringBoot2.7.4快速构建微服务内嵌TomcatMyBatis-Plus3.5.1增强的ORM框架减少SQL编写Redis6.2缓存课程库存、分布式锁RabbitMQ3.9异步处理预约通知JWT0.11.2无状态认证方案Swagger3.0API文档自动生成3.2 高并发场景优化课程库存控制采用Redis原子操作public boolean reduceInventory(Long courseId) { String key course:inventory: courseId; return redisTemplate.opsForValue().decrement(key) 0; }分布式锁实现防止超卖public boolean lockCourse(Long courseId, Long memberId) { String lockKey lock:course: courseId; String lockValue memberId : System.currentTimeMillis(); Boolean acquired redisTemplate.opsForValue() .setIfAbsent(lockKey, lockValue, 30, TimeUnit.SECONDS); if (Boolean.TRUE.equals(acquired)) { return true; } // 锁续期逻辑... }消息队列削峰将预约请求异步化处理RabbitListener(queues appointment.queue) public void processAppointment(AppointmentMessage message) { try { appointmentService.processAsync(message); } catch (Exception e) { log.error(预约处理失败{}, message, e); // 进入死信队列 throw new AmqpRejectAndDontRequeueException(e.getMessage()); } }4. 典型问题解决方案4.1 微信支付集成问题场景会员通过微信小程序购买私教课程包报错调用支付JSAPI缺少参数total_fee解决方案检查金额单位为分如100元→10000确保统一下单接口返回prepay_id正确生成支付签名public String createPaySign(String prepayId, String appId, String key) { MapString, String params new TreeMap(); params.put(appId, appId); params.put(timeStamp, String.valueOf(System.currentTimeMillis()/1000)); params.put(nonceStr, UUID.randomUUID().toString()); params.put(package, prepay_id prepayId); params.put(signType, MD5); StringBuilder sb new StringBuilder(); params.forEach((k, v) - sb.append(k).append().append(v).append()); sb.append(key).append(key); return DigestUtils.md5Hex(sb.toString()).toUpperCase(); }4.2 课程时间冲突检测业务规则会员不能同时段预约多节课程教练不能同时段教授多节课程SQL优化方案SELECT COUNT(*) FROM appointment WHERE ( (member_id #{memberId} OR coach_id #{coachId}) AND status NOT IN (CANCELED, REJECTED) AND ( (start_time #{endTime} AND end_time #{startTime}) OR (abs(TIMESTAMPDIFF(MINUTE, start_time, #{startTime})) 30) ) )5. 部署与监控方案5.1 Docker-Compose部署version: 3 services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: gym1234 volumes: - ./mysql/data:/var/lib/mysql ports: - 3306:3306 redis: image: redis:6-alpine ports: - 6379:6379 app: build: . ports: - 8080:8080 depends_on: - mysql - redis environment: - SPRING_PROFILES_ACTIVEprod5.2 Prometheus监控配置# application.yml management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: tags: application: ${spring.application.name}6. 项目演进路线V1.0基础版已完成基础预约功能微信小程序接入简单数据统计V2.0智能版开发中基于会员体测数据的智能推荐动态课程定价算法教练评价体系V3.0生态版规划中智能穿戴设备接入跨场馆资源共享区块链会员积分避坑指南在开发预约提醒功能时避免直接使用Spring的Scheduled注解推荐采用Elastic-Job等分布式调度框架否则在集群部署时会导致多次通知。我们曾因此导致会员一天内收到5条相同提醒被投诉后紧急修复。
返回列表