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
| <!-- 对话框组件:在添加品牌与修改已有品牌的业务时候使用结构 --> <!-- v-model:属性用户控制对话框的显示与隐藏的 true显示 false隐藏 title:设置对话框左上角标题 trademarkParams:对话框中的参数标题和图片 --> <el-dialog v-model="dialogFormVisible" :title="trademarkParams.id ? '修改品牌' : '添加品牌'" > <el-form style="width: 80%" :model="trademarkParams" :rules="rules" ref="formRef" > <el-form-item label="品牌名称" label-width="100px" prop="tmName"> <el-input placeholder="请您输入品牌名称" v-model="trademarkParams.tmName" ></el-input> </el-form-item> <el-form-item label="品牌LOGO" label-width="100px" prop="logoUrl"> <!-- upload组件属性:action图片上传路径书写/api,代理服务器不发送这次post请求 --> <el-upload class="avatar-uploader" action="/api/admin/product/fileUpload" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" > <img v-if="trademarkParams.logoUrl" :src="trademarkParams.logoUrl" class="avatar" /> <el-icon v-else class="avatar-uploader-icon"> <Plus /> </el-icon> </el-upload> </el-form-item> </el-form> <!-- 具名插槽:footer --> <template #footer> <el-button type="primary" size="default" @click="cancel"> 取消 </el-button> <el-button type="primary" size="default" @click="confirm"> 确定 </el-button> </template> </el-dialog>
|
通过两种方式来控制对话框组件的展开与否:
通过添加品牌按钮来打开对话框:
1 2 3 4 5 6 7 8 9
| <el-button type="primary" size="default" icon="Plus" @click="addTrademark" v-has="`btn.Trademark.add`" > 添加品牌 </el-button>
|
通过编辑品牌来打开对话框
1 2 3 4 5 6
| <el-button type="primary" size="small" icon="Edit" @click="updateTrademark(row)" ></el-button>
|
其中addTrademark函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const addTrademark = () => { dialogFormVisible.value = true trademarkParams.id = 0 trademarkParams.tmName = '' trademarkParams.logoUrl = '' nextTick(() => { formRef.value.clearValidate('tmName') formRef.value.clearValidate('logoUrl') }) }
|
updateTrademark(row)函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
const updateTrademark = (row: TradeMark) => { nextTick(() => { formRef.value.clearValidate('tmName') formRef.value.clearValidate('logoUrl') }) dialogFormVisible.value = true Object.assign(trademarkParams, row) }
|
图片长传成功的回调函数:
1 2 3 4 5 6 7 8 9 10 11
| const handleAvatarSuccess: UploadProps['onSuccess'] = ( response, uploadFile, ) => { trademarkParams.logoUrl = response.data formRef.value.clearValidate('logoUrl') }
|
上传图片组件->上传图片之前触发的钩子函数
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
| const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => { if ( rawFile.type == 'image/png' || rawFile.type == 'image/jpeg' || rawFile.type == 'image/gif' ) { if (rawFile.size / 1024 / 1024 < 4) { return true } else { ElMessage({ type: 'error', message: '上传文件大小小于4M', }) return false } } else { ElMessage({ type: 'error', message: '上传文件格式务必PNG|JPG|GIF', }) return false } }
|
表单规则如下:
1 2 3 4 5 6 7 8 9
| const rules = { tmName: [ { required: true, trigger: 'blur', validator: validatorTmName }, ], logoUrl: [{ required: true, validator: validatorLogoUrl }], }
|
规则函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const validatorTmName = (rule: any, value: any, callBack: any) => { if (value.trim().length >= 2) { callBack() } else { callBack(new Error('品牌名称位数大于等于两位')) } }
const validatorLogoUrl = (rule: any, value: any, callBack: any) => { if (value) { callBack() } else { callBack(new Error('LOGO图片务必上传')) } }
|
其中确认按钮回调函数如下:
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
| const confirm = async () => { await formRef.value.validate() let result: any = await reqAddOrUpdateTrademark(trademarkParams) if (result.code == 200) { dialogFormVisible.value = false ElMessage({ type: 'success', message: trademarkParams.id ? '修改品牌成功' : '添加品牌成功', }) getHasTrademark(trademarkParams.id ? pageNo.value : 1) } else { ElMessage({ type: 'error', message: trademarkParams.id ? '修改品牌失败' : '添加品牌失败', }) dialogFormVisible.value = false } }
|
修改请求接口如下:
1 2 3 4 5 6 7 8 9 10
| export const reqAddOrUpdateTrademark = (data: TradeMark) => { if (data.id) { return request.put<any, any>(API.UPDATETRADEMARK_URL, data) } else { return request.post<any, any>(API.ADDTRADEMARK_URL, data) } }
|
取消按钮如下:
1 2 3 4 5
| const cancel = () => { dialogFormVisible.value = false }
|