Răsfoiți Sursa

优化路由

SpringSunYY 4 luni în urmă
părinte
comite
6497f7aaa1
1 a modificat fișierele cu 109 adăugiri și 90 ștergeri
  1. 109 90
      ruoyi_system/service/sys_menu.py

+ 109 - 90
ruoyi_system/service/sys_menu.py

@@ -14,29 +14,29 @@ from ruoyi_system.mapper.sys_role_menu import SysRoleMenuMapper
 
 
 class SysMenuService:
-    
+
     @classmethod
     def select_menu_list_by_user_id(cls, user_id) -> List[SysMenu]:
         '''
         根据用户,查询菜单列表
-        
+
         Args:
             user_id(int): 用户ID
-            
+
         Returns:
             List[SysMenu]: 菜单列表
         '''
         return cls.select_menu_list(SysMenu(), user_id)
-    
+
     @classmethod
     def select_menu_list(cls, menu:SysMenu, user_id:int) -> List[SysMenu]:
         '''
         查询菜单列表
-        
+
         Args:
             menu(SysMenu): 菜单实体
             user_id(int): 用户ID
-            
+
         Returns:
             List[SysMenu]: 菜单列表
         '''
@@ -44,17 +44,17 @@ class SysMenuService:
             eos: List[SysMenu] = SysMenuMapper.select_menu_list(menu)
         else:
             eos: List[SysMenu] = SysMenuMapper \
-            .select_menu_list_by_user_id(menu, user_id)
+                .select_menu_list_by_user_id(menu, user_id)
         return eos
-        
+
     @classmethod
     def select_menu_perms_by_user_id(cls, user_id:int) -> List[str]:
         '''
         根据用户ID,查询菜单权限列表
-        
+
         Args:
             user_id(int): 用户ID
-            
+
         Returns:
             List[str]: 菜单权限列表
         '''
@@ -64,15 +64,15 @@ class SysMenuService:
             if perm:
                 perm_set |= set(perm.strip().split(','))
         return list(perm_set)
-    
+
     @classmethod
     def select_menu_perms_by_role_id(cls, role_id:int) -> Set[str]:
         '''
         根据角色ID,查询菜单权限列表
-        
+
         Args:
             role_id(int): 角色ID
-            
+
         Returns:
             Set[str]: 菜单权限集合
         '''
@@ -87,10 +87,10 @@ class SysMenuService:
     def select_menu_tree_by_user_id(cls, user_id:int) -> List[SysMenu]:
         '''
         根据角色ID,查询菜单树
-        
+
         Args:
             user_id(int): 用户ID
-            
+
         Returns:
             List[SysMenu]: 菜单树
         '''
@@ -99,15 +99,15 @@ class SysMenuService:
         else:
             eos: List[SysMenu] = SysMenuMapper.select_menu_tree_by_user_id(user_id)
         return cls.get_child_perms(eos, 0)
-        
+
     @classmethod
     def select_menu_list_by_role_id(cls, role_id:int):
         '''
         根据角色ID,查询菜单列表
-        
+
         Args:
             role_id(int): 角色ID
-            
+
         Returns:
             List[SysMenu]: 菜单列表
         '''
@@ -118,10 +118,10 @@ class SysMenuService:
     def build_menus(cls, menus:List[SysMenu]):
         '''
         构建菜单
-        
+
         Args:
             menus(List[SysMenu]): 菜单列表
-            
+
         Returns:
             List[RouterVo]: 路由列表
         '''
@@ -131,12 +131,12 @@ class SysMenuService:
             rv.hidden = False if menu.visible == "0" else True
             rv.name = cls.get_route_name(menu)
             rv.path = cls.get_router_path(menu)
-            rv.component = cls.get_component(menu)            
+            rv.component = cls.get_component(menu)
             rv.query = menu.query
             rv.meta = RouterMetaVo(
-                title=menu.menu_name, 
-                icon=menu.icon, 
-                no_cache=True if menu.is_cache == "1" else False, 
+                title=menu.menu_name,
+                icon=menu.icon,
+                no_cache=True if menu.is_cache == "1" else False,
                 link=menu.path)
             menu_children = menu.children
             if menu_children and UserConstants.TYPE_DIR == menu.menu_type:
@@ -148,58 +148,77 @@ class SysMenuService:
                 rv_child = RouterVo()
                 rv_child.path = menu.path
                 rv_child.component = menu.component
-                rv_child.name = menu.path.capitalize()
+                rv_child.name = cls.path_to_component_name(menu.path)
                 rv_child.meta = RouterMetaVo(
-                    title=menu.menu_name, 
-                    icon=menu.icon, 
-                    no_cache=True if menu.is_cache == "1" else False, 
+                    title=menu.menu_name,
+                    icon=menu.icon,
+                    no_cache=True if menu.is_cache == "1" else False,
                     link=menu.path)
                 rv_children = [rv_child]
                 rv.children = rv_children
             elif menu.parent_id == 0 and cls.is_inner_link(menu):
                 rv.meta = RouterMetaVo(
-                    title=menu.menu_name, 
+                    title=menu.menu_name,
                     icon=menu.icon
                 )
                 rv.path = "/"
                 rv_child = RouterVo()
                 rv_child.path = cls.inner_link_replace_each(menu.path)
                 rv_child.component = UserConstants.INNER_LINK
-                rv_child.name = menu.path.capitalize()
+                rv_child.name = cls.path_to_component_name(menu.path)
                 rv_child.meta = RouterMetaVo(
-                    title=menu.menu_name, 
-                    icon=menu.icon, 
+                    title=menu.menu_name,
+                    icon=menu.icon,
                     link=menu.path
                 )
                 rv_children = [rv_child]
                 rv.children = rv_children
             routers.append(rv)
         return routers
-    
+
+    @classmethod
+    def path_to_component_name(cls, path: str) -> str:
+        '''
+        将path字段转换为组件名称(只将首字母大写)
+        path字段存储的是路由名称,不是组件路径
+        例如: recruitInfo -> RecruitInfo
+
+        Args:
+            path(str): 路由名称(path字段)
+
+        Returns:
+            str: 组件名称
+        '''
+        if not path:
+            return ""
+        # 只将首字母大写,保留其他字符不变(包括驼峰命名中的大写字母)
+        # 例如: recruitInfo -> RecruitInfo
+        return path[0].upper() + path[1:] if path else ""
+
     @classmethod
     def get_route_name(cls, menu: SysMenu) -> str:
         '''
         获取路由名称
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             str: 路由名称
         '''
         if cls.is_menu_frame(menu):
             return ""
         else:
-            return menu.path.capitalize()
-    
+            return cls.path_to_component_name(menu.path)
+
     @classmethod
     def get_router_path(cls, menu: SysMenu) -> str:
         '''
         获取路由路径
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             str: 路由路径
         '''
@@ -207,60 +226,60 @@ class SysMenuService:
         if menu.parent_id != 0 and cls.is_inner_link(menu):
             router_path = cls.inner_link_replace_each(router_path)
         if menu.parent_id == 0 and menu.menu_type == UserConstants.TYPE_DIR \
-            and UserConstants.NO_FRAME == menu.is_frame:
+                and UserConstants.NO_FRAME == menu.is_frame:
             router_path = "/" + menu.path
         elif cls.is_menu_frame(menu):
             router_path = "/"
         return router_path
-        
+
     @classmethod
     def is_menu_frame(cls, menu: SysMenu) -> bool:
         '''
         是否为菜单内部跳转
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             bool: 是否为菜单内部跳转
         '''
         return menu.parent_id == 0 and UserConstants.TYPE_MENU == menu.menu_type \
             and menu.is_frame == UserConstants.NO_FRAME
-    
+
     @classmethod
     def is_inner_link(cls, menu: SysMenu) -> bool:
         '''
         是否为内链
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             bool: 是否为内链
         '''
         return menu.is_frame == UserConstants.NO_FRAME and StringUtil.ishttp(menu.path)
-    
+
     @classmethod
     def is_parent_view(cls, menu: SysMenu) -> bool:
         '''
         是否为parent_view
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             bool: 是否为parent_view
         '''
         return menu.parent_id != 0 and UserConstants.TYPE_DIR == menu.menu_type
-       
+
     @classmethod
     def build_menu_tree(cls, menus:List[SysMenu]) -> List[SysMenu]:
         '''
         构建菜单树结构
-        
+
         Args:
             menus(List[SysMenu]): 菜单列表
-            
+
         Returns:
             List[SysMenu]: 菜单树结构
         '''
@@ -275,109 +294,109 @@ class SysMenuService:
         if not return_list:
             return_list = menus
         return return_list
-    
+
     @classmethod
     def build_menu_tree_select(cls, menus:List[SysMenu]):
         '''
         构建菜单下拉树结构
-        
+
         Args:
             menus(List[SysMenu]): 菜单列表
-            
+
         Returns:
             List[TreeSelect]: 菜单下拉树结构
         '''
         menu_tree = cls.build_menu_tree(menus)
         return list(map(TreeSelect.from_menu, menu_tree))
-    
+
     @classmethod
     def select_menu_by_id(cls, menu_id) -> Optional[SysMenu]:
         '''
         根据菜单ID,查询菜单信息
-        
+
         Args:
             menu_id(int): 菜单ID
-            
+
         Returns:
             Optional[SysMenu]: 菜单信息
         '''
         return SysMenuMapper.select_menu_by_id(menu_id)
-        
+
     @classmethod
     def has_child_by_menu_id(cls, menu_id) -> bool:
         '''
         判断是否有子节点
-        
+
         Args:
             menu_id(int): 菜单ID
-            
+
         Returns:
             bool: 是否有子节点
         '''
         num = SysMenuMapper.has_child_by_menu_id(menu_id)
         return num > 0
-    
+
     @classmethod
     def check_menu_exist_role(cls, menu_id:int) -> bool:
         '''
         查询菜单使用数量
-        
+
         Args:
             menu_id(int): 菜单ID
-            
+
         Returns:
             bool: 是否有使用
         '''
         num = SysRoleMenuMapper.check_menu_exist_role(menu_id)
         return num > 0
-    
+
     @classmethod
     def insert_menu(cls, menu:SysMenu) -> int:
         '''
         新增菜单
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             int: 新增菜单ID
         '''
         return SysMenuMapper.insert_menu(menu)
-    
+
     @classmethod
     def update_menu(cls, menu:SysMenu) -> int:
         '''
         修改菜单
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             int: 修改菜单的数量
         '''
         return SysMenuMapper.update_menu(menu)
-    
+
     @classmethod
     def delete_menu_by_id(cls, menu_id:int) -> int:
         '''
         根据菜单ID,删除菜单
-        
+
         Args:
             menu_id(int): 菜单ID
-            
+
         Returns:
             int: 删除菜单的数量
         '''
         return SysMenuMapper.delete_menu_by_id(menu_id)
-    
+
     @classmethod
     def check_menu_name_unique(cls, menu:SysMenu) -> Literal["0","1"]:
         '''
         校验菜单名称是否唯一
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             Literal["0","1"]: 是否唯一, 0-唯一, 1-不唯一
         '''
@@ -386,15 +405,15 @@ class SysMenuService:
             return UserConstants.Not_UNIQUE
         else:
             return UserConstants.UNIQUE
-    
+
     @classmethod
     def get_component(cls, menu: SysMenu) -> Literal['InnerLink','ParentView','Layout']:
         '''
         获取组件类型
-        
+
         Args:
             menu(SysMenu): 菜单信息
-            
+
         Returns:
             Literal['InnerLink','ParentView','Layout']: 组件类型
         '''
@@ -411,11 +430,11 @@ class SysMenuService:
     def get_child_perms(cls, menus:List[SysMenu], parent_id:int) -> List[SysMenu]:
         '''
         获取子菜单权限列表
-        
+
         Args:
             menus(List[SysMenu]): 菜单列表
             parent_id(int): 父菜单ID
-            
+
         Returns:
             List[SysMenu]: 子菜单列表
         '''
@@ -425,12 +444,12 @@ class SysMenuService:
                 cls.recursion_fn(menus, menu)
                 return_list.append(menu)
         return return_list
-    
+
     @classmethod
     def recursion_fn(cls, list:List[SysMenu], t:SysMenu):
         """
         递归菜单列表
-        
+
         Args:
             list(List[SysMenu]): 菜单列表
             t(SysMenu): 父菜单信息
@@ -445,11 +464,11 @@ class SysMenuService:
     def get_child_list(cls, list:List[SysMenu], t:SysMenu) -> List[SysMenu]:
         """
         子菜单列表
-        
+
         Args:
             list(List[SysMenu]): 菜单列表
             t(SysMenu): 父菜单信息
-            
+
         Returns:
             List[SysMenu]: 子菜单列表
         """
@@ -463,11 +482,11 @@ class SysMenuService:
     def has_child(cls, list:List[SysMenu], t:SysMenu) -> bool:
         """
         判断是否有子菜单
-        
+
         Args:
             list(List[SysMenu]): 菜单列表
             t(SysMenu): 父菜单信息
-            
+
         Returns:
             bool: 是否有子菜单
         """
@@ -475,15 +494,15 @@ class SysMenuService:
             if n.parent_id is not None and n.parent_id==t.menu_id:
                 return True
         return False
-    
+
     @classmethod
     def inner_link_replace_each(cls, path:str) -> str:
         '''
         内链域名特殊字符替换
-        
+
         Args:
             path(str): 路径
-            
+
         Returns:
             str: 路径
         '''