原创

基于springboot2+vue3的校园网上店铺系统

温馨提示:
本文最后更新于 2026年05月28日,已超过 13 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1. 资源

浏览全文可获取

2. 项目简介

本项目为“校园网上店铺”系统,是一个面向校园用户的电子商务平台。系统支持多角色(管理员、商铺、普通用户)登录与操作,提供商品浏览、购物车、订单管理、商品收藏、评价、公告发布、商铺管理等功能。数据库设计包含用户表、商铺表、商品表、购物车表、订单表、地址表、字典表等,能够满足校园场景下的线上购物基本需求。

3. 技术栈

  • 后端框架:Spring Boot 2.2.2.RELEASE
  • 持久层框架:MyBatis-Plus 2.3 + MyBatis
  • 数据库:MySQL 5.7.32
  • 安全与认证:Apache Shiro 1.3.2(用于权限控制)、Token 机制(自定义生成与校验)
  • 前端后台管理:Vue 2.x + Element UI + ECharts + axios
  • 前端用户界面:Layui + jQuery + Vue(辅助)
  • 工具库:Hutool、Fastjson、Apache Commons、POI(Excel 导入导出)
  • 其他:百度地图 API(用于地址定位)、百度人脸识别(AipFace)、WebSocket(未发现,但存在线程定时任务)

4. 详细介绍

4.1 功能模块

系统分为三个角色:管理员商铺用户

4.1.1 管理员功能

  • 基础数据管理:公告类型、会员等级、商铺信用类型、商品类型等字典表维护。
  • 公告管理:发布、编辑、删除公告。
  • 商铺管理:审核、查看、删除商铺(逻辑删除)。
  • 商品管理:查看所有商品,管理商品上下架、评价、收藏、订单。
  • 单页数据管理:维护“联系我们”、“网站介绍”等单页内容。
  • 用户管理:查看、修改、删除用户。
  • 轮播图管理:配置首页轮播图。

4.1.2 商铺功能

  • 商品管理:发布、修改、上下架自己的商品,查看商品评价。
  • 订单管理:查看已支付订单,发货(填写配送信息),处理退款。
  • 公告查看:查看系统公告。
  • 个人信息维护:修改商铺资料、营业执照、联系方式等。

4.1.3 用户功能

  • 商品浏览:按分类、关键字搜索商品,查看详情,点击次数累计。
  • 购物车:添加商品、修改数量、删除、下单。
  • 订单管理:下单(余额支付)、查看订单、确认收货、评价商品、申请退款。
  • 收藏管理:收藏/取消收藏商品。
  • 收货地址管理:增删改查,设置默认地址。
  • 个人信息维护:修改个人资料、头像、密码等。
  • 余额充值:虚拟充值,可用于支付订单。
  • 积分系统:消费获得积分,积分累计影响会员等级(青铜/白银/黄金),等级对应不同折扣。

4.2 数据库设计

主要数据表(基于 db.sql):

  • yonghu:用户表(账户、密码、姓名、手机、身份证、头像、性别、邮箱、余额、总积分、现积分、会员等级)
  • shangjia:商铺表(账户、密码、商铺名称、联系方式、邮箱、营业执照、信用等级、余额、简介、逻辑删除)
  • shangpin:商品表(商铺ID、编号、名称、照片、类型、库存、获得积分、原价、现价、点击次数、介绍、上下架状态、逻辑删除)
  • shangpin_order:订单表(订单号、地址ID、商品ID、用户ID、购买数量、实付价格、配送人、配送人联系方式、订单类型、支付类型、创建时间)
  • cart:购物车表(用户ID、商品ID、购买数量)
  • shangpin_collection:收藏表(商品ID、用户ID、类型、收藏时间)
  • shangpin_commentback:评价表(商品ID、用户ID、评价内容、回复内容、评价时间、回复时间)
  • address:收货地址表(用户ID、收货人、电话、地址、是否默认)
  • gonggao:公告表(名称、图片、类型、发布时间、内容)
  • dictionary:字典表(字段编码、字段名、编码索引、索引名称、父ID、备注)
  • config:配置表(轮播图等参数)
  • single_seach:单页数据表(名字、数据类型、内容)
  • token:用户token表
  • users:管理员表

4.3 核心业务逻辑

  • 下单流程:用户从购物车或商品详情页提交订单 → 选择收货地址 → 选择支付方式(余额)→ 系统计算折扣(根据会员等级)→ 扣减余额、增加积分、减少商品库存、增加商铺余额 → 生成订单记录 → 清空购物车对应商品。
  • 退款流程:用户发起退款(订单状态为已支付)→ 系统恢复用户余额和积分、恢复商品库存、减少商铺余额 → 订单状态变更为“退款”。
  • 发货与收货:商铺发货(填写配送人信息)→ 订单状态变为“已发货” → 用户确认收货 → 订单状态变为“已收货” → 用户可评价。
  • 积分与会员等级:每笔消费根据商品设定“购买获得积分”字段,累加至用户总积分和现积分。总积分达到阈值(10000、100000、1000000)自动升级会员等级,等级对应折扣(0.98、0.96、0.95)。

4.4 项目结构

  • 后端代码位于 src/main/java/com/,包含 controller、service、dao、entity、utils、interceptor、config 等包。
  • 前端管理后台代码位于 src/main/resources/admin/admin/,基于 Vue CLI 构建。
  • 前端用户界面位于 src/main/resources/front/front/,采用 layui + jQuery + 静态 HTML。
  • 配置文件:application.yml(数据库连接、mybatis-plus 配置)、pom.xml(Maven 依赖)。

5. 部分代码

以下从项目中摘取关键代码示例:

5.1 订单下单核心逻辑(ShangpinOrderController.order

@RequestMapping("/order")
public R add(@RequestParam Map<String, Object> params, HttpServletRequest request){
    // 获取当前登录用户id、收货地址id、支付类型、购物车商品列表
    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<>();
    List<ShangjiaEntity> shangjiaList = new ArrayList<>();
    List<ShangpinEntity> shangpinList = new ArrayList<>();
    List<Integer> cartIds = new ArrayList<>();

    // 获取会员折扣
    BigDecimal zhekou = ...;

    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);
        // 构建订单项
        ShangpinOrderEntity shangpinOrderEntity = ...;
        if(shangpinOrderPaymentTypes == 1){ // 余额支付
            Double money = new BigDecimal(shangpinEntity.getShangpinNewMoney())
                           .multiply(new BigDecimal(buyNumber)).multiply(zhekou).doubleValue();
            // 扣余额、加积分
            yonghuEntity.setNewMoney(yonghuEntity.getNewMoney() - money);
            Double buyJifen = new BigDecimal(shangpinEntity.getShangpinPrice())
                              .multiply(new BigDecimal(buyNumber)).doubleValue();
            yonghuEntity.setYonghuNewJifen(yonghuEntity.getYonghuNewJifen() + buyJifen);
            // 更新商家余额
            shangjiaEntity.setNewMoney(shangjiaEntity.getNewMoney() + money);
            shangpinOrderEntity.setShangpinOrderTruePrice(money);
        }
        shangpinOrderList.add(shangpinOrderEntity);
        shangpinList.add(shangpinEntity);
        shangjiaList.add(shangjiaEntity);
        cartIds.add(Integer.valueOf(map.get("id").toString()));
    }
    // 批量保存订单、更新商品、更新商家、更新用户、删除购物车
    shangpinOrderService.insertBatch(shangpinOrderList);
    shangpinService.updateBatchById(shangpinList);
    shangjiaService.updateBatchById(shangjiaList);
    yonghuService.updateById(yonghuEntity);
    if(cartIds.size()>0) cartService.deleteBatchIds(cartIds);
    return R.ok();
}

5.2 前端商品详情收藏功能(shangpin/detail.html

// 收藏商品
addShangpinCollection() {
    let _this = this;
    layui.http.request('shangpinCollection/list', 'get', {
        page: 1, limit: 1,
        shangpinId: _this.detail.id,
        shangpinCollectionTypes: 1,
        yonghuId: localStorage.getItem('userid'),
    }, (res) => {
        if (res.data.list.length == 1) {
            // 已收藏则取消
            layui.http.requestJson('shangpinCollection/delete', 'post', [res.data.list[0].id], function (res) {
                layui.layer.msg('取消成功', { time: 1000, icon: 5 }, function () { window.location.reload(); });
            });
            return false;
        }
        // 未收藏则添加
        layui.http.requestJson('shangpinCollection/add', 'post', {
            yonghuId: localStorage.getItem('userid'),
            shangpinId: _this.detail.id,
            shangpinCollectionTypes: 1,
        }, function (res) {
            layui.layer.msg('收藏成功', { time: 1000, icon: 6 }, function () { window.location.reload(); });
        });
    });
}

5.3 字典表转换工具(DictionaryServiceImpl.dictionaryConvert

public void dictionaryConvert(Object obj, HttpServletRequest request) {
    // 获取当前对象中所有以"Types"结尾的Integer字段
    List<String> fieldNameList = new ArrayList<>();
    // 反射获取所有字段...
    // 从ServletContext中获取字典表映射 dictionaryMap
    Map<String, Map<Integer, String>> dictionaryMap = (Map<String, Map<Integer, String>>) 
        request.getServletContext().getAttribute("dictionaryMap");
    // 遍历每个Types字段,根据其codeIndex从dictionaryMap中获取对应的indexName,赋值给对应的Value字段
    for (String s : fieldNameList) {
        Field types = ...;
        Field value = ...;
        int codeIndex = types.getInt(obj);
        String dicCode = s.replace("Types", "").replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase();
        String indexName = dictionaryMap.get(dicCode).get(codeIndex);
        value.set(obj, indexName);
    }
}

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
img39

7. 项目总结

校园网上店铺是一个功能完整的B2C电商系统,覆盖了商品管理、购物流程、订单处理、会员积分、商户管理、后台运维等核心业务。技术上采用前后端分离(管理端Vue,用户端传统Layui),后端使用Spring Boot + MyBatis-Plus快速开发,数据库设计合理,字典表设计增强了扩展性。系统实现了完整的支付(虚拟余额)、退款、发货、收货、评价等电商闭环,并引入了基于积分的会员等级折扣机制,符合校园场景需求。项目代码结构清晰,接口遵循RESTful风格,包含token认证和权限拦截,具备一定的安全性和可维护性。

资助获取:https://fifteen.xiaobias.com/source/214

正文到此结束