从0到99:健身房小程序开发日记(上)

2026微信小程序蓝牙使用(实战),以及订阅返回的数据进制转换(TS版) 页面进入后自动搜索蓝牙设备,名称与关键字完全一致则自动连接;否则需手动选择。连接后协商MTU,读取服务并订阅通知,方可按20字节分包、间隔20ms写入。安卓需开启定位权限。支持手动断开、停止搜索及重读服务,通信日志实时记录收发数据。 阅读详情

可研

随着移动互联网的普及和全民健身意识的提升,传统健身房的运营模式面临着数字化转型的需求。本文设计并实现了一款基于微信小程序和Spring Boot后端架构的健身房服务小程序。该系统旨在为会员提供便捷的课程预约、场地预订、资讯浏览及个人信息管理服务,同时为健身房管理者提供高效的内容维护、预约核销、用户管理及数据统计功能。系统采用前后端分离架构,前端使用微信小程序原生开发,后端基于Java Spring Boot框架,数据库选用MySQL 8.0+。测试结果表明,该系统有效提升了健身房的运营效率和会员的服务体验,实现了线上线下服务的闭环管理。

系统需求分析

栏目浏览模块
  • 小店动态:查看门店活动、促销套餐、课程更新等信息。
  • 健身干货:浏览训练技巧、动作教学、增肌减脂等专业知识。
  • 饮食科普:获取健身餐搭配、营养补充建议。
  • 荣誉资质:查看场馆资质、教练团队及荣誉评价。
  • 交互功能:支持详情查看、微信分享、关键词检索。
用户注册模块
  • 首次使用需填写年龄、姓名、车辆情况等基本信息。
  • 绑定微信账号,实现“一键登录”。
服务预约模块
  • 预约类型:私教预约、团课预约(瑜伽、动感单车等)、场地预约(拳击台、拉伸区)。
  • 预约展示:直观显示可预约时段及剩余名额。
  • 到店核销:生成核销二维码,管理员扫码确认到店。
个人中心模块
  • 我的预约:查看所有预约记录(已完成/进行中/已取消),支持取消操作。
  • 资料修改:更新联系方式、健身目标等个人信息。
  • 浏览历史:记录并回顾浏览过的内容。
  • 我的收藏:收藏感兴趣的课程或文章。
  • 在这里插入图片描述

总体设计

本系统采用前后端分离的开发模式,具体技术栈如下:
  • 前端:微信小程序(Native开发),使用微信开发者工具。
  • 后端:Java Spring Boot框架,提供RESTful API接口。
  • 数据库:MySQL 8.0+,存储业务数据。

开发工具:

  • IDE:IntelliJ IDEA (2023.2.1+)
  • 数据库管理:Navicat 16+
  • 小程序开发:微信开发者工具

系统架构设计

  • 表现层:微信小程序负责页面渲染和用户交互,后台管理端嵌入小程序中,通过权限控制访问。
  • 业务逻辑层:Spring Boot处理核心业务逻辑,如预约规则校验、核销状态更新、数据统计等。
  • 数据访问层:通过MyBatis框架操作MySQL数据库,实现数据的持久化存储。

数据库设计

字段名类型长度约束说明
idBIGINT20PK, AI主键ID
openidVARCHAR64NOT NULL, UNIQUE微信OpenID
nameVARCHAR50姓名
ageINT3年龄
phoneVARCHAR20联系电话
vehicle_infoVARCHAR100车辆情况
fitness_goalVARCHAR255健身目标
create_timeDATETIME注册时间
statusTINYINT1DEFAULT 1状态(1正常 0禁用)
字段名类型长度约束说明
:—:—:—:—:—
idBIGINT20PK, AI主键ID
nameVARCHAR100NOT NULL项目名称
typeTINYINT1NOT NULL类型(1私教 2团课 3场地)
descriptionTEXT项目描述
max_capacityINT最大容纳人数
sort_orderINTDEFAULT 0排序权重
is_availableTINYINT1DEFAULT 1是否可用
rule_descVARCHAR500预约规则说明
字段名类型长度约束说明
idBIGINT20PK, AI主键ID
user_idBIGINT20FK用户ID
project_idBIGINT20FK项目ID
reserve_dateDATENOT NULL预约日期
time_slotVARCHAR50NOT NULL预约时段
verify_codeVARCHAR64UNIQUE核销二维码字符串
statusTINYINT1DEFAULT 0状态(0待核销 1已完成 2已取消)
create_timeDATETIME创建时间
verify_timeDATETIME核销时间
字段名类型长度约束说明
idBIGINT20PK, AI主键ID
categoryTINYINT1NOT NULL分类(1动态 2干货 3饮食 4荣誉)
titleVARCHAR200NOT NULL标题
contentLONGTEXT正文内容(支持HTML)
cover_imageVARCHAR255封面图URL
view_countINTDEFAULT 0浏览量
publish_timeDATETIME发布时间
字段名类型长度约束说明
idBIGINT20PK, AI主键ID
usernameVARCHAR50NOT NULL, UNIQUE用户名
passwordVARCHAR100NOT NULL加密密码
roleTINYINT1NOT NULL角色(1超级管理员 2普通管理员 3核销员)
statusTINYINT1DEFAULT 1状态
last_loginDATETIME最后登录时间

核心代码


@RestController
@RequestMapping("/api/reservation")
public class ReservationController {

    @Autowired
    private ReservationService reservationService;

    @PostMapping("/create")
    public Result create(@RequestBody ReservationDTO dto, HttpServletRequest request) {
        // 从Session或Token中获取当前用户ID
        Long userId = UserContext.getCurrentUserId(request); 
        return reservationService.createReservation(userId, dto.getProjectId(), dto.getDate(), dto.getTimeSlot());
    }

    @PostMapping("/verify")
    public Result verify(@RequestParam String code, HttpServletRequest request) {
        // 获取当前管理员ID
        Long adminId = AdminContext.getCurrentAdminId(request);
        return reservationService.verifyReservation(code, adminId);
    }
}

@Service
public class ReservationService {

    @Autowired
    private ReservationMapper reservationMapper;
    
    @Autowired
    private ProjectMapper projectMapper;

    /**
     * 创建预约
     */
    @Transactional(rollbackFor = Exception.class)
    public Result createReservation(Long userId, Long projectId, String date, String timeSlot) {
        // 1. 检查项目是否存在及可用
        Project project = projectMapper.selectById(projectId);
        if (project == null || project.getIsAvailable() == 0) {
            return Result.error("该项目不可预约");
        }

        // 2. 检查该时段剩余名额
        int bookedCount = reservationMapper.countByProjectAndSlot(projectId, date, timeSlot);
        if (bookedCount >= project.getMaxCapacity()) {
            return Result.error("该时段名额已满");
        }

        // 3. 生成核销码
        String verifyCode = UUID.randomUUID().toString().replace("-", "");

        // 4. 插入预约记录
        Reservation reservation = new Reservation();
        reservation.setUserId(userId);
        reservation.setProjectId(projectId);
        reservation.setReserveDate(DateUtil.parse(date));
        reservation.setTimeSlot(timeSlot);
        reservation.setVerifyCode(verifyCode);
        reservation.setStatus(0); // 待核销
        
        reservationMapper.insert(reservation);

        return Result.success("预约成功", verifyCode);
    }

    /**
     * 扫码核销
     */
    public Result verifyReservation(String verifyCode, Long adminId) {
        Reservation reservation = reservationMapper.selectByVerifyCode(verifyCode);
        if (reservation == null) {
            return Result.error("无效的核销码");
        }
        if (reservation.getStatus() != 0) {
            return Result.error("该预约已" + (reservation.getStatus() == 1 ? "完成" : "取消"));
        }

        // 更新状态为已完成
        reservation.setStatus(1);
        reservation.setVerifyTime(new Date());
        reservationMapper.updateById(reservation);

        return Result.success("核销成功");
    }
}

UI设计

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后台管理系统设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Git代码

点击下载

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档) SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心... 立即下载

相关推荐

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

CnOpenData 线上招聘网站信息数据

CnOpenData线上招聘网站信息数据库是一个覆盖中国主流招聘平台、时间跨度长、更新频率高的劳动力市场需求侧大数据集合。本数据库汇集了,为学术界和业界提供了一扇实时观察中国劳动力市场动态的窗口。

CnOpenData_wj的博客 2629

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

微信小程序:下拉刷新事件

环节配置位置关键项开启app.json的window(全局)或页面.json(局部)样式同上监听页面.js停止页面.js易错点提醒触发后若不手动调用,下拉 loading 会一直转不停。

dreams_dream的博客 249

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

微信小程序-动态设置页面标题

这是最直接、最常用的方式。你可以在页面的任意生命周期函数或事件处理函数中调用它。(function, 可选):调用结束的回调(无论成功或失败)。例如,从列表页跳转到详情页时,根据传入的参数动态显示不同的标题。(function, 可选):接口调用成功的回调。(function, 可选):接口调用失败的回调。(string, 必填):你想设置的新页面标题。这个 API 非常适合用在。

dreams_dream的博客 189

YOLOv8损失函数升级:从CIoU到Wise-IoU v3的实战调优与避坑指南

本文详细介绍了如何将YOLOv8的损失函数从CIoU升级到Wise-IoU v3,以提升目标检测性能,特别是在小目标检测和样本不均衡场景下的表现。通过实战调优步骤和避坑指南,帮助开发者有效应用Wise-IoU v3的动态聚焦机制和单调性控制,显著提升模型精度和训练稳定性。

weixin_33737774的博客 590

微信小程序-wxs

在微信开发者工具中右键创建.wxs后缀的文件。每个.wxs文件也是一个独立模块,同样使用导出内容。示例(文件return d;FOO: foo,bar: bar(外联定义参考官方文档)

dreams_dream的博客 347

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2192

GraphRAG 踩坑记录

GraphRAG踩坑记录

yufanwenshu的博客 4351

如何快速实现微信小程序 累计独立访客 (UV) > 100,解锁流量主

本文分享如何快速达成微信小程序100+累计独立访客(UV)以解锁流量主资格。尽管门槛低,但对内向开发者而言推广难。作者呼吁网友扫码支持,既助力变现,也积累开发经验。建议通过社交裂变、内容引流或合作互推等方式高效获客,实现低成本突破流量瓶颈。

抬头30°的微笑的专栏 28

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

微信小程序 chooseImage 后 uploadFile 失败:先核 uploadFile 合法域名与表单字段,再查大小超时与临时路径

相册选图成功、临时路径也有了,一调 wx.uploadFile却报、超时或服务端收不到文件——这和今日已写的、知乎侧「审核被拒先对类目/隐私/测试账号」,以及一串 WordPress / WooCommerce 专题(CDN 静态 404、优惠券无效、DB 连接、CPT 404、评论转圈、站内搜索、.maintenance)。——先核与name,再查,别把「request 域名通了」当成上传也通了。

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 111

【信息科学与工程学】信息科学领域——第一百三十三篇 半导体器件物理与电子封装01

③ 载流子浓度:n=∫Ec​∞​gc​(E)f(E)dE,f(E)=1+exp((E−EF​)/kB​T)1​,非简并时 n=Nc​exp(−kB​TEc​−EF​​),Nc​=2(ℏ22πme∗​kB​T​)3/2。简并时需用Fermi-Dirac积分 F1/2​(η)=π​2​∫0∞​1+ex−ηx​​dx,n=Nc​π​2​F1/2​(η),η=(EF​−Ec​)/kB​T。对于低维系统:2D g2D​(E)=πℏ2m∗​Θ(E−Ec​),1D g1D​(E)=πℏ1​E2m∗​​。

weixin_49199313的博客 552

Android 12 大屏时底下显示任务栏以及虚拟按键靠右问题

Android 12 点大屏时,底下导航栏变成显示任务栏,虚拟按键靠右的分析以及修改

Android系统开发笔记 4686

微信小程序中全局配置路由loading友好提示【不影响项目内已有的配置】

今天改造一个旧小程序项目,项目内页面跳转涉及接口请求的才有loading的友好提示,其余页面的纯跳转页面并未有oading加载友好提示,所以新建配置文件在app.js中注入使用,/*** 【* 单页面路由跳转,有使用showLoading的则继续使用单页面的loading,* 反之使用全局配置友好loading加载提示......* 】* 统一路由跳转增强(app.js 启动期调用 patchWxNavigation() 生效)。

眼中世界在己 251

高通8155源码下载与Android源码编译

一.下载代码 高通下载源码位置: Qualcomm CreatePoint 注册账号,然后登入 可以先选择edit -> infotainment -> sa8155 -> favorites, 点击View TOC就可以过滤出sa8155所有的信息目录.如下图 拉取代码链接在ChipCode中,点击进去可以看到所有的基线版本,选择你需要下载的版本点进去,如sa8155p-la-1-0_ap_standard_oem,把高通专有代码和开源代码都下载到本机. 1..

Johnny2004的专栏 7675

微信小程序:页面事件-上拉触底

上拉触底是移动端的专有名词,通过手指在屏幕上的上拉滑动操作,从而加载更多数据的行为。

dreams_dream的博客 206

【人工智能】向量数据库全生命周期数据安全防护体系:破解向量化与检索双环节泄露风险

大模型时代,向量数据库已成为RAG(检索增强生成)架构、语义检索、多模态应用的核心基础设施,解决了大模型幻觉、长上下文窗口限制、私有知识落地等核心痛点。但行业普遍存在认知误区:将Embedding向量等同于“无害的语义压缩乱码”,忽视了向量数据原生的泄露风险。

奶爸的编程之路,也就一周冷个三天 159

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

微信小程序:页面导航

页面导航指的是页面之间的相互跳转。

dreams_dream的博客 350

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

微信小程序节日订座口头占桌当晚放空或两拨抢桌:先核定金锁桌与免费取消时限,再查宽限期自动释放

节假日火锅店最怕两种场面:客人口头订了三桌,当晚一桌都没来,黄金时段空转;或者两拨人都说「订过这桌」,前厅经理现场调解,空桌又不敢放给等位的人。这和今早已发的,以及昨日 优快云 的,还有知乎侧「材料预检不过不放正式号」「维修单未确认不开工」。——先核与,再查,别把「名额支付锁」「寄养续住档期」或「私教改期日历」当成桌位也不会空转。

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 259

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Web移植微信小程序样式崩塌全解:从类名静默降级到样式契约与尺寸锁死防御

本文复盘Web端页面移植微信小程序时遭遇的静默样式崩塌问题,剖析因类名契约断裂、可替换元素默认几何及组件Shadow隔离导致的六处UI异常。提出“样式契约1:1映射”与“可替换元素尺寸锁死”双轨防御方案,通过显式声明布局与尺寸,实现像素级还原,杜绝无报错降级,总结出跨端移植的第一性原理:结构同构与显式约束。

艺杯羹的博客 409

《基于微信小程序的居家医疗陪护预约系统设计与实现》

本系统基于微信小程序设计居家医疗陪护预约平台,涵盖管理员、患者/家属、陪护人员三类角色,实现资质认证、服务预约、订单管理、在线聊天、签到记录、模拟支付及评价投诉等功能。特色在于订单与聊天联动、服务全过程记录与投诉监管闭环,业务流程完整,技术栈成熟(SpringBoot+Vue3+MySQL),功能实用且适合作为计算机专业毕业设计项目。

192

微信小程序真机正常但体验版白屏或 request:fail:先核合法域名与 TLS,再清缓存与基础库

真机预览一切正常,切到却白屏,或控制台反复 request:fail(域名不在合法名单、TLS、超时一类)——这和今日写过的 Cloudflare Flexible SSL /、WordPress 后台极慢 Heartbeat / 修订 / autoload、WooCommerce 结账空白 / 支付按钮无反应、Allowed memory size exhausted、Shopify 库存售罄错位、WooCommerce 运费不显示 / 运费为 ¥0、

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 399

微信小程序宠物寄养口头续住撞仓或加收扯皮:先核档期冲突拒绝与节假日加收,再查续住点验与退押联动

还有知乎侧「材料预检」「维修开工确认」

20年技术经验|专注小程序+外贸独立站|已服务500家企业,分享创业中有趣的产品和技术经验。 185
上一篇: 从0到1:基于微信小程序的博物系统开发日记(一)
下一篇: 从0到100,基于微信小程序的旅游景区服务平台开发笔记(上篇)
X202022
博客等级 码龄6年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值