From 047122dfa5d27b4d3f2fe4cdcb9a688d6e5fc1e9 Mon Sep 17 00:00:00 2001 From: suguangxu <274928232@qq.com> Date: Fri, 9 May 2025 22:08:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=8D=95=E5=8F=AF=E4=B8=AA=E6=80=A7?= =?UTF-8?q?=E5=8C=96=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD=E5=BC=80=E5=8F=91?= =?UTF-8?q?=EF=BC=9A=201.=E8=A1=A8=E5=8D=95=E7=BC=96=E8=BE=91=E9=A1=B5?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=88=903=E4=B8=AAtab=EF=BC=8C=E5=88=86?= =?UTF-8?q?=E5=88=AB=E7=94=A8=E4=BA=8E=E7=BC=96=E8=BE=91=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF=E3=80=81=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF=E3=80=81=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF=E3=80=82?= =?UTF-8?q?=202.=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8=E5=81=9A?= =?UTF-8?q?=E4=BA=86=E8=B0=83=E6=95=B4=20=20=20=EF=BC=881=EF=BC=89?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E7=94=A8=E4=BA=8E=E6=8E=A7=E5=88=B6=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E3=80=81=E5=88=97=E8=A1=A8=E5=B1=95=E7=A4=BA=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E3=80=81=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=9A=84=E4=BB=A3=E7=A0=81=E3=80=82=20=20=20=20?= =?UTF-8?q?=EF=BC=882=EF=BC=89=20index=E9=A1=B5=E6=9C=89=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=9C=B0=E6=96=B9=E7=A9=BA=E4=BA=86=E8=AE=B8=E5=A4=9A=E8=A1=8C?= =?UTF-8?q?=EF=BC=8C=E5=81=9A=E4=BA=86=E8=B0=83=E6=95=B4=EF=BC=8C=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E7=A9=BA=E8=A1=8C=E6=95=B0=EF=BC=88=E4=BD=BF=E7=94=A8?= =?UTF-8?q?code.replace(/(\n\s*\n\s*\n)+/g,=20'\n')=E6=9B=BF=E6=8D=A23?= =?UTF-8?q?=E4=B8=AA=E4=BB=A5=E4=B8=8A=E7=9A=84=E6=8D=A2=E8=A1=8C=E7=AC=A6?= =?UTF-8?q?=EF=BC=89=E3=80=82=20=203.=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=EF=BC=9AuseFormConfig.ts,=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=AF=94=E5=AF=B9=E5=90=88=E5=B9=B6=E4=B8=AA=E6=80=A7=E5=8C=96?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/form/design/index.ts | 15 ++ .../CreateCodeStep/src/EntireConfigStep.vue | 149 +++++++++++++++--- src/hooks/web/useFormConfig.ts | 72 +++++++++ src/utils/helper/generatorHelper.ts | 82 ++++++++-- .../components/components/CodeFirstModal.vue | 6 +- .../components/components/DataFirstModal.vue | 6 +- .../components/SimpleTemplateModal.vue | 6 +- 7 files changed, 298 insertions(+), 38 deletions(-) create mode 100644 src/hooks/web/useFormConfig.ts diff --git a/src/api/form/design/index.ts b/src/api/form/design/index.ts index 387277d..a6e1d0f 100644 --- a/src/api/form/design/index.ts +++ b/src/api/form/design/index.ts @@ -112,6 +112,21 @@ export async function getFormTemplate(id: string, mode: ErrorMessageMode = 'moda ); } +/** + * @description: 获取模板详情信息-优先从缓存获取 + */ +export async function getFormTemplateUsingCache(id: string, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.Info, + params: {id,useCache:1}, + }, + { + errorMessageMode: mode, + }, + ); +} + /** * @description: 更新模板状态 */ diff --git a/src/components/CreateCodeStep/src/EntireConfigStep.vue b/src/components/CreateCodeStep/src/EntireConfigStep.vue index b6be60e..d80d7a9 100644 --- a/src/components/CreateCodeStep/src/EntireConfigStep.vue +++ b/src/components/CreateCodeStep/src/EntireConfigStep.vue @@ -1,60 +1,173 @@ 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 />