From 19f34d6a81b16c59c8b77dfc2517280132f17d3f Mon Sep 17 00:00:00 2001 From: insistence <3055204202@qq.com> Date: Sun, 7 Jul 2024 09:09:19 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=B0=86validate=5Fannotation?= =?UTF-8?q?=E5=B0=81=E8=A3=85=E4=B8=BApydantic-validation-decorator?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-fastapi-backend/exceptions/handle.py | 9 +- .../annotation/validate_annotation.py | 293 ------------------ .../controller/config_controller.py | 2 +- .../controller/dept_controller.py | 2 +- .../controller/dict_controller.py | 2 +- .../module_admin/controller/job_controller.py | 2 +- .../controller/menu_controller.py | 2 +- .../controller/notice_controller.py | 2 +- .../module_admin/controller/post_controler.py | 2 +- .../controller/role_controller.py | 2 +- .../controller/user_controller.py | 2 +- .../module_admin/entity/vo/config_vo.py | 2 +- .../module_admin/entity/vo/dept_vo.py | 4 +- .../module_admin/entity/vo/dict_vo.py | 2 +- .../module_admin/entity/vo/job_vo.py | 2 +- .../module_admin/entity/vo/menu_vo.py | 2 +- .../module_admin/entity/vo/notice_vo.py | 2 +- .../module_admin/entity/vo/post_vo.py | 2 +- .../module_admin/entity/vo/role_vo.py | 2 +- .../module_admin/entity/vo/user_vo.py | 4 +- ruoyi-fastapi-backend/requirements.txt | 1 + 21 files changed, 26 insertions(+), 317 deletions(-) delete mode 100644 ruoyi-fastapi-backend/module_admin/annotation/validate_annotation.py diff --git a/ruoyi-fastapi-backend/exceptions/handle.py b/ruoyi-fastapi-backend/exceptions/handle.py index accd51e..c5447fe 100644 --- a/ruoyi-fastapi-backend/exceptions/handle.py +++ b/ruoyi-fastapi-backend/exceptions/handle.py @@ -1,6 +1,7 @@ from fastapi import FastAPI, Request from fastapi.exceptions import HTTPException -from exceptions.exception import AuthException, PermissionException, ModelValidatorException, FieldValidatorException +from pydantic_validation_decorator import FieldValidationError +from exceptions.exception import AuthException, PermissionException, ModelValidatorException from utils.response_util import ResponseUtil, JSONResponse, jsonable_encoder @@ -24,9 +25,9 @@ def handle_exception(app: FastAPI): return ResponseUtil.failure(data=exc.data, msg=exc.message) # 自定义模型检验异常 - @app.exception_handler(FieldValidatorException) - async def field_validator_exception_handler(request: Request, exc: FieldValidatorException): - return ResponseUtil.failure(data=exc.data, msg=exc.message) + @app.exception_handler(FieldValidationError) + async def field_validation_error_handler(request: Request, exc: FieldValidationError): + return ResponseUtil.failure(msg=exc.message) # 处理其他http请求异常 @app.exception_handler(HTTPException) diff --git a/ruoyi-fastapi-backend/module_admin/annotation/validate_annotation.py b/ruoyi-fastapi-backend/module_admin/annotation/validate_annotation.py deleted file mode 100644 index aeb4ff7..0000000 --- a/ruoyi-fastapi-backend/module_admin/annotation/validate_annotation.py +++ /dev/null @@ -1,293 +0,0 @@ -import re -from functools import wraps -from typing import Literal, Optional -from pydantic import ( - BaseModel, - Field, - AnyUrl, - AnyHttpUrl, - HttpUrl, - AnyWebsocketUrl, - WebsocketUrl, - FileUrl, - FtpUrl, - PostgresDsn, - CockroachDsn, - AmqpDsn, - RedisDsn, - MongoDsn, - KafkaDsn, - NatsDsn, - MySQLDsn, - MariaDBDsn, - ClickHouseDsn, - EmailStr, - NameEmail, - IPvAnyAddress, - ValidationError -) -from exceptions.exception import FieldValidatorException -from utils.string_util import StringUtil - - -class NetWorkAnnotationModel(BaseModel): - any_url: Optional[AnyUrl] = Field(default=None, description='接受任何URL类型') - any_http_url: Optional[AnyHttpUrl] = Field(default=None, description='接受任何http或https URL的类型') - http_url: Optional[HttpUrl] = Field(default=None, description='接受任何最大长度2083 & http或https URL的类型') - any_websocket_url: Optional[AnyWebsocketUrl] = Field(default=None, description='接受任何ws或wss URL的类型') - websocket_url: Optional[WebsocketUrl] = Field(default=None, description='接受任何最大长度 2083 & ws或wss URL的类型') - file_url: Optional[FileUrl] = Field(default=None, description='接受任何文件URL的类型') - ftp_url: Optional[FtpUrl] = Field(default=None, description='接受ftp URL的类型') - postgres_dsn: Optional[PostgresDsn] = Field(default=None, description='接受任何Postgres DSN的类型') - cockroach_dsn: Optional[CockroachDsn] = Field(default=None, description='接受任何Cockroach DSN的类型') - amqp_dsn: Optional[AmqpDsn] = Field(default=None, description='接受任何AMQP DSN的类型') - redis_dsn: Optional[RedisDsn] = Field(default=None, description='接受任何Redis DSN的类型') - mongo_dsn: Optional[MongoDsn] = Field(default=None, description='接受任何MongoDB DSN的类型') - kafka_dsn: Optional[KafkaDsn] = Field(default=None, description='接受任何Kafka DSN的类型') - nats_dsn: Optional[NatsDsn] = Field(default=None, description='接受任何NATS DSN的类型') - mysql_dsn: Optional[MySQLDsn] = Field(default=None, description='接受任何MySQL DSN的类型') - mariadb_dsn: Optional[MariaDBDsn] = Field(default=None, description='接受任何MariaDB DSN的类型') - clickhouse_dsn: Optional[ClickHouseDsn] = Field(default=None, description='接受任何ClickHouse DSN的类型') - email_str: Optional[EmailStr] = Field(default=None, description='验证电子邮件地址') - name_email: Optional[NameEmail] = Field(default=None, description='验证RFC 5322指定的名称和电子邮件地址组合') - ipv_any_address: Optional[IPvAnyAddress] = Field(default=None, description='验证IPv4或IPv6地址') - - -class ValidateFields: - """ - 字段校验装饰器 - """ - def __init__(self, validate_model: str, validate_function: str = 'validate_fields'): - """ - 字段校验装饰器 - :param validate_model: 需要校验的pydantic模型在函数中的名称 - :param validate_function: pydantic模型中定义的校验函数名称 - :return: - """ - self.validate_model = validate_model - self.validate_function = validate_function - - def __call__(self, func): - @wraps(func) - async def wrapper(*args, **kwargs): - validate_model = kwargs.get(self.validate_model) - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.validate_function): - validate_function = getattr(validate_model, self.validate_function) - if validate_function is not None and callable(validate_function): - validate_function() - return await func(*args, **kwargs) - return wrapper - - -class NetWork: - """ - 字段网络类型校验装饰器 - """ - def __init__( - self, - field_name: str, - field_type: Literal['AnyUrl', 'AnyHttpUrl', 'HttpUrl', 'AnyWebsocketUrl', 'WebsocketUrl', 'FileUrl', - 'FtpUrl', 'PostgresDsn', 'CockroachDsn', 'AmqpDsn', 'RedisDsn', 'MongoDsn', 'KafkaDsn', - 'NatsDsn', 'MySQLDsn', 'MariaDBDsn', 'ClickHouseDsn', 'EmailStr', 'NameEmail', - 'IPvAnyAddress'], - message: Optional[str] = None - ): - """ - 字段网络类型校验装饰器 - :param field_name: 需要校验的字段名称 - :param field_type: 需要校验的字段类型 - :param message: 校验失败的提示信息 - :return: - """ - self.field_name = field_name - self.field_type = field_type - self.message = message - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - validate_model = args[0] - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.field_name): - field_value = getattr(validate_model, self.field_name) - if field_value: - try: - if self.field_type == 'AnyUrl': - NetWorkAnnotationModel(any_url=field_value) - elif self.field_type == 'AnyHttpUrl': - NetWorkAnnotationModel(any_http_url=field_value) - elif self.field_type == 'HttpUrl': - NetWorkAnnotationModel(http_url=field_value) - elif self.field_type == 'AnyWebsocketUrl': - NetWorkAnnotationModel(any_websocket_url=field_value) - elif self.field_type == 'WebsocketUrl': - NetWorkAnnotationModel(websocket_url=field_value) - elif self.field_type == 'FileUrl': - NetWorkAnnotationModel(file_url=field_value) - elif self.field_type == 'FtpUrl': - NetWorkAnnotationModel(ftp_url=field_value) - elif self.field_type == 'PostgresDsn': - NetWorkAnnotationModel(postgres_dsn=field_value) - elif self.field_type == 'CockroachDsn': - NetWorkAnnotationModel(cockroach_dsn=field_value) - elif self.field_type == 'AmqpDsn': - NetWorkAnnotationModel(amqp_dsn=field_value) - elif self.field_type == 'RedisDsn': - NetWorkAnnotationModel(redis_dsn=field_value) - elif self.field_type == 'MongoDsn': - NetWorkAnnotationModel(mongo_dsn=field_value) - elif self.field_type == 'KafkaDsn': - NetWorkAnnotationModel(kafka_dsn=field_value) - elif self.field_type == 'NatsDsn': - NetWorkAnnotationModel(nats_dsn=field_value) - elif self.field_type == 'MySQLDsn': - NetWorkAnnotationModel(mysql_dsn=field_value) - elif self.field_type == 'MariaDBDsn': - NetWorkAnnotationModel(mariadb_dsn=field_value) - elif self.field_type == 'ClickHouseDsn': - NetWorkAnnotationModel(clickhouse_dsn=field_value) - elif self.field_type == 'EmailStr': - NetWorkAnnotationModel(email_str=field_value) - elif self.field_type == 'NameEmail': - NetWorkAnnotationModel(name_email=field_value) - elif self.field_type == 'IPvAnyAddress': - NetWorkAnnotationModel(ipv_any_address=field_value) - except (ValidationError, ValueError): - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}不是正确的{self.field_type}类型') - return func(*args, **kwargs) - return wrapper - - -class NotBlank: - """ - 字段非空校验装饰器 - """ - def __init__(self, field_name: str, message: Optional[str] = None): - """ - 字段非空校验装饰器 - :param field_name: 需要校验的字段名称 - :param message: 校验失败的提示信息 - :return: - """ - self.field_name = field_name - self.message = message - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - validate_model = args[0] - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.field_name): - field_value = getattr(validate_model, self.field_name) - if field_value is None or field_value == '' or field_value == [] or field_value == () or field_value == {}: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}不能为空') - return func(*args, **kwargs) - return wrapper - - -class Pattern: - """ - 字段正则校验装饰器 - """ - def __init__(self, field_name: str, regexp: str, message: Optional[str] = None): - """ - 字段正则校验装饰器 - :param field_name: 需要校验的字段名称 - :param regexp: 正则表达式 - :param message: 校验失败的提示信息 - :return: - """ - self.field_name = field_name - self.regexp = regexp - self.message = message - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - validate_model = args[0] - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.field_name): - field_value = getattr(validate_model, self.field_name) - if isinstance(field_value, str) and not re.match(self.regexp, field_value): - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}格式不正确') - return func(*args, **kwargs) - return wrapper - - -class Size: - """ - 字段大小校验装饰器 - """ - def __init__(self, field_name: str, gt: Optional[float] = None, ge: Optional[float] = None, - lt: Optional[float] = None, le: Optional[float] = None, min_length: Optional[int] = 0, - max_length: Optional[int] = None, message: Optional[str] = None): - """ - 字段大小校验装饰器 - :param field_name: 需要校验的字段名称 - :param gt: 数字型字段值必须要大于gt - :param ge: 数字型字段值必须要大于等于ge - :param lt: 数字型字段值必须要小于ge - :param le: 数字型字段值必须要小于等于ge - :param min_length: 字符串型字段长度不能小于min_length - :param max_length: 字符串型字段长度不能大于max_length - :param message: 校验失败的提示信息 - :return: - """ - self.field_name = field_name - self.gt = gt - self.ge = ge - self.lt = lt - self.le = le - self.min_length = min_length if min_length >= 0 else 0 - self.max_length = max_length - self.message = message - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - validate_model = args[0] - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.field_name): - field_value = getattr(validate_model, self.field_name) - if isinstance(field_value, float): - if self.gt is not None and field_value <= self.gt: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}必须大于{self.gt}') - elif self.ge is not None and field_value < self.ge: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}必须大于等于{self.ge}') - elif self.lt is not None and field_value >= self.lt: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}必须小于{self.lt}') - elif self.le is not None and field_value > self.le: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}必须小于等于{self.le}') - elif isinstance(field_value, str): - if len(field_value) < self.min_length: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}长度不能小于{self.min_length}') - elif self.max_length is not None and len(field_value) > self.max_length: - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}长度不能大于{self.max_length}') - return func(*args, **kwargs) - return wrapper - - -class Xss: - """ - 字段Xss校验装饰器 - """ - HTML_PATTERN = '<(\S*?)[^>]*>.*?|<.*? />' - - def __init__(self, field_name: str, message: Optional[str] = None): - """ - 字段Xss校验装饰器 - :param field_name: 需要校验的字段名称 - :param message: 校验失败的提示信息 - :return: - """ - self.field_name = field_name - self.message = message - - def __call__(self, func): - @wraps(func) - def wrapper(*args, **kwargs): - validate_model = args[0] - if isinstance(validate_model, BaseModel) and hasattr(validate_model, self.field_name): - field_value = getattr(validate_model, self.field_name) - if not StringUtil.is_blank(field_value): - pattern = re.compile(self.HTML_PATTERN) - if pattern.search(field_value): - raise FieldValidatorException(message=self.message if self.message else f'{self.field_name}不能包含脚本字符') - return func(*args, **kwargs) - return wrapper diff --git a/ruoyi-fastapi-backend/module_admin/controller/config_controller.py b/ruoyi-fastapi-backend/module_admin/controller/config_controller.py index ba7f63c..31e28e9 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/config_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/config_controller.py @@ -1,11 +1,11 @@ from fastapi import APIRouter from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.config_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/dept_controller.py b/ruoyi-fastapi-backend/module_admin/controller/dept_controller.py index 74e4196..5d8208f 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/dept_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/dept_controller.py @@ -1,12 +1,12 @@ from fastapi import APIRouter, Request from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.dept_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.aspect.data_scope import GetDataScope from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/dict_controller.py b/ruoyi-fastapi-backend/module_admin/controller/dict_controller.py index fdfdacb..ce508cf 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/dict_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/dict_controller.py @@ -1,11 +1,11 @@ from fastapi import APIRouter from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.dict_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/job_controller.py b/ruoyi-fastapi-backend/module_admin/controller/job_controller.py index 487f6f9..f3d536b 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/job_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/job_controller.py @@ -1,12 +1,12 @@ from fastapi import APIRouter from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.job_service import * from module_admin.service.job_log_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/menu_controller.py b/ruoyi-fastapi-backend/module_admin/controller/menu_controller.py index 59b7bcf..ddda0ea 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/menu_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/menu_controller.py @@ -1,11 +1,11 @@ from fastapi import APIRouter, Request from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService from module_admin.service.menu_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/notice_controller.py b/ruoyi-fastapi-backend/module_admin/controller/notice_controller.py index 5844891..9395bca 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/notice_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/notice_controller.py @@ -1,11 +1,11 @@ from fastapi import APIRouter, Request from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.notice_service import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py b/ruoyi-fastapi-backend/module_admin/controller/post_controler.py index 1049ccb..97cd459 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/post_controler.py +++ b/ruoyi-fastapi-backend/module_admin/controller/post_controler.py @@ -1,12 +1,12 @@ from fastapi import APIRouter, Request from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.post_service import * from module_admin.entity.vo.post_vo import * from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/role_controller.py b/ruoyi-fastapi-backend/module_admin/controller/role_controller.py index 7251339..a27eb91 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/role_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/role_controller.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, Request from fastapi import Depends +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from module_admin.service.login_service import LoginService, CurrentUserModel from module_admin.service.role_service import * @@ -8,7 +9,6 @@ from module_admin.service.user_service import UserService, UserRoleQueryModel, U from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.aspect.data_scope import GetDataScope from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.response_util import * from utils.log_util import * diff --git a/ruoyi-fastapi-backend/module_admin/controller/user_controller.py b/ruoyi-fastapi-backend/module_admin/controller/user_controller.py index f06daa9..8c651a6 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/user_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/user_controller.py @@ -1,5 +1,6 @@ from fastapi import APIRouter, Request from fastapi import Depends, File, Query +from pydantic_validation_decorator import ValidateFields from config.get_db import get_db from config.env import UploadConfig from module_admin.service.login_service import LoginService @@ -8,7 +9,6 @@ from module_admin.service.dept_service import DeptService from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.aspect.data_scope import GetDataScope from module_admin.annotation.log_annotation import log_decorator -from module_admin.annotation.validate_annotation import ValidateFields from config.enums import BusinessType from utils.page_util import PageResponseModel from utils.response_util import * diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py index 7dd7a5f..c749190 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/config_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Size class ConfigModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/dept_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/dept_vo.py index c55b186..f91d820 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/dept_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/dept_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import Network, NotBlank, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query -from module_admin.annotation.validate_annotation import NetWork, NotBlank, Size class DeptModel(BaseModel): @@ -40,7 +40,7 @@ class DeptModel(BaseModel): def get_phone(self): return self.phone - @NetWork(field_name='email', field_type='EmailStr', message='邮箱格式不正确') + @Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确') @Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符') def get_email(self): return self.email diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/dict_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/dict_vo.py index 7a303c1..3c24554 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/dict_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/dict_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Pattern, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Pattern, Size class DictTypeModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/job_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/job_vo.py index c3efb7f..f39cc21 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/job_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/job_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Size class JobModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/menu_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/menu_vo.py index 7175c74..224015c 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/menu_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/menu_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size from datetime import datetime from typing import Union, Optional, List, Literal from module_admin.annotation.pydantic_annotation import as_query -from module_admin.annotation.validate_annotation import NotBlank, Size class MenuModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/notice_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/notice_vo.py index d95a6dc..75ef99c 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/notice_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/notice_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size, Xss from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Size, Xss class NoticeModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py index c2056c8..68dd079 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/post_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Size class PostModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/role_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/role_vo.py index 439ff8b..ab809bc 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/role_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/role_vo.py @@ -1,9 +1,9 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import NotBlank, Size from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NotBlank, Size class RoleModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py index 6c47258..3613913 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py @@ -1,13 +1,13 @@ import re from pydantic import BaseModel, Field, ConfigDict, model_validator from pydantic.alias_generators import to_camel +from pydantic_validation_decorator import Network, NotBlank, Size, Xss from typing import Union, Optional, List, Literal from datetime import datetime from module_admin.entity.vo.role_vo import RoleModel from module_admin.entity.vo.dept_vo import DeptModel from module_admin.entity.vo.post_vo import PostModel from module_admin.annotation.pydantic_annotation import as_query, as_form -from module_admin.annotation.validate_annotation import NetWork, NotBlank, Size, Xss from exceptions.exception import ModelValidatorException @@ -72,7 +72,7 @@ class UserModel(BaseModel): def get_nick_name(self): return self.nick_name - @NetWork(field_name='email', field_type='EmailStr', message='邮箱格式不正确') + @Network(field_name='email', field_type='EmailStr', message='邮箱格式不正确') @Size(field_name='email', min_length=0, max_length=50, message='邮箱长度不能超过50个字符') def get_email(self): return self.email diff --git a/ruoyi-fastapi-backend/requirements.txt b/ruoyi-fastapi-backend/requirements.txt index 292ca2f..976dbb9 100644 --- a/ruoyi-fastapi-backend/requirements.txt +++ b/ruoyi-fastapi-backend/requirements.txt @@ -8,6 +8,7 @@ pandas==2.1.4 passlib[bcrypt]==1.7.4 Pillow==10.2.0 psutil==5.9.7 +pydantic-validation-decorator==0.1.2 PyMySQL==1.1.0 python-jose[cryptography]==3.3.0 redis==5.0.1