enrich user-project interaction statistics

This commit is contained in:
2026-05-19 00:05:56 +08:00
parent 0377d5071f
commit 78f15c80a1
4 changed files with 42 additions and 11 deletions
+5 -5
View File
@@ -69,10 +69,10 @@ class ProjectShare(Base, AutoID):
share_target = Column(String, default="internal", nullable=False) share_target = Column(String, default="internal", nullable=False)
# 如果是转发到特定工作区,可以记录目标工作区 ID # 如果是转发到特定工作区,可以记录目标工作区 ID
target_workspace_id = Column( # target_workspace_id = Column(
String(Workspace.id_length()), # String(Workspace.id_length()),
ForeignKey("workspaces.id", ondelete="SET NULL"), # ForeignKey("workspaces.id", ondelete="SET NULL"),
nullable=True # nullable=True
) # )
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
+7 -2
View File
@@ -15,7 +15,8 @@ class ProjectItem(Base, AutoID):
ForeignKey("workspaces.id", ondelete="CASCADE"), ForeignKey("workspaces.id", ondelete="CASCADE"),
index=True, index=True,
) )
# 自引用外键:如果是根目录下的顶级节点,则 parent_id 为 Null # 自引用外键
# 如果是根目录下的顶级节点,则 parent_id 为 Null
parent_id = Column( parent_id = Column(
String(AutoID.id_length()), # 其实调用的就是自身的 id_length 方法 String(AutoID.id_length()), # 其实调用的就是自身的 id_length 方法
ForeignKey("project_items.id", ondelete="CASCADE"), ForeignKey("project_items.id", ondelete="CASCADE"),
@@ -30,10 +31,14 @@ class ProjectItem(Base, AutoID):
# 如果是 project 节点,可以用这一列来存储其内容或配置快照(如 JSON 文本) # 如果是 project 节点,可以用这一列来存储其内容或配置快照(如 JSON 文本)
content = Column(String, nullable=True) content = Column(String, nullable=True)
# --- 新增:富媒体与播放信息 --- # --- 富媒体与播放信息 ---
cover_url = Column(String, nullable=True) # 封面图(可以是图片、GIF 或短视频预览 URL) cover_url = Column(String, nullable=True) # 封面图(可以是图片、GIF 或短视频预览 URL)
duration = Column(Integer, default=0) # 媒体时长(单位:秒,非视频/GIF 则为 0) duration = Column(Integer, default=0) # 媒体时长(单位:秒,非视频/GIF 则为 0)
view_count = Column(Integer, default=0, nullable=False) 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()) created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now())
+19 -3
View File
@@ -20,9 +20,25 @@ class User(Base, AutoID):
# ---- 互动统计字段 ---- # ---- 互动统计字段 ----
following_count = Column(Integer, default=0, nullable=False, server_default="0") # 关注了多少人 following_count = Column(Integer, default=0, nullable=False, server_default="0") # 关注了多少人
follower_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()) created_at = Column(DateTime(timezone=True), server_default=func.now())
def __repr__(self): def __repr__(self):
+11 -1
View File
@@ -1,5 +1,5 @@
from typing import TYPE_CHECKING 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 sqlalchemy.sql import func
from .base import AutoID, Base from .base import AutoID, Base
@@ -15,6 +15,11 @@ class Workspace(Base, AutoID):
slug = Column(String, unique=True, index=True, nullable=False) slug = Column(String, unique=True, index=True, nullable=False)
logo = Column(String, nullable=True) logo = Column(String, nullable=True)
description = 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 # 存储容量上限(单位:字节 Bytes),默认 5GB
storage_limit = Column(BigInteger, default=5 * 1024 * 1024 * 1024) storage_limit = Column(BigInteger, default=5 * 1024 * 1024 * 1024)
@@ -47,6 +52,11 @@ class WorkspaceMember(Base, AutoID):
# 角色权限:'owner' (所有者), 'admin' (管理员), 'user' (普通用户) # 角色权限:'owner' (所有者), 'admin' (管理员), 'user' (普通用户)
role = Column(String, default="user", nullable=False) 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) invite_token = Column(String, nullable=True, unique=True)
token_expires_at = Column(DateTime(timezone=True), nullable=True) token_expires_at = Column(DateTime(timezone=True), nullable=True)