mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-26 06:19:04 +00:00
refactor(application): 重构应用模块为门户应用,支持租户隔离 feat(portal): 添加门户应用管理功能 perf(health): 新增就绪探针检查,优化健康检查接口 fix(middleware): 修复请求日志中间件的异常处理 style(menu): 调整菜单表格列顺序,优化展示效果 style(table): 优化表格内操作按钮的焦点样式 docs: 更新README文档,修正智能体框架描述 chore(deps): 移除langchain相关依赖,更新项目依赖 test: 添加多租户相关测试用例 ci: 更新CI配置,支持多租户测试环境 build: 更新构建配置,支持租户插件
99 lines
3.5 KiB
Python
99 lines
3.5 KiB
Python
from fastapi import Query
|
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
|
|
from app.common.enums import QueueEnum
|
|
from app.core.base_schema import BaseSchema
|
|
from app.core.validator import DateTimeStr
|
|
|
|
|
|
class TenantCreateSchema(BaseModel):
|
|
"""新增租户"""
|
|
|
|
name: str = Field(..., max_length=100, description="租户名称")
|
|
code: str = Field(..., max_length=100, description="租户编码")
|
|
status: str = Field(default="0", description="状态(0:正常 1:禁用)")
|
|
description: str | None = Field(default=None, max_length=255, description="描述")
|
|
start_time: DateTimeStr | None = Field(default=None, description="开始时间")
|
|
end_time: DateTimeStr | None = Field(default=None, description="结束时间")
|
|
|
|
@field_validator("name")
|
|
@classmethod
|
|
def _validate_name(cls, v: str) -> str:
|
|
v = v.strip()
|
|
if not v:
|
|
raise ValueError("名称不能为空")
|
|
return v
|
|
|
|
@field_validator("code")
|
|
@classmethod
|
|
def _validate_code(cls, v: str) -> str:
|
|
v = v.strip()
|
|
if not v:
|
|
raise ValueError("编码不能为空")
|
|
if not v.isalnum():
|
|
raise ValueError("编码只能包含字母和数字")
|
|
return v
|
|
|
|
@model_validator(mode="after")
|
|
def _validate_time_range(self):
|
|
if self.start_time and self.end_time and self.start_time > self.end_time:
|
|
raise ValueError("结束时间不能早于开始时间")
|
|
return self
|
|
|
|
|
|
class TenantUpdateSchema(BaseModel):
|
|
"""更新租户"""
|
|
|
|
name: str | None = Field(default=None, max_length=100, description="租户名称")
|
|
code: str | None = Field(default=None, max_length=100, description="租户编码")
|
|
status: str | None = Field(default=None, description="状态(0:正常 1:禁用)")
|
|
description: str | None = Field(default=None, max_length=255, description="描述")
|
|
start_time: DateTimeStr | None = Field(default=None, description="开始时间")
|
|
end_time: DateTimeStr | None = Field(default=None, description="结束时间")
|
|
|
|
@field_validator("code")
|
|
@classmethod
|
|
def _validate_code(cls, v: str | None) -> str | None:
|
|
if v is None:
|
|
return v
|
|
v = v.strip()
|
|
if not v.isalnum():
|
|
raise ValueError("编码只能包含字母和数字")
|
|
return v
|
|
|
|
@model_validator(mode="after")
|
|
def _validate_time_range(self):
|
|
if self.start_time and self.end_time and self.start_time > self.end_time:
|
|
raise ValueError("结束时间不能早于开始时间")
|
|
return self
|
|
|
|
|
|
class TenantOutSchema(TenantCreateSchema, BaseSchema):
|
|
"""租户响应"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class TenantQueryParam:
|
|
"""租户查询参数"""
|
|
|
|
def __init__(
|
|
self,
|
|
name: str | None = Query(None, description="租户名称"),
|
|
code: str | None = Query(None, description="租户编码"),
|
|
status: str | None = Query(None, description="状态"),
|
|
created_time: list[DateTimeStr] | None = Query(
|
|
None,
|
|
description="创建时间范围",
|
|
examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
|
|
),
|
|
) -> None:
|
|
if name:
|
|
self.name = (QueueEnum.like.value, name)
|
|
if code:
|
|
self.code = (QueueEnum.like.value, code)
|
|
if status:
|
|
self.status = (QueueEnum.eq.value, status)
|
|
if created_time and len(created_time) == 2:
|
|
self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
|