用户与租户模块 — 功能设计与页面规划
一、租户模型
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,
"tpm": 100000,
"rpd": 10000
},
"ip_whitelist": [
"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天内免登录) │
│ │
│ │
│ │
│ ─────────── 或者 ─────────── │
│ │
│ │
│ │
│ 没有账号? │
│ │
│ ── MFA 验证 (如已开启) ── │
│ 请输入 6 位验证码: │
│ │
│ │
└──────────────────────────────────────────────────────────────┘
6.4 控制台首页 (Dashboard)
┌──────────────────────────────────────────────────────────────────┐
│ ┌──────┐ │
│ │ 🤖 │ AI Platform [AcmeCorp ▼] 🔔 [头像 ▼] │
│ └──────┘ │
├─────────┬────────────────────────────────────────────────────────┤
│ │ │
│ 📊 概览 │ 欢迎回来,张三 2026-04-09 │
│ 🤖 模型 │ │
│ 💬 对话 │ ── 今日概览 ── │
│ 📝 数据 │ │
│ 🔧 训练 │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ 🔑 Key │ │ API 调用 │ │ Token 用量│ │ 今日费用 │ │ 余额 │ │
│ 💰 计费 │ │ 12,450 │ │ 8.5M │ │ ¥45.20 │ │ ¥156.80│ │
│ │ │ ↑15
│ ── 管理 ─│ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │
│ 👥 成员 │ │
│ ⚙️ 设置 │ ── 调用量趋势 (最近 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,
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,
status VARCHAR(20) DEFAULT 'pending',
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),
method VARCHAR(20),
success BOOLEAN NOT NULL,
fail_reason VARCHAR(100),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE audit_logs (
id BIGSERIAL PRIMARY KEY,
org_id UUID NOT NULL,
user_id UUID,
action VARCHAR(50) NOT NULL,
resource VARCHAR(50),
resource_id VARCHAR(100),
detail JSONB,
ip INET,
created_at TIMESTAMP DEFAULT NOW()
) PARTITION BY RANGE (created_at);
CREATE TABLE sessions (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
refresh_token_hash VARCHAR(64) NOT NULL,
device VARCHAR(200),
ip INET,
last_active TIMESTAMP DEFAULT NOW(),
expires_at TIMESTAMP NOT NULL,
revoked BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE user_mfa (
user_id UUID PRIMARY KEY REFERENCES users(id),
secret VARCHAR(64) NOT NULL,
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 |