A shared archive of mistakes

把做错的题,
变成下一次的底气。

拾错是一个错题整理、间隔复习与公开复盘平台。把散落在试卷边缘的失误收进来,写清楚卡点,再在遗忘之前与它重逢。你也可以把整理好的方法分享出去。

✓ 默认私有,逐题选择公开 ✓ 内置 SM-2 复习排期 ✓ 支持克隆与来源追溯
8公开复盘
8学科覆盖
15业务数据表
30+RLS 权限策略
PUBLIC LIBRARY · 公开错题

读一份别人的复盘,
比再做十道新题更有用。

按学科、关键词和难度找到你此刻需要的那一道。静态展示版把搜索、筛选和详情阅读留在浏览器里。

当前筛选下 8 份公开复盘点击卡片查看复盘详情
没有找到匹配的错题。换一个关键词,或者切回“全部”看看。
DATABASE DESIGN · SUPABASE / POSTGRESQL

先画关系,
再写页面。

拾错不是“先做界面,再补一个数据库”。每一张表都对应一个真实页面动作:谁可以看、谁能改、删除时留下什么、列表页要不要实时 count。这份说明把表结构、主外键、RLS 与前端路由放在同一张图上。

15张业务表
8个枚举类型
30+条 RLS 策略
2个核心 RPC
身份IDENTITY
  • auth.users
  • profiles
  • notebooks
内容CONTENT
  • subjects
  • tags
  • mistakes
  • mistake_tags
互动ENGAGE
  • comments
  • favorites
  • likes
  • notebook_items
学习LEARNING
  • review_schedules
  • review_logs
治理GOVERN
  • reports
  • notifications
  • admin_audit_logs

profiles

认证用户的公开资料 · 1:1

PK iduuid → auth.users
UQ usernamecitext
roleuser_role
statususer_status
notification_prefsjsonb

认证归 auth,资料归 profiles。公开资料不暴露邮箱与密码哈希。

mistakes

错题内容与社交计数

PK iduuid
FK owner_id→ profiles
FK subject_id→ subjects
FK original_mistake_id→ mistakes
favorite / like / commentint

自引用保留克隆血缘;状态与可见性分开,草稿不会误公开。

notebooks

把题组织成专题

PK iduuid
FK owner_id→ profiles
UQ owner_idwhere is_default
is_defaultbool
notebook_items(notebook_id, mistake_id)

复合主键天然去重;每用户最多一个默认本。

01

身份与资料分离

auth.users 只负责认证,profiles 负责业务资料。公开主页可以读昵称和学校,却永远碰不到密码哈希与邮箱。

02

关系交给外键

复合主键去重,复合外键防跨题回复,num_nonnulls 约束举报目标。应用层可以犯错,数据库层不让坏数据落地。

03

读多写少,计数反规范化

信息流不实时 count()。收藏、点赞、评论、克隆用触发器维护计数,列表页只读一个整数。

04

状态与事件分开

review_schedules 存“现在”,review_logs 存“发生过”。当前排期可覆盖,学习历史不可丢。

01

评论不能跨题

复合外键 (parent_id, mistake_id) 指向 comments(id, mistake_id),回复只能挂在同一道题下。

02

举报只打一个目标

num_nonnulls(mistake_id, comment_id, target_user_id) = 1,三个可空外键恰好一个非空。

03

计数不能伪造

before insert or update 触发器重置计数并锁定 published_at,客户端不能改 owner 或发布时间。

04

复习状态可覆盖

状态表存当前到期日,日志表存每次评分;评分在 review_mistake() RPC 里原子完成。

PLATFORM · 不只把 Supabase 当数据库

从登录、头像、评论通知,
到每日复习提醒。

同一套项目里,把认证、内容、文件、通知与复习提醒都放在 Supabase 的能力边界内。

A

Auth

@supabase/ssr

Cookie 会话 + middleware 刷新;注册触发器创建 profile 与默认错题本。

P

Postgres

RLS + Trigger

权限、约束、计数器、审计都放在数据库层,前端不是最后一道防线。

S

Storage

2 buckets

avatars / question-images;公共读,写入限制在用户目录。

R

Realtime

publication

comments / notifications 已加入发布;前端订阅可继续扩展。

λ

Edge Functions

review-reminder

定时扫描到期复习,写通知,支持分页与去重。

ƒ

View / RPC

3 个入口

mistake_feed / get_public_stats / review_mistake,读模型与写操作各有边界。

VERIFY · 不是画完架构图就结束

构建、数据库、权限,
三条线都跑过一遍。

21条路由构建通过
0TypeScript 错误
18.4PostgreSQL 实跑

边界:静态展示版只保留公开阅读体验;完整登录、写入、管理后台和 Supabase 会话需在 Next.js 服务端运行。演示数据来自项目内置样例。

已实际验证

  • 注册 → 自动建 profile + 默认错题本
  • 题主看到 2 题,其他用户只看到 1 题
  • 收藏 / 评论计数、克隆回退到 0
  • 评论与收藏通知、管理员隐藏评论

负向测试

  • 改角色 / 改计数 / 改发布时间
  • 克隆私有题 / 给私有题建复习
  • 跨题回复 / rating = null
  • 公开本混入私有题
REVIEW DETAIL · 错题复盘

题目

我的卡点

复盘与答案

这是只读演示:完整版本支持收藏、点赞、评论、克隆与间隔复习。接入 Supabase 后,这些动作会写回数据库。