40 lines
1.8 KiB
Python
40 lines
1.8 KiB
Python
from sqlalchemy import Column, DateTime, String, ForeignKey, Integer
|
|
from sqlalchemy.sql import func
|
|
from .base import AutoID, Base
|
|
|
|
class ProjectItem(Base, AutoID):
|
|
"""项目与文件夹的树状虚拟文件系统"""
|
|
__tablename__ = "project_items"
|
|
|
|
workspace_id = Column(
|
|
String(AutoID.id_length()),
|
|
ForeignKey("workspaces.id", ondelete="CASCADE"),
|
|
index=True,
|
|
)
|
|
# 自引用外键
|
|
# 如果是根目录下的顶级节点,则 parent_id 为 Null
|
|
parent_id = Column(
|
|
String(AutoID.id_length()), # 其实调用的就是自身的 id_length 方法
|
|
ForeignKey("project_items.id", ondelete="CASCADE"),
|
|
nullable=True,
|
|
index=True,
|
|
)
|
|
|
|
name = Column(String, nullable=False)
|
|
# 节点类型:'folder' (文件夹) 或 'project' (代表具体文件的项目实体)
|
|
node_type = Column(String, default="project", nullable=False)
|
|
|
|
# 如果是 project 节点,可以用这一列来存储其内容或配置快照(如 JSON 文本)
|
|
content = Column(String, nullable=True)
|
|
|
|
# --- 富媒体与播放信息 ---
|
|
cover_url = Column(String, nullable=True) # 封面图(可以是图片、GIF 或短视频预览 URL)
|
|
duration = Column(Integer, default=0) # 媒体时长(单位:秒,非视频/GIF 则为 0)
|
|
|
|
view_count = Column(Integer, default=0, nullable=False)
|
|
like_count = Column(Integer, default=0, nullable=False, server_default="0")
|
|
favorite_count = Column(Integer, default=0, nullable=False, server_default="0")
|
|
share_count = Column(Integer, default=0, nullable=False, server_default="0")
|
|
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now()) |