Files
YuShiSheJiShi/backend/app/models/design.py
8f5a86418e feat(design): 添加360视频和3D模型生成功能支持
- 在Design模型中新增video_url字段用于存储360度展示视频URL
- 在DesignImage模型中新增model_3d_url字段用于存储3D模型URL
- 设计路由新增生成视频接口,调用火山引擎即梦3.0 Pro API生成展示视频
- 设计路由新增生成3D模型接口,调用腾讯混元3D服务生成.glb格式3D模型
- 新增本地文件删除工具,支持强制重新生成时清理旧文件
- 设计响应Schema中添加video_url和model_3d_url字段支持前后端数据传递
- 前端设计详情页新增360度旋转3D模型展示区,支持生成、重新生成和下载3D模型
- 实现录制3D模型展示视频功能,支持捕获model-viewer旋转画面逐帧合成WebM文件下载
- 引入@google/model-viewer库作为3D模型Web组件展示支持
- 管理后台新增即梦视频生成和腾讯混元3D模型生成配置界面,方便服务密钥管理
- 前端API增加生成视频和生成3D模型接口请求方法,超时设置为10分钟以支持长时间处理
- 优化UI交互提示,新增生成中状态显示和错误提示,提升用户体验和操作反馈
2026-03-27 23:26:56 +08:00

42 lines
2.1 KiB
Python

"""
设计作品模型
"""
from sqlalchemy import Column, BigInteger, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from ..database import Base
class Design(Base):
"""设计作品表"""
__tablename__ = "designs"
id = Column(BigInteger, primary_key=True, autoincrement=True, comment="设计ID")
user_id = Column(BigInteger, ForeignKey("users.id"), nullable=False, comment="用户ID")
category_id = Column(Integer, ForeignKey("categories.id"), nullable=False, comment="品类ID")
sub_type_id = Column(Integer, ForeignKey("sub_types.id"), nullable=True, comment="子类型ID")
color_id = Column(Integer, ForeignKey("colors.id"), nullable=True, comment="颜色ID")
prompt = Column(Text, nullable=False, comment="设计需求")
carving_technique = Column(String(50), nullable=True, comment="雕刻工艺")
design_style = Column(String(50), nullable=True, comment="设计风格")
motif = Column(String(100), nullable=True, comment="题材纹样")
size_spec = Column(String(100), nullable=True, comment="尺寸规格")
surface_finish = Column(String(50), nullable=True, comment="表面处理")
usage_scene = Column(String(50), nullable=True, comment="用途场景")
image_url = Column(Text, nullable=True, comment="设计图URL")
video_url = Column(Text, nullable=True, comment="360度展示视频URL")
status = Column(String(20), default="generating", comment="状态")
created_at = Column(DateTime, server_default=func.now(), comment="创建时间")
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="更新时间")
# 关联关系
user = relationship("User", back_populates="designs")
category = relationship("Category", back_populates="designs")
sub_type = relationship("SubType", back_populates="designs")
color = relationship("Color", back_populates="designs")
images = relationship("DesignImage", back_populates="design", cascade="all, delete-orphan", order_by="DesignImage.sort_order")
def __repr__(self):
return f"<Design(id={self.id}, status='{self.status}')>"