feat(排名): 个性签名挂到排名上,领奖台上每人一句、「你」卡里就地改;全服排名只列到第 100 名,展开不再卡死
- 领奖台:头像旁边一个签名气泡(手机在头像上面),只露两行,长的指上去看全文 - 「你」卡:自己的签名带「改」,就地改不用跳设置页;没写的提示「写一句个性签名」;前一名、后一名名字下面带他们的签名 - 赛道:桌面有签名的名字后面一个引号,指上去看;手机直接写在名字后面 - 个性签名以后限 30 个字(老的长签名不动,榜上只露两行) - 老师在名单「⋯」或台上气泡的「×」能清空不合适的签名(DELETE /rankings/mood/:userId) - 全服名单最多列到第 100 名:原来展开会一次摊开一千五百多人把页面卡死 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
540d88355c
commit
2553c6ddfe
10 files changed
+588
-69
No files matched your search
@@ -3,6 +3,9 @@ import { z } from "zod"
|
||||
import { sampleUserSchema } from "./common"
|
||||
import { userProfileSchema } from "./auth"
|
||||
|
||||
/** 个性签名最多几个字。以前是 256,排名上要露出来后改成 30(九成签名本来就不超过 26 字) */
|
||||
export const MOOD_MAX = 30
|
||||
|
||||
export const registerRequestSchema = z.object({
|
||||
username: z.string().trim().min(1).max(32),
|
||||
email: z.email().max(64),
|
||||
@@ -12,7 +15,8 @@ export const registerRequestSchema = z.object({
|
||||
export const updateProfileRequestSchema = z.object({
|
||||
realName: z.string().max(32).nullable().optional(),
|
||||
avatar: z.string().max(256).optional(),
|
||||
mood: z.string().max(256).nullable().optional(),
|
||||
/** 排名上要挂出来(`MOOD_MAX`),太长了榜上放不下 */
|
||||
mood: z.string().trim().max(MOOD_MAX, `个性签名最多 ${MOOD_MAX} 个字`).nullable().optional(),
|
||||
})
|
||||
|
||||
export const metricsSchema = z.object({
|
||||
|
||||
@@ -19,6 +19,12 @@ export const rankRowSchema = z.object({
|
||||
/** 自己上传的头像;还是默认头像时为 null,前端画名字最后一个字 */
|
||||
avatar: z.string().nullable(),
|
||||
className: z.string().nullable(),
|
||||
/**
|
||||
* 个性签名,没写为 null。学生拿它展示个性、炫耀(用户 2026-10-10 定的要露出来):
|
||||
* 领奖台上、「你」卡、前后一名、赛道悬停都挂着。老规矩写到 256 字,现在限 30 字,
|
||||
* 老的长签名前端只露两行、指上去看全文
|
||||
*/
|
||||
mood: z.string().nullable(),
|
||||
solved: z.number().int().nonnegative(),
|
||||
/** 做到这个数的时刻(最后一道新做对的题);一道没做对时为 null */
|
||||
reachedAt: z.string().nullable(),
|
||||
@@ -58,7 +64,13 @@ export const rankBoardSchema = z.object({
|
||||
* 中间折起来,按名次断开的地方就是折叠处
|
||||
*/
|
||||
rows: z.array(rankRowSchema),
|
||||
/** `rows` 已经是能列的全部(本年级 = 全部;全服 = 前 `cap` 名) */
|
||||
complete: z.boolean(),
|
||||
/**
|
||||
* 名单最多列到第几名:全服 100(用户 2026-10-10 定的),本班 / 本年级 null。
|
||||
* 全服一千五百多人,展开全量会把页面卡死;100 名以外不列,「你」卡上照样报名次
|
||||
*/
|
||||
cap: z.number().int().positive().nullable(),
|
||||
/** 我在这张榜上的那一行。没登录、老师、不计入排名、或者这段时间一道没做对时为 null */
|
||||
me: rankRowSchema.nullable(),
|
||||
/** 名次紧挨在我前面、后面的人 */
|
||||
|
||||
Reference in new issue
Block a user