From 78f15c80a190af453346e36e4e4cfa606605c068 Mon Sep 17 00:00:00 2001 From: Zayden Jung Date: Tue, 19 May 2026 00:05:56 +0800 Subject: [PATCH] enrich user-project interaction statistics --- app/models/interaction.py | 10 +++++----- app/models/project.py | 9 +++++++-- app/models/user.py | 22 +++++++++++++++++++--- app/models/workspace.py | 12 +++++++++++- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/app/models/interaction.py b/app/models/interaction.py index 625291e..702c8ce 100644 --- a/app/models/interaction.py +++ b/app/models/interaction.py @@ -69,10 +69,10 @@ class ProjectShare(Base, AutoID): share_target = Column(String, default="internal", nullable=False) # 如果是转发到特定工作区,可以记录目标工作区 ID - target_workspace_id = Column( - String(Workspace.id_length()), - ForeignKey("workspaces.id", ondelete="SET NULL"), - nullable=True - ) + # target_workspace_id = Column( + # String(Workspace.id_length()), + # ForeignKey("workspaces.id", ondelete="SET NULL"), + # nullable=True + # ) created_at = Column(DateTime(timezone=True), server_default=func.now()) \ No newline at end of file diff --git a/app/models/project.py b/app/models/project.py index f5ebd7b..63f5ccd 100644 --- a/app/models/project.py +++ b/app/models/project.py @@ -15,7 +15,8 @@ class ProjectItem(Base, AutoID): ForeignKey("workspaces.id", ondelete="CASCADE"), index=True, ) - # 自引用外键:如果是根目录下的顶级节点,则 parent_id 为 Null + # 自引用外键 + # 如果是根目录下的顶级节点,则 parent_id 为 Null parent_id = Column( String(AutoID.id_length()), # 其实调用的就是自身的 id_length 方法 ForeignKey("project_items.id", ondelete="CASCADE"), @@ -30,10 +31,14 @@ class ProjectItem(Base, AutoID): # 如果是 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()) \ No newline at end of file diff --git a/app/models/user.py b/app/models/user.py index 1fe84a3..ab8aaaa 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -20,9 +20,25 @@ class User(Base, AutoID): # ---- 互动统计字段 ---- following_count = Column(Integer, default=0, nullable=False, server_default="0") # 关注了多少人 follower_count = Column(Integer, default=0, nullable=False, server_default="0") # 粉丝数 - likes_received_count = Column(Integer, default=0, nullable=False, server_default="0") # 收到的点赞数 - favorites_received_count = Column(Integer, default=0, nullable=False, server_default="0") # 收到的收藏数 - + + # 作为 Owner (所有者) 身份在各个空间获得的累计总数 + owner_project_count = Column(Integer, default=0, nullable=False, server_default="0") + owner_likes_count = Column(Integer, default=0, nullable=False, server_default="0") + owner_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") + owner_shares_count = Column(Integer, default=0, nullable=False, server_default="0") + + # 作为 Admin (管理员) 身份在各个空间获得的累计总数 + admin_project_count = Column(Integer, default=0, nullable=False, server_default="0") + admin_likes_count = Column(Integer, default=0, nullable=False, server_default="0") + admin_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") + admin_shares_count = Column(Integer, default=0, nullable=False, server_default="0") + + # 作为 User (普通用户) 身份在各个空间获得的累计总数 + user_project_count = Column(Integer, default=0, nullable=False, server_default="0") + user_likes_count = Column(Integer, default=0, nullable=False, server_default="0") + user_favorites_count = Column(Integer, default=0, nullable=False, server_default="0") + user_shares_count = Column(Integer, default=0, nullable=False, server_default="0") + created_at = Column(DateTime(timezone=True), server_default=func.now()) def __repr__(self): diff --git a/app/models/workspace.py b/app/models/workspace.py index 0935c7c..6a42ea9 100644 --- a/app/models/workspace.py +++ b/app/models/workspace.py @@ -1,5 +1,5 @@ from typing import TYPE_CHECKING -from sqlalchemy import Column, DateTime, String, ForeignKey, BigInteger, UniqueConstraint +from sqlalchemy import Column, DateTime, String, ForeignKey, BigInteger, UniqueConstraint, Integer from sqlalchemy.sql import func from .base import AutoID, Base @@ -15,6 +15,11 @@ class Workspace(Base, AutoID): slug = Column(String, unique=True, index=True, nullable=False) logo = Column(String, nullable=True) description = Column(String, nullable=True) + + total_project_count = Column(Integer, default=0, nullable=False, server_default="0") + total_like_count = Column(Integer, default=0, nullable=False, server_default="0") + total_favorite_count = Column(Integer, default=0, nullable=False, server_default="0") + total_share_count = Column(Integer, default=0, nullable=False, server_default="0") # 存储容量上限(单位:字节 Bytes),默认 5GB storage_limit = Column(BigInteger, default=5 * 1024 * 1024 * 1024) @@ -47,6 +52,11 @@ class WorkspaceMember(Base, AutoID): # 角色权限:'owner' (所有者), 'admin' (管理员), 'user' (普通用户) role = Column(String, default="user", nullable=False) + likes_received_count = Column(Integer, default=0, nullable=False, server_default="0") + favorites_received_count = Column(Integer, default=0, nullable=False, server_default="0") + shares_received_count = Column(Integer, default=0, nullable=False, server_default="0") + + # invite_token 用于生成邀请链接,token_expires_at 用于设置链接过期时间 invite_token = Column(String, nullable=True, unique=True) token_expires_at = Column(DateTime(timezone=True), nullable=True)