排行榜Boss列统一显示n/11

- 所有排序(无尽/Boss/图鉴)的Boss列都显示rush击败不同Boss数/总数,不再出现累计击坠数
- 服务端endless/codex排序也返回rush去重统计;ORDER BY按排序列
This commit is contained in:
JOJO 2026-08-06 16:29:18 +08:00
parent 4e41ee2bef
commit f06e31238d
2 changed files with 7 additions and 13 deletions

View File

@ -61,7 +61,7 @@ async function buildLeaderboard(sort) {
rows.forEach((row, i) => { rows.forEach((row, i) => {
const d = document.createElement("div"); const d = document.createElement("div");
d.className = "lb-row" + (meName && row.username === meName ? " me" : ""); d.className = "lb-row" + (meName && row.username === meName ? " me" : "");
const bossCell = sort === "boss" ? row.bossKills + "/" + bossTotal : String(row.bossKills); // boss 榜显示“击败几个/总共几个” const bossCell = row.bossKills + "/" + bossTotal; // 排行榜 Boss 列统一显示“击败几个/总共几个”,不再出现累计击坠数
const cells = [String(i + 1), row.username, bossCell, row.codexN + "/" + r.data.codexTotal, String(row.endlessHigh)]; const cells = [String(i + 1), row.username, bossCell, row.codexN + "/" + r.data.codexTotal, String(row.endlessHigh)];
for (const c of cells) { for (const c of cells) {
const s = document.createElement("span"); const s = document.createElement("span");

View File

@ -198,20 +198,14 @@ const BOSS_TOTAL = 11; // 与 js/enemies.js BOSSES 数量同步
function leaderboard(req, res, ctx, _body, query) { function leaderboard(req, res, ctx, _body, query) {
const sort = (query && query.get("sort")) || ""; const sort = (query && query.get("sort")) || "";
const bossSort = sort === "boss"; const bossSort = sort === "boss";
/* boss 榜:不统计累计击坠,改为 BOSS 挑战(rush)模式下击败过几个不同 Boss去重/ 总共 Boss 数 */ /* Boss 列一律统计 BOSS 挑战(rush)击败过的不同 Boss 数去重stage 0~10不再出现累计击坠数 */
const rows = bossSort ? db.prepare(` const bossSub = `(SELECT COUNT(DISTINCT r.stage) FROM runs r
SELECT u.username AS username, WHERE r.user_id=u.id AND r.mode='rush' AND r.win=1 AND r.stage BETWEEN 0 AND 10)`;
(SELECT COUNT(DISTINCT r.stage) FROM runs r const rows = db.prepare(`
WHERE r.user_id=u.id AND r.mode='rush' AND r.win=1 AND r.stage BETWEEN 0 AND 10) AS bossKills, SELECT u.username AS username, ${bossSub} AS bossKills, s.endless_high AS endlessHigh,
s.endless_high AS endlessHigh,
(SELECT COUNT(*) FROM codex_unlocks c WHERE c.user_id=u.id) AS codexN (SELECT COUNT(*) FROM codex_unlocks c WHERE c.user_id=u.id) AS codexN
FROM users u JOIN user_stats s ON s.user_id=u.id FROM users u JOIN user_stats s ON s.user_id=u.id
ORDER BY bossKills DESC, u.id ASC LIMIT 100`).all() ORDER BY ${bossSort ? "bossKills" : (LB_COLS[sort] || "endless_high")} DESC, u.id ASC LIMIT 100`).all();
: db.prepare(`
SELECT u.username AS username, s.boss_kills AS bossKills, s.endless_high AS endlessHigh,
(SELECT COUNT(*) FROM codex_unlocks c WHERE c.user_id=u.id) AS codexN
FROM users u JOIN user_stats s ON s.user_id=u.id
ORDER BY ${LB_COLS[sort] || "endless_high"} DESC, u.id ASC LIMIT 100`).all();
return ctx.ok({ rows, codexTotal: CODEX_TOTAL, bossTotal: BOSS_TOTAL, sort }); return ctx.ok({ rows, codexTotal: CODEX_TOTAL, bossTotal: BOSS_TOTAL, sort });
} }