个人开发者:
一个人 = 一个账号 = 一个计费主体,足够了
公司/团队:
CTO 注册了账号,充了 10 万
→ 5 个开发者都要用,各自有 API Key
→ 财务要看总账单,按项目拆分费用
→ 实习生只能用 Playground,不能创建训练任务
→ 有人离职了要回收权限
所以需要"组织"这一层:
组织 = 计费主体 + 权限边界 + 资源隔离
组织 (Organization)
├── 基本信息: 名称、行业、规模
├── 计费账户: 余额、套餐、支付方式
├── 成员 (Members)
│ ├── 所有者 (Owner) — 最高权限,仅 1 人
│ ├── 管理员 (Admin) — 管理成员、Key、计费
│ ├── 开发者 (Developer) — 使用 API、创建训练
│ └── 只读 (Viewer) — 只能查看,不能操作
├── API Keys
│ ├── production-key — 权限: chat + embedding
│ ├── dev-key — 权限: 全部,限速低
│ └── ci-key — 权限: fine-tune + deploy
├── 项目 (Projects) — 可选,大企业用
│ ├── 客服机器人项目 — 独立用量统计和预算
│ ├── 内部知识库项目 — 独立用量统计和预算
│ └── 数据分析项目
└── 资源
├── 数据集 — 组织内共享
├── 模型 — 组织内共享
└── 知识库 — 组织内共享
| 个人账户 | 组织账户 |
|---|
| 注册方式 | 邮箱/手机/OAuth | 邮箱注册后创建组织 |
| 成员 | 仅自己 | 最多 100/500/不限 (按套餐) |
| 计费 | 个人充值 | 组织统一充值 |
| 发票 | 个人 | 企业抬头 |
| 资源隔离 | 个人名下 | 组织内共享 |
| 适用 | 个人开发者/学生 | 公司/团队 |
新用户注册时自动创建一个同名的个人组织,无感知。日后想加人再升级为团队组织。
| 操作 | Owner | Admin | Developer | Viewer |
|---|
| 组织设置 | | | | |
| 修改组织信息 | ✅ | ✅ | ❌ | ❌ |
| 删除组织 | ✅ | ❌ | ❌ | ❌ |
| 转让所有权 | ✅ | ❌ | ❌ | ❌ |
| 成员管理 | | | | |
| 邀请成员 | ✅ | ✅ | ❌ | ❌ |
| 移除成员 | ✅ | ✅ | ❌ | ❌ |
| 修改角色 | ✅ | ✅(不能改Owner) | ❌ | ❌ |
| API Key | | | | |
| 创建 Key | ✅ | ✅ | ✅ | ❌ |
| 查看 Key | ✅ | ✅ | ✅(仅自己的) | ❌ |
| 删除 Key | ✅ | ✅ | ✅(仅自己的) | ❌ |
| 计费 | | | | |
| 查看余额/用量 | ✅ | ✅ | ✅(仅总量) | ✅(仅总量) |
| 充值 | ✅ | ✅ | ❌ | ❌ |
| 查看详细账单 | ✅ | ✅ | ❌ | ❌ |
| 修改套餐 | ✅ | ❌ | ❌ | ❌ |
| 模型/推理 | | | | |
| 调用 API | ✅ | ✅ | ✅ | ❌ |
| Playground | ✅ | ✅ | ✅ | ✅ |
| 部署模型 | ✅ | ✅ | ✅ | ❌ |
| 下线模型 | ✅ | ✅ | ❌ | ❌ |
| 训练 | | | | |
| 创建训练任务 | ✅ | ✅ | ✅ | ❌ |
| 取消训练任务 | ✅ | ✅ | ✅(仅自己的) | ❌ |
| 数据 | | | | |
| 上传数据集 | ✅ | ✅ | ✅ | ❌ |
| 删除数据集 | ✅ | ✅ | ❌ | ❌ |
| 查看数据集 | ✅ | ✅ | ✅ | ✅ |
{
"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"
}
组织: AcmeCorp
├── 项目: 智能客服
│ ├── 月度预算: ¥5,000
│ ├── 成员: 张三(Developer), 李四(Developer)
│ ├── 模型: acmecorp-cs-v3
│ ├── 数据集: customer-service-v2
│ └── 用量: 本月已用 ¥3,200
│
├── 项目: 内部知识库
│ ├── 月度预算: ¥2,000
│ ├── 成员: 王五(Developer)
│ ├── 模型: qwen2.5-7b (RAG)
│ ├── 知识库: 规章制度
│ └── 用量: 本月已用 ¥800
│
└── 未分配项目的用量: ¥500
作用:
- 费用按项目拆分,方便内部结算
- 项目预算超限时告警/拒绝请求
- 成员只能看到自己参与的项目
| 方式 | 场景 | 实现 |
|---|
| 邮箱 + 密码 | Web 控制台登录 | bcrypt 哈希 + JWT |
| 手机号 + 验证码 | 国内用户友好 | SMS 发送 + 6 位验证码 |
| GitHub OAuth | 开发者友好 | OAuth2 Authorization Code |
| Google OAuth | 海外用户 | OAuth2 |
| 微信扫码 | 国内 C 端 | 微信开放平台 |
| API Key | 程序调用 API | Bearer Token (sk-xxx) |
| SSO/SAML | 企业客户 | 对接企业身份系统 |
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 → 下次刷新失败 → 强制登出
生成:
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)
- 可随时吊销
支持 TOTP (如 Google Authenticator):
1. 用户在设置页开启 MFA
2. 扫描二维码绑定
3. 之后每次登录输入 6 位动态码
强制 MFA 场景:
- Owner 修改组织设置
- 删除模型/数据集
- 大额充值
- 创建/删除 API Key
企业版:
- 可强制组织全员开启 MFA
┌─────────┐
│ 注册入口 │
└────┬────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│邮箱注册 │ │手机注册 │ │OAuth登录 │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
▼ ▼ ▼
发送验证邮件 发送短信验证码 跳转第三方
│ │ │
▼ ▼ ▼
点击链接验证 输入验证码 授权回调
│ │ │
└───────────┴───────────┘
│
▼
┌──────────────┐
│ 设置密码/昵称 │
│ (OAuth可跳过) │
└──────┬───────┘
│
▼
┌──────────────┐
│ 自动创建 │
│ 个人组织 │
│ 赠送体验额度 │
└──────┬───────┘
│
▼
┌──────────────┐
│ 引导页 │
│ 1. 试用模型 │
│ 2. 创建Key │
│ 3. 查看文档 │
└──────────────┘
注册完成后的引导流程(不可跳过的核心步骤标 *):
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 免费额度" [去充值]
| 功能 | 说明 | 优先级 |
|---|
| 邮箱注册/登录 | 邮箱 + 密码 + 邮件验证 | P0 |
| 手机注册/登录 | 手机号 + 短信验证码 | P1 |
| OAuth 登录 | GitHub / Google / 微信 | P1 |
| 忘记密码 | 邮箱重置链接 | P0 |
| 修改密码 | 需要旧密码验证 | P0 |
| 修改个人信息 | 昵称/头像/邮箱 | P1 |
| MFA 双因素 | TOTP (Google Authenticator) | P1 |
| 登录历史 | IP/时间/设备/地点 | P1 |
| 账号注销 | 30 天冷静期后彻底删除 | P1 |
| 功能 | 说明 | 优先级 |
|---|
| 创建组织 | 注册时自动创建 / 手动创建新组织 | P0 |
| 组织设置 | 名称/描述/行业/Logo | P0 |
| 切换组织 | 一个用户可属于多个组织 | P0 |
| 删除组织 | Owner 操作,30 天冷静期 | P1 |
| 转让所有权 | Owner → 另一个 Admin | P1 |
| 功能 | 说明 | 优先级 |
|---|
| 邀请成员 | 邮件邀请链接 | P0 |
| 接受邀请 | 已有账号直接加入 / 未注册先注册 | P0 |
| 移除成员 | 同时吊销该成员创建的所有 Key | P0 |
| 修改角色 | Owner/Admin 可修改 | P0 |
| 成员列表 | 姓名/邮箱/角色/最后活跃/创建的Key数 | P0 |
| 功能 | 说明 | 优先级 |
|---|
| 创建 Key | 设置名称/权限/限速/过期时间 | P0 |
| 查看 Key 列表 | 名称/前缀/权限/最后使用/状态 | P0 |
| 删除/吊销 Key | 立即生效 | P0 |
| Key 用量统计 | 按 Key 维度看调用量和费用 | P1 |
| 权限模板 | 预设"只读"/"开发"/"生产"权限集 | P1 |
| IP 白名单 | 限制 Key 只能从指定 IP 使用 | P1 |
| Key 自动轮换 | 定期自动生成新 Key,旧 Key 过渡期后失效 | P2 |
| 功能 | 说明 | 优先级 |
|---|
| 操作审计日志 | 谁在什么时间做了什么 | P1 |
| 登录日志 | IP/设备/时间/结果 | P0 |
| 异常告警 | 异地登录/大量失败/Key 泄露检测 | P1 |
| Session 管理 | 查看/踢掉活跃 Session | P1 |
| 企业 SSO | SAML 2.0 / OIDC 对接 | P2 |
├── 公开页面(未登录)
│ ├── 首页/官网
│ ├── 注册页
│ ├── 登录页
│ ├── 忘记密码
│ ├── 接受邀请
│ └── OAuth 回调
│
├── 新手引导
│ ├── 选择身份
│ ├── 体验 Playground
│ ├── 创建 API Key
│ └── 邀请团队
│
├── 用户设置
│ ├── 个人信息
│ ├── 安全设置 (密码/MFA)
│ ├── 登录历史
│ └── 注销账号
│
├── 组织设置 (Owner/Admin)
│ ├── 组织信息
│ ├── 成员管理
│ ├── API Key 管理
│ ├── 项目管理
│ ├── 安全与审计
│ └── 企业 SSO 配置
│
└── 控制台框架
├── 顶部: 组织切换 / 通知 / 用户菜单
└── 侧栏: 导航菜单 (按角色显示不同项)
┌──────────────────────────────────────────────────────────────┐
│ │
│ 🤖 AI Platform │
│ │
│ 创建你的账号 │
│ │
│ 邮箱: [________________________] │
│ 密码: [________________________] 强度: ███░░ 中 │
│ 确认密码: [________________________] │
│ │
│ [ 注 册 ] │
│ │
│ ─────────── 或者 ─────────── │
│ │
│ [ 🐙 GitHub 注册 ] [ 🔵 Google 注册 ] [ 💬 微信注册 ] │
│ │
│ 已有账号? [登录 →] │
│ │
│ 注册即表示同意 [服务条款] 和 [隐私政策] │
│ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ │
│ 🤖 AI Platform │
│ │
│ 欢迎回来 │
│ │
│ 邮箱: [________________________] │
│ 密码: [________________________] [忘记密码?] │
│ │
│ ☐ 记住我 (30天内免登录) │
│ │
│ [ 登 录 ] │
│ │
│ ─────────── 或者 ─────────── │
│ │
│ [ 🐙 GitHub ] [ 🔵 Google ] [ 💬 微信 ] │
│ │
│ 没有账号? [免费注册 →] │
│ │
│ ── MFA 验证 (如已开启) ── │
│ 请输入 6 位验证码: │
│ [ ] [ ] [ ] [ ] [ ] [ ] │
│ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ ┌──────┐ │
│ │ 🤖 │ 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 │
│ │ │
└─────────┴────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ 成员管理 [邀请成员] │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 搜索: [________________] 成员数: 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
[查看活动记录]
[移除成员] ← 需要二次确认
┌──────────────────────────────────────────────┐
│ 邀请成员加入 AcmeCorp [✕] │
├──────────────────────────────────────────────┤
│ │
│ 邮箱地址: │
│ [____________________] [添加] │
│ │
│ 已添加: │
│ lisi@acme.com [Developer ▼] [✕] │
│ wangwu@acme.com [Developer ▼] [✕] │
│ │
│ 邀请消息(可选): │
│ ┌──────────────────────────────────────┐ │
│ │ 邀请你加入我们的 AI 平台团队 │ │
│ └──────────────────────────────────────┘ │
│ │
│ 被邀请人将收到一封邮件,点击链接即可加入。 │
│ 未注册用户需先注册。 │
│ │
│ [取消] [发送邀请] │
└──────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ 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天) │
│ │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────┐
│ 创建 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",...}' │ │
│ └──────────────────────────────────────┘ │
│ │
│ [我已安全保存,关闭] │
└──────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ 安全与审计 │
├──────────────────────────────────────────────────────────────────┤
│ [登录日志] [操作日志] [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] │
│ │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ 个人设置 │
├──────────────────────────────────────────────────────────────────┤
│ [基本信息] [安全设置] [通知偏好] [登录历史] │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ── 基本信息 ── │
│ │
│ 头像: [👤] [更换头像] │
│ 昵称: [张三_______________] │
│ 邮箱: 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 |