1. 项目背景与核心需求
宠物咖啡馆作为近年兴起的新型业态,正在经历从单店经营到连锁化管理的转型。传统的手工记账、电话预约方式已经无法满足这类复合型业态的需求——它们既需要管理咖啡饮品库存,又要处理宠物寄养、美容等服务预约,还要兼顾会员积分和线上商城的运营。
我在为本地三家连锁宠物咖啡馆做技术咨询时发现,经营者普遍面临几个痛点:
- 预约信息通过微信沟通,容易遗漏或重复预订
- 宠物健康档案和消费记录分散在多个Excel表中
- 员工排班与宠物服务时段经常冲突
- 无法实时掌握库存情况导致频繁出现断货
这个SpringBoot+Vue的管理系统正是为解决这些问题而设计。它采用前后端分离架构,后端用Java+MySQL处理业务逻辑和数据持久化,前端用Vue实现响应式管理界面。特别之处在于:
- 独创的"宠物-服务-人员"三维关联模型
- 动态库存预警算法
- 可视化排班冲突检测
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术栈选型解析
2.1 为什么选择SpringBoot而非传统SSM
在2023年的Java生态中,SpringBoot 3.x已成为微服务开发的事实标准。本项目选用SpringBoot 3.1.5主要基于:
- 自动配置:省去大量XML配置(对比传统SSM)
- 内嵌Tomcat:简化部署流程
- Actuator端点:方便监控系统健康状态
- 与MyBatis的天然集成:通过mybatis-spring-boot-starter实现
注意:SpringBoot 2.7与3.x的主要区别在于Jakarta EE 9+支持,若需要兼容旧系统需谨慎选择版本
2.2 Vue 3组合式API的优势
前端选用Vue 3.2+主要考虑:
javascript复制// 组合式API示例 - 预约日历组件
import { ref, computed } from 'vue'
const appointments = ref([])
const doubleBooked = computed(() => {
// 检测时段冲突的逻辑
})
相比Options API,组合式API在复杂业务场景下:
- 逻辑关注点更集中
- 类型推断更友好(配合TypeScript)
- 自定义hook更容易复用
2.3 数据库设计关键点
MySQL 8.0的表设计特别注意了以下几点:
- 宠物档案表包含芯片号、疫苗记录等字段
- 服务项目表使用多级分类(洗护/医疗/寄养)
- 引入中间表处理多对多关系(如员工-技能)
sql复制CREATE TABLE `pet` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`owner_id` BIGINT NOT NULL,
`chip_number` VARCHAR(50) UNIQUE,
`vaccination_json` JSON, -- 存储疫苗记录的JSON数组
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
3. 核心功能实现细节
3.1 动态库存预警算法
传统库存管理只做简单阈值判断,我们实现了基于时间序列预测的智能预警:
java复制// InventoryAlertService.java
public List<InventoryItem> checkInventory() {
return inventoryMapper.selectAll().stream()
.filter(item -> {
double predictUsage = timeSeriesAnalyzer.predictWeeklyUsage(item.getId());
return item.getStock() < predictUsage * 1.2; // 保留20%余量
})
.collect(Collectors.toList());
}
算法考虑了以下因素:
- 历史消耗趋势(使用指数平滑法)
- 节假日特殊波动
- 关联商品的连带效应
3.2 排班冲突检测实现
使用位运算高效检测时间段重叠:
java复制// 将每天划分为96个15分钟时段,用long值表示排班
long staffSchedule = 0b000011110000...;
long petAppointment = 0b001100000000...;
if ((staffSchedule & petAppointment) != 0) {
throw new ConflictException("时段冲突");
}
前端配合Vue Draggable实现可视化调整:
vue复制<draggable
v-model="timeSlots"
group="schedules"
@change="checkConflict">
</draggable>
4. 典型业务场景解决方案
4.1 宠物服务全流程跟踪
从预约到完成的完整状态机设计:
mermaid复制stateDiagram
[*] --> 待确认
待确认 --> 已预约: 客户支付定金
已预约 --> 服务中: 签到
服务中 --> 已完成: 服务结束
已完成 --> 评价: 客户反馈
对应MyBatis的动态SQL实现:
xml复制<update id="updateServiceStatus">
UPDATE pet_service
<set>
<if test="status == 'CONFIRMED'">confirm_time=NOW()</if>
<if test="status == 'COMPLETED'">complete_time=NOW()</if>
</set>
WHERE id=#{id}
</update>
4.2 多维度统计报表
使用Vue ECharts展示的关键指标:
- 宠物品种分布雷达图
- 服务项目收入占比饼图
- 库存周转率趋势图
后端采用CQRS模式分离查询和命令:
java复制@Repository
public interface ReportQueryRepository {
@Query(nativeQuery = true, value = "SELECT breed, COUNT(*) FROM pet GROUP BY breed")
List<Map<String, Object>> getBreedDistribution();
}
5. 开发中的典型问题与解决
5.1 MyBatis枚举映射问题
当数据库存的是枚举的ordinal值时,需要自定义TypeHandler:
java复制public class PetTypeHandler extends BaseTypeHandler<PetType> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
PetType parameter, JdbcType jdbcType) {
ps.setInt(i, parameter.ordinal());
}
// 其他方法实现...
}
在mapper.xml中配置:
xml复制<resultMap id="petResultMap" type="Pet">
<result column="pet_type" property="type"
typeHandler="com.cafe.handler.PetTypeHandler"/>
</resultMap>
5.2 Vue路由权限控制
基于路由元信息的动态权限方案:
javascript复制// router.js
{
path: '/admin',
component: AdminPanel,
meta: { requiresAuth: true, roles: ['MANAGER'] }
}
// 全局前置守卫
router.beforeEach((to) => {
if (to.meta.requiresAuth && !store.state.user) {
return '/login'
}
})
6. 部署与性能优化
6.1 生产环境配置要点
application-prod.yml关键配置:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
redis:
cache:
time-to-live: 1h
前端打包优化:
bash复制# 按路由懒加载组件
vue-cli-service build --modern
6.2 缓存策略设计
采用多级缓存提升性能:
- 本地Caffeine缓存高频访问的宠物信息
- Redis缓存店铺营业数据
- HTTP缓存静态资源
java复制@Cacheable(value = "pets", key = "#petId")
public Pet getPetDetail(Long petId) {
return petMapper.selectById(petId);
}
7. 扩展与二次开发建议
- 微信小程序接入:使用uni-app封装核心功能
- 智能推荐:基于宠物品种推荐适配服务
- 物联网集成:连接智能喂食器等设备
- 大数据分析:客户消费行为画像
对于想学习完整实现的开发者,建议从这几个模块入手:
- 先跑通基础CRUD(宠物档案管理)
- 再研究状态机流转(服务流程控制)
- 最后分析复杂业务逻辑(冲突检测算法)
源码中特别值得关注的几个设计:
- PetServiceFacade中应用了门面模式
- 使用策略模式实现不同计费规则
- 审计日志采用AOP统一处理
