From cdfeb6318ff049510542586d513b9c7163f98e7d Mon Sep 17 00:00:00 2001 From: yuan <964343743@qq.com> Date: Tue, 26 Aug 2025 20:27:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor(dept):=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E6=A8=A1=E5=9E=8B=E5=B1=9E=E6=80=A7=20refactor(menu):?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8F=9C=E5=8D=95=E6=A8=A1=E5=9E=8B=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=20refactor(notice):=E4=BC=98=E5=8C=96=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E9=80=9A=E7=9F=A5=E6=A8=A1=E5=9E=8B=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=20refactor(position):=E4=BC=98=E5=8C=96=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=B1=9E=E6=80=A7=20refactor(role):=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=A7=92=E8=89=B2=E6=A8=A1=E5=9E=8B=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=20refactor(user):=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/v1/schemas/system/dept_schema.py | 19 ++++++----- .../app/api/v1/schemas/system/menu_schema.py | 12 +++---- .../api/v1/schemas/system/notice_schema.py | 6 ++-- .../api/v1/schemas/system/position_schema.py | 10 +++--- .../app/api/v1/schemas/system/role_schema.py | 15 ++++----- .../app/api/v1/schemas/system/user_schema.py | 33 +++++++++++-------- 6 files changed, 50 insertions(+), 45 deletions(-) diff --git a/backend/app/api/v1/schemas/system/dept_schema.py b/backend/app/api/v1/schemas/system/dept_schema.py index ad13eaee..e02b3238 100644 --- a/backend/app/api/v1/schemas/system/dept_schema.py +++ b/backend/app/api/v1/schemas/system/dept_schema.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- from typing import Any, Optional -from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator, validator +from pydantic import BaseModel, ConfigDict, Field, field_validator from app.core.base_schema import BaseSchema -from app.core.validator import DateTimeStr -from app.core.logger import logger + class DeptCreateSchema(BaseModel): """部门创建模型""" @@ -15,20 +14,22 @@ class DeptCreateSchema(BaseModel): parent_id: Optional[int] = Field(default=None, ge=0, description="父部门ID") description: Optional[str] = Field(default=None, max_length=500, description="备注说明") - @model_validator(mode='after') - def validate_fields(self): - if not self.name or len(self.name.strip()) == 0: + @field_validator('name') + @classmethod + def validate_name(cls, value: str): + if not value or len(value.strip()) == 0: raise ValueError("部门名称不能为空") - self.name = self.name.replace(" ", "") - return self + value = value.replace(" ", "") + return value class DeptUpdateSchema(DeptCreateSchema): """部门更新模型""" - id: int = Field(..., gt=0, description="部门ID") + id: int = Field(..., ge=1, description="部门ID") class DeptOutSchema(DeptCreateSchema, BaseSchema): """部门响应模型""" model_config = ConfigDict(from_attributes=True) + parent_name: Optional[str] = Field(default=None, max_length=40, description="父部门名称") diff --git a/backend/app/api/v1/schemas/system/menu_schema.py b/backend/app/api/v1/schemas/system/menu_schema.py index f237ede4..f22a41e9 100644 --- a/backend/app/api/v1/schemas/system/menu_schema.py +++ b/backend/app/api/v1/schemas/system/menu_schema.py @@ -12,7 +12,7 @@ class MenuCreateSchema(BaseModel): name: str = Field(..., max_length=50, description="菜单名称") type: int = Field(..., ge=1, le=4, description="菜单类型(1:目录 2:菜单 3:按钮 4:外链)") icon: Optional[str] = Field(default=None, max_length=100, description="菜单图标") - order: int = Field(default=1, ge=0, description="显示顺序") + order: int = Field(..., ge=1, description="显示顺序") permission: Optional[str] = Field(default=None, max_length=100, description="权限标识") route_name: Optional[str] = Field(default=None, max_length=100, description="路由名称") route_path: Optional[str] = Field(default=None, max_length=200, description="路由地址") @@ -25,22 +25,22 @@ class MenuCreateSchema(BaseModel): title: Optional[str] = Field(default=None, max_length=50, description="菜单标题") params: Optional[list[dict[str, str]]] = Field(default=None, description="路由参数,格式为[{key: string, value: string}]") affix: bool = Field(default=False, description="是否固定标签页(True:是 False:否)") - parent_id: Optional[int] = Field(default=None, ge=0, description="父菜单ID") + parent_id: Optional[int] = Field(default=None, ge=1, description="父菜单ID") description: Optional[str] = Field(default=None, max_length=500, description="备注说明") - @classmethod @model_validator(mode='after') - def validate_fields(cls, data): - return menu_request_validator(data) + def validate_fields(self): + return menu_request_validator(self) class MenuUpdateSchema(MenuCreateSchema): """菜单更新模型""" - id: int = Field(..., gt=0, description="菜单ID") + id: int = Field(..., ge=1, description="菜单ID") parent_name: Optional[str] = Field(default=None, max_length=50, description="父菜单名称") class MenuOutSchema(MenuCreateSchema, BaseSchema): """菜单响应模型""" model_config = ConfigDict(from_attributes=True) + parent_name: Optional[str] = Field(default=None, max_length=50, description="父菜单名称") \ No newline at end of file diff --git a/backend/app/api/v1/schemas/system/notice_schema.py b/backend/app/api/v1/schemas/system/notice_schema.py index d336bfd8..80db6a03 100644 --- a/backend/app/api/v1/schemas/system/notice_schema.py +++ b/backend/app/api/v1/schemas/system/notice_schema.py @@ -11,13 +11,13 @@ class NoticeCreateSchema(BaseModel): notice_title: str = Field(..., max_length=50, description='公告标题') notice_type: str = Field(..., description='公告类型(1通知 2公告)') notice_content: str = Field(..., description='公告内容') - status: bool = Field(True, description="是否启用(True:启用 False:禁用)") - description: Optional[str] = Field(None, max_length=255, description="公告描述") + status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)") + description: Optional[str] = Field(default=None, max_length=255, description="公告描述") class NoticeUpdateSchema(NoticeCreateSchema): """公告通知更新模型""" - id: int = Field(..., gt=0, description="公告通知ID") + id: int = Field(..., ge=1, description="公告通知ID") class NoticeOutSchema(NoticeCreateSchema, BaseSchema): diff --git a/backend/app/api/v1/schemas/system/position_schema.py b/backend/app/api/v1/schemas/system/position_schema.py index 3cf04c31..66b73f47 100644 --- a/backend/app/api/v1/schemas/system/position_schema.py +++ b/backend/app/api/v1/schemas/system/position_schema.py @@ -11,12 +11,12 @@ class PositionCreateSchema(BaseModel): name: str = Field(..., max_length=40, description="岗位名称") order: Optional[int] = Field(default=1, ge=1, description='显示排序') status: bool = Field(default=True, description="是否启用(True:启用 False:禁用)") - description: Optional[str] = Field(None, description="备注说明") + description: Optional[str] = Field(default=None, description="备注说明") class PositionUpdateSchema(PositionCreateSchema): """岗位更新模型""" - id: int = Field(..., gt=0, description="岗位ID") + id: int = Field(..., ge=1, description="岗位ID") class PositionOutSchema(PositionCreateSchema, BaseSchema): @@ -27,6 +27,6 @@ class PositionOutSchema(PositionCreateSchema, BaseSchema): class PositionOptionsOut(PositionCreateSchema): model_config = ConfigDict(from_attributes=True) - id: int = Field(description="主键ID") - created_at: DateTimeStr = Field(description="创建时间") - updated_at: DateTimeStr = Field(description="更新时间") \ No newline at end of file + id: int = Field(..., description="主键ID") + created_at: DateTimeStr = Field(..., description="创建时间") + updated_at: DateTimeStr = Field(..., description="更新时间") diff --git a/backend/app/api/v1/schemas/system/role_schema.py b/backend/app/api/v1/schemas/system/role_schema.py index 7928fc16..dbe600ba 100644 --- a/backend/app/api/v1/schemas/system/role_schema.py +++ b/backend/app/api/v1/schemas/system/role_schema.py @@ -11,7 +11,7 @@ from app.core.validator import DateTimeStr class RoleCreateSchema(BaseModel): """角色创建模型""" - name: str = Field(default=None, max_length=15, description="角色名称") + name: str = Field(..., max_length=15, description="角色名称") order: Optional[int] = Field(default=1, ge=1, description='显示排序') data_scope: Optional[int] = Field(default=1, ge=1, le=5, description='数据权限范围') status: bool = Field(default=True, description="是否启用") @@ -25,16 +25,15 @@ class RolePermissionSettingSchema(BaseModel): menu_ids: List[int] = Field(default_factory=list, description='菜单ID列表') dept_ids: List[int] = Field(default_factory=list, description='部门ID列表') - @classmethod @model_validator(mode='after') - def validate_fields(cls, data): + def validate_fields(self): """验证权限配置字段""" - return role_permission_request_validator(data) + return role_permission_request_validator(self) class RoleUpdateSchema(RoleCreateSchema): """角色更新模型""" - id: int = Field(..., gt=0, description="角色ID") + id: int = Field(..., ge=1, description="角色ID") class RoleOutSchema(RoleCreateSchema, BaseSchema): @@ -48,8 +47,8 @@ class RoleOutSchema(RoleCreateSchema, BaseSchema): class RoleOptionsOut(RoleCreateSchema): model_config = ConfigDict(from_attributes=True) - id: int = Field(description="主键ID") - created_at: DateTimeStr = Field(description="创建时间") - updated_at: DateTimeStr = Field(description="更新时间") + id: int = Field(..., description="主键ID") + created_at: DateTimeStr = Field(..., description="创建时间") + updated_at: DateTimeStr = Field(..., description="更新时间") menus: List[MenuOutSchema] = Field(default_factory=list, description='角色菜单列表') depts: List[DeptOutSchema] = Field(default_factory=list, description='角色部门列表') \ No newline at end of file diff --git a/backend/app/api/v1/schemas/system/user_schema.py b/backend/app/api/v1/schemas/system/user_schema.py index 3fbbd688..86177284 100644 --- a/backend/app/api/v1/schemas/system/user_schema.py +++ b/backend/app/api/v1/schemas/system/user_schema.py @@ -12,59 +12,63 @@ from app.core.base_schema import BaseSchema class CurrentUserUpdateSchema(BaseModel): """基础用户信息""" - name: str = Field(default=None, max_length=15, description="名称") + name: str = Field(..., max_length=15, description="名称") mobile: Optional[str] = Field(default=None, description="手机号") email: Optional[EmailStr] = Field(default=None, description="邮箱") gender: Optional[str] = Field(default=None, description="性别") avatar: Optional[str] = Field(default=None, description="头像") - @classmethod @field_validator("mobile") + @classmethod def validate_mobile(cls, value: Optional[str]): return mobile_validator(value) class UserRegisterSchema(BaseModel): """注册""" - name: str = Field(default=None, max_length=15, description="名称") + name: str = Field(..., max_length=15, description="名称") mobile: Optional[str] = Field(default=None, description="手机号") - username: str = Field(default=None, max_length=15, description="账号") - password: str = Field(default=None, max_length=128, description="密码哈希值") + username: str = Field(..., max_length=15, description="账号") + password: str = Field(..., max_length=128, description="密码哈希值") role_ids: Optional[List[int]] = Field(default=[2], description='角色ID') creator_id: Optional[int] = Field(default=1, description='创建人ID') description: Optional[str] = Field(default=f'注册用户{username}', max_length=250, description="备注") + @field_validator("mobile") + @classmethod + def validate_mobile(cls, value: Optional[str]): + return mobile_validator(value) class UserForgetPasswordSchema(BaseModel): """忘记密码""" - username: str = Field(default=None, max_length=15, description="用户名") + username: str = Field(..., max_length=15, description="用户名") mobile: Optional[str] = Field(default=None, description="手机号") - new_password: str = Field(default=None, max_length=128, description="新密码") + new_password: str = Field(..., max_length=128, description="新密码") - @classmethod @field_validator("mobile") + @classmethod def validate_mobile(cls, value: Optional[str]): return mobile_validator(value) class UserChangePasswordSchema(BaseModel): """修改密码""" - old_password: str = Field(default=None, max_length=128, description="旧密码") - new_password: str = Field(default=None, max_length=128, description="新密码") + old_password: str = Field(..., max_length=128, description="旧密码") + new_password: str = Field(..., max_length=128, description="新密码") class ResetPasswordSchema(BaseModel): """修改密码""" id: int = Field(..., description="主键ID") - password: str = Field(default=None, min_length=6, max_length=128, description="新密码") + password: str = Field(..., min_length=6, max_length=128, description="新密码") class UserCreateSchema(CurrentUserUpdateSchema): """新增""" model_config = ConfigDict(from_attributes=True) - username: str = Field(default=None, max_length=15, description="用户名") - password: Optional[str] = Field(default=None, max_length=128, description="密码哈希值") + username: str = Field(..., max_length=15, description="用户名") + password: str = Field(..., max_length=128, description="密码哈希值") status: bool = Field(default=True, description="是否可用") is_superuser: bool = Field(default=False, description="是否超管") description: Optional[str] = Field(None, max_length=255, description="备注") @@ -76,7 +80,8 @@ class UserCreateSchema(CurrentUserUpdateSchema): class UserUpdateSchema(UserCreateSchema): """更新""" - model_config = ConfigDict(from_attributes=True, exclude={"password"}) + model_config = ConfigDict(from_attributes=True) + id: int = Field(..., description="主键ID")