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(10,?30, 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.pswp.cn/web/79933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79933.shtml
英文地址,請注明出處:http://en.pswp.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;但不一定適用于所有場景。 如需完整文檔和更多使用案例…