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 源码逐文件整理,代码片段为原文摘录,统计数字与截图均来自真实运行环境。
下一篇想拆哪套?留言告诉我编号,我按顺序排上 ------ 还有一批同批的毕设工程没拆过。