menu.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """运营端菜单接口"""
  2. from typing import Optional
  3. from fastapi import APIRouter, Depends
  4. from sqlalchemy.orm import Session
  5. from sqlalchemy import asc
  6. from app.core.database import get_db
  7. from app.core.auth import get_current_user
  8. from app.core.response import success_response
  9. from app.models.models import SysMenu
  10. router = APIRouter(prefix="/web/menu", tags=["菜单管理"])
  11. def build_menu_tree(menus: list[SysMenu]) -> list[dict]:
  12. """将扁平菜单列表构建为树形结构"""
  13. menu_map = {}
  14. for menu in menus:
  15. menu_dict = {
  16. "id": menu.id,
  17. "name": menu.code,
  18. "code": menu.code,
  19. "path": menu.path,
  20. "component": menu.component or "/index/index",
  21. "icon": menu.icon,
  22. "parentId": menu.parent_id,
  23. "sortOrder": menu.sort_order,
  24. "redirect": menu.redirect,
  25. "menuType": menu.menu_type,
  26. "isVisible": bool(menu.is_visible),
  27. "isCache": bool(menu.is_cache),
  28. "isActive": bool(menu.is_active),
  29. "meta": {
  30. "title": menu.name,
  31. "icon": menu.icon,
  32. "keepAlive": bool(menu.is_cache),
  33. },
  34. "children": []
  35. }
  36. menu_map[menu.id] = menu_dict
  37. root_menus = []
  38. for menu in menus:
  39. if menu.parent_id and menu.parent_id in menu_map:
  40. menu_map[menu.parent_id]["children"].append(menu_map[menu.id])
  41. elif not menu.parent_id:
  42. root_menus.append(menu_map[menu.id])
  43. # 按 sort_order 排序
  44. def sort_children(item: dict):
  45. item["children"] = sorted(item["children"], key=lambda x: x["sortOrder"])
  46. for child in item["children"]:
  47. sort_children(child)
  48. root_menus = sorted(root_menus, key=lambda x: x["sortOrder"])
  49. for item in root_menus:
  50. sort_children(item)
  51. return root_menus
  52. @router.get("/list")
  53. async def get_menu_list(
  54. db: Session = Depends(get_db),
  55. current_user: dict = Depends(get_current_user)
  56. ):
  57. """
  58. 获取菜单列表(从 sys_menu 表读取,构建树形结构)
  59. """
  60. menus = (
  61. db.query(SysMenu)
  62. .filter(
  63. SysMenu.is_del == 0,
  64. SysMenu.is_active == 1,
  65. SysMenu.is_visible == 1,
  66. )
  67. .order_by(asc(SysMenu.sort_order))
  68. .all()
  69. )
  70. menu_tree = build_menu_tree(menus)
  71. return success_response({
  72. "menuList": menu_tree
  73. })