原创

基于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. 部分截图

img1
img2
img3
img4
img5
img6
img7
img8
img9
img10
img11
img12
img13
img14
img15
img16
img17
img18
img19
img20
img21
img22
img23
img24
img25
img26
img27
img28
img29
img30
img31
img32
img33
img34
img35
img36
img37
img38

7. 项目总结

校园商铺管理系统实现了多角色在线交易的基本功能,涵盖了商品管理、订单流转、购物车、个人中心等核心电商模块。系统采用前后端分离的架构(后台管理使用Vue+Element,前台使用LayUI),后端基于Spring Boot + Mybatis-Plus,通过自定义Token实现接口安全。数据库设计较为规范,利用字典表动态管理各类枚举值,提高了扩展性。项目还集成了百度地图API(用于地址定位)、百度AI人脸比对(预留)等扩展功能。整体代码结构清晰,功能完整,适合作为校园实训或小型电商系统的参考实现。

自助获取:https://fifteen.xiaobias.com/source/218

正文到此结束
本文目录