menu.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """菜单 / 权限 CRUD"""
  2. from typing import List, Set
  3. from sqlalchemy.orm import Session
  4. from app.models.system import SysMenu, SysRoleMenu
  5. def list_menu_codes_for_role(db: Session, role_id: str) -> List[str]:
  6. rows = (
  7. db.query(SysMenu.menu_code)
  8. .join(SysRoleMenu, SysRoleMenu.menu_id == SysMenu.id)
  9. .filter(
  10. SysRoleMenu.role_id == role_id,
  11. SysMenu.del_flag == "0",
  12. )
  13. .all()
  14. )
  15. return [r[0] for r in rows]
  16. def list_page_menus_for_role(db: Session, role_id: str) -> List[SysMenu]:
  17. """角色可见的目录/菜单(M/C),按 sort 升序。"""
  18. return (
  19. db.query(SysMenu)
  20. .join(SysRoleMenu, SysRoleMenu.menu_id == SysMenu.id)
  21. .filter(
  22. SysRoleMenu.role_id == role_id,
  23. SysMenu.del_flag == "0",
  24. SysMenu.menu_type.in_(("M", "C")),
  25. SysMenu.visible == "1",
  26. )
  27. .order_by(SysMenu.sort.asc())
  28. .all()
  29. )
  30. def list_all_menus(db: Session) -> List[SysMenu]:
  31. """全量菜单(含按钮),授权页勾选用。"""
  32. return (
  33. db.query(SysMenu)
  34. .filter(SysMenu.del_flag == "0")
  35. .order_by(SysMenu.sort.asc())
  36. .all()
  37. )
  38. def role_has_any_menu_code(db: Session, role_id: str, codes: Set[str]) -> bool:
  39. if not codes:
  40. return False
  41. owned = set(list_menu_codes_for_role(db, role_id))
  42. return bool(owned & codes)