# models.py from pydantic import BaseModel, validator from typing import Optional, List class SendCodeRequest(BaseModel): contact: str contact_type: str action_type: str account: Optional[str] = None class UserRegister(BaseModel): account: str password: str email: str phone: Optional[str] = "" name: str gender: str code: str avatarDataUrl: Optional[str] = None age: Optional[int] = None country: Optional[str] = None region: Optional[str] = None intro: Optional[str] = None class UserLogin(BaseModel): account: str password: str remember: Optional[bool] = True # 保持登录选项:True=30天, False=24小时 class UserUpdate(BaseModel): name: Optional[str] = None intro: Optional[str] = None age: Optional[int] = None birthday: Optional[str] = None # 🚀 出生日期 country: Optional[str] = None region: Optional[str] = None gender: Optional[str] = None avatarDataUrl: Optional[str] = None bannerUrl: Optional[str] = None # 🚀 个人资料卡背景图云端URL class PasswordReset(BaseModel): old_password: Optional[str] = None new_password: str verifyContact: str verifyType: str code: str account: str class CommentCreate(BaseModel): item_id: str author: str content: str reply_to_user: Optional[str] = None parent_id: Optional[str] = None class ItemCreate(BaseModel): type: str title: str shortDesc: str fullDesc: str link: str coverUrl: Optional[str] = None imageUrls: Optional[List[str]] = [] author: str price: int = 0 github_token: Optional[str] = None netdisk_password: Optional[str] = None # ☁️ 网盘提取码(加密存储,购买后解密) is_netdisk: Optional[bool] = False # ☁️ 是否为网盘资源 is_original: Optional[bool] = False # 🎨 是否为原创作品 allow_refund: Optional[bool] = True # 💸 是否支持退款(默认支持) class ItemUpdate(BaseModel): title: Optional[str] = None shortDesc: Optional[str] = None fullDesc: Optional[str] = None link: Optional[str] = None coverUrl: Optional[str] = None imageUrls: Optional[List[str]] = [] price: Optional[int] = None github_token: Optional[str] = None netdisk_password: Optional[str] = None # ☁️ 网盘提取码 is_netdisk: Optional[bool] = None # ☁️ 是否为网盘资源 is_original: Optional[bool] = None # 🎨 是否为原创作品 allow_refund: Optional[bool] = None # 💸 是否支持退款 class FollowToggle(BaseModel): user_id: str target_account: str is_active: bool class PrivateMessage(BaseModel): sender: str receiver: str content: str class PrivacySettings(BaseModel): follows: bool likes: bool favorites: bool downloads: bool class InteractionToggle(BaseModel): item_id: str user_id: str action_type: str is_active: bool class RatingRequest(BaseModel): score: int # 1-5 @validator("score") def validate_score(cls, v): if not isinstance(v, int): raise ValueError("score must be an integer between 1 and 5") if v < 1 or v > 5: raise ValueError("score must be between 1 and 5") return v class RechargeRequest(BaseModel): account: str amount: int method: Optional[str] = "alipay" class PurchaseRequest(BaseModel): account: str item_id: str class TipRequest(BaseModel): sender_account: str target_account: str amount: int is_anonymous: bool item_id: Optional[str] = None # 🚀 新增:记录是为哪个作品打赏的 class WithdrawRequest(BaseModel): account: str amount: int alipayAccount: str real_name: str code: str # ========================================== # 📝 任务榜数据模型 # ========================================== class TaskCreate(BaseModel): """ 发布新任务 """ title: str # 任务标题 description: str # 任务详情 referenceImages: Optional[List[str]] = [] # 参考图(最多6张) referenceLink: Optional[str] = None # 参考链接 totalPrice: int # 总价格(积分) depositRatio: int # 订金比例(10/20/30/50) deadline: str # 截止时间 (ISO格式) publisher: str # 发布者账号 class TaskUpdate(BaseModel): """ 更新任务 """ title: Optional[str] = None description: Optional[str] = None referenceImages: Optional[List[str]] = None referenceLink: Optional[str] = None totalPrice: Optional[int] = None depositRatio: Optional[int] = None deadline: Optional[str] = None class TaskApply(BaseModel): """ 申请接单 """ task_id: str applicant: str # 申请者账号 message: Optional[str] = None # 申请留言 class TaskAssign(BaseModel): """ 指派接单者 """ task_id: str publisher: str # 发布者(校验权限) assignee: str # 被指派的接单者 class TaskSubmit(BaseModel): """ 接单者提交成果 """ task_id: str assignee: str # 接单者(校验权限) deliverables: List[str] # 交付物图片URL列表 note: Optional[str] = None # 备注说明 class TaskAccept(BaseModel): """ 发布者验收 """ task_id: str publisher: str # 发布者(校验权限) is_accepted: bool # True=验收通过, False=验收不通过 feedback: Optional[str] = None # 反馈意见 # ========================================== # ⚖️ P3增强:任务申诉数据模型 # ========================================== class TaskDispute(BaseModel): """ 发起申诉 """ task_id: str # 任务ID initiator: str # 申诉发起人(可以是发布者或接单者) reason: str # 申诉理由 evidence: Optional[List[str]] = [] # 证据图片URL列表 class TaskDisputeResponse(BaseModel): """ 被申诉方回应 """ dispute_id: str # 申诉ID respondent: str # 回应人 response: str # 回应内容 evidence: Optional[List[str]] = [] # 证据图片URL列表 class TaskDisputeResolve(BaseModel): """ 管理员仲裁 """ dispute_id: str # 申诉ID admin_account: str # 管理员账号 result: str # 仲裁结果: support_initiator / support_respondent / split split_ratio: Optional[int] = 50 # 分成比例(申诉方获得的百分比,仅当result=split时有效) admin_note: Optional[str] = None # 管理员备注 # ========================================== # 💬 讨论区数据模型(小红书风格图文社区) # ========================================== class PostCreate(BaseModel): """ 创建帖子 """ title: str # 标题 content: str # 正文/文案 cover_image: str # 封面图(第一张) images: Optional[List[str]] = [] # 图片列表(最多9张) author: str # 作者账号 is_original: Optional[bool] = False # 🎨 是否为原创作品 post_type: str = "image" # "image" 或 "video" video_url: Optional[str] = None # 视频 URL(仅 video 类型) class PostUpdate(BaseModel): """ 更新帖子 """ title: Optional[str] = None content: Optional[str] = None cover_image: Optional[str] = None images: Optional[List[str]] = None is_original: Optional[bool] = None # 🎨 是否为原创作品 post_type: Optional[str] = None # "image" 或 "video" video_url: Optional[str] = None # 视频 URL(仅 video 类型)