From 3ca8f39a18c5ab6e22e50ec202b20ef8ca420ac3 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Tue, 6 May 2025 10:20:11 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E5=A4=9A=E7=A7=9F=E6=88=B7=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=8B=E8=A1=A8=E5=8D=95=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E4=B8=AA=E6=80=A7=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/CreateCodeStep/index.ts | 1 + .../CreateCodeStep/src/EntireConfigStep.vue | 60 ++++ .../design/components/BasicConfigStep.vue | 20 +- .../components/components/CodeFirstModal.vue | 31 +- .../components/components/DataFirstModal.vue | 24 +- .../components/SimpleTemplateModal.vue | 23 +- src/views/form/design/index.vue | 300 ++++++++++++++---- 7 files changed, 380 insertions(+), 79 deletions(-) create mode 100644 src/components/CreateCodeStep/src/EntireConfigStep.vue diff --git a/src/components/CreateCodeStep/index.ts b/src/components/CreateCodeStep/index.ts index 4d6fe5c..dd0d606 100644 --- a/src/components/CreateCodeStep/index.ts +++ b/src/components/CreateCodeStep/index.ts @@ -1,5 +1,6 @@ export { default as MenuConfigStep } from './src/MenuConfigStep.vue'; export { default as StructureConfigStep } from './src/StructureConfigStep.vue'; +export { default as EntireConfigStep } from './src/EntireConfigStep.vue'; export { default as ViewDesignStep } from './src/ViewDesignStep.vue'; diff --git a/src/components/CreateCodeStep/src/EntireConfigStep.vue b/src/components/CreateCodeStep/src/EntireConfigStep.vue new file mode 100644 index 0000000..b6be60e --- /dev/null +++ b/src/components/CreateCodeStep/src/EntireConfigStep.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/views/form/design/components/BasicConfigStep.vue b/src/views/form/design/components/BasicConfigStep.vue index bda8771..1893dc5 100644 --- a/src/views/form/design/components/BasicConfigStep.vue +++ b/src/views/form/design/components/BasicConfigStep.vue @@ -342,6 +342,7 @@ const designType = inject('designType'); const isFieldUpper = inject>('isFieldUpper', ref(false)); let mainTableName = inject>('mainTableName', ref('')); + const formType = inject>('formType'); watch( () => generatorConfig?.databaseId, @@ -382,12 +383,29 @@ deep: true, }, ); + + const filterFormSchema=(formSchema:FormSchema[])=>{ + customFormConfig.formType=formType.value; + const rtSchema=[]; + for(let i=0;i +
{{ t('上一步') }} - + {{ t('下一步') }} - + {{ t('保存') }} {{ t('关闭') }} @@ -29,19 +30,21 @@ + +
diff --git a/src/hooks/web/useFormConfig.ts b/src/hooks/web/useFormConfig.ts new file mode 100644 index 0000000..ef97409 --- /dev/null +++ b/src/hooks/web/useFormConfig.ts @@ -0,0 +1,72 @@ + +import { FormSchema } from '/@/components/Form'; +import { BasicColumn } from "/@/components/Table"; +import { getFormTemplateUsingCache } from '/@/api/form/design'; +import { deepMerge } from '/@/utils'; + + + +export function useFormConfig() { + async function mergeFormSchemas(formSchema: FormSchema[],formId:String){ + const formProps=await queryConfig(formId,'formProps'); + let fschemas=formProps?.schemas; + if(fschemas&&fschemas.length>0){ + return deepMerge(formSchema,fschemas); + }else{ + return formSchema; + } + } + + async function mergeColumns(columns: BasicColumn[],formId:String){ + const cols=await queryConfig(formId,'columns'); + if(cols&&cols.length>0){ + const filteredCol = cols.filter(colItem => + columns.some(column => column.dataIndex === colItem.dataIndex) + ); + return filteredCol; + }else{ + return columns; + } + } + + async function mergeSearchFormSchema(searchFormSchema: FormSchema[],formId:String){ + const sFormSchema=await queryConfig(formId,'searchFormSchema'); + if(sFormSchema&&sFormSchema.length>0){ + const filteredsFormSchema = sFormSchema.filter(sItem => + searchFormSchema.some( searchItem => searchItem.field === sItem.field) + ); + return filteredsFormSchema; + }else{ + return searchFormSchema; + } + } + + + async function queryConfig(formId:String,configName:String){ + const formTemplate = await getFormTemplateUsingCache(formId); + const renderConfig=formTemplate.renderConfig; + const exportMatches = renderConfig.matchAll(/export\s+const\s+(\w+)\s*(?::\s*\w+(?:\[\])?)?\s*=\s*([\s\S]*?)(?=\n\s*export\s+const|\n\s*const|\n\s*export\s+function|\n\s*function|$)/g); + for (const match of exportMatches) { + const varName = match[1]; + const valueCode = match[2].trim(); + const cleanCode = valueCode.endsWith(';') ? valueCode.slice(0, -1) : valueCode; + if(varName==configName) { + try { + const value = new Function(`return ${cleanCode}`)(); + // console.log(value); + return value; + } catch (e) { + console.error(`Failed to parse ${varName}:`, e); + throw new Error('解析表单渲染覆盖配置出错,请联系管理员处理'); + } + } + } + return null; + } + + return { + mergeFormSchemas, + mergeColumns, + mergeSearchFormSchema + }; +} diff --git a/src/utils/helper/generatorHelper.ts b/src/utils/helper/generatorHelper.ts index f9f5d1c..093fd07 100644 --- a/src/utils/helper/generatorHelper.ts +++ b/src/utils/helper/generatorHelper.ts @@ -643,6 +643,7 @@ ${hasTemplatePrint ? ' reactive ' : ''} import { useMessage } from '/@/hooks/web/useMessage'; import { useI18n } from '/@/hooks/web/useI18n'; import { usePermission } from '/@/hooks/web/usePermission'; + import { useFormConfig } from '/@/hooks/web/useFormConfig'; import { useRouter } from 'vue-router'; import { get${pascalMainTableName} } from '/@/api/${ model.outputConfig.outputValue @@ -710,7 +711,7 @@ ${hasTemplatePrint ? ' reactive ' : ''} : '' } ${componentArray.includes('money-chinese') ? `import nzhcn from 'nzh/cn';` : ''} - import { searchFormSchema, columns } from './components/config'; + import {formConfig, searchFormSchema, columns } from './components/config'; ${ model.listConfig.buttonConfigs.filter((x) => x.isUse).length > 0 || model.listConfig.leftMenuConfig?.childIcon || @@ -746,15 +747,20 @@ ${hasTemplatePrint ? ' reactive ' : ''} } import useEventBus from '/@/hooks/event/useEventBus'; - + import { cloneDeep } from 'lodash-es'; + const { bus, CREATE_FLOW, FLOW_PROCESSED, FORM_LIST_MODIFIED } = useEventBus(); const { notification } = useMessage(); const { t } = useI18n(); defineEmits(['register']); const { filterColumnAuth, filterButtonAuth } = usePermission(); + const { mergeColumns,mergeSearchFormSchema } = useFormConfig(); - const filterColumns = filterColumnAuth(columns); + const filterColumns = cloneDeep(filterColumnAuth(columns)); + const customConfigColums =ref(filterColumns); + const customSearchFormSchema =ref(searchFormSchema); + const tableRef = ref(); ${ hasFilterButton @@ -868,12 +874,12 @@ ${hasTemplatePrint ? ' reactive ' : ''} title: '${model.listConfig?.listTitle||''}' || (formName + '列表'), api: get${pascalMainTableName}Page, rowKey: '${camelCaseString(mainTable.pkField)}', - columns: filterColumns, + columns: customConfigColums, formConfig: { rowProps: { gutter: 16, }, - schemas: searchFormSchema, + schemas: customSearchFormSchema, fieldMapToTime: [${ model.listConfig.queryConfigs .filter((item) => { @@ -961,7 +967,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/flow/' + schemaId + '/' + (processId || '') + '/approveFlow', query: { taskId: taskIds[0], - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } else if (schemaId && !taskIds && processId) { @@ -970,7 +977,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} query: { readonly: 1, taskId: '', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } else { @@ -978,7 +986,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/' + record.id + '/viewForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } @@ -1007,7 +1016,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/0/createForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } @@ -1025,7 +1035,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/' + record.id + '/updateForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } });` : ` @@ -1440,6 +1451,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} } else { bus.on(FORM_LIST_MODIFIED, handleRefresh); } + setCustomConfigColumns(); + setCustomSearchFormSchema(); }); onUnmounted(() => { if (schemaIdComputedRef.value) { @@ -1587,6 +1600,20 @@ ${hasTemplatePrint ? ' reactive ' : ''} ` : '' } + + async function setCustomConfigColumns(){ + if (formConfig.useCustomConfig) { + const cols= await mergeColumns(customConfigColums.value,currentRoute.value.meta.formId); + customConfigColums.value=cols; + } + }; + + async function setCustomSearchFormSchema(){ + if (formConfig.useCustomConfig) { + const cols= await mergeSearchFormSchema(customSearchFormSchema.value,currentRoute.value.meta.formId); + customSearchFormSchema.value=cols; + } + }; `; - return code; + return code.replace(/(\n\s*\n\s*\n)+/g, '\n'); } /** * 构建SimpleForm页面 @@ -1640,8 +1667,8 @@ export function buildSimpleFormCode(model: GeneratorConfig, _tableInfo: TableInf /> From 6ab4743b7ba4ab955ae1fbfc644fa5e2379df5cd Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Thu, 22 May 2025 19:42:09 +0800 Subject: [PATCH 08/14] =?UTF-8?q?1.=E9=A1=B5=E9=9D=A2=E5=A4=B4=E9=83=A8?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=A0=8F=E5=88=87=E6=8D=A2=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=EF=BC=9A=E6=B2=A1=E6=9C=89=E9=87=8D=E6=96=B0=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E9=97=AE=E9=A2=98=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?=202.=E5=BE=85=E5=8A=9E=E9=A1=B5=E9=9D=A2=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=EF=BC=9A=E5=88=87=E6=8D=A2=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=8F=AA=E4=BF=9D=E7=95=99=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Application/src/UserTenantChange.vue | 3 ++- .../workflow/task/components/processTasks/ToDoTasksV2.vue | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/Application/src/UserTenantChange.vue b/src/components/Application/src/UserTenantChange.vue index 057c45f..d61a481 100644 --- a/src/components/Application/src/UserTenantChange.vue +++ b/src/components/Application/src/UserTenantChange.vue @@ -75,7 +75,8 @@ } async function toggleLocale(lang: string) { appStore.setPageLoadingAction(true); - let res = await changeTenant(lang); + let res = await changeTenant(lang); + permissionStore.setDynamicAddedRoute(false); await userStore.afterLoginAction(true); closeAll(); await setupRouterGuard(router); diff --git a/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue b/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue index f54ab21..baf259c 100644 --- a/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue +++ b/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue @@ -51,7 +51,7 @@ const appStore = useAppStore(); const userStore = useUserStore(); const { userInfo } = storeToRefs(userStore); - const { closeAll } = useTabs(router); + const { closeOther } = useTabs(router); const permissionStore = usePermissionStore(); const { getShowTopMenu } = useMenuSetting(); const { getIsMobile } = useAppInject(); @@ -209,8 +209,9 @@ async function toggleLocale(tenantCode: string) { appStore.setPageLoadingAction(true); await changeTenant(tenantCode); - await userStore.afterLoginAction(true); - closeAll(); + permissionStore.setDynamicAddedRoute(false); + await userStore.afterLoginAction(false); + closeOther(); await setupRouterGuard(router); await permissionStore.changeSubsystem(getShowTopMenu.value, getIsMobile.value); if(permissionStore.getSubSysList.length>0){ From 13ab86a81444f897a3606a87ca8e6af8ec58cf16 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Tue, 27 May 2025 18:16:44 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E4=B8=AA=E6=80=A7=E5=8C=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=9A1.=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E8=B7=9F=E4=B8=AA=E6=80=A7=E5=8C=96=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=202.=E8=BF=9B=E5=85=A5?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E8=AF=A6=E6=83=85=E9=A1=B5=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E6=88=90=E9=80=9A=E8=BF=87=E8=8F=9C=E5=8D=95=E7=9A=84?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E8=B7=AF=E5=BE=84=E8=8E=B7=E5=8F=96formId?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/menu/index.ts | 19 ++++++++ src/hooks/web/useFormConfig.ts | 59 ++++++++++++++-------- src/utils/helper/generatorHelper.ts | 76 +++++++++++++++-------------- 3 files changed, 99 insertions(+), 55 deletions(-) diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts index 7e620e6..1dd879a 100644 --- a/src/api/system/menu/index.ts +++ b/src/api/system/menu/index.ts @@ -11,6 +11,7 @@ enum Api { SimpleTree = '/system/menu/simple-tree', TenantSimpleTree = '/system/menu/tenant-auth-tree', Menu = '/system/menu', + MenuInfoByComponentPath = '/system/menu/info-by-component-path', Button = '/system/menu/button', Column = '/system/menu-colum/list', Form = '/system/menu-form/list', @@ -197,3 +198,21 @@ export async function getMenuFormById(params, mode: ErrorMessageMode = 'modal') }, ); } + +/** + * @description: 根据组件路径查询菜单 + */ +export async function getMenuByIdComponentPath(componentPath:String, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.MenuInfoByComponentPath, + params:{componentPath} + }, + { + errorMessageMode: mode, + }, + ); +} + + + diff --git a/src/hooks/web/useFormConfig.ts b/src/hooks/web/useFormConfig.ts index be1f517..d93b729 100644 --- a/src/hooks/web/useFormConfig.ts +++ b/src/hooks/web/useFormConfig.ts @@ -2,6 +2,7 @@ import { FormSchema } from '/@/components/Form'; import { BasicColumn } from "/@/components/Table"; import { getFormTemplateUsingCache } from '/@/api/form/design'; +import { getMenuByIdComponentPath } from '/@/api/system/menu'; import { deepMerge } from '/@/utils'; import { useI18n } from '/@/hooks/web/useI18n'; import { useMessage } from '/@/hooks/web/useMessage'; @@ -10,9 +11,9 @@ const { t } = useI18n(); const { notification } = useMessage(); export function useFormConfig() { - async function mergeFormSchemas(formSchema: FormSchema[],formId:String){ + async function mergeFormSchemas(formSchema: FormSchema[],formPath:String){ try{ - const formProps=await queryConfig(formId,'formProps'); + const formProps=await queryConfigByFormPath(formPath,'formProps'); let fschemas=formProps?.schemas; if(fschemas&&fschemas.length>0){ return deepMerge(formSchema,fschemas); @@ -20,14 +21,20 @@ export function useFormConfig() { return formSchema; } }catch(e){ - notification.error({ - message: t('提示'), - description: '解析表单渲染覆盖配置出错[解析formProps发生异常]', - }); return []; } } + async function mergeFormEventConfigs(formEventConfigs,componentPath:String){ + try{ + const fEConfigs=await queryConfigByFormPath(componentPath,'formEventConfigs'); + return deepMerge(formEventConfigs,fEConfigs); + }catch(e){ + return {}; + } + } + + async function mergeColumns(columns: BasicColumn[],formId:String){ try{ const cols=await queryConfig(formId,'columns'); @@ -40,10 +47,6 @@ export function useFormConfig() { return columns; } }catch(e){ - notification.error({ - message: t('提示'), - description: '解析表单渲染覆盖配置出错[解析columns发生异常]', - }); return []; } } @@ -60,10 +63,6 @@ export function useFormConfig() { return searchFormSchema; } }catch(e){ - notification.error({ - message: t('提示'), - description: '解析表单渲染覆盖配置出错[解析searchFormSchema发生异常]', - }); return []; } } @@ -77,14 +76,31 @@ export function useFormConfig() { return buttons; } }catch(e){ - notification.error({ - message: t('提示'), - description: '解析表单渲染覆盖配置出错[解析buttons发生异常]', - }); return[]; } } + async function queryConfigByFormPath(componentPath:String,configName:String){ + if(componentPath==null){ + notification.error({ + message: t('提示'), + description: `发生异常,组件路径不能为空!`, + }); + throw new Error('发生异常,组件路径不能为空!'); + } + const menu=await getMenuByIdComponentPath("/"+componentPath+"/index"); + if(menu==null){ + notification.error({ + message: t('提示'), + description: `发生异常,根据组件路径找不到菜单!`, + }); + throw new Error('发生异常,根据组件路径找不到菜单!'); + } + const formId=menu.formId; + + return await queryConfig(formId,configName); + + } async function queryConfig(formId:String,configName:String){ const formTemplate = await getFormTemplateUsingCache(formId); @@ -100,6 +116,10 @@ export function useFormConfig() { return value; } catch (e) { console.error(`Failed to parse ${varName}:`, e); + notification.error({ + message: t('提示'), + description: `解析表单渲染覆盖配置出错[解析${configName}发生异常]`, + }); throw new Error('解析表单渲染覆盖配置出错,请联系管理员处理'); } } @@ -111,6 +131,7 @@ export function useFormConfig() { mergeFormSchemas, mergeColumns, mergeSearchFormSchema, - mergeButtons + mergeButtons, + mergeFormEventConfigs }; } diff --git a/src/utils/helper/generatorHelper.ts b/src/utils/helper/generatorHelper.ts index 382dbbd..d06e09b 100644 --- a/src/utils/helper/generatorHelper.ts +++ b/src/utils/helper/generatorHelper.ts @@ -1453,9 +1453,9 @@ ${hasTemplatePrint ? ' reactive ' : ''} } else { bus.on(FORM_LIST_MODIFIED, handleRefresh); } - setCustomConfigColumns(); - setCustomSearchFormSchema(); - setCustomButtons(); + + // 合并渲染覆盖配置中的列表配置,包括展示字段配置、搜索字段配置、按钮配置 + mergeCustomListRenderConfig(); }); onUnmounted(() => { if (schemaIdComputedRef.value) { @@ -1604,26 +1604,20 @@ ${hasTemplatePrint ? ' reactive ' : ''} : '' } - async function setCustomConfigColumns(){ + async function mergeCustomListRenderConfig(){ if (formConfig.useCustomConfig) { - const cols= await mergeColumns(customConfigColums.value,currentRoute.value.meta.formId); - customConfigColums.value=cols; + let formId=currentRoute.value.meta.formId; + //1.合并展示字段配置 + let cols= await mergeColumns(customConfigColums.value,formId); + customConfigColums.value=cols; + //2.合并搜索字段配置 + let sFormSchema= await mergeSearchFormSchema(customSearchFormSchema.value,formId); + customSearchFormSchema.value=sFormSchema; + //3.合并按钮配置 + let btns= await mergeButtons(buttons.value,formId); + buttons.value=btns; } }; - - async function setCustomSearchFormSchema(){ - if (formConfig.useCustomConfig) { - const cols= await mergeSearchFormSchema(customSearchFormSchema.value,currentRoute.value.meta.formId); - customSearchFormSchema.value=cols; - } - }; - - async function setCustomButtons(){ - if (formConfig.useCustomConfig) { - const btns= await mergeButtons(buttons.value,currentRoute.value.meta.formId); - buttons.value=btns; - } - }; diff --git a/src/views/system/dataMigration/components/import/ImportSystemConfig.vue b/src/views/system/dataMigration/components/import/ImportSystemConfig.vue new file mode 100644 index 0000000..078a063 --- /dev/null +++ b/src/views/system/dataMigration/components/import/ImportSystemConfig.vue @@ -0,0 +1,157 @@ + + + + diff --git a/src/views/system/dataMigration/components/import/index.vue b/src/views/system/dataMigration/components/import/index.vue new file mode 100644 index 0000000..7cd2484 --- /dev/null +++ b/src/views/system/dataMigration/components/import/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/views/system/dataMigration/index.vue b/src/views/system/dataMigration/index.vue new file mode 100644 index 0000000..96a1e5d --- /dev/null +++ b/src/views/system/dataMigration/index.vue @@ -0,0 +1,91 @@ + + + + From d75c0042edd9d28243a93b13ac05c4d4624a2fe0 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Tue, 10 Jun 2025 12:16:25 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E3=80=81=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=BC=80=E5=8F=91=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E2=80=9C=E7=A7=9F=E6=88=B7=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/dataMigration/index.ts | 42 +++++- .../dataMigration/components/export/index.vue | 22 +-- .../components/import/ImportSystemConfig.vue | 61 +++++--- .../dataMigration/components/import/index.vue | 139 ++++++++++++++++-- 4 files changed, 223 insertions(+), 41 deletions(-) diff --git a/src/api/system/dataMigration/index.ts b/src/api/system/dataMigration/index.ts index b6b67d4..af38afb 100644 --- a/src/api/system/dataMigration/index.ts +++ b/src/api/system/dataMigration/index.ts @@ -4,6 +4,8 @@ import { ErrorMessageMode } from '/#/axios'; enum Api { ExportDatas= '/system/dataMigration/exportDatas', DownloadDatas='/system/dataMigration/downloadDatas', + LogList='/system/dataMigration/logList', + LogDetails='/system/dataMigration/logDetails', } /** @@ -25,10 +27,7 @@ export async function exportDatas(params, mode: ErrorMessageMode = 'modal') { /** * @description: 根据uuid(目录名称)下载数据 */ -export async function downloadDatas( - params?: object, - mode: ErrorMessageMode = 'modal' -) { +export async function downloadDatas(params?: object, mode: ErrorMessageMode = 'modal') { return defHttp.download( { url: Api.DownloadDatas+"/"+params.uuid, @@ -42,4 +41,39 @@ export async function downloadDatas( } +/** + * @description: 获取日志列表 + */ +export async function getLogList(mode: ErrorMessageMode = 'modal') { + return defHttp.get<[]>( + { + url: Api.LogList + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 获取日志详情 + */ +export async function getLogDetails(fileName:String,mode: ErrorMessageMode = 'modal') { + return defHttp.get<[]>( + { + url: Api.LogDetails, + params:{ + fileName + } + }, + { + errorMessageMode: mode, + }, + ); +} + + + + + diff --git a/src/views/system/dataMigration/components/export/index.vue b/src/views/system/dataMigration/components/export/index.vue index e2d8c77..6933cd1 100644 --- a/src/views/system/dataMigration/components/export/index.vue +++ b/src/views/system/dataMigration/components/export/index.vue @@ -234,16 +234,18 @@ display:block; margin-left:20px; margin-bottom:20px; - color: rgba(0,0,255,0.8); - text-decoration:underline rgba(#0000ff,0.8); - font-weight: 500; - font-size: 16px; - cursor: pointer; - &:hover{ - color: rgba(0,0,255,1); - text-decoration:underline #0000ff; - - } + span{ + color: rgba(0,0,255,0.8); + text-decoration:underline rgba(#0000ff,0.8); + font-weight: 500; + font-size: 16px; + cursor: pointer; + &:hover{ + color: rgba(0,0,255,1); + text-decoration:underline #0000ff; + + } + } } .list-wrapper{ diff --git a/src/views/system/dataMigration/components/import/ImportSystemConfig.vue b/src/views/system/dataMigration/components/import/ImportSystemConfig.vue index 078a063..6509b0a 100644 --- a/src/views/system/dataMigration/components/import/ImportSystemConfig.vue +++ b/src/views/system/dataMigration/components/import/ImportSystemConfig.vue @@ -3,21 +3,31 @@ +
+
+ + + +
+
+
@@ -25,12 +35,14 @@
{{ t('将文件拖到此处,或') }}{{ t('点击上传') }}
+
From 3add60c772a5cc5f02fd26cca432e4b2d1bff60d Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Wed, 11 Jun 2025 10:46:48 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E3=80=81=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=BC=80=E5=8F=91=EF=BC=9A=E5=AF=BC=E5=85=A5=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9=E5=AF=BC=E5=85=A5=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E3=80=81=E7=A7=9F=E6=88=B7=E7=BC=96=E7=A0=81=E7=9A=84=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataMigration/components/import/index.vue | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/views/system/dataMigration/components/import/index.vue b/src/views/system/dataMigration/components/import/index.vue index 628d20a..7e97e96 100644 --- a/src/views/system/dataMigration/components/import/index.vue +++ b/src/views/system/dataMigration/components/import/index.vue @@ -14,15 +14,21 @@ v-model:visible="logsDialog.visible" :title="t('导入日志')" :maskClosable="false" - :width="700" + :width="800" :footer="null" >
@@ -133,9 +139,17 @@ padding:30px 30px; .log{ padding:5px 0px; - .log-time{ - color:rgba(22, 119, 224, 1); - margin-right:30px; + .col-item{ + margin-right:10px; + .content{ + color:rgba(22, 119, 224, 1); + } + .view-log-detail{ + &:hover{ + text-decoration:underline; + cursor:pointer; + } + } } .success{ color:green; @@ -143,16 +157,8 @@ .fail{ color:red; } - .view-log-detail{ - margin-left:30px; - color:rgba(22, 119, 224, 1); - &:hover{ - text-decoration:underline; - cursor:pointer; - } - } + } - } .log-details{ From 202022a3a56645427cbd1547f8e8fa74f3caab01 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Fri, 13 Jun 2025 15:12:51 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=81=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=EF=BC=9A=201.?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=B6=E6=98=AF=E5=90=A6=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=A0=81=E9=BB=98=E8=AE=A4=E6=98=AF=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E8=BE=93=E5=85=A5=E3=80=82=202.=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=9A=84=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=8A=BD=E5=8F=96=E6=88=90=E7=8B=AC=E7=AB=8B=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E3=80=82=203.=E8=A1=A8=E5=8D=95=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=95=B4=E5=90=88=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E5=B0=86=E4=B8=A4=E4=B8=AAtabpane=E6=8A=BD?= =?UTF-8?q?=E5=87=BA=E6=9D=A5=E6=88=90=E7=8B=AC=E7=AB=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E3=80=82=204.=E4=BF=AE=E6=AD=A3bug-=E8=A1=A8=E5=8D=95=E7=9A=84?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=85=8D=E7=BD=AE=E4=B8=BA=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E9=A1=B5=E9=9D=A2=E6=8A=A5=E9=94=99=EF=BC=8C?= =?UTF-8?q?=E7=8E=B0=E6=94=B9=E6=88=90=E4=B8=BA=E7=A9=BA=E6=97=B6=E8=B5=8B?= =?UTF-8?q?=E5=80=BC{}=E3=80=82=205.=E7=B3=BB=E7=BB=9F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=A4=8D=E5=88=B6=E5=8A=9F=E8=83=BD=EF=BC=9A?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=80=E4=BA=9B=E6=97=A0=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=9B=E6=94=B9=E6=88=90=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=97=B6=E6=89=8D=E5=85=81=E8=AE=B8=E4=BB=A5=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=BC=8F=E5=AF=BC=E5=85=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.development.example | 6 + .env.production | 2 +- .env.production.example | 6 + .../Application/src/UserTenantChange.vue | 35 +- .../CreateCodeStep/src/EntireConfigStep.vue | 43 +- src/utils/tenantManager.ts | 50 ++ .../design/components/BasicConfigStep.vue | 1 - .../components/components/CodeFirstModal.vue | 3 +- .../components/components/DataFirstModal.vue | 3 +- .../components/SimpleTemplateModal.vue | 3 +- src/views/form/design/index.vue | 518 ++---------------- .../design/tabpanes/GeneratorTypeTabPane.vue | 255 +++++++++ .../design/tabpanes/ZeroCodeTypeTabPane.vue | 356 ++++++++++++ src/views/secondDev/LoginForm.vue | 2 +- .../dataMigration/components/export/index.vue | 36 +- .../dataMigration/components/import/index.vue | 3 +- .../components/processTasks/ToDoTasksV2.vue | 34 +- 18 files changed, 742 insertions(+), 616 deletions(-) create mode 100644 src/utils/tenantManager.ts create mode 100644 src/views/form/design/tabpanes/GeneratorTypeTabPane.vue create mode 100644 src/views/form/design/tabpanes/ZeroCodeTypeTabPane.vue diff --git a/.env.development b/.env.development index 1f34454..e118379 100644 --- a/.env.development +++ b/.env.development @@ -41,7 +41,7 @@ VITE_GLOB_API_URL_PREFIX = #租户开关 # VITE_GLOB_TENANT_ENABLED = true -#是否需要输入租户 +#登录时是否需要输入租户码 # VITE_GLOB_TENANT_INPUT_REQUIRED = true # 屏蔽通知消息的轮询 diff --git a/.env.development.example b/.env.development.example index 40cc05c..5f1c007 100644 --- a/.env.development.example +++ b/.env.development.example @@ -36,3 +36,9 @@ VITE_GLOB_API_URL_PREFIX = # 屏蔽通知消息的轮询 VITE_GLOB_DISABLE_NEWS = true + +#租户开关 +# VITE_GLOB_TENANT_ENABLED = true +#登录时是否需要输入租户码 +# VITE_GLOB_TENANT_INPUT_REQUIRED = true + diff --git a/.env.production b/.env.production index f2a7f1f..5b4625c 100644 --- a/.env.production +++ b/.env.production @@ -38,7 +38,7 @@ VITE_GLOB_API_URL_PREFIX = VITE_USE_PWA = false #租户开关 VITE_GLOB_TENANT_ENABLED = true -#是否需要输入租户 +#登录时是否需要输入租户码 # VITE_GLOB_TENANT_INPUT_REQUIRED = true # 屏蔽通知消息的轮询 diff --git a/.env.production.example b/.env.production.example index 9f5ddda..3a6f021 100644 --- a/.env.production.example +++ b/.env.production.example @@ -36,3 +36,9 @@ VITE_GLOB_API_URL_PREFIX = # 打包是否开启pwa功能 VITE_USE_PWA = false + +#租户开关 +# VITE_GLOB_TENANT_ENABLED = true +#登录时是否需要输入租户码 +# VITE_GLOB_TENANT_INPUT_REQUIRED = true + diff --git a/src/components/Application/src/UserTenantChange.vue b/src/components/Application/src/UserTenantChange.vue index d61a481..c6f9748 100644 --- a/src/components/Application/src/UserTenantChange.vue +++ b/src/components/Application/src/UserTenantChange.vue @@ -27,31 +27,20 @@ import { storeToRefs } from 'pinia'; import { Tooltip } from 'ant-design-vue'; import { useUserStore } from '/@/store/modules/user'; - import { changeTenant } from '/@/api/system/tenant'; import { useI18n } from '/@/hooks/web/useI18n'; import {useMessage} from "/@/hooks/web/useMessage"; - import {useTabs} from "/@/hooks/web/useTabs"; - import {router} from "/@/router"; - import {setupRouterGuard} from "/@/router/guard"; - import {usePermissionStore} from "/@/store/modules/permission"; - import {useMenuSetting} from "/@/hooks/setting/useMenuSetting"; - import {useAppInject} from "/@/hooks/web/useAppInject"; - import {useAppStore} from "/@/store/modules/app"; + import {useTenantManager} from "/@/utils/tenantManager"; const userStore = useUserStore(); const { t } = useI18n(); const { userInfo } = storeToRefs(userStore); - const { closeAll } = useTabs(router); - const permissionStore = usePermissionStore(); - const { getShowTopMenu } = useMenuSetting(); - const { getIsMobile } = useAppInject(); - const appStore = useAppStore(); const formInfo: any = ref({ tenants: [], tenantId: '', tenantCode: '', tenantName: '', }); + const {toggleLocal}=useTenantManager(); getDropMenuList(); watch( () => userInfo.value, @@ -73,21 +62,9 @@ }); } } - async function toggleLocale(lang: string) { - appStore.setPageLoadingAction(true); - let res = await changeTenant(lang); - permissionStore.setDynamicAddedRoute(false); - await userStore.afterLoginAction(true); - closeAll(); - await setupRouterGuard(router); - await permissionStore.changeSubsystem(getShowTopMenu.value, getIsMobile.value); - if(permissionStore.getSubSysList.length>0){ - permissionStore.setSubSystem(permissionStore.getSubSysList[0].id); - }else{ - permissionStore.setSubSystem(""); - } - //appStore.setPageLoadingAction(false); - //location.reload(); + + async function switchTenant(tenantCode: string) { + await toggleLocal({tenantCode:tenantCode, goHome:true,tabCloseAction:"closeAll"}); } function handleMenuEvent(menu: DropMenu) { @@ -100,7 +77,7 @@ title: () => h('span', t('温馨提醒')), content: () => h('span', t('是否确认切换租户?未保存的数据可能会丢失!')), onOk: async () => { - toggleLocale(menu.event as string); + switchTenant(menu.event as string); }, okText: () => t('确认'), cancelText: () => t('取消'), diff --git a/src/components/CreateCodeStep/src/EntireConfigStep.vue b/src/components/CreateCodeStep/src/EntireConfigStep.vue index c7febf7..08a001c 100644 --- a/src/components/CreateCodeStep/src/EntireConfigStep.vue +++ b/src/components/CreateCodeStep/src/EntireConfigStep.vue @@ -20,6 +20,7 @@ import { debounce} from 'lodash-es'; import {CustomFormConfig, GeneratorConfig} from '/@/model/generator/generatorConfig'; import { CodeEditor,MODE } from '/@/components/CodeEditor'; + import {ListConfig} from "/@/model/generator/listConfig"; const { t } = useI18n(); const { notification } = useMessage(); @@ -35,7 +36,6 @@ }); - const handleListConfigChange=debounce((v)=>{ try{ let jsonObject = JSON.parse(v); @@ -43,6 +43,7 @@ generatorConfig.listConfig.columnConfigs= jsonObject.columnConfigs; generatorConfig.listConfig.buttonConfigs= jsonObject.buttonConfigs; }catch(e){ + console.log(e); notification.error({ message: t('提示'), description: t('列表配置json格式有误'), @@ -54,6 +55,7 @@ try{ generatorConfig.formJson= JSON.parse(v); }catch(e){ + console.error(e); notification.error({ message: t('提示'), description: t('表单配置json格式有误'), @@ -62,33 +64,18 @@ },1000); const handleRenderConfigChange=debounce((v)=>{ - /* try{ - let jsonObject = JSON.parse(v); - generatorConfig.renderConfig.formProps= jsonObject.formProps; - }catch(e){ - notification.error({ - message: t('提示'), - description: t('渲染覆盖配置json格式有误'), - }); - }*/ customFormConfig.renderConfig=v; },1000); const initStep =()=> { listConfigObject.value=JSON.stringify({ - queryConfigs:generatorConfig.listConfig.queryConfigs, - columnConfigs:generatorConfig.listConfig.columnConfigs, - buttonConfigs:generatorConfig.listConfig.buttonConfigs + queryConfigs:generatorConfig.listConfig.queryConfigs||[], + columnConfigs:generatorConfig.listConfig.columnConfigs||[], + buttonConfigs:generatorConfig.listConfig.buttonConfigs||[] }, null, 2); formConfigObject.value=JSON.stringify(generatorConfig.formJson, null, 2); - - /* renderConfigObject.value=JSON.stringify({ - searchFormSchema:generatorConfig.renderConfig.searchFormSchema||{}, - columns:generatorConfig.renderConfig.columns||{}, - formProps:generatorConfig.renderConfig.formProps||{} - }, null, 2);*/ - renderConfigObject.value= customFormConfig.renderConfig||''; + renderConfigObject.value= customFormConfig.renderConfig||''; } const validateStep = async (): Promise => { @@ -98,15 +85,17 @@ generatorConfig.listConfig.columnConfigs= jsonObject.columnConfigs; generatorConfig.listConfig.buttonConfigs= jsonObject.buttonConfigs; }catch(e){ + console.error(e); notification.error({ message: t('提示'), - description: t('表单配置json格式有误'), + description: t('列表配置json格式有误'), }); return false; } try{ generatorConfig.formJson= JSON.parse(formConfigObject.value); }catch(e){ + console.error(e); notification.error({ message: t('提示'), description: t('表单配置json格式有误'), @@ -114,18 +103,6 @@ return false; } - /* try{ - let jsonObject = JSON.parse(renderConfigObject.value); - generatorConfig.renderConfig.formProps=jsonObject.formProps ; - }catch(e){ - console.log(e); - notification.error({ - message: t('提示'), - description: t('渲染覆盖配置json格式有误'), - }); - return false; - }*/ - customFormConfig.renderConfig=renderConfigObject.value; return true; diff --git a/src/utils/tenantManager.ts b/src/utils/tenantManager.ts new file mode 100644 index 0000000..41ac524 --- /dev/null +++ b/src/utils/tenantManager.ts @@ -0,0 +1,50 @@ +import { useUserStore } from '/@/store/modules/user'; +import {useAppStore} from "/@/store/modules/app"; +import {usePermissionStore} from "/@/store/modules/permission"; +import {setupRouterGuard} from "/@/router/guard"; +import { changeTenant } from '/@/api/system/tenant'; +import {useMenuSetting} from "/@/hooks/setting/useMenuSetting"; +import {useAppInject} from "/@/hooks/web/useAppInject"; +import {useTabs} from "/@/hooks/web/useTabs"; +import { useRouter } from 'vue-router'; + + +export interface SwitchTenantPatams { + tenantCode: string; + goHome: boolean; + tabCloseAction:String; +} + + + export function useTenantManager() { + const { getShowTopMenu } = useMenuSetting(); + const router = useRouter(); + const {closeAll, closeOther} = useTabs(router); + const userStore = useUserStore(); + const appStore = useAppStore(); + const permissionStore = usePermissionStore(); + const { getIsMobile } = useAppInject(); + + const toggleLocal= async (param:SwitchTenantPatams)=>{ + appStore.setPageLoadingAction(true); + await changeTenant(param.tenantCode); + permissionStore.setDynamicAddedRoute(false); + await userStore.afterLoginAction(param.goHome); + let tabCloseAction = param.tabCloseAction; + + if (tabCloseAction == 'closeAll') { + closeAll(); + } else if (tabCloseAction == 'closeOther') { + closeOther(); + } + await setupRouterGuard(router); + await permissionStore.changeSubsystem(getShowTopMenu.value, getIsMobile.value); + if (permissionStore.getSubSysList.length > 0) { + permissionStore.setSubSystem(permissionStore.getSubSysList[0].id); + } else { + permissionStore.setSubSystem(""); + } + } + return {toggleLocal } +} + diff --git a/src/views/form/design/components/BasicConfigStep.vue b/src/views/form/design/components/BasicConfigStep.vue index 1893dc5..687a73e 100644 --- a/src/views/form/design/components/BasicConfigStep.vue +++ b/src/views/form/design/components/BasicConfigStep.vue @@ -397,7 +397,6 @@ rtSchema.push(item); } } - // alert("xx"+customFormConfig.formType); return rtSchema; }; diff --git a/src/views/form/design/components/components/CodeFirstModal.vue b/src/views/form/design/components/components/CodeFirstModal.vue index 2c51ab2..be94543 100644 --- a/src/views/form/design/components/components/CodeFirstModal.vue +++ b/src/views/form/design/components/components/CodeFirstModal.vue @@ -67,6 +67,7 @@ import { FormJson } from '/@/model/generator/codeGenerator'; import { FormEventColumnConfig } from '/@/model/generator/formEventConfig'; import { changeCompsApiConfig, changeEventApiConfig, getMainTable } from '/@/utils/event/design'; + import {ListConfig} from "/@/model/generator/listConfig"; const { t } = useI18n(); const current = ref(0); @@ -149,7 +150,7 @@ customFormConfig.category = data.category; customFormConfig.formDesignType = data.formDesignType; customFormConfig.formJson = JSON.parse(data.formJson); - customFormConfig.listConfig = JSON.parse(data.listConfig); + customFormConfig.listConfig = JSON.parse(data.listConfig)||{} as ListConfig; customFormConfig.renderConfig =data.renderConfig; customFormConfig.remark = data.remark; diff --git a/src/views/form/design/components/components/DataFirstModal.vue b/src/views/form/design/components/components/DataFirstModal.vue index 76cf3d1..7129676 100644 --- a/src/views/form/design/components/components/DataFirstModal.vue +++ b/src/views/form/design/components/components/DataFirstModal.vue @@ -54,6 +54,7 @@ import { useI18n } from '/@/hooks/web/useI18n'; import DesignLogo from '/@/components/ModalPanel/src/DesignLogo.vue'; import useGlobalFlag from '/@/hooks/core/useGlobalFlag'; + import {ListConfig} from "/@/model/generator/listConfig"; const { t } = useI18n(); const current = ref(0); @@ -137,7 +138,7 @@ customFormConfig.category = data.category; customFormConfig.formDesignType = data.formDesignType; customFormConfig.formJson = JSON.parse(data.formJson); - customFormConfig.listConfig = JSON.parse(data.listConfig); + customFormConfig.listConfig = JSON.parse(data.listConfig)||{} as ListConfig; customFormConfig.renderConfig =data.renderConfig; customFormConfig.remark = data.remark; diff --git a/src/views/form/design/components/components/SimpleTemplateModal.vue b/src/views/form/design/components/components/SimpleTemplateModal.vue index 23e5013..21de87a 100644 --- a/src/views/form/design/components/components/SimpleTemplateModal.vue +++ b/src/views/form/design/components/components/SimpleTemplateModal.vue @@ -54,6 +54,7 @@ import { useI18n } from '/@/hooks/web/useI18n'; import { useModal } from '/@/components/Modal'; import DesignLogo from '/@/components/ModalPanel/src/DesignLogo.vue'; + import {ListConfig} from "/@/model/generator/listConfig"; const { t } = useI18n(); const current = ref(0); @@ -148,7 +149,7 @@ customFormConfig.category = data.category; customFormConfig.formDesignType = data.formDesignType; customFormConfig.formJson = JSON.parse(data.formJson); - customFormConfig.listConfig = JSON.parse(data.listConfig); + customFormConfig.listConfig = JSON.parse(data.listConfig)||{} as ListConfig; customFormConfig.renderConfig =data.renderConfig; customFormConfig.remark = data.remark; diff --git a/src/views/form/design/index.vue b/src/views/form/design/index.vue index ad10d2a..1c0260b 100644 --- a/src/views/form/design/index.vue +++ b/src/views/form/design/index.vue @@ -2,97 +2,10 @@ -
-
- -
- - - - -
+
-
-
- -
- - - - -
+
@@ -126,13 +39,7 @@
diff --git a/src/views/form/design/tabpanes/ZeroCodeTypeTabPane.vue b/src/views/form/design/tabpanes/ZeroCodeTypeTabPane.vue new file mode 100644 index 0000000..85543b0 --- /dev/null +++ b/src/views/form/design/tabpanes/ZeroCodeTypeTabPane.vue @@ -0,0 +1,356 @@ + + + + + diff --git a/src/views/secondDev/LoginForm.vue b/src/views/secondDev/LoginForm.vue index 4713cf4..67ecfc7 100644 --- a/src/views/secondDev/LoginForm.vue +++ b/src/views/secondDev/LoginForm.vue @@ -34,7 +34,7 @@ - +
查看导入日志
- + 租户模式导入 @@ -51,6 +51,7 @@ import { useI18n } from '/@/hooks/web/useI18n'; import ImportSystemConfig from './ImportSystemConfig.vue'; import { getLogList,getLogDetails} from '/@/api/system/dataMigration'; + import {getAppEnvConfig} from "/@/utils/env"; const { t } = useI18n(); diff --git a/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue b/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue index baf259c..95b90ed 100644 --- a/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue +++ b/src/views/workflow/task/components/processTasks/ToDoTasksV2.vue @@ -37,24 +37,13 @@ import { storeToRefs } from 'pinia'; import { useUserStore } from '/@/store/modules/user'; import {useMessage} from "/@/hooks/web/useMessage"; - import { changeTenant } from '/@/api/system/tenant'; - import {useAppStore} from "/@/store/modules/app"; - import {setupRouterGuard} from "/@/router/guard"; - import {usePermissionStore} from "/@/store/modules/permission"; - import {useTabs} from "/@/hooks/web/useTabs"; - import {useMenuSetting} from "/@/hooks/setting/useMenuSetting"; - import {useAppInject} from "/@/hooks/web/useAppInject"; + import {useTenantManager} from "/@/utils/tenantManager"; const router = useRouter(); const { currentRoute } = router; const { t } = useI18n(); - const appStore = useAppStore(); const userStore = useUserStore(); const { userInfo } = storeToRefs(userStore); - const { closeOther } = useTabs(router); - const permissionStore = usePermissionStore(); - const { getShowTopMenu } = useMenuSetting(); - const { getIsMobile } = useAppInject(); const configColumns: BasicColumn[] = [ @@ -135,6 +124,8 @@ } }); + const {toggleLocal}=useTenantManager(); + onMounted(() => { bus.on(FLOW_PROCESSED, onFlowProcessed); }); @@ -151,7 +142,7 @@ ); const onRowDblClick = (record, index) => { const {tenantId,tenantCode,tenantName} = record; - let tenantEnabled=getAppEnvConfig().VITE_TENANT_ENABLED; + let tenantEnabled=getAppEnvConfig().VITE_GLOB_TENANT_ENABLED; if(tenantEnabled =='true'&&tenantId){ let currentTenantId=userInfo.value.tenantId; if(tenantId!=currentTenantId){ @@ -166,7 +157,7 @@ ]), width:'600px', onOk: async () => { - toggleLocale(tenantCode).then(()=>{ + switchTenant(tenantCode).then(()=>{ openDetailPage(record,true); }) @@ -206,19 +197,8 @@ reload(); } - async function toggleLocale(tenantCode: string) { - appStore.setPageLoadingAction(true); - await changeTenant(tenantCode); - permissionStore.setDynamicAddedRoute(false); - await userStore.afterLoginAction(false); - closeOther(); - await setupRouterGuard(router); - await permissionStore.changeSubsystem(getShowTopMenu.value, getIsMobile.value); - if(permissionStore.getSubSysList.length>0){ - permissionStore.setSubSystem(permissionStore.getSubSysList[0].id); - }else{ - permissionStore.setSubSystem(""); - } + async function switchTenant(tenantCode: string) { + await toggleLocal({tenantCode:tenantCode, goHome:false,tabCloseAction:"closeOther"}); } From de1c7b54e5b642c67d07bc42b64d3b2479a04f99 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Mon, 23 Jun 2025 15:02:05 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E4=B8=AA=E6=80=A7?= =?UTF-8?q?=E5=8C=96=E9=85=8D=E7=BD=AE=EF=BC=9A=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/web/useFormConfig.ts | 24 ++++++++++++++++++------ src/utils/helper/generatorHelper.ts | 8 ++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/hooks/web/useFormConfig.ts b/src/hooks/web/useFormConfig.ts index d93b729..f0d5c65 100644 --- a/src/hooks/web/useFormConfig.ts +++ b/src/hooks/web/useFormConfig.ts @@ -11,12 +11,18 @@ const { t } = useI18n(); const { notification } = useMessage(); export function useFormConfig() { - async function mergeFormSchemas(formSchema: FormSchema[],formPath:String){ + async function mergeFormSchemas(obj:{formSchema: FormSchema[],formId:String,formPath:String}){ try{ - const formProps=await queryConfigByFormPath(formPath,'formProps'); + let formProps; + if(obj.formId){ + formProps=await queryConfig(obj.formId,'formProps'); + }else{ + formProps=await queryConfigByFormPath(obj.formPath,'formProps'); + } + let fschemas=formProps?.schemas; if(fschemas&&fschemas.length>0){ - return deepMerge(formSchema,fschemas); + return deepMerge(obj.formSchema,fschemas); }else{ return formSchema; } @@ -25,10 +31,16 @@ export function useFormConfig() { } } - async function mergeFormEventConfigs(formEventConfigs,componentPath:String){ + async function mergeFormEventConfigs(obj:{formEventConfigs,formId:String,formPath:String}){ try{ - const fEConfigs=await queryConfigByFormPath(componentPath,'formEventConfigs'); - return deepMerge(formEventConfigs,fEConfigs); + let fEConfigs; + if(obj.formId){ + fEConfigs=await queryConfig(obj.formId,'formEventConfigs'); + }else{ + fEConfigs=await queryConfigByFormPath(obj.formPath,'formEventConfigs'); + } + + return deepMerge(obj.formEventConfigs,fEConfigs); }catch(e){ return {}; } diff --git a/src/utils/helper/generatorHelper.ts b/src/utils/helper/generatorHelper.ts index d06e09b..78635fa 100644 --- a/src/utils/helper/generatorHelper.ts +++ b/src/utils/helper/generatorHelper.ts @@ -1751,9 +1751,9 @@ export function buildSimpleFormCode(model: GeneratorConfig, _tableInfo: TableInf if(props.fromPage !== FromPageType.FLOW){ let formPath=currentRoute.value.query.formPath; //1.合并字段配置 - cloneProps.schemas=await mergeFormSchemas(cloneProps.schemas!,formPath); + cloneProps.schemas=await mergeFormSchemas({formSchema:cloneProps.schemas!,formPath:formPath}); //2.合并表单事件配置 - fEventConfigs=await mergeFormEventConfigs(fEventConfigs,formPath); + fEventConfigs=await mergeFormEventConfigs({formEventConfigs:fEventConfigs,formPath:formPath}); } } data.formDataProps=cloneProps; @@ -1842,8 +1842,8 @@ export function buildSimpleFormCode(model: GeneratorConfig, _tableInfo: TableInf if (formConfig.useCustomConfig) { const parts = obj.formConfigKey.split('_'); const formId=parts[1]; - cloneProps.schemas=await mergeFormSchemas(cloneProps.schemas!,formId); - customFormEventConfigs=await mergeFormEventConfigs(customFormEventConfigs,formId); + cloneProps.schemas=await mergeFormSchemas({formSchema:cloneProps.schemas!,formId:formId}); + customFormEventConfigs=await mergeFormEventConfigs({formEventConfigs:customFormEventConfigs,formId:formId}); } let flowData = changeWorkFlowForm(cloneProps, obj);