schema.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # -*- coding: utf-8 -*-
  2. from fastapi import Query
  3. from pydantic import BaseModel, ConfigDict, Field, model_validator, field_validator
  4. from app.core.validator import DateTimeStr
  5. from app.core.base_schema import BaseSchema
  6. from app.core.validator import role_permission_request_validator
  7. from ..dept.schema import DeptOutSchema
  8. from ..menu.schema import MenuOutSchema
  9. class RoleCreateSchema(BaseModel):
  10. """角色创建模型"""
  11. name: str = Field(..., max_length=40, description="角色名称")
  12. code: str | None = Field(default=None, max_length=40, description="角色编码")
  13. order: int | None = Field(default=1, ge=1, description='显示排序')
  14. data_scope: int | None = Field(default=1, description='数据权限范围(1:仅本人 2:本部门 3:本部门及以下 4:全部 5:自定义)')
  15. status: str = Field(default="0", description="是否启用")
  16. description: str | None = Field(default=None, max_length=255, description="描述")
  17. @field_validator("code")
  18. @classmethod
  19. def validate_code(cls, value: str | None):
  20. if value is None:
  21. return value
  22. import re
  23. v = value.strip()
  24. if not re.match(r"^[A-Za-z][A-Za-z0-9_]{1,39}$", v):
  25. raise ValueError("角色编码需字母开头,允许字母/数字/下划线,长度2-40")
  26. return v
  27. class RolePermissionSettingSchema(BaseModel):
  28. """角色权限配置模型"""
  29. data_scope: int = Field(default=1, description='数据权限范围(1:仅本人 2:本部门 3:本部门及以下 4:全部 5:自定义)')
  30. role_ids: list[int] = Field(default_factory=list, description='角色ID列表')
  31. menu_ids: list[int] = Field(default_factory=list, description='菜单ID列表')
  32. dept_ids: list[int] = Field(default_factory=list, description='部门ID列表')
  33. @model_validator(mode='after')
  34. def validate_fields(self):
  35. """验证权限配置字段"""
  36. return role_permission_request_validator(self)
  37. class RoleUpdateSchema(RoleCreateSchema):
  38. """角色更新模型"""
  39. ...
  40. class RoleOutSchema(RoleCreateSchema, BaseSchema):
  41. """角色信息响应模型"""
  42. model_config = ConfigDict(from_attributes=True)
  43. menus: list[MenuOutSchema] = Field(default_factory=list, description='角色菜单列表')
  44. depts: list[DeptOutSchema] = Field(default_factory=list, description='角色部门列表')
  45. class RoleQueryParam:
  46. """角色管理查询参数"""
  47. def __init__(
  48. self,
  49. name: str | None = Query(None, description="角色名称"),
  50. status: str | None = Query(None, description="是否可用"),
  51. created_time: list[DateTimeStr] | None = Query(None, description="创建时间范围", examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
  52. updated_time: list[DateTimeStr] | None = Query(None, description="更新时间范围", examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
  53. ) -> None:
  54. # 模糊查询字段
  55. self.name = ("like", name)
  56. # 精确查询字段
  57. self.status = status
  58. # 时间范围查询
  59. if created_time and len(created_time) == 2:
  60. self.created_time = ("between", (created_time[0], created_time[1]))
  61. if updated_time and len(updated_time) == 2:
  62. self.updated_time = ("between", (updated_time[0], updated_time[1]))