image-20230518201640739

为实现当前界面操作:

其中SPU名称、SPU名称、SPU图片为用户输入获取数据。

SPU品牌、SPU销售属性为通过API调用数据。

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
//添加一个新的SPU初始化请求方法
const initAddSpu = async (c3Id: number | string) => {
//清空数据
Object.assign(SpuParams.value, {
category3Id: '', //收集三级分类的ID
spuName: '', //SPU的名字
description: '', //SPU的描述
tmId: '', //品牌的ID
spuImageList: [],
spuSaleAttrList: [],
})
//清空照片
imgList.value = []
//清空销售属性
saleAttr.value = []
saleAttrIdAndValueName.value = ''
//存储三级分类的ID
SpuParams.value.category3Id = c3Id
//获取全部品牌的数据
let result: AllTradeMark = await reqAllTradeMark()
let result1: HasSaleAttrResponseData = await reqAllSaleAttr()
//存储数据
AllTradeMark.value = result.data
allSaleAttr.value = result1.data
}

其中获取全部品牌和所有销售属性数据为reqAllTradeMark、reqAllSaleAttr

1
2
3
4
5
6
7
8
9
10
11
//获取全部品牌的数据
ALLTRADEMARK_URL = '/admin/product/baseTrademark/getTrademarkList',
//获取全部的SPU的品牌的数据
export const reqAllTradeMark = () =>
request.get<any, AllTradeMark>(API.ALLTRADEMARK_URL)

//获取整个项目全部的销售属性[颜色、版本、尺码]
ALLSALEATTR_URL = '/admin/product/baseSaleAttrList',
//获取全部的销售属性
export const reqAllSaleAttr = () =>
request.get<any, HasSaleAttrResponseData>(API.ALLSALEATTR_URL)
image-20230518201640739

照片墙的实现:

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
<el-form-item label="SPU图片">
<!-- v-model:fileList->展示默认图片
action:上传图片的接口地址
list-type:文件列表展示类型
-->
<el-upload
v-model:file-list="imgList"
action="/api/admin/product/fileUpload"
list-type="picture-card"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:before-upload="handlerUpload"
>
<el-icon>
<Plus />
</el-icon>
</el-upload>
<el-dialog v-model="dialogVisible">
<img
w-full
:src="dialogImageUrl"
alt="Preview Image"
style="width: 100%; height: 100%"
/>
</el-dialog>
</el-form-item>

预览按钮的钩子函数:

1
2
3
4
5
6
//照片墙点击预览按钮的时候触发的钩子
const handlePictureCardPreview = (file: any) => {
dialogImageUrl.value = file.url
//对话框弹出来
dialogVisible.value = true
}

上传按钮前的钩子函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//照片钱上传成功之前的钩子约束文件的大小与类型
const handlerUpload = (file: any) => {
if (
file.type == 'image/png' ||
file.type == 'image/jpeg' ||
file.type == 'image/gif'
) {
if (file.size / 1024 / 1024 < 3) {
return true
} else {
ElMessage({
type: 'error',
message: '上传文件务必小于3M',
})
return false
}
} else {
ElMessage({
type: 'error',
message: '上传文件务必PNG|JPG|GIF',
})
return false
}
}

SPU销售属性设置:

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
    <!-- 展示销售属性的下拉菜单 
saleAttrIdAndValueName:双向绑定数据 表示select按钮的选项
unSelectSaleAttr:表示未被选择的属性的列表

-->
<el-select
v-model="saleAttrIdAndValueName"
:placeholder="
unSelectSaleAttr.length
? `还未选择${unSelectSaleAttr.length}个`
: '无'
"
>
<el-option
:value="`${item.id}:${item.name}`"
v-for="(item, index) in unSelectSaleAttr"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
<el-button
@click="addSaleAttr"
:disabled="saleAttrIdAndValueName ? false : true"
style="margin-left: 10px"
type="primary"
size="default"
icon="Plus"
>
添加属性
</el-button>

addSaleAttr函数执行如下:saleAttr有数据进来即可展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//添加销售属性的方法
const addSaleAttr = () => {
/*
"baseSaleAttrId": number,
"saleAttrName": string,
"spuSaleAttrValueList": SpuSaleAttrValueList
*/
const [baseSaleAttrId, saleAttrName] = saleAttrIdAndValueName.value.split(':')
//准备一个新的销售属性对象:将来带给服务器即可
let newSaleAttr: SaleAttr = {
baseSaleAttrId,
saleAttrName,
spuSaleAttrValueList: [],
}
//追加到数组当中
saleAttr.value.push(newSaleAttr)
//清空收集的数据
saleAttrIdAndValueName.value = ''
}

image-20230518201640739

要实现上诉功能:根据saleAttr来进行展示,其中属性名字由上诉saleAttrIdAndValueName获得。

主要需要销售属性值的编辑:

一开始由icon为plus的按钮进行展示点击button按钮进行toEdit函数,函数如下,由此跳到编辑模式

1
2
3
4
5
6
//属性值按钮的点击事件
const toEdit = (row: SaleAttr) => {
//点击按钮的时候,input组件不就不出来->编辑模式
row.flag = true
row.saleAttrValue = ''
}

编辑模式代码如下:

1
2
3
4
5
6
7
8
<el-input
@blur="toLook(row)"
v-model="row.saleAttrValue"
v-if="row.flag == true"
placeholder="请你输入属性值"
size="small"
style="width: 100px"
></el-input>

当编辑模式失活时,执行toLook函数主要为对非法值的判断以及当前属性值中是否重复,然后将newSaleAttrValue添加到spuSaleAttrValueList中,顺便改变为查看模式

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
<!-- table展示销售属性与属性值的地方 -->
<el-table border style="margin: 10px 0px" :data="saleAttr">
<el-table-column
label="序号"
type="index"
align="center"
width="80px"
></el-table-column>
<el-table-column
label="销售属性名字"
width="120px"
prop="saleAttrName"
></el-table-column>
<el-table-column label="销售属性值">
<!-- row:即为当前SPU已有的销售属性对象 -->
<template #="{ row, $index }">
<el-tag
style="margin: 0px 5px"
@close="row.spuSaleAttrValueList.splice(index, 1)"
v-for="(item, index) in row.spuSaleAttrValueList"
:key="row.id"
class="mx-1"
closable
>
{{ item.saleAttrValueName }}
</el-tag>
<el-input
@blur="toLook(row)"
v-model="row.saleAttrValue"
v-if="row.flag == true"
placeholder="请你输入属性值"
size="small"
style="width: 100px"
></el-input>
<el-button
@click="toEdit(row)"
v-else
type="primary"
size="small"
icon="Plus"
></el-button>
</template>
</el-table-column>
<el-table-column label="操作" width="120px">
<template #="{ row, $index }">
<el-button
type="primary"
size="small"
icon="Delete"
@click="saleAttr.splice($index, 1)"
></el-button>
</template>
</el-table-column>
</el-table>

然后是最后的保存取消按钮函数

1
2
3
4
5
6
7
8
9
10
11
<el-form-item>
<el-button
:disabled="saleAttr.length > 0 ? false : true"
type="primary"
size="default"
@click="save"
>
保存
</el-button>
<el-button type="primary" size="default" @click="cancel">取消</el-button>
</el-form-item>

保存执行如下函数:

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
//保存按钮的回调
const save = async () => {
//整理参数
//发请求:添加SPU|更新已有的SPU
//成功
//失败
//1:照片墙的数据
SpuParams.value.spuImageList = imgList.value.map((item: any) => {
return {
imgName: item.name, //图片的名字
imgUrl: (item.response && item.response.data) || item.url,
}
})
//2:整理销售属性的数据
SpuParams.value.spuSaleAttrList = saleAttr.value
let result = await reqAddOrUpdateSpu(SpuParams.value)
if (result.code == 200) {
ElMessage({
type: 'success',
message: SpuParams.value.id ? '更新成功' : '添加成功',
})
//通知父组件切换场景为0
$emit('changeScene', {
flag: 0,
params: SpuParams.value.id ? 'update' : 'add',
})
} else {
ElMessage({
type: 'success',
message: SpuParams.value.id ? '更新成功' : '添加成功',
})
}
}