146 lines
4.2 KiB
Python
146 lines
4.2 KiB
Python
"""管理后台请求模型(对应《03-接口文档》第 11 章)"""
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class AdminLoginReq(BaseModel):
|
||
"""管理员登录(11.1)"""
|
||
|
||
username: str = Field(min_length=1, max_length=50)
|
||
password: str = Field(min_length=1, max_length=100)
|
||
|
||
|
||
class VideoReviewReq(BaseModel):
|
||
"""审核视频(11.4)"""
|
||
|
||
action: str = Field(pattern="^(approve|reject)$")
|
||
reason: str | None = Field(None, max_length=200)
|
||
|
||
|
||
class ReasonReq(BaseModel):
|
||
"""通用敏感操作原因(下架视频 / 删除评论等)"""
|
||
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class UserStatusReq(BaseModel):
|
||
"""封禁/解封用户(11.8)"""
|
||
|
||
status: int = Field(ge=1, le=2) # 1正常 2封禁
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class PointsAdjustReq(BaseModel):
|
||
"""积分调整(11.9)"""
|
||
|
||
user_id: int = Field(ge=1)
|
||
change_amount: int = Field(ge=-1000000, le=1000000) # 非 0 由服务端校验
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class ResettleReq(BaseModel):
|
||
"""人工补单(11.12)"""
|
||
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
third_trade_no: str | None = Field(None, max_length=64)
|
||
|
||
|
||
class RefundReq(BaseModel):
|
||
"""退款登记(11.12-2【敏感】):reason 必填"""
|
||
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class PackageCreateReq(BaseModel):
|
||
"""新增充值套餐(11.14)"""
|
||
|
||
amount_yuan: int = Field(ge=1, le=100000)
|
||
bonus_points: int = Field(0, ge=0)
|
||
sort: int = 0
|
||
points: int | None = Field(None, ge=0) # 不传则按汇率计算
|
||
|
||
|
||
class PackageUpdateReq(BaseModel):
|
||
"""修改充值套餐(11.15)"""
|
||
|
||
amount_yuan: int | None = Field(None, ge=1, le=100000)
|
||
bonus_points: int | None = Field(None, ge=0)
|
||
sort: int | None = None
|
||
status: int | None = Field(None, ge=0, le=1)
|
||
|
||
|
||
class GiftReq(BaseModel):
|
||
"""赠送会员/积分(11.17)"""
|
||
|
||
user_ids: list[int] = Field(min_length=1, max_length=100)
|
||
gift_type: str = Field(pattern="^(membership|points)$")
|
||
plan_code: str | None = Field(None, max_length=20)
|
||
points: int | None = Field(None, gt=0, le=1000000)
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class WithdrawReviewReq(BaseModel):
|
||
"""提现审核(11.20)"""
|
||
|
||
action: str = Field(pattern="^(approve|reject)$")
|
||
reason: str | None = Field(None, max_length=200)
|
||
|
||
|
||
class ReferralReviewReq(BaseModel):
|
||
"""推荐风控处理(11.22)"""
|
||
|
||
action: str = Field(pattern="^(release|invalid)$")
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class ConfigUpdateReq(BaseModel):
|
||
"""修改平台配置(11.24)"""
|
||
|
||
value: str = Field(max_length=500)
|
||
|
||
|
||
class ReportReviewReq(BaseModel):
|
||
"""举报处理(11.29)"""
|
||
|
||
action: str = Field(pattern="^(offline_video|delete_comment|reject)$")
|
||
reason: str = Field(min_length=1, max_length=200)
|
||
|
||
|
||
class SensitiveWordAddReq(BaseModel):
|
||
"""添加敏感词(11.31)"""
|
||
|
||
word: str = Field(min_length=1, max_length=50)
|
||
|
||
|
||
class AdminPasswordChangeReq(BaseModel):
|
||
"""管理员修改密码(11.35)"""
|
||
|
||
old_password: str = Field(min_length=1, max_length=100)
|
||
new_password: str = Field(min_length=6, max_length=100)
|
||
|
||
|
||
class AdminVideoCreateReq(BaseModel):
|
||
"""管理后台新增视频(11.36)
|
||
|
||
两种模式二选一:
|
||
- upload_token + cover_upload_token:先通过 /admin/videos/upload 获取上传凭证,
|
||
前端直传到 server/uploads 后把 token 传回(视频自动转码)
|
||
- video_url + cover_url:直接填 m3u8 地址(适合 CDN 外站 / 已经转码好的资源)
|
||
"""
|
||
|
||
title: str = Field(min_length=1, max_length=100)
|
||
description: str = Field(max_length=500, default="")
|
||
category_id: int = Field(ge=1)
|
||
tag_names: list[str] | None = Field(None)
|
||
|
||
# 模式 A:先上传再发布(token 方式)
|
||
upload_token: str | None = None
|
||
cover_upload_token: str | None = None # 可选
|
||
|
||
# 模式 B:直接填 URL(m3u8 外站)
|
||
video_url: str | None = Field(None, max_length=500)
|
||
cover_url: str | None = Field(None, max_length=500)
|
||
duration: int | None = Field(None, ge=1, le=36000) # 秒,可选
|
||
|
||
# 发布状态:默认待审核(1),也可直接发布(2)
|
||
status: int = Field(1, ge=1, le=2)
|