# Mobile Upgrade Admin - API 文档 ## 概述 本文档描述 Mobile Upgrade Admin 前端与 Admin Service 后端的 API 交互。 ## 基础配置 ### 环境变量 ```bash # .env.local NEXT_PUBLIC_API_URL=http://localhost:3000 ``` ### API 客户端配置 ```typescript // src/infrastructure/http/api-client.ts export const apiClient = axios.create({ baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000', timeout: 30000, headers: { 'Content-Type': 'application/json', }, }) ``` ## API 端点 ### 版本管理 API Base URL: `/api/v1/versions` --- ### 1. 获取版本列表 **端点**: `GET /api/v1/versions` **查询参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | platform | string | 否 | 平台筛选:`android` 或 `ios` | | includeDisabled | boolean | 否 | 是否包含已禁用版本,默认 `true` | **请求示例**: ```typescript // 获取所有版本 const response = await apiClient.get('/api/v1/versions') // 获取 Android 版本 const response = await apiClient.get('/api/v1/versions?platform=android') // 只获取已启用版本 const response = await apiClient.get('/api/v1/versions?includeDisabled=false') ``` **响应示例**: ```json [ { "id": "uuid-1234", "platform": "android", "versionCode": 100, "versionName": "1.0.0", "buildNumber": "100", "downloadUrl": "https://example.com/app-1.0.0.apk", "fileSize": "52428800", "fileSha256": "abc123...", "changelog": "1. 新增功能A\n2. 修复问题B", "isForceUpdate": false, "isEnabled": true, "minOsVersion": "8.0", "releaseDate": "2024-01-01T00:00:00.000Z", "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z" } ] ``` --- ### 2. 获取单个版本 **端点**: `GET /api/v1/versions/:id` **路径参数**: | 参数 | 类型 | 说明 | |------|------|------| | id | string | 版本 ID (UUID) | **请求示例**: ```typescript const response = await apiClient.get('/api/v1/versions/uuid-1234') ``` **响应**: 单个 `AppVersion` 对象 --- ### 3. 创建版本 **端点**: `POST /api/v1/versions` **请求体**: ```typescript interface CreateVersionInput { platform: 'android' | 'ios' versionCode: number versionName: string buildNumber: string downloadUrl: string fileSize: string fileSha256: string changelog: string isForceUpdate: boolean minOsVersion?: string releaseDate?: string } ``` **请求示例**: ```typescript const response = await apiClient.post('/api/v1/versions', { platform: 'android', versionCode: 101, versionName: '1.0.1', buildNumber: '101', downloadUrl: 'https://example.com/app-1.0.1.apk', fileSize: '52428800', fileSha256: 'sha256hash...', changelog: '修复已知问题', isForceUpdate: false, minOsVersion: '8.0' }) ``` **响应**: 创建的 `AppVersion` 对象 --- ### 4. 更新版本 **端点**: `PUT /api/v1/versions/:id` **请求体**: ```typescript interface UpdateVersionInput { downloadUrl?: string fileSize?: string fileSha256?: string changelog?: string isForceUpdate?: boolean isEnabled?: boolean minOsVersion?: string | null releaseDate?: string | null } ``` **请求示例**: ```typescript const response = await apiClient.put('/api/v1/versions/uuid-1234', { changelog: '更新的更新日志', isForceUpdate: true }) ``` **响应**: 更新后的 `AppVersion` 对象 --- ### 5. 删除版本 **端点**: `DELETE /api/v1/versions/:id` **请求示例**: ```typescript await apiClient.delete('/api/v1/versions/uuid-1234') ``` **响应**: 无内容 (204) --- ### 6. 切换版本状态 **端点**: `PATCH /api/v1/versions/:id/toggle` **请求体**: ```json { "isEnabled": true } ``` **请求示例**: ```typescript await apiClient.patch('/api/v1/versions/uuid-1234/toggle', { isEnabled: false }) ``` **响应**: 无内容 (204) --- ### 7. 上传版本文件 **端点**: `POST /api/v1/versions/upload` **请求类型**: `multipart/form-data` **表单字段**: | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | file | File | 是 | APK 或 IPA 文件 | | platform | string | 是 | `android` 或 `ios` | | versionName | string | 是 | 版本号,如 `1.0.0` | | buildNumber | string | 是 | 构建号,如 `100` | | changelog | string | 否 | 更新日志 | | isForceUpdate | boolean | 否 | 是否强制更新,默认 `false` | | minOsVersion | string | 否 | 最低系统版本 | | releaseDate | string | 否 | 发布日期 (ISO 8601) | **请求示例**: ```typescript const formData = new FormData() formData.append('file', file) formData.append('platform', 'android') formData.append('versionName', '1.0.0') formData.append('buildNumber', '100') formData.append('changelog', '首次发布') formData.append('isForceUpdate', 'false') const response = await apiClient.post('/api/v1/versions/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, timeout: 300000, // 5分钟超时,适用于大文件 }) ``` **响应**: 创建的 `AppVersion` 对象 --- ## 移动端检查更新 API ### 检查版本更新 **端点**: `GET /api/app/version/check` > 注意:此端点不使用 `/api/v1` 前缀 **查询参数**: | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | platform | string | 是 | `android` 或 `ios` | | currentVersion | string | 是 | 当前版本号,如 `1.0.0` | | currentBuild | string | 否 | 当前构建号 | **请求示例**: ```bash GET /api/app/version/check?platform=android¤tVersion=1.0.0¤tBuild=100 ``` **响应示例**: ```json { "hasUpdate": true, "isForceUpdate": false, "latestVersion": { "versionName": "1.1.0", "buildNumber": "110", "downloadUrl": "https://example.com/app-1.1.0.apk", "fileSize": "55000000", "changelog": "1. 新功能\n2. 性能优化", "minOsVersion": "8.0" } } ``` --- ## 错误处理 ### 错误响应格式 ```json { "statusCode": 400, "message": "错误描述", "error": "Bad Request" } ``` ### 常见错误码 | 状态码 | 说明 | |--------|------| | 400 | 请求参数错误 | | 404 | 资源不存在 | | 409 | 资源冲突(如版本已存在) | | 413 | 文件过大 | | 500 | 服务器内部错误 | ### 前端错误处理 ```typescript // API 客户端拦截器 apiClient.interceptors.response.use( (response) => response, (error) => { const message = error.response?.data?.message || '请求失败' return Promise.reject(new Error(message)) } ) // 组件中使用 try { await deleteVersion(id) toast.success('删除成功') } catch (err) { toast.error(err.message || '操作失败') } ``` --- ## 数据类型定义 ### AppVersion ```typescript interface AppVersion { id: string // UUID platform: 'android' | 'ios' // 平台 versionCode: number // 版本代码(用于比较) versionName: string // 版本名称(显示用) buildNumber: string // 构建号 downloadUrl: string // 下载地址 fileSize: string // 文件大小(字节) fileSha256: string // 文件 SHA256 校验值 changelog: string // 更新日志 isForceUpdate: boolean // 是否强制更新 isEnabled: boolean // 是否启用 minOsVersion: string | null // 最低系统版本要求 releaseDate: string | null // 发布日期 createdAt: string // 创建时间 updatedAt: string // 更新时间 } ``` ### VersionListFilter ```typescript interface VersionListFilter { platform?: 'android' | 'ios' includeDisabled?: boolean } ``` --- ## 相关文档 - [架构文档](./ARCHITECTURE.md) - [开发指南](./DEVELOPMENT.md) - [测试指南](./TESTING.md) - [部署指南](./DEPLOYMENT.md)