6cefa620e4
重新设计权限系统所有 UI 组件的视觉风格,统一配色、圆角、阴影和交互动效: - 实时概览:统计卡片加图标和渐变色条,健康评分改为环形进度,告警改为卡片式 - 趋势分析:图表卡片加彩色图标标识,ECharts 配色升级为渐变面积填充 - 访问日志:指标卡片带图标,日志审计改为卡片式入口,IP排行前三高亮 - IP属地:工具栏重设计,排行列表前三渐变高亮,指标卡片统一新风格 - 系统级权限:从 el-table 改为自定义卡片列表,模块块独立圆角卡片 - 项目权限配置:空状态引导优化,成员表格加头像,工具栏加背景容器 - 角色概览卡片:加进度条可视化,hover 微动效 - 接口权限矩阵:工具栏分离布局,表格圆角包裹 - 角色管理抽屉:侧边栏选中态渐变,操作行 hover 高亮 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
from app.schemas.user import UserResponse
|
|
|
|
StudyRole = str
|
|
|
|
|
|
class StudyMemberCreate(BaseModel):
|
|
user_id: uuid.UUID
|
|
role_in_study: StudyRole = Field(min_length=1, max_length=20)
|
|
is_active: bool = True
|
|
|
|
@field_validator("role_in_study")
|
|
@classmethod
|
|
def validate_project_role(cls, value: str) -> str:
|
|
role = value.strip()
|
|
if role == "ADMIN":
|
|
raise ValueError("ADMIN 不能作为项目角色")
|
|
return role
|
|
|
|
|
|
class StudyMemberUpdate(BaseModel):
|
|
role_in_study: Optional[StudyRole] = Field(default=None, min_length=1, max_length=20)
|
|
is_active: Optional[bool] = None
|
|
|
|
@field_validator("role_in_study")
|
|
@classmethod
|
|
def validate_project_role(cls, value: str | None) -> str | None:
|
|
if value is None:
|
|
return value
|
|
role = value.strip()
|
|
if role == "ADMIN":
|
|
raise ValueError("ADMIN 不能作为项目角色")
|
|
return role
|
|
|
|
|
|
class StudyMemberRead(BaseModel):
|
|
id: uuid.UUID
|
|
study_id: uuid.UUID
|
|
user_id: uuid.UUID
|
|
role_in_study: StudyRole
|
|
is_active: bool
|
|
added_at: datetime
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class StudyMemberReadWithUser(StudyMemberRead):
|
|
user: Optional[UserResponse] = None
|