Skip to content

v1.7.0-preview

Choose a tag to compare

@ZemuZzz ZemuZzz released this 13 May 14:45
· 3 commits to main since this release

v1.7.0 引入了完整的社交功能——关注/粉丝系统、犇犇板块(类似微博的短文配图)、以及跨模块的 @ 提及通知。AlgoBeat 从单纯的 OJ 评测站点向社区化迈进了一大步。

👥 关注/粉丝系统

  • 用户主页头部卡片显示「关注 N | 粉丝 M」(可点击进入完整列表)
  • 关注按钮三态:+ 关注(蓝)/✓ 已关注(灰)/↔ 互相关注(绿)
  • 单向关注(像微博/Twitter,无需对方同意)
  • 列表页 /user/<id>/following + /user/<id>/followers,带头像 + 昵称 + 简介
  • 不能关注自己;取关需要 confirm
  • 全局工具 syzoj.utils.getFollowRelation + countFollowing + countFollowers

关注事件通知被关注者,不限制关注上限,允许反复关注/取关。

💬 犇犇板块

借鉴洛谷"犇犇"的短文社交,但用了完全自研的实现:

发布

  • 文字 500 字以内Ctrl+Enter 快速发送
  • 最多 9 张图片(JPG/PNG/WebP/GIF 各 5MB 上限)
  • 图片自动 grid 布局(1/2/3/4/6/9 张各自适配)
  • 文字内 @username 自动转链接,触发通知

回复

  • 单层结构(嵌套自动 fold 回原创,不超过 2 层)
  • 回复也触发通知

信息流

  • 顶部 tabs:我关注的 / 我发布的 / 全部 (管理)(后者仅 admin/manage_user 可见)
  • AJAX 加载,首屏 20 条
  • 发布者用户名渲染跟全站一致(颜色 tier + 牌子 tag)

可见性规则

  • 作者本人始终可见
  • 关注作者的用户可见
  • 取关后立即不可见(查询时实时判断)
  • admin / manage_user 权限可见所有犇犇

删除

  • 软删除(is_deleted=1),回复保留
  • 作者本人可删自己的;admin/manage_user 可删任何犇犇

集成位置

  • 首页公告下方加犇犇 feed(发布表单 + tabs + AJAX 列表)

@ 提及系统(跨模块)

提供 v1.7.0 起的全站统一 @ 提及机制:

  • 全局工具 syzoj.utils.parseMentions(text) 解析 @username 提及
  • 全局工具 syzoj.utils.renderBenbenContent(text, mentionMap) 把 @ 转链接
  • 触发通知场景:
    • 犇犇内 @ 提及 → 通知被提及者
    • 犇犇回复 → 通知被回复者
    • 题解评论内 @ 提及 → 通知被提及者
    • 评论题解 → 通知题解作者(本次也补上)
  • notifiedIds 防止"评论 + @ 同一人"产生双通知

🗄 数据库迁移

-- 关注关系
CREATE TABLE user_follow (
  id INT AUTO_INCREMENT PRIMARY KEY,
  follower_id INT NOT NULL,
  followee_id INT NOT NULL,
  created_at INT NOT NULL,
  UNIQUE KEY uq_follow (follower_id, followee_id),
  INDEX idx_followee (followee_id),
  INDEX idx_follower (follower_id)
);

-- 犇犇
CREATE TABLE benben_post (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL,
  content TEXT NOT NULL,
  reply_to INT NULL,
  is_deleted TINYINT(1) DEFAULT 0,
  created_at INT NOT NULL,
  INDEX idx_user_created (user_id, created_at),
  INDEX idx_reply_to (reply_to),
  INDEX idx_deleted (is_deleted)
);

CREATE TABLE benben_image (
  id INT AUTO_INCREMENT PRIMARY KEY,
  post_id INT NOT NULL,
  filename VARCHAR(255) NOT NULL,
  original_name VARCHAR(255),
  uploader_id INT NOT NULL,
  file_size INT,
  created_at INT NOT NULL,
  INDEX idx_post (post_id)
);

文件清单

新增:

  • custom/models{,built}/user-follow.{ts,js}
  • custom/models{,built}/benben-{post,image}.{ts,js}
  • custom/modules/user_follow.js(关注/粉丝路由 + 通用 API)
  • custom/modules/_user_follow_loader.js(全局 middleware 注入 follow 数据)
  • custom/modules/benben.js(犇犇 CRUD + 信息流 API + 图片上传 + 通知)
  • custom/views/user_following.ejs(关注/粉丝列表共用模板)
  • custom/views/benben_detail.ejs(单条犇犇详情页 + 回复表单)
  • custom/views/benben_feed.ejs(发布表单 + tabs + AJAX feed widget)

修改:

  • custom/modules/solution.js:评论触发通知(作者 + @ 提及)
  • custom/views/user.ejs:头部加关注/粉丝卡片 + 关注按钮
  • custom/views/index.ejs:公告下方集成犇犇 widget
  • custom/views/footer.ejs:版本号 V1.6.0 → V1.7.0

升级步骤

cd /etc/docker/compose/AlgoBeat
git pull origin main

# 数据库迁移(见上面 SQL)

# 创建犇犇图片上传目录
mkdir -p ./custom/uploads/benben

# 必须 force-recreate(挂载了多个新文件)
docker compose up -d --force-recreate web

升级后强制刷新(Ctrl+F5)以清除 EJS / CSS 缓存。


AlgoBeat 现在不仅是评测站点,也是 OIer 们的小社区。期待大家的关注列表越来越长、犇犇区越来越热闹!