Releases: ZemuZzz/AlgoBeatOnlineJudge
v1.7.1-stable
v1.7.1 是 v1.7.0 后的小版本迭代,核心是给个人剪贴板装上了 Markdown 实时预览能力,以及把所有第三方静态库完全本地化。
📋 剪贴板编辑器升级
把原来的纯 textarea 改成了左右分屏编辑器:
- 左侧 Markdown 编辑器 + 右侧实时预览
- 节流 150ms 渲染,滚动同步(编辑滚到哪里,预览跟着滚)
- 字数 / 行数实时统计
- 字号、单色高亮、整体观感参考 Typora 风格
支持的渲染能力
- 代码高亮:highlight.js 11.10.0,支持 C/C++/Python/JS/Go/Rust 等所有主流语言
#include <iostream>
int main() { std::cout << "Hello"; return 0; }-
数学公式:KaTeX 0.16.11,支持行内
$...$、块级$$...$$、\[...\]、\(...\)四种分隔符
$$\int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2}$$ - Markdown 完整功能:表格、引用、列表、链接、图片、嵌入 HTML
查看页同步升级
剪贴板查看页(/clipboard/<id>)也用了完全一致的渲染管线 - 编辑器右侧看到什么,保存后查看页就是什么。
🌐 静态资源全本地化
之前页面依赖 BootCDN / staticfile / jsDelivr 这些 CDN,实际在中国大陆访问经常1.5 秒以上甚至 timeout。本次彻底改造:
- 把 markdown-it / highlight.js / KaTeX 全部下载到 host 服务器
- 通过 docker-compose bind-mount 挂到容器内
/app/static/self/lib/ - 浏览器访问
/self/lib/*.js- 同源加载,平均 < 50ms
仓库内新增
custom/static-libs/
├── markdown-it.min.js (213 KB)
├── highlight.min.js (797 KB)
├── highlight-atom-one-light.min.css
├── katex.min.js (1.4 MB)
├── katex.min.css
├── katex-auto-render.min.js
└── fonts/ (KaTeX 字体 ~30 个文件)
总大小约 950 KB,对服务器来说毫无压力。
📖 README 完整翻新
之前的 README 停留在 v1.5.0 时代,这次整个重写:
- 顶部"主要特性"按当前实际功能重组,按用户视角排序(UI → 通知 → 关注 → 犇犇 → 剪贴板 → 牌子 → ...)
- 补齐 v1.5.1 / v1.6.0 / v1.7.0 / v1.7.1 所有功能描述
- SQL 初始化脚本补全所有新表:
problem_solution.reviewer_id+reviewed_at(v1.6.0)notification(v1.6.0)homepage_banner(v1.6.0)user_follow(v1.7.0)benben_post+benben_image(v1.7.0)
- 仓库结构图加
static-libs/、uploads/banner、uploads/benben等新目录 - 部署脚本加本地化静态库下载步骤
- 版本历史按版本号倒序展示
🚀 升级方式
cd /etc/docker/compose/AlgoBeat
git pull origin main
# 拉取新增的 static-libs/ 目录(已 commit 在仓库)
# 如果只想自己下载新版:见 README 部署步骤 5
# 重启容器使新挂载生效
docker compose up -d --force-recreate web升级后强制刷新(Ctrl+F5)以清除 CSS / JS 缓存。
📜 升级 checklist
新部署到新环境时,确认:
custom/static-libs/目录存在且包含 6 个 JS/CSS 文件 +fonts/子目录docker-compose.yml有./custom/static-libs:/app/static/self/lib挂载- 容器内
/app/static/self/lib/能 ls 出所有文件 - 浏览器访问
https://你的站点/self/lib/markdown-it.min.js返回 200
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 们的小社区。期待大家的关注列表越来越长、犇犇区越来越热闹!
v1.6.0-preview
本次更新是 AlgoBeat OJ 的最大一次 UI 重构 —— 引入了洛谷风格的左侧 Sidebar 导航、站内通知中心、以及首页 Banner 轮播系统。
左侧 Sidebar
原顶部横向 menu 全部迁移到左侧可折叠 sidebar:
- 仅保留 logo + 站名 + 通知/私信/用户头像
- 垂直导航(首页/题库/比赛/评测/排名/讨论/标签/工单/帮助)
- 点击 ☰ 收起到 56px(只显示 icon),localStorage 记忆状态
- 页面初次加载即应用上次折叠状态,无闪烁
- Contest 内"返回比赛"按钮固定在 topbar 左侧
- admin 菜单(后台/重算 Hit/重启/题解审核/公告管理/牌子管理)依然在用户头像 dropdown 里
本版本取消移动端响应式适配,所有页面固定按 1200px 桌面宽度渲染。手机用户可手动横向滚动查看。
通知中心
全新独立的 notification 系统:
- 列表页
/notifications支持全部/未读切换、单条已读、全部已读、删除 - header 加铃铛图标显示未读数 badge
- 触发场景(v1.6.0 接入):
- 题解审核通过 → 通知作者
- 题解审核拒绝 → 通知作者(含拒绝原因)
- 工单公开回复(非内部备注) → 通知工单创建者
- 工单状态变更 → 通知工单创建者
- 自动跳过
actor === recipient(自己不给自己发通知) - 提供全局 API
syzoj.utils.createNotification()给未来扩展点使用
题解审核员显示
- 已审核题解显示「审核员: xxx · 时间」
- 管理员题解审核列表:新增「处理人」列
- 旧题解(reviewer_id=NULL)保持原样不强制回填
首页 Banner 轮播 + 改版
首页改版
- Banner 轮播区(左 2/3 宽) + 近期比赛(右上 2/3) + 一言(右下 1/3)
- 公告(底部左 2/3) + 搜索/友情链接(底部右 1/3)
- 删除「今日运势」「最近更新」「排名」栏
Banner 后台管理(/admin/banners)
- 上传图片:JPG / PNG / WebP / GIF 最大 5MB
- 配置:标题(纯标识)、可选跳转链接、排序、启用开关、生效时间段
- 留空跳转链接则点击不跳转
- 文件存储:
/app/static/self/banner(host bind-mount 到./custom/uploads/banner)
首页 Banner 行为
- 多张图自动轮播,5 秒/张
- 鼠标 hover 暂停
- 左右箭头切换 + 底部圆点定位
- 跳转链接:
http:///https://自动新窗口、相对路径/xxx当前窗口
🛠️ 数据库迁移
-- problem_solution 加 2 列
ALTER TABLE problem_solution
ADD COLUMN reviewer_id INT NULL,
ADD COLUMN reviewed_at INT NULL,
ADD INDEX idx_reviewer (reviewer_id);
-- 新表
CREATE TABLE notification (...); -- 11 列
CREATE TABLE homepage_banner (...); -- 10 列完整 SQL 见仓库 README 的升级 checklist。
新增文件
custom/modules/notification.js(通知中心路由 + 通用 API)custom/modules/banner.js(banner admin 后台 + 上传 + 公开 API)custom/models-built/notification.js+notification.tscustom/models-built/homepage-banner.js+homepage-banner.tscustom/views/notifications.ejscustom/views/admin_banners.ejscustom/sidebar.css(sidebar layout 样式)custom/sidebar.js(折叠/展开逻辑)custom/mobile.css(已腾空保留,留作未来移动端适配占位)
升级方式
cd /etc/docker/compose/AlgoBeat
git pull origin main
# 数据库迁移(见 README)
# 创建 banner 上传目录
mkdir -p ./custom/uploads/banner
# 必须 force-recreate(挂载了多个新文件)
docker compose up -d --force-recreate web升级到 v1.6.0 后,刷新页面会看到全新 UI。如果用户反馈"看起来很奇怪",提示强制刷新(Ctrl+F5/Cmd+Shift+R)以清除旧 CSS 缓存。
v1.5.1-stable
🐛 Bug 修复
- 标签分类修复:题目页
暂无评定标签不再被错误归类到「算法细目」组,现归入「难度档」组并排在最末 - 取消评测严格实现:管理员标记取消评测时,
judge_state.status立即写为Cancelled;评测机后续返回的结果会被丢弃,不再覆盖 Cancelled 状态 - 邮箱验证状态显示:在个人资料
/edit页保存任意字段后,已验证用户的「邮箱验证状态」不再错误显示为「未验证」(新增全局缓存syzoj.verifiedUserIds) - 重算 Hit 值弹窗 bug:点击取消后不再误执行该任务;结果页改为
success.ejs模板,显示绿色对勾(之前永远显示红叉) - console define error:修复
user_edit.ejs加载blueimp-md5库时的ReferenceError: define is not defined
🆕 新增功能
🔄 重新评测按钮
取消评测过的提交,提交作者本人或管理员均可在详情页点击「重新评测」恢复评测状态,重新进入队列。设计与 Hydro OJ 对齐。
🛡️ 作弊判定的完整后果
被标作弊的提交,影响范围现在覆盖到:
| 维度 | 修改前 | v1.5.1 |
|---|---|---|
| 提交详情页测试点 | 显示原结果 | 隐藏测试点(类似 Cancelled) |
| 提交列表分数 | 显示原分(如 100) | 强制显示 0 |
| 比赛排行榜该题分数 | 原分 | 0 |
| 比赛排行榜该用户其他题分数 | 各自原分 | 全部清 0(未作答仍留空) |
| 比赛排行榜该用户总分 | 各题相加 | -1(自动沉底) |
| Hit 值比赛参与分 | 计入 | 剔除该比赛的所有贡献 |
数据完整性:所有"分数为 0"和"总分为 -1"逻辑都是展示层修正,原始
judge_state/contest_player数据不被污染,撤销作弊标记后立即恢复(60 秒内)。
📄 通用成功页模板 success.ejs
跟 error.ejs 对偶——绿色对勾样式,给所有"操作成功"场景使用。
🛠️ 数据库 Schema 变更
-- judge_state.status enum 新增 'Cancelled' 值
-- (typeorm 启动时自动 ALTER,无需手动执行)📦 新增文件
custom/modules/_email_verified_cache.js(全局已验证用户缓存)custom/modules/_contest_cheater_cache.js(全局比赛作弊用户缓存)custom/views/success.ejs(通用成功页模板)custom/libs-built/judger.js(SYZOJ judger 自定义版)custom/models-built/judge_state.js(让 typeorm 认识 'Cancelled')
升级方式
cd /etc/docker/compose/AlgoBeat
git pull origin main
docker compose up -d --force-recreate web
⚠️ 必须--force-recreate(不是 restart),因为 docker-compose.yml 加了多个新挂载。
v1.5.0-preview
🏷️ v1.5.0 - 用户名牌子系统
继 v1.4.0 工单系统之后,这次推出身份与荣誉层面的两个核心功能。
✨ 新功能
🏷️ 用户名牌子(参照洛谷设计)
每位用户都可以拥有一个显示在用户名右侧的小牌子(tag)。
两种获取途径:
- 拥有任意管理权限(is_admin/manage_problem/manage_problem_tag/manage_user)的用户自动获得 tag 权限
- 超管可在
/admin/user-tags后台授予普通用户 tag 权限
特性:
- 文字长度上限 12 字符
- 颜色与用户名颜色档自动一致
- 用户可在
/edit自定义文字 + 切换展示开关 - 管理员默认显示「管理员」,普通被授权者初始为空(需自己填)
- 管理员身份取消后保留 tag 且仍可修改(类似"老干部"称号)
- 完整审计:记录授权超管 + 时间戳
超级管理员特权:
- 可禁用任意非超管用户的 tag 权限
- 不能禁用自己,也不能禁用其他超管
- 禁用后用户在 /edit 看不到 tag 相关 UI
🛡️ 作弊者标签
与荣誉 tag 是两个完全独立的系统:荣誉 tag 是用户自愿展示的徽章,作弊者标签是被强加的惩罚。
触发条件:用户至少有一条 judge_state_admin_action.action_type='cheated' 记录。
视觉效果:
- 用户名变为棕色 + 删除线
- 强制显示棕色「作弊者」标签
- 覆盖一切其他视觉(原有的颜色和荣誉 tag 都被压住)
核心边界:
- 管理员豁免:管理员被标记 cheated 时无任何视觉变化(管理员的紫色 + tag 不受影响)
- 荣誉 tag 数据保留:即使被标 cheater,用户的荣誉 tag 设置不会被删除——他在 /edit 仍可继续设置(显示黄色警告"当前荣誉 tag 被作弊者身份覆盖"),作弊状态被撤销后立即恢复
🖼️ 排行榜头像
/ranklist 双 Tab(Rating + Hit) 用户名一栏左侧显示 24×24 gravatar 头像,提升识别度。
🔧 Bug 修复
admin-cache 漏掉 super admin
根因:_username_cache.js 只查 user_privilege 表里的 manage_problem 等细分权限,忽略了 user.is_admin=1。导致 super admin 没有被授予细分权限时被误识别为普通用户(灰色 tier)。
修复:用 raw SQL SELECT id FROM user WHERE is_admin = 1 补齐(typeorm boolean 处理在 mariadb 上有怪毛病,用 raw SQL 绕过)。
🛠 技术细节
- 新增 1 张数据表 user_tag(完全独立,不修改 SYZOJ 核心 schema)
- 缓存刷新顺序:user-tag-cache 启动延迟 8 秒,确保 admin-cache 先就绪
- admin fallback 逻辑:adminUserIds 里且数据库中"完全没有显式记录"的用户 → "管理员";数据库里有记录的尊重数据库(支持 admin 主动隐藏自己的 tag)
- 缓存生命周期:admin-cache、cheater-cache、user-tag-cache 都以 60 秒为周期自动刷新
- Vue 组件通过
window.__SYZOJ_USER_TAGS和window.__SYZOJ_CHEATER_USER_IDS接收数据,与 EJS 模板syzoj.utils.renderUsername()行为一致
📊 工程统计
- 新增数据表: 1 张(user_tag)
- 新增 model 文件: 1 个
- 新增 module 文件: 2 个(_user_tag.js + _user_tag_loader.js)
- 新增/修改模板: 5 个
- 修复 model/路由文件: 3 个
- 修改 CSS: 1 个
⚠️ 升级注意
如果从旧版升级,需要先初始化 user_tag 表(参见 README 中的 SQL 初始化脚本最后一段)。
v1.4.0-stable
🎫 v1.4.0 重大更新:工单系统全面上线
经过 4 个子阶段的开发,工单系统已完整上线。同时还修复了 3 个用户反馈的问题。
✨ 新功能
🎫 工单系统(参照洛谷设计)
完整覆盖 6 大类别:
- 题目工单: 题目综合 / 文本修缮 / 改进标签、难度
- 比赛工单: 申请公开赛
- 文章工单: 申请题解相关 / 撤销题解相关
- 用户工单: 用户申诉 / 申请权限变更 / 申请解除封禁
- 举报工单: 举报用户(强制要求填写举报原因)
- 综合问题: 建议或 bug 反馈 / 学术建议 / 一般咨询
完整工单流程:
- 用户创建工单(可关联题目/比赛/文章/用户)
- admin 必须先认领才能回复或改状态
- 5 状态流转: 待处理 / 处理中 / 已处理 / 已驳回 / 已关闭
- 支持附件上传(单文件 20MB,每工单最多 10 个,任意文件类型)
- 用户可撤回自己的工单
- admin 可写内部备注,工单创建者看不到
- 用户仅看自己的;admin 看全部
- 频率限制: 每用户每 24 小时最多创建 5 个
🛡️ 提交记录管理员标记
管理员可在任意提交记录详情页标记为「作弊」或「已取消」:
- 标记后该提交在站内显示对应红/灰标签(列表 + 详情页一致)
- 自动同步 ac_num: 原本是 AC 且该用户对该题没有其他有效 AC 时减 1
- 该提交从用户 Hit 值计算中剔除
- 完全可撤销: 撤销时自动恢复 ac_num
- 仅管理员或拥有 manage_problem 权限的用户可见操作按钮
🗑️ 比赛删除
管理员或比赛创建者可在比赛编辑页底部红色"危险操作"区永久删除比赛:
- 级联清理 contest_player + contest_ranklist
- 保留 rating_history(避免影响用户主页比赛历史)
🔧 Bug 修复
题解投稿开关取消按钮失效
之前点"关闭投稿"弹出确认框,点取消后题解投稿仍然被关闭。
根因: SYZOJ 的 href-post 属性创建表单提交时不检查 onclick 返回值。
修复: 改用显式 <form method="post" onsubmit="return confirm()">,取消按钮真正阻止提交。
🛠 技术细节
- 3 张工单数据表(完全独立,不修改 SYZOJ 核心 schema)
- 作弊标记独立表 judge_state_admin_action,可撤销
- 复用 SYZOJ 自带 app.multer 处理文件上传(无额外依赖)
- 工单附件存储在
custom/uploads/tickets/(已 gitignore) - Express middleware
_judge_admin_action_loader.js在 SYZOJ submission.js 前预加载标记数据到res.locals,绕过 EJS 同步模板的 await 限制
📊 工程统计
- 新增数据表: 4 张(ticket / ticket_reply / ticket_attachment / judge_state_admin_action)
- 新增 model 文件: 4 个
- 新增 module 路由文件: 4 个(_contest_delete / _judge_admin_action + loader / ticket)
- 新增/修改模板: 6 个(tickets / ticket_new / ticket / contest_edit / submission / submissions_item)
- 总代码量约 2000 行
⚠️ 升级注意
如果从旧版升级,需要先初始化新增的数据表(参见 README 中的 SQL 初始化脚本最后 4 张表)。
v1.3.4-stable
🎯 Hit 值系统完整收官
经过 v1.3.2(邮箱验证 + 紫色管理员)→ v1.3.3(引擎 + 卡片)→ v1.3.4(颜色档全店生效 + 趋势图 + 双 Tab 排名)三个版本的迭代,Hit 值生态系统现已完整上线。
✨ 本次新功能
🎨 全店用户名颜色档
- 用户名按 Hit 值显示 5 档颜色:灰(萌新)/ 蓝(业余)/ 绿(进阶)/ 橙(高手)/ 红(大神)
- 站点管理者紫色(覆盖一切)
- 全站统一渲染,包括 SYZOJ 自带页面(讨论、排名、文章、提交记录等)
- Vue 动态组件(提交列表 / 提交详情)也接入了同套颜色
📈 Hit 值趋势折线图
- 用户主页 Hit 卡片下方新增「Hit 值趋势(近 30 天)」卡片
- 4 条彩色折线对应 4 个分数维度
- 历史数据不足时优雅降级为 placeholder
📊 排名页双 Tab
/ranklist顶部新增 Tab 切换:Rating 排名 / Hit 值排名- Hit 值排名表中末列显示带颜色的 Hit 数字
🛠 内部改动
- 新增路由
GET /api/hit-history/:uid提供历史数据 - 新增模块
_ranklist.js在 SYZOJ 自带 ranklist 路由前抢先注册 - header.ejs 注入全局变量
window.__SYZOJ_USER_TIERS供 Vue 组件使用 - 拷贝并改造 SYZOJ 自带
submissions_item.ejs,加入userTierClasscomputed
🔧 修复 / 清理
- 清理用户名 helper 中遗留的
enhanceUsers/enhanceUser调用(已被全局缓存方案取代) - 同步更新 README,包含完整的功能清单与 SQL 初始化脚本
v1.3.3-preview
✨ 主要新功能
🎯 Hit 值系统
- 引入 Hit 值(满分 400)作为衡量用户综合活跃度的多维度评分
- 四个维度:基础信用分(邮箱验证 / 信息完善 / 注册时长 / 参赛门槛)、社区贡献分(题解 / 出题)、比赛参与分(含 30 天半衰减)、题目练习分(含 14 天半衰减)
- 每天凌晨自动重算 + 管理员可手动触发即时重算
- 90 天历史记录保留(为后续趋势图铺路)
- 用户主页新增 Hit 值卡片,显示总分 + 颜色档 + 4 项进度条
- 用户可在个人资料页选择隐藏自己的 Hit 卡片(不影响后台计算)
- 新增帮助页
/help/hit-value介绍公式与颜色档
🎨 颜色档预览(v1.4 起将全站生效)
| Hit 值 | 颜色 | 称号 |
|---|---|---|
| 0-99 | 灰 | 萌新 |
| 100-199 | 蓝 | 业余 |
| 200-279 | 绿 | 进阶 |
| 280-349 | 橙 | 高手 |
| 350-400 | 红 | 大神 |
| — | 紫 | 站点管理者(独立判定) |
🛠 内部基建
- 新增
syzoj.userHitScores全局内存 Map(每分钟刷新) - 新增
syzoj.userHitHidden全局 Set(隐藏开关用) - 暴露
syzoj.recalcHitScores()给外部调用 - 清理用户名 helper 中遗留的 enhanceUsers / enhanceUser 调用(已被全局 Set 方案取代)
📝 其它
- 页脚新增 GitHub 仓库链接
- 版本号升级至 V1.3.3
v1.3.2-preview
✨ 新功能
📧 邮箱验证系统
- 通过 SMTP 自建域名发送验证邮件
- 24 小时有效期、60 秒发送冷却
- 未验证用户不能投稿题解、发送站内信(管理员豁免)
- 个人资料页可主动发起验证
🎨 用户名颜色分档
- admin 与拥有
manage_problem/manage_problem_tag/manage_user任一权限的用户的昵称将会紫色加粗 - 全站统一渲染(包括 SYZOJ 原生页面:讨论、排名、文章详情等)
- 通过全局内存缓存实现,每 60 秒自动刷新
🛠 内部基建
- 新增
syzoj.utils.renderUsername/syzoj.utils.plainUsernamehelper - 新增
syzoj.adminUserIds全局缓存 - 为后续 Hit 值系统铺路(v1.5 将启用更多颜色档)
v1.3.1-preview
🎉 v1.3.1 版本更新
各位 Algo Beat Contest 的用户们,本次更新带来了多项重磅新功能,欢迎体验!
✨ 新功能
- 新增题解评论区,在每篇已通过审核的题解下方都可以发表评论,作者也可主动关闭某篇题解的评论
- 新增站内信系统,点击右上角新增信封图标,即可向任意用户发送私信。可在
站内信 → 设置中关闭来自他人的私信 - 新增个人剪贴板功能,点击用户名菜单 →
我的剪贴板,支持私有/公开/分享链接三种可见性,可保存代码模板、常用片段等内容(单条最大 100 KB) - 网站新增公告系统,支持「不再弹出」选项
🛠 体验改进
- 题目页题解列表新增「关闭投稿」开关(仅审核者可用),关闭后已通过题解仍正常可见
- 首页对管理员显示待审核题解数量
- 顶部导航间距优化、头像渲染修复
- 头像源切换至更稳定的镜像
🙏 致谢
感谢所有出题组、开发组的贡献,以及测试期间各位用户的反馈。
如果你在使用中发现问题,欢迎随时通过站内信告知管理员。
—— Algo Beat Contest 开发组