核心表
merchant - 商户表(公司信息)
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| name | varchar(255) | 商户名称 |
| email | varchar(255) | 商户邮箱 |
| slogan | text | 口号 |
| id_number | text | 执照号 |
| tel | varchar(50) | 联系电话 |
| address | text | 商户地址 |
| state | tinyint | 状态 1=启用 0=禁用 |
| created_at | datetime | 创建时间 |
| expired_time | datetime | 过期时间 |
merchant 表只保留公司信息,管理员登录凭证已统一到 user 表
user - 统一用户表(管理员 + 终端用户)
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| merchant_id | int | 商户ID |
| name | varchar(255) | 姓名 |
| email | varchar(255) | 邮箱 |
| user_name | varchar(255) | 用户名 |
| tel | varchar(50) | 手机号 |
| password | varchar(255) | 密码哈希 |
| salt | text | 加密盐值 |
| cipher | varchar(500) | 加密方式 (bcrypt/pbkdf2) |
| password_history | text | 密码历史 (JSON) |
| must_change_password | tinyint | 是否必须改密 |
| password_changed_at | datetime | 最后改密时间 |
| origin | varchar(50) | 来源 (admin/register/oauth) |
| state | tinyint | 状态 |
| last_login_at | datetime | 最后登录时间 |
| last_login_ip | varchar(45) | 最后登录IP |
| created_at | datetime | 创建时间 |
| expired_time | datetime | 过期时间 |
管理员和终端用户共用此表,通过 app_user 绑定和 user_role 区分权限
app - 应用表(产品层)
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| name | varchar(255) | 应用名称 |
| merchant_id | int | 商户ID |
| app_logo | text | 应用Logo |
| app_icon | text | 应用图标 |
| cross | tinyint | 跨应用授权 |
| public | tinyint | 开放注册 |
| type | varchar(20) | 应用类型: public/private/internal |
| config | json | 应用配置 |
| state | tinyint | 状态 |
| created_at | datetime | 创建时间 |
| expired_time | datetime | 过期时间 |
type=internal 的应用为商户管理后台,注册时自动创建,不可删除
client - 客户端表(场景层)
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| name | varchar(255) | 客户端名称(场景名) |
| app_id | int | 所属应用ID |
| merchant_id | int | 商户ID |
| client_secret | varchar(255) | OAuth 密钥 |
| callback_url | text | OAuth 回调地址(支持逗号分隔多个) |
| sso_url | text | SSO 回跳地址 |
| primary_redirect_url | text | 默认跳转地址 |
| slo_url | text | Back-channel 登出 webhook |
| frontchannel_logout_url | text | Front-channel 登出 URL |
| logout_redirect_url | text | 登出后跳转地址 |
| public | tinyint | 此场景是否开放注册 |
| state | tinyint | 状态 |
| created_at | datetime | 创建时间 |
| expired_time | datetime | 过期时间 |
一个 App 可有多个 Client(内部/B2B/公开),共享 logo/用户池
app_user - 应用用户表(绑定关系)
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 (= open_id) |
| union_id | int | 关联 user.id |
| app_id | int | 应用ID |
| merchant_id | int | 商户ID |
| nick_name | varchar(255) | 昵称 |
| origin | varchar(50) | 来源 |
| state | tinyint | 状态 (0=待激活, 1=已激活) |
| created_at | datetime | 创建时间 |
| expired_time | datetime | 过期时间 |
每个用户在每个应用下有独立的 app_user 记录和 open_id
state=0 表示待激活(私有应用注册),state=1 表示已激活(公开应用自动激活)
token - 令牌表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| token_type | string | access_token / refresh_token |
| user_id | int | app_user.id |
| app_id | int | 应用ID |
| merchant_id | int | 商户ID |
| token | varchar(2000) | token 值 |
| expire_time | int | 过期时间戳 |
| format | varchar(20) | opaque / jwt |
| kid | varchar(64) | 签名密钥ID |
| jti | varchar(64) | JWT ID |
| app_type | varchar(20) | primary / micro_application |
| state | tinyint | 状态 |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
auth_code - 授权码表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| code | varchar(255) | 授权码 |
| type | varchar(255) | token / code |
| user_id | varchar(255) | app_user.id |
| merchant_id | int | 商户ID |
| app_id | int | 应用ID |
| app_type | varchar(20) | primary / micro_application |
| expire | int | 过期时间戳 |
| status | int | 状态 0=已使用 1=有效 |
| code_challenge | varchar(255) | PKCE challenge |
| code_challenge_method | varchar(20) | PKCE method |
| create_time | datetime | 创建时间 |
role - 角色表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| merchant_id | int | 商户ID |
| name | varchar(255) | 角色名称 |
| description | text | 描述 |
| is_built_in | tinyint | 是否内置角色(如 admin) |
| state | tinyint | 状态 |
| created_at | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
permission - 权限表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| name | varchar(255) | 权限名称 |
| code | varchar(255) | 权限代码 |
| description | text | 描述 |
user_role - 用户角色关联
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| user_id | int | user.id |
| role_id | int | role.id |
| merchant_id | int | 商户ID |
developer - 开发者表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| merchant_id | int | 商户ID |
| app_id | int | 应用ID |
| key | varchar(255) | API Key |
| token | varchar(255) | API Token |
| secret | varchar(255) | API Secret |
| state | tinyint | 状态 |
jwt_key - JWT 密钥表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| merchant_id | int | 商户ID |
| public_key | text | 公钥 PEM |
| private_key | text | 私钥 PEM |
| kid | varchar(64) | 密钥ID |
| algorithm | varchar(20) | RS256 |
audit_log - 审计日志表
| 字段 | 类型 | 说明 |
|---|
| id | int | 主键 |
| merchant_id | int | 商户ID |
| user_id | int | 操作者ID |
| action | varchar(255) | 操作类型 |
| resource | varchar(255) | 资源 |
| ip | varchar(45) | IP地址 |
| user_agent | text | User-Agent |
| detail | text | 详情 (JSON) |
| created_at | datetime | 创建时间 |
Redis 缓存键
| 前缀 | 说明 | TTL |
|---|
sso_session:* | SSO 会话 | 24h |
sso_token:* | SSO Token | 24h |
agent_token:* | 智能体 Token | 2h |
agent_token:app:* | 智能体应用 Token 缓存 | 1h |
slo_callback:* | SLO 回调注册 | 1h |
slo_token:* | SLO 一次性 Token | 5min |
login_* | 登录失败锁定 | 自动过期 |