# 前端对接文档(管理后台 + 客户端) 本文档基于已实现的后端接口,提供给前端开发使用。 ## 统一响应格式 ```json { "code": 200, "message": "success", "data": {}, "timestamp": 1735000000 } ``` ## 统一错误码 - 200 success - 400 bad_request - 401 unauthorized - 403 forbidden - 404 not_found - 1001 card_invalid - 1002 card_expired - 1003 card_banned - 1005 device_limit_exceeded - 1006 device_not_found - 1007 signature_invalid - 1008 timestamp_expired - 1009 rate_limit_exceeded - 1010 invalid_version - 1011 project_disabled - 1012 force_update_required - 500 internal_error ## 分页参数 - page: 页码,默认 1 - pageSize: 每页数量,默认 20,最大 100 响应: ```json { "code": 200, "data": { "items": [], "pagination": { "page": 1, "pageSize": 20, "total": 100, "totalPages": 5 } } } ``` ## 鉴权方式 ### 管理员后台 登录后获得 JWT,前端需在请求头加入: ``` Authorization: Bearer ``` ### 代理商 代理商登录后也使用 JWT,同上。 ### 客户端授权 `/api/auth/verify` 成功后返回 `accessToken`,后续心跳/下载使用。 ## 角色与权限 - role: - `super_admin`:全部权限(含代理商管理、系统设置、管理员管理) - `admin`:仅可访问所属项目 - permissions: - JSON 数组,内容为允许的 `projectId`,示例:`["PROJ_001","PROJ_002"]` - 若为 `["*"]` 表示可访问全部项目 - 非超管且权限为空时,默认无项目访问权限 - 权限生效范围: - 非超管只能查看/操作允许项目的项目、卡密、设备、日志、统计 - 代理商管理与系统设置仅超管可访问 ## 管理后台接口 ### 1) 管理员认证 - POST `/api/admin/login` - POST `/api/admin/logout` - GET `/api/admin/profile` - PUT `/api/admin/profile` - POST `/api/admin/change-password` ### 2) 项目管理 - POST `/api/admin/projects` - GET `/api/admin/projects` - GET `/api/admin/projects/{id}` - PUT `/api/admin/projects/{id}` - DELETE `/api/admin/projects/{id}` - GET `/api/admin/projects/{id}/stats` - GET `/api/admin/projects/{id}/docs` - PUT `/api/admin/projects/{id}/docs` #### 价格管理 - GET `/api/admin/projects/{id}/pricing` - POST `/api/admin/projects/{id}/pricing` - PUT `/api/admin/projects/{id}/pricing/{priceId}` - DELETE `/api/admin/projects/{id}/pricing/{priceId}` #### 版本管理 - GET `/api/admin/projects/{id}/versions` - POST `/api/admin/projects/{id}/versions` (multipart/form-data) - version (string) - file (file) - changelog (string) - isForceUpdate (bool) - isStable (bool) - PUT `/api/admin/projects/{id}/versions/{versionId}` - DELETE `/api/admin/projects/{id}/versions/{versionId}` 说明:项目创建时返回 `projectSecret`,后续查询不再返回该字段(仅保留 `projectKey`)。请前端在创建时提示管理员保存。 ### 3) 卡密管理 - POST `/api/admin/cards/generate` - GET `/api/admin/cards` - GET `/api/admin/cards/{id}` - GET `/api/admin/cards/{id}/logs` - PUT `/api/admin/cards/{id}` (更新备注) - POST `/api/admin/cards/{id}/ban` - POST `/api/admin/cards/{id}/unban` - POST `/api/admin/cards/{id}/extend` - POST `/api/admin/cards/{id}/reset-device` - DELETE `/api/admin/cards/{id}` #### 批量操作 - POST `/api/admin/cards/ban-batch` - POST `/api/admin/cards/unban-batch` - DELETE `/api/admin/cards/batch` #### 导入/导出 - GET `/api/admin/cards/export` - POST `/api/admin/cards/import` (CSV) 说明:导出支持 `format=excel` 生成 `xlsx`,导入支持 CSV 或 Excel(首行可带表头)。卡密生成支持请求头 `X-Idempotency-Key` 防止重复提交。 ### 4) 代理商管理 - 仅超管可访问 - POST `/api/admin/agents` - GET `/api/admin/agents` - GET `/api/admin/agents/{id}` - PUT `/api/admin/agents/{id}` - POST `/api/admin/agents/{id}/disable` - POST `/api/admin/agents/{id}/enable` - DELETE `/api/admin/agents/{id}` - POST `/api/admin/agents/{id}/recharge` - POST `/api/admin/agents/{id}/deduct` - GET `/api/admin/agents/{id}/transactions` ### 5) 设备管理 - GET `/api/admin/devices` - DELETE `/api/admin/devices/{id}` - POST `/api/admin/devices/{id}/kick` ### 6) 统计报表 - GET `/api/admin/stats/dashboard` - GET `/api/admin/stats/projects` (项目维度统计) - GET `/api/admin/stats/agents` (代理商销售统计,仅超管) - GET `/api/admin/stats/logs?days=7` (按 action 聚合统计) - GET `/api/admin/stats/export?days=30` (CSV 导出) ### 7) 日志审计 - GET `/api/admin/logs` - GET `/api/admin/logs/{id}` ### 8) 系统设置 & 管理员 - 仅超管可访问 - GET `/api/admin/settings` - PUT `/api/admin/settings` - GET `/api/admin/admins` - POST `/api/admin/admins` - PUT `/api/admin/admins/{id}` - DELETE `/api/admin/admins/{id}` ## 代理商接口 - POST `/api/agent/login` - POST `/api/agent/logout` - GET `/api/agent/profile` - PUT `/api/agent/profile` - POST `/api/agent/change-password` - GET `/api/agent/transactions` ### 代理商售卡 - POST `/api/agent/cards/generate` - GET `/api/agent/cards` 说明:代理商售卡会按项目价格 * 折扣扣减余额,支持 `X-Idempotency-Key` 防重复扣款。 ## 客户端/SDK 接口 ### 1) 卡密验证 POST `/api/auth/verify` ```json { "projectId": "PROJ_001", "keyCode": "A3D7-K2P9-M8N1-Q4W6", "deviceId": "SHA256硬件指纹", "clientVersion": "1.0.0", "timestamp": 1735000000, "signature": "HMAC-SHA256签名" } ``` 成功返回: ```json { "code": 200, "data": { "valid": true, "expireTime": "2025-12-31T23:59:59Z", "remainingDays": 30, "downloadUrl": "/api/software/download?version=1.2.0&token=xxx", "fileHash": "sha256...", "version": "1.2.0", "heartbeatInterval": 60, "accessToken": "jwt_token" } } ``` 若客户端版本低于强制更新版本,将返回 `1012 force_update_required`(HTTP 426)。 ### 2) 心跳验证 POST `/api/auth/heartbeat` ```json { "accessToken": "jwt_token", "deviceId": "xxx", "timestamp": 1735000000, "signature": "xxx" } ``` ### 3) 版本检查 POST `/api/software/check-update` ### 4) 软件下载 GET `/api/software/download?version=1.2.0&token=jwt_token` 响应头(加密开启时): - `X-File-Hash` - `X-File-Size` - `X-Encryption-Method: AES-256-GCM` - `X-Encryption-Key: ` - `X-Encryption-Nonce: ` ## 注意事项 - 上传软件版本需要 `multipart/form-data`。 - 当 `Storage.ClientRsaPublicKeyPem` 未配置时,文件存储为明文,不返回加密头。 - `/api/software/check-update` 返回的 `downloadUrl` 需要客户端自行追加 `token` 参数(来自 `/api/auth/verify`)。 - 目前导入卡密仅支持 CSV。 - 设备限流可通过请求头 `X-Device-Id` 识别设备(建议 SDK 统一加上)。 - 当系统配置 `feature.auto_update=false` 时,`/api/software/check-update` 将返回 `hasUpdate=false`。 ## 公共配置接口 - GET `/api/config/public` 返回所有 `IsPublic = true` 的系统配置(用于客户端功能开关/心跳间隔等)。 - `/api/admin/stats/*` 除 `dashboard` 外为预留接口。