diff --git a/backend/app/crud/base.py b/backend/app/crud/base.py index 7af9da0a..4bf72365 100644 --- a/backend/app/crud/base.py +++ b/backend/app/crud/base.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import Any, Dict, Generic, Type, TypeVar, NoReturn +from typing import Any, Dict, Generic, Type, TypeVar from pydantic import BaseModel from sqlalchemy import select, update, delete, and_ @@ -49,7 +49,7 @@ async def get_( result = await db.execute(select(self.model).where(and_(*where_list))) return result.scalars().first() - async def create_(self, db: AsyncSession, obj_in: CreateSchemaType, user_id: int | None = None) -> NoReturn: + async def create_(self, db: AsyncSession, obj_in: CreateSchemaType, user_id: int | None = None) -> None: """ 新增一条数据 diff --git a/backend/app/crud/crud_api.py b/backend/app/crud/crud_api.py index 958c6a1f..fa041fc4 100644 --- a/backend/app/crud/crud_api.py +++ b/backend/app/crud/crud_api.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import NoReturn, Sequence +from typing import Sequence from sqlalchemy import Select, select, desc, delete, and_ from sqlalchemy.ext.asyncio import AsyncSession @@ -35,7 +35,7 @@ async def get_by_name(self, db: AsyncSession, name: str) -> Api | None: api = await db.execute(select(self.model).where(self.model.name == name)) return api.scalars().first() - async def create(self, db: AsyncSession, obj_in: CreateApi) -> NoReturn: + async def create(self, db: AsyncSession, obj_in: CreateApi) -> None: await self.create_(db, obj_in) async def update(self, db: AsyncSession, pk: int, obj_in: UpdateApi) -> int: diff --git a/backend/app/crud/crud_dept.py b/backend/app/crud/crud_dept.py index b283f048..29769335 100644 --- a/backend/app/crud/crud_dept.py +++ b/backend/app/crud/crud_dept.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import Any +from typing import Sequence from sqlalchemy import select, and_, asc, or_ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from backend.app.crud.base import CRUDBase -from backend.app.models import Dept +from backend.app.models import Dept, User from backend.app.schemas.dept import CreateDept, UpdateDept @@ -20,7 +20,7 @@ async def get_by_name(self, db: AsyncSession, name: str) -> Dept | None: async def get_all( self, db: AsyncSession, name: str = None, leader: str = None, phone: str = None, status: int = None - ) -> Any: + ) -> Sequence[Dept]: se = select(self.model).order_by(asc(self.model.sort)) where_list = [self.model.del_flag == 0] conditions = [] @@ -53,14 +53,14 @@ async def update(self, db: AsyncSession, dept_id: int, obj_in: UpdateDept) -> in async def delete(self, db: AsyncSession, dept_id: int) -> int: return await self.delete_(db, dept_id, del_flag=1) - async def get_user_relation(self, db: AsyncSession, dept_id: int) -> Any: + async def get_user_relation(self, db: AsyncSession, dept_id: int) -> list[User]: result = await db.execute( select(self.model).options(selectinload(self.model.users)).where(self.model.id == dept_id) ) user_relation = result.scalars().first() return user_relation.users - async def get_children(self, db: AsyncSession, dept_id: int) -> Any: + async def get_children(self, db: AsyncSession, dept_id: int) -> list[Dept]: result = await db.execute( select(self.model).options(selectinload(self.model.children)).where(self.model.id == dept_id) ) diff --git a/backend/app/crud/crud_login_log.py b/backend/app/crud/crud_login_log.py index 5dea7934..9b021a6f 100644 --- a/backend/app/crud/crud_login_log.py +++ b/backend/app/crud/crud_login_log.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import NoReturn - from sqlalchemy import Select, select, desc, delete, and_ from sqlalchemy.ext.asyncio import AsyncSession @@ -24,7 +22,7 @@ async def get_all(self, username: str | None = None, status: int | None = None, se = se.where(and_(*where_list)) return se - async def create(self, db: AsyncSession, obj_in: CreateLoginLog) -> NoReturn: + async def create(self, db: AsyncSession, obj_in: CreateLoginLog): await self.create_(db, obj_in) await db.commit() diff --git a/backend/app/crud/crud_menu.py b/backend/app/crud/crud_menu.py index 909dcea8..10ac37ab 100644 --- a/backend/app/crud/crud_menu.py +++ b/backend/app/crud/crud_menu.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from typing import Sequence + from sqlalchemy import select, asc, and_ from sqlalchemy.orm import selectinload @@ -16,7 +18,7 @@ async def get_by_title(self, db, title: str) -> Menu | None: result = await db.execute(select(self.model).where(self.model.title == title)) return result.scalars().first() - async def get_all(self, db, title: str | None = None, status: int | None = None) -> list[Menu]: + async def get_all(self, db, title: str | None = None, status: int | None = None) -> Sequence[Menu]: se = select(self.model).order_by(asc(self.model.sort)) where_list = [] if title: @@ -28,7 +30,7 @@ async def get_all(self, db, title: str | None = None, status: int | None = None) menu = await db.execute(se) return menu.scalars().all() - async def get_role_menus(self, db, superuser: bool, menu_ids: list[int]) -> list[Menu]: + async def get_role_menus(self, db, superuser: bool, menu_ids: list[int]) -> Sequence[Menu]: se = select(self.model).order_by(asc(self.model.sort)) where_list = [self.model.menu_type.in_([0, 1])] if not superuser: diff --git a/backend/app/crud/crud_opera_log.py b/backend/app/crud/crud_opera_log.py index 04046a74..f8941230 100644 --- a/backend/app/crud/crud_opera_log.py +++ b/backend/app/crud/crud_opera_log.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import NoReturn - from sqlalchemy import select, desc, and_, delete, Select from sqlalchemy.ext.asyncio import AsyncSession @@ -24,7 +22,7 @@ async def get_all(self, username: str | None = None, status: int | None = None, se = se.where(and_(*where_list)) return se - async def create(self, db: AsyncSession, obj_in: CreateOperaLog) -> NoReturn: + async def create(self, db: AsyncSession, obj_in: CreateOperaLog) -> None: await self.create_(db, obj_in) async def delete(self, db: AsyncSession, pk: list[int]) -> int: diff --git a/backend/app/crud/crud_role.py b/backend/app/crud/crud_role.py index 982c22c0..68fc2597 100644 --- a/backend/app/crud/crud_role.py +++ b/backend/app/crud/crud_role.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import NoReturn +from typing import Sequence -from sqlalchemy import select, delete, desc +from sqlalchemy import select, delete, desc, Select from sqlalchemy.orm import selectinload from backend.app.crud.base import CRUDBase @@ -20,15 +20,15 @@ async def get_with_relation(self, db, role_id: int) -> Role | None: ) return role.scalars().first() - async def get_all(self, db) -> list[Role]: + async def get_all(self, db) -> Sequence[Role]: roles = await db.execute(select(self.model)) return roles.scalars().all() - async def get_user_all(self, db, user_id: int) -> list[Role]: + async def get_user_all(self, db, user_id: int) -> Sequence[Role]: roles = await db.execute(select(self.model).join(self.model.users).where(User.id == user_id)) return roles.scalars().all() - async def get_list(self, name: str = None, data_scope: int = None, status: int = None): + async def get_list(self, name: str = None, data_scope: int = None, status: int = None) -> Select: se = select(self.model).options(selectinload(self.model.menus)).order_by(desc(self.model.created_time)) where_list = [] if name: @@ -45,7 +45,7 @@ async def get_by_name(self, db, name: str) -> Role | None: role = await db.execute(select(self.model).where(self.model.name == name)) return role.scalars().first() - async def create(self, db, obj_in: CreateRole) -> NoReturn: + async def create(self, db, obj_in: CreateRole) -> None: await self.create_(db, obj_in) async def update(self, db, role_id: int, obj_in: UpdateRole) -> int: diff --git a/backend/app/crud/crud_user.py b/backend/app/crud/crud_user.py index faa4e20b..6c827ed0 100644 --- a/backend/app/crud/crud_user.py +++ b/backend/app/crud/crud_user.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime -from typing import NoReturn from fast_captcha import text_captcha from sqlalchemy import select, update, desc, and_ @@ -34,7 +33,7 @@ async def update_login_time(self, db: AsyncSession, username: str, login_time: d await db.commit() return user.rowcount - async def create(self, db: AsyncSession, obj: RegisterUser) -> NoReturn: + async def create(self, db: AsyncSession, obj: RegisterUser) -> None: salt = text_captcha(5) obj.password = await jwt.get_hash_password(obj.password + salt) dict_obj = obj.dict() @@ -42,7 +41,7 @@ async def create(self, db: AsyncSession, obj: RegisterUser) -> NoReturn: new_user = self.model(**dict_obj) db.add(new_user) - async def add(self, db: AsyncSession, obj: AddUser) -> NoReturn: + async def add(self, db: AsyncSession, obj: AddUser) -> None: salt = text_captcha(5) obj.password = await jwt.get_hash_password(obj.password + salt) dict_obj = obj.dict(exclude={'roles'}) diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py index d1b88c5a..d4b382c1 100644 --- a/backend/app/services/auth_service.py +++ b/backend/app/services/auth_service.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime -from typing import NoReturn from fastapi import Request from fastapi.security import OAuth2PasswordRequestForm @@ -16,6 +15,7 @@ from backend.app.core.conf import settings from backend.app.crud.crud_user import UserDao from backend.app.database.db_mysql import async_db_session +from backend.app.models import User from backend.app.schemas.user import AuthLogin from backend.app.services.login_log_service import LoginLogService from backend.app.utils.timezone import timezone @@ -24,7 +24,7 @@ class AuthService: login_time = timezone.now() - async def swagger_login(self, *, form_data: OAuth2PasswordRequestForm): + async def swagger_login(self, *, form_data: OAuth2PasswordRequestForm) -> tuple[str, User]: async with async_db_session() as db: current_user = await UserDao.get_by_username(db, form_data.username) if not current_user: @@ -41,7 +41,9 @@ async def swagger_login(self, *, form_data: OAuth2PasswordRequestForm): access_token, _ = await jwt.create_access_token(str(user.id), multi_login=user.is_multi_login) return access_token, user - async def login(self, *, request: Request, obj: AuthLogin, background_tasks: BackgroundTasks): + async def login( + self, *, request: Request, obj: AuthLogin, background_tasks: BackgroundTasks + ) -> tuple[str, str, datetime, datetime, User]: async with async_db_session() as db: try: current_user = await UserDao.get_by_username(db, obj.username) @@ -115,7 +117,7 @@ async def new_token(*, request: Request, refresh_token: str) -> tuple[str, str, return new_access_token, new_refresh_token, new_access_token_expire_time, new_refresh_token_expire_time @staticmethod - async def logout(*, request: Request) -> NoReturn: + async def logout(*, request: Request) -> None: token = await get_token(request) if request.user.is_multi_login: key = f'{settings.TOKEN_REDIS_PREFIX}:{request.user.id}:{token}' diff --git a/backend/app/services/dept_service.py b/backend/app/services/dept_service.py index 4c0b3a39..4354086a 100644 --- a/backend/app/services/dept_service.py +++ b/backend/app/services/dept_service.py @@ -1,15 +1,18 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from typing import Any + from backend.app.common.exception import errors from backend.app.crud.crud_dept import DeptDao from backend.app.database.db_mysql import async_db_session +from backend.app.models import Dept from backend.app.schemas.dept import CreateDept, UpdateDept from backend.app.utils.build_tree import get_tree_data class DeptService: @staticmethod - async def get(*, pk: int): + async def get(*, pk: int) -> Dept: async with async_db_session() as db: dept = await DeptDao.get(db, pk) if not dept: @@ -19,14 +22,14 @@ async def get(*, pk: int): @staticmethod async def get_dept_tree( *, name: str | None = None, leader: str | None = None, phone: str | None = None, status: int | None = None - ): + ) -> list[dict[str, Any]]: async with async_db_session() as db: dept_select = await DeptDao.get_all(db=db, name=name, leader=leader, phone=phone, status=status) tree_data = await get_tree_data(dept_select) return tree_data @staticmethod - async def create(*, obj: CreateDept): + async def create(*, obj: CreateDept) -> None: async with async_db_session.begin() as db: dept = await DeptDao.get_by_name(db, obj.name) if dept: @@ -38,7 +41,7 @@ async def create(*, obj: CreateDept): await DeptDao.create(db, obj) @staticmethod - async def update(*, pk: int, obj: UpdateDept): + async def update(*, pk: int, obj: UpdateDept) -> int: async with async_db_session.begin() as db: dept = await DeptDao.get(db, pk) if not dept: @@ -54,7 +57,7 @@ async def update(*, pk: int, obj: UpdateDept): return count @staticmethod - async def delete(*, pk: int): + async def delete(*, pk: int) -> int: async with async_db_session.begin() as db: dept_user = await DeptDao.get_user_relation(db, pk) if dept_user: diff --git a/backend/app/services/login_log_service.py b/backend/app/services/login_log_service.py index cda15797..32941d7d 100644 --- a/backend/app/services/login_log_service.py +++ b/backend/app/services/login_log_service.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- from datetime import datetime -from typing import NoReturn from fastapi import Request from sqlalchemy import Select @@ -22,7 +21,7 @@ async def get_select(*, username: str, status: int, ip: str) -> Select: @staticmethod async def create( *, db: AsyncSession, request: Request, user: User, login_time: datetime, status: int, msg: str - ) -> NoReturn: + ) -> None: try: # request.state 来自 opera log 中间件定义的扩展参数,详见 opera_log_middleware.py obj_in = CreateLoginLog( diff --git a/backend/app/services/menu_service.py b/backend/app/services/menu_service.py index c737acff..c8988630 100644 --- a/backend/app/services/menu_service.py +++ b/backend/app/services/menu_service.py @@ -1,17 +1,20 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from typing import Any + from fastapi import Request from backend.app.common.exception import errors from backend.app.crud.crud_menu import MenuDao from backend.app.crud.crud_role import RoleDao from backend.app.database.db_mysql import async_db_session +from backend.app.models import Menu from backend.app.schemas.menu import CreateMenu, UpdateMenu from backend.app.utils.build_tree import get_tree_data class MenuService: @staticmethod - async def get(*, pk: int): + async def get(*, pk: int) -> Menu: async with async_db_session() as db: menu = await MenuDao.get(db, menu_id=pk) if not menu: @@ -19,14 +22,14 @@ async def get(*, pk: int): return menu @staticmethod - async def get_menu_tree(*, title: str | None = None, status: int | None = None): + async def get_menu_tree(*, title: str | None = None, status: int | None = None) -> list[dict[str, Any]]: async with async_db_session() as db: menu_select = await MenuDao.get_all(db, title=title, status=status) menu_tree = await get_tree_data(menu_select) return menu_tree @staticmethod - async def get_role_menu_tree(*, pk: int): + async def get_role_menu_tree(*, pk: int) -> list[dict[str, Any]]: async with async_db_session() as db: role = await RoleDao.get_with_relation(db, pk) if not role: @@ -37,7 +40,7 @@ async def get_role_menu_tree(*, pk: int): return menu_tree @staticmethod - async def get_user_menu_tree(*, request: Request): + async def get_user_menu_tree(*, request: Request) -> list[dict[str, Any]]: async with async_db_session() as db: roles = request.user.roles menu_ids = [] @@ -50,7 +53,7 @@ async def get_user_menu_tree(*, request: Request): return menu_tree @staticmethod - async def create(*, obj: CreateMenu): + async def create(*, obj: CreateMenu) -> None: async with async_db_session.begin() as db: title = await MenuDao.get_by_title(db, obj.title) if title: @@ -62,7 +65,7 @@ async def create(*, obj: CreateMenu): await MenuDao.create(db, obj) @staticmethod - async def update(*, pk: int, obj: UpdateMenu): + async def update(*, pk: int, obj: UpdateMenu) -> int: async with async_db_session.begin() as db: menu = await MenuDao.get(db, pk) if not menu: @@ -78,7 +81,7 @@ async def update(*, pk: int, obj: UpdateMenu): return count @staticmethod - async def delete(*, pk: int): + async def delete(*, pk: int) -> int: async with async_db_session.begin() as db: children = await MenuDao.get_children(db, pk) if children: diff --git a/backend/app/services/opera_log_service.py b/backend/app/services/opera_log_service.py index 769e0e21..626a718e 100644 --- a/backend/app/services/opera_log_service.py +++ b/backend/app/services/opera_log_service.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from sqlalchemy import Select + from backend.app.crud.crud_opera_log import OperaLogDao from backend.app.database.db_mysql import async_db_session from backend.app.schemas.opera_log import CreateOperaLog @@ -7,7 +9,7 @@ class OperaLogService: @staticmethod - async def get_select(*, username: str | None = None, status: int | None = None, ip: str | None = None): + async def get_select(*, username: str | None = None, status: int | None = None, ip: str | None = None) -> Select: return await OperaLogDao.get_all(username=username, status=status, ip=ip) @staticmethod @@ -16,13 +18,13 @@ async def create(*, obj_in: CreateOperaLog): await OperaLogDao.create(db, obj_in) @staticmethod - async def delete(*, pk: list[int]): + async def delete(*, pk: list[int]) -> int: async with async_db_session.begin() as db: count = await OperaLogDao.delete(db, pk) return count @staticmethod - async def delete_all(): + async def delete_all() -> int: async with async_db_session.begin() as db: count = await OperaLogDao.delete_all(db) return count diff --git a/backend/app/services/role_service.py b/backend/app/services/role_service.py index 9fa7ed40..91c5cb3d 100644 --- a/backend/app/services/role_service.py +++ b/backend/app/services/role_service.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from typing import Sequence + from sqlalchemy import Select from backend.app.common.exception import errors @@ -20,13 +22,13 @@ async def get(*, pk: int) -> Role: return role @staticmethod - async def get_all() -> list[Role]: + async def get_all() -> Sequence[Role]: async with async_db_session() as db: roles = await RoleDao.get_all(db) return roles @staticmethod - async def get_user_all(*, pk: int) -> list[Role]: + async def get_user_all(*, pk: int) -> Sequence[Role]: async with async_db_session() as db: roles = await RoleDao.get_user_all(db, user_id=pk) return roles