2026-09-21 15:56:52 +08:00
|
|
|
|
"""用户 Schemas — 对接 MOM sys_user 表 + 双 Token"""
|
|
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LoginRequest(BaseModel):
|
|
|
|
|
|
username: str = Field(..., max_length=64)
|
|
|
|
|
|
password: str = Field(..., max_length=128)
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-09-21 17:07:46 +08:00
|
|
|
|
class DataScopeInfo(BaseModel):
|
|
|
|
|
|
"""业务分组数据范围 —— 供前端展示「我为什么只看到这些」。
|
|
|
|
|
|
|
|
|
|
|
|
空范围(is_empty)必须让用户看得见,否则他会以为系统坏了:
|
|
|
|
|
|
列表全空却没有任何提示,是最难排查的一类反馈。
|
|
|
|
|
|
"""
|
|
|
|
|
|
is_unrestricted: bool = False # True = 全厂(超管 / 未分组主管)
|
|
|
|
|
|
is_empty: bool = False # True = 未分组,看不到任何数据
|
|
|
|
|
|
phases: list[str] = [] # 原始阶段码,如 ["PRODUCTION"]
|
|
|
|
|
|
phase_labels: list[str] = [] # 中文标签 —— 服务端下发,避免前端再抄一份词表
|
|
|
|
|
|
groups: list[str] = [] # 所属组的显示名
|
|
|
|
|
|
is_leader: bool = False # 是否至少是一个组的组长
|
|
|
|
|
|
reason: str = "" # super_admin / grouped / supervisor_default / ungrouped
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-09-21 15:56:52 +08:00
|
|
|
|
class UserResponse(BaseModel):
|
|
|
|
|
|
id: str
|
|
|
|
|
|
username: str
|
|
|
|
|
|
display_name: str
|
|
|
|
|
|
role: str
|
|
|
|
|
|
is_active: bool = True
|
|
|
|
|
|
created_at: str | None = None
|
2026-09-21 17:07:46 +08:00
|
|
|
|
# 业务分组数据范围。只有 /auth/me 会填(登录接口不查库),故为可选,
|
|
|
|
|
|
# 老的客户端读不到这个字段也不受影响。
|
|
|
|
|
|
scope: DataScopeInfo | None = None
|
2026-09-21 15:56:52 +08:00
|
|
|
|
|
|
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LoginResponse(BaseModel):
|
|
|
|
|
|
access_token: str
|
|
|
|
|
|
refresh_token: str
|
|
|
|
|
|
token_type: str = "bearer"
|
|
|
|
|
|
user: UserResponse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RefreshRequest(BaseModel):
|
|
|
|
|
|
refresh_token: str = Field(..., description="Refresh Token")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RefreshResponse(BaseModel):
|
|
|
|
|
|
access_token: str
|
|
|
|
|
|
token_type: str = "bearer"
|