feat: 优化表单提交逻辑和添加表单验证

refactor: 重构后端模型验证逻辑

fix: 修复资源文件路径处理和下载服务

style: 调整前端样式和布局

perf: 优化AI错误处理和提示信息

docs: 更新上传组件提示信息

test: 添加表单提交测试用例

chore: 更新依赖和配置文件
This commit is contained in:
zhangtao
2025-10-28 23:32:10 +08:00
parent 96335b385f
commit a1f9475f3a
37 changed files with 723 additions and 64 deletions
@@ -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):
"""验证权限配置字段"""