From dc47628c717d883dcfb1978ed4fee52b2d955c70 Mon Sep 17 00:00:00 2001 From: sa_10_0 <2492740167@qq.com> Date: Mon, 2 Dec 2024 09:49:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/components/Aside.vue | 22 ++ src/router/routes.ts | 24 +- src/views/Commodity/MerchandiseCenter.vue | 4 - src/views/CostumeAppointments/AddCostumes.vue | 135 +++++++++ .../CostumeAppointments/AppointmentOrder.vue | 185 ++++++++++++ .../CostumeAppointments/ClothingGrade.vue | 223 ++++++++++++++ .../CostumeAppointments/CostumeDetails.vue | 276 ++++++++++++++++++ src/views/Coupons/AddCoupons.vue | 2 +- src/views/Coupons/CouponCenter.vue | 33 ++- 9 files changed, 888 insertions(+), 16 deletions(-) create mode 100644 src/views/CostumeAppointments/AddCostumes.vue create mode 100644 src/views/CostumeAppointments/AppointmentOrder.vue create mode 100644 src/views/CostumeAppointments/ClothingGrade.vue create mode 100644 src/views/CostumeAppointments/CostumeDetails.vue diff --git a/src/layout/components/Aside.vue b/src/layout/components/Aside.vue index 7fc7a77..fc5010a 100644 --- a/src/layout/components/Aside.vue +++ b/src/layout/components/Aside.vue @@ -100,6 +100,28 @@ <span slot="title">实体商品订单列表</span> </el-menu-item> </el-sub-menu> + <el-sub-menu index="6"> + <template #title> + <el-icon><HomeFilled/></el-icon> + <span>写真预约管理</span> + </template> + <el-menu-item index="/ClothingGrade"> + <el-icon><Menu /></el-icon> + <span slot="title">服装等级管理</span> + </el-menu-item> + <el-menu-item index="/CostumeDetails"> + <el-icon><Menu /></el-icon> + <span slot="title">服装详情</span> + </el-menu-item> + <el-menu-item index="/AddCostumes"> + <el-icon><Menu /></el-icon> + <span slot="title">添加服装</span> + </el-menu-item> + <el-menu-item index="/AppointmentOrder"> + <el-icon><Menu /></el-icon> + <span slot="title">预约订单</span> + </el-menu-item> + </el-sub-menu> </el-menu> diff --git a/src/router/routes.ts b/src/router/routes.ts index 693c738..713135f 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -63,12 +63,32 @@ export const routes = [ { path: '/AddServiceProduct', name: '添加服务类商品', - componet: ()=> import("../views/ServiceType/AddServiceProduct.vue") + component: ()=> import("../views/ServiceType/AddServiceProduct.vue") }, { path: '/ProductCenter', name: '服务类商品管理中心', - componet: ()=> import("../views/ServiceType/ProductCenter.vue") + component: ()=> import("../views/ServiceType/ProductCenter.vue") + }, + { + path: '/ClothingGrade', + name: '服装等级管理', + component: ()=> import("../views/CostumeAppointments/ClothingGrade.vue") + }, + { + path: '/CostumeDetails', + name: '服装详情管理', + component: ()=> import("../views/CostumeAppointments/CostumeDetails.vue") + }, + { + path: '/AppointmentOrder', + name: '写真预约订单管理', + component: ()=> import("../views/CostumeAppointments/AppointmentOrder.vue") + }, + { + path: '/AddCostumes', + name: '添加服装', + component: ()=> import("../views/CostumeAppointments/AddCostumes.vue") } ] }, diff --git a/src/views/Commodity/MerchandiseCenter.vue b/src/views/Commodity/MerchandiseCenter.vue index bde4151..dc48fb5 100644 --- a/src/views/Commodity/MerchandiseCenter.vue +++ b/src/views/Commodity/MerchandiseCenter.vue @@ -274,10 +274,6 @@ const deleteProduct = async (index: number) => { getTypeList() } //选中发生的方法--->将其赋值给批量删除的数组 -const handleSelectionChange = (row: any) => { - idList.value = row.map((item : any)=>item.id) - // console.log('id->',productId.value); -}; //详情或编辑 const ReviseOrView = (index: number, row: any , flag : number) => { //flag值不同显示不同内容 disabled开启和关闭 diff --git a/src/views/CostumeAppointments/AddCostumes.vue b/src/views/CostumeAppointments/AddCostumes.vue new file mode 100644 index 0000000..893ee2e --- /dev/null +++ b/src/views/CostumeAppointments/AddCostumes.vue @@ -0,0 +1,135 @@ +<template> + <div> + <el-form ref="resetFormData" :model="form" label-width="auto" style="width: 750px" size="large"> + <el-form-item label="添加服装图片"> + <el-upload + ref="uploadProductImg" + action="#" + list-type="picture-card" + :auto-upload="false" + multiple="true" + :on-remove="handleRemove" + @change="(event: any) => handleChange(event, 0)" + :on-exceed="Exceed_ProductImg" + limit="1" > + <el-icon> + <Plus /> + </el-icon> + </el-upload> + </el-form-item> + <el-form-item label="添加效果图"> + <el-upload + ref="uploadProductDetail" + action="#" + list-type="picture-card" + :auto-upload="false" + multiple="true" + :on-change="(event: any) => handleChange(event, 1)" + :on-exceed="Exceed_ProductDetail" + limit="1" + :on-remove="handleRemove" + > + <el-icon> + <Plus /> + </el-icon> + </el-upload> + </el-form-item> + <el-form-item label="服装名称" prop="name"> + <el-input v-model="form.name" /> + </el-form-item> + <el-form-item label="服装价格" prop="price"> + <el-input v-model="form.price" /> + </el-form-item> + <el-form-item label="服装类别" prop="intro"> + <el-input v-model="form.clothesType" /> + </el-form-item> + <el-form-item label="服装简介" prop="intro"> + <el-input v-model="form.intro" /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="onSubmit">提交</el-button> + </el-form-item> + </el-form> + </div> +</template> + +<script setup lang="ts"> + +import {Plus} from "@element-plus/icons-vue"; +import {ElMessage, genFileId, type UploadProps, type UploadRawFile} from "element-plus"; +import myAxios from "@/api/myAxios"; +import {inject, ref} from "vue"; +const fileSimple = ref() +const uploadProductImg : any = ref() +const uploadProductDetail : any = ref() +const form = ref({ + name:'', + image:'', + effectImg:'', + intro:'', + price:'', + clothesType:'' +}) +const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { + console.log(uploadFile, uploadFiles) +} +const handleChange = async (file: any, flag: number) => { + fileSimple.value = file + let formData = new FormData() + formData.append("file", fileSimple.value.raw) + const res = await myAxios({ + url: '/file/upload/server/not_login', + method: 'post', + headers: { + 'content-Type': 'multipart/form-data' + }, + data: { + biz: "test", + file: formData.get("file") + } + }) + if (res.data.code === 1) { + flag ? form.value.effectImg = res.data.data : form.value.image = res.data.data + } +} +const Exceed_ProductImg: UploadProps['onExceed'] = (files) => { //覆盖商品照片 + uploadProductImg.value!.clearFiles() + const file = files[0] as UploadRawFile + file.uid = genFileId() + uploadProductImg.value!.handleStart(file) +} +const Exceed_ProductDetail: UploadProps['onExceed'] = (files) => { //覆盖商品详情图片 + uploadProductDetail.value!.clearFiles() + const file = files[0] as UploadRawFile + file.uid = genFileId() + uploadProductDetail.value!.handleStart(file) +} +const reload : any = inject("reload") +const onSubmit = async () => { + const values = Object.values(form.value); + // 使用some()方法来检查是否有任何值为空 + if (values.some(value => value === null || value === undefined || value === '')) { + ElMessage({ + type:'warning', + message:'请检查表单数据是否完整填写' + }) + return; + } + const res = await myAxios.post('/clothesInfo/add', { ...form.value }) + if (res.data.code === 1) { + ElMessage({ + type: 'success', + message: "提交成功" + }) + reload() //上传完后重置表单 + } else { + ElMessage.error("服务错误") + return; + } +} + +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/CostumeAppointments/AppointmentOrder.vue b/src/views/CostumeAppointments/AppointmentOrder.vue new file mode 100644 index 0000000..435952e --- /dev/null +++ b/src/views/CostumeAppointments/AppointmentOrder.vue @@ -0,0 +1,185 @@ +<template> + <div> + <el-input style="width: 200px; height: 30px; margin-right: 10px;" suffix-icon="Search" placeholder="订单状态" + v-model="name"></el-input> + <el-button class="ml-5" type="primary" @click="Search(name)" style="height: 25px;">搜索</el-button> + <el-button type="warning" @click="reset" style="height:25px">重置</el-button> + </div> +<!-- <div style="margin: 15px 0">--> +<!-- <el-popconfirm class="ml-5" confirm-button-text='确定' cancel-button-text='取消' icon="InfoFilled" icon-color="red"--> +<!-- title="您确定批量删除这些数据吗?" @confirm="delBatch" width=180>--> +<!-- <template #reference>--> +<!-- <el-button style="height: 25px" class="ml-5" type="danger">批量删除 <el-icon style="margin-left: 5px;">--> +<!-- <Remove />--> +<!-- </el-icon></el-button>--> +<!-- </template>--> +<!-- </el-popconfirm>--> +<!-- </div>--> +<!-- 数据展示--> + <el-table :data="orders" border style="width: 100%;margin: 15px 0" :header-cell-style="{ 'text-align': 'center' }" + @selection-change="handleSelectionChange" :cell-style="{ 'text-align': 'center', 'font-size': '16px' }"> +<!-- <el-table-column type="selection" width="55"></el-table-column>--> + <el-table-column prop="id" label="序号" width="50"></el-table-column> + <el-table-column prop="type" label="类别" ></el-table-column> + <el-table-column prop="clothesType" label="类型"></el-table-column> + <el-table-column prop="specificDate" label="日期"></el-table-column> + <el-table-column prop="timeSlot" label="时间"></el-table-column> + <el-table-column prop="createTime" label="下单时间"></el-table-column> + <el-table-column prop="orderStatus" label="订单状态"></el-table-column> + <el-table-column label="购买客户" width="50"> + <el-table-column label="姓名" prop="contactsSnapshot.name" /> + <el-table-column label="联系方式" prop="contactsSnapshot.phone" /> + </el-table-column> + <el-table-column label="操作" width="200"> + <template #default="scope"> + <el-button type="success" @click="editShow(scope.$index, scope.row,0)">详情</el-button> + <el-button type="success" @click="editShow(scope.$index, scope.row,1)">修改</el-button> +<!-- <el-popconfirm class="ml-5" confirm-button-text='确定' cancel-button-text='取消' icon="InfoFilled" icon-color="red"--> +<!-- title="是否确认删除" @confirm="Delete(scope.row.id)" width=180>--> +<!-- <template #reference>--> +<!-- <el-button style="height: 25px" class="ml-5" type="danger">删除</el-button>--> +<!-- </template>--> +<!-- </el-popconfirm>--> + </template> + </el-table-column> + </el-table> +<!-- 弹窗--> + <el-dialog v-model="dialogVisible" title="" width="500"> + <el-form :model="order" label-width="auto" style="max-width: 600px" :disabled="disabled"> + + <el-form-item label="订单编号" > + <el-input v-model="order.id" disabled/> + </el-form-item> + <el-form-item label="类型"> + <el-input v-model="order.clothesType" disabled/> + </el-form-item> + <el-form-item label="定金"> + <el-input v-model="order.deposit" disabled/> + </el-form-item> + <el-form-item label="拍摄日期"> + <el-input v-model="order.specificDate" disabled/> + </el-form-item> + <el-form-item label="拍摄时间段"> + <el-input v-model="order.timeSlot" disabled/> + </el-form-item> + <el-form-item label="室内拍摄"> + <el-input v-model="order.isIndoors" disabled/> + </el-form-item> + <el-form-item label="妆造"> + <el-input v-model="order.isMakeup" disabled/> + </el-form-item> + <el-form-item label="摄影"> + <el-input v-model="order.isPhotography" disabled/> + </el-form-item> + <el-form-item label="用户id"> + <el-input v-model="order.userId" disabled/> + </el-form-item> + <el-form-item label="订单状态"> + <el-input v-model="order.orderStatus"/> + </el-form-item> + <el-form-item label="创建时间"> + <el-input v-model="order.createTime" disabled/> + </el-form-item> + </el-form> + <template #footer #default="{ row, $index }"> + <div class="dialog-footer"> + <el-button @click="cancel">取消</el-button> + <el-button type="primary" @click="addType"> + 确定 + </el-button> + </div> + </template> + </el-dialog> +</template> + +<script setup lang="ts"> +import { ref,onMounted } from 'vue' +import myAxios from "@/api/myAxios"; +import {ElMessage, genFileId, type UploadProps, type UploadRawFile} from "element-plus"; +const orders = ref([{}]) +const name = ref('') +const searchParams: any = ref({ //封装分页 + current: 1, //当前页码 + pageSize: 5, //每页显示条数 + sortField: "id", //根据ID分类 + sortOrder: "descend" //降序 +}) +onMounted(()=>{ + getList() +}) +//获取订单 +const total = ref(0) +const getList = async () => { +const res = await myAxios.post('/advanceOrder/list',{...searchParams.value}) + + if (res.data.code === 1) { + orders.value = res.data.data.records + total.value = res.data.data.total + }else { + ElMessage({ + message:res.data.message + }) + return + } +} +const handleSelectionChange = (val:any)=>{ + console.log(val) +} +//弹窗 +const dialogVisible = ref(false) +const disabled = ref(true) +const order = ref({ + id:0, + type:'', + clothesType:'', + deposit:'', + specificDate:'', + timeSlot:'', + isIndoors:0, + isMakeup:0, + isPhotography:0, + userId:0, + orderStatus:'', + createTime:'' +}) +const title = ref('') +const editShow = (index: number, row: any,flag:number) => { + flag ? (title.value= "修改订单",disabled.value = false): (title.value= "订单详情·",disabled.value = true) + dialogVisible.value = true + order.value = row +} +const cancel = () => { + dialogVisible.value = false +} +const editForm : any = ref({}) +const addType =async () => { + dialogVisible.value = false + const res = await myAxios.post('/advanceOrder/update',{ + id:order.value.id, + orderStatus:order.value.orderStatus + }) + if(res.data.code === 1 ) { + ElMessage({ + type: 'success', + message:'更新成功' + }) + }else{ + ElMessage.error(res.data.message) + } +} +//搜索 +const Search = (data:any)=>{ + searchParams.value.orderStatus = data + // searchParams.value.id = data + // searchParams.value.type = data + searchParams.value.current = 1 + getList() +} +const reset = ()=>{ + name.value = '' +} +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/CostumeAppointments/ClothingGrade.vue b/src/views/CostumeAppointments/ClothingGrade.vue new file mode 100644 index 0000000..5d062f3 --- /dev/null +++ b/src/views/CostumeAppointments/ClothingGrade.vue @@ -0,0 +1,223 @@ +<template> + <div style="margin-bottom: 10px;"> + <el-button type="success" @click="add">添加等级</el-button> + </div> + <el-table :data="orders" border stripe header-cell-class-name="headerBg" + :cell-style="{ 'text-align': 'center', 'font-size': '16px' }" @selection-change="handleSelectionChange" + :header-cell-style="{ 'text-align': 'center' }"> + <el-table-column prop="id" label="序号" width="50"></el-table-column> + <el-table-column prop="image" label="图片"> + <template #default="scope"> + <div> + <img :src="scope.row.image" alt="" style="height: 50px;"> + </div> + </template> + </el-table-column> + <el-table-column prop="clothesType" label="等级" ></el-table-column> + <el-table-column prop="minPrice" label="最低价" ></el-table-column> + <el-table-column prop="maxPrice" label="最高价" ></el-table-column> + <el-table-column prop="brief" label="简介" ></el-table-column> + <el-table-column label="操作"> + <template #default="scope"> + <el-button type="success" @click="change(scope.$index, scope.row)">修改等级</el-button> + <el-popconfirm class="ml-5" confirm-button-text='确定' cancel-button-text='取消' icon="InfoFilled" icon-color="red" + title="是否确认删除" @confirm="Delete(scope.row.id)" width=180> + <template #reference> + <el-button style="height: 25px" class="ml-5" type="danger">删除等级</el-button> + </template> + </el-popconfirm> + </template> + </el-table-column> + </el-table> + <el-dialog v-model="dialogVisible" title="服装等级" width="500"> + <el-form :model="order" label-width="auto" style="max-width: 600px"> + <el-form-item label="添加类别图片"> + <el-upload + action="#" + list-type="picture-card" + :auto-upload="false" + multiple="true" + :on-remove="handleRemove" + @change="(event: any) => handleChange(event)" + limit="1" > + <el-icon> + <Plus /> + </el-icon> + </el-upload> + </el-form-item> + <el-form-item label="名称"> + <el-input v-model="order.clothesType"/> + </el-form-item> + <el-form-item label="最低价"> + <el-input v-model="order.minPrice"/> + </el-form-item> + <el-form-item label="最高"> + <el-input v-model="order.maxPrice"/> + </el-form-item> + <el-form-item label="简介"> + <el-input v-model="order.brief"/> + </el-form-item> + </el-form> + <template #footer #default="{ row, $index }"> + <div class="dialog-footer"> + <el-button @click="cancel">取消</el-button> + <el-button type="primary" @click="addType"> + 提交 + </el-button> + </div> + </template> + </el-dialog> +</template> + +<script setup lang="ts"> +import { ref,onMounted } from 'vue' +import myAxios from "@/api/myAxios"; +import {ElMessage, type UploadProps} from "element-plus"; +onMounted(()=>{ + getOrder() +}) +const total = ref(0) +const orders = ref([{}]) +const flag = ref(0)//请求类型 +const dialogVisible = ref(false)//弹窗 +const selectedItems = ref([]) +const getOrder = async ()=>{ + const res = await myAxios.post('/clothesGrade/list') + console.log(res) + if (res.data.code === 1) { + orders.value = res.data.data + total.value = parseInt(res.data.data.total) + }else { + ElMessage({ + message:'获取数据失败', + }) + return + } +} +//添加 +const add = async () => { + dialogVisible.value = true + flag.value = 0 +} +//取消 +const cancel = () => { + dialogVisible.value = false + restOrder() +} +//修改 +const change = async (index:number, row: any) => { + order.value = row + dialogVisible.value = true + flag.value = 1 +} +//提交 +const addType = async () => { + if( + order.value.clothesType == ''|| + order.value.image ==''|| + order.value.brief == ''|| + order.value.minPrice == 0|| + order.value.maxPrice == 0) { + ElMessage({ + type:'warning', + message:'内容不能为空' + }) + return + } + dialogVisible.value = false + if(flag.value === 0){ + const res =await myAxios.post('/clothesGrade/add',{ + clothesType:order.value.clothesType, + image:order.value.image, + minPrice:order.value.minPrice, + maxPrice:order.value.maxPrice, + brief:order.value.brief, + }) + if(res.data.code === 1) { + restOrder() + }else { + ElMessage.error(res.data.message) + } + } + if(flag.value === 1){ + const res = await myAxios.post('/clothesGrade/update',{ + clothesType:order.value.clothesType, + image:order.value.image, + minPrice:order.value.minPrice, + maxPrice:order.value.maxPrice, + brief:order.value.brief, + id:order.value.id + }) + if(res.data.code === 1) { + ElMessage({ + type:'success', + message:'更新成功' + }) + }else { + ElMessage.error(res.data.message) + } + } + getOrder() +} +//重置 +const restOrder = ()=>{ + order.value = { + image:'', + clothesType:'', + minPrice:0, + maxPrice:0, + brief:'', + id:0 + } +} +const order=ref({ + image:'', + clothesType:'', + minPrice:0, + maxPrice:0, + brief:'', + id:0 +}) +const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { + console.log(uploadFile, uploadFiles) +} +const handleSelectionChange = (row: any) => { + selectedItems.value = JSON.parse(JSON.stringify(row)) +} +//删除 +const Delete= async (index: number) => { + const res = await myAxios.post('/clothesGrade/delete',{ id : index }) + if(res.data.code === 1) { + ElMessage({ + type: 'success', + message:"删除成功" + }) + } + getOrder() +} +const fileSimple = ref() +const handleChange = async (file: any) => { + fileSimple.value = file + let formData = new FormData() + formData.append("file", fileSimple.value.raw) + const res = await myAxios({ + url: '/file/upload/server/not_login', + method: 'post', + headers: { + 'content-Type': 'multipart/form-data' + }, + data: { + biz: "test", + file: formData.get("file") + } + }) + if ( res.data.code === 1) { + order.value.image = res.data.data + } +} + +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/CostumeAppointments/CostumeDetails.vue b/src/views/CostumeAppointments/CostumeDetails.vue new file mode 100644 index 0000000..42dab5b --- /dev/null +++ b/src/views/CostumeAppointments/CostumeDetails.vue @@ -0,0 +1,276 @@ +<template> + <div> + <el-input style="width: 200px; height: 30px; margin-right: 10px;" suffix-icon="Search" placeholder="服装名称" + v-model="name"></el-input> + <el-button class="ml-5" type="primary" @click="Search(name)" style="height: 25px;">搜索</el-button> + <el-button type="warning" @click="reset" style="height:25px">重置</el-button> + </div> +<!-- <div style="margin: 15px 0">--> +<!-- <el-popconfirm class="ml-5" confirm-button-text='确定' cancel-button-text='取消' icon="InfoFilled" icon-color="red"--> +<!-- title="您确定批量删除这些数据吗?" @confirm="delBatch" width=180>--> +<!-- <template #reference>--> +<!-- <el-button style="height: 25px" class="ml-5" type="danger">批量删除 <el-icon style="margin-left: 5px;">--> +<!-- <Remove />--> +<!-- </el-icon></el-button>--> +<!-- </template>--> +<!-- </el-popconfirm>--> +<!-- </div>--> +<!-- 数据展示--> + <el-table :data="orders" border style="width: 100%;margin: 15px 0" :header-cell-style="{ 'text-align': 'center' }" + @selection-change="handleSelectionChange" :cell-style="{ 'text-align': 'center', 'font-size': '16px' }"> +<!-- <el-table-column type="selection" width="55"></el-table-column>--> + <el-table-column prop="id" label="序号" width="50"></el-table-column> + <el-table-column prop="name" label="服装名称" ></el-table-column> + <el-table-column prop="clothesType" label="类型"></el-table-column> + <el-table-column prop="price" label="价格"></el-table-column> + <el-table-column prop="image" label="类别图片" width="200"> + <template #default="scope"><img :src="scope.row.image" alt="" style="height: 50px;"></template> + </el-table-column> + <el-table-column prop="image" label="效果图片" width="200"> + <template #default="scope"><img :src="scope.row.effectImg" alt="" style="height: 50px;"></template> + </el-table-column> + <el-table-column label="操作"> + <template #default="scope"> + <el-button type="success" @click="editShow(scope.$index, scope.row,0)">详情</el-button> + <el-button type="success" @click="editShow(scope.$index, scope.row,1)">修改</el-button> + <el-popconfirm class="ml-5" confirm-button-text='确定' cancel-button-text='取消' icon="InfoFilled" icon-color="red" + title="是否确认删除" @confirm="Delete(scope.row.id)" width=180> + <template #reference> + <el-button style="height: 25px" class="ml-5" type="danger">删除</el-button> + </template> + </el-popconfirm> + </template> + </el-table-column> + </el-table> +<!-- 分页--> + <div style="padding: 10px 0"> + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" + :current-page="searchParams.current" :page-size="searchParams.pageSize" :page-sizes="[5, 10, 15, 20]" + :small="null" :disabled="null" :background="null" layout="total, sizes, prev, pager, next, jumper" + :total="total" /> + </div> +<!-- 弹窗--> + <el-dialog v-model="dialogVisible" title="" width="500"> + <el-form :model="order" label-width="auto" style="max-width: 600px" :disabled="disabled"> + <el-form-item label="服装图片"> + <div v-if="order.image"> + <img :src="order.image" class="thumbnail" style="width: 100px; height: 100px;" /> + </div> + <el-upload + ref="uploadProductImg" + action="#" + list-type="picture-card" + :auto-upload="false" + multiple="true" + :on-remove="handleRemove" + :on-exceed="Exceed_ProductImg" + limit="1" > + <el-icon> + <Plus/> + </el-icon> + </el-upload> + </el-form-item> + <el-form-item label="商品图文"> + <div v-if="order.effectImg"> + <img :src="order.effectImg" alt="商品图标" class="thumbnail" style="width: 100px; height: 100px;" /> + </div> + <el-upload + ref="uploadProductDetail" + action="#" + list-type="picture-card" + :auto-upload="false" + multiple="true" + :on-remove="handleRemove" + :on-exceed="Exceed_ProductDetail" + limit="1" > + <el-icon> + <Plus/> + </el-icon> + </el-upload> + </el-form-item> + <el-form-item label="名称"> + <el-input v-model="order.name"/> + </el-form-item> + <el-form-item label="类型"> + <el-input v-model="order.clothesType"/> + </el-form-item> + <el-form-item label="价格"> + <el-input v-model="order.price"/> + </el-form-item> + <el-form-item label="简介"> + <el-input v-model="order.intro"/> + </el-form-item> + </el-form> + <template #footer #default="{ row, $index }"> + <div class="dialog-footer"> + <el-button @click="cancel">取消</el-button> + <el-button type="primary" @click="addType"> + 确定 + </el-button> + </div> + </template> + </el-dialog> +</template> + +<script setup lang="ts"> +import {ref, onMounted} from 'vue' +import myAxios from "@/api/myAxios"; +import {ElMessage, genFileId, type UploadProps, type UploadRawFile} from "element-plus"; + +onMounted(()=>{ + getList() +}) +const orders = ref([{}]) +const total = ref(0) +const getList = async ()=>{ + const res = await myAxios.post('/clothesInfo/list/page',{...searchParams.value}) + console.log(res) + if (res.data.code === 1) { + orders.value = res.data.data.records; + total.value = parseInt(res.data.data.total) + }else { + ElMessage({ + message:'获取数据失败', + }) + return + } +} +const name = ref('')//跟据名搜索 +const dialogVisible = ref(false) +const order=ref({ + id:0, + name:'', + price:'', + effectImg:'', + image:'', + intro:'', + clothesType:'' +}) +const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { + console.log(uploadFile, uploadFiles) +} +const cancel = () => { + dialogVisible.value = false +} + +const title = ref('') +const disabled = ref(true) +const editShow = (index: number, row: any,flag:number) => { + flag ? (title.value= "修改服装",disabled.value = false): (title.value= "服装详情·",disabled.value = true) + dialogVisible.value = true + order.value = row +} +//删除 +const Delete=async (index : number)=>{ + const res = await myAxios.post('/clothesInfo/delete',{ id : index }) + console.log(res) + if (res.data.code === 1) { + ElMessage({ + type: 'success', + message:'删除成功' + }) + }else { + ElMessage({ + message:'删除失败' + }) + } + getList() +} +const searchParams: any = ref({ //封装分页 + current: 1, //当前页码 + pageSize: 5, //每页显示条数 + sortField: "id", //根据ID分类 + sortOrder: "descend" //降序 +}) +const handleSizeChange = (newSize: any) => { + searchParams.value.pageSize = newSize + getList() +} +const handleCurrentChange = (Current: any) => { + searchParams.value.current = Current + getList() +} + +//搜索 +const Search = (data:String)=>{ + searchParams.value.name = data + searchParams.value.current = 1 + getList() +} +// const reload : any = inject("reload") +const reset =()=>{ + name.value='' +} +const handleSelectionChange = (val:any)=>{ + console.log(val) +} +const fileSimple = ref() +const handleChange = async (file: any) => { + fileSimple.value = file + let formData = new FormData() + formData.append("file", fileSimple.value.raw) + const res = await myAxios({ + url: '/file/upload/server/not_login', + method: 'post', + headers: { + 'content-Type': 'multipart/form-data' + }, + data: { + biz: "test", + file: formData.get("file") + } + }) + if ( res.data.code === 1) { + order.value.image = res.data.data + } +} +//批量删除 +const idList = ref([]) +const delBatch = async ()=>{ + console.log(idList.value); + const res = await myAxios.post('/clothesInfo/delete',{ + id: idList.value + }) + if(res.data.code === 1) { + ElMessage({ + type: 'success', + message: '批量删除成功' + }) + getList() + } else { + ElMessage.error('删除失败') + } +} +const editForm : any = ref({}) +//提交 +const addType =async ()=>{ + dialogVisible.value = false + const res = await myAxios('/clothesInfo/update',{...editForm.value}) + if(res.data.code === 1) { + ElMessage({ + type: 'success', + message:'更新成功' + }) + }else{ + ElMessage.error(res.data.message) + } +} +const uploadProductImg : any = ref() +const uploadProductDetail : any = ref() +const Exceed_ProductDetail: UploadProps['onExceed'] = (files) => { //覆盖商品详情图片 + uploadProductDetail.value!.clearFiles() + const file = files[0] as UploadRawFile + file.uid = genFileId() + uploadProductDetail.value!.handleStart(file) +} +const Exceed_ProductImg: UploadProps['onExceed'] = (files , flag) => { //覆盖商品照片 + uploadProductImg.value!.clearFiles() + const file = files[0] as UploadRawFile + file.uid = genFileId() + uploadProductImg.value!.handleStart(file) +} +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/src/views/Coupons/AddCoupons.vue b/src/views/Coupons/AddCoupons.vue index 186804a..099fd10 100644 --- a/src/views/Coupons/AddCoupons.vue +++ b/src/views/Coupons/AddCoupons.vue @@ -94,7 +94,7 @@ const AddCoupon = async () => { }); return; } - const res = await myAxios.post('/coupon/add', {...form.value }); + const res = await myAxios.post('/coupon/add ', {...form.value }); if (res.data.code === 1) { ElMessage({ type: 'success', diff --git a/src/views/Coupons/CouponCenter.vue b/src/views/Coupons/CouponCenter.vue index b318514..2dcf9fb 100644 --- a/src/views/Coupons/CouponCenter.vue +++ b/src/views/Coupons/CouponCenter.vue @@ -81,7 +81,7 @@ list-type="picture-card" :auto-upload="false" multiple="true" - :on-remove="handleRemove" + :on-remove=" handleRemove" @change="(event: any) => handleChange(event, 0)" limit="1" > <el-icon> @@ -135,10 +135,8 @@ onMounted(() => { getCouponsList() }) -const handleSelectionChange = (row: any) => { - // id.value = JSON.parse(JSON.stringify(row)); -} const DialogVisible = ref(false) +const idList = ref([]) const total = ref(0) const tableData : any= ref([]) const Couponsname = ref('') @@ -166,16 +164,33 @@ const handleCurrentChange = (Current: any) => { searchParams.value.current = Current getCouponsList() } -const delBatch =()=>{ - //批量删除 +const handleSelectionChange = (row: any) => { + idList.value = row.map((item : any)=>item.id) +} +//批量删除 +const delBatch = async ()=>{ + const res = await myAxios.post('/coupon/delete', { + id:idList.value + }) + if (res.data.code === 1) { + ElMessage({ + type:'success', + message:"批量删除成功" + }) + getCouponsList() + }else { + ElMessage.error('删除失败') + } } //重置搜索 const reset = () => { Couponsname.value = ''; } //搜索 -const load =()=>{ - +const load =(data:String)=>{ + searchParams.value.name = data + searchParams.value.content = 1 + getCouponsList() } const saveEdit = async () => { //编辑商品 const res = await myAxios.post('/coupon/update',{...editForm.value}) @@ -215,7 +230,7 @@ const getCouponsList = async ()=> { } } const handleChange = async (file: any, flag: number) => { - fileSimple.value = file + fileSimple.value = filen let formData = new FormData() //这一步很重要 创建一个FormData对象 formData.append("file", fileSimple.value.raw) //fileSimple.value.raw 才是文件主体 将其以文件的格式插入formData const res = await myAxios({ //编写请求,与以前的请求不同,这一次要指定好头部类型和文件类型