基于Springboot+Vue实现前后端分离商城管理系统

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 项目后台基于Springboot+MybatisPlus开发实现,前端使用VUE+Element开发实现,前后端分离开发,前端通过调用后台接口来进行相应的交互处理。 亮点技术:短信发送验证码、阿里云OSS云存储商品图片、邮箱自动发邮件验证操作权限,Shiro权限管理,数据加密处理,支付宝沙箱技术应用,Redis数据缓存处理。 项目功能完整,界面优雅大方,人机交互流畅,是一个难得的毕业设计作品。

 作者主页:编程指南针

作者简介:阿里云特邀博主、Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助


一,项目简介

新新商城,一款基于 Springboot+Vue 的电商项目,前后端分离项目。完整的实现了一个商城系统应有的基本功能,包括但不限于以下主要功能模块:

前端商城用户

    1. 用户注册登陆
    2. 商品信息分类和品牌浏览
    3. 全文搜索
    4. 添加购物车管理
    5. 在线购买商品:使用支付宝沙箱在线支付
    6. 个人信息管理
    7. 个人订单管理
    8. 在线退换货功能
    9. 退款功能

    后台用户管理功能

      1. 商品分类管理
      2. 商品品牌管理
      3. 商品规格管理
      4. 商品采购管理
      5. 供应商管理
      6. 订单管理
      7. 退货退款管理
      8. 轮播图设置管理
      9. 用户管理
      10. 权限角色管理
      11. 个人信息管理

           项目后台基于Springboot+MybatisPlus开发实现,前端使用VUE+Element开发实现,前后端分离开发,前端通过调用后台接口来进行相应的交互处理。

           亮点技术:短信发送验证码、阿里云OSS云存储商品图片、邮箱自动发邮件验证操作权限,Shiro权限管理,数据加密处理,支付宝沙箱技术应用,Redis数据缓存处理。

         项目功能完整,界面优雅大方,人机交互流畅,是一个难得的毕业设计作品。

      二,环境介绍

      语言环境:Java:  jdk1.8

      数据库:Mysql: mysql5.7  Redis:5.0.10

      应用服务器:Tomcat:  tomcat8.5.31

      开发工具:IDEA或eclipse

      技术应用:

      后端技术

      技术

      说明

      官网

      SpringBoot

      容器+MVC框架

      https://spring.io/projects/spring-boot

      Shiro

      认证和授权框架

      Apache Shiro Simple. Java. Security.

      MyBatis

      ORM框架

      http://www.mybatis.org/mybatis-3/zh/index.html

      MySQL

      数据库

      https://www.mysql.com/

      Redis

      分布式缓存

      https://redis.io/

      Druid

      数据库连接池

      https://github.com/alibaba/druid

      前端技术

      技术

      说明

      官网

      Vue

      前端框架

      https://vuejs.org/

      Vue-router

      路由框架

      https://router.vuejs.org/

      Vuex

      全局状态管理框架

      https://vuex.vuejs.org/

      Element

      前端UI框架

      https://element.eleme.io

      Axios

      前端HTTP框架

      https://github.com/axios/axios

      vue-clipboard2

      将内容复制到剪贴板

      https://github.com/Inndy/vue-clipboard2

      vuex-persistedstate

      vuex持久化

      https://www.npmjs.com/package/vuex-persistedstate

      nprogress

      进度条控件

      https://github.com/rstacruz/nprogress

      开发环境

      第三方技术

      工具

      官网

      支付宝沙箱技术

      沙箱环境 | 开放平台

      OSS 存储

      阿里云-为了无法计算的价值

      阿里云短信服务

      阿里云-为了无法计算的价值

      QQ邮箱服务

      登录QQ邮箱

      三,系统展示

      下面展示一下项目的主要核心功能:

      前端用户操作

      用户注册:会对邮箱发验证码验证,要求必须真实有效邮箱

      image.gif编辑

      用户登陆

      image.gif编辑

      首页

      image.gif编辑

      image.gif编辑

      商品购买

      image.gif编辑

      购物车

      image.gif编辑

      结算付款

      image.gif编辑

      image.gif编辑

      我的订单:可以申请退款、收货后可以申请退货等操作

      image.gif编辑

      后台管理用户功能

      后台首页

      image.gif编辑

      商品管理:可以实现商品添加、编辑、删除、下架、查询等,另可以对商品分类、品牌、规则、采购信息进行管理,以及对供应商进行管理,不再一一展示。菜单上的功能都是齐全的。

      image.gif编辑

      订单管理:可以进行发货、退货、退款等相关操作

      image.gif编辑

      营销管理

      主要对前端展示的广告轮播图进行管理

      image.gif编辑

      用户和权限管理:可以对管理员、顾客、角色进行管理操作

      image.gif编辑

      四,核心代码展示

      package com.qiu.controller;
      import com.alibaba.fastjson.JSON;
      import com.qiu.entity.Logistics;
      import com.qiu.entity.Order;
      import com.qiu.entity.Product;
      import com.qiu.service.LogisticsService;
      import com.qiu.service.OrderService;
      import com.qiu.service.ProductService;
      import com.qiu.util.general.CommonResult;
      import org.apache.commons.lang3.StringUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.data.redis.core.RedisTemplate;
      import org.springframework.web.bind.annotation.CrossOrigin;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;
      import java.util.concurrent.TimeUnit;
      /**
       * @author ZNZ
       * @email 469603589@qq.com
       * @date 2022/12/28 18:11
       * @description 订单相关业务
       */
      @RestController
      @CrossOrigin
      public class OrderController {
          private static final String VIP = "Vip";
          private static final String COLLECT_GOODS_STATE = "已收货";
          @Autowired
          private OrderService orderService;
          @Autowired
          private ProductService productService;
          @Autowired
          private LogisticsService logisticsService;
          @Autowired
          private RedisTemplate<String, String> redisTemplate;
          @RequestMapping(value = "/order/findById")
          public CommonResult findOrderById(Integer orderId) {
              Order order = orderService.selectById(orderId);
              if (orderId != null) {
                  return CommonResult.success("订单信息查询成功", order);
              }
              return CommonResult.error("订单信息查询失败");
          }
          @RequestMapping(value = "/order/findOrderInfo")
          public CommonResult findOrderInfo(String userAccount) {
              List<Map<String, Object>> orderMap = orderService.selectAllOrder(userAccount);
              if (orderMap != null) {
                  return CommonResult.success("订单信息查询成功", orderMap);
              }
              return CommonResult.error("订单信息查询失败");
          }
          @RequestMapping(value = "/order/findAll")
          public CommonResult findAllOrder() {
              List<Order> orders = orderService.selectAll();
              if (orders != null) {
                  return CommonResult.success("订单信息查询成功", orders);
              }
              return CommonResult.error("订单信息查询失败");
          }
          @RequestMapping(value = "/order/findCount")
          public CommonResult findCount() {
              Integer count = orderService.selectCount();
              if (count != null) {
                  return CommonResult.success("订单数量查询成功", count);
              }
              return CommonResult.error("订单数量查询失败");
          }
          @RequestMapping(value = "/order/add")
          public CommonResult addOrder(Order order) {
              if (order != null) {
                  if (order.getProductNo().contains(VIP)) {
                      return handleMemberOrders(order);
                  }
                  return handleMerchandiseOrders(order);
              } else {
                  return CommonResult.error("订单数据不完整");
              }
          }
          @RequestMapping(value = "/order/cartOrder")
          public CommonResult cartOrder(String orderNo, String ordersInfo, String cartIds) {
              List<String> cartIdList = JSON.parseArray(cartIds, String.class);
              List<Order> orders = JSON.parseArray(ordersInfo, Order.class);
              if (orders != null) {
                  ArrayList<String> orderInfo = new ArrayList<>();
                  ArrayList<String> productInfo = new ArrayList<>();
                  for (Order order : orders) {
                      Product product = productService.selectByKey(order.getProductNo());
                      Integer productStock = product.getProductStock();
                      Integer payAmount = order.getPayAmount();
                      if (productStock >= payAmount) {
                          Product newProduct = new Product();
                          newProduct.setProductId(product.getProductId());
                          int newStock = productStock - payAmount;
                          newProduct.setProductStock(newStock);
                          newProduct.setIsStockOut(newStock < product.getLowestStock());
                          // 如果库存小于等于0,自动下架
                          newProduct.setIsSale(newStock > 0);
                          if (productService.updateById(newProduct) && orderService.insertData(order)) {
                              orderInfo.add(order.getOrderNo());
                              productInfo.add(order.getProductNo());
                          }
                      }
                  }
                  if (!orderInfo.isEmpty()) {
                      String cartIdsInfo = StringUtils.join(cartIdList.toArray(), ",");
                      String orderNoInfo = StringUtils.join(orderInfo, ",");
                      String productNoInfo = StringUtils.join(productInfo, ",");
                      redisTemplate.opsForValue().set(orderNo, orderNoInfo, 24, TimeUnit.HOURS);
                      redisTemplate.opsForValue().set("cartId" + orderNo, cartIdsInfo, 24, TimeUnit.HOURS);
                      return CommonResult.success("创建订单成功", productNoInfo);
                  }
                  return CommonResult.error("创建订单失败,请查看商品库存是否满足购买数量");
              } else {
                  return CommonResult.error("订单数据不完整");
              }
          }
          @RequestMapping(value = "/order/update")
          public CommonResult updateOrder(Order order) {
              if (orderService.updateById(order)) {
                  return CommonResult.success("修改订单成功", order);
              }
              return CommonResult.error("修改订单失败");
          }
          @RequestMapping(value = "/order/delete")
          public CommonResult deleteOrder(Integer orderId) {
              if (orderService.deleteById(orderId)) {
                  return CommonResult.success("删除订单成功", "订单id:" + orderId);
              }
              return CommonResult.error("删除订单失败");
          }
          @RequestMapping(value = "/order/receipt")
          public CommonResult updateOrder(Integer orderId) {
              Order order = new Order();
              order.setOrderId(orderId);
              order.setOrderState(COLLECT_GOODS_STATE);
              if (orderService.updateById(order)) {
                  return CommonResult.success("商品收货成功", order);
              }
              return CommonResult.error("商品收货失败");
          }
          @RequestMapping(value = "/orderDetail/orderInfo")
          public CommonResult orderInfo(String orderNo) {
              ArrayList<Object> resultList = new ArrayList<>();
              Order order = orderService.selectByKey(orderNo);
              Logistics logistics = logisticsService.selectOrderNo(orderNo);
              if (order != null) {
                  resultList.add(order);
              }
              if (logistics != null) {
                  resultList.add(logistics);
              }
              return CommonResult.success("订单详情查询成功", resultList);
          }
          /**
           * 处理会员订单
           *
           * @param order 订单信息
           */
          private CommonResult handleMemberOrders(Order order) {
              if (orderService.insertData(order)) {
                  return CommonResult.success("创建订单成功", order);
              } else {
                  return CommonResult.error("创建订单失败");
              }
          }
          /**
           * 处理商品订单
           *
           * @param order 订单信息
           */
          private CommonResult handleMerchandiseOrders(Order order) {
              Product product = productService.selectByKey(order.getProductNo());
              Integer productStock = product.getProductStock();
              Integer payAmount = order.getPayAmount();
              boolean isOk = productStock >= payAmount;
              if (isOk) {
                  Product newProduct = new Product();
                  newProduct.setProductId(product.getProductId());
                  int newStock = productStock - payAmount;
                  newProduct.setProductStock(newStock);
                  newProduct.setIsStockOut(newStock < product.getLowestStock());
                  // 如果库存小于等于0,自动下架
                  newProduct.setIsSale(newStock > 0);
                  if (productService.updateById(newProduct)) {
                      if (orderService.insertData(order)) {
                          redisTemplate.opsForValue().set(order.getOrderNo(), order.getOrderNo(), 24, TimeUnit.HOURS);
                          return CommonResult.success("创建订单成功", order);
                      } else {
                          return CommonResult.error("创建订单失败");
                      }
                  } else {
                      return CommonResult.error("创建订单失败");
                  }
              } else {
                  return CommonResult.error("商品库存不足");
              }
          }
      }

      image.gif

      package com.qiu.controller;
      import com.qiu.util.general.CommonResult;
      import com.qiu.util.oss.AliyunOssUtil;
      import lombok.extern.slf4j.Slf4j;
      import org.apache.commons.io.FileUtils;
      import org.apache.commons.lang3.StringUtils;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.CrossOrigin;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.RestController;
      import org.springframework.web.multipart.MultipartFile;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      /**
       * @author ZNZ
       */
      @Slf4j
      @CrossOrigin
      @RestController
      public class OssController {
          @Autowired
          private AliyunOssUtil ossUtil;
          @RequestMapping("/uploadImage")
          public CommonResult upload(@RequestParam("name") String folderName,
                                     @RequestParam("file") MultipartFile file) throws IOException {
              if (file != null) {
                  String fileName = file.getOriginalFilename();
                  if (StringUtils.isNotBlank(fileName)) {
                      File newFile = new File(fileName);
                      try (FileOutputStream os = new FileOutputStream(newFile)) {
                          os.write(file.getBytes());
                          file.transferTo(newFile);
                          String path = ossUtil.upload(folderName, newFile);
                          log.info("文件上传成功,路径:{}", path);
                          return new CommonResult(200, "上传成功", path);
                      } catch (Exception e) {
                          log.error("文件上传失败", e);
                          return CommonResult.error("上传失败");
                      } finally {
                          if (newFile.exists()) {
                              FileUtils.forceDelete(newFile);
                          }
                      }
                  }
              }
              return CommonResult.error("文件不存在");
          }
      }

      image.gif

      package com.qiu.controller;
      import com.qiu.entity.ShoppingCart;
      import com.qiu.service.ShoppingCartService;
      import com.qiu.util.general.CommonResult;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.CrossOrigin;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      import java.util.List;
      import java.util.Map;
      /**
       * @author ZNZ
       * @email 469603589@qq.com
       * @date 2022/12/31 16:23
       * @description 购物车业务类
       */
      @RestController
      @CrossOrigin
      public class ShoppingCartController {
          @Autowired
          private ShoppingCartService shoppingCartService;
          /**
           * 新增商品到购物车
           *
           * @param shoppingCart 购物车商品信息
           */
          @RequestMapping(value = "/shoppingCart/add")
          public CommonResult addShoppingCart(ShoppingCart shoppingCart) {
              if (shoppingCartService.insertData(shoppingCart)) {
                  return CommonResult.success("购物车添加成功", shoppingCart);
              }
              return CommonResult.error("购物车添加失败");
          }
          /**
           * 更新购物车商品
           *
           * @param shoppingCart 购物车商品信息
           */
          @RequestMapping(value = "/shoppingCart/update")
          public CommonResult updateShoppingCart(ShoppingCart shoppingCart) {
              if (shoppingCartService.updateById(shoppingCart)) {
                  return CommonResult.success("购物车修改成功", shoppingCart);
              }
              return CommonResult.error("购物车修改失败");
          }
          /**
           * 购物车移除商品
           *
           * @param cartId 购物车商品编号
           */
          @RequestMapping(value = "/shoppingCart/deleteById")
          public CommonResult deleteShoppingCart(Integer cartId) {
              if (shoppingCartService.deleteById(cartId)) {
                  return CommonResult.success("购物车删除成功", "cartId: " + cartId);
              }
              return CommonResult.error("购物车删除失败");
          }
          /**
           * 根据用户移除购物车
           *
           * @param account 用户账户
           */
          @RequestMapping(value = "/shoppingCart/deleteByUser")
          public CommonResult deleteByUser(String account) {
              if (shoppingCartService.deleteByUser(account)) {
                  return CommonResult.success("购物车删除成功", account);
              }
              return CommonResult.error("购物车删除失败");
          }
          /**
           * 查询用户账号下的购物车信息
           *
           * @param account 用户账户
           */
          @RequestMapping(value = "/shoppingCart/findAll")
          public CommonResult findAllShoppingCart(String account) {
              List<Map<String, Object>> shoppingInfo = shoppingCartService.selectAll(account);
              if (shoppingInfo != null) {
                  return CommonResult.success("购物车查询成功", shoppingInfo);
              }
              return CommonResult.error("购物车查询失败");
          }
          /**
           * 根据购物车商品编号查询购物车商品信息
           *
           * @param cartId 购物车商品编号
           */
          @RequestMapping(value = "/shoppingCart/findById")
          public CommonResult findById(Integer cartId) {
              ShoppingCart shoppingCart = shoppingCartService.selectById(cartId);
              if (shoppingCart != null) {
                  return CommonResult.success("购物车查询成功", shoppingCart);
              }
              return CommonResult.error("购物车查询失败");
          }
      }

      image.gif

      五,项目总结

      项目后台基于Springboot+MybatisPlus开发实现,前端使用VUE+Element开发实现,前后端分离开发,前端通过调用后台接口来进行相应的交互处理。

           亮点技术:短信发送验证码、阿里云OSS云存储商品图片、邮箱自动发邮件验证操作权限,Shiro权限管理,数据加密处理,支付宝沙箱技术应用,Redis数据缓存处理。

         项目功能完整,界面优雅大方,人机交互流畅,是一个难得的毕业设计作品。

      相关实践学习
      基于Redis实现在线游戏积分排行榜
      本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
      云数据库 Redis 版使用教程
      云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
      相关文章
      |
      27天前
      |
      JavaScript 安全 Java
      如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
      本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
      132 1
      |
      11天前
      |
      JavaScript 安全 Java
      如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
      本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
      92 62
      |
      9天前
      |
      JavaScript 安全 Java
      如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
      本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
      25 2
      |
      12天前
      |
      JavaScript Java 项目管理
      Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
      基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
      |
      28天前
      |
      JavaScript 安全 Java
      如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
      【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
      39 3
      |
      29天前
      |
      JavaScript 安全 Java
      如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
      【10月更文挑战第7天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建 Spring Boot 项目并配置 Spring Security。接着,实现后端 API 以提供菜单数据。在前端部分,使用 Ant Design Pro Vue 脚手架创建项目,并配置动态路由和菜单。最后,启动前后端服务,实现高效、美观且功能强大的应用框架。
      34 2
      |
      8天前
      |
      JavaScript NoSQL Java
      CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
      CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
      25 0
      |
      1月前
      |
      JSON JavaScript 前端开发
      vue尚品汇商城项目-day00【项目介绍:此项目是基于vue2的前台电商项目和后台管理系统】
      vue尚品汇商城项目-day00【项目介绍:此项目是基于vue2的前台电商项目和后台管理系统】
      43 1
      |
      1月前
      |
      JavaScript 前端开发
      vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】
      vue尚品汇商城项目-day01【4.完成非路由组件Header与Footer业务】
      35 2
      |
      1月前
      |
      JavaScript 前端开发
      vue尚品汇商城项目-day01【3.项目路由的分析】
      vue尚品汇商城项目-day01【3.项目路由的分析】
      30 1
      下一篇
      无影云桌面