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.
		
		
		
		
			
				
					224 lines
				
				7.7 KiB
			
		
		
			
		
	
	
					224 lines
				
				7.7 KiB
			| 
								 
											1 year ago
										 
									 | 
							
								from sqlalchemy import and_, delete, func, select, update
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								from sqlalchemy.ext.asyncio import AsyncSession
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								from module_admin.entity.do.menu_do import SysMenu
							 | 
						||
| 
								 | 
							
								from module_admin.entity.do.role_do import SysRole, SysRoleMenu
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								from module_admin.entity.do.user_do import SysUser, SysUserRole
							 | 
						||
| 
								 | 
							
								from module_admin.entity.vo.menu_vo import MenuModel, MenuQueryModel
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MenuDao:
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    菜单管理模块数据库操作层
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def get_menu_detail_by_id(cls, db: AsyncSession, menu_id: int):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据菜单id获取菜单详细信息
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu_id: 菜单id
							 | 
						||
| 
								 | 
							
								        :return: 菜单信息对象
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        menu_info = (await db.execute(select(SysMenu).where(SysMenu.menu_id == menu_id))).scalars().first()
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return menu_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def get_menu_detail_by_info(cls, db: AsyncSession, menu: MenuModel):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据菜单参数获取菜单信息
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu: 菜单参数对象
							 | 
						||
| 
								 | 
							
								        :return: 菜单信息对象
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        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()
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return menu_info
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def get_menu_list_for_tree(cls, db: AsyncSession, user_id: int, role: list):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据角色信息获取所有在用菜单列表信息
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :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:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            menu_query_all = (
							 | 
						||
| 
								 | 
							
								                (await db.execute(select(SysMenu).where(SysMenu.status == '0').order_by(SysMenu.order_num).distinct()))
							 | 
						||
| 
								 | 
							
								                .scalars()
							 | 
						||
| 
								 | 
							
								                .all()
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        else:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            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()
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return menu_query_all
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def get_menu_list(cls, db: AsyncSession, page_object: MenuQueryModel, user_id: int, role: list):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据查询参数获取菜单列表信息
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :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:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            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()
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        else:
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								            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()
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return menu_query_all
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def add_menu_dao(cls, db: AsyncSession, menu: MenuModel):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        新增菜单数据库操作
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu: 菜单对象
							 | 
						||
| 
								 | 
							
								        :return:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        db_menu = SysMenu(**menu.model_dump())
							 | 
						||
| 
								 | 
							
								        db.add(db_menu)
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        await db.flush()
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return db_menu
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def edit_menu_dao(cls, db: AsyncSession, menu: dict):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        编辑菜单数据库操作
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu: 需要更新的菜单字典
							 | 
						||
| 
								 | 
							
								        :return:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        await db.execute(update(SysMenu), [menu])
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								    async def delete_menu_dao(cls, db: AsyncSession, menu: MenuModel):
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        删除菜单数据库操作
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											2 years ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu: 菜单对象
							 | 
						||
| 
								 | 
							
								        :return:
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        await db.execute(delete(SysMenu).where(SysMenu.menu_id.in_([menu.menu_id])))
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    async def has_child_by_menu_id_dao(cls, db: AsyncSession, menu_id: int):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据菜单id查询菜单关联子菜单的数量
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu_id: 菜单id
							 | 
						||
| 
								 | 
							
								        :return: 菜单关联子菜单的数量
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        menu_count = (
							 | 
						||
| 
								 | 
							
								            await db.execute(select(func.count('*')).select_from(SysMenu).where(SysMenu.parent_id == menu_id))
							 | 
						||
| 
								 | 
							
								        ).scalar()
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return menu_count
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    async def check_menu_exist_role_dao(cls, db: AsyncSession, menu_id: int):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        根据菜单id查询菜单关联角色数量
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        :param db: orm对象
							 | 
						||
| 
								 | 
							
								        :param menu_id: 菜单id
							 | 
						||
| 
								 | 
							
								        :return: 菜单关联角色数量
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								        role_count = (
							 | 
						||
| 
								 | 
							
								            await db.execute(select(func.count('*')).select_from(SysRoleMenu).where(SysRoleMenu.menu_id == menu_id))
							 | 
						||
| 
								 | 
							
								        ).scalar()
							 | 
						||
| 
								 
											1 year ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								        return role_count
							 |