基于 EdgeOne Pages Edge Functions + KV Storage 构建的域名分发管理系统,支持 Cloudflare 和 DNSPod(腾讯云)根域名分发,接入 Blessing Skin 皮肤站 OAuth 认证,内置暗色主题管理面板。
nic/ ├── index.html # 管理面板前端 (SPA) ├── middleware.js # CORS + 健康检查 ├── package.json └── edge-functions/api/ ├── auth/ │ ├── login.js # Blessing Skin OAuth 登录 │ ├── callback.js # OAuth 回调 + 会话创建 │ ├── logout.js # 退出登录 │ └── me.js # 获取当前用户信息 ├── providers/ │ ├── [id].js # 服务商 CRUD (单个) │ └── providers.js # 服务商列表 + 创建 ├── domains/ │ ├── [id].js # 域名 CRUD (单个) │ └── [id]/ │ ├── records.js # DNS 记录列表 + 创建 │ └── records/[rid].js # DNS 记录 CRUD (单个) ├── domains.js # 域名列表 + 创建 ├── distribute/ │ └── [domain]/[subdomain].js # 公开分发 API ├── admin/ │ └── config.js # 管理员配置 └── init.js # 系统初始化
| 路由 | 方法 | 认证 | 说明 |
|---|---|---|---|
/api/auth/login | GET | 无 | 跳转 Blessing Skin OAuth |
/api/auth/callback | GET | 无 | OAuth 回调 |
/api/auth/logout | POST | 可选 | 退出登录 |
/api/auth/me | GET | 需要 | 获取当前用户 |
/api/providers | GET/POST | 管理员 | 服务商列表 / 创建 |
/api/providers/:id | GET/PUT/DELETE | 管理员 | 服务商详情 / 更新 / 删除 |
/api/domains | GET/POST | 管理员 | 域名列表 / 创建 |
/api/domains/:id | GET/PUT/DELETE | 管理员 | 域名详情 / 更新 / 删除 |
/api/domains/:id/records | GET/POST | 管理员 | 记录列表 / 创建 |
/api/domains/:id/records/:rid | GET/PUT/DELETE | 管理员 | 记录详情 / 更新 / 删除 |
/api/distribute/:domain/:subdomain | GET | 无 | 公开分发查询 |
/api/admin/config | GET/POST | 管理员 | 系统配置 |
/api/init | POST | INIT_KEY | 系统初始化 |
/api/health | GET | 无 | 健康检查 |
/api/applications | GET/POST | 需要 | 申请列表 / 提交申请 |
/api/applications/:id | GET/POST/DELETE | 需要/管理员 | 申请详情 / 审批 / 删除 |
# 查询 www 记录
curl https://your-domain.com/api/distribute/example.com/www
# 查询根域名 (@) 记录,使用 _ 代替 @
curl https://your-domain.com/api/distribute/example.com/_
响应:
{
"domain": "example.com",
"subdomain": "www",
"records": [
{
"type": "CNAME",
"value": "cdn.example.com",
"ttl": 600,
"proxied": false
}
]
}
前往皮肤站管理后台(https://skin.mc.ecustcic.com/admin)创建 OAuth 客户端:
https://your-domain.com/api/auth/callback记录 Client ID 和 Client Secret。
nic-kv)my_kv在 EdgeOne Pages 项目设置中添加以下环境变量:
| 变量名 | 说明 |
|---|---|
BLESSING_SKIN_URL | 皮肤站地址(默认 https://skin.mc.ecustcic.com) |
BLESSING_CLIENT_ID | Blessing Skin OAuth 客户端 ID |
BLESSING_CLIENT_SECRET | Blessing Skin OAuth 客户端 Secret |
INIT_KEY | 系统初始化密钥(自定义,用于首次初始化管理员) |
FEISHU_APP_ID | 飞书应用 App ID(可选,用于多维表格同步) |
FEISHU_APP_SECRET | 飞书应用 App Secret(可选) |
FEISHU_BITABLE_ID | 飞书多维表格 ID(即 Bitable 的 app_token,可选) |
FEISHU_TABLE_ID | 飞书多维表格中的数据表 ID(可选) |
edgeone pages deploy
首次部署后,调用初始化 API 设置管理员 UID:
curl -X POST https://your-domain.com/api/init \
-H "Content-Type: application/json" \
-d '{
"init_key": "你设置的INIT_KEY",
"admins": ["1", "2"]
}'
皮肤站管理员(permission >= 1)自动拥有系统管理权限,无需手动添加到 admins 列表。
打开 https://your-domain.com,使用皮肤站账号登录即可进入管理面板。
用户点击登录 ↓ 跳转皮肤站 /oauth/authorize ↓ 用户授权 ↓ 回调 /api/auth/callback?code=xxx&state=xxx ↓ 用 code 换取 access_token (POST /oauth/token) ↓ 用 access_token 获取用户信息 (GET /api/user) ↓ 判断权限 (UID 在 admins 列表 或 permission >= 1) ↓ 创建会话,写入 KV,重定向到管理面板
需要提供:
Zone - DNS - Edit需要提供:
在 腾讯云 API 密钥管理 获取。
如果不需要飞书同步,跳过此节即可——不配置相关环境变量时功能自动禁用,不影响主流程。
bitable:app — 多维表格读写权限在飞书中创建一个多维表格(Bitable),在其中创建一个数据表,配置以下列(列名必须完全一致):
| 列名 | 字段类型 | 说明 |
|---|---|---|
| 申请ID | 文本 | 申请的唯一标识 |
| 事件类型 | 单选 | 选项:提交申请、审批通过、审批拒绝、删除记录 |
| 申请人 | 文本 | 申请人昵称 |
| 申请人UID | 文本 | 申请人在皮肤站的 UID |
| 申请人邮箱 | 文本 | 申请人邮箱 |
| 根域名 | 文本 | 申请使用的根域名 |
| 子域名 | 文本 | 申请的子域名 |
| 记录类型 | 文本 | A / AAAA / CNAME / TXT / MX / SRV |
| 记录值 | 文本 | DNS 记录的值 |
| 申请理由 | 多行文本 | 申请时填写的理由 |
| 代理 | 文本 | Cloudflare 代理状态(是/否) |
| 操作人 | 文本 | 审批人 / 删除人 |
| 拒绝原因 | 多行文本 | 拒绝时的原因 |
| 操作时间 | 文本 | ISO 格式时间戳 |
⚠️ 这一步最容易遗漏! 仅添加 API 权限不够,还必须把应用添加到多维表格文档中。
打开你的多维表格,在右上角点击 分享 → 搜索你的应用名称 → 设置为 编辑 权限。
或者通过路径操作:多维表格右上角「…」→「更多」→「添加文档应用」→ 搜索并勾选你的应用。
获取 Bitable ID 和 Table ID:打开多维表格,浏览器地址栏中的 URL 格式为
https://xxx.feishu.cn/base/{bitable_id}?table={table_id}其中bitable_id即FEISHU_BITABLE_ID(非 App ID!),table_id即FEISHU_TABLE_ID。
在 EdgeOne Pages 项目设置中添加以下四个飞书环境变量即可。
如果调用时返回 code=91403, msg=Forbidden,请确认:
bitable:app 且已发布并通过审批FEISHU_BITABLE_ID 填写的是 URL 中 base/ 后面的那串,不是 App ID| Key 前缀 | 说明 | 示例 |
|---|---|---|
config:admins | 管理员 UID 列表 | ["1", "2"] |
config:settings | 系统设置 | {} |
oauth:state:{state} | OAuth 状态(一次性) | { redirect_uri, created } |
session:{id} | 用户会话 | { uid, nickname, email, permission, isAdmin } |
provider:{id} | DNS 服务商 | { id, type, name, config } |
domain:{id} | 根域名 | { id, root_domain, provider_id } |
record:{domainId}:{recordId} | DNS 记录 | { id, domain_id, subdomain, type, value, ttl, proxied, status, remote_id } |
application:{id} | 域名申请 | { id, domain_id, root_domain, subdomain, type, value, reason, proxied, uid, nickname, email, status, reviewed_by, reject_reason } |
index:applications | 申请索引 | [{ id, domain_id, root_domain, subdomain, ... }] |
# 安装 CLI(如未安装)
npm install -g edgeone-pages-cli
# 链接远程项目(KV 访问需要)
edgeone pages link
# 启动本地开发服务器
edgeone pages dev
# 访问 http://localhost:8088
crypto.subtle)MIT