Files
meijiaka-zy/python-api/app/models/broll_material.py
T
小鱼开发 447f3c2ffe feat: 空镜素材系统数据库化 + 修复积分不足弹窗叠加
后端:
- 新增 BrollCategory/BrollMaterial/BrollTag 模型及表(mjk_categories/materials/tags)
- 新增 Alembic 迁移 69274ce979a5
- 新增 broll_category/broll_material CRUD 层
- 重构 material_service:删除 JSON 配置,改用 PostgreSQL + Redis 去重
- 新增 /materials/batch-match 接口,删除 /materials/reload
- usage_count 原子递增,Redis 失败自动降级

前端:
- materials API 改为 projectId 去重,新增 batchMatch
- VideoGeneration 批量匹配改用 batchMatch,删除 usedUrls 手动维护
- 修复积分不足时进度弹窗与充值弹窗叠加的 bug
- 操作前预检积分,不足时显示提示条+立即充值按钮
2026-05-11 17:40:38 +08:00

60 lines
1.6 KiB
Python

"""
素材主表模型
============
空镜视频片段的元数据中心,一行代表一个素材。
素材直接挂载在三级分类(mjk_categories.level=3)下,
匹配时通过 category_id 精确关联到具体场景分类。
"""
from sqlalchemy import BigInteger, ForeignKey, String
from sqlalchemy.orm import Mapped, mapped_column
from app.models.base import BaseModelBigInt
class BrollMaterial(BaseModelBigInt):
"""空镜素材主表"""
__tablename__ = "mjk_materials"
category_id: Mapped[int] = mapped_column(
BigInteger,
ForeignKey("mjk_categories.id"),
nullable=False,
comment="所属三级分类ID,关联 mjk_categories",
)
title: Mapped[str] = mapped_column(
String(256),
nullable=False,
comment="素材标题/文件名,运营后台识别用",
)
url: Mapped[str] = mapped_column(
String(1024),
nullable=False,
comment="七牛云 CDN 访问地址,FFmpeg合成和前端播放直接使用",
)
duration: Mapped[float] = mapped_column(
default=0,
nullable=False,
comment="视频时长(秒),FFmpeg probe 提取,入库时必须大于0",
)
usage_count: Mapped[int] = mapped_column(
BigInteger,
default=0,
nullable=False,
comment="累计使用次数,驱动加权随机算法",
)
status: Mapped[str] = mapped_column(
String(16),
default="active",
nullable=False,
comment="状态:active(可用)/ disabled(下架)/ deleted(软删除)",
)