电商商城系统网站

文章目录

  • 电商商城系统网站
    • 一、项目演示
    • 二、项目介绍
    • 三、系统部分功能截图
    • 四、部分代码展示
    • 五、底部获取项目(9.9¥带走)

电商商城系统网站

一、项目演示

商城系统

二、项目介绍

基于SpringBoot+Vue的前后端分离商城系统网站

运行环境:idea或eclipse vscode 数据库:mysql

语言:java

后台: SpringBoot + Mybatis-plus + Mybatis + Hutool工具包 + lombok插件

前台:Vue + Vue Router + ELementUI + Axios

功能:首页推荐、轮播图管理、商品、订单、购物车、商品评论、商品评论点赞、商品收藏、商品点赞、订单支付、公告。

角色:管理员、用户

三、系统部分功能截图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、部分代码展示

package com.example.controller;import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.example.common.Result;
import com.example.service.UserService;
import com.example.entity.Address;
import com.example.service.AddressService;
import com.example.entity.User;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;@RestController
@RequestMapping("/api/address")
public class AddressController {@Resourceprivate AddressService addressService;@Resourceprivate HttpServletRequest request;@Resourceprivate UserService userService;public User getUser() {String token = request.getHeader("token");String username = JWT.decode(token).getAudience().get(0);return userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, username));}@PostMappingpublic Result<?> save(@RequestBody Address address) {addressService.save(address);return Result.success();}@PutMappingpublic Result<?> update(@RequestBody Address address) {addressService.updateById(address);return Result.success();}@DeleteMapping("/{id}")public Result<?> delete(@PathVariable Long id) {addressService.removeById(id);return Result.success();}@GetMapping("/{id}")public Result<?> findById(@PathVariable Long id) {return Result.success(addressService.getById(id));}@GetMappingpublic Result<?> findAll() {LambdaQueryWrapper<Address> query = Wrappers.<Address>lambdaQuery().orderByDesc(Address::getId);query.eq(Address::getUserId, getUser().getId());List<Address> list = addressService.list(query);return Result.success(list);}@GetMapping("/page")public Result<?> findPage(@RequestParam(required = false, defaultValue = "1") Integer pageNum,@RequestParam(required = false, defaultValue = "10") Integer pageSize) {LambdaQueryWrapper<Address> query = Wrappers.<Address>lambdaQuery().orderByDesc(Address::getId);
//        query.eq(Address::getUserId, getUser().getId());IPage<Address> page = addressService.page(new Page<>(pageNum, pageSize), query);return Result.success(page);}@GetMapping("/page/front")public Result<?> Front(@RequestParam(required = false, defaultValue = "1") Integer pageNum,@RequestParam(required = false, defaultValue = "10") Integer pageSize) {User user = getUser();if(user == null) {return Result.success(new Page<>());}LambdaQueryWrapper<Address> query = Wrappers.<Address>lambdaQuery().orderByDesc(Address::getId);query.eq(Address::getUserId, getUser().getId());IPage<Address> page = addressService.page(new Page<>(pageNum, pageSize), query);return Result.success(page);}}
package com.example.controller;import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.Result;
import com.example.entity.Cart;
import com.example.entity.User;
import com.example.service.CartService;
import com.example.service.UserService;
import org.json.JSONException;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/api/cart")
public class CartController {@Resourceprivate CartService cartService;@Resourceprivate HttpServletRequest request;@Resourceprivate UserService userService;public User getUser() {String token = request.getHeader("token");String username = JWT.decode(token).getAudience().get(0);return userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, username));}@PostMappingpublic Result<?> save(@RequestBody Cart cart) {cart.setCreateTime(DateUtil.now());// 加入购物车,相同的商品累加Cart userCart = cartService.getOne(Wrappers.<Cart>lambdaQuery().eq(Cart::getGoodsId, cart.getGoodsId()).eq(Cart::getUserId, cart.getUserId()));if (userCart != null) {userCart.setCount(cart.getCount() + userCart.getCount());cartService.updateById(userCart);} else {// 不同商品添加新的购物车记录cartService.save(cart);}return Result.success();}@PutMappingpublic Result<?> update(@RequestBody Cart cart) {cartService.updateById(cart);return Result.success();}@DeleteMapping("/{id}")public Result<?> delete(@PathVariable Long id) {cartService.removeById(id);return Result.success();}@GetMapping("/{id}")public Result<?> findById(@PathVariable Long id) {return Result.success(cartService.getById(id));}@GetMappingpublic Result<?> findAll() throws JSONException {List<Cart> carts = new ArrayList<>();User user = getUser();if (user != null) {carts = cartService.list(Wrappers.<Cart>lambdaQuery().eq(Cart::getUserId, getUser().getId()));}return Result.success(cartService.findAll(carts));}@GetMapping("/page")public Result<?> findPage(@RequestParam(required = false, defaultValue = "") String name,@RequestParam(required = false, defaultValue = "1") Integer pageNum,@RequestParam(required = false, defaultValue = "10") Integer pageSize) {LambdaQueryWrapper<Cart> query = Wrappers.<Cart>lambdaQuery().orderByDesc(Cart::getId);IPage<Cart> page = cartService.page(new Page<>(pageNum, pageSize), query);return Result.success(page);}}
package com.example.controller;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.auth0.jwt.JWT;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.common.Result;
import com.example.dto.PreOrderQo;
import com.example.entity.*;
import com.example.exception.CustomException;
import com.example.service.*;
import org.json.JSONException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api/order")
public class OrderController {@Resourceprivate OrderService orderService;@Resourceprivate HttpServletRequest request;@Resourceprivate UserService userService;@Resourceprivate CartService cartService;@Resourceprivate OrderGoodsService orderGoodsService;@Resourceprivate GoodsService goodsService;public User getUser() {String token = request.getHeader("token");String username = JWT.decode(token).getAudience().get(0);return userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getUsername, username));}@Transactional@PostMappingpublic Result<?> save(@RequestBody Order order) {order.setUserId(getUser().getId());order.setOrderNo(DateUtil.format(new Date(), "yyyyMMddHHmmss") + RandomUtil.randomNumbers(6));order.setCreateTime(DateUtil.now());String cartsStr = order.getCarts();List<Cart> carts = JSONUtil.toBean(cartsStr, new TypeReference<List<Cart>>() {}, true);orderService.save(order);for (Cart cart : carts) {Integer count = cart.getCount();Long goodsId = cart.getGoodsId();// 扣库存Goods goods = goodsService.getById(goodsId);if(goods.getStore() - cart.getCount() < 0) {throw new CustomException("-1", "库存不足");}goods.setStore(goods.getStore() - cart.getCount());goods.setSales(goods.getSales() + cart.getCount());goodsService.updateById(goods);OrderGoods orderGoods = new OrderGoods();orderGoods.setOrderId(order.getId());orderGoods.setGoodsId(goodsId);orderGoods.setCount(count);orderGoodsService.save(orderGoods);}if (order.getType() == 1) {  // 1表示购物车,0表示直接购买// 提交订单时清空个人的购物车商品cartService.remove(Wrappers.<Cart>lambdaUpdate().eq(Cart::getUserId, getUser().getId()));}return Result.success(order);}@PutMappingpublic Result<?> update(@RequestBody Order order) {orderService.updateById(order);return Result.success();}/*** 付款* @param id* @return*/@Transactional@PutMapping("/pay/{id}")public Result<?> pay(@PathVariable Long id) {Order order = orderService.getById(id);BigDecimal totalPrice = order.getTotalPrice();Long userId = getUser().getId();User user = userService.findById(userId);if (user.getAccount().compareTo(totalPrice) <= 0) {throw new CustomException("-1", "余额不足");}user.setAccount(user.getAccount().subtract(totalPrice)); // 设置用户余额userService.updateById(user);order.setState("待发货");orderService.updateById(order);return Result.success();}@DeleteMapping("/{id}")public Result<?> delete(@PathVariable Long id) {orderService.removeById(id);return Result.success();}/*** 获取订单的确认信息** @return*/@PostMapping("/pre")public Result<?> pre(@RequestBody PreOrderQo preOrderQo) throws JSONException {String cartsStr = preOrderQo.getCarts();// 讲前台传来的json字符串转换成 list对象List<Cart> carts = JSONUtil.toBean(cartsStr, new TypeReference<List<Cart>>() {}, true);Map<String, Object> all = cartService.findAll(carts);return Result.success(all);}@GetMapping("/{id}")public Result<?> findById(@PathVariable Long id) {return Result.success(orderService.getById(id));}@GetMappingpublic Result<?> findAll() {List<Order> list = orderService.list();return Result.success(list);}@GetMapping("/page")public Result<?> findPage(@RequestParam(required = false, defaultValue = "") String name,@RequestParam(required = false, defaultValue = "1") Integer pageNum,@RequestParam(required = false, defaultValue = "10") Integer pageSize) {LambdaQueryWrapper<Order> query = Wrappers.<Order>lambdaQuery().orderByDesc(Order::getId);if (StrUtil.isNotBlank(name)) {query.like(Order::getOrderNo, name);}IPage<Order> page = orderService.page(new Page<>(pageNum, pageSize), query);return Result.success(page);}/*** 前台查询订单列表* @param state* @param pageNum* @param pageSize* @return*/@GetMapping("/page/front")public Result<?> findPageFront(@RequestParam(required = false, defaultValue = "") String state,@RequestParam(required = false, defaultValue = "1") Integer pageNum,@RequestParam(required = false, defaultValue = "10") Integer pageSize) {LambdaQueryWrapper<Order> query = Wrappers.<Order>lambdaQuery().orderByDesc(Order::getId);query.eq(Order::getUserId, getUser().getId());// 根据状态查询if (StrUtil.isNotBlank(state)) {query.eq(Order::getState, state);}IPage<Order> page = orderService.page(new Page<>(pageNum, pageSize), query);for (Order order : page.getRecords()) {Long orderId = order.getId();List<Cart> carts = orderGoodsService.findByOrderId(orderId);order.setCarts(JSONUtil.toJsonStr(carts));}return Result.success(page);}}

五、底部获取项目(9.9¥带走)

有问题,或者需要协助调试运行项目的也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2777798.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Java多线程案例】实现阻塞队列

1. 阻塞队列简介 1.1 阻塞队列概念 阻塞队列&#xff1a;是一种特殊的队列&#xff0c;具有队列"先进先出"的特性&#xff0c;同时相较于普通队列&#xff0c;阻塞队列是线程安全的&#xff0c;并且带有阻塞功能&#xff0c;表现形式如下&#xff1a; 当队列满时&…

【C++第二阶段】运算符重载-【+】【cout】【++|--】

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 运算符重载加法运算符重载重载左移运算符递增|减运算符重载 运算符重载 加法运算符重载 What 普通的加减乘除&#xff0c;只能应付C中已给定的数据类型的运…

Java SE多态

文章目录 1.多态&#xff1a;1.1.什么是多态&#xff1a;1.2.多态实现条件&#xff1a;1.2.1.重写&#xff1a;1.2.2.向上转型&#xff1a; 1.多态&#xff1a; 1.1.什么是多态&#xff1a; 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去…

分享76个表单按钮JS特效,总有一款适合您

分享76个表单按钮JS特效&#xff0c;总有一款适合您 76个表单按钮JS特效下载链接&#xff1a;https://pan.baidu.com/s/1CW9aoh23UIwj9zdJGNVb5w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集…

【开源】JAVA+Vue+SpringBoot实现实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

echarts 曲线图自定义提示框

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>曲线图</title><!-- 引入 ECharts 库 -->…

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

Mybatis开发辅助神器p6spy

Mybatis什么都好&#xff0c;就是不能打印完整的SQL语句&#xff0c;虽然可以根据数据来判断一二&#xff0c;但始终不能直观的看到实际语句。这对我们想用完整语句去数据库里执行&#xff0c;带来了不便。 怎么说呢不管用其他什么方式来实现完整语句&#xff0c;都始终不是Myb…

2万字曝光:华尔街疯狂抢购比特币背后

作者/来源&#xff1a;Mark Goodwin and whitney Webb BitcoinMagazine 编译&#xff1a;秦晋 全文&#xff1a;19000余字 在最近比特币ETF获得批准之后&#xff0c;贝莱德的拉里-芬克透露&#xff0c;很快所有东西都将被「ETF化」与代币化&#xff0c;不仅威胁到现有的资产和商…

InternLM大模型实战-3.InternLM+Langchain搭建知识库

文章目录 前言笔记正文大模型开发范式RAGFinetune LangChain简介构建向量数据库搭建知识库助手1 InternLMLangchain2 构建检索问答链3 优化建议 Web Demo 部署搭建知识库 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记。【基于 InternLM 和 LangChain 搭建你的知识…

今年春节联欢晚会中的扑克魔术到底是咋变的?

今年的刘谦给全国观众带来了俩魔术&#xff0c;一个是洗牌一个是撕牌&#xff0c;前面第一个魔术看不出来太神奇了&#xff0c;但是第二魔术感觉挺有趣的我可以简单分析分析。 然后我们列出这个魔术的关键步骤&#xff1a; 打乱四张牌 1 2 3 4 对折、撕开、面向同一个方向重…

Windows下搭建Redis Sentinel

下载安装程序 下载Redis关于Windows安装程序&#xff0c;下载地址 下载成功后进行解压&#xff0c;解压如下&#xff1a; 配置redis和sentinel 首先复制三份redis.windows.conf&#xff0c;分别命名为&#xff1a;redis.6379.conf、redis.6380.conf、redis.6381.conf&…

无心剑中译佚名《春回大地》

The Coming of Spring 春回大地 I am coming, little maiden, With the pleasant sunshine laden, With the honey for the bee, With the blossom for the tree. 我来啦&#xff0c;小姑娘 满载着欣悦的阳光 蜂儿有蜜酿 树儿有花绽放 Every little stream is bright, All …

机器学习:分类决策树(Python)

一、各种熵的计算 entropy_utils.py import numpy as np # 数值计算 import math # 标量数据的计算class EntropyUtils:"""决策树中各种熵的计算&#xff0c;包括信息熵、信息增益、信息增益率、基尼指数。统一要求&#xff1a;按照信息增益最大、信息增益率…

iOS AlDente 1.0自动防过充, 拯救电池健康度

经常玩iOS的朋友可能遇到过长时间过充导致的电池鼓包及健康度下降问题。MacOS上同样会出现该问题&#xff0c;笔者用了4年的MBP上周刚拿去修了&#xff0c;就是因为长期不拔电源的充电&#xff0c;开始还是电量一半的时候不接电源会黑屏无法开机&#xff0c;最后连着电源都无法…

春晚刘谦魔术的模拟程序

昨晚春晚上刘谦的两个魔术表演都非常精彩&#xff0c;尤其是第二个魔术&#xff0c;他演绎了经典的约瑟夫环问题&#xff01; 什么是约瑟夫环问题&#xff1f; 约瑟夫环&#xff08;Josephus problem&#xff09;是一个经典的数学问题&#xff0c;最早由古罗马历史学家弗拉维…

VUE学习——数组变化侦测

官方文档 变更方法&#xff1a; 使用之后&#xff0c;ui可以直接发生改变。改变原数组 替换数组&#xff1a; 使用之后需要接受重新赋值&#xff0c;不然ui不发生改变。不改变原数组

JavaScript表单元素

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 表单作为页面的重要交互组件,JavaScript 提供了丰富的表单元素操作方…

计算机网络第6章(应用层)

6.1、应用层概述 我们在浏览器的地址中输入某个网站的域名后&#xff0c;就可以访问该网站的内容&#xff0c;这个就是万维网WWW应用&#xff0c;其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名&#xff0c;而TCP/IP的网际层使用IP地…

Flink-CDC实时读Postgresql数据

前言 CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等。 用户可以在如下的场景使用cdc: 实时数据同步:比如将Postgresql库中的数据同步到我们的数仓中…