"""共享白板实体。 一个白板由 board_id 唯一标识(用户可读的 url id),strokes 以 JSON 列保存全部笔画。 白板长期留存,进程重启后仍可恢复;实时协作由 WebSocket hub 在内存中维护在线连接, 笔画变更经 service 落库后由 hub 广播给同 board 的其它在线连接。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import BigInteger, DateTime, Integer, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column from ..database import Base class Whiteboard(Base): __tablename__ = "whiteboard" id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) # 用户可读的 url id([a-zA-Z0-9_-]{1,64}),全局唯一 board_id: Mapped[str] = mapped_column(String(64), nullable=False, unique=True, index=True) # 笔画数组 [{points:[[x,y],...], color, width}, ...] strokes: Mapped[list] = mapped_column(JSON, nullable=False, default=list) # 修改次数:每次新增笔画或清空 +1,供管理页统计 stroke_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) created_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), nullable=False ) updated_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), onupdate=func.now(), nullable=False ) def __repr__(self) -> str: # pragma: no cover return ( f"" )