mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-21 12:52:26 +00:00
feat: 优化表单提交逻辑和添加表单验证
refactor: 重构后端模型验证逻辑 fix: 修复资源文件路径处理和下载服务 style: 调整前端样式和布局 perf: 优化AI错误处理和提示信息 docs: 更新上传组件提示信息 test: 添加表单提交测试用例 chore: 更新依赖和配置文件
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import List, Optional
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
||||
from pydantic import BaseModel, ConfigDict, Field, model_validator, field_validator
|
||||
|
||||
from app.core.base_schema import BaseSchema
|
||||
from app.core.validator import role_permission_request_validator
|
||||
@@ -19,6 +19,49 @@ class RoleCreateSchema(BaseModel):
|
||||
status: bool = Field(default=True, description="是否启用")
|
||||
description: Optional[str] = Field(default=None, max_length=255, description="描述")
|
||||
|
||||
@field_validator("code")
|
||||
@classmethod
|
||||
def validate_code(cls, value: Optional[str]):
|
||||
if value is None:
|
||||
return value
|
||||
import re
|
||||
v = value.strip()
|
||||
if not re.match(r"^[A-Za-z][A-Za-z0-9_]{1,39}$", v):
|
||||
raise ValueError("角色编码需字母开头,允许字母/数字/下划线,长度2-40")
|
||||
return v
|
||||
|
||||
@field_validator("name")
|
||||
@classmethod
|
||||
def validate_name(cls, value: str):
|
||||
v = value.strip()
|
||||
if not v:
|
||||
raise ValueError("角色名称不能为空")
|
||||
return v
|
||||
|
||||
@model_validator(mode='before')
|
||||
@classmethod
|
||||
def _normalize(cls, values):
|
||||
if isinstance(values, dict):
|
||||
for k in ["name", "code", "description"]:
|
||||
if k in values and isinstance(values[k], str):
|
||||
values[k] = values[k].strip() or None if values[k].strip() == "" else values[k].strip()
|
||||
# bool 兼容
|
||||
if "status" in values and isinstance(values["status"], str):
|
||||
values["status"] = values["status"].strip().lower() in {"true", "1", "yes", "y"}
|
||||
# 数字兼容
|
||||
if "order" in values and isinstance(values["order"], str):
|
||||
try:
|
||||
values["order"] = int(values["order"].strip())
|
||||
except Exception:
|
||||
pass
|
||||
return values
|
||||
|
||||
@model_validator(mode='after')
|
||||
def _validate_after(self):
|
||||
if self.status is False and (not self.description or not str(self.description).strip()):
|
||||
raise ValueError("禁用状态下必须填写描述")
|
||||
return self
|
||||
|
||||
|
||||
class RolePermissionSettingSchema(BaseModel):
|
||||
"""角色权限配置模型"""
|
||||
@@ -27,6 +70,18 @@ class RolePermissionSettingSchema(BaseModel):
|
||||
menu_ids: List[int] = Field(default_factory=list, description='菜单ID列表')
|
||||
dept_ids: List[int] = Field(default_factory=list, description='部门ID列表')
|
||||
|
||||
@model_validator(mode='before')
|
||||
@classmethod
|
||||
def _normalize(cls, values):
|
||||
if isinstance(values, dict):
|
||||
for k in ["role_ids", "menu_ids", "dept_ids"]:
|
||||
if k in values and values[k] is not None:
|
||||
try:
|
||||
values[k] = list({int(x) for x in values[k]})
|
||||
except Exception:
|
||||
pass
|
||||
return values
|
||||
|
||||
@model_validator(mode='after')
|
||||
def validate_fields(self):
|
||||
"""验证权限配置字段"""
|
||||
|
||||
Reference in New Issue
Block a user