Files
Cheng Zhou 6cefa620e4 权限监控与管理界面全面美化
重新设计权限系统所有 UI 组件的视觉风格,统一配色、圆角、阴影和交互动效:
- 实时概览:统计卡片加图标和渐变色条,健康评分改为环形进度,告警改为卡片式
- 趋势分析:图表卡片加彩色图标标识,ECharts 配色升级为渐变面积填充
- 访问日志:指标卡片带图标,日志审计改为卡片式入口,IP排行前三高亮
- IP属地:工具栏重设计,排行列表前三渐变高亮,指标卡片统一新风格
- 系统级权限:从 el-table 改为自定义卡片列表,模块块独立圆角卡片
- 项目权限配置:空状态引导优化,成员表格加头像,工具栏加背景容器
- 角色概览卡片:加进度条可视化,hover 微动效
- 接口权限矩阵:工具栏分离布局,表格圆角包裹
- 角色管理抽屉:侧边栏选中态渐变,操作行 hover 高亮

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-20 14:36:35 +08:00

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