From 48ec3e15ab18170fe2e9a21528d6a92ab429bee8 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Thu, 4 Sep 2025 18:36:05 +0800 Subject: [PATCH 01/69] =?UTF-8?q?refactor:=20=E5=B0=86=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E4=BB=8Estore=20=E7=A7=BB=E5=8A=A8=E5=88=B0@vben/stores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/router/guard.ts | 4 +- apps/web-antd/src/store/index.ts | 1 - apps/web-antd/src/utils/dict.ts | 5 +- apps/web-ele/src/router/guard.ts | 4 +- apps/web-ele/src/store/dict.ts | 74 ------------------- apps/web-ele/src/store/index.ts | 1 - apps/web-ele/src/utils/bean.ts | 1 + apps/web-ele/src/utils/dict.ts | 3 +- .../stores/src/modules}/dict.ts | 3 +- packages/stores/src/modules/index.ts | 1 + 10 files changed, 10 insertions(+), 87 deletions(-) delete mode 100644 apps/web-ele/src/store/dict.ts rename {apps/web-antd/src/store => packages/stores/src/modules}/dict.ts (95%) diff --git a/apps/web-antd/src/router/guard.ts b/apps/web-antd/src/router/guard.ts index f969c0ff..8b88c834 100644 --- a/apps/web-antd/src/router/guard.ts +++ b/apps/web-antd/src/router/guard.ts @@ -3,14 +3,14 @@ import type { Router } from 'vue-router'; import { LOGIN_PATH } from '@vben/constants'; import { $t } from '@vben/locales'; import { preferences } from '@vben/preferences'; -import { useAccessStore, useUserStore } from '@vben/stores'; +import { useAccessStore, useDictStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; import { message } from 'ant-design-vue'; import { getSimpleDictDataList } from '#/api/system/dict/data'; import { accessRoutes, coreRouteNames } from '#/router/routes'; -import { useAuthStore, useDictStore } from '#/store'; +import { useAuthStore } from '#/store'; import { generateAccess } from './access'; diff --git a/apps/web-antd/src/store/index.ts b/apps/web-antd/src/store/index.ts index b6a7763b..269586ee 100644 --- a/apps/web-antd/src/store/index.ts +++ b/apps/web-antd/src/store/index.ts @@ -1,2 +1 @@ export * from './auth'; -export * from './dict'; diff --git a/apps/web-antd/src/utils/dict.ts b/apps/web-antd/src/utils/dict.ts index 2329729b..41e9ad2e 100644 --- a/apps/web-antd/src/utils/dict.ts +++ b/apps/web-antd/src/utils/dict.ts @@ -1,12 +1,11 @@ // TODO @芋艿:后续再优化 // TODO @芋艿:可以共享么? -import type { DictItem } from '#/store'; +import type { DictItem } from '@vben/stores'; +import { useDictStore } from '@vben/stores'; import { isObject } from '@vben/utils'; -import { useDictStore } from '#/store'; - // TODO @dhb52:top-level 调用 导致:"getActivePinia()" was called but there was no active Pinia // 先临时移入到方法中 // const dictStore = useDictStore(); diff --git a/apps/web-ele/src/router/guard.ts b/apps/web-ele/src/router/guard.ts index 424fe77b..66beccbc 100644 --- a/apps/web-ele/src/router/guard.ts +++ b/apps/web-ele/src/router/guard.ts @@ -3,14 +3,14 @@ import type { Router } from 'vue-router'; import { LOGIN_PATH } from '@vben/constants'; import { $t } from '@vben/locales'; import { preferences } from '@vben/preferences'; -import { useAccessStore, useUserStore } from '@vben/stores'; +import { useAccessStore, useDictStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; import { ElMessage } from 'element-plus'; import { getSimpleDictDataList } from '#/api/system/dict/data'; import { accessRoutes, coreRouteNames } from '#/router/routes'; -import { useAuthStore, useDictStore } from '#/store'; +import { useAuthStore } from '#/store'; import { generateAccess } from './access'; diff --git a/apps/web-ele/src/store/dict.ts b/apps/web-ele/src/store/dict.ts deleted file mode 100644 index d2c6c73c..00000000 --- a/apps/web-ele/src/store/dict.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { acceptHMRUpdate, defineStore } from 'pinia'; - -export interface DictItem { - colorType?: string; - cssClass?: string; - label: string; - value: string; -} - -export type Dict = Record; - -interface DictState { - dictCache: Dict; -} - -// TODO @xingyu:@芋艿:可以共享么? -export const useDictStore = defineStore('dict', { - actions: { - getDictData(dictType: string, value: any) { - const dict = this.dictCache[dictType]; - if (!dict) { - return undefined; - } - return ( - dict.find((d) => d.value === value || d.value === value.toString()) ?? - undefined - ); - }, - getDictOptions(dictType: string) { - const dictOptions = this.dictCache[dictType]; - if (!dictOptions) { - return []; - } - return dictOptions; - }, - setDictCache(dicts: Dict) { - this.dictCache = dicts; - }, - setDictCacheByApi( - api: (params: Record) => Promise[]>, - params: Record = {}, - labelField: string = 'label', - valueField: string = 'value', - ) { - api(params).then((dicts) => { - const dictCacheData: Dict = {}; - dicts.forEach((dict) => { - dictCacheData[dict.dictType] = dicts - .filter((d) => d.dictType === dict.dictType) - .map((d) => ({ - colorType: d.colorType, - cssClass: d.cssClass, - label: d[labelField], - value: d[valueField], - })); - }); - this.setDictCache(dictCacheData); - }); - }, - }, - persist: { - // 持久化 - pick: ['dictCache'], - }, - state: (): DictState => ({ - dictCache: {}, - }), -}); - -// 解决热更新问题 -const hot = import.meta.hot; -if (hot) { - hot.accept(acceptHMRUpdate(useDictStore, hot)); -} diff --git a/apps/web-ele/src/store/index.ts b/apps/web-ele/src/store/index.ts index b6a7763b..269586ee 100644 --- a/apps/web-ele/src/store/index.ts +++ b/apps/web-ele/src/store/index.ts @@ -1,2 +1 @@ export * from './auth'; -export * from './dict'; diff --git a/apps/web-ele/src/utils/bean.ts b/apps/web-ele/src/utils/bean.ts index 9c29ded3..d6df19c8 100644 --- a/apps/web-ele/src/utils/bean.ts +++ b/apps/web-ele/src/utils/bean.ts @@ -10,6 +10,7 @@ export const copyValueToTarget = (target: any, source: any) => { Object.keys(newObj).forEach((key) => { // 如果不是target中的属性则删除 if (!Object.keys(target).includes(key)) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete newObj[key]; } }); diff --git a/apps/web-ele/src/utils/dict.ts b/apps/web-ele/src/utils/dict.ts index e800d06a..e469efd1 100644 --- a/apps/web-ele/src/utils/dict.ts +++ b/apps/web-ele/src/utils/dict.ts @@ -1,10 +1,9 @@ // TODO @芋艿:后续再优化 // TODO @芋艿:可以共享么? +import { useDictStore } from '@vben/stores'; import { isObject } from '@vben/utils'; -import { useDictStore } from '#/store'; - // TODO @dhb52:top-level 调用 导致:"getActivePinia()" was called but there was no active Pinia // 先临时移入到方法中 // const dictStore = useDictStore(); diff --git a/apps/web-antd/src/store/dict.ts b/packages/stores/src/modules/dict.ts similarity index 95% rename from apps/web-antd/src/store/dict.ts rename to packages/stores/src/modules/dict.ts index 37f636d2..6d80c4b4 100644 --- a/apps/web-antd/src/store/dict.ts +++ b/packages/stores/src/modules/dict.ts @@ -13,8 +13,7 @@ interface DictState { dictCache: Dict; } -// TODO @芋艿:可以共享么? -export const useDictStore = defineStore('dict', { +export const useDictStore = defineStore('core-dict', { actions: { getDictData(dictType: string, value: any) { const dict = this.dictCache[dictType]; diff --git a/packages/stores/src/modules/index.ts b/packages/stores/src/modules/index.ts index ec764ae8..e87dbb3e 100644 --- a/packages/stores/src/modules/index.ts +++ b/packages/stores/src/modules/index.ts @@ -1,3 +1,4 @@ export * from './access'; +export * from './dict'; export * from './tabbar'; export * from './user'; From b79bebab18b92b185d2f0e7e3fcc24ace3c82f7d Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Thu, 4 Sep 2025 20:42:56 +0800 Subject: [PATCH 02/69] =?UTF-8?q?refactor:=20dict=20=E6=8A=BD=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/components/dict-tag/dict-tag.vue | 3 +-- .../components/form-create/components/dict-select.vue | 4 ++-- .../src/components/operate-log/operate-log.vue | 4 ++-- .../components/nodes/modules/process-instance-data.ts | 2 +- .../components/nodes/modules/task-list-data.ts | 2 +- .../src/views/_core/profile/modules/base-info.vue | 3 ++- .../src/views/_core/profile/modules/user-social.vue | 4 ++-- apps/web-antd/src/views/ai/chat/manager/data.ts | 4 +++- apps/web-antd/src/views/ai/image/manager/data.ts | 5 ++++- apps/web-antd/src/views/ai/knowledge/document/data.ts | 2 +- .../web-antd/src/views/ai/knowledge/document/index.vue | 2 +- apps/web-antd/src/views/ai/knowledge/segment/data.ts | 4 +++- apps/web-antd/src/views/ai/model/apiKey/data.ts | 4 +++- apps/web-antd/src/views/ai/model/chatRole/data.ts | 4 ++-- apps/web-antd/src/views/ai/model/model/data.ts | 4 ++-- apps/web-antd/src/views/ai/model/tool/data.ts | 10 ++++------ apps/web-antd/src/views/ai/music/manager/data.ts | 5 ++++- apps/web-antd/src/views/ai/workflow/data.ts | 5 ++++- .../src/views/ai/workflow/form/modules/basic-info.vue | 5 +++-- .../src/views/ai/write/index/components/Left.vue | 5 ++--- apps/web-antd/src/views/ai/write/manager/data.ts | 5 ++++- apps/web-antd/src/views/bpm/category/data.ts | 10 ++++------ apps/web-antd/src/views/bpm/form/data.ts | 4 +++- apps/web-antd/src/views/bpm/group/data.ts | 10 ++++------ apps/web-antd/src/views/bpm/model/definition/data.ts | 2 +- .../src/views/bpm/model/form/modules/basic-info.vue | 3 ++- .../src/views/bpm/model/form/modules/form-design.vue | 9 +++++---- apps/web-antd/src/views/bpm/model/modules/data.ts | 2 +- apps/web-antd/src/views/bpm/oa/leave/data.ts | 4 +++- apps/web-antd/src/views/bpm/processExpression/data.ts | 10 ++++------ apps/web-antd/src/views/bpm/processInstance/data.ts | 5 ++++- .../src/views/bpm/processInstance/detail/index.vue | 3 ++- .../bpm/processInstance/detail/modules/task-list.vue | 3 ++- .../src/views/bpm/processInstance/manager/data.ts | 5 ++++- .../src/views/bpm/processInstance/report/data.ts | 5 ++++- apps/web-antd/src/views/bpm/processListener/data.ts | 4 +++- apps/web-antd/src/views/bpm/task/done/data.ts | 5 ++++- apps/web-antd/src/views/bpm/task/manager/data.ts | 4 +++- apps/web-antd/src/views/bpm/task/todo/data.ts | 5 ++++- apps/web-antd/src/views/crm/clue/data.ts | 4 +++- apps/web-antd/src/views/crm/contact/data.ts | 3 ++- apps/web-antd/src/views/crm/contract/data.ts | 2 +- .../src/views/crm/contract/modules/detail-data.ts | 2 +- apps/web-antd/src/views/crm/customer/data.ts | 4 +++- apps/web-antd/src/views/crm/customer/pool/data.ts | 3 ++- apps/web-antd/src/views/crm/followup/modules/form.vue | 3 ++- apps/web-antd/src/views/crm/permission/modules/data.ts | 4 +++- apps/web-antd/src/views/crm/product/data.ts | 3 ++- apps/web-antd/src/views/crm/receivable/data.ts | 3 ++- apps/web-antd/src/views/crm/receivable/plan/data.ts | 3 ++- .../src/views/crm/statistics/customer/chartOptions.ts | 3 ++- .../web-antd/src/views/crm/statistics/customer/data.ts | 4 +++- apps/web-antd/src/views/crm/statistics/funnel/data.ts | 4 +++- .../src/views/crm/statistics/portrait/chartOptions.ts | 3 ++- packages/effects/hooks/src/index.ts | 1 + 55 files changed, 142 insertions(+), 86 deletions(-) diff --git a/apps/web-antd/src/components/dict-tag/dict-tag.vue b/apps/web-antd/src/components/dict-tag/dict-tag.vue index c51b523c..635cb8ea 100644 --- a/apps/web-antd/src/components/dict-tag/dict-tag.vue +++ b/apps/web-antd/src/components/dict-tag/dict-tag.vue @@ -1,12 +1,11 @@ diff --git a/apps/web-antd/src/views/mall/product/spu/modules/form.vue b/apps/web-antd/src/views/mall/product/spu/modules/form.vue index e4fc6118..f89d618c 100644 --- a/apps/web-antd/src/views/mall/product/spu/modules/form.vue +++ b/apps/web-antd/src/views/mall/product/spu/modules/form.vue @@ -1,6 +1,6 @@ diff --git a/apps/web-antd/src/views/mall/trade/afterSale/index.vue b/apps/web-antd/src/views/mall/trade/afterSale/index.vue index a9ccaf58..c5c92af7 100644 --- a/apps/web-antd/src/views/mall/trade/afterSale/index.vue +++ b/apps/web-antd/src/views/mall/trade/afterSale/index.vue @@ -31,7 +31,6 @@ function openAfterSaleDetail(row: MallAfterSaleApi.AfterSale) { push({ name: 'TradeAfterSaleDetail', params: { id: row.id } }); } -// TODO @xingyu:缺详情页 /** 查看订单详情 */ function openOrderDetail(row: MallAfterSaleApi.AfterSale) { push({ name: 'TradeOrderDetail', params: { id: row.id } }); diff --git a/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue b/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue new file mode 100644 index 00000000..93326a3b --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/afterSale/modules/detail.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue index f6c14a52..c9dec9c6 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/order-list-modal.vue @@ -7,14 +7,12 @@ import type { MallBrokerageUserApi } from '#/api/mall/trade/brokerage/user'; import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; -import { BrokerageRecordBizTypeEnum } from '@vben/constants'; +import { BrokerageRecordBizTypeEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { fenToYuan } from '@vben/utils'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getBrokerageRecordPage } from '#/api/mall/trade/brokerage/record'; -import { DICT_TYPE } from '@vben/constants'; -import { getDictOptions } from '@vben/hooks'; - import { getRangePickerDefaultProps } from '#/utils'; /** 推广订单列表 */ @@ -52,16 +50,13 @@ function useFormSchema(): VbenFormSchema[] { { fieldName: 'sourceUserLevel', label: '用户类型', - component: 'RadioGroup', - // TODO @xingyu:这里会折行 + component: 'Select', componentProps: { options: [ { label: '全部', value: 0 }, { label: '一级推广人', value: 1 }, { label: '二级推广人', value: 2 }, ], - buttonStyle: 'solid', - optionType: 'button', }, defaultValue: 0, }, diff --git a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue index f855d51a..c353d177 100644 --- a/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue +++ b/apps/web-antd/src/views/mall/trade/brokerage/user/modules/user-list-modal.vue @@ -41,16 +41,13 @@ function useFormSchema(): VbenFormSchema[] { { fieldName: 'level', label: '用户类型', - component: 'RadioGroup', - // TODO @xingyu:这里会折行 + component: 'Select', componentProps: { options: [ { label: '全部', value: undefined }, { label: '一级推广人', value: '1' }, { label: '二级推广人', value: '2' }, ], - buttonStyle: 'solid', - optionType: 'button', }, }, { diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts index ee422abd..3f4b8601 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/data.ts @@ -58,18 +58,22 @@ export function useFormSchema(): VbenFormSchema[] { label: '详细地址', rules: 'required', }, - // TODO @xingyu:时间类型不对 { - component: 'TimePicker', - fieldName: 'openingTime', - label: '营业开始时间', - rules: 'required', - }, - { - component: 'TimePicker', - fieldName: 'closingTime', - label: '营业结束时间', + component: 'TimeRangePicker', + fieldName: 'rangeTime', + label: '营业时间', rules: 'required', + componentProps: { + format: 'HH:mm', + minuteStep: 15, + disabledTime: () => { + return { + disabledHours: () => { + return [0, 1, 2, 3, 4, 5, 6, 7]; + }, + }; + }, + }, }, { component: 'Input', diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue index bb227ddb..4b2a6e79 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/bind-form.vue @@ -18,7 +18,6 @@ import { useBindFormSchema } from '../data'; const emit = defineEmits(['success']); const formData = ref(); -// TODO @xingyu:店员是多选; const getTitle = computed(() => { return formData.value?.id ? $t('ui.actionTitle.edit', ['绑定店员']) diff --git a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue index 5f674ec6..99636a2f 100644 --- a/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue +++ b/apps/web-antd/src/views/mall/trade/delivery/pickUpStore/modules/form.vue @@ -6,6 +6,7 @@ import { computed, ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { message } from 'ant-design-vue'; +import dayjs from 'dayjs'; import { useVbenForm } from '#/adapter/form'; import { @@ -33,6 +34,7 @@ const [Form, formApi] = useVbenForm({ formItemClass: 'col-span-2', labelWidth: 120, }, + fieldMappingTime: [['rangeTime', ['openingTime', 'closingTime'], 'HH:mm']], layout: 'horizontal', schema: useFormSchema(), showDefaultActions: false, @@ -73,6 +75,10 @@ const [Modal, modalApi] = useVbenModal({ modalApi.lock(); try { formData.value = await getDeliveryPickUpStore(data.id); + formData.value.rangeTime = [ + dayjs(formData.value.openingTime, 'HH:mm'), + dayjs(formData.value.closingTime, 'HH:mm'), + ]; // 设置到 values await formApi.setValues(formData.value); } finally { diff --git a/apps/web-antd/src/views/mall/trade/order/index.vue b/apps/web-antd/src/views/mall/trade/order/index.vue index 20106e90..eefa6c0e 100644 --- a/apps/web-antd/src/views/mall/trade/order/index.vue +++ b/apps/web-antd/src/views/mall/trade/order/index.vue @@ -33,7 +33,6 @@ function onRefresh() { gridApi.query(); } const { push } = useRouter(); -// TODO xingyu:貌似详情,还点不进去哇? /** 详情 */ function handleDetail(row: MallOrderApi.Order) { push({ name: 'TradeOrderDetail', params: { id: row.id } }); diff --git a/apps/web-antd/src/views/mall/trade/order/modules/detail.vue b/apps/web-antd/src/views/mall/trade/order/modules/detail.vue new file mode 100644 index 00000000..93326a3b --- /dev/null +++ b/apps/web-antd/src/views/mall/trade/order/modules/detail.vue @@ -0,0 +1,6 @@ + + + diff --git a/apps/web-antd/src/views/member/user/data.ts b/apps/web-antd/src/views/member/user/data.ts index 30ce8a24..a245cd6b 100644 --- a/apps/web-antd/src/views/member/user/data.ts +++ b/apps/web-antd/src/views/member/user/data.ts @@ -263,7 +263,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { } /** 修改用户等级 */ -export function useLeavelFormSchema(): VbenFormSchema[] { +export function useLevelFormSchema(): VbenFormSchema[] { return [ { component: 'Input', diff --git a/apps/web-antd/src/views/member/user/index.vue b/apps/web-antd/src/views/member/user/index.vue index 0a592f4f..854160f2 100644 --- a/apps/web-antd/src/views/member/user/index.vue +++ b/apps/web-antd/src/views/member/user/index.vue @@ -14,7 +14,7 @@ import { $t } from '#/locales'; import { useGridColumns, useGridFormSchema } from './data'; import BalanceForm from './modules/balance-form.vue'; import Form from './modules/form.vue'; -import LeavelForm from './modules/leavel-form.vue'; +import LevelForm from './modules/level-form.vue'; import PointForm from './modules/point-form.vue'; const router = useRouter(); @@ -34,9 +34,8 @@ const [BalanceFormModal, balanceFormModalApi] = useVbenModal({ destroyOnClose: true, }); -// TODO @xingyu:拼写错误; -const [LeavelFormModal, leavelFormModalApi] = useVbenModal({ - connectedComponent: LeavelForm, +const [LevelFormModal, levelFormModalApi] = useVbenModal({ + connectedComponent: LevelForm, destroyOnClose: true, }); @@ -64,7 +63,7 @@ function handleEdit(row: MemberUserApi.User) { /** 修改会员等级 */ function handleUpdateLevel(row: MemberUserApi.User) { - leavelFormModalApi.setData(row).open(); + levelFormModalApi.setData(row).open(); } /** 修改会员积分 */ @@ -138,7 +137,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ - +