Backend 设计
路由挂载 (index.ts)
GET /health
POST /api/submit-answer/*
POST /api/admin/*
POST /api/auth/verify-code
admin.ts
requireAdmin()— JWT + isAdmin + !isDisplaypublish-login-code→publishLoginCode()close-login-code→clearLoginCode()reset-game→gameManager.resetGame()
auth.ts
- 校验 UUID + 6 位码
validateLoginCode→assignPlayerIdentity- 返回 internalEmail / displayName 供 NextAuth
game.ts 要点
endGame
emit('winner', { winnerEmail, winnerDisplay });
emit('tie', { finalists, finalistsDisplay });
await saveGameResult(...);
resetGame
await clearLoginCode();
await clearPlayerRegistry();
// + 原有 Redis 清理、SCAN 答案 key
socket.ts 要点
- Display 连接:
emitLoginCodeStatus(socket.id) - winner/tie 重连补发含 display 字段
性能
- mGet 批量查答案
- SCAN 清理 reset
- sAddInBatches 恢复 survivors(500/批)
扩展点
| 需求 | 位置 |
|---|---|
| 登录码 TTL | login-code.ts SET EX |
| 多房间 | room.ts + keys |
| 美区 OAuth 恢复 | 取消 login/page.tsx 注释 |