schema.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # -*- coding: utf-8 -*-
  2. from pydantic import BaseModel, ConfigDict, Field, field_validator
  3. from fastapi import Query
  4. from app.core.base_schema import BaseSchema
  5. class GenDBTableSchema(BaseModel):
  6. """数据库中的表信息(跨方言统一结构)。
  7. - 供“导入表结构”与“同步结构”环节使用。
  8. """
  9. model_config = ConfigDict(from_attributes=True)
  10. database_name: str | None = Field(default=None, description='数据库名称')
  11. table_name: str | None = Field(default=None, description='表名称')
  12. table_type: str | None = Field(default=None, description='表类型')
  13. table_comment: str | None = Field(default=None, description='表描述')
  14. class GenTableColumnSchema(BaseModel):
  15. """代码生成业务表字段创建模型(原始字段+生成配置)。
  16. - 从根本上解决问题:所有字段都设置了合理的默认值,避免None值问题
  17. """
  18. model_config = ConfigDict(from_attributes=True)
  19. table_id: int = Field(default=0, description='归属表编号')
  20. column_name: str = Field(default='', description='列名称')
  21. column_comment: str | None = Field(default='', description='列描述')
  22. column_type: str = Field(default='varchar(255)', description='列类型')
  23. column_length: str | None = Field(default='', description='列长度')
  24. column_default: str | None = Field(default='', description='列默认值')
  25. is_pk: bool = Field(default=False, description='是否主键(True是 False否)')
  26. is_increment: bool = Field(default=False, description='是否自增(True是 False否)')
  27. is_nullable: bool = Field(default=True, description='是否允许为空(True是 False否)')
  28. is_unique: bool = Field(default=False, description='是否唯一(True是 False否)')
  29. python_type: str | None = Field(default='str', description='python类型')
  30. python_field: str | None = Field(default='', description='python字段名')
  31. is_insert: bool = Field(default=True, description='是否为插入字段(True是 False否)')
  32. is_edit: bool = Field(default=True, description='是否编辑字段(True是 False否)')
  33. is_list: bool = Field(default=True, description='是否列表字段(True是 False否)')
  34. is_query: bool = Field(default=True, description='是否查询字段(True是 False否)')
  35. query_type: str | None = Field(default=None, description='查询方式(等于、不等于、大于、小于、范围)')
  36. html_type: str | None = Field(default='input', description='显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)')
  37. dict_type: str | None = Field(default='', description='字典类型')
  38. sort: int = Field(default=0, description='排序')
  39. class GenTableColumnOutSchema(GenTableColumnSchema, BaseSchema):
  40. """
  41. 业务表字段输出模型
  42. """
  43. model_config = ConfigDict(from_attributes=True)
  44. super_column: str | None = Field(default='0', description='是否为基类字段(1是 0否)')
  45. class GenTableSchema(BaseModel):
  46. """代码生成业务表更新模型(扩展聚合字段)。
  47. - 聚合:`columns`字段包含字段列表;`pk_column`主键字段;子表结构`sub_table`。
  48. """
  49. """代码生成业务表基础模型(创建/更新共享字段)。
  50. - 说明:`params`为前端结构体,后端持久化为`options`的JSON。
  51. """
  52. model_config = ConfigDict(from_attributes=True)
  53. table_name: str= Field(..., description='表名称')
  54. table_comment: str | None = Field(default=None, description='表描述')
  55. class_name: str | None = Field(default=None, description='实体类名称')
  56. package_name: str | None = Field(default=None, description='生成包路径')
  57. module_name: str | None = Field(default=None, description='生成模块名')
  58. business_name: str | None = Field(default=None, description='生成业务名')
  59. function_name: str | None = Field(default=None, description='生成功能名')
  60. sub_table_name: str | None = Field(default=None, description='关联子表的表名')
  61. sub_table_fk_name: str | None = Field(default=None, description='子表关联的外键名')
  62. parent_menu_id: int | None = Field(default=None, description='所属父级分类,生成页面时候生成菜单使用')
  63. description: str | None = Field(default=None, max_length=255, description="描述")
  64. columns: list['GenTableColumnOutSchema'] | None = Field(default=None, description='表列信息')
  65. @field_validator('table_name')
  66. @classmethod
  67. def table_name_update(cls, v: str) -> str:
  68. """更新表名称"""
  69. if not v:
  70. raise ValueError('表名称不能为空')
  71. return v
  72. class GenTableOutSchema(GenTableSchema, BaseSchema):
  73. """业务表输出模型(面向控制器/前端)。
  74. """
  75. model_config = ConfigDict(from_attributes=True)
  76. pk_column: GenTableColumnOutSchema | None = Field(default=None, description='主键信息')
  77. sub_table: GenTableSchema | None = Field(default=None, description='子表信息')
  78. sub: bool | None = Field(default=None, description='是否为子表')
  79. class GenTableQueryParam:
  80. """代码生成业务表查询参数
  81. - 支持按`table_name`、`table_comment`进行模糊检索(由CRUD层实现like)。
  82. - 空值将被忽略,不参与过滤。
  83. """
  84. def __init__(
  85. self,
  86. table_name: str | None = Query(None, description="表名称"),
  87. table_comment: str | None = Query(None, description="表注释"),
  88. ) -> None:
  89. # 模糊查询字段
  90. self.table_name = table_name
  91. self.table_comment = table_comment
  92. class GenTableColumnQueryParam:
  93. """代码生成业务表字段查询参数
  94. - `column_name`按like规则模糊查询(透传到CRUD层)
  95. """
  96. def __init__(
  97. self,
  98. column_name: str | None = Query(None, description="列名称"),
  99. ) -> None:
  100. # 模糊查询字段:约定("like", 值)格式,便于CRUD解析
  101. self.column_name = ("like", column_name)