# 根哥软件开发 · 开发者管理后台 — 第三方软件接入文档

> 本管理后台基于 EdgeOne Pages + Functions + KV 构建,为多品牌 SaaS 软件提供统一的品牌注册、等级控制、升级码配额管理、审计追踪能力。任何符合本接入规范的客户端软件,均可被本后台统一管控。
>
> 当前版本:v2.0 | 最后更新:2026-08-05 | 域名:admin.ligen.cn

## 目录

1. 快速开始
2. 认证鉴权
3. 品牌注册表
4. 平台签名通道
5. 数据面代理
6. Provision 初始化
7. 环境变量参考
8. 错误码参考
9. 品牌数据模型
10. 完整接入清单

---

## 1. 快速开始

接入本管理后台后,你的软件将获得以下能力:

- **品牌注册与隔离** — 每个品牌独立数据库、独立凭证、独立配额
- **等级上限控制** — 超管设 maxLicenseLevel,品牌方不得越级发放升级码
- **升级码配额管理** — trial/pro/enterprise 三档配额,自动核销与扣减
- **全链路审计** — 关键操作(查看密码、调整配额等)自动留痕
- **数据面代理** — 控制面转发请求到你的 NestJS/后端,由你自行处理业务

```
┌─ 管理后台 (admin.ligen.cn) ───────────────────┐
│  EdgeOne Pages + Functions + KV                │
│  品牌注册表 / 等级上限 / 配额管理 / 审计        │
└──────────────────┬──────────────────────────────┘
                   │ Bearer Token / HMAC-SHA256
                   ▼
┌─ 你的数据面 (NestJS / 任意后端) ────────────────┐
│  EXE 客户端 → POST /api/v1/provision/init       │
│  → 写入品牌独立 MySQL + COS 配置               │
│  → 返回初始化结果                               │
└──────────────────┬──────────────────────────────┘
                   │
┌─ 品牌 EXE 客户端 ──────────────────────────────┐
│  本地 SQLite + 远程数据面                       │
│  可离线使用本地功能                             │
└─────────────────────────────────────────────────┘
```

> 接入本管理后台 **不需要** 你部署任何额外数据库或服务器。你只需在软件中实现规定的 HTTP 接口,即可被后台统一管控。

## 2. 认证鉴权

### 2.1 超管登录(管理后台自身)

```
POST /api/auth/login HTTP/1.1
Host: admin.ligen.cn
Content-Type: application/json

{
  "username": "super_admin",
  "password": "你的超管密码"
}

// 响应
{
  "accessToken": "eyJ...",
  "refreshToken": "rft_...",
  "expiresIn": 3600
}
```

### 2.2 后续请求携带 Token

```
GET /api/tenants HTTP/1.1
Host: admin.ligen.cn
Authorization: Bearer eyJ...
```

### 2.3 品牌方登录(数据面)

品牌方管理员账号由超管在后台创建品牌时自动生成(格式 `admin@品牌key`)。品牌方通过你的数据面登录接口完成认证。控制面只存管理员初始密码(一次性交付),后续认证全由数据面接管。

## 3. 品牌注册表

### 3.1 数据面读取品牌列表

数据面启动后,通过控制面 API 拉取所有已创建的品牌配置(含加密的数据库连接串、COS 凭证),按 `brandKey` 建立动态路由。

```
GET /api/registry/brands HTTP/1.1
Host: admin.ligen.cn
Authorization: Bearer {your_registry_token}

// 响应
{
  "data": [{
    "brandKey": "heaifei",
    "brandName": "河爱非遗",
    "status": "active",
    "dbHost": "127.0.0.1",
    "dbPort": 3306,
    "dbName": "feiyi_heaifei",
    "dbUser": "feiyi_heaifei",
    "dbPasswordEncrypted": "AES-256-GCM密文...",
    "storage": {
      "bucket": "heaifei-1234567890",
      "region": "ap-guangzhou",
      "secretIdEncrypted": "...",
      "secretKeyEncrypted": "..."
    },
    "maxLicenseLevel": "pro",
    "quotas": {
      "trial":  { "total": 50,  "used": 3,  "remaining": 47 },
      "pro":    { "total": 200, "used": 12, "remaining": 188 },
      "enterprise": { "total": 1000, "used": 0, "remaining": 1000 }
    }
  }]
}
```

> 注册表接口使用独立 Token(非超管登录 Token),需在 EdgeOne 环境变量 `REGISTRY_TOKEN` 配置,与超管会话隔离。

## 4. 平台签名通道

### 4.1 签名机制

当你的客户端/数据面需要以高权限操作品牌配置时(如更新配额、查看管理员密码),控制面会验证 HMAC-SHA256 签名。

```js
const crypto = require('crypto');

function sign(payload, secret) {
  const timestamp = Date.now().toString();
  const body = typeof payload === 'string' ? payload : JSON.stringify(payload);
  const signature = crypto
    .createHmac('sha256', secret)
    .update(timestamp + '\n' + body)
    .digest('hex');

  return { timestamp, signature };
}

// 使用时附加到请求头:
// X-Platform-Timestamp: 1691234567890
// X-Platform-Signature: 3f8c2a...
```

签名密钥 `PLATFORM_SECRET` 配置在 EdgeOne 环境变量中,由你设定并与控制面共享。

## 5. 数据面代理

### 5.1 用途

控制面可将部分请求透明转发到你的数据面(如品牌方初始化数据库、生成升级码等),无需品牌客户端直连你的公网服务。

```
POST /api/proxy/heaifei/v1/brands/heaifei/upgrade-codes HTTP/1.1
Host: admin.ligen.cn
Authorization: Bearer {超管Token}
Content-Type: application/json

{
  "level": "pro",
  "quantity": 10
}

// 控制面验证权限后,以 {brandKey} 对应的 apiBaseUrl 转发:
// POST {品牌apiBaseUrl}/api/v1/brands/heaifei/upgrade-codes
```

> 代理仅在品牌创建时填写了 `apiBaseUrl` 时才生效。如果你的数据面不对外暴露,可不开放此通道。

## 6. Provision 初始化

### 6.1 品牌初始化流程

1. 超管在后台创建品牌条目(brandKey + 等级上限 + 配额)
2. 品牌方拿到管理员账号密码,登录 EXE 客户端
3. EXE 通过数据面 `POST /api/v1/provision/init` 上报品牌自有的 MySQL / COS 配置
4. 数据面验证后,写回控制面 KV 中的 `dbHost/dbPasswordEncrypted/storage` 字段
5. 此后数据面启动时从注册表拉取完整配置,动态路由到品牌数据库

```
POST /api/v1/provision/init HTTP/1.1
Host: {你的数据面地址}
Content-Type: application/json
Authorization: Bearer {品牌方Token}

{
  "brandKey": "heaifei",
  "dbConfig": {
    "host": "10.0.0.1",
    "port": 3306,
    "database": "feiyi_heaifei",
    "username": "root",
    "password": "品牌方自己的MySQL密码"
  },
  "storageConfig": {
    "bucket": "heaifei-cos",
    "region": "ap-guangzhou",
    "secretId": "AKID...",
    "secretKey": "..."
  }
}

// 响应
{
  "success": true,
  "message": "品牌 heaifei 已初始化",
  "dbUrlMasked": "10.0.*.*:3306/feiyi_heaifei"
}
```

数据面处理完成后,需调用控制面 API 更新品牌状态为 `active`:

```
PUT /api/tenants/heaifei HTTP/1.1
Host: admin.ligen.cn
Authorization: Bearer {超管Token}
Content-Type: application/json

{
  "op": "status",
  "status": "active"
}
```

## 7. 环境变量参考

| 变量名 | 用途 | 必填 |
|---|---|---|
| TENANT_SECRET_KEY | KEK 主密钥,用于加密品牌数据库密码等敏感字段 (AES-256-GCM) | ✅ |
| REGISTRY_TOKEN | 数据面拉取品牌注册表的 Bearer Token(独立于超管会话) | ✅ |
| PLATFORM_SECRET | HMAC-SHA256 签名密钥(跨服务互信) | ✅ |
| JWT_SECRET | 超管 JWT 签名密钥 | ✅ |
| REFRESH_SECRET | Refresh Token 签名密钥 | ✅ |
| SESSION_TTL | 超管会话有效期(秒),默认 3600 | ❌ |
| AUDIT_RETENTION_DAYS | 审计日志保留天数,默认 90 | ❌ |
| RATE_LIMIT_PER_MINUTE | 每分钟请求限制,默认 100 | ❌ |

> 所有环境变量在 EdgeOne Pages 控制台 → 环境变量中配置,无需 .env 文件。

## 8. 错误码参考

| 错误码 | HTTP 状态 | 含义 |
|---|---|---|
| UNAUTHORIZED | 401 | 未登录或 Token 过期 |
| FORBIDDEN | 403 | 无权限执行此操作 |
| RESOURCE_NOT_FOUND | 404 | 品牌/资源不存在 |
| VALIDATION_FAILED | 400 | 参数校验失败(message 中含具体字段) |
| INVALID_PARAMETER | 400 | 参数取值非法(如不支持的 action) |
| CONFLICT | 409 | brandKey 重复或状态冲突 |
| RATE_LIMITED | 429 | 请求频率超限 |
| QUOTA_EXCEEDED | 400 | 升级码配额不足 |
| LEVEL_LIMITED | 400 | 超出品牌等级上限(maxLicenseLevel) |
| INTERNAL_ERROR | 500 | 服务端内部错误 |

```
{
  "error": "VALIDATION_FAILED",
  "message": "brandKey 仅支持小写字母数字和连字符,3–32 字符"
}
```

## 9. 品牌数据模型

```json
{
  // ---- 标识 ----
  "brandKey": "heaifei",           // 唯一键,仅小写字母数字+连字符 3–32
  "brandName": "河爱非遗",          // 显示名称
  "status": "active",              // pending | active | suspended | deleted
  "createdAt": "2026-08-05T10:00:00.000Z",
  "updatedAt": "2026-08-05T12:00:00.000Z",

  // ---- 管理员 ----
  "adminAccount": "admin@heaifei",       // 自动生成
  "adminInitialPassword": "aB3$xK9...",  // 16位,创建时回显一次
  "adminPasswordSetAt": "2026-08-05T10:00:00.000Z",

  // ---- 等级与配额 ----
  "maxLicenseLevel": "pro",              // null(不限制) | trial | pro | enterprise

  // 各等级可发放上限(total=-1 无限)
  "quotaTrial":     50,   "quotaUsedTrial":     3,
  "quotaPro":       200,  "quotaUsedPro":       12,
  "quotaEnterprise": 1000, "quotaUsedEnterprise": 0,

  // ---- 数据库 (品牌方自带库,Provision 后填充) ----
  "dbHost": "10.0.0.1",
  "dbPort": 3306,
  "dbName": "feiyi_heaifei",
  "dbUser": "feiyi_heaifei",
  "dbPasswordEncrypted": "AES-256-GCM密文...",
  "kekVersion": "v1",               // KEK 版本标识

  // ---- 存储 (COS) ----
  "storage": {
    "bucket": "heaifei-1234567890",
    "region": "ap-guangzhou",
    "secretIdEncrypted": "...",
    "secretKeyEncrypted": "..."
  },

  // ---- 网络 ----
  "domainId": "zhinao.ligen.cn",   // 品牌域名
  "apiBaseUrl": "https://adminapi.ligen.cn",  // 数据面地址(代理用)

  // ---- 其他 ----
  "remark": "河爱非遗品牌",
  "meta": {},                        // 扩展元数据
  "provision": {                     // 开通状态
    "initiatedAt": "2026-08-05T11:00:00.000Z",
    "status": "completed"
  }
}
```

## 10. 完整接入清单

1. **注册管理后台账号** — 获取超管权限,在 `/#/tenants` 创建品牌条目
2. **配置环境变量** — 在 EdgeOne Pages 控制台设置 `TENANT_SECRET_KEY` / `REGISTRY_TOKEN` / `PLATFORM_SECRET` / `JWT_SECRET` / `REFRESH_SECRET`
3. **实现数据面 Provision 接口** — `POST /api/v1/provision/init`,接收品牌方 MySQL/COS 配置,加密后回写控制面
4. **实现品牌注册表拉取** — 数据面启动时 `GET /api/registry/brands`(带 `REGISTRY_TOKEN`),按 brandKey 建立数据库连接池
5. **实现 HMAC-SHA256 签名** — 使用 `PLATFORM_SECRET` 对高权限操作签名
6. **(可选)配置代理转发** — 品牌创建时填写 `apiBaseUrl`,控制面将通过 `/api/proxy/:brandKey/*` 转发请求
7. **(可选)实现升级码核销回调** — 品牌方在 EXE 中生码后,数据面调用 `POST /api/upgrade-codes` 核销配额
8. **测试** — 创建测试品牌 → Provision 初始化 → 验证数据面能正确读写品牌独立数据库

> 完成以上 8 步后,你的软件即完全接入管理后台。超管可在后台统一管控所有品牌的等级上限、配额、审计日志。

---

本文档随管理后台代码同步更新。如有疑问,查看 `edge-functions/_tenants.js` 与 `edge-functions/_rbac.js` 源码获取最新实现细节。