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.

215 lines
7.6 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