From 5ba984a499ff96415ce9b14b84804232f4910cb2 Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 25 Oct 2025 23:27:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AD=97=E6=AE=B5=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=8E=A7=E4=BB=B6=E6=97=A0=E6=B3=95=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E6=8E=A7=E4=BB=B6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/core/registry/controlOverride.ts | 53 +++-- .../pagetype/file/form/controls/HTML.vue | 188 ++++++++++++++++++ 2 files changed, 211 insertions(+), 30 deletions(-) create mode 100644 apps/jingrow/frontend/src/views/pagetype/file/form/controls/HTML.vue diff --git a/apps/jingrow/frontend/src/core/registry/controlOverride.ts b/apps/jingrow/frontend/src/core/registry/controlOverride.ts index 83a8080..ebda61a 100644 --- a/apps/jingrow/frontend/src/core/registry/controlOverride.ts +++ b/apps/jingrow/frontend/src/core/registry/controlOverride.ts @@ -8,6 +8,20 @@ const allControlOverrides: Record = import.meta.gl '/src/views/pagetype/**/form/controls/**.vue' ) +// 预计算路径映射,提高查找效率 +const pathMap = new Map() + +// 初始化路径映射 +Object.keys(allControlOverrides).forEach(path => { + const segments = path.split('/').filter(Boolean) + if (segments.length >= 7) { + const entity = segments[3] + const fieldtype = segments[6].replace(/\.vue$/i, '') + const key = `${entity}:${fieldtype}` + pathMap.set(key, path) + } +}) + /** * 解析并返回指定 pagetype 和 fieldtype 的控件覆盖组件 * @param entity pagetype名称 @@ -16,41 +30,20 @@ const allControlOverrides: Record = import.meta.gl export async function resolveControlOverride(entity: string, fieldtype: string): Promise { if (!entity || !fieldtype) return null - // 将entity转换为下划线格式(与文件系统一致) - const entityUnderscore = entity.toLowerCase().replace(/-/g, '_') - const fieldtypeNormalized = fieldtype.replace(/\s+/g, '') + // 标准化输入 + const entityKey = entity.toLowerCase().replace(/-/g, '_') + const fieldtypeKey = fieldtype.replace(/\s+/g, '') - // 查找匹配的控件覆盖 - const candidates = Object.keys(allControlOverrides).filter((path) => { - const segments = path.split('/').filter(Boolean) - const len = segments.length - - if (len < 6) return false // 至少需要 6 段路径:views/pagetype/{entity}/form/controls/{fieldtype}.vue - - // 检查路径结构:views/pagetype/{entity}/form/controls/{fieldtype}.vue - const fileName = segments[len - 1] - const fieldtypeInPath = fileName.replace(/\.vue$/i, '') - - return ( - segments[0] === 'views' && - segments[1] === 'pagetype' && - segments[2] === entityUnderscore && - segments[3] === 'form' && - segments[4] === 'controls' && - fieldtypeInPath === fieldtypeNormalized - ) - }) + // 直接查找匹配的路径 + const key = `${entityKey}:${fieldtypeKey}` + const path = pathMap.get(key) - if (candidates.length === 0) return null + if (!path) return null - // 如果有多个匹配,选择路径最短的(更接近根目录的优先) - candidates.sort((a, b) => a.length - b.length) - - const selectedPath = candidates[0] try { - const module = await allControlOverrides[selectedPath]() + const module = await allControlOverrides[path]() return module?.default ?? module - } catch (_e) { + } catch { return null } } diff --git a/apps/jingrow/frontend/src/views/pagetype/file/form/controls/HTML.vue b/apps/jingrow/frontend/src/views/pagetype/file/form/controls/HTML.vue new file mode 100644 index 0000000..330a5d3 --- /dev/null +++ b/apps/jingrow/frontend/src/views/pagetype/file/form/controls/HTML.vue @@ -0,0 +1,188 @@ + + + + +