From 5566e6693bc1540c531a04d7dad8bffd2224b090 Mon Sep 17 00:00:00 2001 From: zy7y <13271962515@163.com> Date: Mon, 19 Sep 2022 18:02:37 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=AE=8C=E6=88=90=E6=89=80?= =?UTF-8?q?=E6=9C=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controller/menu.py | 10 +- backend/controller/role.py | 3 +- backend/core/security.py | 2 +- backend/dbhelper/menu.py | 2 +- backend/dbhelper/role.py | 5 +- backend/dbhelper/user.py | 16 +- backend/mini.db | Bin 0 -> 4096 bytes backend/mini.db-shm | Bin 0 -> 32768 bytes backend/mini.db-wal | Bin 0 -> 622152 bytes backend/models/menu.py | 4 +- backend/router/url.py | 1 - backend/schemas/menu.py | 4 +- backend/tests/test_case.py | 46 +++--- .../layout/{layout-header.vue => header.vue} | 2 +- .../layout-info.vue => right/info.vue} | 2 +- .../{layout-info => right}/select-role.vue | 22 ++- frontend/src/components/layout/sider-menu.vue | 4 +- frontend/src/components/table/conf.js | 16 -- frontend/src/components/table/table.vue | 7 +- frontend/src/router/index.js | 16 +- frontend/src/utils/index.js | 9 ++ frontend/src/views/error/back.vue | 14 ++ .../about.vue => dashboard/index/index.vue} | 0 frontend/src/views/main/main.vue | 4 +- frontend/src/views/main/system/menu/conf.js | 55 ++++++- .../src/views/main/system/menu/menu-modal.vue | 148 +++++++++++++++++- frontend/src/views/main/system/menu/menu.vue | 33 +++- .../src/views/main/system/role/role-modal.vue | 7 +- frontend/src/views/main/system/role/role.vue | 6 +- .../src/views/main/system/user/user-modal.vue | 15 +- frontend/src/views/main/system/user/user.vue | 7 +- frontend/src/views/main/test/debug/debug.vue | 7 + 32 files changed, 343 insertions(+), 124 deletions(-) create mode 100644 backend/mini.db create mode 100644 backend/mini.db-shm create mode 100644 backend/mini.db-wal rename frontend/src/components/layout/{layout-header.vue => header.vue} (93%) rename frontend/src/components/layout/{layout-info/layout-info.vue => right/info.vue} (96%) rename frontend/src/components/layout/{layout-info => right}/select-role.vue (80%) create mode 100644 frontend/src/views/error/back.vue rename frontend/src/views/main/{setting/about/about.vue => dashboard/index/index.vue} (100%) create mode 100644 frontend/src/views/main/test/debug/debug.vue diff --git a/backend/controller/menu.py b/backend/controller/menu.py index 09080c7..bb9fc4a 100644 --- a/backend/controller/menu.py +++ b/backend/controller/menu.py @@ -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() diff --git a/backend/controller/role.py b/backend/controller/role.py index 0dea596..dc68144 100644 --- a/backend/controller/role.py +++ b/backend/controller/role.py @@ -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: diff --git a/backend/core/security.py b/backend/core/security.py index a8cd394..0237c06 100644 --- a/backend/core/security.py +++ b/backend/core/security.py @@ -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: diff --git a/backend/dbhelper/menu.py b/backend/dbhelper/menu.py index 952d8cd..aae779d 100644 --- a/backend/dbhelper/menu.py +++ b/backend/dbhelper/menu.py @@ -45,7 +45,7 @@ async def get_menu(kwargs): async def del_menu(mid: int): - """删除用户""" + """删除菜单""" return await MenuModel.filter(id=mid).update(status=9) diff --git a/backend/dbhelper/role.py b/backend/dbhelper/role.py index 3ab6e98..1124346 100644 --- a/backend/dbhelper/role.py +++ b/backend/dbhelper/role.py @@ -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], ) diff --git a/backend/dbhelper/user.py b/backend/dbhelper/user.py index cc193f1..741c8cf 100644 --- a/backend/dbhelper/user.py +++ b/backend/dbhelper/user.py @@ -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) diff --git a/backend/mini.db b/backend/mini.db new file mode 100644 index 0000000000000000000000000000000000000000..e2a2455a104f1cf6a5d6b143f3ac8831aaaf3ab5 GIT binary patch literal 4096 zcmWFz^vNtqRY=P(%1ta$FlG>7U}9o$P*7lCU|@t|AVoG{WYF`k83r literal 0 HcmV?d00001 diff --git a/backend/mini.db-shm b/backend/mini.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..975cdd3a0fcb8a3e0d7f6d326758d7957a97d586 GIT binary patch literal 32768 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 Ig!2ggKTHEVDF6Tf literal 0 HcmV?d00001 diff --git a/backend/models/menu.py b/backend/models/menu.py index e36676f..67e5176 100644 --- a/backend/models/menu.py +++ b/backend/models/menu.py @@ -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) diff --git a/backend/router/url.py b/backend/router/url.py index 9f6b037..77d92a1 100644 --- a/backend/router/url.py +++ b/backend/router/url.py @@ -121,7 +121,6 @@ class Route(routing.APIRoute): has_perm = {"dependencies": [Depends(check_permissions)]} -has_perm = {} routes = [ Route.post("/login", endpoint=login, tags=["公共"], summary="登录"), diff --git a/backend/schemas/menu.py b/backend/schemas/menu.py index 0f43829..aa80d75 100644 --- a/backend/schemas/menu.py +++ b/backend/schemas/menu.py @@ -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="前端组件地址") diff --git a/backend/tests/test_case.py b/backend/tests/test_case.py index 359fb31..05e97a2 100644 --- a/backend/tests/test_case.py +++ b/backend/tests/test_case.py @@ -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)], ), diff --git a/frontend/src/components/layout/layout-header.vue b/frontend/src/components/layout/header.vue similarity index 93% rename from frontend/src/components/layout/layout-header.vue rename to frontend/src/components/layout/header.vue index d6d8c14..3d19fac 100644 --- a/frontend/src/components/layout/layout-header.vue +++ b/frontend/src/components/layout/header.vue @@ -1,6 +1,6 @@