mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-04 01:10:36 +00:00
本次提交包含多项优化和修复: 1. 修复CRUD初始化参数传递、搜索参数处理逻辑 2. 更新环境配置中的大模型相关参数 3. 重构部分服务方法命名,统一代码风格 4. 新增多个枚举类型,补充模型关联关系和加载选项 5. 优化查询参数类实现,完善字段校验逻辑 6. 调整Pydantic模型字段注释和类型定义 7. 简化并移除冗余的CRUD方法实现 8. 新增超级管理员权限装饰器 9. 修复邮件日志模型的租户关联和字段定义
103 lines
3.5 KiB
Python
103 lines
3.5 KiB
Python
from dataclasses import dataclass
|
|
|
|
from fastapi import Query
|
|
from pydantic import (
|
|
BaseModel,
|
|
ConfigDict,
|
|
Field,
|
|
field_validator,
|
|
model_validator,
|
|
)
|
|
|
|
from app.common.enums import QueueEnum
|
|
from app.core.base_params import BaseQueryParam, TenantByQueryParam, UserByQueryParam
|
|
from app.core.base_schema import BaseSchema, TenantBySchema, UserBySchema
|
|
from app.core.validator import DateStr, DateTimeStr, TimeStr
|
|
|
|
|
|
class DemoCreateSchema(BaseModel):
|
|
"""新增模型"""
|
|
|
|
name: str = Field(..., description="名称")
|
|
status: int = Field(default=0, ge=0, le=1, description="是否启用(0:启用 1:禁用)")
|
|
description: str | None = Field(default=None, description="描述")
|
|
int_val: int | None = Field(default=None, description="整数")
|
|
bigint_val: int | None = Field(default=None, description="大整数")
|
|
float_val: float | None = Field(default=None, description="浮点数")
|
|
bool_val: bool = Field(default=True, description="布尔型")
|
|
date_val: DateStr | None = Field(default=None, description="日期")
|
|
time_val: TimeStr | None = Field(default=None, description="时间")
|
|
datetime_val: DateTimeStr | None = Field(default=None, description="日期时间")
|
|
text_val: str | None = Field(default=None, description="长文本")
|
|
json_val: dict | None = Field(default=None, description="元数据(JSON格式)")
|
|
|
|
@field_validator("name")
|
|
@classmethod
|
|
def validate_name(cls, v: str) -> str:
|
|
"""
|
|
验证名称字段的格式和内容。
|
|
|
|
参数:
|
|
- v (str): 原始名称。
|
|
|
|
返回:
|
|
- str: 去空白后的名称。
|
|
|
|
异常:
|
|
- ValueError: 名称为空时抛出。
|
|
"""
|
|
# 去除首尾空格
|
|
v = v.strip()
|
|
if not v:
|
|
raise ValueError("名称不能为空")
|
|
return v
|
|
|
|
@model_validator(mode="after")
|
|
def _after_validation(self):
|
|
"""
|
|
核心业务规则校验
|
|
"""
|
|
# 长度校验:名称最小长度
|
|
if len(self.name) < 2 or len(self.name) > 50:
|
|
raise ValueError("名称长度必须在2-50个字符之间")
|
|
# 格式校验:名称只能包含字母、数字、下划线和中划线
|
|
if not self.name.isalnum() and not all(c in "-_" for c in self.name):
|
|
raise ValueError("名称只能包含字母、数字、下划线和中划线")
|
|
if self.status not in [0, 1]:
|
|
raise ValueError("是否启用必须为0或1")
|
|
# 描述校验:描述最大长度
|
|
if self.description and len(self.description) > 255:
|
|
raise ValueError("描述长度不能超过255个字符")
|
|
return self
|
|
|
|
|
|
class DemoUpdateSchema(DemoCreateSchema):
|
|
"""更新模型"""
|
|
|
|
|
|
class DemoOutSchema(DemoCreateSchema, BaseSchema, UserBySchema, TenantBySchema):
|
|
"""响应模型"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
@dataclass
|
|
class DemoQueryParam(BaseQueryParam, UserByQueryParam, TenantByQueryParam):
|
|
"""示例查询参数(演示 Mixin 继承用法)"""
|
|
|
|
def __init__(
|
|
self,
|
|
name: str | None = Query(None, description="名称"),
|
|
description: str | None = Query(None, description="描述"),
|
|
status: str | None = Query(None, description="是否启用"),
|
|
*args,
|
|
**kwargs,
|
|
) -> None:
|
|
super().__init__(*args, **kwargs)
|
|
if name:
|
|
self.name = (QueueEnum.like.value, name)
|
|
if description:
|
|
self.description = (QueueEnum.like.value, description)
|
|
if status:
|
|
self.status = (QueueEnum.eq.value, status)
|