ymt-python / models /media.py
hsailorj's picture
Add application file
551658a
Raw
History Blame Contribute Delete
5.57 kB
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, Enum, Float, Boolean
from sqlalchemy.sql import text
from database import Base
import enum
class MediaStatus(enum.Enum):
PENDING = "pending"
UPLOADING = "uploading"
SUCCESS = "success"
FAILED = "failed"
class MediaTag(Base):
"""素材标签表"""
__tablename__ = "media_tags"
id = Column(Integer, primary_key=True, index=True, comment='主键 ID')
tag_name = Column(String(50), nullable=False, unique=True, index=True, comment='标签名称')
tag_color = Column(String(20), nullable=False, server_default="#3b82f6", comment='标签颜色(hex)')
sort_order = Column(Integer, nullable=False, server_default="0", comment='排序顺序')
company_code = Column(String(50), nullable=False, server_default="", index=True, comment='公司编码')
created_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
updated_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='更新时间')
class MediaTagMapping(Base):
"""素材-标签关联表(多对多)"""
__tablename__ = "media_tag_mappings"
id = Column(Integer, primary_key=True, index=True, comment='主键 ID')
media_id = Column(String(32), ForeignKey('media.media_id'), nullable=False, index=True, comment='素材ID')
tag_id = Column(Integer, ForeignKey('media_tags.id'), nullable=False, index=True, comment='标签ID')
created_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
class Media(Base):
__tablename__ = "media"
id = Column(Integer, primary_key=True, index=True, comment='主键 ID')
media_id = Column(String(32), nullable=False, unique=True, index=True, comment='素材唯一ID(32位UUID)')
file_name = Column(String(500), nullable=False, comment='原始文件名')
r2_key = Column(String(500), nullable=False, server_default="", comment='R2原图对象键(MD5命名)')
r2_url = Column(String(500), nullable=False, server_default="", comment='R2原图URL')
thumbnail_r2_key = Column(String(500), nullable=False, server_default="", comment='R2缩略图对象键')
thumbnail_r2_url = Column(String(500), nullable=False, server_default="", comment='R2缩略图URL')
media_type = Column(String(20), nullable=False, server_default="image", comment='媒体类型:image, video')
mime_type = Column(String(100), nullable=False, server_default="", comment='MIME类型')
file_size = Column(Integer, nullable=False, server_default="0", comment='文件大小(字节)')
width = Column(Integer, nullable=True, comment='图片宽度')
height = Column(Integer, nullable=True, comment='图片高度')
duration = Column(Float, nullable=True, comment='视频时长(秒)')
directory_id = Column(Integer, ForeignKey('media_directories.id'), nullable=True, comment='目录ID')
status = Column(Enum(MediaStatus), nullable=False, server_default="pending", comment='上传状态')
error_message = Column(Text, nullable=True, comment='错误信息')
batch_id = Column(String(32), nullable=True, index=True, comment='批次ID(批量上传时使用)')
company_code = Column(String(50), nullable=False, server_default="", index=True, comment='公司编码')
is_deleted = Column(Boolean, nullable=False, server_default="0", index=True, comment='是否已删除:0-未删除,1-已删除')
deleted_at = Column(DateTime(timezone=True), nullable=True, comment='删除时间')
# 关联关系
tags = Column(JSON, nullable=True, comment='标签ID列表(JSON数组)')
created_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
updated_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='更新时间')
class MediaDirectory(Base):
__tablename__ = "media_directories"
id = Column(Integer, primary_key=True, index=True, comment='主键 ID')
name = Column(String(100), nullable=False, comment='目录名称')
parent_id = Column(Integer, ForeignKey('media_directories.id'), nullable=True, comment='父目录ID')
company_code = Column(String(50), nullable=False, server_default="", index=True, comment='公司编码')
path = Column(String(500), nullable=False, server_default="", comment='完整路径')
level = Column(Integer, nullable=False, server_default="0", comment='目录层级')
sort_order = Column(Integer, nullable=False, server_default="0", comment='排序顺序')
cover_r2_key = Column(String(500), nullable=True, comment='目录封面图R2键')
cover_r2_url = Column(String(500), nullable=True, comment='目录封面图R2URL')
description = Column(Text, nullable=True, comment='目录描述')
is_public = Column(Boolean, nullable=False, server_default="0", comment='是否公开')
created_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP'), comment='创建时间')
updated_at = Column(DateTime(timezone=True), nullable=False, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), comment='更新时间')
# 关联关系
media_count = Column(Integer, nullable=False, server_default="0", comment='素材数量(缓存字段)')