示例功能

供替换的 Todos 与个人资料/头像示例。

这些是可运行的模式,不是预设的产品领域。两者都标为 Example,并需要先完成 Supabase Setup 中的 profilestodos 和私有 avatars storage。

Todos — Example

src/services/todos.ts 展示完整的数据路径:用于 list、create、toggle、delete 的小型、带类型 Supabase service functions。Showcase Todos route 通过 TanStack Query 使用它们。它只选择 iduser_idtitlecompletedsort_ordercreated_atupdated_at;限制行访问的是 RLS,而不是 client-side filter。

为产品功能复用这一结构:

  1. 把 transport code 放入不依赖 components 的 src/services/<domain>.ts
  2. 在 UI 中使用 useQueryuseMutation 处理读取、mutation 和 cache invalidation。
  3. 用 RLS 强制所有权;不要把传入的 user_id 当作权限依据。
  4. 明确设计 loading、empty、offline、error states。

service 是替换点。即使把 Supabase calls 换成另一种 backend,route 也不必了解该 transport 变化。

Profile 与 avatar — Example

src/services/profile.ts 读取和更新已登录用户的 profiles row。src/services/avatar.ts 展示 private-object storage:

  • 验证 PNG、JPEG、WebP,最大 5 MB。
  • 将文件 upsert 到 avatars<userId>/avatar.<extension>,再把 storage path 保存到 profiles.avatar_url
  • 用七天有效的 signed URL 读取;更新后以 updated_at 作为 cache key。
  • 删除时移除 object,再清空 avatar_url

不要为了方便显示图片而把 bucket 设为 public。Supabase Setup 中的 storage policies 会将每个 已认证用户限制在自己的 folder。

有意不提供的内容

这里没有 dashboard-with-charts、admin panel、CRM 或通用 SaaS back office。这些结构会替你的 桌面产品做假设。可复用 primitives 请在 Components gallery 查看;Showcase 是可删除 demo layer, 不是应用的信息架构。

On this page