新增菜单路由排序功能
This commit is contained in:
parent
3f7e96e9b1
commit
36615163b7
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user