基于Vue、Springboot、Mysql的前后端分離的電商管理系統(tǒng),不僅功能完善,還有詳細(xì)課設(shè)報(bào)告供查看,這不收藏起來,源碼和論文獲取見文末結(jié)尾
文章來源:http://www.zghlxwxcb.cn/news/detail-691458.html
部分報(bào)告內(nèi)容如下(省略圖片)文章來源地址http://www.zghlxwxcb.cn/news/detail-691458.html
```c
目錄
1 引言 4
1.1 編寫目的 4
1.2 項(xiàng)目背景 4
1.3 參考資料 4
2 總體設(shè)計(jì) 4
2.1 需求概述 4
2.2 軟件結(jié)構(gòu) 5
3 模塊設(shè)計(jì) 6
3.1 模塊基本信息 6
3.1.1 商品管理模塊 6
3.1.2 商品分類模塊 6
3.1.3 訂單管理模塊 6
3.1.4用戶管理模塊 6
3.1.5 購物車管理模塊 6
3.2 模塊處理邏輯 7
4 UML建模 9
4.1 類圖 9
4.2 時(shí)序圖 10
4.3用例圖 10
4.4 活動(dòng)圖 11
4.5 組件圖 11
4.6 部署圖 11
5 數(shù)據(jù)庫設(shè)計(jì) 12
5.1 ER圖表 12
5.2 表設(shè)計(jì) 13
5.2.1 地址表 13
5.2.2 頭像表 13
5.2.3 輪播圖表 14
5.2.4 購物車表 14
5.2.5 分類表 15
5.2.6 商品表 15
5.2.7 商品規(guī)格關(guān)聯(lián)表 16
5.2.8 圖標(biāo)表 17
5.2.9 圖標(biāo)分類關(guān)聯(lián)表 17
5.2.10 訂單商品關(guān)聯(lián)表 17
5.2.11 規(guī)格表 18
5.2.12 系統(tǒng)文件表 18
5.2.13 用戶表 19
5.2.14 訂單表 20
6 接口設(shè)計(jì) 21
6.1 外部接口 21
6.1.1 登錄界面 21
6.1.2 注冊(cè)界面 22
6.1.3 商城首頁 23
6.1.4 個(gè)人信息界面 24
6.1.5 購物車界面 26
6.1.6 地址信息界面 27
6.1.7 訂單界面 28
6.1.8 管理員界面 30
6.1.9 輪播圖管理界面 31
6.1.10 訂單管理界面 32
6.1.11 商品分類管理界面 34
6.1.12 用戶管理界面 36
6.1.13 統(tǒng)計(jì)界面 38
6.2 內(nèi)部接口 39
6.2.1 登錄接口 39
6.2.2 注冊(cè)接口 39
6.2.3 地址管理接口 39
6.2.4 頭像管理接口 41
6.2.5 輪播圖管理接口 42
6.2.6 購物車管理接口 43
6.2.7 分類管理接口 44
6.2.8 文件管理接口 45
6.2.9 商品管理接口 47
6.2.10 圖標(biāo)管理接口 49
6.2.11 收入分析管理接口 50
6.2.12 訂單管理接口 51
6.2.13 角色管理接口 53
6.2.14 用戶管理接口 53
7 性能 55
7.1 精度 55
7.2 時(shí)間特性 55
7.3 靈活性 55
8 測(cè)試 55
1 引言
1.1 編寫目的
根據(jù)需求分析文檔確定的需求,為系統(tǒng)開發(fā)提供更為詳細(xì)、精確、可行的設(shè)計(jì)方案。在該文檔中,我們將具體闡述系統(tǒng)各個(gè)階段的設(shè)計(jì)方案,包括系統(tǒng)架構(gòu)、模塊劃分、數(shù)據(jù)庫設(shè)計(jì)、界面設(shè)計(jì)等細(xì)節(jié)內(nèi)容,以確保開發(fā)人員能夠準(zhǔn)確理解和實(shí)現(xiàn)每一個(gè)階段的開發(fā)。同時(shí),該文檔也需要提供詳細(xì)的系統(tǒng)運(yùn)行流程,通訊協(xié)議,算法實(shí)現(xiàn)、數(shù)據(jù)結(jié)構(gòu)的說明等,以方便開發(fā)人員寫出可靠的代碼。另外,在系統(tǒng)維護(hù)時(shí),該文檔也作為重要依據(jù),提供系統(tǒng)各模塊的設(shè)計(jì)原則、開發(fā)要求、版本升級(jí)策略等,以確保系統(tǒng)可維護(hù)、可擴(kuò)展、可重用性、安全性等方面要求得以滿足。因此,該文檔的編寫應(yīng)該全面考慮因素,并盡可能確保其具有清晰性、可讀性和易于理解性,以便于開發(fā)人員理解、協(xié)作和實(shí)現(xiàn)。
1.2 項(xiàng)目背景
該電子商城系統(tǒng)是針對(duì)線上購物市場(chǎng)的一款應(yīng)用系統(tǒng),通過結(jié)合Spring Boot和Vue技術(shù)實(shí)現(xiàn)了商品管理、商品分類、訂單管理、用戶管理、購物車管理等相關(guān)功能。系統(tǒng)旨在為買家提供一個(gè)方便快捷、高效、可靠的購物服務(wù)。
1.3 參考資料
[1] 林曉斌. Java企業(yè)級(jí)開發(fā)實(shí)戰(zhàn)[M]. 第二版. 北京: 人民郵電出版社, 2017.
[2] 鄧俊輝. 數(shù)據(jù)結(jié)構(gòu)[M]. 北京: 清華大學(xué)出版社, 2018.
[3] 劉偉. SpringBoot企業(yè)級(jí)應(yīng)用開發(fā)實(shí)戰(zhàn)[M]. 北京: 電子工業(yè)出版社, 2017.
[4] 張磊, 馬俊昭, 王麗華, 等. Vue.js實(shí)戰(zhàn)[M]. 北京: 人民郵電出版社, 2017.
[5] 鄭海波, 金丹華, 張曼. 電子商務(wù)系統(tǒng)設(shè)計(jì)[M]. 北京: 清華大學(xué)出版社, 2009.
2 總體設(shè)計(jì)
2.1 需求概述
(1)商品管理模塊:實(shí)現(xiàn)了商品的基本信息錄入、圖片上傳、狀態(tài)管理等相關(guān)功能。
(2)商品分類模塊:實(shí)現(xiàn)了分類的增刪改查、分類層級(jí)管理、商品分類的關(guān)聯(lián)等功能。
(3)訂單管理模塊:實(shí)現(xiàn)了訂單的查詢、創(chuàng)建、刪除、退貨等功能。
(4)用戶管理模塊:實(shí)現(xiàn)了用戶的注冊(cè)、登錄、密碼找回、個(gè)人信息修改和查詢等功能。
(5)購物車管理模塊:實(shí)現(xiàn)了添加商品、刪除商品、調(diào)整數(shù)量、結(jié)算等功能。
2.2 軟件結(jié)構(gòu)
描述:以上的軟件結(jié)構(gòu)圖,采用了四層架構(gòu)設(shè)計(jì),不同層之間通過依賴關(guān)系進(jìn)行交互。展示層采用Vue.js框架來實(shí)現(xiàn),應(yīng)用層處理各種請(qǐng)求并調(diào)用服務(wù)層來處理具體業(yè)務(wù)邏輯,領(lǐng)域?qū)迂?fù)責(zé)封裝業(yè)務(wù)邏輯,基礎(chǔ)設(shè)施層負(fù)責(zé)管理底層資源,如數(shù)據(jù)庫和緩存等。該軟件結(jié)構(gòu)圖體現(xiàn)了高內(nèi)聚低耦合的設(shè)計(jì)原則,有利于系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
3 模塊設(shè)計(jì)
3.1 模塊基本信息
3.1.1 商品管理模塊
模塊描述:負(fù)責(zé)對(duì)商品進(jìn)行增刪改查等基本操作,包括商品信息的錄入、維護(hù)和展示,商品圖片的上傳、展示和刪除,商品狀態(tài)的管理等功能。
3.1.2 商品分類模塊
模塊描述:負(fù)責(zé)商品分類的管理,包括商品分類的層級(jí)關(guān)系維護(hù)、新增、修改、刪除等基本操作。
3.1.3 訂單管理模塊
模塊描述:負(fù)責(zé)訂單相關(guān)的基礎(chǔ)操作,包括訂單的查詢、創(chuàng)建、刪除等功能。
3.1.4用戶管理模塊
模塊描述:負(fù)責(zé)用戶信息相關(guān)功能,包括用戶注冊(cè)、登錄、個(gè)人信息維護(hù)等操作。
3.1.5 購物車管理模塊
模塊描述:負(fù)責(zé)購物車的管理,包括加入購物車、調(diào)整商品數(shù)量、刪除商品、結(jié)算等基本操作。
3.2 模塊處理邏輯
以上流程圖是用戶在購物車界面添加商品的操作流程。首先查詢?cè)撋唐肥欠褚呀?jīng)在購物車中,若已存在,則調(diào)整該商品的數(shù)量,否則添加該商品至購物車。最后返回添加或調(diào)整的結(jié)果信息。這個(gè)流程設(shè)計(jì)簡(jiǎn)潔,易于理解。
以上流程圖是用戶提交訂單的操作流程。首先檢查所有商品的庫存是否充足,若充足則創(chuàng)建訂單并扣除庫存,否則返回庫存不足錯(cuò)誤信息。然后生成訂單號(hào)和支付信息,完成支付,返回支付結(jié)果,更新訂單狀態(tài)為已支付,最后生成返回信息。這個(gè)流程設(shè)計(jì)清晰明了,覆蓋了電商系統(tǒng)中訂單的基本操作。
以上流程圖是用戶在購物車中刪除商品的操作流程。首先查詢?cè)撋唐肥欠裨谫徫镘囍?,若存在則從購物車中刪除該商品,否則返回未找到商品錯(cuò)誤信息。最后生成刪除結(jié)果信息并返回給用戶。這個(gè)流程設(shè)計(jì)簡(jiǎn)潔明了,有效實(shí)現(xiàn)了購物車中刪除商品的功能。
以上流程圖是用戶上傳商品圖片的操作流程。用戶上傳圖片后,服務(wù)器接受到上傳請(qǐng)求并根據(jù)圖片大小和格式生成存儲(chǔ)路徑。然后將圖片存儲(chǔ)至指定路徑,并生成存儲(chǔ)成功信息返回給用戶。這個(gè)流程設(shè)計(jì)簡(jiǎn)單清晰,有利于實(shí)現(xiàn)圖片上傳的功能。
4 UML建模
4.1 類圖
4.2 時(shí)序圖
4.3 用例圖
4.4 活動(dòng)圖
4.5 組件圖
4.6 部署圖
5 數(shù)據(jù)庫設(shè)計(jì)
5.1 ER圖表
5.2 表設(shè)計(jì)
5.2.1 地址表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
link_user varchar(255) 聯(lián)系人
link_address varchar(255) 地址
link_phone varchar(255) 電話
user_id bigint(0) 所屬用戶
5.2.2 頭像表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
type varchar(255) 類型
size bigint(0) 大小
url varchar(255) 地址
md5 varchar(255) Md5值
5.2.3 輪播圖表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
good_id bigint(0) 對(duì)應(yīng)的商品id
show_order int(0) 播放順序
5.2.4 購物車表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
count int(0) 數(shù)量
create_time datetime(0) 加入時(shí)間
good_id bigint(0) 商品id
standard varchar(255) 規(guī)格
user_id bigint(0) 用戶id
5.2.5 分類表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
name varchar(255) 類別名稱
5.2.6 商品表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
name varchar(255) 商品名稱
description varchar(1600) 描述
discount double(10, 2) 折扣
sales bigint(0) 銷量
sale_money double(10, 2) 銷售額
category_id bigint(0) 分類id
imgs varchar(255) 商品圖片
create_time datetime(0) 創(chuàng)建時(shí)間
recommend tinyint(1) 是否推薦。0不推薦,1推薦
is_delete tinyint(1) 是否刪除,0未刪除,1刪除
5.2.7 商品規(guī)格關(guān)聯(lián)表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
good_id bigint(0) 商品id
value varchar(255) 規(guī)格
price decimal(10, 2) 價(jià)格
store bigint(0) 庫存
5.2.8 圖標(biāo)表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
value varchar(255) 圖標(biāo)的識(shí)別碼
5.2.9 圖標(biāo)分類關(guān)聯(lián)表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
category_id bigint(0) 分類id
icon_id bigint(0) 圖標(biāo)id
5.2.10 訂單商品關(guān)聯(lián)表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
order_id bigint(0) 訂單id
good_id bigint(0) 商品id
count int(0) 數(shù)量
standard varchar(1600) 規(guī)格
5.2.11 規(guī)格表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
goodId bigint(0) 商品id
value varchar(255) 商品規(guī)格
price decimal(10, 2) 該規(guī)格的價(jià)格
store bigint(0) 該規(guī)格的庫存
5.2.12 系統(tǒng)文件表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
name varchar(255) 文件名稱
type varchar(255) 文件類型
size bigint(0) 大小
url varchar(255) 文件路徑
is_delete tinyint(1) 是否刪除
enable tinyint(1) 是否啟用
md5 varchar(255) md5值
5.2.13 用戶表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
username varchar(255) 用戶名
password varchar(255) 密碼
nickname varchar(255) 昵稱
email varchar(255) 郵箱
phone varchar(255) 手機(jī)號(hào)碼
address varchar(1600) 地址
avatar_url varchar(255) 頭像鏈接
5.2.14 訂單表
數(shù)據(jù)名稱 數(shù)據(jù)類型 數(shù)據(jù)描述
id bigint(0) 主鍵
order_no varchar(255) 訂單號(hào)
total_price decimal(10, 2) 總價(jià)
user_id bigint(0) 用戶id
link_user varchar(255) 聯(lián)系人
link_phone varchar(255) 聯(lián)系電話
link_address varchar(255) 地址
state varchar(255) 訂單狀態(tài)
create_time datetime(0) 創(chuàng)建時(shí)間
6 接口設(shè)計(jì)
6.1 外部接口
6.1.1 登錄界面
<div class="title">
<b>登錄在線商城</b>
</div>
<div style="margin-top: 30px">
<el-form label-width="70px">
<el-form-item label="用戶名">
<el-input v-model.trim="user.username" aria-required="true"></el-input>
</el-form-item>
<el-form-item label="密碼" style="margin-top: 25px">
<el-input v-model.trim="user.password" show-password aria-required="true"></el-input>
</el-form-item>
<el-form-item style="margin: 30px 80px">
<el-button type="success" @click="onSubmit">登錄</el-button>
<el-button @click="$router.push('/register')">注冊(cè)</el-button>
</el-form-item>
</el-form>
</div>
6.1.2 注冊(cè)界面
<div class="title">
<b>注 冊(cè)</b>
</div>
<div style="margin-top: 30px">
<el-form label-width="70px">
<el-form-item label="用戶名">
<el-input v-model.trim="user.username" aria-required="true"></el-input>
</el-form-item>
<el-form-item label="密碼" style="margin-top: 25px">
<el-input v-model.trim="user.password" show-password aria-required="true"></el-input>
</el-form-item>
<el-form-item label="確認(rèn)密碼" style="margin-top: 25px">
<el-input v-model.trim="user.confirmPassword" show-password aria-required="true"></el-input>
</el-form-item>
<el-form-item style="margin: 30px 80px">
<el-button type="success" @click="onSubmit">注冊(cè)</el-button>
<el-button @click="$router.push('/login')">返回</el-button>
</el-form-item>
</el-form>
</div>
6.1.3 商城首頁
<el-container style="height: 100%;width:100%;">
<el-header style="background-color: white">
<Navagation :user="user"
:role="role"
:login-status="loginStatus"
></Navagation>
</el-header>
<el-main style="background-color: lightgrey;width:100%;">
<router-view />
</el-main>
</el-container>
6.1.4 個(gè)人信息界面
<el-card class="card">
<div style="text-align: center; margin-bottom: 30px">
<b>修改個(gè)人信息</b>
</div>
<el-form label-width="60px">
<el-form-item label="頭像">
<el-upload
class="avatar-uploader"
:action="baseApi + '/avatar'"
:headers="token"
:show-file-list="false"
:on-success="handleAvatarSuccess"
>
<img
v-if="form.avatarUrl"
:src="baseApi + form.avatarUrl"
class="avatar"
/>
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
<el-form-item label="昵稱">
<el-input v-model="form.nickname" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="電話">
<el-input v-model="form.phone" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="郵箱">
<el-input v-model="form.email" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input v-model="form.address" autocomplete="off"></el-input>
</el-form-item>
<el-button
type="primary"
style="margin-left: 190px; margin-top: 20px"
@click="save"
>確 定</el-button
>
</el-form>
<el-popover placement="right" width="200" trigger="click">
<el-form>
<el-form-item label="新密碼">
<el-input
type="password"
v-model="resetPsw.newPassword"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="確認(rèn)密碼">
<el-input
type="password"
v-model="resetPsw.confirmPassword"
autocomplete="off"
></el-input>
</el-form-item>
<el-button size="mini" type="primary" @click="toResetPassword"
>確 定</el-button
>
</el-form>
<el-button
slot="reference"
type="warning"
style="margin-left: 190px; margin-top: 20px"
@click="resetPsw = { newPassword: '', confirmPassword: '' }"
>重置密碼</el-button
>
</el-popover>
</el-card>
6.1.5 購物車界面
<div style="width: 55%;height:100%;margin: 20px auto">
<div v-if="carts.length === 0" class="empty-box">
<span style="font-family: 華文彩云;font-size: 40px" >購物車是空的哦</span>
</div>
<template v-for="cart in carts">
<cart-item :cart="cart" @delete="delItem" :key="cart.id" style="margin-bottom: 10px"></cart-item>
</template>
</div>
6.1.6 地址信息界面
<el-dialog title="地址信息" :visible.sync="dialogFormVisible">
<el-form label-width="90px" style="padding: 0 60px">
<el-form-item label="聯(lián)系人">
<el-input v-model="address.linkUser" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="聯(lián)系電話">
<el-input v-model="address.linkPhone" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input
v-model="address.linkAddress"
autocomplete="off"
></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="saveAddress">確 定</el-button>
</div>
</el-dialog>
6.1.7 訂單界面
<div class="header" style="padding-left: 25px;">
<span style="line-height: 40px">{{order.create_time}}</span>
<span style="line-height: 40px;margin-left: 30px">訂單編號(hào): {{order.order_no}}</span>
</div>
<div class="body">
<div style="display: inline-block;margin-right: 20px">
<router-link :to="'goodview/'+order.good_id">
<img :src="baseApi + order.imgs" style="width: 100px;height:100px">
</router-link>
</div>
<div style="display: inline-block;line-height: 40px" >
<table>
<tr>
<th>商品</th>
<th>規(guī)格</th>
<th>數(shù)量</th>
<th>總價(jià)</th>
<th>收貨人</th>
<th>訂單狀態(tài)</th>
</tr>
<tr>
<a :href="'goodview/'+order.good_id">
<td>{{order.good_name}}</td>
</a>
<td>{{order.standard}}</td>
<td>{{order.count}}</td>
<td>{{order.total_price}}</td>
<el-popover
placement="bottom-start"
width="200"
trigger="hover"
:content=address>
<td slot="reference" style="color: #42b983">{{ order.link_user }}</td>
</el-popover>
<!-- 訂單狀態(tài)-->
<template v-if="order.state==='已發(fā)貨'">
<td style="color: #42b983">{{order.state}}</td>
<td>
<el-button style="margin-left: 20px;" size="mini" type="primary" @click="receive">確認(rèn)收貨</el-button>
</td>
</template>
<template v-else-if="order.state==='已收貨'">
<td style="color: #42b983"><a class="el-icon-check"></a>{{order.state}}</td>
</template>
<template v-else-if="order.state==='已支付'">
<td style="color: #3b62f8"> {{order.state}}</td>
<td>
<el-button size="mini" type="info" plain disabled>等待發(fā)貨</el-button>
</td>
</template>
<template v-else>
<td>{{order.state}}</td>
<td>
<el-button style="margin-left: 20px" size="mini" type="success" @click="pay">去支付</el-button>
</td>
</template>
</tr>
</table>
</div>
</div>
6.1.8 管理員界面
<div style="height: 100%">
<el-container style="height: 100%">
<!-- 側(cè)邊欄-->
<el-aside
:width="sideWidth + 'px'"
style="background-color: rgb(238, 241, 246); height: 100%"
>
<Aside :is-collapse="isCollapse"></Aside>
</el-aside>
<el-container>
<!-- 導(dǎo)航欄-->
<el-header
style="border-bottom: 1px solid #ccc; background-color: aliceblue"
>
<Header
:collapse-icon="collapseIcon"
:collapse-title="collapseTitle"
@collapse="handleCollapse"
:user="user"
></Header>
</el-header>
<el-main :class="{bk: $route.path=='/manage/home'}">
<router-view @refresh="getUser" />
</el-main>
</el-container>
</el-container>
</div>
6.1.9 輪播圖管理界面
<div>
<el-table :data="tableData" border stripe style="width: 80%;margin: 2px auto">
<el-table-column label="商品">
<template slot-scope="scope">
<a :href="'/goodView/'+scope.row.goodId">{{scope.row.goodName}}</a>
</template>
</el-table-column>
<el-table-column label="圖片" >
<template slot-scope="scope">
<img :src="baseApi + scope.row.img" width="300" height="185" />
</template>
</el-table-column>
<el-table-column prop="showOrder" label="輪播順序"></el-table-column>
<el-table-column
fixed="right"
label="操作"
width="200">
<template slot-scope="scope">
<el-button type="primary" icon="el-icon-edit" circle @click="edit(scope.row)"></el-button>
<el-popconfirm
@confirm="del(scope.row.id)"
title="確定刪除?"
>
<el-button type="danger" icon="el-icon-delete" circle slot="reference" style="margin-left: 10px"></el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</div>
6.1.10 訂單管理界面
<el-table :data="tableData" border stripe style="width: 100%">
<el-table-column prop="id" label="ID" width="50" sortable> </el-table-column>
<el-table-column prop="orderNo" label="訂單編號(hào)" width="200"></el-table-column>
<el-table-column prop="totalPrice" label="總價(jià)" width="100"></el-table-column>
<el-table-column prop="userId" label="下單人id" width="100"></el-table-column>
<el-table-column prop="linkUser" label="聯(lián)系人" width="150"></el-table-column>
<el-table-column prop="linkPhone" label="聯(lián)系電話"></el-table-column>
<el-table-column prop="linkAddress" label="送貨地址" width="300"></el-table-column>
<el-table-column prop="state" label="狀態(tài)" width="100">
<template slot-scope="scope">
<el-tag type="success" v-if="scope.row.state==='已支付'">{{scope.row.state}}</el-tag>
<el-tag type="primary" v-if="scope.row.state==='已發(fā)貨'">{{scope.row.state}}</el-tag>
<el-tag type="info" v-if="scope.row.state==='已收貨'">{{scope.row.state}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="下單時(shí)間"></el-table-column>
<el-table-column
fixed="right"
label="操作"
width="200">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="showDetail(scope.row)">詳情</el-button>
<el-popconfirm
@confirm="delivery(scope.row)"
title="確定發(fā)貨嗎?"
v-if="scope.row.state==='已支付'"
>
<el-button type="primary" size="mini" slot="reference" style="margin-left: 10px">發(fā)貨</el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
6.1.11 商品分類管理界面
<el-table :data="icons" stripe>
<!-- 下級(jí)分類表-->
<el-table-column type="expand" label="下級(jí)分類" width="100px">
<template slot-scope="scope">
<el-table
:data="scope.row.categories"
:header-cell-style="{ background: '#cbefea', color: 'black' }"
>
<el-table-column label="分類id" prop="id"></el-table-column>
<el-table-column label="分類名稱" prop="name"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
@click="handleEditCategory(scope.row)"
>修改</el-button
>
<el-popconfirm
@confirm="deleteCategory(scope.row)"
title="確定刪除?"
>
<el-button
type="danger"
size="mini"
slot="reference"
>刪除</el-button
>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
</template>
<!---->
</el-table-column>
<el-table-column label="id" prop="id" width="60px"></el-table-column>
<el-table-column label="icon">
<template slot-scope="scope">
<i class="iconfont" v-html="scope.row.value"></i>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" width="200">
<template slot-scope="scope">
<el-button
type="primary"
icon="el-icon-edit"
circle
@click="handleEditIcon(scope.row)"
></el-button>
<el-button
type="success"
icon="el-icon-plus"
circle
@click="handleAddCategory(scope.row)"
></el-button>
<el-popconfirm
@confirm="deleteIcon(scope.row.id)"
title="確定刪除?"
>
<el-button
type="danger"
icon="el-icon-delete"
circle
slot="reference"
style="margin-left: 10px"
></el-button>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
6.1.12 用戶管理界面
<el-table
:data="tableData"
background-color="black"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection"></el-table-column>
<el-table-column prop="id" label="id" width="100"></el-table-column>
<el-table-column
prop="username"
label="賬號(hào)"
width="150"
></el-table-column>
<el-table-column label="身份" width="150">
<template slot-scope="scope">
<span v-if="scope.row.role === 'user'">用戶</span>
<span v-if="scope.row.role === 'admin'">管理員</span>
</template>
</el-table-column>
<el-table-column
prop="nickname"
label="昵稱"
width="180"
></el-table-column>
<el-table-column prop="phone" label="電話" width="180"></el-table-column>
<el-table-column prop="email" label="郵箱" width="180"></el-table-column>
<el-table-column
prop="address"
label="地址"
width="350"
></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" type="success" @click="handleEdit(scope.row)"
>編輯</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.row.id)"
>刪除</el-button
>
</template>
</el-table-column>
</el-table>
6.1.13 統(tǒng)計(jì)界面
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-card
style="
display: inline-block;
margin-left: 50px;
margin-top: 30px;
font-weight: bold;
font-size: 22px;
color: #ffb02a;
"
>¥總計(jì):{{ total | numFilter }}</el-card
>
<!-- 柱狀圖-->
<el-tab-pane label="各類收入柱狀圖" name="bar">
<div
id="bar"
style="width: 1200px; height: 500px; margin: auto auto"
></div>
</el-tab-pane>
<!-- 餅圖-->
<el-tab-pane label="各類收入餅圖" name="pie">
<div
id="pie"
style="width: 600px; height: 600px; margin: 10px auto"
></div>
</el-tab-pane>
<!-- 本周收入折線圖-->
<el-tab-pane label="本周收入" name="line1">
<div
id="weekLine"
style="width: 900px; height: 500px; margin: 10px auto"
></div>
</el-tab-pane>
<!-- 本月收入折線圖-->
<el-tab-pane label="本月收入" name="line2">
<div
id="monthLine"
style="width: 1500px; height: 500px; margin: 10px auto"
></div>
</el-tab-pane>
</el-tabs>
6.2 內(nèi)部接口
6.2.1 登錄接口
@PostMapping("/login")
public Result login(@RequestBody LoginForm loginForm) {
UserDTO dto = userService.login(loginForm);
return Result.success(dto);
}
6.2.2 注冊(cè)接口
@PostMapping("/register")
public Result register(@RequestBody LoginForm loginForm) {
User user = userService.register(loginForm);
return Result.success(user);
}
6.2.3 地址管理接口
/*
查詢
*/
@GetMapping("/{userId}")
public Result findAllById(@PathVariable Long userId) {
return Result.success(addressService.findAllById(userId));
}
@GetMapping
public Result findAll() {
List<Address> list = addressService.list();
return Result.success(list);
}
/*
保存
*/
@PostMapping
public Result save(@RequestBody Address address) {
boolean b = addressService.saveOrUpdate(address);
if(b){
return Result.success();
}else{
return Result.error(Constants.CODE_500,"保存地址失敗");
}
}
@PutMapping
public 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();
}
6.2.4 頭像管理接口
//上傳頭像
@PostMapping()
public Result uploadAvatar(@RequestParam MultipartFile file){
System.out.println("uploadAvatar====>");
String url = avatarService.upload(file);
return Result.success(url);
}
//根據(jù)文件名下載文件,即文件的url
@GetMapping("/{fileName}")
public void download(@PathVariable String fileName, HttpServletResponse response){
avatarService.download(fileName,response);
}
//根據(jù)文件id刪除文件
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable int id){
int i = avatarService.delete(id);
if(i == 1){
return Result.success();
}else{
return Result.error(Constants.CODE_500,"刪除失敗");
}
}
//查詢
@GetMapping("/page")
public Result selectPage(@RequestParam int pageNum,
@RequestParam int pageSize){
int index = (pageNum - 1) * pageSize;
List<Avatar> avatars = avatarService.selectPage(index, pageSize);
int total = avatarService.getTotal();
HashMap<String, Object> map = new HashMap<>();
map.put("records",avatars);
map.put("total",total);
return Result.success(map);
}
6.2.5 輪播圖管理接口
/*
查詢
*/
@GetMapping("/{id}")
public Result findById(@PathVariable Long id) {
return Result.success(carouselService.getById(id));
}
@GetMapping
public Result findAll() {
List<Carousel> list = carouselService.getAllCarousel();
return Result.success(list);
}
/*
保存
*/
@Authority(AuthorityType.requireAuthority)
@PostMapping
public Result save(@RequestBody Carousel carousel) {
Good good = goodService.getById(carousel.getGoodId());
if(good == null) {
return Result.error("400", "商品id錯(cuò)誤,未查詢到商品id = " + carousel.getGoodId());
}
carouselService.saveOrUpdate(carousel);
return Result.success();
}
@Authority(AuthorityType.requireAuthority)
@PutMapping
public Result update(@RequestBody Carousel carousel) {
Good good = goodService.getById(carousel.getGoodId());
if(good == null) {
return Result.error("400", "商品id錯(cuò)誤,未查詢到商品id = " + carousel.getGoodId());
}
carouselService.updateById(carousel);
return Result.success();
}
/*
刪除
*/
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
carouselService.removeById(id);
return Result.success();
}
6.2.6 購物車管理接口
/*
查詢
*/
//根據(jù)購物車id查詢
@GetMapping("/{id}")
public Result selectById(@PathVariable Long id) {
return Result.success(cartService.getById(id));
}
//查找所有用戶的購物車
@GetMapping
public Result findAll() {
List<Cart> list = cartService.list();
return Result.success(list);
}
//查找某個(gè)用戶的購物車
@GetMapping("/userid/{userId}")
public Result selectByUserId(@PathVariable Long userId) {
return Result.success(cartService.selectByUserId(userId)) ;
}
/*
保存
*/
@PostMapping
public Result save(@RequestBody Cart cart) {
cart.setCreateTime(DateUtil.now());
cartService.saveOrUpdate(cart);
return Result.success();
}
@PutMapping
public 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();
}
6.2.7 分類管理接口
/*
查詢
*/
@GetMapping("/{id}")
public Result findById(@PathVariable Long id) {
return Result.success(categoryService.getById(id));
}
@GetMapping
public Result findAll() {
List<Category> list = categoryService.list();
return Result.success(list);
}
/*
保存
*/
@PostMapping
public Result save(@RequestBody Category category) {
categoryService.saveOrUpdate(category);
return Result.success();
}
/**
* 新增下級(jí)分類 + 上下級(jí)分類關(guān)聯(lián)
*
* @param category 下級(jí)分類
* @return 結(jié)果
*/
@PostMapping("/add")
public Map<String, Object> add(@RequestBody Category category) {
categoryService.add(category);
return BaseApi.success();
}
@Authority(AuthorityType.requireAuthority)
@PutMapping
public Result update(@RequestBody Category category) {
categoryService.updateById(category);
return Result.success();
}
/**
* 刪除分類
*
* @param id id
* @return 結(jié)果
*/
@Authority(AuthorityType.requireAuthority)
@GetMapping("/delete")
public Map<String, Object> delete(@RequestParam("id") Long id) {
return categoryService.delete(id);
}
6.2.8 文件管理接口
//上傳文件
@PostMapping("/upload")
public Result upload(@RequestParam MultipartFile file){
String url = fileService.upload(file);
return Result.success(url);
}
//根據(jù)文件名下載文件,即文件的url
@GetMapping("/{fileName}")
public void download(@PathVariable String fileName, HttpServletResponse response){
fileService.download(fileName,response);
}
//根據(jù)文件id刪除文件
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable int id){
int i = fileService.fakeDelete(id);
if(i == 1){
return Result.success();
}else{
return Result.error(Constants.CODE_500,"刪除失敗");
}
}
//批量刪除文件
@Authority(AuthorityType.requireAuthority)
@PostMapping("/del/batch")
public Result deleteBatch(@RequestBody List<Integer> ids){
for (Integer id : ids) {
int i = fileService.fakeDelete(id);
if(i != 1){
return Result.error(Constants.CODE_500,"刪除文件:"+fileService.getById(id).getName()+"時(shí)失敗,刪除已終止");
}
}
return Result.success();
}
@Authority(AuthorityType.requireAuthority)
@GetMapping("/enable")
public Result changeEnable(@RequestParam int id,@RequestParam boolean enable){
int i = fileService.changeEnable(id, enable);
if(i == 0){
return Result.error(Constants.CODE_500,"修改失敗");
}else {
return Result.success();
}
}
//查詢
@GetMapping("/page")
public Result selectPage(@RequestParam int pageNum,
@RequestParam int pageSize,
@RequestParam(required = false) String fileName){
IPage<MyFile> myFileIPage = fileService.selectPage(pageNum, pageSize, fileName);
return Result.success(myFileIPage);
}
6.2.9 商品管理接口
@Authority(AuthorityType.requireAuthority)
@PostMapping
public Result save(@RequestBody Good good) {
System.out.println(good);
return Result.success(goodService.saveOrUpdateGood(good));
}
@Authority(AuthorityType.requireAuthority)
@PutMapping
public Result update(@RequestBody Good good) {
goodService.update(good);
return Result.success();
}
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
goodService.deleteGood(id);
return Result.success();
}
@GetMapping("/{id}")
public Result findById(@PathVariable Long id) {
return Result.success(goodService.getGoodById(id));
}
//獲取商品的規(guī)格信息
@GetMapping("/standard/{id}")
public Result getStandard(@PathVariable int id) {
return Result.success(goodService.getStandard(id));
}
//查詢推薦商品,即recommend=1
@GetMapping
public Result findAll() {
return Result.success(goodService.findFrontGoods());
}
//查詢銷量排行
@GetMapping("/rank")
public Result getSaleRank(@RequestParam int num){
return Result.success(goodService.getSaleRank(num));
}
//保存商品的規(guī)格信息
@PostMapping("/standard")
public Result saveStandard(@RequestBody List<Standard> standards, @RequestParam int goodId) {
//先刪除全部舊記錄
standardService.deleteAll(goodId);
//然后插入新記錄
for (Standard standard : standards) {
standard.setGoodId(goodId);
if(!standardService.save(standard)){
return Result.error(Constants.CODE_500,"保存失敗");
}
}
return Result.success();
}
//刪除商品的規(guī)格信息
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/standard")
public Result delStandard(@RequestBody Standard standard) {
boolean delete = standardService.delete(standard);
if(delete) {
return Result.success();
}else {
return Result.error(Constants.CODE_500,"刪除失敗");
}
}
//修改商品的推薦字段
@Authority(AuthorityType.requireAuthority)
@GetMapping("/recommend")
public Result setRecommend(@RequestParam Long id,@RequestParam Boolean isRecommend){
return Result.success(goodService.setRecommend(id,isRecommend));
}
@GetMapping("/page")
public Result findPage(
@RequestParam(required = false, defaultValue = "1") Integer pageNum,
@RequestParam(required = false, defaultValue = "10") Integer pageSize,
@RequestParam(required = false, defaultValue = "") String searchText,
@RequestParam(required = false) Integer categoryId) {
return Result.success(goodService.findPage(pageNum,pageSize,searchText,categoryId));
}
@GetMapping("/fullPage")
public Result findFullPage(
@RequestParam(required = false, defaultValue = "1") Integer pageNum,
@RequestParam(required = false, defaultValue = "10") Integer pageSize,
@RequestParam(required = false, defaultValue = "") String searchText,
@RequestParam(required = false) Integer categoryId) {
return Result.success(goodService.findFullPage(pageNum,pageSize,searchText,categoryId));
}
6.2.10 圖標(biāo)管理接口
/*
查詢
*/
@GetMapping("/{id}")
public Result findById(@PathVariable Long id) {
return Result.success(iconService.getById(id));
}
@GetMapping
public Result findAll() {
List<Icon> list = iconService.getIconCategoryMapList();
return Result.success(list);
}
/*
保存
*/
@Authority(AuthorityType.requireAuthority)
@PostMapping
public Result save(@RequestBody Icon icon) {
iconService.saveOrUpdate(icon);
return Result.success();
}
@Authority(AuthorityType.requireAuthority)
@PutMapping
public Result update(@RequestBody Icon icon) {
iconService.updateById(icon);
return Result.success();
}
/*
*刪除
*/
@Authority(AuthorityType.requireAuthority)
@GetMapping("/delete")
public Map<String, Object> delete(@RequestParam("id") Long id) {
return iconService.deleteById(id);
}
6.2.11 收入分析管理接口
@GetMapping("/chart")
public Result getChart(){
return Result.success(incomeService.getChart());
}
@GetMapping("/week")
public Result getWeekIncome(){
return Result.success(incomeService.getWeekIncome());
}
@GetMapping("/month")
public Result getMonthIncome(){
return Result.success(incomeService.getMonthIncome());
}
6.2.12 訂單管理接口
/*
查詢
*/
@GetMapping("/userid/{userid}")
public Result selectByUserId(@PathVariable int userid) {
return Result.success(orderService.selectByUserId(userid));
}
@GetMapping("/orderNo/{orderNo}")
public Result selectByOrderNo(@PathVariable String orderNo) {
return Result.success(orderService.selectByOrderNo(orderNo));
}
@GetMapping
public Result findAll() {
List<Order> list = orderService.list();
return Result.success(list);
}
/*
分頁查詢
*/
@GetMapping("/page")
public Result findPage(@RequestParam int pageNum,
@RequestParam int pageSize,
String orderNo,String state){
IPage<Order> orderPage = new Page<>(pageNum,pageSize);
QueryWrapper<Order> orderQueryWrapper = new QueryWrapper<>();
orderQueryWrapper.ne("state","待付款");
if(!Util.isEmptyString(state)){
orderQueryWrapper.eq("state",state);
}
if(!Util.isEmptyString(orderNo)){
orderQueryWrapper.like("order_no",orderNo);
}
orderQueryWrapper.orderByDesc("create_time");
return Result.success(orderService.page(orderPage,orderQueryWrapper));
}
/*
保存
*/
@PostMapping
public Result save(@RequestBody Order order) {
String orderNo = orderService.saveOrder(order);
return Result.success(orderNo);
}
//支付訂單
@GetMapping("/paid/{orderNo}")
public Result payOrder(@PathVariable String orderNo){
orderService.payOrder(orderNo);
return Result.success();
}
//發(fā)貨
@Authority(AuthorityType.requireAuthority)
@GetMapping("/delivery/{orderNo}")
public Result delivery(@PathVariable String orderNo){
orderService.delivery(orderNo);
return Result.success();
}
//確認(rèn)收貨
@GetMapping("/received/{orderNo}")
public Result receiveOrder(@PathVariable String orderNo){
if(orderService.receiveOrder(orderNo)){
return Result.success();
}
else {
return Result.error(Constants.CODE_500,"確認(rèn)收貨失敗");
}
}
@PutMapping
public Result update(@RequestBody Order order) {
orderService.updateById(order);
return Result.success();
}
/*
刪除
*/
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id) {
orderService.removeById(id);
return Result.success();
}
6.2.13 角色管理接口
@PostMapping("/role")
public Result getUserRole(){
User currentUser = TokenUtils.getCurrentUser();
return Result.success(currentUser.getRole());
}
6.2.14 用戶管理接口
@GetMapping("/userinfo/{username}")
public Result getUserInfoByName(@PathVariable String username) {
User one = userService.getOne(username);
return Result.success(one);
}
@GetMapping("/userid")
public long getUserId() {
return TokenUtils.getCurrentUser().getId();
}
@GetMapping("/user/")
public Result findAll() {
List<User> list = userService.list();
return Result.success(list);
}
@PostMapping("/user")
public Result save(@RequestBody User user) {
return userService.saveUpdate(user);
}
@Authority(AuthorityType.requireAuthority)
@DeleteMapping("/user/{id}")
public Result deleteById(@PathVariable int id) {
boolean isSuccessful = userService.removeById(id);
if (isSuccessful) {
return Result.success();
} else {
return Result.error(Constants.CODE_500, "刪除失敗");
}
}
@Authority(AuthorityType.requireAuthority)
@PostMapping("/user/del/batch")
public Result deleteBatch(@RequestBody List<Integer> ids) {
boolean isSuccessful = userService.removeBatchByIds(ids);
if (isSuccessful) {
return Result.success();
} else {
return Result.error(Constants.CODE_500, "刪除失敗");
}
}
@GetMapping("/user/page")
public Result findPage(@RequestParam int pageNum,
@RequestParam int pageSize,
String id,
String username,
String nickname) {
IPage<User> userPage = new Page<>(pageNum, pageSize);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
if (!Util.isEmptyString(id)) {
userQueryWrapper.like("id", id);
}
if (!Util.isEmptyString(username)) {
userQueryWrapper.like("username", username);
}
if (!Util.isEmptyString(nickname)) {
userQueryWrapper.like("nickname", nickname);
}
userQueryWrapper.orderByDesc("id");
System.out.println("============" + TokenUtils.getCurrentUser());
return Result.success(userService.page(userPage, userQueryWrapper));
}
/**
* 重置密碼
*
* @param id 用戶id
* @param newPassword 新密碼
* @return 結(jié)果
*/
@GetMapping("/user/resetPassword")
public Result resetPassword(@RequestParam String id, @RequestParam String newPassword) {
userService.resetPassword(id, newPassword);
return Result.success();
}
7 性能
7.1 精度
要按照嚴(yán)格的數(shù)據(jù)格式輸入,不能輸入非法字符,否則系統(tǒng)不給予響應(yīng)進(jìn)行處理,查詢時(shí)要保證準(zhǔn)確率為100%,所有包含查詢關(guān)鍵字的書籍都應(yīng)能查到,不能有遺漏。
7.2 時(shí)間特性
(1)響應(yīng)時(shí)間:用戶任意操作后5秒內(nèi)系統(tǒng)給予反饋信息。
(2)更新處理時(shí)間:由系統(tǒng)運(yùn)行狀態(tài)來決定。
(3)數(shù)據(jù)的轉(zhuǎn)換和傳送時(shí)間:能夠在20秒內(nèi)完成。
7.3 靈活性
當(dāng)需求發(fā)生某些變化時(shí),該軟件的基本操作、數(shù)據(jù)結(jié)構(gòu)、運(yùn)行環(huán)境等等基本不會(huì)發(fā)生變化,只是對(duì)系統(tǒng)的數(shù)據(jù)庫的文件和記錄進(jìn)行處理,就可以滿足需求。
8 測(cè)試
功能點(diǎn) 測(cè)試用例 輸出結(jié)果
商品管理 添加商品成功 商品成功添加到商品列表
商品管理 編輯商品信息成功 商品信息更新成功
商品管理 刪除商品成功 商品成功從商品列表中刪除
商品管理 刪除商品失敗(該商品已被訂單引用) 提示該商品已被訂單引用,無法刪除
商品分類 添加分類成功 分類成功添加到分類列表
商品分類 添加分類失敗(分類名重復(fù)) 提示分類名已存在
商品分類 編輯分類信息成功 分類信息更新成功
商品分類 編輯分類信息失?。ǚ诸惷貜?fù)) 提示分類名已存在
商品分類 刪除分類成功 分類成功從分類列表中刪除
商品分類 刪除分類失?。ㄔ摲诸愊掠猩唐罚?提示該分類下有商品,無法刪除
訂單管理 查看訂單詳細(xì)信息 成功顯示訂單的詳細(xì)信息
用戶管理 添加管理員成功 管理員成功添加到管理員列表
用戶管理 添加管理員失?。ㄓ脩裘汛嬖冢?提示用戶名已存在
用戶管理 編輯管理員信息成功 管理員信息更新成功
用戶管理 編輯管理員信息失敗(用戶名已存在) 提示用戶名已存在
用戶管理 刪除管理員成功 管理員成功從管理員列表中刪除
用戶管理 刪除管理員失?。ㄔ摴芾韱T是唯一管理員) 提示該管理員是唯一管理員,無法刪除
用戶管理 添加普通買家用戶成功 用戶成功添加到用戶列表
用戶管理 添加普通買家用戶失?。ㄓ脩裘汛嬖冢?提示用戶名已存在
用戶管理 編輯普通買家用戶信息成功 用戶信息更新成功
用戶管理 刪除普通買家用戶成功 用戶成功從用戶列表中刪除
用戶管理 查看用戶購物車商品 成功顯示用戶購物車商品
購物車管理 添加商品到購物車成功 商品成功添加到購物車
購物車管理 添加商品到購物車失?。ㄔ撋唐芬呀?jīng)在購物車中) 提示該商品已經(jīng)在購物車中
購物車管理 從購物車刪除商品成功 商品成功從購物車中刪除
購物車管理 從購物車刪除商品失敗(該商品不在購物車中) 提示該商品不在購物車中
源碼論文百度云鏈接:
https://pan.baidu.com/s/13gLzEkDN_AGD4-oOUNUUsw?pwd=nzn9
提取碼:nzn9
鏈接失效可加我:cynm-2233獲取。
到了這里,關(guān)于【051】基于Vue、Springboot電商管理系統(tǒng)(含源碼、詳細(xì)論文、數(shù)據(jù)庫)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!