feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
"""
站内消息通知相关的数据验证模型
"""
from typing import Optional, List
from datetime import datetime
from enum import Enum
from pydantic import BaseModel, Field, ConfigDict
class NotificationType(str, Enum):
"""通知类型枚举"""
POSITION_ASSIGN = "position_assign" # 岗位分配
COURSE_ASSIGN = "course_assign" # 课程分配
EXAM_REMIND = "exam_remind" # 考试提醒
TASK_ASSIGN = "task_assign" # 任务分配
SYSTEM = "system" # 系统通知
class NotificationBase(BaseModel):
"""
通知基础模型
"""
title: str = Field(..., min_length=1, max_length=200, description="通知标题")
content: Optional[str] = Field(None, description="通知内容")
type: NotificationType = Field(default=NotificationType.SYSTEM, description="通知类型")
related_id: Optional[int] = Field(None, description="关联数据ID")
related_type: Optional[str] = Field(None, max_length=50, description="关联数据类型")
class NotificationCreate(NotificationBase):
"""
创建通知模型
"""
user_id: int = Field(..., description="接收用户ID")
sender_id: Optional[int] = Field(None, description="发送者用户ID")
class NotificationBatchCreate(BaseModel):
"""
批量创建通知模型(发送给多个用户)
"""
user_ids: List[int] = Field(..., min_length=1, description="接收用户ID列表")
title: str = Field(..., min_length=1, max_length=200, description="通知标题")
content: Optional[str] = Field(None, description="通知内容")
type: NotificationType = Field(default=NotificationType.SYSTEM, description="通知类型")
related_id: Optional[int] = Field(None, description="关联数据ID")
related_type: Optional[str] = Field(None, max_length=50, description="关联数据类型")
sender_id: Optional[int] = Field(None, description="发送者用户ID")
class NotificationUpdate(BaseModel):
"""
更新通知模型
"""
is_read: Optional[bool] = Field(None, description="是否已读")
class NotificationInDB(NotificationBase):
"""
数据库中的通知模型
"""
model_config = ConfigDict(from_attributes=True)
id: int
user_id: int
is_read: bool
sender_id: Optional[int] = None
created_at: datetime
updated_at: datetime
class NotificationResponse(NotificationInDB):
"""
通知响应模型(可扩展发送者信息)
"""
sender_name: Optional[str] = Field(None, description="发送者姓名")
class NotificationListResponse(BaseModel):
"""
通知列表响应模型
"""
items: List[NotificationResponse]
total: int
unread_count: int
class NotificationCountResponse(BaseModel):
"""
未读通知数量响应模型
"""
unread_count: int
total: int
class MarkReadRequest(BaseModel):
"""
标记已读请求模型
"""
notification_ids: Optional[List[int]] = Field(None, description="通知ID列表为空则标记全部已读")