| | |
| | | <template> |
| | | <ProDialog |
| | | :title="innerForm.title" |
| | | v-model="innerVisible" |
| | | @close="onDialogClose" |
| | | destroy-on-close |
| | | > |
| | | <ProForm :rules="rules" :model="innerForm" ref="dialogForm" label-width="120px"> |
| | | <ProFormItemV2 |
| | | label="广告页面:" |
| | | prop="pageType" |
| | | :check-rules="[{ message: '请选择广告页面' }]" |
| | | > |
| | | <ProDialog :title="form.title" v-model="visible" @close="onDialogClose" destroy-on-close> |
| | | <ProForm :model="form" ref="dialogForm" label-width="120px"> |
| | | <ProFormItemV2 label="广告页面:" prop="page" :check-rules="[{ message: '请选择广告页面' }]"> |
| | | <ProFormSelect |
| | | placeholder="请选择广告页面" |
| | | :value-enum="FlexWorkerEleSignEnumText" |
| | | :value-enum="EnumAdvertisementPageText" |
| | | clearable |
| | | v-model="innerForm.pageType" |
| | | v-model="form.page" |
| | | ></ProFormSelect> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 |
| | | label="广告名称:" |
| | | prop="advertiseName" |
| | | prop="name" |
| | | :check-rules="[{ message: '请输入广告名称' }, { max: 20, message: '不能超过20个字符' }]" |
| | | > |
| | | <ProFormText |
| | | placeholder="请输入广告名称" |
| | | v-model.trim="innerForm.advertiseName" |
| | | v-model.trim="form.name" |
| | | :maxlength="20" |
| | | ></ProFormText> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 |
| | | label="广告产品链接:" |
| | | prop="advertiseLink" |
| | | :check-rules="[ |
| | | { type: 'urlWithParams', message: '请输入广告产品链接' }, |
| | | { message: '请输入正确的广告产品链接' }, |
| | | ]" |
| | | > |
| | | <ProFormItemV2 label="广告产品链接:" prop="url"> |
| | | <ProFormText |
| | | placeholder="请输入广告产品链接" |
| | | v-model.trim="innerForm.advertiseLink" |
| | | v-model.trim="form.url" |
| | | :maxlength="150" |
| | | ></ProFormText> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 |
| | | label="广告图片:" |
| | | prop="imgInfo" |
| | | prop="file" |
| | | :check-rules="[{ type: 'array', message: '请选择广告图片' }]" |
| | | > |
| | | <ProFormImageUpload |
| | | :fileDirectory="OssAdvertise" |
| | | v-model:file-url="innerForm.imgInfo" |
| | | :limitFileCount="1" |
| | | ></ProFormImageUpload> |
| | | <ProFormImageUpload v-model:file-url="form.file" :limitFileCount="1"></ProFormImageUpload> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 |
| | | label="广告日期:" |
| | | prop="date" |
| | | prop="time" |
| | | :check-rules="[{ type: 'array', message: '请选择广告日期' }]" |
| | | > |
| | | <ProFormDatePicker |
| | | v-model="innerForm.date" |
| | | v-model="form.time" |
| | | type="daterange" |
| | | range-separator="~" |
| | | start-placeholder="广告起始日期" |
| | |
| | | :check-rules="[{ message: '请输入排序' }]" |
| | | > |
| | | <ProFormInputNumber |
| | | v-model="innerForm.sort" |
| | | v-model="form.sort" |
| | | :controls="false" |
| | | :min="0" |
| | | :max="99" |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { FormRules, FormInstance } from 'element-plus'; |
| | | import { FormInstance } from 'element-plus'; |
| | | import { |
| | | ProDialog, |
| | | ProForm, |
| | |
| | | ProFormImageUpload, |
| | | } from '@bole-core/components'; |
| | | import { ModelValueType } from 'element-plus'; |
| | | import { OssAdvertise, FlexWorkerEleSignEnumText } from '@/constants'; |
| | | import { BoleRegExp } from '@bole-core/core'; |
| | | import { EnumAdvertisementPageText } from '@/constants'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import * as advertisementServices from '@/services/api/advertisement'; |
| | | import { convertApi2FormUrlOnlyOne, format } from '@/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'AddOrEditAdvertisementDialog', |
| | | }); |
| | | |
| | | type Props = { |
| | | modelValue: boolean; |
| | | form?: { |
| | | type Form = { |
| | | title?: string; |
| | | id: string; |
| | | pageType: number; |
| | | advertiseName: string; |
| | | advertiseLink: string; |
| | | imgInfo: UploadUserFile[]; |
| | | date: ModelValueType; |
| | | sort: number; |
| | | }; |
| | | page?: number; |
| | | name?: string; |
| | | url?: string; |
| | | file?: UploadUserFile[]; |
| | | time?: ModelValueType; |
| | | sort?: number; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | modelValue: false, |
| | | }); |
| | | const form = defineModel<Form>('form'); |
| | | const visible = defineModel<boolean>('modelValue'); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'update:modelValue', value: boolean): void; |
| | | (e: 'update:form', value: Props['form']): void; |
| | | (e: 'onConfirm'): void; |
| | | (e: 'onCancel'): void; |
| | | }>(); |
| | | |
| | | const dialogForm = ref<FormInstance>(); |
| | | |
| | | const innerVisible = computed({ |
| | | get() { |
| | | return props.modelValue; |
| | | }, |
| | | set(val) { |
| | | emit('update:modelValue', val); |
| | | }, |
| | | }); |
| | | watch( |
| | | () => visible.value, |
| | | (val) => { |
| | | if (val && form.value?.id) { |
| | | refetch(); |
| | | } |
| | | } |
| | | ); |
| | | |
| | | const innerForm = computed({ |
| | | get() { |
| | | return props.form; |
| | | const { data: detail, refetch } = useQuery({ |
| | | queryKey: ['advertisementServices/getAdvertisement', form.value.id], |
| | | queryFn: async () => { |
| | | return await advertisementServices.getAdvertisement({ id: form.value.id }); |
| | | }, |
| | | set(val) { |
| | | emit('update:form', val); |
| | | placeholderData: () => ({} as API.GetAdvertisementQueryResult), |
| | | enabled: computed(() => !!form.value.id), |
| | | onSuccess(data) { |
| | | form.value.page = data.page; |
| | | form.value.name = data.name; |
| | | form.value.url = data.url; |
| | | form.value.file = data.file ? convertApi2FormUrlOnlyOne(data.file) : []; |
| | | form.value.time = [ |
| | | format(data.beginTime, 'YYYY-MM-DD 00:00:00'), |
| | | format(data.endTime, 'YYYY-MM-DD 23:59:59'), |
| | | ]; |
| | | form.value.sort = data.sort; |
| | | }, |
| | | }); |
| | | |
| | | const rules = reactive<FormRules>({ |
| | | contacterPhone: [ |
| | | { message: '请输入正确的联系电话', trigger: 'blur', pattern: BoleRegExp.RegTelNumber }, |
| | | ], |
| | | }); |
| | | |
| | | function onDialogClose() { |
| | | if (!dialogForm.value) return; |
| | | dialogForm.value.resetFields(); |