petpetgo项目

petpetgo项目

目 录

1. 系统概述

本次设计课题为PetPetGo 一站式宠物服务平台,采用 B/S 前后端分离架构,分为微信小程序用户端与PC 店铺管理后台两大终端,配套 MySQL 8.0 数据库存储全部业务数据。

平台业务定位

面向三类角色:

  1. 养宠用户(小程序):在线浏览宠物店服务、宠物商品,预约美容 / 医疗 / 寄养,下单购物、查看订单、查阅宠物养护 AI 百科、收藏门店。
  2. 宠物店管理员(PC 后台):管理店铺信息、员工、服务项目、商品库存、预约单、订单、用户评价、数据营收报表。
  3. 平台超级管理员:统一管理全部门店、审核开店申请、查看平台整体经营数据。

技术整体架构

后端:SpringBoot 3.3.3 + MyBatis-Plus + MySQL8.0

小程序前端:uni-app + Vue2

PC 管理端:Vue2 + ElementUI + ECharts(数据可视化)

中间件:Redis、MinIO 图片存储、WebSocket 实时消息推送

数据库:MySQL 8.0,统一逻辑删除、事务管控、多维度索引优化。

数据库承载业务

数据库存储用户、店铺、员工、宠物、服务、商品、预约、订单、退款、评价、新闻、购物车、收藏、排班、库存、报表等 30 余类业务数据,支撑增删改查、多条件分页、多维统计、预约冲突校验、库存预警等核心数据操作。

2. 需求分析

2.1 行业业务痛点

  1. 传统宠物店无数字化工具:电话预约混乱、撞单无法管控,员工排班人工记录易出错。
  2. 商品库存依靠手工登记,库存不足无法提前预警,缺货影响经营。
  3. 用户无线上渠道查看服务价格、真实评价,门店获客成本高。
  4. 经营数据手工统计,营收、服务销量、客单价核算效率极低。
  5. 养宠人群缺少专业养护资讯与实时咨询渠道。

2.2 功能性需求

(1)用户模块需求

  1. 用户注册、登录,密码 MD 加密存储;
  2. 用户信息新增、修改、拉黑(黑名单);
  3. 用户收货地址增删改查;
  4. 用户宠物档案管理(品种、疫苗、病史等);
  5. 用户收藏店铺 / 服务 / 商品、浏览足迹记录。

(2)店铺模块需求

  1. 平台管理员新增 / 编辑 / 查询全部门店;
  2. 店铺基础信息维护(名称、地址、营业状态、服务标签);
  3. 开店申请审核管理。

(3)员工管理需求

  1. 员工信息增删改查、离职 / 复职状态切换;
  2. 员工技能绑定(美容 / 医疗等技能、等级划分);
  3. 员工月度排班管理,按日期存储可服务时段;
  4. 员工接单量、服务评分数据统计。

(4)服务模块需求

  1. 服务标签分类管理(美容、医疗、寄养);
  2. 门店自定义服务项目增删改查,设置价格、时长;
  3. 服务时段配置,限制单时段最大接待人数;
  4. 员工与服务绑定,预约时筛选可服务人员。

(5)商品与库存需求

  1. 商品分类、商品上下架管理;
  2. 库存调整(增减库存)、库存低于阈值自动预警;
  3. 商品销量、评分统计。

(6)预约 & 订单 & 退款需求

  1. 用户提交服务预约,后台确认 / 取消 / 标记爽约;
  2. 商品订单创建、支付、取消全流程;
  3. 退款申请提交、商家审核同意 / 拒绝;
  4. 订单多条件筛选(时间、状态、支付方式)。

(7)评价、资讯模块

  1. 用户下单后可发表图文评价,后台隐藏 / 恢复评价;
  2. PC 端发布宠物科普新闻,小程序展示、点赞;
  3. 新闻评论管理,违规评论隐藏删除。

(8)数据统计需求

  1. 月度店铺营收、服务 / 商品收入占比;
  2. 服务销量排行、商品销量排行;
  3. 店铺评分、用户评价星级分布统计。

3. 数据库设计

(1)概念结构设计

核心实体及属性

  1. 用户 pet_user_profile

user_id (主键)、user_type、phone、password、nick_name、real_name、is_black、contact_address

  1. 店铺 pet_shop

shop_id (主键)、shop_name、shop_phone、province、city、shop_status、owner_id

  1. 员工 pet_employee

emp_id (主键)、shop_id、user_id、position、employee_status、entry_date

  1. 宠物 pet_info

pet_id (主键)、owner_id、pet_name、pet_type、breed、vaccine_expire

  1. 服务标签 pet_service_tag

tag_id (主键)、tag_name、tag_category、status

  1. 门店服务 pet_shop_service

service_id (主键)、shop_id、tag_id、service_name、price、service_status

  1. 商品 pet_product

product_id (主键)、shop_id、product_name、price、stock、status

  1. 服务时段 g_service_schedule

schedule_id、shop_id、service_id、time_slot、max_capacity

  1. 预约 pet_service_appointment

appointment_id、shop_id、service_id、pet_id、emp_id、appointment_status

  1. 订单 pet_order

order_id、order_no、shop_id、user_id、order_status、pay_status

  1. 订单详情 pet_order_detail

detail_id、order_id、item_type、product_id/service_id、quantity

  1. 评价 pet_review

review_id、order_id、shop_id、rating、content

  1. 新闻 pet_news

news_id、title、content、publish_time

  1. 购物车 g_cart

cart_id、user_id、shop_id、product_id/service_id、quantity

  1. 收藏 g_favorite

favorite_id、user_id、shop_id/service_id/product_id

实体间关系

  1. 用户 (1) — 宠物 (N):一对多,一个用户多只宠物
  2. 店主用户 (1) — 店铺 (N):一对多
  3. 店铺 (1) — 员工 (N):一对多
  4. 店铺 (1) — 服务 (N) / 商品 (N):一对多
  5. 服务标签 (1) — 服务 (N):一对多
  6. 店铺服务 (1) — 时段 (N):一对多
  7. 员工 (N) — 服务 (N):多对多(中间表 g_service_employee)
  8. 用户 (1) — 购物车 (N) / 收藏 (N):一对多
  9. 用户 (1) — 订单 (N) / 预约 (N):一对多
  10. 订单 (1) — 订单详情 (N):一对多
  11. 订单 (1) — 评价 (1):一对一
  12. 员工 (N) — 技能标签 (N):多对多(中间表 g_employee_skill)

(2)逻辑结构设计

全部数据表遵循第三范式 3NF,消除传递依赖,拆分冗余字段,通过外键 ID 关联,冗余字段仅用于前端展示(如 shop_name、user_name,减少联表查询)。

数据表分类

  1. 用户相关表:pet_user_profile、pet_user_address、pet_info、g_favorite、g_cart
  2. 门店基础表:pet_shop、pet_shop_apply
  3. 员工相关表:pet_employee、g_employee_skill、g_employee_schedule
  4. 服务相关表:pet_service_tag、pet_shop_service、g_service_schedule、g_service_employee
  5. 商品库存表:pet_product
  6. 交易业务表:pet_service_appointment、pet_order、pet_order_detail、pet_refund
  7. 评价资讯表:pet_review、pet_news、g_news_comment
  8. 统计报表中间表:g_report_shop_monthly、g_report_income_composition

核心表逻辑结构示例

(1)用户表 pet_user_profile

(2)店铺表 pet_shop

(3)订单表 pet_order

(3)物理结构设计

1. 数据库参数

数据库名:petku

数据库版本:MySQL 8.0.27

存储引擎:InnoDB(支持事务、外键、行锁)

字符集:utf8mb4(兼容 emoji、中文)

排序规则:utf8mb4_0900_ai_ci

2. 通用物理规范

  1. 所有表增加is_deleted char(1) DEFAULT '0'逻辑删除,禁止 DELETE 物理删除;
  2. 每张表统一 create_time、update_time、create_by、update_by 审计字段;
  3. 主键统一 bigint 自增,业务唯一标识(手机号、订单号)建立唯一索引;
  4. 高频查询条件(shop_id、user_id、status、is_deleted)建立普通索引;
  5. 多条件联合查询建立联合索引(idx_shop_year_month);
  6. 金额统一 decimal (10,2) 防止浮点精度丢失;

3. 索引设计示例

-- 用户手机号唯一索引

UNIQUE INDEX `idx_phone`(`phone`)

-- 店铺+年月联合索引(报表统计专用)

UNIQUE INDEX `idx_shop_year_month`(`shop_id`, `stat_year`, `stat_month`)

-- 分页筛选常用索引

INDEX `idx_shop_id`(`shop_id`)

INDEX `idx_status`(`status`)

INDEX `idx_is_deleted`(`is_deleted`)

4. 完整性约束

  1. 主键约束:每张表主键自增,唯一标识单条记录;
  2. 唯一约束:手机号、订单号、退款单号不重复;
  3. 非空约束:业务核心字段(手机号、店铺名、价格)NOT NULL;
  4. 默认约束:状态字段默认 0(正常 / 营业);
  5. 外键逻辑约束:代码层实现店铺、用户关联校验,数据库不强制外键锁提升并发;
  6. 域完整性:订单状态、用户类型使用固定字符枚举限制。

4. 数据库实施与维护

4.1 数据库创建语句

4.2 完整性约束实现示例

1.非空 + 默认约束(用户表)

2.唯一索引防止重复手机号注册

3.订单号全局唯一

4.3 存储过程、游标设计

存储过程 1:按月统计店铺营收

功能:输入 shop_id、年份月份,自动统计服务收入、商品收入、毛利润,插入月度报表表

存储过程 2:库存预警批量查询

输入阈值,查询库存低于阈值的商品,返回商品列表

游标单独示例:遍历黑名单用户

4.4 数据库备份与维护方案

  1. 定时备份:使用 mysqldump 每日凌晨全量备份 petku 库,保留 7 天备份文件;
  2. 日志维护:开启 binlog 二进制日志,故障可基于时间点恢复;
  3. 定期优化:每月执行 OPTIMIZE TABLE 清理碎片;
  4. 数据清理:超过 1 年的历史订单、报表归档备份,不删除业务主表数据;
  5. 权限管控:开发账号仅 DML 权限,生产账号禁止 DROP/ALTER 操作。

5. 系统实现

  1. 界面设计

(1) 界面设计

本项目分为PC 管理后台与微信小程序用户端两套界面,采用前后端分离开发,页面风格统一简约,适配 PC 大屏与手机移动端,全部界面依托 MySQL 数据库提供数据支撑。

① PC 管理端界面(Vue2+ElementUI)

  1. 登录 / 注册页面

账号密码输入框、验证码模块,登录请求携带账号密码 MD5 加密参数调用/user/pclogin接口,校验数据库用户表pet_user_profile账号信息,验证成功返回 Token。

<image reference_id="4-17" titles="PC管理登录页"/> <image reference_id="4-18" titles="PC注册页面"/>

  1. 首页数据报表界面

使用 ECharts 图表渲染订单趋势、营收占比、商品 / 服务销量排行,所有图表数据从统计存储过程、订单表、商品表聚合查询得来,可视化展示数据库统计结果。

<image reference_id="4-16" titles="报表数据大屏"/>

  1. 用户管理页面(宠物主 / 黑名单)

分页列表展示数据库pet_user_profile数据,支持昵称、手机号模糊查询,提供拉黑 / 解除拉黑操作,操作后更新用户表is_black字段。

<image reference_id="4-19" titles="宠物主列表页"/>

  1. 员工管理界面

读取pet_employee员工表,支持新增、编辑、离职状态修改,配套员工技能矩阵页面关联g_employee_skill多对多中间表数据。

<image reference_id="4-20" titles="员工列表"/> <image reference_id="4-36" titles="员工技能矩阵"/>

  1. 服务 & 服务时段管理

读取pet_shop_service服务表、g_service_schedule时段表,支持新增服务、配置每日预约容量,修改时段最大人数同步更新数据库。

<image reference_id="4-22" titles="服务列表"/> <image reference_id="4-23" titles="服务时段配置"/>

  1. 商品 & 库存管理

展示pet_product商品表库存数值,库存预警页面筛选库存低于阈值的数据,支持批量调整库存,直接更新表中stock字段。

<image reference_id="4-24" titles="商品列表"/> <image reference_id="4-32" titles="库存预警页面"/>

  1. 订单、预约管理页面

分页查询pet_order订单表、pet_service_appointment预约表,支持按时间、订单状态筛选,可修改订单流程状态,同步写入数据库时间字段。

<image reference_id="4-25" titles="订单列表"/> <image reference_id="4-27" titles="预约日历弹窗"/>

  1. 新闻发布页面

后台编辑新闻富文本,提交后插入pet_news表,通过 WebSocket 推送至小程序端。

<image reference_id="4-30" titles="新闻发布页"/>

② 小程序端界面(uni-app)

  1. 登录首页:用户手机号密码登录,校验数据库用户信息。

<image reference="4-4" titles="小程序登录页"/> 2. 首页服务、商品浏览:查询`pet_shop_service`、`pet_product`表展示热门数据。 <image reference="4-5" titles="小程序首页"/> 3. 宠物百科AI问答:前端传递问题调用AI接口,知识库数据存储在`pet_news`。 <image reference="4-33" titles="宠物百科首页"/> <image reference="4-34" titles="AI对话界面"/> 4. 购物车、订单、预约页面:操作同步修改`g_cart`、`pet_order`、预约表数据。 <image reference="4-12" titles="购物车"/> <image reference="4-35" titles="预约日历"/>

(2) 系统功能模块实现

1)用户登录模块

数据库交互逻辑

  1. 前端接收手机号、密码,密码进行 MD5 加密;
  2. 后端执行 SQL:SELECT * FROM pet_user_profile WHERE phone = ? AND is_deleted = '0';
  3. 对比数据库存储的加密密码,匹配成功生成 JWT Token 返回;
  4. 登录成功更新用户last_login_time字段。

核心后端代码(MyBatis-Plus)

6. 结果分析

6.1 基础 CRUD 功能测试

  1. 新增测试

测试用户、店铺、商品、员工等实体新增接口,传入合法参数后,数据库对应表正确插入记录,必填字段非空约束生效,未传空值字段填充默认值;传入缺失必填参数时,后端拦截,无脏数据入库。

  1. 修改测试

编辑接口仅更新传入字段,不修改其他原有数据;状态切换(商品上下架、员工离职)可正常更新对应 status 字段,数据修改后数据库实时更新。

  1. 逻辑删除测试

所有删除接口仅更新is_deleted='1',无物理删除记录;查询接口均携带is_deleted='0'条件,删除后列表不再展示数据,数据库原始记录完整保留,支持数据追溯。

  1. 简单 / 复杂查询测试

单条件分页查询响应速度快;多表联查订单详情、员工技能数据关联正确,关联表数据匹配无错乱;模糊搜索(店铺名、昵称)可精准匹配结果。

6.2 存储过程与游标测试

  1. 执行proc_stat_shop_month,输入店铺 ID、年月,游标自动遍历当月全部已支付订单,自动汇总服务收入、商品收入并插入月度报表表,报表数据与手工逐笔计算金额完全一致,统计逻辑无误。
  2. 执行cur_black_user游标存储过程,成功遍历所有拉黑用户并输出用户 ID、昵称,批量遍历功能正常,适用于批量导出黑名单场景。
  3. proc_get_warning_goods输入预警阈值 10,正确筛选库存小于等于 10 的上架商品,库存预警页面数据与存储查询结果完全匹配。

6.3 完整性约束测试

  1. 非空约束:插入数据时不传手机号、店铺名称等 NOT NULL 字段,数据库抛出异常,后端捕获提示参数错误,防止空核心数据入库。
  2. 唯一索引:使用重复手机号注册用户,唯一索引idx_phone拦截,报错账号已存在,避免重复用户。
  3. 默认约束:新增商品不传 status,数据库自动填充1(上架);新增用户is_black默认 0,符合业务默认规则。
  4. 域约束:订单状态仅允许 00、01 等规定字符,传入非法字符时后端拦截校验,保证数据规范。

6.4 索引性能对比测试

测试环境:模拟万条订单数据

  • 未创建shop_id+create_time联合索引:按店铺 + 月份查询耗时约 1100ms;
  • 创建联合索引后,相同查询耗时缩短至 45ms;

结论:针对高频筛选字段建立联合索引可大幅提升查询效率,过多单索引会降低插入更新性能,本项目仅为常用查询字段创建索引,平衡读写性能。

6.5 事务并发测试

模拟多用户同时下单购买同一件商品,并发请求下事务生效,库存扣减原子化,不会出现库存负数、超卖问题;同一服务时段多人预约时,事务校验最大容量,超出限制无法新增预约,并发数据一致性得到保障。

6.6 全系统业务连通测试

小程序端完成注册、预约、下单操作,PC 管理后台实时查询到对应用户、预约、订单数据;PC 端发布新闻,小程序消息推送弹窗正常,两端数据基于同一 MySQL 库实时同步,整套系统数据库交互稳定,全部业务流程无数据错乱、丢失问题。