Explorar el Código

保存本地更改:菜单管理功能和相关文件

pm hace 5 meses
padre
commit
975d474548
Se han modificado 5 ficheros con 193 adiciones y 13 borrados
  1. 38 0
      .gitignore
  2. 13 13
      src/Dashboard.tsx
  3. 73 0
      src/api/Menu.ts
  4. 1 0
      src/api/index.ts
  5. 68 0
      src/utils/tree.ts

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+# Dependencies
+node_modules/
+/.pnp
+.pnp.js
+
+# Testing
+/coverage
+
+# Production
+/build
+/dist
+
+# Misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# Logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+# Editor directories and files
+.idea/
+.vscode/
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+# Vite
+.vite/
+

+ 13 - 13
src/Dashboard.tsx

@@ -285,14 +285,14 @@ export default function Dashboard() {
       }
       
       // 调试:打印菜单处理信息
-      console.log('处理菜单:', {
-        name: menu.name,
-        path: menu.path,
-        parentId: menu.parentId,
-        isClientMenu,
-        isClientParent,
-        shouldProcess
-      });
+      // console.log('处理菜单:', {
+      //   name: menu.name,
+      //   path: menu.path,
+      //   parentId: menu.parentId,
+      //   isClientMenu,
+      //   isClientParent,
+      //   shouldProcess
+      // });
       
       // 只处理客户端菜单或其子菜单
       if (!shouldProcess) {
@@ -405,11 +405,11 @@ export default function Dashboard() {
     };
     
     // 调试:打印最终生成的菜单
-    console.log('=== 菜单生成结果 ===');
-    console.log('主菜单数量:', result.mainMenus.length);
-    console.log('主菜单列表:', result.mainMenus.map(m => ({ key: m.key, name: m.name })));
-    console.log('子菜单配置:', result.subMenuConfig);
-    console.log('==================');
+    // console.log('=== 菜单生成结果 ===');
+    // console.log('主菜单数量:', result.mainMenus.length);
+    // console.log('主菜单列表:', result.mainMenus.map(m => ({ key: m.key, name: m.name })));
+    // console.log('子菜单配置:', result.subMenuConfig);
+    // console.log('==================');
     
     return result;
   }, []);

+ 73 - 0
src/api/Menu.ts

@@ -0,0 +1,73 @@
+import axiosInstance from '../utils/axios';
+
+// 菜单类型枚举
+export enum MenuType {
+  DIR = 1,    // 目录
+  MENU = 2,   // 菜单
+  BUTTON = 3  // 按钮
+}
+
+// 菜单状态枚举
+export enum MenuStatus {
+  DISABLE = 0, // 禁用
+  ENABLE = 1   // 启用
+}
+
+// 菜单 VO
+export interface MenuVO {
+  id?: number;
+  name: string;
+  permission: string;
+  type: number;
+  sort: number;
+  parentId: number;
+  path: string;
+  icon: string;
+  component?: string;
+  componentName?: string;
+  status: number;
+  visible: boolean;
+  keepAlive: boolean;
+  alwaysShow?: boolean;
+  createTime?: Date;
+}
+
+// 菜单查询参数
+export interface MenuQueryParams {
+  name?: string;
+  status?: number;
+}
+
+// 菜单管理 API
+export const menuApi = {
+  // 查询菜单(精简)列表
+  getSimpleMenusList: () => {
+    return axiosInstance.get<MenuVO[]>('/system/menu/simple-list');
+  },
+
+  // 查询菜单列表
+  getMenuList: (params?: MenuQueryParams) => {
+    return axiosInstance.get<MenuVO[]>('/system/menu/list', { params });
+  },
+
+  // 获取菜单详情
+  getMenu: (id: number) => {
+    return axiosInstance.get<MenuVO>(`/system/menu/get?id=${id}`);
+  },
+
+  // 新增菜单
+  createMenu: (data: MenuVO) => {
+    return axiosInstance.post('/system/menu/create', data);
+  },
+
+  // 修改菜单
+  updateMenu: (data: MenuVO) => {
+    return axiosInstance.put('/system/menu/update', data);
+  },
+
+  // 删除菜单
+  deleteMenu: (id: number) => {
+    return axiosInstance.delete(`/system/menu/delete?id=${id}`);
+  },
+};
+

+ 1 - 0
src/api/index.ts

@@ -12,6 +12,7 @@ export interface ApiResponse<T = any> {
 
 // 导出所有 API 模块
 export { loginApi } from './Login';
+export { menuApi } from './Menu';
 export { userApi } from './User';
 export { systemApi } from './System';
 export { hardwareApi } from './Hardware';

+ 68 - 0
src/utils/tree.ts

@@ -0,0 +1,68 @@
+// 树形节点接口
+export interface TreeNode {
+  id: number;
+  [key: string]: any;
+  children?: TreeNode[];
+}
+
+/**
+ * 将扁平数组转换为树形结构
+ * @param list 扁平数组
+ * @param idKey ID字段名,默认为 'id'
+ * @param parentIdKey 父ID字段名,默认为 'parentId'
+ * @param childrenKey 子节点字段名,默认为 'children'
+ * @returns 树形结构数组
+ */
+export function handleTree<T extends TreeNode>(
+  list: T[],
+  idKey: string = 'id',
+  parentIdKey: string = 'parentId',
+  childrenKey: string = 'children'
+): T[] {
+  const map = new Map<number, T>();
+  const roots: T[] = [];
+
+  // 第一遍:创建所有节点的映射
+  list.forEach((item) => {
+    const id = item[idKey] as number;
+    map.set(id, { ...item, [childrenKey]: [] });
+  });
+
+  // 第二遍:建立父子关系
+  list.forEach((item) => {
+    const id = item[idKey] as number;
+    const parentId = item[parentIdKey] as number;
+    const node = map.get(id);
+
+    if (!node) return;
+
+    if (parentId === 0 || parentId === null || parentId === undefined) {
+      // 根节点
+      roots.push(node);
+    } else {
+      // 子节点
+      const parent = map.get(parentId);
+      if (parent) {
+        if (!parent[childrenKey]) {
+          parent[childrenKey] = [];
+        }
+        parent[childrenKey].push(node);
+      } else {
+        // 找不到父节点,作为根节点处理
+        roots.push(node);
+      }
+    }
+  });
+
+  return roots;
+}
+
+/**
+ * 树形结构的默认属性配置(用于 el-tree-select 等组件)
+ */
+export const defaultProps = {
+  children: 'children',
+  label: 'name',
+  value: 'id',
+};
+