You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							223 lines
						
					
					
						
							7.7 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							223 lines
						
					
					
						
							7.7 KiB
						
					
					
				| from sqlalchemy import and_, delete, func, select, update | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from module_admin.entity.do.menu_do import SysMenu | |
| from module_admin.entity.do.role_do import SysRole, SysRoleMenu | |
| from module_admin.entity.do.user_do import SysUser, SysUserRole | |
| from module_admin.entity.vo.menu_vo import MenuModel, MenuQueryModel | |
| 
 | |
| 
 | |
| class MenuDao: | |
|     """ | |
|     菜单管理模块数据库操作层 | |
|     """ | |
| 
 | |
|     @classmethod | |
|     async def get_menu_detail_by_id(cls, db: AsyncSession, menu_id: int): | |
|         """ | |
|         根据菜单id获取菜单详细信息 | |
|  | |
|         :param db: orm对象 | |
|         :param menu_id: 菜单id | |
|         :return: 菜单信息对象 | |
|         """ | |
|         menu_info = (await db.execute(select(SysMenu).where(SysMenu.menu_id == menu_id))).scalars().first() | |
| 
 | |
|         return menu_info | |
| 
 | |
|     @classmethod | |
|     async def get_menu_detail_by_info(cls, db: AsyncSession, menu: MenuModel): | |
|         """ | |
|         根据菜单参数获取菜单信息 | |
|  | |
|         :param db: orm对象 | |
|         :param menu: 菜单参数对象 | |
|         :return: 菜单信息对象 | |
|         """ | |
|         menu_info = ( | |
|             ( | |
|                 await db.execute( | |
|                     select(SysMenu).where( | |
|                         SysMenu.parent_id == menu.parent_id if menu.parent_id else True, | |
|                         SysMenu.menu_name == menu.menu_name if menu.menu_name else True, | |
|                         SysMenu.menu_type == menu.menu_type if menu.menu_type else True, | |
|                     ) | |
|                 ) | |
|             ) | |
|             .scalars() | |
|             .first() | |
|         ) | |
| 
 | |
|         return menu_info | |
| 
 | |
|     @classmethod | |
|     async def get_menu_list_for_tree(cls, db: AsyncSession, user_id: int, role: list): | |
|         """ | |
|         根据角色信息获取所有在用菜单列表信息 | |
|  | |
|         :param db: orm对象 | |
|         :param user_id: 用户id | |
|         :param role: 用户角色列表信息 | |
|         :return: 菜单列表信息 | |
|         """ | |
|         role_id_list = [item.role_id for item in role] | |
|         if 1 in role_id_list: | |
|             menu_query_all = ( | |
|                 (await db.execute(select(SysMenu).where(SysMenu.status == '0').order_by(SysMenu.order_num).distinct())) | |
|                 .scalars() | |
|                 .all() | |
|             ) | |
|         else: | |
|             menu_query_all = ( | |
|                 ( | |
|                     await db.execute( | |
|                         select(SysMenu) | |
|                         .select_from(SysUser) | |
|                         .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) | |
|                         .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) | |
|                         .join( | |
|                             SysRole, | |
|                             and_( | |
|                                 SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0' | |
|                             ), | |
|                             isouter=True, | |
|                         ) | |
|                         .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) | |
|                         .join(SysMenu, and_(SysRoleMenu.menu_id == SysMenu.menu_id, SysMenu.status == '0')) | |
|                         .order_by(SysMenu.order_num) | |
|                         .distinct() | |
|                     ) | |
|                 ) | |
|                 .scalars() | |
|                 .all() | |
|             ) | |
| 
 | |
|         return menu_query_all | |
| 
 | |
|     @classmethod | |
|     async def get_menu_list(cls, db: AsyncSession, page_object: MenuQueryModel, user_id: int, role: list): | |
|         """ | |
|         根据查询参数获取菜单列表信息 | |
|  | |
|         :param db: orm对象 | |
|         :param page_object: 不分页查询参数对象 | |
|         :param user_id: 用户id | |
|         :param role: 用户角色列表 | |
|         :return: 菜单列表信息对象 | |
|         """ | |
|         role_id_list = [item.role_id for item in role] | |
|         if 1 in role_id_list: | |
|             menu_query_all = ( | |
|                 ( | |
|                     await db.execute( | |
|                         select(SysMenu) | |
|                         .where( | |
|                             SysMenu.status == page_object.status if page_object.status else True, | |
|                             SysMenu.menu_name.like(f'%{page_object.menu_name}%') if page_object.menu_name else True, | |
|                         ) | |
|                         .order_by(SysMenu.order_num) | |
|                         .distinct() | |
|                     ) | |
|                 ) | |
|                 .scalars() | |
|                 .all() | |
|             ) | |
|         else: | |
|             menu_query_all = ( | |
|                 ( | |
|                     await db.execute( | |
|                         select(SysMenu) | |
|                         .select_from(SysUser) | |
|                         .where(SysUser.status == '0', SysUser.del_flag == '0', SysUser.user_id == user_id) | |
|                         .join(SysUserRole, SysUser.user_id == SysUserRole.user_id, isouter=True) | |
|                         .join( | |
|                             SysRole, | |
|                             and_( | |
|                                 SysUserRole.role_id == SysRole.role_id, SysRole.status == '0', SysRole.del_flag == '0' | |
|                             ), | |
|                             isouter=True, | |
|                         ) | |
|                         .join(SysRoleMenu, SysRole.role_id == SysRoleMenu.role_id, isouter=True) | |
|                         .join( | |
|                             SysMenu, | |
|                             and_( | |
|                                 SysRoleMenu.menu_id == SysMenu.menu_id, | |
|                                 SysMenu.status == page_object.status if page_object.status else True, | |
|                                 SysMenu.menu_name.like(f'%{page_object.menu_name}%') if page_object.menu_name else True, | |
|                             ), | |
|                         ) | |
|                         .order_by(SysMenu.order_num) | |
|                         .distinct() | |
|                     ) | |
|                 ) | |
|                 .scalars() | |
|                 .all() | |
|             ) | |
| 
 | |
|         return menu_query_all | |
| 
 | |
|     @classmethod | |
|     async def add_menu_dao(cls, db: AsyncSession, menu: MenuModel): | |
|         """ | |
|         新增菜单数据库操作 | |
|  | |
|         :param db: orm对象 | |
|         :param menu: 菜单对象 | |
|         :return: | |
|         """ | |
|         db_menu = SysMenu(**menu.model_dump()) | |
|         db.add(db_menu) | |
|         await db.flush() | |
| 
 | |
|         return db_menu | |
| 
 | |
|     @classmethod | |
|     async def edit_menu_dao(cls, db: AsyncSession, menu: dict): | |
|         """ | |
|         编辑菜单数据库操作 | |
|  | |
|         :param db: orm对象 | |
|         :param menu: 需要更新的菜单字典 | |
|         :return: | |
|         """ | |
|         await db.execute(update(SysMenu), [menu]) | |
| 
 | |
|     @classmethod | |
|     async def delete_menu_dao(cls, db: AsyncSession, menu: MenuModel): | |
|         """ | |
|         删除菜单数据库操作 | |
|  | |
|         :param db: orm对象 | |
|         :param menu: 菜单对象 | |
|         :return: | |
|         """ | |
|         await db.execute(delete(SysMenu).where(SysMenu.menu_id.in_([menu.menu_id]))) | |
| 
 | |
|     @classmethod | |
|     async def has_child_by_menu_id_dao(cls, db: AsyncSession, menu_id: int): | |
|         """ | |
|         根据菜单id查询菜单关联子菜单的数量 | |
|  | |
|         :param db: orm对象 | |
|         :param menu_id: 菜单id | |
|         :return: 菜单关联子菜单的数量 | |
|         """ | |
|         menu_count = ( | |
|             await db.execute(select(func.count('*')).select_from(SysMenu).where(SysMenu.parent_id == menu_id)) | |
|         ).scalar() | |
| 
 | |
|         return menu_count | |
| 
 | |
|     @classmethod | |
|     async def check_menu_exist_role_dao(cls, db: AsyncSession, menu_id: int): | |
|         """ | |
|         根据菜单id查询菜单关联角色数量 | |
|  | |
|         :param db: orm对象 | |
|         :param menu_id: 菜单id | |
|         :return: 菜单关联角色数量 | |
|         """ | |
|         role_count = ( | |
|             await db.execute(select(func.count('*')).select_from(SysRoleMenu).where(SysRoleMenu.menu_id == menu_id)) | |
|         ).scalar() | |
| 
 | |
|         return role_count
 | |
| 
 |