# 注册后数据未存储到数据库 - 快速修复指南

## 🔍 问题原因

当前配置 `ENABLE_EMAIL_AUTOCONFIRM=false`，注册后：
- ✅ `auth.users` 表中会创建用户记录
- ❌ 没有 session（不自动登录）
- ❌ 没有 token
- ❌ RLS 策略阻止插入 `ak_users`（因为 `auth.uid()` 返回 null）

## ✅ 解决方案（两种方式）

### 方式一：使用数据库触发器（推荐，完全自动化）

**优点**：注册时自动创建 `ak_users` 记录，无需前端处理

**执行步骤**：

1. **在 Supabase Dashboard (http://192.168.1.61:3000) 中打开 SQL Editor**

2. **执行 `USER_AUTH_SCHEMA.sql`**
   - 创建 `ak_users` 表和 RLS 策略
   - 创建 `upsert_user_profile` RPC 函数

3. **执行 `USER_AUTH_TRIGGER.sql`**
   - 创建触发器，在 `auth.users` 插入时自动创建 `ak_users` 记录

4. **验证**
   ```sql
   -- 检查触发器是否存在
   SELECT tgname FROM pg_trigger WHERE tgname = 'on_auth_user_created';
   
   -- 检查函数是否存在
   SELECT proname FROM pg_proc WHERE proname = 'handle_new_user';
   ```

5. **测试**
   - 在前端注册一个新用户
   - 检查 `ak_users` 表是否有新记录：
   ```sql
   SELECT * FROM ak_users ORDER BY created_at DESC LIMIT 5;
   ```

---

### 方式二：仅使用 RPC 函数（如果触发器无法创建）

**执行步骤**：

1. **在 Supabase Dashboard 中执行 `USER_AUTH_SCHEMA.sql`**

2. **验证 RPC 函数**
   ```sql
   -- 检查函数是否存在
   SELECT proname FROM pg_proc WHERE proname = 'upsert_user_profile';
   
   -- 检查权限
   SELECT grantee, privilege_type 
   FROM information_schema.routine_privileges 
   WHERE routine_name = 'upsert_user_profile';
   ```

3. **测试注册**
   - 前端代码会自动调用 `upsert_user_profile` RPC 函数
   - 检查 `ak_users` 表是否有新记录

---

## 🔧 如果数据仍然没有存储

### 检查清单

1. **确认 RPC 函数已创建**
   ```sql
   SELECT proname, prosrc FROM pg_proc WHERE proname = 'upsert_user_profile';
   ```
   如果返回空，说明函数未创建，需要执行 `USER_AUTH_SCHEMA.sql`

2. **确认触发器已创建**（如果使用了方式一）
   ```sql
   SELECT tgname, tgenabled FROM pg_trigger WHERE tgname = 'on_auth_user_created';
   ```
   如果返回空，需要执行 `USER_AUTH_TRIGGER.sql`

3. **检查浏览器控制台**
   - 打开浏览器开发者工具
   - 查看 Console 标签
   - 注册时应该看到：
     - `注册返回结果: {...}`
     - `✅ 用户资料创建成功: ...` 或 `⚠️ 用户资料创建失败`

4. **检查 RPC 调用错误**
   - 如果看到 `RPC 创建用户资料失败`，检查：
     - RPC 函数是否存在
     - 函数参数是否正确
     - 网络请求是否成功

---

## 📝 当前代码逻辑

注册流程：
1. 调用 `supa.signUp()` → 在 `auth.users` 中创建用户
2. 获取 `user` 对象
3. 调用 `ensureUserProfile(user)` → 内部调用 `upsert_user_profile` RPC 函数
4. RPC 函数使用 `SECURITY DEFINER` → 绕过 RLS，创建 `ak_users` 记录

**如果 RPC 函数不存在**，会回退到直接插入，但会失败（因为 RLS 阻止）。

---

## 🎯 推荐操作

**立即执行**：

1. 在 Supabase Dashboard 执行 `pages/user/test/USER_AUTH_SCHEMA.sql`
2. 在 Supabase Dashboard 执行 `pages/user/test/USER_AUTH_TRIGGER.sql`
3. 测试注册功能
4. 检查 `ak_users` 表是否有新记录

**如果触发器创建失败**（权限问题），只执行 `USER_AUTH_SCHEMA.sql` 也可以，前端会使用 RPC 函数。
