springboot+vue实现在线书店(图书商城)系统

今天教大家如何设计一个图书商城 , 基于目前主流的技术:前端vue,后端springboot。

同时还带来的项目的部署教程

视频演示

在线书城

图片演示

一. 系统概述

商城是一款比较庞大的系统,需要有商品中心,库存中心,订单中心,收货地址和运费管理。先看下我们要实现的商城有哪些功能:

1. 商品分类管理。

2. 商品管理。

3.库存管理。

4.订单管理。 

5. 评价管理。

6.用户管理。

7.运费和运费模板管理。

8. 系统公告管理。

9.首页轮播图管理。

10. 用户购物车。

二. 核心功能实现思想

库存系统的设计

库存最大的问题就是超卖,也就是说有多个人同时并发下单,库存需要保持一致性,不会扣减到小于0的情况。普通的设计就是加一个全局锁。每个人下单都需要等待上一个人下单完成。

这样严重影响效率。这里我们库存的设计流程如下:

1. 首先我们将库存分为 数据库库存 和 销售库存。 数据库库存就是存储到数据库的商品库存值,销售库存就是用户下单,页面所在的库存值。

2. 后台管理上架商品时,会设置一个初始库存,我们将初始库存存储到数据库库存 和 销售库存 。

3.当用户下单时,不是直接扣减的数据库库存,而是通过redis的 decrement 方法,对销售库存进行扣减。但是redis的扣减操作这里还不是一个原子性操作,需要先从redis查出库存,然后进行decrment操作。这两步操作我们用reddsion的分布式锁来控制原子性,同时,我们将加锁的维度控制到了商品id。这样大大提高了并发效率。

3. 库存扣减后,我们又通过redis消费队列,实现了对数据库库存的同步。这样保持了redis库存和数据库库存的一致性。

4. 后台我们设计的是对商品只能加加库存,和减少库存的操作,而不是直接修改库存值。如果你直接修改库存值,就有可能会导致库存数据不一致,难以跟踪。

5. 我们还设计了库存的扣减,新增日志,方便对库存进行跟踪管理。

库存扣减的部分代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

/**

     * 扣减库存(使用Redisson分布式锁)

     * @param productId 商品ID

     * @param quantity 扣减数量

     * @return true-扣减成功,false-扣减失败(库存不足)

     */

    public boolean deductInventory(String productId, int quantity) {

        String lockKey = "lock:inventory:" + productId;

        String inventoryKey = "inventory:" + productId;

        RLock lock = redissonClient.getLock(lockKey);

        try {

            // 尝试加锁,最多等待10秒,锁过期时间30秒

            boolean locked = lock.tryLock(1030, TimeUnit.SECONDS);

            if (locked) {

                String stock = (String) redisTemplate.opsForValue().get(inventoryKey);

                if(StringUtils.isEmpty(stock)){

                    return false;

                }

                if (Integer.parseInt(stock) < quantity) {

                    return false;

                }

                // 扣减库存

                redisTemplate.opsForValue().decrement(inventoryKey, quantity);

                return true;

            }

            return false;

        catch (InterruptedException e) {

            Thread.currentThread().interrupt();

            return false;

        finally {

            // 释放锁

            if (lock.isHeldByCurrentThread()) {

                lock.unlock();

            }

        }

    }

    /**

     * 设置商品库存

     * @param productId 商品ID

     * @param quantity 库存数量

     */

    public void setInventory(String productId, int quantity) {

        String inventoryKey = "inventory:" + productId;

        redisTemplate.opsForValue().set(inventoryKey, quantity);

        System.out.println("库存设置: 商品id:" + productId + " , 数量:" + quantity);

    }

    /**

     * 获取商品库存

     * @param productId 商品ID

     * @return 当前库存数量

     */

    public int getInventory(String productId) {

        String inventoryKey = "inventory:" + productId;

        Object value = redisTemplate.opsForValue().get(inventoryKey);

        return value == null 0 : Integer.parseInt(value.toString());

    }

  

商品系统的设计

商品包含了很多属性,这里我设计的商品表如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

CREATE TABLE `product` (

  `product_id` int NOT NULL AUTO_INCREMENT COMMENT '商品id',

  `product_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称',

  `category_id` int NOT NULL COMMENT '类目id',

  `product_title` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品标题',

  `product_intro` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品详情',

  `product_picture` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品封面图',

  `product_price` double NOT NULL COMMENT '商品原价',

  `product_selling_price` double NOT NULL COMMENT '商品售卖价',

  `product_num` int NOT NULL COMMENT '商品库存',

  `product_sales` int NOT NULL COMMENT '销量',

  `state` tinyint DEFAULT '0' COMMENT '0-上架  1- 下架',

  `score` double DEFAULT NULL COMMENT '推荐评分,总共有5星',

  PRIMARY KEY (`product_id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品';

 

商品还关联了多图

1

2

3

4

5

6

7

CREATE TABLE `product_picture` (

  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',

  `product_id` int NOT NULL COMMENT '商品id',

  `product_picture` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品图片',

  `intro` text CHARACTER SET utf8 COLLATE utf8_general_ci,

  PRIMARY KEY (`id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=167 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品图片';

  

商品还有一个动态的字典属性

动态字典属性表设计

1

2

3

4

5

6

7

8

9

10

11

12

13

14

CREATE TABLE `product_attr` (

  `id` int NOT NULL AUTO_INCREMENT,

  `product_id` int NOT NULL,

  `product_attr_config_id` int NOT NULL COMMENT '商品属性字典id',

  `attr_val` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '属性值',

  PRIMARY KEY (`id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=190 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品属性与字典关联';

CREATE TABLE `product_attr_config` (

  `id` int NOT NULL AUTO_INCREMENT,

  `attr_name` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '字典描述',

  `attr_key` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '字典key',

  PRIMARY KEY (`id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品属性字典';

  

订单系统的设计

我们将订单的状态设计成以下几种:0-待付款 1-待发货 2-待收货 3-待评价 4-已完成 5-退款中 6-已退款 7-已取消。

订单状态扭转流程:

1. 用户点击购买商品或从购物车点击,则商品进入待付款状态,此时,商品库存被锁,也就是实实在在的扣减了销售库存。

2. 当30分钟超过后,用户未支付上面的待付款订单,则订单状态扭转为已取消,库存回流,此笔订单结束。

3. 当用户30分钟内支付后,订单扭转为代发货。

4. 管理员登录管理后台,将待发货订单进行发货操作后,订单状态变成待收货。

5. 用户可以对待收获订单进行收获和退款操作,如果是退款,则变成退款中,管理员进行退款确认,确认后,订单变成已退款,退款成功后,库存回流。此订单结束。

6. 如果用户确认收获,则订单变成待评价,用户可以进行评价,评价完成后,订单变成已完成,此订单结束。

订单表设计如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

CREATE TABLE `orders` (

  `order_id` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,

  `user_id` int NOT NULL COMMENT '用户id',

  `product_id` int NOT NULL COMMENT '商品id',

  `product_num` int NOT NULL COMMENT '商品数量',

  `order_state` int NOT NULL COMMENT '订单状态 0-待付款 1-待发货 2-待收货 3-待评价 4-已完成 5-退款中 6-已退款 7-已取消',

  `product_price` double NOT NULL COMMENT '下单商品价格',

  `shipping_price` double NOT NULL COMMENT '下单运费价格',

  `refund_cause` varchar(2255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '退款原因',

  `order_remark` varchar(2000) COLLATE utf8mb4_bin NOT NULL COMMENT '订单备注',

  `pay_type` int DEFAULT NULL COMMENT '支付方式:0-支付宝 1-微信',

  `address` varchar(2000) COLLATE utf8mb4_bin NOT NULL COMMENT '收获地址',

  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  PRIMARY KEY (`order_id`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单';

  

三. 技术栈概述

后端技术栈:

JDK8 + springboot + mysql8

前端技术栈:

vue + Axios 等

四. 项目部署教程

前端部署

安装node , 版本:v22.15.0 , 安装完成后。

 进入到项目 hadluo-shop-webadmin 目录下,这个项目是vue的管理后台, 右键,运行cmd,运行下面命令:

npm run dev

由于我已经跟你npm install好了,所以你无需执行,直接run就可以了!!

运行项目

进入到项目 hadluo-shop-h5 目录下,这个项目是vue的前端, 右键,运行cmd,运行下面命令:

npm run dev

由于我已经跟你npm install好了,所以你无需执行,直接run就可以了!!

运行项目

到此前端项目部署完成。

执行sql

自己安装好数据库,注意,必须是mysql8 ,否则代码运行会出错。新建一个 wxhadluo-bookshop 数据库, 然后执行  “wxhadluo-bookshop.sql”

Redis安装

项目需要安装redis,直接下载一个windows版本的redis即可,没有的联系我。

启动后端项目

然后部署后端 , 打开idea, 导入maven工程 hadluo-bookshop。

打开resources目录, 修改 application.yml 配置文件,主要修改下面几个信息:

然后启动  main 启动类 : Application.class

五. 访问项目

管理后端:

http://localhost:3001/

账号:wx-hadluo,  密码: 123456

前端:

http://localhost:3000/

用户: 453423@qq.com / 123456

可以自己注册用户。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…

Oracle统计信息收集时的锁持有阶段

Oracle统计信息收集时的锁持有阶段 1 准备阶段&#xff08;共享模式锁&#xff09; 锁类型&#xff1a;对象级共享锁&#xff08;S锁&#xff09; 持续时间&#xff1a;通常1-5秒 主要操作&#xff1a; 验证对象存在性和权限检查统计信息首选项设置确定采样方法和并行度 监…

shell常用语法

一、shell变量 定义变量语法&#xff1a; 变量名值 # 等号两边不能有空格 示例&#xff1a; #!/bin/bash name"Alice" echo "Hello, $name!" # 使用变量使用变量-语法&#xff1a; 两种方式&#xff1a; 第一种&#xff1a;${变量名} 第二种&#x…

《教育退费那些事儿:从困境到破局》

《教育退费那些事儿&#xff1a;从困境到破局》 教育退费&#xff1a;不容忽视的热点问题 在当今社会&#xff0c;教育消费已成为家庭支出的重要组成部分。无论是 K12 阶段的学科辅导、艺术特长培训&#xff0c;还是成人的职业技能提升、学历继续教育&#xff0c;家长和学生们…

老字号焕新案例:天猫代运营如何让传统品牌年轻化破圈

老字号焕新案例&#xff1a;天猫代运营如何让传统品牌年轻化破圈 在消费升级与年轻化浪潮的冲击下&#xff0c;传统老字号品牌常面临“有历史无活力、有产品无流量”的困境。如何借助电商平台实现品牌焕新&#xff0c;成为其破局的关键。品融&#xff08;PINKROON&#xff09…

高可靠低纹波国产4644电源芯片在工业设备的应用

摘要 随着工业自动化和智能化的飞速发展&#xff0c;工业设备对于电源芯片的性能和可靠性提出了前所未有的严格要求。电源芯片作为工业设备的核心供电组件&#xff0c;其性能直接影响到整个设备的运行效率和稳定性。本文以国科安芯的ASP4644四通道降压稳压器为例&#xff0c;通…

Vue组件-霓虹灯:技术解析与实现

Vue组件-霓虹灯&#xff1a;技术解析与实现 本文将详细解析如何使用Vue 3实现一个动态炫彩霓虹灯效果。 预览 概述 此Vue组件创建了一个由7个同心圆环组成的霓虹灯效果&#xff0c;每个圆环具有彩虹中的一种颜色&#xff08;红、橙、黄、绿、蓝、靛、紫&#xff09;。这些圆…

【实战教程】从零实现DeepSeek AI多专家协作系统 - Spring Boot+React打造AI专家团队协作平台

&#x1f680; 本项目是DeepSeek大模型应用系列的V3版本&#xff0c;基于V1和V2版本的功能进行全面升级&#xff0c;引入了多智能体协作机制&#xff01; 系列教程推荐阅读顺序&#xff1a; 【V1版本】零基础搭建DeepSeek大模型聊天系统 - Spring BootReact完整开发指南【V2版本…

第8章-5 sql的执行顺序

上一篇&#xff1a;《第8章-4 查询性能优化2》&#xff0c;接着来了解查询的执行顺序&#xff0c;了解顺序对于优化会有帮助。 1&#xff0c;sql编写顺序 select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 group by 分组字段 having 分组后…

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…

Linux干货(二)

前言 从B站黑马程序员Linux课程摘选的学习干货&#xff0c;新手友好&#xff01;若有侵权&#xff0c;会第一时间处理。 目录 前言 1.cd pwd命令 1.cd命令的作用 2.pwd命令的作用 2.相对路径绝对路径和特殊路径符 1.相对路径和绝对路径 1.绝对路径 2.相对路径 2.特殊…

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;说明模块已编译进 NGINX。 若未找到&#xff0c;请联系你的 NGINX 供应商&#xff0c;获取商业版或重新编译并启用该模块&am…

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重启小皮 7、切换…

LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

在日常刷题和面试中,「合并两个有序数组」是一个经典基础题。虽然属于简单难度,但它非常考察你的数组操作技巧和代码优化能力。本篇文章将带你从基础解法入手,进阶到最简洁的三元表达式写法,理解每一行代码背后的逻辑。 📌 题目描述 给你两个按 非递减顺序 排列的整数数组…

Kafka进阶指南:从原理到实战

目录 一、Kafka 基础回顾 二、生产者进阶 2.1 数据生产流程深度解析 2.2 关键配置参数详解 2.3 序列化与自定义序列化器 三、消费者进阶 3.1 消费方式与原理 3.2 分区分配策略 3.2.1 Range&#xff08;范围&#xff09;策略 3.2.2 Round - Robin&#xff08;轮询&…

Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器

​一、软件介绍 文末提供程序和源码下载 Lightpanda开源浏览器&#xff1a;专为 AI 和自动化而设计的无界面浏览器&#xff1b; Javascript execution Javascript 执行Support of Web APIs (partial, WIP)支持 Web API&#xff08;部分、WIP&#xff09;Compatible with Pla…

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…

SpringCloud之Ribbon基础认识-服务负载均衡

0、Ribbon基本认识 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。 Ribbon 会基于某种规则&#xff08;如简单…

当 DeepSeek 遇见区块链:一场颠覆式的应用革命

目录 一、DeepSeek 与区块链的初印象二、技术融合&#xff1a;创新的基石2.1 强化学习优化智能合约2.2 混合专家系统适配多链2.3 语义理解增强合规性 三、应用实践&#xff1a;重塑行业格局3.1 DeFi 协议智能化跃迁3.2 GameFi 经济深度进化3.3 供应链金融信任增强 四、面临挑战…

vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册

简介 这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发&#xff0c;仅支持 Vue 3。 除了支持官方提供的各种语法模式外&#xff0c;还额外添加了日志输出展示模式&#xff0c;开箱即用&#xff0c;但不一定适用于所有场景。 如需完整文档和更多使用案例…