From 09d0cfa87ea4cec0b9e49714cfca79cf5938ddb5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 1 Apr 2025 21:46:50 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=20menu=20?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=9A=84=E5=88=97=E8=A1=A8=EF=BC=88=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/system/menu/index.ts | 12 +- apps/web-antd/src/views/system/menu/data.ts | 104 ++++ apps/web-antd/src/views/system/menu/index.vue | 156 ++++++ .../src/views/system/menu/modules/form.vue | 473 ++++++++++++++++++ 4 files changed, 739 insertions(+), 6 deletions(-) create mode 100644 apps/web-antd/src/views/system/menu/data.ts create mode 100644 apps/web-antd/src/views/system/menu/index.vue create mode 100644 apps/web-antd/src/views/system/menu/modules/form.vue diff --git a/apps/web-antd/src/api/system/menu/index.ts b/apps/web-antd/src/api/system/menu/index.ts index c5c03d0dc..7172b43e4 100644 --- a/apps/web-antd/src/api/system/menu/index.ts +++ b/apps/web-antd/src/api/system/menu/index.ts @@ -2,7 +2,7 @@ import { requestClient } from '#/api/request'; export namespace SystemMenuApi { /** 菜单信息 */ - export interface MenuVO { + export interface SystemMenu { id: number; name: string; permission: string; @@ -23,26 +23,26 @@ export namespace SystemMenuApi { /** 查询菜单(精简)列表 */ export async function getSimpleMenusList() { - return requestClient.get('/system/menu/simple-list'); + return requestClient.get('/system/menu/simple-list'); } /** 查询菜单列表 */ export async function getMenuList(params?: Record) { - return requestClient.get('/system/menu/list', { params }); + return requestClient.get('/system/menu/list', { params }); } /** 获取菜单详情 */ export async function getMenu(id: number) { - return requestClient.get(`/system/menu/get?id=${id}`); + return requestClient.get(`/system/menu/get?id=${id}`); } /** 新增菜单 */ -export async function createMenu(data: SystemMenuApi.MenuVO) { +export async function createMenu(data: SystemMenuApi.SystemMenu) { return requestClient.post('/system/menu/create', data); } /** 修改菜单 */ -export async function updateMenu(data: SystemMenuApi.MenuVO) { +export async function updateMenu(data: SystemMenuApi.SystemMenu) { return requestClient.put('/system/menu/update', data); } diff --git a/apps/web-antd/src/views/system/menu/data.ts b/apps/web-antd/src/views/system/menu/data.ts new file mode 100644 index 000000000..a4889b96b --- /dev/null +++ b/apps/web-antd/src/views/system/menu/data.ts @@ -0,0 +1,104 @@ +import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; +// import type { SystemMenuApi } from '#/api/system/menu'; + +import { $t } from '#/locales'; + +export function getMenuTypeOptions() { + return [ + { + color: 'processing', + label: $t('system.menu.typeCatalog'), + value: 'catalog', + }, + { color: 'default', label: $t('system.menu.typeMenu'), value: 'menu' }, + { color: 'error', label: $t('system.menu.typeButton'), value: 'button' }, + { + color: 'success', + label: $t('system.menu.typeEmbedded'), + value: 'embedded', + }, + { color: 'warning', label: $t('system.menu.typeLink'), value: 'link' }, + ]; +} + +export function useGridColumns( + onActionClick: OnActionClickFn, +): VxeTableGridOptions['columns'] { + return [ + { + align: 'left', + field: 'meta.title', + fixed: 'left', + slots: { default: 'title' }, + title: $t('system.menu.menuTitle'), + treeNode: true, + width: 250, + }, + { + align: 'center', + cellRender: { name: 'CellTag', options: getMenuTypeOptions() }, + field: 'type', + title: $t('system.menu.type'), + width: 100, + }, + { + align: 'left', + field: 'path', + title: $t('system.menu.path'), + width: 200, + }, + + { + align: 'left', + field: 'component', + formatter: ({ row }) => { + switch (row.type) { + case 'catalog': + case 'menu': { + return row.component ?? ''; + } + case 'embedded': { + return row.meta?.iframeSrc ?? ''; + } + case 'link': { + return row.meta?.link ?? ''; + } + } + return ''; + }, + minWidth: 200, + title: $t('system.menu.component'), + }, + { + cellRender: { name: 'CellTag' }, + field: 'status', + title: $t('system.menu.status'), + width: 100, + }, + + { + align: 'right', + cellRender: { + attrs: { + nameField: 'name', + onClick: onActionClick, + }, + name: 'CellOperation', + options: [ + { + code: 'append', + text: '新增下级', + }, + 'edit', // 默认的编辑按钮 + 'delete', // 默认的删除按钮 + ], + }, + field: 'operation', + fixed: 'right', + headerAlign: 'center', + showOverflow: false, + title: $t('system.menu.operation'), + width: 200, + }, + ]; +} diff --git a/apps/web-antd/src/views/system/menu/index.vue b/apps/web-antd/src/views/system/menu/index.vue new file mode 100644 index 000000000..ddeb509b3 --- /dev/null +++ b/apps/web-antd/src/views/system/menu/index.vue @@ -0,0 +1,156 @@ + + \ No newline at end of file diff --git a/apps/web-antd/src/views/system/menu/modules/form.vue b/apps/web-antd/src/views/system/menu/modules/form.vue new file mode 100644 index 000000000..4bb3644ce --- /dev/null +++ b/apps/web-antd/src/views/system/menu/modules/form.vue @@ -0,0 +1,473 @@ + +