基于springboot2+vue2的校园商铺管理系统
温馨提示:
本文最后更新于 2026年05月27日,已超过 14 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
1. 资源
认真读完全文
2. 项目简介
校园商铺管理系统是一个面向校园场景的在线交易平台,旨在为校园内的商家和学生用户提供一个便捷的商品交易、订单管理和信息交流环境。系统支持三种角色:管理员、商家和普通用户。管理员负责系统基础数据维护、商家审核及整体监管;商家可以管理商品、处理订单;用户则能够浏览商品、加入购物车、下单、评价以及管理收货地址和个人信息。系统包含完整的购物流程(商品浏览 → 购物车 → 确认订单 → 支付 → 发货 → 收货 → 评价),并提供了公告发布、收藏、充值等功能。
3. 技术栈
| 层级 | 技术选型 |
|---|---|
| 后端框架 | Spring Boot 2.2.2.RELEASE、Mybatis-Plus 2.3、Apache Shiro 1.3.2 |
| 前端(后台) | Vue 2.x、Element UI、axios、vue-router、echarts |
| 前端(前台) | LayUI、jQuery、Bootstrap、Vue(部分使用) |
| 数据库 | MySQL 5.7(驱动 mysql-connector-java) |
| 工具库 | Fastjson、Hutool、Apache Commons Lang3等 |
| 其他 | 基于Token的接口鉴权、文件上传下载、Excel批量导入、百度地图API |
4. 详细介绍
4.1 数据库设计
| 表名 | 说明 | 核心字段 |
|---|---|---|
yonghu |
用户表 | 账号、密码、姓名、手机号、身份证、头像、性别、邮箱、余额 |
shangjia |
商家表 | 账号、密码、商家名称、联系方式、邮箱、营业执照、地址、信用等级、状态、余额 |
shangpin |
商品表 | 所属商家、商品名、图片、类型、库存、原价、现价、点击量、介绍、上下架状态 |
shangpin_order |
订单表 | 订单号、收货地址、商品、用户、购买数量、实付价格、订单类型(已评价/退款/已支付/已发货/已收货)、支付类型 |
cart |
购物车表 | 所属用户、商品、购买数量 |
address |
收货地址表 | 所属用户、收货人、电话、地址、是否默认 |
shangpin_collection |
商品收藏表 | 商品、用户、收藏时间 |
shangpin_commentback |
商品评价表 | 商品、用户、评价内容、回复内容 |
gonggao |
公告信息表 | 公告名称、图片、类型、发布时间、详情 |
dictionary |
字典表 | 存储各种下拉选项(商品类型、订单状态、商家信用等级等) |
config |
配置文件表 | 存储轮播图路径等系统配置 |
token |
token表 | 用户id、用户名、表名、角色、token、过期时间 |
users |
管理员表 | 用户名、密码、角色 |
4.2 功能模块
4.2.1 管理员端
- 基础数据管理:管理公告类型、商家信用类型、商品类型等字典数据。
- 公告信息管理:发布、修改、删除公告。
- 商家管理:审核商家入驻申请(待审核/使用/禁用),查看商家信息。
- 商品管理:查看所有商品,管理商品上下架,处理商品评价,查看订单。
- 用户管理:查看、修改、删除用户信息。
- 轮播图管理:配置前台首页轮播图。
4.2.2 商家端
- 商品管理:添加、修改、删除自己的商品,控制上下架。
- 商品评价管理:查看用户对自己的商品的评价,并可回复。
- 订单管理:查看订单列表,支持“发货”操作(将订单状态从“已支付”改为“已发货”)。
4.2.3 用户端(前台)
- 浏览与搜索:查看首页轮播图、商品推荐、公告信息、商家列表等;支持按商品类型筛选、关键字搜索。
- 购物车:将商品加入购物车,修改购买数量,删除购物车项,下单结算。
- 订单流程:
- 确认订单:选择收货地址,提交订单。
- 支付:使用账户余额支付(系统模拟支付)。
- 收货:收到商品后确认收货,订单状态变为“已完成”。
- 评价:对已完成的订单进行评价(含评分)。
- 收藏:收藏喜欢的商品,可在个人中心查看并取消收藏。
- 个人中心:修改个人信息(头像、手机号、邮箱等),管理收货地址,查看订单历史,充值余额。
- 公告查看:查看系统发布的公告详情。
4.3 系统架构
- 后端:采用经典的Controller → Service → Dao三层结构,使用Spring Boot管理Bean,Mybatis-Plus简化数据访问。基于自定义
AuthorizationInterceptor实现Token鉴权(白名单路径如登录、注册、部分公开接口无需Token)。字典表数据在项目启动时加载到ServletContext中,便于全局快速转换。 - 前端后台:Vue单页应用,通过axios请求后端API,路由使用vue-router,Element UI构建管理界面。
- 前端前台:多页面HTML + LayUI + jQuery,通过iframe嵌入各个功能页面,使用localStorage存储登录状态和购物车临时数据。
5. 部分代码
5.1 订单生成核心逻辑(ShangpinOrderController.order)
@RequestMapping("/order")
public R add(@RequestParam Map<String, Object> params, HttpServletRequest request){
String shangpinOrderUuidNumber = String.valueOf(new Date().getTime());
Integer userId = (Integer) request.getSession().getAttribute("userId");
Integer addressId = Integer.valueOf(String.valueOf(params.get("addressId")));
Integer shangpinOrderPaymentTypes = Integer.valueOf(String.valueOf(params.get("shangpinOrderPaymentTypes")));
String data = String.valueOf(params.get("shangpins"));
JSONArray jsonArray = JSON.parseArray(data);
List<Map> shangpins = JSON.parseObject(jsonArray.toString(), List.class);
YonghuEntity yonghuEntity = yonghuService.selectById(userId);
List<ShangpinOrderEntity> shangpinOrderList = new ArrayList<>();
// 处理每个商品:扣减库存、计算金额、修改余额、生成订单
for (Map<String, Object> map : shangpins) {
Integer shangpinId = Integer.valueOf(String.valueOf(map.get("shangpinId")));
Integer buyNumber = Integer.valueOf(String.valueOf(map.get("buyNumber")));
ShangpinEntity shangpinEntity = shangpinService.selectById(shangpinId);
// 库存校验与扣减
if(shangpinEntity.getShangpinKucunNumber() < buyNumber){
return R.error(shangpinEntity.getShangpinName()+"的库存不足");
}
shangpinEntity.setShangpinKucunNumber(shangpinEntity.getShangpinKucunNumber() - buyNumber);
// 余额支付处理
Double money = shangpinEntity.getShangpinNewMoney() * buyNumber;
if(yonghuEntity.getNewMoney() - money <0){
return R.error("余额不足,请充值!!!");
}
yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() - money);
// 生成订单记录
ShangpinOrderEntity order = new ShangpinOrderEntity();
order.setShangpinOrderUuidNumber(shangpinOrderUuidNumber);
order.setAddressId(addressId);
order.setShangpinId(shangpinId);
order.setYonghuId(userId);
order.setBuyNumber(buyNumber);
order.setShangpinOrderTypes(3); // 已支付
order.setShangpinOrderPaymentTypes(shangpinOrderPaymentTypes);
order.setShangpinOrderTruePrice(money);
order.setInsertTime(new Date());
shangpinOrderList.add(order);
shangpinList.add(shangpinEntity);
}
// 批量保存订单、更新商品库存、更新用户余额
shangpinOrderService.insertBatch(shangpinOrderList);
shangpinService.updateBatchById(shangpinList);
yonghuService.updateById(yonghuEntity);
return R.ok();
}
5.2 Token拦截器(AuthorizationInterceptor.preHandle)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 跨域支持
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
// 检查是否需要忽略鉴权
if (handler instanceof HandlerMethod) {
IgnoreAuth annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
if (annotation != null) return true;
}
String token = request.getHeader("Token");
TokenEntity tokenEntity = tokenService.getTokenEntity(token);
if (tokenEntity != null) {
request.getSession().setAttribute("userId", tokenEntity.getUserid());
request.getSession().setAttribute("role", tokenEntity.getRole());
return true;
}
// 未登录返回401
response.setContentType("application/json; charset=utf-8");
response.getWriter().print(JSONObject.toJSONString(R.error(401, "请先登录")));
return false;
}
5.3 字典表初始化监听器(DictionaryServletContextListener)
@WebListener
public class DictionaryServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
DictionaryService dictionaryService = appContext.getBean(DictionaryService.class);
List<DictionaryEntity> list = dictionaryService.selectList(new EntityWrapper<>());
Map<String, Map<Integer,String>> dictMap = new HashMap<>();
for (DictionaryEntity d : list) {
Map<Integer,String> m = dictMap.getOrDefault(d.getDicCode(), new HashMap<>());
m.put(d.getCodeIndex(), d.getIndexName());
dictMap.put(d.getDicCode(), m);
}
sce.getServletContext().setAttribute("dictionaryMap", dictMap);
}
}
6. 部分截图






































7. 项目总结
校园商铺管理系统实现了多角色在线交易的基本功能,涵盖了商品管理、订单流转、购物车、个人中心等核心电商模块。系统采用前后端分离的架构(后台管理使用Vue+Element,前台使用LayUI),后端基于Spring Boot + Mybatis-Plus,通过自定义Token实现接口安全。数据库设计较为规范,利用字典表动态管理各类枚举值,提高了扩展性。项目还集成了百度地图API(用于地址定位)、百度AI人脸比对(预留)等扩展功能。整体代码结构清晰,功能完整,适合作为校园实训或小型电商系统的参考实现。
正文到此结束
- 本文标签: Linux Java Spring
- 本文链接: https://blog.xiaobias.com/article/4
- 版权声明: 本文由十五喵原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
