调试指南
登录
- 浏览器开发者工具看
/api/auth/callback/google是否 302 成功。 - 在 Neon 执行:
SELECT id, email, role FROM public.users;确认邮箱大小写无关匹配。 - 读终端是否有
[auth] public.users 表不存在。 - 改过角色后退出再登,JWT 才会更新。
票数不一致
SELECT b.id, b.voter, b.weight,
COALESCE(SUM(a.amount), 0) AS allocated
FROM public.ballots b
LEFT JOIN public.ballot_allocations a ON a.ballot_id = b.id
WHERE b.campaign = :id
GROUP BY b.id
HAVING b.weight <> COALESCE(SUM(a.amount), 0);
有结果说明规则同步与已投分票失步。可对未投票用户只刷新 weight;已投票用户缩放逻辑在 syncBallotWeightsForCampaign。
竞选状态
SELECT id, name, ongoing FROM public.campaigns WHERE id = :id;
SELECT * FROM public.campaign_rule_weights WHERE campaign_id = :id;
SELECT id, display_name FROM public.campaign_candidate_options WHERE campaign_id = :id;
Next 构建
npm run build
确认输出含 middleware 与各 dashboard 路由。缺 AUTH_SECRET 时生产构建/启动可能在 Auth.js 校验阶段失败。
权限误判
middleware 不过滤角色。若「侧栏没有入口但 URL 能打开」,对结果页是当前实现;对 admin 页应检查该页是否调用了 requireAdminSession。