双人协作待办应用(P0 版本)。
- Next.js App Router + TypeScript + Tailwind CSS
- Supabase Auth + Postgres + RLS + Realtime
- Vitest + Playwright
- 安装依赖
npm install- 配置环境变量
cp .env.example .env.local填写以下变量:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- 启动开发环境
npm run dev迁移文件位于 supabase/migrations/:
001_init.sql002_rls.sql003_rpc.sql004_realtime.sql005_fix_space_member_rls_recursion.sql006_fix_join_shared_space_lookup.sql007_shared_space_constraints_and_close_handshake.sql008_profile_avatar_and_storage.sql009_space_photos_upload.sql010_space_photos_caption.sql011_anniversaries.sql
请按顺序在 Supabase SQL Editor 执行,或使用 Supabase CLI 执行迁移。
在 Supabase Authentication -> Providers -> Email 中启用 Email + Password 登录方式。
当前项目默认要求关闭 Confirm email,否则注册后将提示需要关闭邮箱确认。
/login/app/app/challenges/app/memories/app/anniversaries/app/invite/app/invite/success
/app、/app/challenges、/app/memories、/app/anniversaries、/app/invite统一显示底部导航。/app/invite/success保持沉浸式,不显示底部导航。
npm run test:unit
npm run test:e2eE2E 需要提供测试账号相关环境变量;未提供时会自动跳过主流程用例。
本项目采用单环境部署:
- 前端/BFF:Vercel Production
- 后端能力:Supabase 单项目
- 数据库发布:GitHub Actions + Supabase CLI(仅
main)
在 Vercel Production 配置以下变量:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- Site URL:生产域名(例如
https://twodo.example.com) - Redirect URLs:
https://twodo.example.com/auth/callback
在 GitHub 仓库配置:
SUPABASE_ACCESS_TOKENSUPABASE_PROJECT_REFSUPABASE_DB_PASSWORD
/.github/workflows/ci.yml- 触发:PR 到
main - 步骤:
npm ci->npm run lint->npm run test:unit->npm run build
- 触发:PR 到
/.github/workflows/db-migrate.yml- 触发:push 到
main且supabase/migrations/**变更,或手动触发 - 步骤:
supabase link->supabase db push - 并发保护:
concurrency: db-migrate-production
- 触发:push 到
- 功能分支提 PR 到
main - CI 通过后合并
- 若包含迁移文件,自动执行
db-migrate.yml - Vercel 自动发布 Production
- 前端故障:在 Vercel 回滚到上一稳定版本
- 数据库问题:新增补偿迁移并重新走发布流程
- 禁止在生产库手工改结构,所有变更必须通过迁移文件