04e467e433
后端: - 微信回调 db.commit 失败仍返回 SUCCESS,避免无限重试 - recharge() 加 order_id 幂等保护,防重复充值 - time_expire 使用北京时间(UTC+8),修复时区 bug - 充值档位后端配置化(points-config.yaml + /recharge-options API) - 代码审查 20 项修复(认证加固、扣费顺序、错误响应、状态同步等) 前端: - 充值弹窗:自动轮询 + 【我已支付】手动兜底 - 二维码倒计时显示,过期后遮罩 + 刷新按钮 - 充值档位从后端动态加载 - 去掉 select/qrcode 弹窗标题,金额红色突出显示 - 全项目命名统一(视频生成/压制成片/配音合成/声音复刻等) - Modal 关闭按钮独立于 title 显示
47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
"""
|
||
分镜(Segment)统一 Schema
|
||
==========================
|
||
|
||
业务层唯一分镜模型,取代以下历史重复定义:
|
||
- ScriptShot(script.py)
|
||
- ShotData(api/v1/video.py)
|
||
- ShotUnit(scheduler/models.py)
|
||
"""
|
||
|
||
from typing import Literal
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
from app.schemas.enums import SegmentStatus
|
||
|
||
|
||
class Segment(BaseModel):
|
||
"""视频分镜/镜头定义
|
||
|
||
术语说明:
|
||
- segment: 分镜
|
||
- empty_shot: 空镜
|
||
"""
|
||
|
||
id: str = Field(..., description="分镜ID")
|
||
type: Literal["segment", "empty_shot"] = Field(
|
||
default="segment", description="分镜类型: segment(分镜) 或 empty_shot(空镜)"
|
||
)
|
||
scene: str = Field(default="", description="场景描述/画面描述")
|
||
voiceover: str = Field(default="", description="配音文本(空镜可为空)")
|
||
duration: int | None = Field(default=None, description="时长(秒)")
|
||
voice_id: str | None = Field(default=None, description="音色ID(空镜时使用)")
|
||
status: SegmentStatus = Field(default=SegmentStatus.PENDING)
|
||
provider_task_id: str | None = Field(
|
||
default=None, description="供应商任务ID"
|
||
)
|
||
video_url: str | None = Field(default=None, description="生成后的视频URL")
|
||
local_path: str | None = Field(default=None, description="本地视频路径")
|
||
qiniu_url: str | None = Field(default=None, description="七牛云URL")
|
||
error_message: str | None = Field(default=None, description="错误信息")
|
||
stage: str | None = Field(
|
||
default=None, description="内部处理阶段(如 image_generating / video_processing)"
|
||
)
|
||
image_task_id: str | None = Field(default=None, description="空镜文生图任务ID(内部使用)")
|
||
query_fail_count: int = Field(default=0, description="查询失败计数")
|