K8s Lab 把当前仓库文档整理成一个可阅读的网页站点

Repository Reading Site

用户与租户模块 — 功能设计与页面规划

| | 个人账户 | 组织账户 | |---|---------|---------| | 注册方式 | 邮箱/手机/OAuth | 邮箱注册后创建组织 | | 成员 | 仅自己 | 最多 100/500/不限 (按套餐) | | 计费 | 个人充值 | 组织统一充值 | | 发票 | 个人 | 企业抬头 | | 资源隔离 | 个人名下 | 组织内共享 |

Markdownsaas-platform/docs/user-tenant-module-design.md2026年4月9日 16:01

用户与租户模块 — 功能设计与页面规划

一、租户模型

1.1 为什么需要"租户"而不只是"用户"?

个人开发者:
  一个人 = 一个账号 = 一个计费主体,足够了

公司/团队:
  CTO 注册了账号,充了 10 万
  → 5 个开发者都要用,各自有 API Key
  → 财务要看总账单,按项目拆分费用
  → 实习生只能用 Playground,不能创建训练任务
  → 有人离职了要回收权限

所以需要"组织"这一层:
  组织 = 计费主体 + 权限边界 + 资源隔离

1.2 层级结构

组织 (Organization)
├── 基本信息: 名称、行业、规模
├── 计费账户: 余额、套餐、支付方式
├── 成员 (Members)
│   ├── 所有者 (Owner)     — 最高权限,仅 1 人
│   ├── 管理员 (Admin)     — 管理成员、Key、计费
│   ├── 开发者 (Developer)  — 使用 API、创建训练
│   └── 只读 (Viewer)      — 只能查看,不能操作
├── API Keys
│   ├── production-key     — 权限: chat + embedding
│   ├── dev-key           — 权限: 全部,限速低
│   └── ci-key            — 权限: fine-tune + deploy
├── 项目 (Projects) — 可选,大企业用
│   ├── 客服机器人项目      — 独立用量统计和预算
│   ├── 内部知识库项目      — 独立用量统计和预算
│   └── 数据分析项目
└── 资源
    ├── 数据集 — 组织内共享
    ├── 模型   — 组织内共享
    └── 知识库 — 组织内共享

1.3 个人 vs 组织

个人账户 组织账户
注册方式 邮箱/手机/OAuth 邮箱注册后创建组织
成员 仅自己 最多 100/500/不限 (按套餐)
计费 个人充值 组织统一充值
发票 个人 企业抬头
资源隔离 个人名下 组织内共享
适用 个人开发者/学生 公司/团队

新用户注册时自动创建一个同名的个人组织,无感知。日后想加人再升级为团队组织。


二、权限体系

2.1 角色与权限矩阵

操作 Owner Admin Developer Viewer
组织设置
修改组织信息
删除组织
转让所有权
成员管理
邀请成员
移除成员
修改角色 ✅(不能改Owner)
API Key
创建 Key
查看 Key ✅(仅自己的)
删除 Key ✅(仅自己的)
计费
查看余额/用量 ✅(仅总量) ✅(仅总量)
充值
查看详细账单
修改套餐
模型/推理
调用 API
Playground
部署模型
下线模型
训练
创建训练任务
取消训练任务 ✅(仅自己的)
数据
上传数据集
删除数据集
查看数据集

2.2 API Key 权限(细粒度)

{
  "name": "production-api-key",
  "permissions": [
    "chat.completions",       // 对话推理
    "embeddings",             // 向量化
    "models.list"             // 列出模型
  ],
  "denied_permissions": [
    "fine-tuning.*",          // 禁止微调
    "models.deploy",          // 禁止部署
    "datasets.*"              // 禁止数据操作
  ],
  "allowed_models": [
    "qwen2.5-7b",            // 只能用这两个模型
    "acmecorp-cs-v3"
  ],
  "rate_limit": {
    "rpm": 100,               // 每分钟 100 请求
    "tpm": 100000,            // 每分钟 10 万 Token
    "rpd": 10000              // 每天 1 万请求
  },
  "ip_whitelist": [           // IP 白名单(可选)
    "203.0.113.0/24"
  ],
  "expires_at": "2027-01-01"
}

2.3 项目隔离(大企业功能)

组织: AcmeCorp
├── 项目: 智能客服
│   ├── 月度预算: ¥5,000
│   ├── 成员: 张三(Developer), 李四(Developer)
│   ├── 模型: acmecorp-cs-v3
│   ├── 数据集: customer-service-v2
│   └── 用量: 本月已用 ¥3,200
│
├── 项目: 内部知识库
│   ├── 月度预算: ¥2,000
│   ├── 成员: 王五(Developer)
│   ├── 模型: qwen2.5-7b (RAG)
│   ├── 知识库: 规章制度
│   └── 用量: 本月已用 ¥800
│
└── 未分配项目的用量: ¥500

作用:
  - 费用按项目拆分,方便内部结算
  - 项目预算超限时告警/拒绝请求
  - 成员只能看到自己参与的项目

三、认证体系

3.1 认证方式

方式 场景 实现
邮箱 + 密码 Web 控制台登录 bcrypt 哈希 + JWT
手机号 + 验证码 国内用户友好 SMS 发送 + 6 位验证码
GitHub OAuth 开发者友好 OAuth2 Authorization Code
Google OAuth 海外用户 OAuth2
微信扫码 国内 C 端 微信开放平台
API Key 程序调用 API Bearer Token (sk-xxx)
SSO/SAML 企业客户 对接企业身份系统

3.2 JWT 设计

Access Token (短期,15分钟):
{
  "sub": "user-uuid",
  "org_id": "org-uuid",
  "role": "developer",
  "projects": ["proj-1", "proj-2"],
  "exp": 1744200000,
  "iat": 1744199100
}

Refresh Token (长期,30天):
  存在 HttpOnly Cookie 中
  用来换取新的 Access Token
  数据库中记录,可主动吊销

为什么分两个?
  Access Token 短期 → 即使泄露危害有限
  Refresh Token 长期 → 存 HttpOnly Cookie,JS 拿不到
  用户改密码/被移除 → 吊销所有 Refresh Token → 下次刷新失败 → 强制登出

3.3 API Key 安全设计

生成:
  sk-{org_id_4chars}{random_48chars}
  示例: sk-a1b2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

存储:
  数据库只存 SHA256(key),不存明文
  创建时仅展示一次完整 Key,之后只显示前缀 sk-a1b2...xxxx

验证流程:
  请求到达 → 提取 Bearer Token
  → SHA256(token)
  → 查 Redis 缓存 (key_hash → org_id, permissions, rate_limit)
  → 未命中 → 查 PostgreSQL → 写入 Redis (TTL 5min)
  → 验证权限
  → 验证限流
  → 放行

安全措施:
  - Key 传输只走 HTTPS
  - 创建后不可查看完整 Key
  - 支持设置过期时间
  - 支持 IP 白名单
  - 异常调用告警(突然大量请求、异地 IP)
  - 可随时吊销

3.4 多因素认证 (MFA)

支持 TOTP (如 Google Authenticator):
  1. 用户在设置页开启 MFA
  2. 扫描二维码绑定
  3. 之后每次登录输入 6 位动态码

强制 MFA 场景:
  - Owner 修改组织设置
  - 删除模型/数据集
  - 大额充值
  - 创建/删除 API Key

企业版:
  - 可强制组织全员开启 MFA

四、注册与登录流程

4.1 注册流程

                 ┌─────────┐
                 │ 注册入口 │
                 └────┬────┘
                      │
         ┌────────────┼────────────┐
         ▼            ▼            ▼
    ┌─────────┐ ┌─────────┐ ┌─────────┐
    │邮箱注册  │ │手机注册  │ │OAuth登录 │
    └────┬────┘ └────┬────┘ └────┬────┘
         │           │           │
         ▼           ▼           ▼
    发送验证邮件  发送短信验证码  跳转第三方
         │           │           │
         ▼           ▼           ▼
    点击链接验证  输入验证码    授权回调
         │           │           │
         └───────────┴───────────┘
                     │
                     ▼
              ┌──────────────┐
              │ 设置密码/昵称 │
              │ (OAuth可跳过) │
              └──────┬───────┘
                     │
                     ▼
              ┌──────────────┐
              │ 自动创建      │
              │ 个人组织      │
              │ 赠送体验额度  │
              └──────┬───────┘
                     │
                     ▼
              ┌──────────────┐
              │ 引导页        │
              │ 1. 试用模型   │
              │ 2. 创建Key   │
              │ 3. 查看文档   │
              └──────────────┘

4.2 新用户引导(Onboarding)

注册完成后的引导流程(不可跳过的核心步骤标 *):

Step 1: 欢迎 + 选择身份 *
  "你是?"
  ○ 个人开发者 — 做 AI 应用
  ○ 数据科学家 — 训练微调模型
  ○ 企业用户   — 为团队采购 AI 能力
  → 根据选择定制后续引导和默认视图

Step 2: 30 秒体验 *
  直接打开 Playground,预填一条消息
  "点击发送,体验你的第一次 AI 对话"
  → 用免费额度调用,让用户立刻感受到价值

Step 3: 创建 API Key
  "创建你的第一个 API Key,用于程序调用"
  [一键创建] → 展示 Key → 展示代码示例
  
  Python:
    from openai import OpenAI
    client = OpenAI(base_url="https://api.example.com/v1", api_key="sk-xxx")
    resp = client.chat.completions.create(
        model="qwen2.5-7b",
        messages=[{"role":"user","content":"你好"}]
    )

Step 4: 邀请团队(可跳过)
  "邀请同事一起使用"
  [输入邮箱] [发送邀请]

Step 5: 完成
  引导完成,进入控制台首页
  左上角提示: "你还有 ¥10.00 免费额度" [去充值]

五、功能清单

5.1 用户账号

功能 说明 优先级
邮箱注册/登录 邮箱 + 密码 + 邮件验证 P0
手机注册/登录 手机号 + 短信验证码 P1
OAuth 登录 GitHub / Google / 微信 P1
忘记密码 邮箱重置链接 P0
修改密码 需要旧密码验证 P0
修改个人信息 昵称/头像/邮箱 P1
MFA 双因素 TOTP (Google Authenticator) P1
登录历史 IP/时间/设备/地点 P1
账号注销 30 天冷静期后彻底删除 P1

5.2 组织管理

功能 说明 优先级
创建组织 注册时自动创建 / 手动创建新组织 P0
组织设置 名称/描述/行业/Logo P0
切换组织 一个用户可属于多个组织 P0
删除组织 Owner 操作,30 天冷静期 P1
转让所有权 Owner → 另一个 Admin P1

5.3 成员管理

功能 说明 优先级
邀请成员 邮件邀请链接 P0
接受邀请 已有账号直接加入 / 未注册先注册 P0
移除成员 同时吊销该成员创建的所有 Key P0
修改角色 Owner/Admin 可修改 P0
成员列表 姓名/邮箱/角色/最后活跃/创建的Key数 P0

5.4 API Key 管理

功能 说明 优先级
创建 Key 设置名称/权限/限速/过期时间 P0
查看 Key 列表 名称/前缀/权限/最后使用/状态 P0
删除/吊销 Key 立即生效 P0
Key 用量统计 按 Key 维度看调用量和费用 P1
权限模板 预设"只读"/"开发"/"生产"权限集 P1
IP 白名单 限制 Key 只能从指定 IP 使用 P1
Key 自动轮换 定期自动生成新 Key,旧 Key 过渡期后失效 P2

5.5 安全与审计

功能 说明 优先级
操作审计日志 谁在什么时间做了什么 P1
登录日志 IP/设备/时间/结果 P0
异常告警 异地登录/大量失败/Key 泄露检测 P1
Session 管理 查看/踢掉活跃 Session P1
企业 SSO SAML 2.0 / OIDC 对接 P2

六、页面设计

6.1 页面总览

├── 公开页面(未登录)
│   ├── 首页/官网
│   ├── 注册页
│   ├── 登录页
│   ├── 忘记密码
│   ├── 接受邀请
│   └── OAuth 回调
│
├── 新手引导
│   ├── 选择身份
│   ├── 体验 Playground
│   ├── 创建 API Key
│   └── 邀请团队
│
├── 用户设置
│   ├── 个人信息
│   ├── 安全设置 (密码/MFA)
│   ├── 登录历史
│   └── 注销账号
│
├── 组织设置 (Owner/Admin)
│   ├── 组织信息
│   ├── 成员管理
│   ├── API Key 管理
│   ├── 项目管理
│   ├── 安全与审计
│   └── 企业 SSO 配置
│
└── 控制台框架
    ├── 顶部: 组织切换 / 通知 / 用户菜单
    └── 侧栏: 导航菜单 (按角色显示不同项)

6.2 注册页

┌──────────────────────────────────────────────────────────────┐
│                                                              │
│                    🤖 AI Platform                            │
│                                                              │
│                  创建你的账号                                  │
│                                                              │
│  邮箱:    [________________________]                          │
│  密码:    [________________________]  强度: ███░░ 中          │
│  确认密码: [________________________]                          │
│                                                              │
│           [          注  册          ]                        │
│                                                              │
│  ─────────── 或者 ───────────                                │
│                                                              │
│  [ 🐙 GitHub 注册 ]  [ 🔵 Google 注册 ]  [ 💬 微信注册 ]     │
│                                                              │
│  已有账号? [登录 →]                                          │
│                                                              │
│  注册即表示同意 [服务条款] 和 [隐私政策]                       │
│                                                              │
└──────────────────────────────────────────────────────────────┘

6.3 登录页

┌──────────────────────────────────────────────────────────────┐
│                                                              │
│                    🤖 AI Platform                            │
│                                                              │
│                   欢迎回来                                    │
│                                                              │
│  邮箱:    [________________________]                          │
│  密码:    [________________________]  [忘记密码?]            │
│                                                              │
│  ☐ 记住我 (30天内免登录)                                     │
│                                                              │
│           [          登  录          ]                        │
│                                                              │
│  ─────────── 或者 ───────────                                │
│                                                              │
│  [ 🐙 GitHub ]  [ 🔵 Google ]  [ 💬 微信 ]                  │
│                                                              │
│  没有账号? [免费注册 →]                                      │
│                                                              │
│  ── MFA 验证 (如已开启) ──                                   │
│  请输入 6 位验证码:                                           │
│  [  ] [  ] [  ] [  ] [  ] [  ]                               │
│                                                              │
└──────────────────────────────────────────────────────────────┘

6.4 控制台首页 (Dashboard)

┌──────────────────────────────────────────────────────────────────┐
│ ┌──────┐                                                        │
│ │ 🤖   │  AI Platform          [AcmeCorp ▼]  🔔  [头像 ▼]     │
│ └──────┘                                                        │
├─────────┬────────────────────────────────────────────────────────┤
│         │                                                        │
│ 📊 概览  │  欢迎回来,张三                           2026-04-09  │
│ 🤖 模型  │                                                       │
│ 💬 对话  │  ── 今日概览 ──                                       │
│ 📝 数据  │                                                       │
│ 🔧 训练  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ 🔑 Key  │  │ API 调用  │ │ Token 用量│ │ 今日费用  │ │ 余额    │ │
│ 💰 计费  │  │  12,450   │ │  8.5M    │ │  ¥45.20  │ │ ¥156.80│ │
│         │  │ ↑15%     │ │ ↑12%     │ │ ↑8%      │ │        │ │
│ ── 管理 ─│  └──────────┘ └──────────┘ └──────────┘ └─────────┘ │
│ 👥 成员  │                                                       │
│ ⚙️ 设置  │  ── 调用量趋势 (最近 7 天) ──                         │
│ 📋 审计  │                                                       │
│         │   50K│       ╱╲                                       │
│         │   40K│    ╱╲╱  ╲  ╱╲                                  │
│         │   30K│  ╱╱      ╲╱  ╲╱╲                               │
│         │   20K│╱╱                ╲                              │
│         │      └────────────────────                             │
│         │      Mon  Tue  Wed  Thu  Fri  Sat  Sun                │
│         │                                                        │
│         │  ── 快速操作 ──                                        │
│         │                                                        │
│         │  [🔑 创建 API Key]  [🤖 试用模型]  [📝 上传数据]       │
│         │  [🔧 创建训练]      [📊 查看账单]  [📖 API 文档]       │
│         │                                                        │
│         │  ── 最近活动 ──                                        │
│         │                                                        │
│         │  15:32  API调用  qwen2.5-7b   Token: 1,250  ¥0.008   │
│         │  15:30  训练完成  客服模型v3    费用: ¥2.92             │
│         │  14:15  成员加入  李四 (Developer)                      │
│         │  12:00  充值     ¥100.00                               │
│         │                                                        │
└─────────┴────────────────────────────────────────────────────────┘

6.5 成员管理页

┌──────────────────────────────────────────────────────────────────┐
│ 成员管理                                       [邀请成员]        │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 搜索: [________________]           成员数: 5 / 20 (Pro 套餐上限) │
│                                                                  │
│ 头像  姓名        邮箱                 角色       最后活跃  操作  │
│ ──────────────────────────────────────────────────────────────── │
│  👤  张三        zhangsan@acme.com    Owner      刚刚      ──   │
│  👤  李四        lisi@acme.com        Admin      1小时前   [▼]  │
│  👤  王五        wangwu@acme.com      Developer  3小时前   [▼]  │
│  👤  赵六        zhaoliu@acme.com     Developer  昨天      [▼]  │
│  👤  钱七        qianqi@acme.com      Viewer     3天前     [▼]  │
│                                                                  │
│ ── 待接受的邀请 ──                                               │
│  ✉️  sunba@acme.com    Developer   邀请于 04-09   [撤销邀请]    │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

点击 [▼] 展开操作菜单:
  [修改角色 →] Owner / Admin / Developer / Viewer
  [查看活动记录]
  [移除成员]  ← 需要二次确认

6.6 邀请成员弹窗

┌──────────────────────────────────────────────┐
│ 邀请成员加入 AcmeCorp                [✕]     │
├──────────────────────────────────────────────┤
│                                              │
│ 邮箱地址:                                    │
│ [____________________] [添加]                │
│                                              │
│ 已添加:                                      │
│  lisi@acme.com      [Developer ▼]  [✕]      │
│  wangwu@acme.com    [Developer ▼]  [✕]      │
│                                              │
│ 邀请消息(可选):                             │
│ ┌──────────────────────────────────────┐     │
│ │ 邀请你加入我们的 AI 平台团队          │     │
│ └──────────────────────────────────────┘     │
│                                              │
│ 被邀请人将收到一封邮件,点击链接即可加入。    │
│ 未注册用户需先注册。                         │
│                                              │
│                        [取消] [发送邀请]     │
└──────────────────────────────────────────────┘

6.7 API Key 管理页

┌──────────────────────────────────────────────────────────────────┐
│ API Key 管理                                   [+ 创建 API Key]  │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ ⚠️ API Key 是敏感凭据,请勿在客户端代码或公开仓库中暴露           │
│                                                                  │
│ 名称          Key           权限       限速    最后使用    操作   │
│ ──────────────────────────────────────────────────────────────── │
│ 生产环境      sk-a1b2...x8  chat,emb  100RPM  5分钟前    [▼]   │
│               创建于 04-01  创建者: 张三                         │
│                                                                  │
│ 开发测试      sk-c3d4...y9  全部       20RPM   2天前      [▼]   │
│               创建于 03-28  创建者: 李四                         │
│                                                                  │
│ CI/CD         sk-e5f6...z0  fine-tune 50RPM   1周前      [▼]   │
│               创建于 03-20  创建者: 张三  ⚠️ 即将过期(7天)       │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

6.8 创建 API Key 弹窗

┌──────────────────────────────────────────────┐
│ 创建 API Key                         [✕]     │
├──────────────────────────────────────────────┤
│                                              │
│ 名称: [生产环境 Key_________________]         │
│                                              │
│ 权限模板: 
│   ● 推理调用 (chat + embedding + models)     │
│   ○ 完全权限 (全部 API)                      │
│   ○ 仅微调 (fine-tuning + datasets)          │
│   ○ 自定义                                   │
│                                              │
│ 限速: 
│   每分钟请求: [100___]                        │
│   每分钟 Token: [100000_]                    │
│   每天请求:   [10000__]                       │
│                                              │
│ 模型限制: 
│   ○ 允许所有模型                              │
│   ● 仅限指定模型: 
│     ☑ qwen2.5-7b  ☑ acmecorp-cs-v3          │
│     ☐ qwen2.5-14b ☐ deepseek-v3             │
│                                              │
│ 过期时间: 
│   ○ 永不过期                                 │
│   ● 指定日期: [2027-01-01]                   │
│                                              │
│ IP 白名单 (可选): 
│   [203.0.113.0/24_____________] [添加]        │
│                                              │
│                        [取消] [创建]         │
└──────────────────────────────────────────────┘

创建后弹窗:
┌──────────────────────────────────────────────┐
│ ✅ API Key 创建成功                  [✕]     │
├──────────────────────────────────────────────┤
│                                              │
│ 请立即复制并安全保存,关闭后将无法再次查看:   │
│                                              │
│ ┌──────────────────────────────────────┐     │
│ │ sk-a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5  │[📋] │
│ └──────────────────────────────────────┘     │
│                                              │
│ ⚠️ 此 Key 仅显示一次,请确保已复制保存        │
│                                              │
│ 快速开始: 
│ ┌──────────────────────────────────────┐     │
│ │ curl https://api.example.com/v1/    │     │
│ │   chat/completions \               │     │
│ │   -H "Authorization: Bearer        │     │
│ │     sk-a1b2c3..." \               │     │
│ │   -d '{"model":"qwen2.5-7b",...}' │     │
│ └──────────────────────────────────────┘     │
│                                              │
│            [我已安全保存,关闭]               │
└──────────────────────────────────────────────┘

6.9 安全审计页

┌──────────────────────────────────────────────────────────────────┐
│ 安全与审计                                                        │
├──────────────────────────────────────────────────────────────────┤
│ [登录日志] [操作日志] [API 调用日志]                               │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 筛选: [全部成员 ▼] [全部操作 ▼] [最近7天 ▼]          [导出 CSV] │
│                                                                  │
│ 时间             成员    操作              详情                   │
│ ──────────────────────────────────────────────────────────────── │
│ 04-09 15:32:01  张三    创建 API Key      名称: 生产环境 Key     │
│ 04-09 15:30:00  系统    训练任务完成       客服模型v3, 费用¥2.92  │
│ 04-09 14:15:00  张三    邀请成员          李四 (Developer)       │
│ 04-09 12:00:00  张三    充值             ¥100.00               │
│ 04-09 10:30:00  张三    登录             IP: 203.0.113.5 上海   │
│ 04-08 18:00:00  张三    删除数据集        old-dataset-v1        │
│ 04-08 16:00:00  李四    创建训练任务      客服模型v2             │
│ 04-08 09:00:00  李四    登录             IP: 203.0.113.10 北京  │
│                                                                  │
│ ⚠️ 安全提醒:                                                     │
│ 04-09 03:00  Key sk-a1b2... 从异常 IP (45.33.32.0) 调用 3次     │
│              [查看详情] [立即吊销此 Key]                          │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

6.10 个人设置页

┌──────────────────────────────────────────────────────────────────┐
│ 个人设置                                                          │
├──────────────────────────────────────────────────────────────────┤
│ [基本信息] [安全设置] [通知偏好] [登录历史]                        │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ ── 基本信息 ──                                                   │
│                                                                  │
│ 头像:     [👤] [更换头像]                                        │
│ 昵称:     [张三_______________]                                  │
│ 邮箱:     zhangsan@acme.com  [修改] (需验证)                    │
│ 手机:     138****8888        [修改] (需验证)                     │
│ 注册时间: 2026-03-15                                             │
│                                                                  │
│                                              [保存修改]          │
│                                                                  │
│ ── 安全设置 ──                                                   │
│                                                                  │
│ 密码:       上次修改于 30 天前               [修改密码]           │
│ 双因素认证: 🟢 已开启 (Google Authenticator)  [管理]             │
│ 活跃会话:   3 个设备                         [管理会话]          │
│                                                                  │
│ ── 关联账号 ──                                                   │
│                                                                  │
│ GitHub:   已关联 (octocat)                   [解除关联]          │
│ Google:   未关联                              [关联]             │
│ 微信:     已关联                              [解除关联]          │
│                                                                  │
│ ── 危险操作 ──                                                   │
│                                                                  │
│ [注销账号]  永久删除账号和所有数据(30天冷静期)                   │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

七、数据模型补充

-- 组织成员关系
CREATE TABLE org_members (
    id          UUID PRIMARY KEY,
    org_id      UUID REFERENCES organizations(id),
    user_id     UUID REFERENCES users(id),
    role        VARCHAR(20) NOT NULL,  -- owner/admin/developer/viewer
    invited_by  UUID,
    joined_at   TIMESTAMP DEFAULT NOW(),
    UNIQUE(org_id, user_id)
);

-- 邀请
CREATE TABLE invitations (
    id          UUID PRIMARY KEY,
    org_id      UUID REFERENCES organizations(id),
    email       VARCHAR(255) NOT NULL,
    role        VARCHAR(20) NOT NULL,
    invited_by  UUID REFERENCES users(id),
    token       VARCHAR(64) NOT NULL UNIQUE,   -- 邀请链接中的 token
    status      VARCHAR(20) DEFAULT 'pending', -- pending/accepted/expired
    expires_at  TIMESTAMP NOT NULL,
    created_at  TIMESTAMP DEFAULT NOW()
);

-- 登录日志
CREATE TABLE login_logs (
    id          BIGSERIAL PRIMARY KEY,
    user_id     UUID NOT NULL,
    ip          INET,
    user_agent  TEXT,
    location    VARCHAR(100),       -- 通过 IP 解析
    method      VARCHAR(20),        -- password/oauth_github/oauth_google/mfa
    success     BOOLEAN NOT NULL,
    fail_reason VARCHAR(100),       -- 密码错误/MFA错误/账号锁定
    created_at  TIMESTAMP DEFAULT NOW()
);

-- 审计日志
CREATE TABLE audit_logs (
    id          BIGSERIAL PRIMARY KEY,
    org_id      UUID NOT NULL,
    user_id     UUID,               -- NULL = 系统操作
    action      VARCHAR(50) NOT NULL, -- member.invite / key.create / model.deploy
    resource    VARCHAR(50),         -- api_key / dataset / model
    resource_id VARCHAR(100),
    detail      JSONB,              -- 操作详情
    ip          INET,
    created_at  TIMESTAMP DEFAULT NOW()
) PARTITION BY RANGE (created_at);

-- 用户 Session
CREATE TABLE sessions (
    id          UUID PRIMARY KEY,
    user_id     UUID NOT NULL,
    refresh_token_hash VARCHAR(64) NOT NULL,
    device      VARCHAR(200),       -- "Chrome 120 / macOS"
    ip          INET,
    last_active TIMESTAMP DEFAULT NOW(),
    expires_at  TIMESTAMP NOT NULL,
    revoked     BOOLEAN DEFAULT FALSE,
    created_at  TIMESTAMP DEFAULT NOW()
);

-- MFA 配置
CREATE TABLE user_mfa (
    user_id     UUID PRIMARY KEY REFERENCES users(id),
    secret      VARCHAR(64) NOT NULL,  -- TOTP secret (加密存储)
    enabled     BOOLEAN DEFAULT FALSE,
    backup_codes JSONB,                 -- 备用码 (哈希后存储)
    created_at  TIMESTAMP DEFAULT NOW()
);

-- 项目(大企业功能)
CREATE TABLE projects (
    id          UUID PRIMARY KEY,
    org_id      UUID REFERENCES organizations(id),
    name        VARCHAR(100) NOT NULL,
    description TEXT,
    budget_monthly DECIMAL(10,2),     -- 月度预算上限
    created_at  TIMESTAMP DEFAULT NOW()
);

八、页面汇总

序号 页面 路由 访问权限 优先级
1 注册 /register 公开 P0
2 登录 /login 公开 P0
3 忘记密码 /forgot-password 公开 P0
4 接受邀请 /invite/:token 公开 P0
5 新手引导 /onboarding 新用户 P0
6 控制台首页 /dashboard 所有 P0
7 个人设置-基本 /settings/profile 所有 P0
8 个人设置-安全 /settings/security 所有 P0
9 个人设置-登录历史 /settings/sessions 所有 P1
10 组织设置 /org/settings Owner/Admin P0
11 成员管理 /org/members Owner/Admin P0
12 邀请成员 /org/members/invite Owner/Admin P0
13 API Key 管理 /org/keys Owner/Admin/Dev P0
14 创建 API Key /org/keys/create Owner/Admin/Dev P0
15 审计日志 /org/audit Owner/Admin P1
16 项目管理 /org/projects Owner/Admin P2
17 组织切换 (顶部下拉) 多组织用户 P0