feat: 剪辑计划编辑器后端 — 模板 CRUD + 分类 + 生成校验
- domain: Template, TemplateSegment, TemplateCategory 实体 - ports: TemplateRepositoryPort Protocol - adapters: SQLAlchemyTemplateRepository + 3 个 ORM Model - application: CRUD use cases + GenerateFromTemplateUseCase - 业务规则: one_take=1片段, voice_over_mix=每段需material_type, 配音±30%警告 - schemas: Pydantic request/response models - routes: /api/v1/templates CRUD + /generate + /categories - alembic: 014_add_template_tables (templates/template_segments/template_categories) - tests: 21 个单元测试全部通过
This commit is contained in:
@@ -280,3 +280,43 @@ class RecipeItemModel(Base):
|
||||
position = Column(Integer, nullable=False, default=0)
|
||||
extra_meta = Column('metadata', JSON, nullable=False, default=dict)
|
||||
|
||||
|
||||
class TemplateModel(Base):
|
||||
__tablename__ = "templates"
|
||||
|
||||
id = Column(String(36), primary_key=True)
|
||||
user_id = Column(String(36), nullable=False, index=True)
|
||||
name = Column(String(200), nullable=False)
|
||||
mode = Column(String(30), nullable=False, index=True) # pip / person_narration / one_take / voice_over_mix
|
||||
category = Column(String(100), nullable=False, default="")
|
||||
tags = Column(JSON, nullable=False, default=list)
|
||||
title_config = Column(JSON, nullable=False, default=dict)
|
||||
subtitle_config = Column(JSON, nullable=False, default=dict)
|
||||
bgm_config = Column(JSON, nullable=False, default=dict)
|
||||
estimated_duration = Column(Float, nullable=False, default=0.0)
|
||||
is_active = Column(Boolean, nullable=False, default=True)
|
||||
created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
|
||||
updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
|
||||
class TemplateSegmentModel(Base):
|
||||
__tablename__ = "template_segments"
|
||||
|
||||
id = Column(String(36), primary_key=True)
|
||||
template_id = Column(String(36), nullable=False, index=True)
|
||||
segment_order = Column(Integer, nullable=False)
|
||||
duration_min = Column(Float, nullable=False)
|
||||
duration_max = Column(Float, nullable=False)
|
||||
material_type = Column(String(20), nullable=True) # 仅 voice_over_mix: 人物/场景
|
||||
created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
|
||||
updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
|
||||
class TemplateCategoryModel(Base):
|
||||
__tablename__ = "template_categories"
|
||||
|
||||
id = Column(String(36), primary_key=True)
|
||||
user_id = Column(String(36), nullable=False, index=True)
|
||||
name = Column(String(100), nullable=False)
|
||||
created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user