背景
在消费升级和颜值经济的双重驱动下,中国美容市场规模持续扩大。然而,传统美容机构在运营过程中普遍存在以下问题: 预约方式落后:依赖电话或微信私聊预约,容易出现时间冲突、记录遗漏,且无法实时查看可预约时段。 信息传播低效:新店开业、促销活动、美容知识等信息主要通过朋友圈海报或口头传达,覆盖面窄,留存率低。 客户管理粗放:缺乏系统的客户档案和消费记录,难以进行精准的客户画像分析和二次营销。 核销统计繁琐:手工记账或Excel统计容易出错,财务对账困难,管理层难以获取实时的经营数据。 微信小程序的出现为上述问题提供了新的解决思路。其依托于微信庞大的用户基数,无需安装即可使用,极大地降低了用户的使用门槛,非常适合构建轻量级的O2O(Online To Offline)服务闭环。
研究意义
本课题的研究具有重要的理论价值和现实意义: 理论意义:探索了微服务架构在传统服务业数字化转型中的应用模式,丰富了基于小程序的行业应用案例研究。 现实意义: 提升用户体验:用户可随时随地浏览项目、预约服务,享受透明化、便捷化的服务流程。 提高管理效率:自动化处理预约冲突,数字化管理客户数据,大幅降低人工成本和管理误差。 增强营销能力:通过内容栏目(如美容小课堂)建立专业形象,增强用户粘性,促进转化。
国内外研究现状
目前,国内大型连锁美容机构多采用定制化的APP或SaaS系统进行管理,但高昂的开发和维护成本让中小微机构望而却步。现有的通用型预约软件往往功能固化,难以满足特定机构的个性化需求(如特定的核销流程、自定义栏目展示等)。基于微信小程序的垂直行业应用正处于快速发展期,但在美容细分领域,集内容展示、复杂预约规则、多级权限管理于一体的开源或低成本解决方案仍相对较少。
用户需求分析
系统主要涉及两类角色:普通用户(顾客)和系统管理员(店员/老板)。
- 普通用户:希望快速获取门店信息,方便地预约心仪的美容师和项目,并能随时查看预约状态。
- 系统管理员:需要灵活发布营销内容,高效管理预约排班,准确核销订单,并掌握经营数据。
系统架构设计
系统采用经典的B/S(Browser/Server)与C/S(Client/Server)混合架构。
- 表现层:微信小程序,负责页面渲染与用户交互。
- 网关层:Nginx(可选),负责反向代理与负载均衡。
- 业务逻辑层:SpringBoot应用,处理核心业务逻辑,如预约冲突检测、权限校验等。
- 数据访问层:MyBatis-Plus(ORM框架),负责与MySQL数据库交互。
- 数据存储层:MySQL 8.0,存储业务数据;本地文件或OSS存储图片/视频资源。
功能模块设计
主要数据表结构
| 字段名 | 类型 | 长度 | 说明 |
|---|---|---|---|
| id | BIGINT | 20 | 主键 |
| openid | VARCHAR | 64 | 微信OpenID |
| phone | VARCHAR | 20 | 手机号 |
| nickname | VARCHAR | 50 | 昵称 |
| avatar | VARCHAR | 255 | 头像URL |
| create_time | DATETIME | - | 注册时间 |
| 字段名 | 类型 | 长度 | 说明 |
|---|---|---|---|
| id | BIGINT | 20 | 主键 |
| name | VARCHAR | 100 | 项目名称 |
| category | VARCHAR | 50 | 分类(皮肤/身体等) |
| price | DECIMAL | 10,2 | 价格 |
| duration | INT | - | 预计时长(分钟) |
| status | TINYINT | 1 | 状态(上架/下架) |
| 字段名 | 类型 | 长度 | 说明 |
|---|---|---|---|
| id | BIGINT | 20 | 主键 |
| user_id | BIGINT | 20 | 用户ID |
| project_id | BIGINT | 20 | 项目ID |
| beautician | VARCHAR | 50 | 指定美容师 |
| appoint_date | DATE | - | 预约日期 |
| appoint_time_slot | VARCHAR | 20 | 时段(如 14:00-15:00) |
| code | VARCHAR | 32 | 核销码 |
| status | TINYINT | 1 | 状态(0:待核销 1:已完成 2:已取消) |
| create_time | DATETIME | - | 下单时间 |
| 字段名 | 类型 | 长度 | 说明 |
|---|---|---|---|
| id | BIGINT | 20 | 主键 |
| title | VARCHAR | 100 | 标题 |
| category_type | VARCHAR | 50 | 栏目类型 |
| content | TEXT | - | 富文本内容 |
| cover_img | VARCHAR | 255 | 封面图 |
| sort | INT | - | 排序权重 |
关键代码逻辑
public boolean checkAvailability(Long projectId, String date, String timeSlot) { // 1. 获取该项目在该时段的最大接待量 int maxCapacity = projectMapper.getMaxCapacity(projectId);
// 2. 统计该时段已预约且未取消的数量
int currentCount = appointmentMapper.countByProjectAndTime(projectId, date, timeSlot, Status.PENDING);
// 3. 判断是否溢出
return currentCount < maxCapacity;
}
UI设计
后台管理系统设计