为实现当前界面操作:
其中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
| const initAddSpu = async (c3Id: number | string) => { Object.assign(SpuParams.value, { category3Id: '', spuName: '', description: '', tmId: '', spuImageList: [], spuSaleAttrList: [], }) imgList.value = [] saleAttr.value = [] saleAttrIdAndValueName.value = '' 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',
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)
|
照片墙的实现:
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 = () => {
const [baseSaleAttrId, saleAttrName] = saleAttrIdAndValueName.value.split(':') let newSaleAttr: SaleAttr = { baseSaleAttrId, saleAttrName, spuSaleAttrValueList: [], } saleAttr.value.push(newSaleAttr) saleAttrIdAndValueName.value = '' }
|
要实现上诉功能:根据saleAttr来进行展示,其中属性名字由上诉saleAttrIdAndValueName获得。
主要需要销售属性值的编辑:
一开始由icon为plus的按钮进行展示点击button按钮进行toEdit函数,函数如下,由此跳到编辑模式
1 2 3 4 5 6
| const toEdit = (row: SaleAttr) => { 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 () => { SpuParams.value.spuImageList = imgList.value.map((item: any) => { return { imgName: item.name, imgUrl: (item.response && item.response.data) || item.url, } }) SpuParams.value.spuSaleAttrList = saleAttr.value let result = await reqAddOrUpdateSpu(SpuParams.value) if (result.code == 200) { ElMessage({ type: 'success', message: SpuParams.value.id ? '更新成功' : '添加成功', }) $emit('changeScene', { flag: 0, params: SpuParams.value.id ? 'update' : 'add', }) } else { ElMessage({ type: 'success', message: SpuParams.value.id ? '更新成功' : '添加成功', }) } }
|