This commit is contained in:
ktianc 2022-10-15 12:16:51 +08:00
commit ad279d7555
3 changed files with 42 additions and 35 deletions

View File

@ -128,25 +128,26 @@ class MenuDal(DalBase):
def __init__(self, db: AsyncSession): def __init__(self, db: AsyncSession):
super(MenuDal, self).__init__(db, models.VadminMenu, schemas.MenuSimpleOut) super(MenuDal, self).__init__(db, models.VadminMenu, schemas.MenuSimpleOut)
async def get_tree_list(self): async def get_tree_list(self, mode: int):
""" """
获取菜单树列表 1获取菜单树列表
2获取菜单树选择项添加/修改菜单时使用
3获取菜单树列表角色添加菜单权限时使用
""" """
sql = select(self.model) if mode == 3:
sql = select(self.model).where(self.model.disabled == 0, self.model.menu_type != "2")
else:
sql = select(self.model)
queryset = await self.db.execute(sql) queryset = await self.db.execute(sql)
menus = queryset.scalars().all() datas = queryset.scalars().all()
roots = filter(lambda i: not i.parent_id, menus) roots = filter(lambda i: not i.parent_id, datas)
return self.generate_tree_list(menus, roots) if mode == 1:
menus = self.generate_tree_list(datas, roots)
async def get_tree_options(self): elif mode == 2 or mode == 3:
""" menus = self.generate_tree_options(datas, roots)
获取菜单树选择项 else:
""" raise CustomException("获取菜单失败,无可用选项", code=400)
sql = select(self.model) return self.menus_order(menus)
queryset = await self.db.execute(sql)
menus = queryset.scalars().all()
roots = filter(lambda i: not i.parent_id, menus)
return self.generate_tree_options(menus, roots)
async def get_routers(self, user: models.VadminUser): async def get_routers(self, user: models.VadminUser):
""" """
@ -161,27 +162,20 @@ class MenuDal(DalBase):
} }
""" """
if any([i.is_admin for i in user.roles]): if any([i.is_admin for i in user.roles]):
sql = select(self.model).where(self.model.disabled == False, self.model.menu_type != "2") sql = select(self.model).where(self.model.disabled == 0, self.model.menu_type != "2")
queryset = await self.db.execute(sql) queryset = await self.db.execute(sql)
menus = queryset.scalars().all() datas = queryset.scalars().all()
else: else:
menus = set() datas = set()
for role in user.roles: for role in user.roles:
role_obj = await RoleDal(self.db).get_data(role.id, options=[models.VadminRole.menus]) role_obj = await RoleDal(self.db).get_data(role.id, options=[models.VadminRole.menus])
for menu in role_obj.menus: for menu in role_obj.menus:
# 该路由没有被禁用,并且菜单不是按钮 # 该路由没有被禁用,并且菜单不是按钮
if not menu.disabled and menu.menu_type != "2": if not menu.disabled and menu.menu_type != "2":
menus.add(menu) datas.add(menu)
roots = filter(lambda i: not i.parent_id, menus) roots = filter(lambda i: not i.parent_id, datas)
return self.generate_router_tree(menus, roots) menus = self.generate_router_tree(datas, roots)
return self.menus_order(menus)
async def get_treeselect(self):
"""获取菜单树列表,角色添加菜单权限时使用"""
sql = select(self.model).where(self.model.disabled == False, self.model.menu_type != "2")
queryset = await self.db.execute(sql)
menus = queryset.scalars().all()
roots = filter(lambda i: not i.parent_id, menus)
return self.generate_tree_options(menus, roots)
def generate_router_tree(self, menus: List[models.VadminMenu], nodes: filter) -> list: def generate_router_tree(self, menus: List[models.VadminMenu], nodes: filter) -> list:
""" """
@ -232,3 +226,15 @@ class MenuDal(DalBase):
router["children"] = self.generate_tree_options(menus, sons) router["children"] = self.generate_tree_options(menus, sons)
data.append(router) data.append(router)
return data return data
@classmethod
def menus_order(cls, datas: list, order: str = "order", children: str = "children"):
"""
菜单排序
"""
result = sorted(datas, key=lambda menu: menu[order])
for item in result:
if item[children]:
item[children] = sorted(item[children], key=lambda menu: menu[order])
return result

View File

@ -55,6 +55,7 @@ class RouterOut(BaseModel):
path: str path: str
redirect: Optional[str] = None redirect: Optional[str] = None
meta: Optional[Meta] = None meta: Optional[Meta] = None
order: Optional[int] = None
children: List['RouterOut'] = [] children: List['RouterOut'] = []
class Config: class Config:

View File

@ -118,19 +118,19 @@ async def get_role(data_id: int, auth: Auth = Depends(login_auth)):
########################################################### ###########################################################
@app.get("/menus/", summary="获取菜单列表") @app.get("/menus/", summary="获取菜单列表")
async def get_menus(auth: Auth = Depends(login_auth)): async def get_menus(auth: Auth = Depends(login_auth)):
datas = await crud.MenuDal(auth.db).get_tree_list() datas = await crud.MenuDal(auth.db).get_tree_list(mode=1)
return SuccessResponse(datas) return SuccessResponse(datas)
@app.get("/menus/tree/options/", summary="获取菜单树选择项") @app.get("/menus/tree/options/", summary="获取菜单树选择项,添加/修改菜单时使用")
async def get_menus_options(auth: Auth = Depends(login_auth)): async def get_menus_options(auth: Auth = Depends(login_auth)):
datas = await crud.MenuDal(auth.db).get_tree_options() datas = await crud.MenuDal(auth.db).get_tree_list(mode=2)
return SuccessResponse(datas) return SuccessResponse(datas)
@app.get("/menus/role/tree/options/", summary="获取菜单列表树信息,角色权限使用") @app.get("/menus/role/tree/options/", summary="获取菜单列表树信息,角色权限使用")
async def get_menus_treeselect(auth: Auth = Depends(login_auth)): async def get_menus_treeselect(auth: Auth = Depends(login_auth)):
return SuccessResponse(await crud.MenuDal(auth.db).get_treeselect()) return SuccessResponse(await crud.MenuDal(auth.db).get_tree_list(mode=3))
@app.post("/menus/", summary="创建菜单信息") @app.post("/menus/", summary="创建菜单信息")
@ -163,6 +163,6 @@ async def put_menus(data_id: int, auth: Auth = Depends(login_auth)):
@app.get("/role/menus/tree/{role_id}/", summary="获取菜单列表树信息以及角色菜单权限ID角色权限使用") @app.get("/role/menus/tree/{role_id}/", summary="获取菜单列表树信息以及角色菜单权限ID角色权限使用")
async def get_role_menu_tree(role_id: int, auth: Auth = Depends(login_auth)): async def get_role_menu_tree(role_id: int, auth: Auth = Depends(login_auth)):
treeselect = await crud.MenuDal(auth.db).get_treeselect() treeselect = await crud.MenuDal(auth.db).get_tree_list(mode=3)
role_menu_tree = await crud.RoleDal(auth.db).get_role_menu_tree(role_id) role_menu_tree = await crud.RoleDal(auth.db).get_role_menu_tree(role_id)
return SuccessResponse({"role_menu_tree": role_menu_tree, "menus": treeselect}) return SuccessResponse({"role_menu_tree": role_menu_tree, "menus": treeselect})