enrich user-project interaction statistics
This commit is contained in:
@@ -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())
|
||||||
@@ -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
@@ -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
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user