fix(自学): 少于三分钟的不算已读
原来只要打开过(viewCount > 0)就记成已读,于是「点开看一眼就退」和「认真读完」 在老师那张表上长得一模一样,「已读 17/17」并不说明他学了。加一道 3 分钟的门槛 —— 按最短的一课定的下限,读不完还翻不动的课文,扫一眼是到不了这个数的。 阈值 TUTORIAL_READ_SECONDS 放在 contract 里,前后端共用一个数:学生端目录的 ✓、 后台「按学生」的已读课数、「按课程」的读过人数,三处口径必须一致,各写各的迟早分叉。 **累计时长故意不卡**。时长记的是真实停留,不满三分钟的秒数照样算进去,于是 「已读 0 课、累计 25 分钟」成为一种能看见的状态 —— 他翻了很多课,每课都没读满。 这正是这道门槛想让老师看见的东西,把时长一起滤掉反而把信息删了。 「按课程」的人均时长跟着改了分子:分母是读满三分钟的人,分子就得是同一批人的时长, 否则拿全部时长去除达标人数,人均会被翻一眼就走的人凭空抬高。 顺带修掉「✓ 已读 · -」:心跳 15 秒一跳,点开就走会落在 0 秒上,而 readableDuration(0) 返回的是 "-"。新口径下打勾要求 ≥180 秒,这个组合不可能再出现;打开过但没读满的 显示灰色的「读了 N 分钟」,记是记下了,只是还没到「已读」。 后台筛选栏上方写了一行口径说明,免得老师对着「已读 0 课 / 累计 25 分钟」猜是不是坏了。 本机实跑:student 读 A 课 500 秒、B 课 60 秒 → 已读 1/2、累计 560 秒; A 课「读过 2 人、累计 700、人均 350」,B 课「读过 0 人、累计 60、人均 0」。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013rpSKCNpVcMhTFhw21YiL7
This commit is contained in:
@@ -141,3 +141,16 @@ export type Exercise = z.infer<typeof exerciseSchema>
|
||||
export type TutorialProgress = z.infer<typeof tutorialProgressSchema>
|
||||
export type TutorialProgressPing = z.infer<typeof tutorialProgressPingSchema>
|
||||
export type ExerciseAttemptRequest = z.infer<typeof exerciseAttemptRequestSchema>
|
||||
|
||||
/**
|
||||
* 「已读」的门槛:累计停留满 3 分钟才算读过这一课。
|
||||
*
|
||||
* 之前只要打开过(`viewCount > 0`)就记成已读,于是「点开看一眼就退」和「认真读完」
|
||||
* 在老师那张表上长得一模一样,「已读 17/17」并不说明他学了。3 分钟是按最短的一课
|
||||
* 定的下限——读不完还翻不动的课文,扫一眼是到不了这个数的。
|
||||
*
|
||||
* 门槛只管**「已读」这个口径**(学生端的 ✓、后台的已读课数与读过的人数),
|
||||
* 不动累计时长:时长记的是真实停留,不满 3 分钟的那些秒数照样算进去,
|
||||
* 「已读 0 课、累计 25 分钟」正是要让老师看见的一种情况。
|
||||
*/
|
||||
export const TUTORIAL_READ_SECONDS = 180
|
||||
|
||||
Reference in New Issue
Block a user