v1.7.0-preview
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:公告下方集成犇犇 widgetcustom/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 们的小社区。期待大家的关注列表越来越长、犇犇区越来越热闹!