From d498969400e000cb862285646705fe7d9b1575e3 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Thu, 15 Jun 2023 17:25:54 +0800 Subject: [PATCH] The level field is deprecated but remained (#134) --- backend/app/api/v1/auth/auth.py | 1 - backend/app/api/v1/dept.py | 1 + backend/app/common/exception/exception_handler.py | 1 + backend/app/common/jwt.py | 1 - backend/app/crud/crud_dept.py | 11 +++++++---- backend/app/crud/crud_menu.py | 7 ++++--- backend/app/middleware/jwt_auth_middleware.py | 5 +---- backend/app/middleware/opera_log_middleware.py | 2 +- backend/app/schemas/dept.py | 1 - backend/app/services/dept_service.py | 14 ++++++++++---- backend/app/services/menu_service.py | 14 ++++++++++---- 11 files changed, 35 insertions(+), 23 deletions(-) diff --git a/backend/app/api/v1/auth/auth.py b/backend/app/api/v1/auth/auth.py index 5652291b..503ce14b 100644 --- a/backend/app/api/v1/auth/auth.py +++ b/backend/app/api/v1/auth/auth.py @@ -7,7 +7,6 @@ from fastapi.security import OAuth2PasswordRequestForm from fastapi_limiter.depends import RateLimiter from starlette.background import BackgroundTasks -from backend.app.common.casbin_rbac import DependsRBAC from backend.app.common.jwt import DependsJwtAuth from backend.app.common.response.response_schema import response_base from backend.app.schemas.token import GetLoginToken, GetSwaggerToken, GetNewToken diff --git a/backend/app/api/v1/dept.py b/backend/app/api/v1/dept.py index 6735d91b..f00d7834 100644 --- a/backend/app/api/v1/dept.py +++ b/backend/app/api/v1/dept.py @@ -22,6 +22,7 @@ async def get_dept(pk: int): @router.get('', summary='获取所有部门展示树', dependencies=[DependsRBAC]) async def get_all_depts( + level: Annotated[int | None, Query()] = None, name: Annotated[str | None, Query()] = None, leader: Annotated[str | None, Query()] = None, phone: Annotated[str | None, Query()] = None, diff --git a/backend/app/common/exception/exception_handler.py b/backend/app/common/exception/exception_handler.py index e79d2566..7b1b23c5 100644 --- a/backend/app/common/exception/exception_handler.py +++ b/backend/app/common/exception/exception_handler.py @@ -124,6 +124,7 @@ def register_exception(app: FastAPI): else: import traceback + log.error(f'未知异常: {exc}') log.error(traceback.format_exc()) return JSONResponse( diff --git a/backend/app/common/jwt.py b/backend/app/common/jwt.py index 5abeefef..17fa7fa4 100644 --- a/backend/app/common/jwt.py +++ b/backend/app/common/jwt.py @@ -12,7 +12,6 @@ from pydantic import ValidationError from sqlalchemy.ext.asyncio import AsyncSession from backend.app.common.exception.errors import AuthorizationError, TokenError -from backend.app.common.log import log from backend.app.common.redis import redis_client from backend.app.core.conf import settings from backend.app.crud.crud_user import UserDao diff --git a/backend/app/crud/crud_dept.py b/backend/app/crud/crud_dept.py index 6afbdd6a..0d0bdef8 100644 --- a/backend/app/crud/crud_dept.py +++ b/backend/app/crud/crud_dept.py @@ -36,12 +36,13 @@ class CRUDDept(CRUDBase[Dept, CreateDept, UpdateDept]): dept = await db.execute(se) return dept.scalars().all() - async def create(self, db: AsyncSession, obj_in: dict) -> None: + async def create(self, db: AsyncSession, obj_in: dict, user_id: int) -> None: + obj_in.update({'create_user': user_id}) obj = self.model(**obj_in) db.add(obj) - async def update(self, db: AsyncSession, dept_id: int, obj_in: dict) -> int: - return await self.update_(db, dept_id, obj_in) + async def update(self, db: AsyncSession, dept_id: int, obj_in: dict, user_id: int) -> int: + return await self.update_(db, dept_id, obj_in, user_id=user_id) async def delete(self, db: AsyncSession, dept_id: int) -> int: return await self.delete_(db, dept_id, del_flag=1) @@ -54,7 +55,9 @@ class CRUDDept(CRUDBase[Dept, CreateDept, UpdateDept]): return user_relation.users async def get_children(self, db: AsyncSession, dept_id: int) -> Any: - result = await db.execute(select(self.model).where(self.model.id == dept_id)) + result = await db.execute( + select(self.model).options(selectinload(self.model.children)).where(self.model.id == dept_id) + ) dept = result.scalars().first() return dept.children diff --git a/backend/app/crud/crud_menu.py b/backend/app/crud/crud_menu.py index 8ef25010..cdcddbb6 100644 --- a/backend/app/crud/crud_menu.py +++ b/backend/app/crud/crud_menu.py @@ -38,12 +38,13 @@ class CRUDMenu(CRUDBase[Menu, CreateMenu, UpdateMenu]): menu = await db.execute(se) return menu.scalars().all() - async def create(self, db, obj_in: dict) -> None: + async def create(self, db, obj_in: dict, user_id: int) -> None: + obj_in.update({'create_user': user_id}) obj = self.model(**obj_in) db.add(obj) - async def update(self, db, menu_id: int, obj_in: dict) -> int: - return await self.update_(db, menu_id, obj_in) + async def update(self, db, menu_id: int, obj_in: dict, user_id: int) -> int: + return await self.update_(db, menu_id, obj_in, user_id) async def delete(self, db, menu_id: int) -> int: return await self.delete_(db, menu_id) diff --git a/backend/app/middleware/jwt_auth_middleware.py b/backend/app/middleware/jwt_auth_middleware.py index 650daf75..dba138aa 100644 --- a/backend/app/middleware/jwt_auth_middleware.py +++ b/backend/app/middleware/jwt_auth_middleware.py @@ -47,10 +47,7 @@ class JwtAuthMiddleware(AuthenticationBackend): raise _AuthenticationError(code=exc.code, msg=exc.detail, headers=exc.headers) except Exception as e: log.exception(e) - raise _AuthenticationError( - code=getattr(e, 'code', 500), - msg=getattr(e, 'msg', 'Internal Server Error') - ) + raise _AuthenticationError(code=getattr(e, 'code', 500), msg=getattr(e, 'msg', 'Internal Server Error')) # 请注意,此返回使用非标准模式,所以在认证通过时,将丢失某些标准特性 # 标准返回模式请查看:https://www.starlette.io/authentication/ diff --git a/backend/app/middleware/opera_log_middleware.py b/backend/app/middleware/opera_log_middleware.py index 5d0dcf16..ffb39501 100644 --- a/backend/app/middleware/opera_log_middleware.py +++ b/backend/app/middleware/opera_log_middleware.py @@ -100,7 +100,7 @@ class OperaLogMiddleware: async def execute_request(self, request: Request, send: Send) -> tuple: # 预置响应信息 - code: int = 200 + code: str = '200' msg: str = 'Success' status: bool = True err: Any = None diff --git a/backend/app/schemas/dept.py b/backend/app/schemas/dept.py index c2ae8418..a52d80fe 100644 --- a/backend/app/schemas/dept.py +++ b/backend/app/schemas/dept.py @@ -45,7 +45,6 @@ class UpdateDept(DeptBase): class GetAllDept(DeptBase): id: int - level: int del_flag: bool create_user: int update_user: int = None diff --git a/backend/app/services/dept_service.py b/backend/app/services/dept_service.py index f6905f06..004e978b 100644 --- a/backend/app/services/dept_service.py +++ b/backend/app/services/dept_service.py @@ -33,9 +33,12 @@ class DeptService: dept = await DeptDao.get_by_name(db, obj.name) if dept: raise errors.ForbiddenError(msg='部门名称已存在') + if obj.parent_id: + parent_dept = await DeptDao.get(db, obj.parent_id) + if not parent_dept: + raise errors.NotFoundError(msg='父级部门不存在') new_obj = obj.dict() - new_obj.update({'level': obj.parent_id + 1 if obj.parent_id else 1, 'create_user': user_id}) - await DeptDao.create(db, new_obj) + await DeptDao.create(db, new_obj, user_id) @staticmethod async def update(*, pk: int, obj: UpdateDept, user_id: int): @@ -46,9 +49,12 @@ class DeptService: if dept.name != obj.name: if await DeptDao.get_by_name(db, obj.name): raise errors.ForbiddenError(msg='部门名称已存在') + if obj.parent_id: + parent_dept = await DeptDao.get(db, obj.parent_id) + if not parent_dept: + raise errors.NotFoundError(msg='父级部门不存在') new_obj = obj.dict() - new_obj.update({'level': obj.parent_id + 1 if obj.parent_id else 1, 'update_user': user_id}) - count = await DeptDao.update(db, pk, new_obj) + count = await DeptDao.update(db, pk, new_obj, user_id) return count @staticmethod diff --git a/backend/app/services/menu_service.py b/backend/app/services/menu_service.py index 4bc1a334..56f1fe6f 100644 --- a/backend/app/services/menu_service.py +++ b/backend/app/services/menu_service.py @@ -41,9 +41,12 @@ class MenuService: menu = await MenuDao.get_by_name(db, obj.name) if menu: raise errors.ForbiddenError(msg='菜单名称已存在') + if obj.parent_id: + parent_menu = await MenuDao.get(db, obj.parent_id) + if not parent_menu: + raise errors.NotFoundError(msg='父级菜单不存在') new_obj = obj.dict() - new_obj.update({'level': obj.parent_id + 1 if obj.parent_id else 1, 'create_user': user_id}) - await MenuDao.create(db, new_obj) + await MenuDao.create(db, new_obj, user_id) @staticmethod async def update(*, pk: int, obj: UpdateMenu, user_id: int): @@ -54,9 +57,12 @@ class MenuService: if menu.name != obj.name: if await MenuDao.get_by_name(db, obj.name): raise errors.ForbiddenError(msg='菜单名称已存在') + if obj.parent_id: + parent_menu = await MenuDao.get(db, obj.parent_id) + if not parent_menu: + raise errors.NotFoundError(msg='父级菜单不存在') new_obj = obj.dict() - new_obj.update({'level': obj.parent_id + 1 if obj.parent_id else 1, 'update_user': user_id}) - count = await MenuDao.update(db, pk, new_obj) + count = await MenuDao.update(db, pk, new_obj, user_id) return count @staticmethod