feat:完成所有功能

This commit is contained in:
zy7y
2022-09-19 18:02:37 +08:00
parent 7b1d87aa65
commit 5566e6693b
32 changed files with 343 additions and 124 deletions

View File

@@ -1,5 +1,5 @@
from core.utils import list_to_tree
from dbhelper.menu import del_menu, get_tree_menu, insert_menu, put_menu
from dbhelper.menu import del_menu, get_menu, get_tree_menu, insert_menu, put_menu
from schemas import MenuIn, MenuRead, Response
@@ -9,10 +9,16 @@ async def menu_add(data: MenuIn) -> Response[MenuRead]:
async def menu_arr() -> Response:
menus = await get_tree_menu()
return Response(data=list_to_tree(menus))
try:
data = list_to_tree(menus)
except KeyError:
return Response(code=400, msg="菜单根节点丢失")
return Response(data=data)
async def menu_del(pk: int) -> Response:
if await get_menu({"pid": pk}) is not None:
return Response(code=400, msg="请先删除子节点")
if await del_menu(pk) == 0:
return Response(code=400, msg="菜单不存在")
return Response()

View File

@@ -26,8 +26,7 @@ async def role_has_menu(rid: int):
rid: 角色ID
"""
menus = await get_role_menus(rid)
for obj in menus:
obj["meta"] = json.loads(obj["meta"]) if obj["meta"] is not None else None
try:
result = list_to_tree(menus)
except KeyError:

View File

@@ -70,7 +70,7 @@ async def check_permissions(request: Request, user: UserModel = Depends(check_to
result = await get_user_info(user)
active_rid = result["roles"][0]["id"]
# 白名单
# 白名单 登录用户信息, 登录用户菜单信息
whitelist = [f"/user/{user.id}", f"/role/{active_rid}/menu"]
flag = request.url.path in whitelist and request.method == "GET"
if flag:

View File

@@ -45,7 +45,7 @@ async def get_menu(kwargs):
async def del_menu(mid: int):
"""删除用户"""
"""删除菜单"""
return await MenuModel.filter(id=mid).update(status=9)

View File

@@ -9,11 +9,12 @@ async def get_role_menus(rid: int):
根据角色id 获取菜单
"""
db = connections.get("default")
# asc 降序
return await db.execute_query_dict(
"""
select m.id, m.name, m.meta, m.path, m.type, m.component, m.pid, m.identifier, m.api, m.method
select m.id, m.name, m.icon, m.path, m.type, m.component, m.pid, m.identifier, m.api, m.method
FROM sys_menu as m, sys_role_menu WHERE m.id = sys_role_menu.mid
AND sys_role_menu.rid = (?) AND sys_role_menu.`status` = 1""",
AND sys_role_menu.rid = (?) AND sys_role_menu.`status` = 1 order by m.id asc""",
[rid],
)

View File

@@ -31,7 +31,6 @@ async def get_user_info(user: UserModel):
""",
[user.id],
)
return {
**jsonable_encoder(user),
"roles": sql_result,
@@ -81,9 +80,9 @@ async def put_user(uid: int, data: UserPut):
"""更新用户"""
from core.security import get_password_hash
roles = data.roles
rids = data.roles
del data.roles
for role in roles:
for role in rids:
if await get_role({"id": role.rid, "status__not": 9}) is None:
return role.rid
# 更新用户
@@ -104,13 +103,12 @@ async def put_user(uid: int, data: UserPut):
""",
[uid],
)
print(has_roles)
# 2. 将先有的数据标记 删除
[
await db.execute_query_dict(
"""
update sys_user_role set status = 9 where rid = (?)
update sys_user_role set status = 9 where rid = (?)
""",
[role["id"]],
)
@@ -119,11 +117,13 @@ async def put_user(uid: int, data: UserPut):
# 2. 新增次此更新的数据
await UserRoleModel.bulk_create(
[UserRoleModel(uid=uid, **role.dict()) for role in roles]
[UserRoleModel(uid=uid, **role.dict()) for role in rids]
)
async def select_role(uid: int, rid: int):
"""用户切换角色"""
await UserRoleModel.filter(uid=uid, rid__not=rid).update(status=1)
return await UserRoleModel.filter(uid=uid, rid=rid).update(status=5)
# 1.将用户id 未删除角色状态置为正常 1 除切换角色id
await UserRoleModel.filter(uid=uid, rid__not=rid, status__not=9).update(status=1)
# 2.将用户id 角色id 和当前角色匹配的数据置为选中
return await UserRoleModel.filter(uid=uid, rid=rid, status__not=9).update(status=5)

BIN
backend/mini.db Normal file

Binary file not shown.

BIN
backend/mini.db-shm Normal file

Binary file not shown.

BIN
backend/mini.db-wal Normal file

Binary file not shown.

View File

@@ -7,9 +7,9 @@ class MenuModel(Table):
"""
name = fields.CharField(max_length=20, description="名称", null=True)
meta = fields.JSONField(description="元数据信息", null=True)
icon = fields.CharField(max_length=100, description="菜单图标", null=True)
path = fields.CharField(max_length=128, description="菜单url", null=True)
type = fields.SmallIntField(description="菜单类型 0目录 1组件 2按钮")
type = fields.SmallIntField(description="菜单类型 0目录 1组件 2按钮 3数据")
component = fields.CharField(max_length=128, description="组件地址", null=True)
pid = fields.IntField(description="父id", null=True)
identifier = fields.CharField(max_length=30, description="权限标识 user:add", null=True)

View File

@@ -121,7 +121,6 @@ class Route(routing.APIRoute):
has_perm = {"dependencies": [Depends(check_permissions)]}
has_perm = {}
routes = [
Route.post("/login", endpoint=login, tags=["公共"], summary="登录"),

View File

@@ -6,8 +6,8 @@ from schemas.common import ReadBase
class MenuBasic(BaseModel):
name: str
meta: dict = Field(default=None, description="元信息")
name: str = Field(..., description="菜单名称")
icon: str = Field(default=None, description="菜单图标")
path: Optional[str] = Field(default=None, description="前端路由地址")
type: int = Field(description="0 目录 1 组件 2 按钮 3数据")
component: Optional[str] = Field(default=None, description="前端组件地址")

View File

@@ -13,29 +13,21 @@ dirs = [
(
"/menu",
MenuIn( # id 1
name="系统管理",
meta={"icon": "AppstoreOutlined"},
path="/system",
name="系统面板",
icon="DashboardOutlined",
path="/dashboard",
type=0,
component=None,
pid=0,
identifier=None,
api=None,
method=None,
).dict(),
),
(
"/menu",
MenuIn( # id 2
name="系统设置",
meta={"icon": "SettingOutlined"},
name="系统管理",
icon="AppstoreOutlined",
path="/system",
type=0,
component=None,
pid=0,
identifier=None,
api=None,
method=None,
).dict(),
),
]
@@ -54,44 +46,44 @@ menus = [
"/menu",
MenuIn( # id 3
name="用户管理",
meta={"icon": "TeamOutlined", "title": "用户管理"},
icon="TeamOutlined",
path="/system/user",
type=1,
component="/system/user/user.vue",
pid=1,
pid=2,
).dict(),
),
(
"/menu",
MenuIn( # id 4
name="角色管理",
meta={"icon": "UserOutlined", "title": "角色管理"},
icon="UserOutlined",
path="/system/role",
type=1,
component="/system/role/role.vue",
pid=1,
pid=2,
).dict(),
),
(
"/menu",
MenuIn( # id 5
name="菜单管理",
meta={"icon": "MenuOutlined", "title": "菜单管理"},
icon="MenuOutlined",
path="/system/menu",
type=1,
component="/system/menu/menu.vue",
pid=1,
pid=2,
).dict(),
),
(
"/menu",
MenuIn( # id 6
name="关于",
meta={"icon": "DashboardOutlined", "title": "关于"},
path="/setting/about",
name="数据面板",
icon="AreaChartOutlined",
path="/dashboard/index",
type=1,
component="/setting/about/about.vue",
pid=2,
component="/dashboard/index/index.vue",
pid=1,
).dict(),
),
]
@@ -174,7 +166,6 @@ role_manager_pre = [
),
MenuIn(
name="角色查询",
meta={"icon": "Search"},
type=2,
identifier="role:query",
api="/role/query",
@@ -260,13 +251,14 @@ menus_len = (
+ len(dirs)
+ len(role_manager_pre)
+ len(menu_manager_pre)
+ 1
)
datas = [
(
"/role",
RoleIn(
name="superStar",
name="超管",
remark="全部权限",
menus=[num for num in range(1, menus_len)],
),
@@ -276,7 +268,7 @@ datas = [
"/user",
UserAdd(
username="admin",
nickname="666管理员",
nickname="乐师高渐离",
password="123456",
roles=[RoleActive(rid=1, status=5)],
),