From aefb93b39900e4099e22cb378e203a2000a06eee Mon Sep 17 00:00:00 2001 From: zy7y <13271962515@163.com> Date: Sun, 18 Sep 2022 15:01:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=8F=9C=E5=8D=95=E6=A0=91=E7=BC=BA?= =?UTF-8?q?=E5=B0=91=E6=A0=B9=E8=8A=82=E7=82=B9=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controller/role.py | 16 +- backend/controller/user.py | 11 +- backend/core/security.py | 4 +- backend/dbhelper/menu.py | 12 -- backend/mini.db | Bin 0 -> 69632 bytes backend/router/url.py | 21 +- backend/schemas/menu.py | 2 +- backend/tests/test_case.py | 393 ++++++++++++++++++------------------- 8 files changed, 232 insertions(+), 227 deletions(-) create mode 100644 backend/mini.db diff --git a/backend/controller/role.py b/backend/controller/role.py index 5084400..0dea596 100644 --- a/backend/controller/role.py +++ b/backend/controller/role.py @@ -4,8 +4,14 @@ from fastapi import Query from core.utils import list_to_tree from dbhelper.menu import get_menu -from dbhelper.role import (del_role, get_role, get_role_menus, get_roles, - new_role, put_role) +from dbhelper.role import ( + del_role, + get_role, + get_role_menus, + get_roles, + new_role, + put_role, +) from schemas import ListAll, Response, RoleIn, RoleInfo, RoleQuery, RoleRead @@ -22,7 +28,11 @@ async def role_has_menu(rid: int): menus = await get_role_menus(rid) for obj in menus: obj["meta"] = json.loads(obj["meta"]) if obj["meta"] is not None else None - return Response(data=list_to_tree(menus)) + try: + result = list_to_tree(menus) + except KeyError: + return Response(code=400, msg="菜单缺少根节点.") + return Response(data=result) async def role_arr( diff --git a/backend/controller/user.py b/backend/controller/user.py index 7283737..5f0ca22 100644 --- a/backend/controller/user.py +++ b/backend/controller/user.py @@ -2,8 +2,15 @@ from fastapi import Depends, Query from starlette.requests import Request from core.security import check_token, get_password_hash -from dbhelper.user import (del_user, get_user, get_user_info, get_users, - insert_user, put_user, select_role) +from dbhelper.user import ( + del_user, + get_user, + get_user_info, + get_users, + insert_user, + put_user, + select_role, +) from schemas import Response, UserAdd, UserInfo, UserPut, UserQuery, UserRead from schemas.common import ListAll diff --git a/backend/core/security.py b/backend/core/security.py index 8492817..a8cd394 100644 --- a/backend/core/security.py +++ b/backend/core/security.py @@ -7,7 +7,7 @@ from jose import JWTError, jwt from passlib.context import CryptContext from core.exceptions import PermissionsError, TokenAuthFailure -from dbhelper.menu import get_apis, get_has_api +from dbhelper.menu import get_apis from dbhelper.user import get_user, get_user_info from models import UserModel @@ -79,8 +79,6 @@ async def check_permissions(request: Request, user: UserModel = Depends(check_to api = request.url.path for k, v in request.path_params.items(): api = api.replace(v, "{%s}" % k) - # 方法1. 每一次去查数据库 - # result = await get_has_api(active_rid, api, request.method) # 2. 登录之后查一次 后面去结果查 todo 更新权限时需要更新 , 最好结果放redis cache_key = f"{user.username}_{active_rid}" diff --git a/backend/dbhelper/menu.py b/backend/dbhelper/menu.py index 5369052..952d8cd 100644 --- a/backend/dbhelper/menu.py +++ b/backend/dbhelper/menu.py @@ -49,18 +49,6 @@ async def del_menu(mid: int): return await MenuModel.filter(id=mid).update(status=9) -async def get_has_api(pk: int, api: str, method: str): - """获取角色接口权限 每次来查数据库""" - db = connections.get("default") - return await db.execute_query_dict( - """ - select m.api, m.method - FROM sys_menu as m, sys_role_menu as srm WHERE m.id = srm.mid - AND srm.rid = (?) and m.api = (?) and m.method = (?) and m.status != 9""", - [pk, api, method], - ) - - async def get_apis(pk: int): """返回当前角色拥有的接口权限列表""" db = connections.get("default") diff --git a/backend/mini.db b/backend/mini.db new file mode 100644 index 0000000000000000000000000000000000000000..0ce5d528ea2d6810e27e089d3d91d4e81db83f47 GIT binary patch literal 69632 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 U++G+Q7Z&s-xV