# 操作文档：修复登录注册与数据同步全链路问题

- **日期**: 2026-02-05
- **范围**: 用户认证、注册、数据库同步及页面守卫
- **标题**: 修复因“写入协调”失败导致的 Admin 功能权限问题

## 摘要

本操作彻底解决了新用户注册后，因数据库写入协调失败，导致业务用户表 (`public.ak_users`) 记录缺失，进而使得所有需要 `admin`/`analytics` 角色的 RPC 调用和页面访问全部失败的问题。修复遵循 `@docs/AGENT_PROJECT_SPEC.md` 规范，涉及数据库 DDL、触发器函数、前端服务和页面守卫的全链路调整。

## 动机

- **直接问题**: Admin 后台的统计图表始终显示为 0，即使在数据库中有数据。
- **根本原因**: 前端 RPC 调用因权限不足被拒绝。
- **深层原因**: 权限检查依赖的 `get_current_user_role()` 函数因在 `ak_users` 表中找不到当前用户的 `auth_id` 而返回 `NULL`。
- **最终根源**: 新用户在 `auth.users` 表注册后，自动同步到 `ak_users` 表的数据库触发器 `handle_new_user()` 函数逻辑错误（未向 `ak_users` 写入），导致数据不一致。

## 影响范围

- **数据库**: `public.ak_users` 表结构, `public.handle_new_user()` 函数, `auth.users` 表上的 `on_auth_user_created` 触发器。
- **前端服务**: `utils/sapi.uts` (`ensureUserProfile`), `utils/store.uts` (`getCurrentUser`), `services/analytics/authGuard.uts`.
- **前端页面**: `pages/user/login.uvue`, `pages/user/register.uvue`, `layouts/admin/AdminLayout.uvue`.

## 变更清单

### 数据库侧 (权威 SQL)

1.  **修复 `ak_users` 表结构约束**:
    -   **文件**: `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`
    -   **内容**: 移除了 `username` 和 `email` 的 `NOT NULL` 约束，以确保自动同步不会因缺少值而失败。

2.  **修复 `handle_new_user` 触发器函数**:
    -   **文件**: `docs/sql/30_rpc/auth/handle_new_user_v3.sql`
    -   **内容**: 将函数逻辑修正为正确地向 `public.ak_users` 表 `INSERT` 新用户记录，并兼容写入 `public.user_roles`。

3.  **创建 `get_current_user_role` 函数**:
    -   **文件**: `docs/sql/30_rpc/auth/get_current_user_role_v1.sql`
    -   **内容**: 创建了用于 RPC 鉴权的权威函数，通过 `auth_id` 查询 `ak_users` 表获取角色。

### 前端侧

1.  **修复 `ensureUserProfile` 写入逻辑**:
    -   **文件**: `utils/sapi.uts`
    -   **内容**: 修正了 `INSERT` 逻辑，确保写入的是 `auth_id` 而不是业务主键 `id`，并设置了默认角色。

2.  **修复登录逻辑**:
    -   **文件**: `pages/user/login.uvue`
    -   **内容**: 移除了生产环境下的 `admin/admin` 本地绕过登录，强制所有登录走 Supabase Auth 以获取有效 Token。并在登录成功后调用 `ensureUserProfile`。

3.  **实现统一页面守卫**:
    -   **文件**: `layouts/admin/AdminLayout.uvue`
    -   **内容**: 在布局的 `onMounted` 钩子中加入了统一的权限守卫，覆盖所有使用该布局的 Admin 页面。

## 最终解决方案与验证流程

1.  **数据库部署**: 按顺序执行以下权威 SQL 文件：
    -   `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`
    -   `docs/sql/30_rpc/auth/get_current_user_role_v1.sql`
    -   `docs/sql/30_rpc/auth/handle_new_user_v3.sql`
    -   `ALTER TABLE auth.users ENABLE TRIGGER on_auth_user_created;` (确保触发器是启用的)

2.  **新用户注册**: 在 App 中注册一个全新的用户。

3.  **验证数据同步**: 在 SQL Editor 中执行“三表一致性”查询，确认新用户的 `status` 为 `OK` 或至少 `ak_users` 不再 `MISSING`。

4.  **提升权限**: 手动将新用户在 `public.ak_users` 表中的 `role` 字段更新为 `'admin'`。

5.  **登录并访问**: 使用新注册并已提权的账号登录 App，访问 Admin 后台的统计页面，确认数据能正常加载。

## 关联文档

- `docs/AGENT_PROJECT_SPEC.md`
- `docs/sql/11_roles_and_permissions_strategy.md`
