Skip to content

Releases: ZemuZzz/AlgoBeatOnlineJudge

v1.7.1-stable

14 May 19:24

Choose a tag to compare

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/banneruploads/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

新部署到新环境时,确认:

  1. custom/static-libs/ 目录存在且包含 6 个 JS/CSS 文件 + fonts/ 子目录
  2. docker-compose.yml./custom/static-libs:/app/static/self/lib 挂载
  3. 容器内 /app/static/self/lib/ 能 ls 出所有文件
  4. 浏览器访问 https://你的站点/self/lib/markdown-it.min.js 返回 200

v1.7.0-preview

13 May 14:45

Choose a tag to compare

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 们的小社区。期待大家的关注列表越来越长、犇犇区越来越热闹!

v1.6.0-preview

12 May 21:35

Choose a tag to compare

本次更新是 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.ts
  • custom/models-built/homepage-banner.js + homepage-banner.ts
  • custom/views/notifications.ejs
  • custom/views/admin_banners.ejs
  • custom/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

07 May 19:57

Choose a tag to compare

🐛 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

05 May 19:41

Choose a tag to compare

🏷️ 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_TAGSwindow.__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

05 May 17:57

Choose a tag to compare

🎫 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

05 May 15:36

Choose a tag to compare

🎯 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,加入 userTierClass computed

🔧 修复 / 清理

  • 清理用户名 helper 中遗留的 enhanceUsers / enhanceUser 调用(已被全局缓存方案取代)
  • 同步更新 README,包含完整的功能清单与 SQL 初始化脚本

v1.3.3-preview

05 May 14:48

Choose a tag to compare

✨ 主要新功能

🎯 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

05 May 13:37

Choose a tag to compare

✨ 新功能

📧 邮箱验证系统

  • 通过 SMTP 自建域名发送验证邮件
  • 24 小时有效期、60 秒发送冷却
  • 未验证用户不能投稿题解、发送站内信(管理员豁免)
  • 个人资料页可主动发起验证

🎨 用户名颜色分档

  • admin 与拥有 manage_problem / manage_problem_tag / manage_user 任一权限的用户的昵称将会紫色加粗
  • 全站统一渲染(包括 SYZOJ 原生页面:讨论、排名、文章详情等)
  • 通过全局内存缓存实现,每 60 秒自动刷新

🛠 内部基建

  • 新增 syzoj.utils.renderUsername / syzoj.utils.plainUsername helper
  • 新增 syzoj.adminUserIds 全局缓存
  • 为后续 Hit 值系统铺路(v1.5 将启用更多颜色档)

v1.3.1-preview

04 May 22:24

Choose a tag to compare

🎉 v1.3.1 版本更新

各位 Algo Beat Contest 的用户们,本次更新带来了多项重磅新功能,欢迎体验!

✨ 新功能

  • 新增题解评论区,在每篇已通过审核的题解下方都可以发表评论,作者也可主动关闭某篇题解的评论
  • 新增站内信系统,点击右上角新增信封图标,即可向任意用户发送私信。可在 站内信 → 设置 中关闭来自他人的私信
  • 新增个人剪贴板功能,点击用户名菜单 → 我的剪贴板,支持私有/公开/分享链接三种可见性,可保存代码模板、常用片段等内容(单条最大 100 KB)
  • 网站新增公告系统,支持「不再弹出」选项

🛠 体验改进

  • 题目页题解列表新增「关闭投稿」开关(仅审核者可用),关闭后已通过题解仍正常可见
  • 首页对管理员显示待审核题解数量
  • 顶部导航间距优化、头像渲染修复
  • 头像源切换至更稳定的镜像

🙏 致谢

感谢所有出题组、开发组的贡献,以及测试期间各位用户的反馈。

如果你在使用中发现问题,欢迎随时通过站内信告知管理员。

—— Algo Beat Contest 开发组