diff --git a/apps/web-antd/src/api/store/index.ts b/apps/web-antd/src/api/store/index.ts index b1f3570..abbe35a 100644 --- a/apps/web-antd/src/api/store/index.ts +++ b/apps/web-antd/src/api/store/index.ts @@ -68,7 +68,6 @@ export interface PaginatedResult { export interface SaveStoreDto { id?: string; name: string; - code: string; contactPhone: string; managerName: string; address: string; diff --git a/apps/web-antd/src/views/store/list/components/StoreEditorDrawer.vue b/apps/web-antd/src/views/store/list/components/StoreEditorDrawer.vue index 9f40a6d..c53e591 100644 --- a/apps/web-antd/src/views/store/list/components/StoreEditorDrawer.vue +++ b/apps/web-antd/src/views/store/list/components/StoreEditorDrawer.vue @@ -8,21 +8,34 @@ import type { SelectOptionItem } from '../types'; import type { ServiceType, StoreBusinessStatus } from '#/api/store'; -import { Button, Drawer, Form, FormItem, Input, Select } from 'ant-design-vue'; +import { IconifyIcon } from '@vben/icons'; + +import { + Button, + Drawer, + Form, + FormItem, + Input, + message, + Select, + Upload, +} from 'ant-design-vue'; + +import { requestClient } from '#/api/request'; interface Props { address: string; businessStatus: StoreBusinessStatus; businessStatusOptions: SelectOptionItem[]; - code: string; contactPhone: string; + coverImage?: string; isSubmitting: boolean; managerName: string; name: string; onSetAddress: (value: string) => void; onSetBusinessStatus: (value: StoreBusinessStatus) => void; - onSetCode: (value: string) => void; onSetContactPhone: (value: string) => void; + onSetCoverImage?: (value: string) => void; onSetManagerName: (value: string) => void; onSetName: (value: string) => void; onSetServiceTypes: (value: ServiceType[]) => void; @@ -51,16 +64,6 @@ function readEnumValue(value: unknown): T | undefined { return Number.isFinite(numericValue) ? (numericValue as T) : undefined; } -/** 解析服务方式多选结果。 */ -function readServiceTypeList(value: unknown): ServiceType[] { - if (!Array.isArray(value)) return []; - - return value - .map(Number) - .filter((item) => Number.isFinite(item)) - .map((item) => item as ServiceType); -} - /** 同步营业状态。 */ function handleBusinessStatusChange(value: unknown) { const nextStatus = readEnumValue(value); @@ -68,9 +71,41 @@ function handleBusinessStatusChange(value: unknown) { props.onSetBusinessStatus(nextStatus); } -/** 同步服务方式。 */ -function handleServiceTypesChange(value: unknown) { - props.onSetServiceTypes(readServiceTypeList(value)); +/** 切换服务方式。 */ +function toggleServiceType(value: ServiceType) { + const current = [...props.serviceTypes]; + const index = current.indexOf(value); + if (index === -1) { + current.push(value); + } else { + current.splice(index, 1); + } + props.onSetServiceTypes(current); +} + +/** 处理图片上传。 */ +async function handleUpload(options: any) { + const { file, onSuccess, onError } = options; + try { + const formData = new FormData(); + formData.append('file', file); + // 假设后端上传接口为 /upload,返回 { url: string } + const res = await requestClient.post<{ url: string }>('/upload', formData, { + headers: { 'Content-Type': 'multipart/form-data' }, + }); + + const url = res?.url || (typeof res === 'string' ? res : ''); + if (url) { + props.onSetCoverImage?.(url); + onSuccess(res, file); + message.success('上传成功'); + } else { + throw new Error('Upload response missing url'); + } + } catch (error) { + onError(error); + message.error('上传失败'); + } } @@ -92,13 +127,6 @@ function handleServiceTypesChange(value: unknown) { @update:value="(value) => props.onSetName(readTextValue(value))" /> - - - + + + avatar +
+ +
点击上传门店图片
+
+
+
+
营业设置
+ +
+
+ {{ option.label }} +
+
diff --git a/apps/web-antd/src/views/store/list/composables/store-list-page/constants.ts b/apps/web-antd/src/views/store/list/composables/store-list-page/constants.ts index a9fab77..26b401d 100644 --- a/apps/web-antd/src/views/store/list/composables/store-list-page/constants.ts +++ b/apps/web-antd/src/views/store/list/composables/store-list-page/constants.ts @@ -69,7 +69,6 @@ export const DEFAULT_FILTERS: StoreFilterState = { export const DEFAULT_FORM_STATE: StoreFormState = { address: '', businessStatus: StoreBusinessStatusEnum.Operating, - code: '', contactPhone: '', coverImage: '', id: '', diff --git a/apps/web-antd/src/views/store/list/composables/store-list-page/helpers.ts b/apps/web-antd/src/views/store/list/composables/store-list-page/helpers.ts index 5aeefad..4e7fc75 100644 --- a/apps/web-antd/src/views/store/list/composables/store-list-page/helpers.ts +++ b/apps/web-antd/src/views/store/list/composables/store-list-page/helpers.ts @@ -40,7 +40,6 @@ export function applyRecordToForm( Object.assign(formState, { address: store.address, businessStatus: store.businessStatus, - code: store.code, contactPhone: store.contactPhone, coverImage: store.coverImage || '', id: store.id, @@ -55,7 +54,6 @@ export function toSavePayload(formState: StoreFormState): SaveStoreDto { return { address: formState.address.trim(), businessStatus: formState.businessStatus, - code: formState.code.trim(), contactPhone: formState.contactPhone.trim(), coverImage: formState.coverImage.trim(), id: formState.id || undefined, diff --git a/apps/web-antd/src/views/store/list/composables/useStoreListPage.ts b/apps/web-antd/src/views/store/list/composables/useStoreListPage.ts index 29290ec..5cc557b 100644 --- a/apps/web-antd/src/views/store/list/composables/useStoreListPage.ts +++ b/apps/web-antd/src/views/store/list/composables/useStoreListPage.ts @@ -143,10 +143,6 @@ export function useStoreListPage() { formState.name = value; } - function setFormCode(value: string) { - formState.code = value; - } - function setFormContactPhone(value: string) { formState.contactPhone = value; } @@ -159,6 +155,10 @@ export function useStoreListPage() { formState.address = value; } + function setFormCoverImage(value: string) { + formState.coverImage = value; + } + function setFormBusinessStatus(value: StoreBusinessStatus) { formState.businessStatus = value; } @@ -210,8 +210,8 @@ export function useStoreListPage() { setDrawerVisible, setFormAddress, setFormBusinessStatus, - setFormCode, setFormContactPhone, + setFormCoverImage, setFormManagerName, setFormName, setFormServiceTypes, diff --git a/apps/web-antd/src/views/store/list/index.vue b/apps/web-antd/src/views/store/list/index.vue index 566bf41..6109738 100644 --- a/apps/web-antd/src/views/store/list/index.vue +++ b/apps/web-antd/src/views/store/list/index.vue @@ -41,8 +41,8 @@ const { setDrawerVisible, setFormAddress, setFormBusinessStatus, - setFormCode, setFormContactPhone, + setFormCoverImage, setFormManagerName, setFormName, setFormServiceTypes, @@ -105,7 +105,7 @@ function handleExport() { :title="drawerTitle" :is-submitting="isSubmitting" :name="formState.name" - :code="formState.code" + :cover-image="formState.coverImage" :contact-phone="formState.contactPhone" :manager-name="formState.managerName" :address="formState.address" @@ -114,7 +114,7 @@ function handleExport() { :business-status-options="businessStatusOptions" :service-type-options="serviceTypeOptions" :on-set-name="setFormName" - :on-set-code="setFormCode" + :on-set-cover-image="setFormCoverImage" :on-set-contact-phone="setFormContactPhone" :on-set-manager-name="setFormManagerName" :on-set-address="setFormAddress" diff --git a/apps/web-antd/src/views/store/list/types.ts b/apps/web-antd/src/views/store/list/types.ts index 69ef862..66c651f 100644 --- a/apps/web-antd/src/views/store/list/types.ts +++ b/apps/web-antd/src/views/store/list/types.ts @@ -40,7 +40,6 @@ export interface StoreFilterState { export interface StoreFormState { address: string; businessStatus: StoreBusinessStatus; - code: string; contactPhone: string; coverImage: string; id: string;