From e9f099f04423981aa8f62b117509923c1e0977dc Mon Sep 17 00:00:00 2001 From: oneao Date: Tue, 21 Jul 2026 22:30:33 +0800 Subject: [PATCH] 20260721223033 --- code/fms/CODEBUDDY.md | 6 +- code/fms/docs/refactor/模块管理功能设计.md | 56 +- .../migrations/001_module_management.sql | 49 +- .../migrations/002_module_order_condition.sql | 44 ++ .../migrations/003_module_surrogate_key.sql | 130 +++++ .../config/migrations/004_i18n_management.sql | 137 +++++ code/fms/fms-vue/src/components/FmsTable.vue | 189 ++++++- .../src/components/select/useLookupOptions.js | 9 +- .../src/layouts/components/AppSidebar.vue | 1 + code/fms/fms-vue/src/router/index.js | 42 +- code/fms/fms-vue/src/router/routes.js | 53 ++ code/fms/fms-vue/src/stores/permissions.js | 35 +- code/fms/fms-vue/src/styles/main.scss | 22 +- code/fms/fms-vue/src/utils/i18n.js | 26 + .../index.vue} | 0 .../src/views/i18n-management/index.vue | 533 ++++++++++++++++++ .../views/{LoginView.vue => login/index.vue} | 0 .../components/ModuleBasicInfoPanel.vue | 50 +- .../components/ModuleFieldDefinitionPanel.vue | 169 +++++- .../components/ModulePowerPanel.vue | 106 +++- .../components/ModuleTranslationEditor.vue | 59 ++ .../components/ModuleTranslationsPanel.vue | 57 -- .../components/ModuleTreePanel.vue | 12 +- .../{ModuleManagementView.vue => index.vue} | 214 ++++--- code/fms/新数据库结构.md | 22 +- code/fms/模块管理实施计划.md | 15 +- 26 files changed, 1687 insertions(+), 349 deletions(-) create mode 100644 code/fms/fms-api/config/migrations/002_module_order_condition.sql create mode 100644 code/fms/fms-api/config/migrations/003_module_surrogate_key.sql create mode 100644 code/fms/fms-api/config/migrations/004_i18n_management.sql create mode 100644 code/fms/fms-vue/src/router/routes.js create mode 100644 code/fms/fms-vue/src/utils/i18n.js rename code/fms/fms-vue/src/views/{DashboardView.vue => dashboard/index.vue} (100%) create mode 100644 code/fms/fms-vue/src/views/i18n-management/index.vue rename code/fms/fms-vue/src/views/{LoginView.vue => login/index.vue} (100%) create mode 100644 code/fms/fms-vue/src/views/module-management/components/ModuleTranslationEditor.vue delete mode 100644 code/fms/fms-vue/src/views/module-management/components/ModuleTranslationsPanel.vue rename code/fms/fms-vue/src/views/module-management/{ModuleManagementView.vue => index.vue} (79%) diff --git a/code/fms/CODEBUDDY.md b/code/fms/CODEBUDDY.md index 3e314502..6efb1f85 100644 --- a/code/fms/CODEBUDDY.md +++ b/code/fms/CODEBUDDY.md @@ -14,7 +14,7 @@ Supporting docs in the repo root (Chinese): - `新数据库结构.md` — the module-management table design (authoritative schema). - `旧数据库结构.md` — legacy schema, kept for reference only. - `模块管理实施计划.md` — phased plan for the module-management feature. -- `fms-api/config/migrations/001_module_management.sql` — the only migration script. +- `fms-api/config/migrations/` — SQL Server schema migration scripts. ## Commands @@ -87,7 +87,7 @@ Vue 3 ` + + + + diff --git a/code/fms/fms-vue/src/views/LoginView.vue b/code/fms/fms-vue/src/views/login/index.vue similarity index 100% rename from code/fms/fms-vue/src/views/LoginView.vue rename to code/fms/fms-vue/src/views/login/index.vue diff --git a/code/fms/fms-vue/src/views/module-management/components/ModuleBasicInfoPanel.vue b/code/fms/fms-vue/src/views/module-management/components/ModuleBasicInfoPanel.vue index d3cdf8c6..d860bf35 100644 --- a/code/fms/fms-vue/src/views/module-management/components/ModuleBasicInfoPanel.vue +++ b/code/fms/fms-vue/src/views/module-management/components/ModuleBasicInfoPanel.vue @@ -1,11 +1,13 @@ @@ -37,6 +173,13 @@ const columns = [ overflow: hidden; } +.toolbar { + display: flex; + gap: 8px; + flex: none; + padding: 10px 0; +} + .sub-table { flex: 1 1 auto; min-height: 0; diff --git a/code/fms/fms-vue/src/views/module-management/components/ModulePowerPanel.vue b/code/fms/fms-vue/src/views/module-management/components/ModulePowerPanel.vue index 146e609c..e0543002 100644 --- a/code/fms/fms-vue/src/views/module-management/components/ModulePowerPanel.vue +++ b/code/fms/fms-vue/src/views/module-management/components/ModulePowerPanel.vue @@ -1,24 +1,107 @@ @@ -32,6 +115,13 @@ const columns = [ overflow: hidden; } +.toolbar { + display: flex; + gap: 8px; + flex: none; + padding: 10px 0; +} + .sub-table { flex: 1 1 auto; min-height: 0; diff --git a/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationEditor.vue b/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationEditor.vue new file mode 100644 index 00000000..60533c5f --- /dev/null +++ b/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationEditor.vue @@ -0,0 +1,59 @@ + + + diff --git a/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationsPanel.vue b/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationsPanel.vue deleted file mode 100644 index 00a1d336..00000000 --- a/code/fms/fms-vue/src/views/module-management/components/ModuleTranslationsPanel.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/code/fms/fms-vue/src/views/module-management/components/ModuleTreePanel.vue b/code/fms/fms-vue/src/views/module-management/components/ModuleTreePanel.vue index 611ff7dd..99a94f46 100644 --- a/code/fms/fms-vue/src/views/module-management/components/ModuleTreePanel.vue +++ b/code/fms/fms-vue/src/views/module-management/components/ModuleTreePanel.vue @@ -5,6 +5,7 @@ import FmsTree from "@/components/FmsTree.vue"; const props = defineProps({ modules: { type: Array, required: true }, + protectedKeys: { type: Array, default: () => [] }, selectedKey: { type: String, default: "" }, loading: Boolean, canCreate: Boolean, @@ -16,15 +17,16 @@ const contextNode = ref(null); const treeData = computed(() => { const keyword = searchText.value.trim().toLowerCase(); + const codeById = new Map(props.modules.map((item) => [item.b_id, item.b_code])); const visible = keyword ? new Set( props.modules .filter( (item) => - String(item.b_id).toLowerCase().includes(keyword) || + String(item.b_code).toLowerCase().includes(keyword) || String(item.b_name).toLowerCase().includes(keyword), ) - .flatMap((item) => [item.b_id, item.b_parent_id]), + .flatMap((item) => [item.b_code, codeById.get(item.b_parent_id)].filter(Boolean)), ) : null; const children = new Map(); @@ -35,11 +37,11 @@ const treeData = computed(() => { }); const build = (parent) => (children.get(parent) || []) - .filter((item) => !visible || visible.has(item.b_id)) + .filter((item) => !visible || visible.has(item.b_code)) .map((item) => { const nodeChildren = build(item.b_id); return { - key: item.b_id, + key: item.b_code, title: item.b_name, children: nodeChildren, isLeaf: nodeChildren.length === 0, @@ -69,7 +71,7 @@ const contextMenu = computed(() => { key: "delete", label: "删除", danger: true, - disabled: !node || !props.canDelete || ["M_SYSTEM", "M_MODULE"].includes(node.key), + disabled: !node || !props.canDelete || props.protectedKeys.includes(String(node.key)), }, ], onClick: ({ key }) => { diff --git a/code/fms/fms-vue/src/views/module-management/ModuleManagementView.vue b/code/fms/fms-vue/src/views/module-management/index.vue similarity index 79% rename from code/fms/fms-vue/src/views/module-management/ModuleManagementView.vue rename to code/fms/fms-vue/src/views/module-management/index.vue index b5ba81ab..41762971 100644 --- a/code/fms/fms-vue/src/views/module-management/ModuleManagementView.vue +++ b/code/fms/fms-vue/src/views/module-management/index.vue @@ -1,18 +1,18 @@