diff --git a/src/layout/components/appointTime.vue b/src/layout/components/appointTime.vue index e23a97b..da0919d 100644 --- a/src/layout/components/appointTime.vue +++ b/src/layout/components/appointTime.vue @@ -4,6 +4,7 @@ <div v-for="(item, index) in dayList" :key="index"> <div class="inner" style="font-size: medium;"> 第{{ index + 1 }}天 + <el-checkbox v-model="isAvailableArray[index]" label="这天可预约" style="margin-left: 10px;"/> </div> <!-- 时间段部分 --> <div class="time-picker"> @@ -22,14 +23,16 @@ <el-select v-model="timeList[index][row].minNumValue" placeholder="最小人数" style="width: 100px" - @change="minNumFun(timeList[index][row].minNumValue,index,row)"> + @change="minNumFun(index,row)"> <el-option v-for="item in minOptions[index][row]" :key="item" :value="item" /> </el-select> - <el-select v-model="timeList[index][row].maxNunValue" + <el-select v-model="timeList[index][row].maxNumValue" placeholder="最大人数" - style="width: 100px"> + style="width: 100px" + @change="maxNumFun(index,row)" + > <el-option v-for="item in maxOptions[index][row]" :key="item" :value="item" /> @@ -40,7 +43,6 @@ <el-button circle @click="subList(index, row)" v-if="row + 1 > 1"><el-icon> <Minus /> </el-icon></el-button> - <el-checkbox v-model="timeList[index][row].isAvailable" label="此时间段可预约" style="margin-left: 10px;"/> </div> </div> </div> @@ -60,7 +62,8 @@ <script setup lang="ts"> import { onMounted, ref , defineEmits } from 'vue' import { Plus } from '@element-plus/icons-vue'; - +import { transfer } from '../../utils/dealStringArray'; //导入js函数 +import { ElMessage } from 'element-plus'; const dayList = ref([0, 1, 2, 3]) //今天和未来三天 const timeList = ref([ //时间段数组,可以直接通过timeList[index][row]访问对应的时间段 [ @@ -68,8 +71,7 @@ const timeList = ref([ //时间段数组,可以直接通过timeList[index][ startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '' } ], [ @@ -77,8 +79,7 @@ const timeList = ref([ //时间段数组,可以直接通过timeList[index][ startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '' } ], [ @@ -86,8 +87,7 @@ const timeList = ref([ //时间段数组,可以直接通过timeList[index][ startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '' } ], [ @@ -95,12 +95,13 @@ const timeList = ref([ //时间段数组,可以直接通过timeList[index][ startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '' } ] ]) - +const isAvailableArray = ref( + Array.from({length:4},()=>(false)) +) //人数数组,初始化好四天六个时间段的人数 const minOptions = ref( Array.from({length:4},()=>( @@ -117,32 +118,7 @@ const maxOptions = ref( )) ) const flag = ref(0) //第一个人数下标 -const appointmentDateAddRequestList = ref( - Array.from({length: 4},()=>( - { - timeSlot: '', - isAvailable: 0, - numberRange: '' - } - )), -) - var arr = new Array(4) -const init = () => { - for (var i = 0; i < 4; i ++ ) { - arr[i] = new Array(6) - } - for (var i = 0; i < 4; i ++ ) { - for (var j = 0; j < 6; j ++ ) { - arr[i][j] = { - timeSlot: '', - numberRange: '', - isAvailable: '' - } - } - } -} - const emit = defineEmits(['time-Info']) //组件绑定 onMounted(()=>{ init() @@ -161,8 +137,7 @@ const addList = (index: any, row: any) => { startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '' }) flag.value += 1 } @@ -170,94 +145,55 @@ const addList = (index: any, row: any) => { const subList = (index: number, row: number) => { timeList.value[index].splice(row, 1) } -const minNumFun = (number : any,index : number,row : number)=> { - maxOptions.value[index][row].splice(0,number-5) +const minNumFun = (index : number,row : number)=> { + if(timeList.value[index][row].maxNumValue < timeList.value[index][row].minNumValue && timeList.value[index][row].maxNumValue != '') { + ElMessage({ + type: 'error', + message: '最小人数不大于最大人数' + }) + timeList.value[index][row].minNumValue = '' + return; + } } -import { transfer } from '../../utils/dealStringArray'; //组件传值 const onSubmit =()=> { - let tempArr = transfer(timeList.value, arr) - console.log(tempArr) + let tempArr = transfer(timeList.value, arr,isAvailableArray.value) + // console.log(tempArr) //将数组处理成后端格式 emit('time-Info',tempArr) } - - - -// const isNotValid = (val:any) => { -// const timeRegex = /^([0-1]?[0-9]|2[0-3]):([0-5]?[0-9])-(?:[0-1]?[0-9]|2[0-3]):([0-5]?[0-9])$/; -// const rangeRegex = /^\(\d+,\d+\)$/ -// return timeRegex.test(val.timeSlot) && rangeRegex.test(val.numberRange) -// } - -// const isValidPlus = (val:any) => { -// const timeRegex = /^([0-1]?[0-9]|2[0-3]):([0-5]?[0-9])-(?:[0-1]?[0-9]|2[0-3]):([0-5]?[0-9])$/; -// const rangeRegex = /^\(\d+,\d+\)$/ -// if(val.timeSlot === '' && val.numberRange === '') return false -// if(timeRegex.test(val.timeSlot) && rangeRegex.test(val.numberRange)) return false -// return true -// } - -// const transfer = (val:any) => { -// for (var i = 0; i < val.length; i ++ ) { -// for (var j = 0; j < val[i].length; j ++ ) { -// arr[i][j].timeSlot = val[i][j].startTime + "-" + val[i][j].endTime -// arr[i][j].numberRange = "(" + val[i][j].minNumValue + "," + val[i][j].maxNunValue + ")" -// arr[i][j].isAvailable = val[i][j].isAvailable -// } -// } -// // console.log(arr) -// for (var i = 0; i < 4; i ++ ) { -// for (var j = 0; j < 6; j ++ ) { -// if(isValidPlus(arr[i][j])) { -// ElMessage({ -// type: 'error', -// message: '请检查表单数据是否完整填写' -// }) -// return ; -// } -// } -// } -// let newArr:any = new Array(4) -// for (var i = 0; i < 4; i ++ ) { -// newArr[i] = { -// timeSlot:'', -// numberRange: '', -// isAvailable: true -// } -// } - -// let timeSlotArr:any = [] -// let numberRangeArr:any = [] -// for (var i = 0; i < val.length; i ++ ) { -// for (var j = 0; j < val[i].length; j ++ ) { -// if(isNotValid(arr[i][j])) { -// timeSlotArr.push(arr[i][j].timeSlot) -// numberRangeArr.push(arr[i][j].numberRange) -// } -// } -// newArr[i].timeSlot = timeSlotArr.join(';') -// newArr[i].numberRange = numberRangeArr.join(';') -// timeSlotArr = [] -// numberRangeArr = [] -// } -// console.log(newArr) -// return newArr -// } - - - - const resetForm=()=>{ - console.log(3333) for(let i=0;i<4;i++) { timeList.value[i] = [{ startTime: '', endTime: '', minNumValue: '', - maxNunValue: '', - isAvailable: false + maxNumValue: '', }] + isAvailableArray.value[i] = false + } +} +const init = () => { + for (var i = 0; i < 4; i ++ ) { + arr[i] = new Array(6) + } + for (var i = 0; i < 4; i ++ ) { + for (var j = 0; j < 6; j ++ ) { + arr[i][j] = { + timeSlot: '', + numberRange: '', + isAvailable: '' + } + } + } +} +const maxNumFun =(index: number ,row: number)=>{ + if(timeList.value[index][row].maxNumValue < timeList.value[index][row].minNumValue) { + ElMessage({ + type: 'error', + message: '最大人数应该大于最小人数' + }) + return; } } </script> diff --git a/src/utils/dealStringArray.js b/src/utils/dealStringArray.js index da09d2e..a773855 100644 --- a/src/utils/dealStringArray.js +++ b/src/utils/dealStringArray.js @@ -1,4 +1,3 @@ - import { ElMessage } from 'element-plus'; const isNotValid = (val) => { @@ -15,12 +14,11 @@ const isValidPlus = (val) => { return true } -export const transfer = (val, arr) => { +export const transfer = (val, arr, isAvailableArr) => { for (var i = 0; i < val.length; i ++ ) { for (var j = 0; j < val[i].length; j ++ ) { arr[i][j].timeSlot = val[i][j].startTime + "-" + val[i][j].endTime - arr[i][j].numberRange = "(" + val[i][j].minNumValue + "," + val[i][j].maxNunValue + ")" - arr[i][j].isAvailable = val[i][j].isAvailable + arr[i][j].numberRange = "(" + val[i][j].minNumValue + "," + val[i][j].maxNumValue + ")" } } // console.log(arr) @@ -40,7 +38,7 @@ export const transfer = (val, arr) => { newArr[i] = { timeSlot:'', numberRange: '', - isAvailable: true + isAvailable: false } } @@ -55,6 +53,7 @@ export const transfer = (val, arr) => { } newArr[i].timeSlot = timeSlotArr.join(';') newArr[i].numberRange = numberRangeArr.join(';') + newArr[i].isAvailable = isAvailableArr[i] ? 1 : 0 timeSlotArr = [] numberRangeArr = [] } diff --git a/src/views/Commodity/MerchandiseCenter.vue b/src/views/Commodity/MerchandiseCenter.vue index dc48fb5..c3a56cf 100644 --- a/src/views/Commodity/MerchandiseCenter.vue +++ b/src/views/Commodity/MerchandiseCenter.vue @@ -370,7 +370,7 @@ const delBatch = async ()=>{ ElMessage.error('删除失败') } } -const load =()=>{} +const handleSelectionChange =()=>{} </script> <style scoped> diff --git a/src/views/ServiceType/AddServiceProduct.vue b/src/views/ServiceType/AddServiceProduct.vue index 41f60dd..43e9605 100644 --- a/src/views/ServiceType/AddServiceProduct.vue +++ b/src/views/ServiceType/AddServiceProduct.vue @@ -4,7 +4,7 @@ <!-- 表单 ref 和 prop绑定 用于重置表单 --> <el-form ref="resetFormData" :model="form" label-width="auto" style="width: 750px;" size="large"> <div class="totalPicture"> - <div class="boxPicture1"> + <div> <el-form-item label="添加课程展示图片"> <!-- 下面的event的作用,传入当前事件对象 --> <el-upload ref="uploadProductImg" action="#" list-type="picture-card" :auto-upload="false" multiple="true" @@ -45,9 +45,21 @@ <el-input v-model="form.intro" type="textarea" style="width: 600px;" /> </el-form-item> <!-- 使用弹窗 --> + <div class="midBox"> <el-form-item label="产品类别" prop="type"> - <el-select v-model="selectValue" disabled style="width: 110px;" /> + <el-select v-model="form.type" disabled style="width: 110px;" /> </el-form-item> + <el-form-item label="节日限定" prop="type"> + <el-select v-model="festivalValue" style="width: 110px;" placeholder="请选择" @change="setFestival"> + <el-option + v-for="item in festivalList" + :key="item" + :label="item" + :value="item" + /> + </el-select> + </el-form-item> + </div> <el-form-item label="商品标签" prop="label"> <el-input v-model="form.label" type="textarea" placeholder="使用英文;分隔符分开" style="width: 600px;" /> </el-form-item> @@ -72,7 +84,7 @@ </template> <script setup lang="ts"> -import { ref, onMounted, inject } from 'vue'; +import { ref, onMounted, inject, toRaw } from 'vue'; import { Plus } from '@element-plus/icons-vue'; import { ElMessage, type UploadFile, type UploadProps, genFileId, type UploadRawFile } from 'element-plus'; import myAxios from "@/api/myAxios"; @@ -81,25 +93,26 @@ const fileSimple = ref() //单个文件 const uploadedFiles = ref<UploadFile[]>([]);//商品图片数组 const uploadedDescription = ref<UploadFile[]>([]);//商品图文描述数组 const resetFormData = ref() -const selectValue = '服务类' const form = ref({ name: '', price: '', //商品价格 intro: '',//产品简介 - type: '',//类别 + type: '服务类',//类别 label: '',//商品标签 introDetail: '',//详情描述 goodImg: '', //商品图片url detailImg: '', //图文详情url - timePeriod: '', - people: 0, - date: [] + festivalOrder: 0, + inventory: 1, + appointmentDateAddRequestList: [] //预约时间段,是否可预约,人数范围 }) +const festivalList = ['非限定','端午节','元宵节','元旦'] //导入组件刷新 const reload: any = inject("reload") const uploadProductImg: any = ref() //图片上传的ref绑定 const uploadProductDetail: any = ref() //图片上传的ref绑定 const timeInfo = ref([]) //组件传过来的信息 +const festivalValue = ref('') onMounted(() => { // console.log(myDate.getHours()); //打印当前小时数 }) @@ -107,17 +120,31 @@ const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { console.log(uploadFile, uploadFiles) } //提交表单 -const onSubmit = async () => { +const onSubmit = async () => { const values = Object.values(form.value); // 使用some()方法来检查是否有任何值为空 - if (values.some(value => value === null || value === undefined || value === '')) { + if (values.some(value => value === null || value === undefined || value === '') || form.value.appointmentDateAddRequestList.length == 0) { ElMessage({ type: 'warning', message: '请检查表单数据是否完整填写' }) return; //空返回结束函数 } - const res = await myAxios.post('/goods/add', { ...form.value }) + console.log(form.value); + const res = await myAxios.post('/goods/add/service', { + name: form.value.name, + type: form.value.type, + price: form.value.price, + goodImg: form.value.goodImg, + intro: form.value.intro, + introDetail: form.value.introDetail, + detailImg: form.value.detailImg, + label: form.value.label, + inventory: form.value.inventory, + festivalOrder: form.value.festivalOrder, + appointmentDateAddRequestList: toRaw(form.value.appointmentDateAddRequestList) + }) + console.log(res.data); if (res.data.code === 1) { ElMessage({ type: 'success', @@ -168,8 +195,14 @@ const Exceed_ProductDetail: UploadProps['onExceed'] = (files) => { //覆盖商 uploadProductDetail.value!.handleStart(file) } const getInfo =(info:any)=>{ - timeInfo.value = info - console.log('--->',info.value); + console.log('info-->',info); + // timeInfo.value = info + form.value.appointmentDateAddRequestList = info +} +const setFestival =(info:any)=>{ + console.log(info); + form.value.festivalOrder = festivalList.findIndex(value=>value == info) + console.log(form.value.festivalOrder); } </script> @@ -196,7 +229,9 @@ const getInfo =(info:any)=>{ justify-content: space-evenly; /* 盒子里面水平分隔开 */ } - +.midBox { + display: flex; +} .date-picker { flex: 0.3; /* 日期选择区域占据左边 */ @@ -221,4 +256,5 @@ const getInfo =(info:any)=>{ margin-bottom: 10px; border: 1px solid orange; } + </style> \ No newline at end of file diff --git a/src/views/ServiceType/ProductCenter.vue b/src/views/ServiceType/ProductCenter.vue index 9ace828..01b0228 100644 --- a/src/views/ServiceType/ProductCenter.vue +++ b/src/views/ServiceType/ProductCenter.vue @@ -1,5 +1,5 @@ <template> - <div>123</div> + </template> <script setup lang="ts">