add social interactions, rich media metadata, and workspace description
This commit is contained in:
@@ -5,6 +5,8 @@ from .follow import Follow
|
|||||||
from .workspace import Workspace, WorkspaceMember
|
from .workspace import Workspace, WorkspaceMember
|
||||||
from .project import ProjectNode
|
from .project import ProjectNode
|
||||||
from .library import LibraryItem
|
from .library import LibraryItem
|
||||||
|
# 引入新交互表
|
||||||
|
from .interaction import ProjectLike, ProjectFavorite, ProjectShare
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"Base",
|
"Base",
|
||||||
@@ -14,5 +16,8 @@ __all__ = [
|
|||||||
"Workspace",
|
"Workspace",
|
||||||
"WorkspaceMember",
|
"WorkspaceMember",
|
||||||
"ProjectNode",
|
"ProjectNode",
|
||||||
"LibraryItem"
|
"LibraryItem",
|
||||||
|
"ProjectLike",
|
||||||
|
"ProjectFavorite",
|
||||||
|
"ProjectShare"
|
||||||
]
|
]
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
from sqlalchemy import Column, DateTime, String, ForeignKey, UniqueConstraint
|
||||||
|
from sqlalchemy.sql import func
|
||||||
|
from .base import AutoID, Base
|
||||||
|
|
||||||
|
class ProjectLike(Base, AutoID):
|
||||||
|
"""项目点赞表"""
|
||||||
|
__tablename__ = "project_likes"
|
||||||
|
|
||||||
|
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True)
|
||||||
|
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True)
|
||||||
|
|
||||||
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
|
||||||
|
# 联合唯一约束,防止同一用户重复点赞
|
||||||
|
__table_args__ = (UniqueConstraint("user_id", "project_node_id", name="uq_user_project_like"),)
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectFavorite(Base, AutoID):
|
||||||
|
"""项目收藏表"""
|
||||||
|
__tablename__ = "project_favorites"
|
||||||
|
|
||||||
|
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True)
|
||||||
|
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True)
|
||||||
|
|
||||||
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
|
||||||
|
# 联合唯一约束,防止重复收藏
|
||||||
|
__table_args__ = (UniqueConstraint("user_id", "project_node_id", name="uq_user_project_favorite"),)
|
||||||
|
|
||||||
|
|
||||||
|
class ProjectShare(Base, AutoID):
|
||||||
|
"""项目转发/分享记录表"""
|
||||||
|
__tablename__ = "project_shares"
|
||||||
|
|
||||||
|
user_id = Column(String(32), ForeignKey("users.id", ondelete="CASCADE"), index=True)
|
||||||
|
project_node_id = Column(String(32), ForeignKey("project_nodes.id", ondelete="CASCADE"), index=True)
|
||||||
|
|
||||||
|
# 转发去向或渠道,例如 'internal' (转发到其他工作区), 'twitter', 'link' (复制链接)
|
||||||
|
share_target = Column(String, default="internal", nullable=False)
|
||||||
|
|
||||||
|
# 如果是转发到特定工作区,可以记录目标工作区 ID
|
||||||
|
target_workspace_id = Column(String(32), ForeignKey("workspaces.id", ondelete="SET NULL"), nullable=True)
|
||||||
|
|
||||||
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from sqlalchemy import Column, DateTime, String, ForeignKey
|
from sqlalchemy import Column, DateTime, String, ForeignKey, Integer
|
||||||
from sqlalchemy.sql import func
|
from sqlalchemy.sql import func
|
||||||
from .base import AutoID, Base
|
from .base import AutoID, Base
|
||||||
|
|
||||||
@@ -17,4 +17,10 @@ class ProjectNode(Base, AutoID):
|
|||||||
# 如果是 project 节点,可以用这一列来存储其内容或配置快照(如 JSON 文本)
|
# 如果是 project 节点,可以用这一列来存储其内容或配置快照(如 JSON 文本)
|
||||||
content = Column(String, nullable=True)
|
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)
|
||||||
|
|
||||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||||
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
||||||
Reference in New Issue
Block a user