SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路

SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路

这是一套基于 Spring Boot 的美容院管理系统源码,配套 db.sql 建表脚本,业务覆盖美容项目预约、美容用品销售、购物车、订单流转、收货地址、库存销量统计,以及技师/前台/会员三类内部角色的业绩统计。形态是前后台双端:前台是顾客和会员用的商城站,后台是管理员、技师、前台三类员工各自的管理台。本文带你看清里面有什么、怎么跑起来,附的每张截图都来自真实跑起来的环境。

目录

一、你是不是也这样 二、这套是什么 三、对你具体有什么用 四、怎么跑起来 五、里面有什么


一、你是不是也这样

毕设源码大致分两类:一类做得太糙,通篇增删改查,功能模块章写不满;另一类做得太大,微服务、消息队列、分布式事务全堆上,答辩前根本调不通。

这套美容院管理系统卡在中间,而且有个别家少见的地方 :五套角色 。管理员管全部,普通用户能买能约,会员能约能买还有消费统计,技师只看自己手上的预约和业绩,前台管客户和业绩。每套角色是一张独立的用户表 、一个独立的登录接口 、一套独立的菜单。

这一点对论文特别有用。「角色权限划分」「系统用例分析」是毕设标配,很多同学写的时候没真做,只能靠嘴编。这套是真做了 的 ------ 源码里 config.js 把五个角色的 backMenu(后台菜单)和 frontMenu(前台菜单)分开配,每个角色能看到什么、能点什么都在这一个文件里。

还有一点值得说:业务不是纯电商,是「预约 + 销售」两条线并行。美容项目要走「选项目 → 填预约详情 → 指定技师 → 技师/前台审核 → 会员看审核结果」,美容用品走「看详情 → 加购物车 → 结算 → 发货」,两条线共用同一套订单、购物车、地址表。论文中写「多业务线建模」比写商城有东西。

有三处得提前说清楚,都是我们跑之前修掉、再重新验证过的:数据库脚本里的图片路径写死 http://localhost:8080/...(换端口或域名会全裂);购物车和订单两张表没有种子数据(导完是空列表,正常);config 表里的轮播图指向三个 picture*.jpg,但源码包里这三个文件根本不存在(75 张上传图片里一张都没有)。

最后一句适配度:你要的是纯后台管理系统(只有管理员一个角色、没有顾客前台),这套不匹配,前台那 86 个页面是它一半的工作量。做美容院、医美、美发店这类「到店服务 + 零售」正合适。

图:前台首页 ------ 顶部蓝色标题栏「美容院管理系统」,下面一排导航:首页、美容用品、美容项目、用户预约信息、会员预约信息、个人中心、后台管理、购物车。再往下是 DATA SHOW 区块的六张美容品卡片(标价 99.9 RMB)。轮播区空白,原因见第五节。

二、这套是什么

项目名:美容院管理系统

技术形态:Spring Boot 2.2.2 + JDK 1.8 + MyBatis-Plus 2.3 单体应用,后端 Java + MySQL,前台 layui 静态站、后台 Vue 单页应用(编译产物嵌在工程里),前后台两套页面

交付清单

  • 源码工程:springbootsw863 目录,232 个 Java 文件、24356 行,可直接运行、可改业务
  • db.sql:27 张表建表脚本 + 141 行种子数据,导完库直接点
  • 论文.doc :6 章正文 + 12 张界面图 + 13 张建表说明(.doc,用 WPS 打开)
  • 说明文档.txt:前后台地址、连接串、配置位置
  • 75 张演示图片 :static/upload/ 下,头像、项目图、商品图都在

⛔ 这个包没有 PPT,也没有开题报告。

规模数字(均可复现)

指标 数值 统计方式
Java 文件数 232 `find src/main/java -name "*.java" \
Java 代码行数 24356 同上 `-exec cat {} + \
Controller / REST 接口 28 / 315 mapping 注解 342 条 − 类级路径前缀 27 条
数据库表 / 种子数据 27 / 141 行 db.sql 里 CREATE TABLE 与元组计数
前台页面 / 后台视图组件 86 / 60 front/front/pages/ 的 HTML 数 / 后台 src/views/ 的 .vue 数
后台业务模块 / Mapper 28 / 28 views/modules/ 子目录数 / mapper/ 的 xml 数
用户体系 5 套 token 表的 tablename + 5 个 generateToken 调用点

⛔ 答辩要能当场说清三件事:315 不是 342 (只有 27 个 Controller 带类级 @RequestMapping 前缀,CommonController 的 9 个端点挂在根路径下);141 行数据不是 141 条 INSERT ;27 张表里有 10 张是统计表(月/年消费、月/年业绩 × 用户/会员/技师/前台/美容项目)

系统架构

图:系统架构 ------ 第一层是 5 个角色入口(管理员 users / 普通用户 putongyonghu / 会员 huiyuan / 技师 jishi / 前台 qiantai),第二层是 Spring Boot 2.2.2 + JDK 1.8 + MyBatis-Plus 的 28 个 Controller、315 个 REST 端点,第三层是 MySQL 的 27 张表和 141 行演示数据。

数据库设计

27 张表按业务分五组,字段名和中文注释都从 db.sql 解析:

图:账号与角色组 ------ users(管理员 5 字段)、token(令牌 8 字段)、putongyonghu(普通用户 12 字段)、huiyuan(会员 12 字段)、jishi(技师 12 字段)、qiantai(前台 11 字段)。五张用户表字段几乎一样,差别只在账号列名。

图:美容项目与用品组 ------ meirongbuwei(美容部位 3 字段)、meirongxiangmu(美容项目 12 字段)、meirongyongpin(美容用品 12 字段)、kucunxinxi(库存 7 字段)、xiaoliangxinxi(销量 7 字段)。

图:预约与消费统计组 ------ yonghuyuyuexinxi(用户预约信息 13 字段)、huiyuanyuyuexinxi(会员预约信息 12 字段),加上用户和会员的月/年消费统计各 6 个字段。预约表里的 sfsh(是否审核)和 shhf(审核回复)是审核流关键。

图:业绩统计组 ------ 美容项目月/年统计(9 字段)、技师月/年业绩统计(7 字段)、前台月/年业绩统计(7 字段)。技师表记服务次数和业绩额,前台表记拉拢客户人数。

图:订单与系统配置组 ------ orders(订单 18 字段)、cart(购物车 10 字段)、address(地址 7 字段)、config(配置文件 3 字段)。订单表里 tablename 存「买的哪张表的商品」,一套订单表能装用品和项目。

⛔ 源码没写数据库外键,关联全靠业务字段表达,ER 图只标字段不画关系线。

三、对你具体有什么用

1. 五套角色,论文的「权限设计」章直接有素材

图:后台用户预约信息管理 ------ 左边是首页、个人中心、普通用户管理、会员管理、技师管理、前台管理、美容用品管理、美容项目管理、两类预约管理、美容部位管理、销量信息管理、库存信息管理...... 中间表格的列有索引、项目名称、账号、姓名、手机、照片、预约时间、预约详情、指定技师、审核回复、审核状态,行尾是「审核」链接。可见行是项目名称 1 到 4。

把这张图和前面的前台首页放一起讲,「系统设计」章就有了对比素材:同一个预约实体,在前台是带照片的卡片,在后台是带 11 列和「审核」按钮的表格行。五个角色各自能干什么,源码里写得清清楚楚:

角色 能管什么
管理员 用户、会员、技师、前台、美容用品、美容项目、两类预约、美容部位、销量、库存,加 12 张统计表
技师 美容用品、美容项目、两类预约的查看,自己和项目的月/年业绩统计
前台 普通用户、会员、两类预约(可审核)、自己的月/年业绩统计
会员 美容用品、美容项目(可预约)、自己的预约、订单
普通用户 美容用品、美容项目(可查看)、自己的预约

答辩老师问「怎么区分岗位权限」,你就指着这张表念 ------ 每行都有真实的接口前缀 (/jishi、/qiantai、/huiyuan......),不是口头描述。

2. 两条业务线都跑通了,撑得起功能模块章

图:前台美容项目列表 ------ 顶部是项目名称搜索框和「搜索」按钮,下面六张项目卡片,每张带项目图、项目名称和会员姓名,对应 meirongxiangmu 表六行种子数据。

预约这条线的链路:

复制代码
顾客/会员:看美容项目列表(meirongxiangmu/list) → 进详情页
  ↓ 点「用户预约」/「会员预约」→ onAcrossTap 把项目塞进 localStorage,跳到预约表单
  ↓ 填预约时间、预约详情、指定技师 → POST yonghuyuyuexinxi/add
  ↓ 落库:项目名 / 账号 / 姓名 / 手机 / 照片 / 预约时间 / 预约详情
         / 指定技师 / sfsh(默认'否') / shhf / userid
技师或前台:后台「用户预约信息管理」→ 点「审核」→ 改 sfsh 和 shhf
  ↓ 会员在「会员预约信息」里看到审核结果(通过 / 不通过 + 审核回复)

「跨表提交」这个设计值得单独讲一句 ------ 预约页不是从美容项目页复制字段,而是这样:

复制代码
onAcrossTap(acrossTable){
    localStorage.setItem('crossTable',`meirongxiangmu`);
    localStorage.setItem('crossObj', JSON.stringify(this.detail));
    jump(`../${acrossTable}/add.html?corss=true`);
}

翻译成人话:点哪个项目就带着哪个项目跳到预约表单 ,表单页从 localStorage 取项目信息预填,一个接口都不用新写。

销售那条线跟普通商城一样跑通:

复制代码
顾客:美容用品列表(meirongyongpin/list) → 详情页
  ↓ 点「添加到购物车」→ 先 GET cart/list 查重(已加过就提示)
  ↓ 没加过 → POST cart/save(带 userid)
  ↓ 结算页 shop-order/confirm.html → 选收货地址(address/list)
  ↓ POST orders/save → 未支付 → 已支付 → 已发货 → 已完成
管理员:「已支付订单」点「发货」→「已发货订单」点「确认收货」

图:前台美容用品列表 ------ 搜索区三个筛选框:美容品名、适用年龄、美容部位。下面六张商品卡片,每张带实拍图、美容品名和 99.9 RMB 的价格。

3. 一个筛选框能筛所有模块

所有业务 Controller 的分页方法都是同一句三段套:

复制代码
PageUtils page = meirongxiangmuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, meirongxiangmu), params), params));

拆成三句话(utils/MPUtil.java 里逐个方法都能对上):likeOrEq ------ 值里带 % 走 LIKE 模糊查,否则走 = 精确查;between ------ 字段名以 _start 结尾就大于等于,以 _end 结尾就小于等于;sort ------ sort 参数指定排列,order=desc 就倒序。

实际效果就是:加一个价格区间筛选不用改后端 ,前端多传 price_start 和 price_end 两个参数。前台美容用品那三个筛选框的搜索条就是这套的产物。

4. 通用统计接口,加报表不用写新端点

CommonController 是 28 个 Controller 里最特殊的一个,它的 9 个接口把表名和列名放在路径参数里:

  • /option/{tableName}/{columnName} 取某列下拉选项 /follow/... 联动下拉
  • /sh/{tableName} 按条件查一条 /remind/{tableName}/{columnName}/{type} 查待办数量
  • /cal/... 某列求和 /group/... 某列分组计数 /value/... 两列统计出图表数据

实际价值:要加统计报表,不用写新接口,改个参数就行 。统计「各美容项目销量」打 /group/xiaoliangxinxi/meirongpinming,「美容用品总销售额」打 /cal/orders/total。

⛔ 但表名是前端传进来的字符串,没做白名单校验。答辩被问到就正面讲「我用的是通用接口设计,代价是表名要加白名单,这是我下一步要改的」------ 主动说清楚代价,比被问出来强得多。

5. 十张统计表,把业绩管理这一章撑起来

美容院这种生意,论文中「业绩统计」绕不开。这套直接给了 10 张现成的统计表,字段对称:

统计对象 月统计表 年统计表 记的是什么
普通用户 yonghuyuexiaofeixinxi yonghunianxiaofeixinxi 账号、姓名、性别、消费额
会员 huiyuanyuexiaofeixinxi huiyuannianxiaofeixinxi 会员账号、会员姓名、性别、消费额
技师 jishiyueyejitongji jishinianyejitongji 技师工号、姓名、性别、服务次数、业绩额
前台 qiantaiyueyejitongji qiantainianyejitongji 前台账号、姓名、性别、拉拢客户人数、业绩额
美容项目 meirongxiangmuyuetongji meirongxiangmuniantongji 项目名称、照片、美容部位、统计日期、价格、销量、销售额

「拉拢客户人数」这个字段名很说明问题 ------ 前台的 KPI 不只是成交额,还有拉新;技师看的是服务次数,绩效口径是「做了多少次」不只看金额。论文写「统计报表模块设计」时可以画一张这十张表的对照图,说明「同一套统计口径按月/年、按对象两个维度展开成十张表」。

6. 论文和代码对得上

论文目录是六章:绪论、开发环境、系统分析、系统设计、系统实现、系统测试。系统实现那章按角色分 5 小节 ------ 管理员(美容部位管理、销量统计、已支付订单)、技师(美容用品库存统计、预约信息管理)、前台(普通用户管理、会员管理)、普通用户(美容用品、购物车、我的订单)、会员(美容项目、预约信息管理),共 12 张界面图。

我们核过论文文档列的 13 张建表说明,和 db.sql 的建表语句逐条对得上 :文档说美容项目表有项目名称、项目图片、美容部位、适用年龄、项目价格、详情、开始时间、技师工号、技师姓名、联系电话,meirongxiangmu 表的字段名和中文注释一模一样。论文第 3 章的 5 张用例图也和 config.js 的 5 个角色菜单逐条对得上。

⛔ 有两处论文和代码对不上,答辩时反而是加分项。一是表数量 :论文 4.3.2 列了 13 张表,源码 db.sql 实际有 27 张 ------ 论文没写 10 张统计表,也没写 config(系统配置)和 token(令牌)这两张运行时必需的表。标准答案是:论文写的是业务主干表,统计表和运行时表是配套补充 。二是技术栈 :论文第二章把 JSP 列进了开发环境,但源码里一个 JSP 文件都没有,前端是 layui 静态页 + Vue 编译产物,别说漏嘴。

7. 三个能写进「展望」的真实改进点

源码里藏着三个明摆着的改进点,是论文展望章节的好素材(答辩可以正面讲,别贬低项目):

预约记录的用户隔离是后端按角色做的,但没做数据级过滤。 YonghuyuyuexinxiController 的前台列表方法:

复制代码
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("putongyonghu")) {
    yonghuyuyuexinxi.setZhanghao((String)request.getSession().getAttribute("username"));
}

普通用户登录后只看得到自己账号下的预约,会员走 huiyuanyuyuexinxi 同理。改法:不管什么角色都强制按 userid 过滤,别依赖角色名判断。

订单总价是前端算的,后端只存不校验。 结算页 shop-order/confirm.html:

复制代码
totalPrice: function() {
    var total = 0;
    for (var item of this.dataList) {
        total += item.price * item.buynumber
    }
    return total;
},

算完连同 total、discounttotal 一起发给后端,后端 OrdersController#save 只做了插入,没有重算金额、没有校验余额 (那行 ValidatorUtils.validateEntity 是注释掉的),余额扣减也在前端算。改法:后端按 goodid 重查单价再算总额。

库存和销量表不会随订单自动更新。 全仓库只有 KucunxinxiController 和 XiaoliangxinxiController 自己引用自己的 Service,订单链路里没有一处去减库存或加销量 ------ 库存和销量是独立维护的报表数据 。改法:在订单落库的 Service 方法里加一个 @Transactional 的扣库存动作,顺便把「核心写操作没事务」这个坑补了。

另外还能做:口令改成 BCrypt 加盐哈希,预约时间做前后台双重校验。

四、怎么跑起来

第 1 步:建库导脚本

复制代码
# 建库(库名必须和代码里写死的一致)+ 导脚本 + 验证应该出 27 张表
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS springbootsw863 DEFAULT CHARACTER SET utf8;"
mysql -uroot -p < db.sql
mysql -uroot -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='springbootsw863';"

⛔ 导完先数表:27 张。其中 users 1 行、token 3 行、config 4 行 ------ 种子数据本来就少,不是导失败。meirongxiangmu 7 行(其余业务表各 6 行),共 141 行。cart 和 orders 导完是空的 ------ 有表没数据,正常。

第 2 步:改数据源配置

application.yml 里改三行,密码换成你自己的(共 52 行):

复制代码
spring:
    datasource:
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springbootsw863?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
        username: root
        password: 你的数据库密码

⚠️ 改端口要改 3 处,不止 application.yml :front/front/modules/http/http.js 里 2 处、front/front/js/config.js 里 1 处。只改它,后台能开、前台一片白。

⚠️ 图片路径也是写死的。 db.sql 里的商品图、项目图、预约照片、会员头像都是 http://localhost:8080/springbootsw863/upload/xxx.jpg 这种绝对地址。文件都在 static/upload/ 里(75 张 jpg,一个不缺),换了端口或域名就全裂图。

⚠️ 首页轮播图那三张是真的没有。 config 表里 picture1/picture2/picture3 三行指向 upload/picture1.jpg 这类文件名,但 static/upload/ 下一个 picture* 文件都没有。

⚠️ pom.xml 里有个依赖要删。 com.microsoft.sqlserver:sqljdbc4:4.0 已从 Maven Central 下架,mvn package 会报依赖找不到,删掉整个 <dependency> 块就行。

第 3 步:启动

复制代码
mvn clean package -DskipTests && java -jar target/*.jar

启动后访问前后台两个地址(必须带完整 index.html,根路径 404):

复制代码
前台:http://localhost:8080/springbootsw863/front/index.html
后台:http://localhost:8080/springbootsw863/admin/dist/index.html

五、里面有什么

MyBatis-Plus 配置(答辩能答) :db-column-underline: true 让驼峰实体自动对上下划线字段;id-type: 1 表示主键由用户输入;field-strategy: 2 是「非空才更新」,改一个字段不会把别的冲成 null;logic-delete-value: -1 配了逻辑删除。

运行验证与演示数据分布

本文所有截图都来自真实部署的环境(导入 27 张表 / 141 行种子数据),逐张核对过:前台六张商品卡片图片全部正常,价格都是 99.9 RMB;后台用户预约信息管理能看到四行以上数据和「审核」按钮;普通用户个人中心能看到账号、姓名、性别、手机、身份证、头像、积分 10000、余额 100。购物车和我的订单为空,是这两张表没种子数据。

图:工程规模与演示数据分布 ------ 上排是 232 个 Java 文件、24356 行、28 个 Controller、315 个 REST 端点、27 张表、141 行演示数据;下表是各表行数分布。

功能模块全景

图:28 个业务模块的接口前缀和端点数 ------ 五个角色登录接口各 16 个端点(登录/注册/增删改查/个人信息),十二张统计表各 11 个端点,通用接口 9 个、轮播图 8 个、文件上传 2 个。

答辩注意

  • 别照抄论文文档里的性能数字。 论文第 6 章「系统测试」写的响应时间和并发节点数是作者当时的测试环境,你复现不了,说「论文中的实测数据代码里没法复现」比硬报数字安全。
  • pom.xml 里有两个声明了但源码没用的依赖 (shiro-spring、protobuf-java),鉴权走自写拦截器加 token 表,照实说是加分项;<name> 还是 springboot-schema,老师会问。
  • 源码里有四套同义实体(entity / view / vo / model,27 + 24 + 24 + 24 个),是代码生成器的产物。问起就说「视图实体给列表页用,VO 给前端传参」。
  • com/utils/MD5Util.java 写了但一次都没被调用,密码是明文存库明文比对。答辩主动说是「下一步要改的」比被问出来强。

二次开发空间

改起来最省力的几处:换店名和主题色(改 config.js 的 projectName 和 css/)、加护理项目品类(照着 meirongbuwei 加字典表挂到 meirongxiangmu 上)、接会员等级(照着 huiyuan 的积分/余额加等级表)、加预约排班日历(meirongxiangmu 已有 kaishishijian 字段,缺的是技师时间轴视图)。想练手建议从后端金额重算 + 预约时间校验开始 ------ 改动量小,能把「安全」「数据一致性」讲清楚。


本文基于 springbootsw863 源码逐文件整理,代码片段为原文摘录,统计数字与截图均来自真实运行环境。

下一篇想拆哪套?留言告诉我编号,我按顺序排上 ------ 还有一批没拆。

相关推荐
装不满的克莱因瓶1 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba
文丑颜不良啊1 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊1 小时前
LeetCode2321~2340题目解析
java·leetcode
驭渊的小故事2 小时前
Spring AOP 核心概念与通知类型详解
java·后端·spring
vipxieliang2 小时前
ValidX vs 手写验证代码:开发效率对比实测
java·spring boot·后端
vipxieliang2 小时前
虚拟线程与 GraalVM:Spring Boot 3.x 云原生性能跃迁
java·spring boot·后端
Rain的Java大神之路2 小时前
面试官最烦的答案:“我用 Redis + Token”!接口幂等 8 种方案 + 四层防御,把重复扣款工单干到 0
java·后端·面试
Rainmicro3 小时前
【无标题】
java·数据库·算法
驭渊的小故事3 小时前
Spring AOP 入门:从 AOP 概念到第一个耗时统计切面
java·后端·spring