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







































7. 项目总结
校园网上店铺是一个功能完整的B2C电商系统,覆盖了商品管理、购物流程、订单处理、会员积分、商户管理、后台运维等核心业务。技术上采用前后端分离(管理端Vue,用户端传统Layui),后端使用Spring Boot + MyBatis-Plus快速开发,数据库设计合理,字典表设计增强了扩展性。系统实现了完整的支付(虚拟余额)、退款、发货、收货、评价等电商闭环,并引入了基于积分的会员等级折扣机制,符合校园场景需求。项目代码结构清晰,接口遵循RESTful风格,包含token认证和权限拦截,具备一定的安全性和可维护性。
正文到此结束
- 本文标签: Java Spring Spring Boot
- 本文链接: https://blog.xiaobias.com/article/10
- 版权声明: 本文由十五喵原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
