新增菜单路由排序功能

This commit is contained in:
ktianc 2022-10-14 15:29:53 +08:00
parent 3f7e96e9b1
commit 36615163b7
3 changed files with 42 additions and 35 deletions

View File

@ -128,25 +128,26 @@ class MenuDal(DalBase):
def __init__(self, db: AsyncSession):
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获取菜单树列表角色添加菜单权限时使用
"""
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)
menus = queryset.scalars().all()
roots = filter(lambda i: not i.parent_id, menus)
return self.generate_tree_list(menus, roots)
async def get_tree_options(self):
"""
获取菜单树选择项
"""
sql = select(self.model)
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)
datas = queryset.scalars().all()
roots = filter(lambda i: not i.parent_id, datas)
if mode == 1:
menus = self.generate_tree_list(datas, roots)
elif mode == 2 or mode == 3:
menus = self.generate_tree_options(datas, roots)
else:
raise CustomException("获取菜单失败,无可用选项", code=400)
return self.menus_order(menus)
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]):
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)
menus = queryset.scalars().all()
datas = queryset.scalars().all()
else:
menus = set()
datas = set()
for role in user.roles:
role_obj = await RoleDal(self.db).get_data(role.id, options=[models.VadminRole.menus])
for menu in role_obj.menus:
# 该路由没有被禁用,并且菜单不是按钮
if not menu.disabled and menu.menu_type != "2":
menus.add(menu)
roots = filter(lambda i: not i.parent_id, menus)
return self.generate_router_tree(menus, roots)
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)
datas.add(menu)
roots = filter(lambda i: not i.parent_id, datas)
menus = self.generate_router_tree(datas, roots)
return self.menus_order(menus)
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)
data.append(router)
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
redirect: Optional[str] = None
meta: Optional[Meta] = None
order: Optional[int] = None
children: List['RouterOut'] = []
class Config:

View File

@ -118,19 +118,19 @@ async def get_role(data_id: int, auth: Auth = Depends(login_auth)):
###########################################################
@app.get("/menus/", summary="获取菜单列表")
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)
@app.get("/menus/tree/options/", summary="获取菜单树选择项")
@app.get("/menus/tree/options/", summary="获取菜单树选择项,添加/修改菜单时使用")
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)
@app.get("/menus/role/tree/options/", summary="获取菜单列表树信息,角色权限使用")
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="创建菜单信息")
@ -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角色权限使用")
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)
return SuccessResponse({"role_menu_tree": role_menu_tree, "menus": treeselect})