From fd1149002476b503d78646d55bd622ea873b1d00 Mon Sep 17 00:00:00 2001 From: zhangtao <9480807882@qq.com> Date: Sun, 12 Apr 2026 21:54:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(CURD):=20=E7=BB=9F=E4=B8=80=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A0=8F=E6=8C=89=E9=92=AE=E7=B1=BB=E5=9E=8B=E5=92=8C?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 标准化工具栏按钮类型定义,移除重复项并统一权限命名 更新多个视图的默认工具栏配置以保持一致 添加批量修改按钮并调整相关权限名称 --- .../gencode/templates/vue/index.vue.j2 | 2 +- .../plop-templates/curd-list-page.vue.hbs | 2 +- .../src/components/CURD/CrudToolbarRight.vue | 3 +-- frontend/src/components/CURD/ImportModal.vue | 1 + frontend/src/components/CURD/PageContent.vue | 20 +++++++++---------- frontend/src/components/CURD/types.ts | 6 +++--- frontend/src/views/module_ai/memory/index.vue | 4 ++-- .../src/views/module_example/demo/index.vue | 2 +- .../src/views/module_example/demo01/index.vue | 2 +- .../src/views/module_system/menu/index.vue | 2 +- .../src/views/module_system/param/index.vue | 2 +- .../views/module_system/position/index.vue | 2 +- .../src/views/module_system/role/index.vue | 2 +- .../src/views/module_system/tenant/index.vue | 2 +- .../src/views/module_system/user/index.vue | 2 +- .../views/module_task/cronjob/node/index.vue | 2 +- 16 files changed, 27 insertions(+), 29 deletions(-) diff --git a/backend/app/plugin/module_generator/gencode/templates/vue/index.vue.j2 b/backend/app/plugin/module_generator/gencode/templates/vue/index.vue.j2 index 1fb64757..ce36a07b 100644 --- a/backend/app/plugin/module_generator/gencode/templates/vue/index.vue.j2 +++ b/backend/app/plugin/module_generator/gencode/templates/vue/index.vue.j2 @@ -473,7 +473,7 @@ const contentConfig = reactive>({ initialFetch: false, cols: contentCols as IContentConfig["cols"], toolbar: [], - defaultToolbar: ["import", "exports", "search", "refresh", "filter"], + defaultToolbar: ["import", "export", "patch", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/plop-templates/curd-list-page.vue.hbs b/frontend/plop-templates/curd-list-page.vue.hbs index 0f41654f..43f604b4 100644 --- a/frontend/plop-templates/curd-list-page.vue.hbs +++ b/frontend/plop-templates/curd-list-page.vue.hbs @@ -69,7 +69,7 @@ const searchConfig = reactive({ const contentConfig = reactive({ permPrefix: "{{permPrefix}}", toolbar: [], - defaultToolbar: ["refresh", "filter"], + defaultToolbar: ["import", "export", "patch", "search", "refresh", "filter"], cols: [], /** TODO: 接入列表 API,返回 { total, list } 供 PageContent 解析 */ indexAction: async () => ({ total: 0, list: [] }), diff --git a/frontend/src/components/CURD/CrudToolbarRight.vue b/frontend/src/components/CURD/CrudToolbarRight.vue index c6c59cf8..13ae3fbb 100644 --- a/frontend/src/components/CURD/CrudToolbarRight.vue +++ b/frontend/src/components/CURD/CrudToolbarRight.vue @@ -44,9 +44,8 @@ defineProps<{ const TOOLTIPS: Record = { import: "导入", - imports: "批量导入", export: "导出", - exports: "导出", + filter: "筛选", search: "搜索显示/隐藏", refresh: "刷新", }; diff --git a/frontend/src/components/CURD/ImportModal.vue b/frontend/src/components/CURD/ImportModal.vue index 0ffc2ec1..d58c4e75 100644 --- a/frontend/src/components/CURD/ImportModal.vue +++ b/frontend/src/components/CURD/ImportModal.vue @@ -41,6 +41,7 @@ props.contentConfig); const buttonConfig = reactive>({ - add: { text: "新增", attrs: { icon: "plus", type: "success" }, perm: "add" }, + add: { text: "新增", attrs: { icon: "plus", type: "success" }, perm: "create" }, delete: { text: "删除", attrs: { icon: "delete", type: "danger" }, perm: "delete" }, - /** 右侧圆形工具条:与业务页手写工具栏(如 user、demo)语义色一致 */ + patch: { text: "批量修改", attrs: { icon: "edit", type: "warning" }, perm: "patch" }, import: { text: "导入", attrs: { icon: "upload", type: "info" }, perm: "import" }, export: { text: "导出", attrs: { icon: "download", type: "warning" }, perm: "export" }, refresh: { text: "刷新", attrs: { icon: "refresh", type: "success" }, perm: "*:*:*" }, filter: { text: "筛选列", attrs: { icon: "operation", type: "danger" }, perm: "*:*:*" }, - search: { text: "搜索", attrs: { icon: "search", type: "info" }, perm: "search" }, - imports: { text: "批量导入", attrs: { icon: "upload", type: "success" }, perm: "imports" }, - exports: { text: "批量导出", attrs: { icon: "download", type: "warning" }, perm: "exports" }, - view: { text: "查看", attrs: { icon: "view", type: "primary" }, perm: "view" }, - edit: { text: "编辑", attrs: { icon: "edit", type: "primary" }, perm: "edit" }, + search: { text: "搜索", attrs: { icon: "search", type: "info" }, perm: "query" }, + view: { text: "详情", attrs: { icon: "view", type: "primary" }, perm: "detail" }, + edit: { text: "编辑", attrs: { icon: "edit", type: "primary" }, perm: "update" }, }); // 主键 @@ -807,7 +805,7 @@ function handleToolbar(name: string) { case "refresh": handleRefresh(); break; - case "exports": + case "export": handleOpenExportsModal(); break; case "imports": @@ -822,12 +820,12 @@ function handleToolbar(name: string) { case "delete": handleDelete(); break; + case "patch": + emit("toolbarClick", name); + break; case "import": handleOpenImportModal(true); break; - case "export": - emit("exportClick"); - break; default: emit("toolbarClick", name); break; diff --git a/frontend/src/components/CURD/types.ts b/frontend/src/components/CURD/types.ts index 8d9c2de6..dcde783f 100644 --- a/frontend/src/components/CURD/types.ts +++ b/frontend/src/components/CURD/types.ts @@ -43,8 +43,8 @@ export type IComponentType = DateComponent | InputComponent | OtherComponent; /** * 工具按钮类型定义 */ -type ToolbarLeft = "add" | "delete" | "import" | "export"; -type ToolbarRight = "refresh" | "filter" | "import" | "imports" | "exports" | "search"; +type ToolbarLeft = "add" | "delete" | "patch"; +type ToolbarRight = "refresh" | "filter" | "import" | "export" | "search"; type ToolbarTable = "edit" | "view" | "delete"; /** @@ -204,7 +204,7 @@ export interface IContentConfig { pk?: string; /** 表格工具栏(默认:add,delete,export,也可自定义) */ toolbar?: Array; - /** 表格工具栏右侧图标(默认:refresh,filter,imports,exports,search) */ + /** 表格工具栏右侧图标(默认:refresh,filter,import,export,patch,search) */ defaultToolbar?: Array; /** 使用 #table 插槽自定义表格/树表时,为 true 则隐藏「列筛选」按钮(避免与自定义列不同步) */ hideColumnFilter?: boolean; diff --git a/frontend/src/views/module_ai/memory/index.vue b/frontend/src/views/module_ai/memory/index.vue index 03359cf0..256a34f9 100644 --- a/frontend/src/views/module_ai/memory/index.vue +++ b/frontend/src/views/module_ai/memory/index.vue @@ -381,8 +381,8 @@ const contentConfig = reactive({ permPrefix: "module_ai:chat", cols: [], hideColumnFilter: true, - toolbar: ["add", "delete"], - defaultToolbar: ["search", "refresh"], + toolbar: ["add", "delete", "patch"], + defaultToolbar: ["import", "export", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_example/demo/index.vue b/frontend/src/views/module_example/demo/index.vue index e9e15cee..5adea018 100644 --- a/frontend/src/views/module_example/demo/index.vue +++ b/frontend/src/views/module_example/demo/index.vue @@ -570,7 +570,7 @@ const contentConfig = reactive>({ initialFetch: false, cols: contentCols as IContentConfig["cols"], toolbar: [], - defaultToolbar: ["import", "exports", "search", "refresh", "filter"], + defaultToolbar: ["import", "export", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_example/demo01/index.vue b/frontend/src/views/module_example/demo01/index.vue index b4a59068..feb6f17c 100644 --- a/frontend/src/views/module_example/demo01/index.vue +++ b/frontend/src/views/module_example/demo01/index.vue @@ -402,7 +402,7 @@ const contentConfig = reactive>({ initialFetch: false, cols: contentCols as IContentConfig["cols"], toolbar: [], - defaultToolbar: ["import", "exports", "search", "refresh", "filter"], + defaultToolbar: ["import", "export", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_system/menu/index.vue b/frontend/src/views/module_system/menu/index.vue index 5a935603..47314fe1 100644 --- a/frontend/src/views/module_system/menu/index.vue +++ b/frontend/src/views/module_system/menu/index.vue @@ -807,7 +807,7 @@ const contentConfig = reactive>({ cols: contentCols as IContentConfig["cols"], hideColumnFilter: true, toolbar: [], - defaultToolbar: ["refresh"], + defaultToolbar: ["refresh", "filter"], pagination: false, indexAction: async (params) => { const res = await MenuAPI.listMenu(params as MenuPageQuery); diff --git a/frontend/src/views/module_system/param/index.vue b/frontend/src/views/module_system/param/index.vue index bcf5f41e..b38b3a08 100644 --- a/frontend/src/views/module_system/param/index.vue +++ b/frontend/src/views/module_system/param/index.vue @@ -377,7 +377,7 @@ const contentConfig = reactive>({ cols: contentCols as IContentConfig["cols"], hideColumnFilter: false, toolbar: [], - defaultToolbar: [{ name: "refresh", perm: "refresh" }, "filter"], + defaultToolbar: ["search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_system/position/index.vue b/frontend/src/views/module_system/position/index.vue index 5a667d19..f0d36b85 100644 --- a/frontend/src/views/module_system/position/index.vue +++ b/frontend/src/views/module_system/position/index.vue @@ -388,7 +388,7 @@ const contentConfig = reactive>({ cols: contentCols as IContentConfig["cols"], hideColumnFilter: false, toolbar: [], - defaultToolbar: [{ name: "refresh", perm: "refresh" }, "filter"], + defaultToolbar: ["search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_system/role/index.vue b/frontend/src/views/module_system/role/index.vue index 78c33193..1aad22cc 100644 --- a/frontend/src/views/module_system/role/index.vue +++ b/frontend/src/views/module_system/role/index.vue @@ -467,7 +467,7 @@ const contentConfig = reactive>({ cols: contentCols as IContentConfig["cols"], hideColumnFilter: false, toolbar: [], - defaultToolbar: [{ name: "refresh", perm: "query" }, "filter"], + defaultToolbar: ["search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_system/tenant/index.vue b/frontend/src/views/module_system/tenant/index.vue index 04a312f8..94818dbc 100644 --- a/frontend/src/views/module_system/tenant/index.vue +++ b/frontend/src/views/module_system/tenant/index.vue @@ -375,7 +375,7 @@ const contentConfig = reactive>({ cols: contentCols as IContentConfig["cols"], hideColumnFilter: false, toolbar: [], - defaultToolbar: [{ name: "refresh", perm: "refresh" }, "filter"], + defaultToolbar: ["import", "export", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_system/user/index.vue b/frontend/src/views/module_system/user/index.vue index 10f515fd..707fe684 100644 --- a/frontend/src/views/module_system/user/index.vue +++ b/frontend/src/views/module_system/user/index.vue @@ -511,7 +511,7 @@ const contentConfig = reactive>({ hideColumnFilter: true, initialFetch: false, toolbar: [], - defaultToolbar: [{ name: "refresh", perm: "query" }], + defaultToolbar: ["import", "export", "search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50], diff --git a/frontend/src/views/module_task/cronjob/node/index.vue b/frontend/src/views/module_task/cronjob/node/index.vue index 2a29fcb4..e8d17277 100644 --- a/frontend/src/views/module_task/cronjob/node/index.vue +++ b/frontend/src/views/module_task/cronjob/node/index.vue @@ -414,7 +414,7 @@ const contentConfig = reactive>({ cols: [], hideColumnFilter: true, toolbar: ["add", "delete"], - defaultToolbar: ["refresh"], + defaultToolbar: ["search", "refresh", "filter"], pagination: { pageSize: 10, pageSizes: [10, 20, 30, 50],