SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

这是一套基于 Spring Boot 的服装销售平台源码,配套 db.sql 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是前后台双端:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑起来,附的每张截图都来自真实跑起来的环境。

目录

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


一、你是不是也这样

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

这套「衣依」服装销售平台卡在中间,而且有个别家少见的结构:前后台是分开的两个站点。

前台是顾客视角:首页轮播图、商品推荐、分类筛选、商品详情、加入购物车、结算、收货地址、订单跟踪、评价、收藏、在线客服。

后台是管理员视角:商品上下架、分类颜色尺码维护、订单发货退款、评价审核、轮播图配置、用户管理。前台 42 个页面,后台 21 条路由。

这一点对论文特别有用。「系统架构」「角色权限划分」「前后台分离」这几章是毕设标配,很多同学写的时候没真做,只能靠嘴编。这套是真做了 的 ------ 源码里 menu.js 把管理员和用户的菜单分开配,管理员后台 8 组模块,前台只对登录用户开放订单和收藏。

有三处得提前说清楚,都是我们跑之前修掉、再重新验证过的:数据库脚本里的图片路径写死 http://localhost:8080/...(换端口或域名会全裂);购物车和收藏建好了但没有种子数据(导完是空列表,正常现象);配置表里没有百度地图和人脸对比的密钥,那两个第三方接口默认必然报错。

最后一句适配度:你要的是纯后台管理系统(只有管理员一个角色、没有顾客前台),这套不匹配,前台那 42 个页面是它一半的工作量。做电商、商城、服装零售方向正合适。

图:前台首页 ------ 顶部「衣依服装销售平台」和首页/商品信息/商品资讯/个人中心/后台管理/购物车/在线客服七个导航,往下是 SALE 轮播图和「商品名称」搜索框,再往下是「Recommend 商品信息推荐」的七张商品卡片,底部「HOME NEWS 商品资讯」六条标题。

二、这套是什么

项目名:衣依服装销售平台

技术形态:Spring Boot 单体应用,后端 Java + MySQL,前台 layui 静态站、后台 Vue 单页应用(编译产物都嵌在工程里),前后台两套独立页面

业务领域:服装零售的线上销售 ------ 商品展示、规格选择、订单结算、订单流转、收货评价、售后退款,外加资讯和客服

交付清单

  • 源码工程:springboot4r3y8 目录,144 个 Java 文件、13399 行,可直接运行、可改业务
  • db.sql:16 张表建表脚本 + 82 行种子数据,导完库直接点着看
  • 论文.doc :6 章正文 + 15 张界面图 + 14 张建表说明,可参考论文结构(旧版 .doc 格式,用 WPS 或 LibreOffice 打开)
  • 说明文档.txt:前后台地址、数据库连接串、配置位置,跑之前先看

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

规模数字(均可复现)

指标 数值 统计方式
Java 文件数 144 `find src/main/java -name "*.java" \
Java 代码行数 13399 同上 `-exec cat {} + \
Controller / REST 接口 17 / 180 全部 mapping 注解 196 条 − 类级路径前缀 16 条
数据库表 / 种子数据 16 / 82 行 db.sql 里 CREATE TABLE 与元组计数(14 条 INSERT)
前台页面 / 后台组件 42 / 38 front/front/pages/ 的 HTML 数 / 后台 src/views/ 的 .vue 数
演示图片 55 张 jpg static/upload/ 下(另有一个 0 字节的 test 占位文件)

⛔ 答辩要能当场说清三件事:

  • 180 不是 196 ------ 17 个 Controller 里只有 16 个带类级 @RequestMapping 前缀,CommonController 的 9 个端点挂在根路径下
  • 82 行数据不是 14 行 ------ 每条 INSERT 都插多行
  • 144 个 Java 文件不含测试类 ------ src/test 下还有一个

本文环境版本

Spring Boot 2.2.2.RELEASE、JDK 1.8、MyBatis-Plus 2.3、hutool 4.0.12、fastjson 1.2.8 ------ 前五项都出自 pom.xml;MySQL 5.7(8.0 也能跑,db.sql 是 5.7 导出的);后台是 Vue 2.6.10 + Element UI 2.13.0,出自 admin 的 package.json。

系统架构

图:系统架构 ------ 前台 layui 商城和后台 Vue 管理台两个入口,往下是 17 个 Controller、180 个 REST 端点,鉴权靠拦截器查 token 表,再往下是 MySQL 的 16 张表和 82 行演示数据。管理员和用户是两张独立用户表,菜单按角色分支生成。

数据库设计

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

图:用户与鉴权组 ------ users(管理员 5 字段)、token(登录令牌 8 字段)、yonghu(前台用户 9 字段),字段全列。token 表的 tablename 存的是「令牌属于哪张用户表」。

图:商品与规格组 ------ shangpinxinxi(商品 12 字段,列关键 9 个)、shangpinfenlei(分类 3 字段)、yanse(颜色 3 字段)、chima(尺码 3 字段),后三张全列。

图:交易与订单组 ------ orders(订单 18 字段,列关键 9 个)、cart(购物车 10 字段,列关键 9 个)、address(收货地址 7 字段全列)、dingdanpingjia(订单评价 13 字段,列关键 9 个)。

图:互动与内容组 ------ discussshangpinxinxi(商品评论 7 字段)、news(商品资讯 6 字段)、chat(客服留言 7 字段)。

图:系统配置与收藏组 ------ config(轮播图参数 3 字段)和 storeup(我的收藏 7 字段)。

⛔ 源码没写数据库外键 (FOREIGN_KEY_CHECKS=0 导出的脚本本来就不带),关联全靠业务字段表达,所以 ER 图只标字段不画关系线。

三、对你具体有什么用

1. 前后台双端,结构上就比单后台的工程大一圈

图:后台商品信息管理 ------ 左边是首页/个人中心(修改密码、个人信息)和用户管理、商品分类管理、颜色管理、尺码管理、商品信息管理、订单评价管理、系统管理、订单管理;上面是商品名和品牌两个筛选框,中间表格的列有商品名称、商品分类、图片、品牌、颜色、尺码、价格,行尾是详情、修改、查看评论、删除四个按钮。

把这张图和前面的前台首页放一起讲,「系统设计」章就有了对比素材:同一个商品实体,在前台是带缩略图的卡片,在后台是带七个字段的表格行。

后台表格还能看到商品带分类、品牌、颜色、尺码四个维度。服装类和普通商品系统的区别就在这 ------ 一件衣服有 S/M/L 三种尺码、三四种颜色,数据库要么拆成多张规格表,要么像这套一样拆成几张字典表由主表挂上。论文讲「多规格商品的数据建模」很合适。

2. 一条完整的交易链路,撑得起论文的功能模块章

复制代码
顾客:注册/登录(yonghu) → 首页推荐位(shangpinxinxi/autoSort)
  ↓ 筛选(list) → 商品详情(detail/{id}) → 加购物车(cart/add)
  ↓ 改数量/删 → 结算页(shop-order/confirm.html) 选收货地址(address/list)
  ↓ 生成订单(orders/add) → 未支付 → 已支付 → 已发货 → 已完成
  ↓ 收货后评价(dingdanpingjia/add,带 sfsh 审核位) → 商品评论(discussshangpinxinxi/add)
管理员:商品上下架 + 字典维护 → 订单发货/退款(orders/update) + 评价审核

六个订单状态在代码里是六条真实分支,不是标签页摆设:未支付的显示「支付」「取消」,已支付的显示「退款」,已发货的显示「确认收货」,已完成和已退款的没有按钮。每个状态对应哪些操作是写死在模板里的条件判断,答辩翻到那行就能指给老师看。

图:前台「我的订单」------ 已完成标签页下那条种子订单:订单编号 202141013535068581766,商品「歌莉娅2021年春新款卫衣」带商品图,单价 399 RMB,数量 2,总价 798.00 RMB,地址「广东省佛山市禅城区祖庙街道季华五路金海广场」,电话 12312312312,收货人陈一。

3. 商品的「智能排序」接口,加推荐位不用写新后端

首页推荐位不走普通列表,走的是专门的 shangpinxinxi/autoSort:

复制代码
@IgnoreAuth
@RequestMapping("/autoSort")
public R autoSort(@RequestParam Map<String, Object> params,ShangpinxinxiEntity shangpinxinxi, HttpServletRequest request,String pre){
    ...
    params.put("sort", "clicknum");
    params.put("order", "desc");
    PageUtils page = shangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shangpinxinxi), params), params));
    return R.ok().put("data", page);
}

翻译成人话:推荐位 = 按点击次数倒序 ,而且带 @IgnoreAuth(全工程 21 处),游客打开首页不用登录也有内容。商品表里有个 clicknum 字段,详情接口每次被访问都会 setClicknum(+1)。

⛔ 这个闭环我们实测验证过:db.sql 里 7 个商品的 clicknum 种子值是 2、4、4、5、12、12、4,而首页七张卡片的实际显示顺序正是按这个值倒序。

论文写「个性化推荐模块」这章不用接推荐算法,写清楚「基于点击热度的推荐位实现」就行。

4. 通用查询工具,一个筛选框能筛所有模块

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

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

拆成三句话(utils/MPUtil.java 里逐个方法都能对上):

  • likeOrEq:筛选框的值里带 % 走 LIKE 模糊查,否则走 = 精确查
  • between:字段名以 _start 结尾就大于等于,以 _end 结尾就小于等于
  • sort:参数 sort 指定排列,order=desc 就倒序

实际效果就是:加一个价格区间筛选不用改后端 ,前端多传 price_start 和 price_end 两个参数。后台商品信息管理那个筛选框就是这套的产物。

5. 通用统计接口,加报表不用写新后端

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

  • /option/{tableName}/{columnName} 取某列的下拉选项
  • /follow/... 联动下拉
  • /sh/{tableName} 改状态字段
  • /cal/... 某列求和
  • /group/... 某列分组计数
  • /value/... 两列统计

实际价值:要加统计报表,不用写新接口,改个参数就行 。统计「各分类的商品数」打 /group/shangpinxinxi/shangpinfenlei,统计「商品总销售额」打 /cal/orders/total。

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

⛔ 这套接口不是摆设 :后台「订单评价管理」页的「统计报表」按钮实际调的就是 group/dingdanpingjia/pingfen(dingdanpingjia/list.vue 第 492 行)。

6. 评价和评论是两套机制,细节能写进论文

很多毕设里评价和评论混为一谈,这套分开:

  • dingdanpingjia(订单评价):挂订单编号 ,带评分、评价图片、评价内容、评价日期,还有 sfsh(是否审核)和 shhf(审核回复)字段 ------ 带审核流的评价
  • discussshangpinxinxi(商品评论):挂 refid(关联商品 id),有评论人和回复内容 ------ 挂在商品页的评论

图:后台订单评价管理 ------ 上面是订单编号、商品名称、评分三个筛选框和「删除」「统计报表」两个按钮,中间表格的列有订单编号、商品名称、商品分类、评分、添加图片、评价日期、用户名、联系电话、审核回复、审核状态,最后一列是「审核」链接。可见行是订单编号1 到 4、用户名1 到 4,审核状态「通过」。

两套数据业务含义不同,论文中分开写一段「评价体系设计」比混着讲清楚得多。

7. 论文和代码对得上

论文目录是六章:系统概述、相关技术、系统分析、系统概要设计、系统详细实现、系统测试。详细实现那章按角色分两节 ------ 管理员模块(商品信息、尺码信息、商品分类管理)和用户模块(首页、商品、订单管理),配 7 张图。

我们核过论文文档列的 14 张建表说明,和 db.sql 的建表语句逐条对得上 :文档说地址信息表有地址、是否默认地址,address 表就是这七列;文档说订单信息表有订单编号、商品表名、数量、折扣价格、总价、状态、地址、收货人,orders 表字段名和中文注释一模一样。论文摘要里那段管理员模块清单,也和 menu.js 的管理员菜单数组逐条对得上。

⛔ 有一处论文和代码不一致,但答辩时反而是加分项 :论文 4.3.2「数据库设计表」那节列了 14 张表,源码 db.sql 实际有 16 张 ------ 论文没写 config(轮播图参数)和 token(登录令牌)这两张运行时必需的表。老师问「论文表和代码表数量怎么对不上」,标准答案是:论文写的是业务表,token 和 config 是框架附带的运行时表。

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

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

订单总价是前端算的,后端只存不校验。 结算页 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#add 只做了插入,没有重算金额、没有校验余额 (那行 ValidatorUtils.validateEntity 是注释掉的),余额扣减也在前端。改法很直接:后端按 goodid 重查一次单价再算总额,前端传的金额只作展示。

用户隔离是前端传参做的,不是后端强制。 前台查订单时把 userid 塞进查询条件:

复制代码
layui.http.request('orders/list', 'get', {
    page: 1,
    limit: this.limit,
    userid: localStorage.getItem('userid'),
    status: vue.status
}, function(res) { ... });

userid 来自登录时写进浏览器本地的值。改成后端从 session 取 userId(拦截器登录成功时已放进去了),前端就不用传这个参数。

口令是明文存库的。 yonghu 表的 mima 字段直接存明文,登录时也是明文比对。换成 BCrypt 加盐哈希,是最实在也最容易讲清楚的一步。

另外还能做:订单超时未支付自动关单、收藏表加唯一索引防重复收藏。

四、怎么跑起来

第 1 步:建库导脚本

复制代码
# 创建数据库(库名必须和代码里写死的一致)
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS springboot4r3y8 DEFAULT CHARACTER SET utf8;"

# 导脚本,再验证应该出 16 张表
mysql -uroot -p < db.sql
mysql -uroot -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='springboot4r3y8';"

⛔ 导完先数表:16 张。其中 users、orders 各 1 行,token 3 行,config 4 行 ------ 种子数据本来就少,不是导失败。其余九张业务表各 6 到 8 行,总共 82 行。

⛔ cart 和 storeup 导完是空的 ------ 建表脚本里有但没插种子数据,正常。

第 2 步:改数据源配置

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

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

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

⚠️ 图片路径也是写死的。 db.sql 里的商品图、资讯图、评价图、头像、轮播图都是 http://localhost:8080/springboot4r3y8/upload/xxx.jpg 这种绝对地址,一共 33 个不重复的图片名,文件都在 static/upload/ 里(55 张 jpg,一个不缺)。换了端口或域名就全裂。

⚠️ 两个第三方接口默认必然报错。 config 表种子里只有轮播图地址和 homepage 四行,没有 baidu_ditu_ak / APIKey / SecretKey,而 CommonController 里直接 .getValue() 取值,取不到就抛空指针,所以地图逆地理和百度人脸对比用不了。

第 3 步:启动

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

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

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

常见报错

  • 前台一片白、接口全 404:只改了 application.yml 的端口,同步改 http.js 和 config.js 三处
  • 图片全裂:图片地址还指着 localhost,批量替换 db.sql 里的 8080 端口
  • Unknown database :库名写错,必须是 springboot4r3y8
  • 前台购物车是空的:源码包里这张表没有种子数据,正常,不是包坏了
  • 访问根路径 404 :漏了 context-path,所有请求都要带 /springboot4r3y8

五、里面有什么

MyBatis-Plus 配置(答辩能答)

application.yml 里 mybatis-plus 这段四个点值得记住:db-column-underline: true 让驼峰实体自动对上下划线字段;id-type: 1 表示主键由用户输入(这套主键是时间戳加随机数,不是自增);field-strategy: 2 是「非空才更新」,改一个字段不会把别的冲成 null;logic-delete-value: -1 配了逻辑删除。

关键文件清单

  • com/controller/:17 个 Controller,业务接口都在这
  • com/interceptor/AuthorizationInterceptor.java:token 鉴权,登录态从哪来、拦哪些接口
  • com/utils/MPUtil.java:通用查询工具(筛选/区间/排序)
  • admin/admin/src/utils/menu.js:管理员和用户的菜单配置
  • front/front/pages/:前台 42 个页面
  • front/front/modules/http/http.js:前台接口地址(改端口要动这里)

运行验证

本文所有截图都来自真实部署的环境(导入 16 张表 / 82 行种子数据),逐张核对过:前台七张商品卡片图片全部正常,订单页那条已完成订单的每个字段都能和 db.sql 对上,后台七行商品和七行评价都有数据,购物车空是因为这张表本身没种子数据。

演示数据分布

图:工程规模与演示数据分布 ------ 上排是 144 个 Java 文件、13399 行、17 个 Controller、180 个 REST 端点、16 张表、82 行演示数据;下表是十四张表行数分布。

答辩注意

  • 别照抄论文文档里的性能数字。 论文 6.7 性能测试那节写了响应时间和并发节点数,那是作者当时的测试环境,你复现不了。说「论文中的实测数据代码里没法复现」比硬报数字安全。
  • 论文没写 token 表和 config 表,被问到就按「业务表 vs 运行时表」解释,见上面第 7 条。
  • 论文图号有个小疏漏:5.1.2 节正文写「如图 5.2 所示」,图题却是「图 5.3」,顺手改一下。
  • 源码里有四套同义实体(entity / view / vo / model,共 17 + 13 + 13 + 13 个),是代码生成器的产物。问起就说「视图实体给列表页用,VO 给前端传参」。
  • pom.xml 里有两个声明了但源码没用的依赖(shiro-spring、protobuf-java),鉴权走自写拦截器加 token 表,照实说是加分项。
  • pom.xml 的 <name> 还是 springboot-schema,老师会问。

二次开发空间

想在这套基础上做出自己的东西,改起来最省力的几处:换主题色和店铺名(改 front/front/js/config.js 的 projectName 和 css/ 样式)、加商品规格维度(照着 yanse / chima 加一张字典表)、接入第三方登录(前台 login/login.html 已有角色选择逻辑,后端加 AuthController)、加统计图表页(后端用现成的 /cal /group 接口,前台拿 ECharts 画)。想练手建议从后端金额重算开始 ------ 改动量小,能把「安全」这条线讲清楚。


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

下一篇想拆哪套?留言告诉我编号,我按顺序排上 ------ 还有一批同批的毕设工程没拆过。

相关推荐
计算机毕设定制辅导-无忧学长30 分钟前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
文丑颜不良啊2 小时前
LeetCode2221~2240题目解析
java·leetcode
秋饼2 小时前
Computer Use Agent Java 落地实战:感知-行动循环、执行器与安全围栏生产级实现
java·ai·技术分享·后端开发
文丑颜不良啊4 小时前
LeetCode2161~2180题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2141~2160题目解析
java·leetcode
LabVIEW开发6 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
天天被压力6 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力6 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A7 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python