存量榜(/rankings/users、班级榜)排的都是 user_profile 的 AC 总数,名次几乎不动, 中位学生看一眼就知道追不上 —— 榜单在那批人身上是负反馈。这张榜的分母换成「这一周」, 每周一 0:00(东八区)清零,谁都可能进前十。 口径是**本周首次 AC 的题目数**,不是「本周 AC 过的去重题数」:后者把上周就做出来的题 重交一遍也算成绩,一分钟能刷满一屏。靠 NOT EXISTS 排掉本周之前已通过的 (user, problem) 对,四个条件正好是 submission_public_metrics_idx 的全部列。 - time.ts 加 weekStart():localWeekday 的 0 是周日,要先折成 7,否则周日单独成一周 - GET /rankings/weekly?scope=global|class,入榜人群与全服榜一致(教师/超管不参与) - 前端默认落在本班 —— 全服周榜上中位学生仍然看不到自己,班内 30 人那张才有答案 - 本周一题没做出来时 me 是 null,footer 那句「做出 1 题就能上榜」照样出现: 它是说给还没上榜的人听的,而那正是最需要被推一把的一批 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ad858ed864
commit
24af385f33
6 files changed
+323
-1
No files matched your search
@@ -71,6 +71,19 @@ export function todayStart(now: Date | number | string = new Date()): string {
|
||||
).toISOString()
|
||||
}
|
||||
|
||||
/**
|
||||
* 「东八区本周一」的零点,返回 ISO 字符串。周榜按自然周清零,周一起算。
|
||||
*
|
||||
* `localWeekday` 的 0 是周日(跟 `Date#getDay()` 同一套编号),直接拿来减会把周日
|
||||
* 算成「本周第一天」,于是周日一整天单独成一周、周一又清零一次 —— 所以先把 0 折成 7,
|
||||
* 得到的 `weekday - 1` 才是「从本周一到今天过了几个日历日」。
|
||||
*/
|
||||
export function weekStart(now: Date | number | string = new Date()): string {
|
||||
const today = dayNumber(calendarDay(now))
|
||||
const weekday = localWeekday(today) || 7
|
||||
return new Date((today - (weekday - 1)) * DAY_MS - OFFSET_MS).toISOString()
|
||||
}
|
||||
|
||||
/** 按北京时间的日历做月份平移,日号超出目标月长度时截到月末,时分秒毫秒原样保留 */
|
||||
export function shiftMonthsByCalendar(instant: Date, months: number): Date {
|
||||
const wall = toWallClock(instant)
|
||||
|
||||
Reference in new issue
Block a user