vue3.2/Vite/Ts42: 处理新增品牌功能
·
Yin灏
目录结构
└─src
├─api
│ └─product
│ └─trademark
│ └─index.ts
└─views
└─product
└─trademark
└─index.vue
处理接口
src/api/product/trademark/index.ts
//...
import { TradeMark } from "./type";
//...
enum API {
//...
// 添加品牌
ADDTRADEMARK_URL = "/admin/product/baseTrademark/save",
UPDATETRADEMARK_URL = "/admin/product/baseTrademark/update",
//...
}
//...
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);
}
};
//...
处理新增对话框
src/views/product/trademark/index.vue
<template>
<el-card>
<el-bottom type="primary" size="default" icon="Plus" @click="addTrademark">添加品牌</el-button>
<!-- ... -->
</el-card>
<!-- 对话框组件 -->
<el-dialog v-model="dialogFormVisible" title="添加品牌">
<el-form>
<el-form-item label="品牌名称" label-width="80px">
<el-input placehodler="请输入品牌名称" v-model="trademarkParams.tmName"></el-input>
</el-form-item>
<el-form-item label="品牌LOGO" label-width="80px">
<!--
action: 前缀要携带 /api/
:before-upload: 可以约束上传的类型
-->
<el-upload
action="/api/admin/product/fileUpload"
:show-file-list="false"
:before-upload="beforeAvatarUpload"
:on-success="handleAvatarSuccess"
>
<img v-if="trademarkParams.logoUrl" :src="trademarkParams.logoUrl" />
<el-icon v-else>
<Plus />
</el-icon>
</el-upload>
</el-form-item>
</el-form>
<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>
</template>
<script setup lang="ts">
import { reactive } from "vue";
import type { TradeMark } from "@/api/product/trademark/type";
import { reqHasTrademark, reqAddOrUpdateTrademark } from "@/api/product/trademark";
//...
import type { UploadProps } from "element-plus";
//...
let trademarkParams = reactive<TradeMark>({
tmName: "",
logoUrl: "",
});
//...
const cancel = () => {78
//...
// 清空数据
trademarkParams.tmName = '';
trademarkParams.logoUrl = '';
//...
}
//...
const confirm = async () => {
// 提交服务器
const res: any = await reqAddOrUpdateTrademark(trademarkParams);
if(res.code === 200) {
dialogFormVisible.value = false;
ElMessage({
type: "success",
message: "添加品牌成功",
});
// 重新请求所有品牌数据,重新渲染 table
getHasTrademark();
// 清空数据
trademarkParams.tmName = '';
trademarkParams.logoUrl = '';
} else {
ElMessage({
type: "error",
message: "添加品牌失败",
});
dialogFormVisible.value = false;
}
};
//...
// 图片上传成功之前触发
let 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",
});
}
} else {
ElMessage({
type: "error",
message: "上传格式错误",
});
return false;
}
};
// 上传成功回调
let handleAvatarSuccess: UploadProps["onSuccess"] = (response, uploadFile) => {
// response: 是当前此次上传图片 post 请求的服务器的返回结果
// uploadFile: 包含服务器返回结果和上传图片的数据
trademarkParams.logoUrl = response.data;
}
</script>