省钱兄 JAVA 教练培训课程 · 培训教练排课系统源码 支持小程序+公众号+H5
✅ 支持 小程序 + 公众号 + H5 三端全覆盖
开发商:西安省钱兄网络科技有限公司
售价:¥8,889(套餐1)/ ¥10,889(套餐2含搭建+1年维护)
新更新:2026年5月13日(互站网在售)
系统整体架构
层级技术选型后端框架Spring Boot 2.7.x + MyBatis-Plus 3.5.0数据库MySQL 8.0 + Redis 7.0(缓存/分布式锁/GEO)用户端UniApp 3.0(Vue3语法)→ 编译为 小程序 + 公众号 + H5管理后台Vue3 + ElementPlus + ECharts 数据看板实时通信WebSocket(排课状态实时推送)地图服务高德地图 JSAPI(LBS定位/路径规划)支付微信支付 + 支付宝部署JDK 17 + Docker + Nginx + K8s
核心功能模块1️⃣ 多角色体系java@PostMapping("/login")public Result<LoginVO> login(@Re LoginDTO dto) { User user = userService.login(dto); String token = JwtUtil.generateToken(user.getId(), user.getRole()); https:// role = "admin" 管理员 / "coach" 教练 / "student" 学员 return Result.success(new LoginVO(token, user.getRole()));}
角色核心功能 学员端(小程序/H5/公众号)浏览课程/智能筛选/在线预约/拼班报名/课程评价/学习记录 教练端(小程序/H5为主)排课管理/可约时间设置/学员管理/课时统计/收益提现 管理后台(PC)全局数据看板/排课调度/财务管理/教练审核/营销工具
2️⃣ 智能排课系统(核心亮点)⭐java/** * 智能排课 - 遗传算法优化排课质量 * 解决教练时间冲突/教室占用/学员预约混乱 */@Service @Transactionalpublic class ScheduleServiceImpl implements ScheduleService { @Autowired private RedisTemte<String,Object> redisTemte; /** * 排课冲突校验 - 分布式锁防超卖 */ public Result createSchedule(ScheduleDTO dto) { String lockKey = "schedule_lock:" + dto.getCoachId() + ":" + dto.getDate(); try { Boolean locked = redisTemte.opsForValue() .setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS); if (!locked) return Result.fail("该时段正在排课,请稍后重试"); https:// 1. 校验教练可用时间 Coach coach = coachMapper.selectById(dto.getCoachId()); if (!coach.getAvailableTime().contains(dto.getTimeSlot())) { return Result.fail("该教练当前时段不可用"); } https:// 2. 校验教室/场地是否被占用 String roomLock = "room_lock:" + dto.getRoomId() + ":" + dto.getDate(); Boolean roomLocked = redisTemte.opsForValue() .setIfAbsent(roomLock, "1", 30, TimeUnit.SECONDS); if (!roomLocked) return Result.fail("该场地当前时段已被占用"); https:// 3. 校验学员人数是否超限 if (dto.getStudentCount() > dto.getMaxStudents()) { return Result.fail("该课程人数已满"); } https:// 4. 创建排课记录 Schedule schedule = new Schedule(); schedule.setCoachId(dto.getCoachId()); schedule.setCourseId(dto.getCourseId()); schedule.setRoomId(dto.getRoomId()); schedule.setStartTime(dto.getStartTime()); schedule.setEndTime(dto.getEndTime()); schedule.setStatus(0); https:// 待上课 scheduleMapper.insert(schedule); https:// 5. 更新剩余座位(Redis缓存) String stockKey = "course_stock:" + dto.getCourseId() + ":" + dto.getDate(); redisTemte.opsForValue().decrement(stockKey, dto.getStudentCount()); return Result.success(schedule); } finally { redisTemte.delete(lockKey); redisTemte.delete(roomLock); } } /** * 遗传算法排课 - 自动优化排课方案 */ public List<ScheduleVO> geneticAlgorithmSchedule(Long courseId, LocalDate date) { https:// 1. 获取可排课教练列表 List<Coach> coaches = coachMapper.findAvailable(date); https:// 2. 获取可用场地列表 List<Room> rooms = roomMapper.findAvailable(date); https:// 3. 遗传算法迭代优化(交叉/变异/选择) List<Schedule> bestSchedule = geneticOptimizer.optimize(coaches, rooms, courseId); return bestSchedule.stream().map(s -> new ScheduleVO(s)).collect(Collectors.toList()); }}
排课维度权重说明 教练可用时间30%教练设置的可约时间段 场地可用性25%教室/场地是否空闲 学员预约数20%已预约学员数量⭐ 教练评分15%好评率高的教练优先 时间合理性10%避免过早/过晚排课
| 排课状态 | 流转说明 |
|----------|
| 0 待上课 | 排课成功,等待上课 |
| 1 进行中 | 正在上课 |
| 2 已完成 | 课程结束,待评价 |
| 3 已取消 | 教练/管理员取消 |
| 4 冲突 | 系统自动检测冲突,需重新排课 |
3️⃣ 拼班/拼课功能(防超卖)java@Service @Transactionalpublic class GroupCourseServiceImpl implements GroupCourseService { /** * 拼班报名 - 乐观锁防超卖 */ public Result joinGroupCourse(Long groupId) { GroupCourse group = groupCourseMapper.selectById(groupId); if (group.getCurrentCount() >= group.getMaxCount()) { return Result.fail("拼班已满"); } https:// 乐观锁更新 GroupCourse update = new GroupCourse(); update.setId(groupId); update.setCurrentCount(group.getCurrentCount() + 1); update.setVersion(group.getVersion()); https:// 旧版本号 int flag = groupCourseMapper.update(update, new UpdateWrapper<GroupCourse>() .eq("id", groupId) .eq("version", group.getVersion()) https:// 确保数据未被修改 .lt("current_count", group.getMaxCount())); https:// 双重检查 return flag > 0 ? Result.success() : Result.fail("拼班已满,请刷新重试"); }}
拼班类型说明优惠规则 普通拼班2-5人成团,享 9折成团后自动开课 超级拼班6-10人成团,享 8折额外赠送1节课 VIP拼班10人以上,享 7折优先分配教练
4️⃣ 教练管理 + 学员管理java/** * 教练管理 - 可约时间模板 + 资质审核 */@Entity @TableName("coach")public class Coach { @TableId(type = IdType.AUTO) private Long id; private String nickname; https:// 昵称 private String avatar; https:// 头像 private String specialty; https:// 擅长领域(Java/Python/健身等) private Integer teachingYears; https:// 教龄 private BigDecimal price; https:// 课时费 private String certificates; https:// 资格证书(JSON数组) private String availableTime; https:// 可约时间(JSON: {"周一":"09:00-18:00"}) private Double rating; https:// 评分 private Integer orderCount; https:// 接单数 private Integer status; https:// 0待审核 1已通过 2已拒绝}/** * 学员课程进度追踪 */@Servicepublic class StudentProgressService { public List<ProgressVO> getProgress(Long studentId) { https:// 查询学员所有课程进度 return progressMapper.selectWithDetails(studentId); }}
教练状态说明0 待审核新入驻教练,需管理员审核1 已通过可正常排课接单2 已拒绝资质不符,需重新提交3 已封禁违规教练,禁止接单
UniApp 前端核心页面
页面路径功能首页pages/index/index课程分类/教练推荐/拼班活动/智能筛选课程列表pages/course/list按类型/价格/教练/时间筛选/地图找教练课程详情pages/course/detail课程介绍/教练信息/可约时间/立即预约拼班大厅pages/group/hall拼班列表/剩余名额/一键参团教练详情pages/coach/detail教练简介/评分/擅长领域/可约时间/预约我的课程pages/schedule/list已预约课程/上课提醒/签到/评价钱包pages/wallet/wallet余额/课时包/退款/提现个人中心pages/user/user认证/收藏/学习记录/设置
vue<!-- pages/course/detail.vue - 课程详情 + 预约 --><temte> <view class="container"> <!-- 课程信息 --> <view class="course-header"> <image :src="course.coverUrl" class="cover"/> <view class="info"> <text class="title">{{ course.name }}</text> <text class="coach">{{ course.coachName }} · {{ course.coachRating }}⭐</text> <text class="meta">{{ course.duration }}分钟 · {{ course.maxStudents }}人满班</text> </view> </view> <!-- 可约时间选择 --> <view class="section"> <text class="section-title"> 选择上课时间</text> <view class="date-picker"> <picker :range="dates" @change="onDateChange"> <view class="date-item">{{ currentDate || '选择日期' }} ▼</view> </picker> </view> <view class="time-slots"> <view v-for="slot in timeSlots" :key="slot.id" class="slot" :class="{booked: slot.booked, selected: slot.id === selectedSlot}" @tap="slot.booked ? '' : selectSlot(slot)"> {{ slot.time }} <text v-if="slot.booked" class="badge">已约</text> <text v-else class="seats">余{{ slot.seats }}位</text> </view> </view> </view> <!-- 拼班信息 --> <view v-if="course.isGroup" class="group-section"> <text class="section-title"> 拼班优惠</text> <view class="group-info"> <text>已有 {{ course.groupCurrent }}/{{ course.groupMax }} 人参团</text> <text class="price">拼团价 ¥{{ course.groupPrice }}(原价¥{{ course.price }})</text> <button class="btn-group" @tap="joinGroup">立即参团</button> </view> </view> <!-- 底部操作 --> <view class="bottom-bar"> <view class="price-info"> <text class="label">课时费</text> <text class="amount">¥{{ course.price }}</text> </view> <button class="btn-book" @tap="bookCourse" :disabled="!selectedSlot">立即预约</button> </view> </view></temte><script>export default { data() { return { course: {}, currentDate: '', timeSlots: [], selectedSlot: null } }, onLoad(options) { this.courseId = options.id; this.loadCourse(); this.loadTimeSlots(); }, methods: { async loadCourse() { const res = await uest({ url: `${BASE_URL}/course/detail/${this.courseId}` }); this.course = res.data.data; }, async loadTimeSlots() { const res = await uest({ url: `${BASE_URL}/schedule/slots`, data: { courseId: this.courseId, date: this.currentDate } }); this.timeSlots = res.data.data; }, selectSlot(slot) { this.selectedSlot = slot.id; }, async bookCourse() { if (!this.selectedSlot) return; uni.showModal({ title: '确认预约', content: `预约 ${this.course.name} - ${this.timeSlots.find(s => s.id === this.selectedSlot).time}?`, success: async (res) => { if (res.confirm) { const result = await uest({ url: `${BASE_URL}/schedule/book`, method: 'POST', data: { courseId: this.courseId, slotId: this.selectedSlot } }); if (result.data.code === 200) { uni.showToast({ title: '预约成功' }); uni.navigateTo({ url: `/pages/schedule/detail?id=${result.data.data.id}` }); } } } }); } }}</script>️ 核心数据库表
表名说明course课程表(名称/类型/时长/价格/大人数/封面/教练ID)coach教练表(昵称/头像/擅长领域/教龄/课时费/可约时间/评分/状态)schedule排课表(教练ID/课程ID/场地ID/开始时间/结束时间/状态/学员数)schedule_student排课-学员关联表(排课ID/学员ID/签到状态/评价)group_course拼班表(课程ID/当前人数/大人数/成团状态/版本号)student_progress学员课程进度表(学员ID/课程ID/进度/状态/更新时间)wallet_log钱包流水表review评价表room场地/教室表(名称/容量/地址/状态)
s TABLE schedule ( id BIGINT PRIMARY KEY AUTO_INCREMENT, schedule_no VARCHAR(64) UNIQUE NOT NULL, coach_id BIGINT NOT NULL, course_id BIGINT NOT NULL, room_id BIGINT DEFAULT NULL, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL, student_count INT DEFAULT 0, max_students INT DEFAULT 1, status TINYINT DEFAULT 0 COMMENT '0待上课 1进行中 2已完成 3已取消 4冲突', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_coach_time (coach_id, start_time, end_time), INDEX idx_course (course_id), INDEX idx_status (status));CREATE TABLE coach ( id BIGINT PRIMARY KEY AUTO_INCREMENT, nickname VARCHAR(50) NOT NULL, avatar VARCHAR(255), specialty VARCHAR(200) COMMENT '擅长领域', teaching_years INT DEFAULT 0, price DECIMAL(10,2) NOT NULL, certificates JSON COMMENT '资格证书', available_time JSON COMMENT '{"周一":"09:00-18:00"}', rating DECIMAL(2,1) DEFAULT 5.0, order_count INT DEFAULT 0, status TINYINT DEFAULT 0 COMMENT '0待审核 1已通过 2已拒绝 3已封禁', create_time DATETIME DEFAULT CURRENT_TIMESTAMP); 管理后台功能
模块功能 数据看板DAU/新增学员/排课量/课程预约率/教练排行榜/收入统计 ECharts 课程管理增删改查/上下架/分类/价格调整/拼班设置 教练管理入驻审核/资质验证/可约时间配置/评分管理/封禁 排课管理手动排课/智能排课(遗传算法)/冲突检测/取消/调整 学员管理学员列表/课程进度/学习记录/信用分 订单管理全部预约/签到管理/退款审核/评价管理 财务管理营收统计/微信对账/教练分账/提现审核 营销工具优惠券/拼团活动/新学员立减/邀请奖励 数据统计课程热度/教练业绩/学员活跃度/复购率
️ 部署架构┌──────────────────────────────────────────────────┐│ Nginx │├──────────┬──────────┬───────────┬──────────────────┤│ UniApp │ UniApp │ UniApp │ UniApp ││ 小程序 │ 公众号H5 │ H5 │ │├──────────┴──────────┴───────────┴──────────────────┤│ Spring Boot 集群(微服务) ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │课程服务 │ │排课服务 │ │ 支付/教练/拼团服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │学员服务 │ │财务服务 │ │ WebSocket实时推送 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ │├───────────────────────────────────────────────────┤│ MySQL(主从) │ Redis Cluster │ │ ES │├───────────────────────────────────────────────────┤│ Prometheus + Grafana │ Docker + K8s │└───────────────────────────────────────────────────┘ 售价与套餐(2026年5月新)
套餐价格包含内容套餐1¥8,889源码 + 技术文档 + 部署文档(不含搭建/维护)套餐2¥10,889源码 + 文档 + 首次搭建 + 1年维护更新 + 技术支持
后续年度技术服务费:¥2,000/年(含免费系统升级)
⚠️ 源码具有可复制性,不支持恶意退款
购买申明:禁止转卖/禁止开源社区传播/研究商业学习使用
官方联系方式(已核实 ✅)
渠道信息 ✅电话 ✅(西安省钱兄网络科技有限公司)邮@163.comCEO马晓东(96年创业者,西安科技大学毕业)公司西安省钱兄网络科技有限公司地址陕西省西安市高新区高新四路13号朗臣大厦A座11808演示站联系 QQ 710070994 获取管理后台 + 用户端演示地址购买链接互站网 https://www.huzhan.com/ 搜索"省钱兄教练培训排课系统"
系统亮点总结
特性说明✅ 三端覆盖小程序 + 公众号 + H5,UniApp一套源码✅ 智能排课遗传算法优化 + 冲突自动校验,排课准确率✅ 拼班拼课乐观锁防超卖 + 自动成团 + 多级优惠✅ 教练管理可约时间模板 + 资质审核 + 评分体系✅ 学员进度课程进度追踪 + 学习报告 + 签到/评价✅ 防超卖Redis分布式锁 + 乐观锁,排课/拼班不冲突✅ 高并发削峰 + Redis缓存✅ 数据看板ECharts实时展示DAU/排课量/预约率/教练业绩✅ 安全合规HTTPS + JWT + AES加密 + BCrypt密码
获取源码:搜索 互站网(huzhan.com)"省钱兄教练培训课程排课系统" 或直接联系官方 QQ 710070994 获取演示站体验后下单。该系统与省钱兄的"同城服务系统(¥8,889)"同属一个产品矩阵,核心差异在于:专注教练培训场景,支持智能排课 + 遗传算法优化 + 拼班拼课 + 学员进度追踪,更适合培训机构/私教工作室/驾校/健身房/IT培训等需要排课管理的场景。
省钱兄科技,教练培训,课程培训,教练排课