From f27d2e9f7cf78a7e3adca8dbb72cb62660d1cc04 Mon Sep 17 00:00:00 2001 From: zy7y <13271962515@163.com> Date: Mon, 12 Sep 2022 15:22:08 +0800 Subject: [PATCH] ref: response schema file --- backend/controller/common.py | 3 +- backend/controller/menu.py | 3 +- backend/controller/role.py | 3 +- backend/controller/user.py | 3 +- backend/core/__init__.py | 124 -------------------- backend/mini.db | Bin 4096 -> 45056 bytes backend/mini.db-shm | Bin 32768 -> 0 bytes backend/mini.db-wal | Bin 226632 -> 0 bytes backend/{core/table.py => models/common.py} | 0 backend/models/menu.py | 2 +- backend/models/relation.py | 2 +- backend/models/role.py | 2 +- backend/models/user.py | 2 +- backend/router/url.py | 102 +++++++++++++++- backend/schemas/__init__.py | 4 + backend/schemas/common.py | 18 ++- backend/schemas/role.py | 2 +- backend/schemas/user.py | 2 +- 18 files changed, 132 insertions(+), 140 deletions(-) delete mode 100644 backend/mini.db-shm delete mode 100644 backend/mini.db-wal rename backend/{core/table.py => models/common.py} (100%) diff --git a/backend/controller/common.py b/backend/controller/common.py index b40b2ac..71098b5 100644 --- a/backend/controller/common.py +++ b/backend/controller/common.py @@ -1,7 +1,6 @@ -from core import Response from core.security import generate_token, verify_password from dbhelper.user import get_user -from schemas.common import LoginForm, LoginResult +from schemas import LoginForm, LoginResult, Response async def login(auth_data: LoginForm) -> Response[LoginResult]: diff --git a/backend/controller/menu.py b/backend/controller/menu.py index 16ba0cb..00cf085 100644 --- a/backend/controller/menu.py +++ b/backend/controller/menu.py @@ -1,6 +1,5 @@ -from core import Response from dbhelper.menu import insert_menu -from schemas.menu import MenuIn, MenuRead +from schemas import MenuIn, MenuRead, Response async def menu_add(data: MenuIn) -> Response[MenuRead]: diff --git a/backend/controller/role.py b/backend/controller/role.py index d918d9f..34693a6 100644 --- a/backend/controller/role.py +++ b/backend/controller/role.py @@ -1,9 +1,8 @@ import json -from core import Response from core.utils import list_to_tree from dbhelper.role import get_role_menus, new_role -from schemas.role import RoleIn, RoleInfo +from schemas import Response, RoleIn, RoleInfo async def role_add(data: RoleIn) -> Response[RoleInfo]: diff --git a/backend/controller/user.py b/backend/controller/user.py index 9ce6cae..7702a91 100644 --- a/backend/controller/user.py +++ b/backend/controller/user.py @@ -1,10 +1,9 @@ from fastapi import Query -from core import Response from core.security import get_password_hash from dbhelper.user import get_user, get_user_info, get_users, insert_user, new_user +from schemas import Response, UserAdd, UserIn, UserInfo, UserList, UserQuery, UserRead from schemas.common import ListAll -from schemas.user import UserAdd, UserIn, UserInfo, UserList, UserQuery, UserRead async def user_add(data: UserAdd) -> Response[UserInfo]: diff --git a/backend/core/__init__.py b/backend/core/__init__.py index 3d14a10..8b13789 100644 --- a/backend/core/__init__.py +++ b/backend/core/__init__.py @@ -1,125 +1 @@ -from typing import Generic, Optional, TypeVar -from pydantic import BaseModel, Field -from pydantic.generics import GenericModel - -T = TypeVar("T") - - -class Response(GenericModel, Generic[T]): - code: int = 200 - data: Optional[T] - msg: str = "请求成功" - - -from datetime import datetime - - -class ReadBase(BaseModel): - """数据读取的基类""" - - id: int - status: int = Field(default=1, description="数据状态 1正常默认值 9 删除 5使用中 ") - created: datetime - modified: datetime - - -from typing import Any, Callable, get_type_hints - -from fastapi import routing - - -class Route(routing.APIRoute): - """ - https://github.com/tiangolo/fastapi/issues/620 - Django挂载视图方法 - def index() -> User: - pass - Route("/", endpoint=index) - """ - - def __init__( - self, - path: str, - endpoint: Callable[..., Any], - tags: list[str], - summary: str, - **kwargs: Any - ): - if kwargs.get("response_model") is None: - kwargs["response_model"] = get_type_hints(endpoint).get("return") - super(Route, self).__init__( - path=path, endpoint=endpoint, tags=tags, summary=summary, **kwargs - ) - - @classmethod - def post( - cls, - path: str, - endpoint: Callable[..., Any], - tags: list[str], - summary: str, - **kwargs: Any - ): - return Route( - path=path, - endpoint=endpoint, - methods=["POST"], - tags=tags, - summary=summary, - **kwargs - ) - - @classmethod - def get( - cls, - path: str, - endpoint: Callable[..., Any], - tags: list[str], - summary: str, - **kwargs: Any - ): - return Route( - path=path, - endpoint=endpoint, - methods=["GET"], - tags=tags, - summary=summary, - **kwargs - ) - - @classmethod - def delete( - cls, - path: str, - endpoint: Callable[..., Any], - tags: list[str], - summary: str, - **kwargs: Any - ): - return Route( - path=path, - endpoint=endpoint, - methods=["DELETE"], - tags=tags, - summary=summary, - **kwargs - ) - - @classmethod - def put( - cls, - path: str, - endpoint: Callable[..., Any], - tags: list[str], - summary: str, - **kwargs: Any - ): - return Route( - path=path, - endpoint=endpoint, - methods=["PUT"], - tags=tags, - summary=summary, - **kwargs - ) diff --git a/backend/mini.db b/backend/mini.db index e2a2455a104f1cf6a5d6b143f3ac8831aaaf3ab5..89b135b159d1338f82cf193924569c52aa4878c2 100644 GIT binary patch literal 45056 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 delta 26 gcmZp8z|^2HL7J73fq{W>Vxv8fq32(_$zcvZ09uL$qW}N^ diff --git a/backend/mini.db-shm b/backend/mini.db-shm deleted file mode 100644 index 089db77e0f8521d2b477b0a5b3cd6194425609e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 User: + pass + Route("/", endpoint=index) + """ + + def __init__( + self, + path: str, + endpoint: Callable[..., Any], + tags: list[str], + summary: str, + **kwargs: Any + ): + if kwargs.get("response_model") is None: + kwargs["response_model"] = get_type_hints(endpoint).get("return") + super(Route, self).__init__( + path=path, endpoint=endpoint, tags=tags, summary=summary, **kwargs + ) + + @classmethod + def post( + cls, + path: str, + endpoint: Callable[..., Any], + tags: list[str], + summary: str, + **kwargs: Any + ): + return Route( + path=path, + endpoint=endpoint, + methods=["POST"], + tags=tags, + summary=summary, + **kwargs + ) + + @classmethod + def get( + cls, + path: str, + endpoint: Callable[..., Any], + tags: list[str], + summary: str, + **kwargs: Any + ): + return Route( + path=path, + endpoint=endpoint, + methods=["GET"], + tags=tags, + summary=summary, + **kwargs + ) + + @classmethod + def delete( + cls, + path: str, + endpoint: Callable[..., Any], + tags: list[str], + summary: str, + **kwargs: Any + ): + return Route( + path=path, + endpoint=endpoint, + methods=["DELETE"], + tags=tags, + summary=summary, + **kwargs + ) + + @classmethod + def put( + cls, + path: str, + endpoint: Callable[..., Any], + tags: list[str], + summary: str, + **kwargs: Any + ): + return Route( + path=path, + endpoint=endpoint, + methods=["PUT"], + tags=tags, + summary=summary, + **kwargs + ) + routes = [ Route.post("/login", endpoint=login, tags=["公共"], summary="登录"), diff --git a/backend/schemas/__init__.py b/backend/schemas/__init__.py index e69de29..e20bfde 100644 --- a/backend/schemas/__init__.py +++ b/backend/schemas/__init__.py @@ -0,0 +1,4 @@ +from schemas.common import * +from schemas.menu import * +from schemas.role import * +from schemas.user import * diff --git a/backend/schemas/common.py b/backend/schemas/common.py index e72509b..e116b9d 100644 --- a/backend/schemas/common.py +++ b/backend/schemas/common.py @@ -1,5 +1,6 @@ """公共模型""" -from typing import Generic, TypeVar +from datetime import datetime +from typing import Generic, Optional, TypeVar from pydantic import BaseModel, Field from pydantic.generics import GenericModel @@ -7,6 +8,21 @@ from pydantic.generics import GenericModel T = TypeVar("T") +class Response(GenericModel, Generic[T]): + code: int = 200 + data: Optional[T] + msg: str = "请求成功" + + +class ReadBase(BaseModel): + """数据读取的基类""" + + id: int + status: int = Field(default=1, description="数据状态 1正常默认值 9 删除 5使用中 ") + created: datetime + modified: datetime + + class LoginForm(BaseModel): """用户登录参数""" diff --git a/backend/schemas/role.py b/backend/schemas/role.py index 0b0cb86..5f9ac52 100644 --- a/backend/schemas/role.py +++ b/backend/schemas/role.py @@ -1,8 +1,8 @@ from pydantic import BaseModel, Field from tortoise.contrib.pydantic import pydantic_model_creator -from core import ReadBase from models import RoleModel +from schemas.common import ReadBase RoleRed = pydantic_model_creator(RoleModel, name="RoleOut") diff --git a/backend/schemas/user.py b/backend/schemas/user.py index d64406b..67d94df 100644 --- a/backend/schemas/user.py +++ b/backend/schemas/user.py @@ -8,7 +8,7 @@ from schemas.common import QueryData UserRole = pydantic_model_creator(UserRoleModel, name="UserRole", exclude_readonly=True) -from core import ReadBase +from schemas.common import ReadBase class UserBasic(BaseModel):