from typing import Optional from pydantic import Field from domain.dtos.base_dto import DtoBase class SysMenuBaseDto(DtoBase): menu_name: str = Field(..., title="菜单名称", max_length=30) parent_id: int = Field(0, title="父菜单ID", ge=0) order_num: int = Field(0, title="显示顺序", ge=0) path: Optional[str] = Field(None, title="路由地址", max_length=200) component: Optional[str] = Field(None, title="组件路径", max_length=100) query: Optional[str] = Field(None, title="路由参数", max_length=100) is_frame: int = Field(0, title="是否外链", ge=0, le=1) is_cache: int = Field(0, title="是否缓存", ge=0, le=1) menu_type: str = Field("M", title="菜单类型", min_length=1, max_length=1) visible: int = Field(0, title="菜单状态", ge=0, le=1) perms: Optional[str] = Field(None, title="权限标识", max_length=100) class Config: from_attributes = True class SysMenuDto(SysMenuBaseDto): id: int = Field(..., title="菜单ID", gt=0) class SysMenuCreateDto(SysMenuBaseDto): menu_name: str = Field(..., title="菜单名称", max_length=30) parent_id: int = Field(0, title="父菜单ID", ge=0) menu_type: str = Field(..., title="菜单类型", min_length=1, max_length=1) class SysMenuUpdateDto(SysMenuBaseDto): id: int = Field(..., title="菜单ID", gt=0) parent_id: Optional[int] = Field(None, title="父菜单ID", ge=0)