# 模组工坊 Open API — AI 开发参考

> 模组工坊面向第三方开发者的开放 API，包含资源查询 / 下载授权 / 用户代理 / Webhook 通知等能力。

- 版本: `1.0.0`
- 服务地址: `http://localhost:7315` (生产环境)
- 机器可读规范: `GET /openapi/v2/meta/openapi.json`（标准 OpenAPI 3.0，未包裹 ResponseDTO）/ `openapi.yaml`
- 所有响应统一包裹为 `ResponseDTO`：`{ code, ok, msg, data, traceId }`，`code=0` 表示成功，`data` 为业务数据。

## 鉴权

每个业务请求必须携带以下请求头，由服务端校验 API Key：

| 请求头 | 说明 |
| --- | --- |
| `X-API-Key` | 应用 API Key（32 位字符串） |
| `X-Proxy-User-Id` | 代理用户 ID，需要 `user:proxy` 的读接口必填 |
| `X-Proxy-Access-Token` | 写接口必填，OAuth 颁发的代理用户访问令牌（24h） |

**限流**：默认每分钟 100 次、每日 10000 次。

## 接口清单

### `POST /openapi/v1/post/batch-detail`

批量获取帖子详情

- 请求体: [`OpenApiBatchPostDetailParam`](#schema-openapibatchpostdetailparam)
- 响应: [`ResponseDTOListMapStringObject`](#schema-responsedtolistmapstringobject)

### `GET /openapi/v1/post/query`

查询帖子列表

- 响应: [`ResponseDTOPageResultMapStringObject`](#schema-responsedtopageresultmapstringobject)

### `GET /openapi/v1/post/{postId}`

获取帖子详情

- 参数:
  - `postId` (path, 必填) Long
  - `postType` (query) String
- 响应: [`ResponseDTOMapStringObject`](#schema-responsedtomapstringobject)

### `GET /openapi/v1/resource/query`

查询资源列表

- 参数:
  - `pageNum` (query, 必填) Integer
  - `pageSize` (query, 必填) Integer
  - `sectionCode` (query) String
  - `keyword` (query) String
- 响应: [`ResponseDTOPageResultMapStringObject`](#schema-responsedtopageresultmapstringobject)

### `GET /openapi/v1/resource/{postId}`

获取资源详情

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOMapStringObject`](#schema-responsedtomapstringobject)

### `POST /openapi/v1/resource/{postId}/download-auth`

生成下载授权

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseDownloadAuthParam`](#schema-basedownloadauthparam)
- 响应: [`ResponseDTODownloadAuthVo`](#schema-responsedtodownloadauthvo)

### `GET /openapi/v1/resource/{postId}/files`

获取资源文件列表

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListMapStringObject`](#schema-responsedtolistmapstringobject)

### `GET /openapi/v1/resource/{postId}/install-config`

获取安装配置

- 参数:
  - `postId` (path, 必填) Long
  - `fileInfoId` (query) Long
- 响应: [`ResponseDTOInstallConfigVo`](#schema-responsedtoinstallconfigvo)

### `GET /openapi/v1/server/query`

查询服务器列表

- 参数:
  - `pageNum` (query, 必填) Integer
  - `pageSize` (query, 必填) Integer
  - `serverStatus` (query) String
  - `queryEnabled` (query) Boolean
- 响应: [`ResponseDTOPageResultMapStringObject`](#schema-responsedtopageresultmapstringobject)

### `GET /openapi/v1/server/{postId}/status`

获取服务器状态

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOOpenApiServerStatusVo`](#schema-responsedtoopenapiserverstatusvo)

### `GET /openapi/v1/stats/forum`

获取论坛统计数据

- 响应: [`ResponseDTOOpenApiForumStatsVo`](#schema-responsedtoopenapiforumstatsvo)

### `GET /openapi/v1/tags`

查询标签列表

- 参数:
  - `sectionCode` (query) String
- 响应: [`ResponseDTOListMapStringObject`](#schema-responsedtolistmapstringobject)

### `GET /openapi/v1/user/profile`

获取代理用户资料

- 需代理用户令牌 `X-Proxy-Access-Token`
- 响应: [`ResponseDTOOpenApiUserProfileVo`](#schema-responsedtoopenapiuserprofilevo)

### `GET /openapi/v2/categories/tree`

全站资源分类列表（当前为扁平结构，树形组装留待后续）

- 响应: [`ResponseDTOListCategoryNodeVO`](#schema-responsedtolistcategorynodevo)

### `GET /openapi/v2/category/tree`

全站资源分类列表（当前为扁平结构，树形组装留待后续）

- 响应: [`ResponseDTOListCategoryNodeVO`](#schema-responsedtolistcategorynodevo)

### `POST /openapi/v2/community/collect`

收藏 toggle（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiInteractionParam`](#schema-baseopenapiinteractionparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/community/comment`

发布评论 / 回复（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiCommentPublishParam`](#schema-baseopenapicommentpublishparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `GET /openapi/v2/community/comments`

查询通用评论列表(按 entityType + entityId)

- 响应: [`ResponseDTOPageResultCommentVO`](#schema-responsedtopageresultcommentvo)

### `GET /openapi/v2/community/discuss/query`

查询讨论帖列表

- 响应: [`ResponseDTOPageResultCommunityPostSummaryVO`](#schema-responsedtopageresultcommunitypostsummaryvo)

### `GET /openapi/v2/community/discuss/{postId}`

查询讨论帖详情

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOCommunityPostDetailVO`](#schema-responsedtocommunitypostdetailvo)

### `POST /openapi/v2/community/follow`

关注 / 取关 toggle（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiFollowParam`](#schema-baseopenapifollowparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/community/like`

点赞 toggle（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiInteractionParam`](#schema-baseopenapiinteractionparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/community/message/send`

发送私信（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiMessageSendParam`](#schema-baseopenapimessagesendparam)
- 响应: [`ResponseDTOOpenApiPrivateMessageResultVO`](#schema-responsedtoopenapiprivatemessageresultvo)

### `GET /openapi/v2/community/moment/query`

查询瞬间(动态)列表

- 响应: [`ResponseDTOPageResultCommunityMomentVO`](#schema-responsedtopageresultcommunitymomentvo)

### `GET /openapi/v2/community/moment/{momentId}`

查询瞬间(动态)详情

- 参数:
  - `momentId` (path, 必填) Long
- 响应: [`ResponseDTOCommunityMomentVO`](#schema-responsedtocommunitymomentvo)

### `GET /openapi/v2/community/notifications`

查询代理用户站内消息列表

- 需代理用户令牌 `X-Proxy-Access-Token`
- 参数:
  - `readFlag` (query) Boolean
- 响应: [`ResponseDTOPageResultMessageVO`](#schema-responsedtopageresultmessagevo)

### `POST /openapi/v2/community/notifications/read`

标记代理用户站内消息已读

- 需代理用户令牌 `X-Proxy-Access-Token`
- 请求体: [`OpenApiNotificationReadParam`](#schema-openapinotificationreadparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/community/notifications/unread-count`

查询代理用户未读消息数

- 需代理用户令牌 `X-Proxy-Access-Token`
- 响应: [`ResponseDTOLong`](#schema-responsedtolong)

### `GET /openapi/v2/community/question/query`

查询问答帖列表

- 响应: [`ResponseDTOPageResultCommunityQuestionVO`](#schema-responsedtopageresultcommunityquestionvo)

### `GET /openapi/v2/community/question/{postId}`

查询问答帖详情

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOCommunityQuestionVO`](#schema-responsedtocommunityquestionvo)

### `GET /openapi/v2/community/question/{postId}/answers`

查询问答帖回答列表

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommunityAnswerVO`](#schema-responsedtopageresultcommunityanswervo)

### `GET /openapi/v2/community/search`

全站全文搜索

- 响应: [`ResponseDTOPageResultLuceneSearchResultVo`](#schema-responsedtopageresultlucenesearchresultvo)

### `GET /openapi/v2/community/search/suggest`

搜索联想(前缀补全)

- 参数:
  - `keyword` (query, 必填) String
- 响应: [`ResponseDTOListString`](#schema-responsedtoliststring)

### `GET /openapi/v2/community/user/{userId}`

查询用户公开主页

- 参数:
  - `userId` (path, 必填) Long
- 响应: [`ResponseDTOCommunityUserProfileVO`](#schema-responsedtocommunityuserprofilevo)

### `GET /openapi/v2/community/user/{userId}/followers`

查询用户粉丝列表

- 参数:
  - `userId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommunityFollowUserVO`](#schema-responsedtopageresultcommunityfollowuservo)

### `GET /openapi/v2/community/user/{userId}/following`

查询用户关注列表

- 参数:
  - `userId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommunityFollowUserVO`](#schema-responsedtopageresultcommunityfollowuservo)

### `GET /openapi/v2/community/user/{userId}/posts`

查询用户作品(讨论帖)列表

- 参数:
  - `userId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommunityPostSummaryVO`](#schema-responsedtopageresultcommunitypostsummaryvo)

### `POST /openapi/v2/file/batch`

批量文件查询（最多 50 个；仅返回所属资源公开可见的文件，其余静默过滤）

- 请求体: [`OpenApiFileBatchParam`](#schema-openapifilebatchparam)
- 响应: [`ResponseDTOListFileSummaryVO`](#schema-responsedtolistfilesummaryvo)

### `POST /openapi/v2/files`

批量文件查询（最多 50 个；仅返回所属资源公开可见的文件，其余静默过滤）

- 请求体: [`OpenApiFileBatchParam`](#schema-openapifilebatchparam)
- 响应: [`ResponseDTOListFileSummaryVO`](#schema-responsedtolistfilesummaryvo)

### `GET /openapi/v2/files/{fileId}/download-url`

单文件下载 URL（外链原始地址；站内 mirror 文件请改用 /download-auth 接口）

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long
- 响应: [`ResponseDTOFileDownloadUrlVO`](#schema-responsedtofiledownloadurlvo)

### `GET /openapi/v2/games`

板块（游戏）列表（CurseForge: list games）

- 响应: [`ResponseDTOListSectionVO`](#schema-responsedtolistsectionvo)

### `GET /openapi/v2/games/{sectionCode}`

板块（游戏）详情

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionVO`](#schema-responsedtosectionvo)

### `GET /openapi/v2/games/{sectionCode}/filter-options`

板块维度资源筛选选项（资源类型→主要类别两级联动 + 运行平台）

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionFilterOptionsVO`](#schema-responsedtosectionfilteroptionsvo)

### `GET /openapi/v2/mod-loaders`

运行平台列表（CurseForge: mod loaders）

- 响应: [`ResponseDTOListRunPlatformVO`](#schema-responsedtolistrunplatformvo)

### `GET /openapi/v2/mod-loaders/{code}`

运行平台详情

- 参数:
  - `code` (path, 必填) String
- 响应: [`ResponseDTORunPlatformVO`](#schema-responsedtorunplatformvo)

### `GET /openapi/v2/modpacks/user-feedback/resolved-since`

"是否有用"投票已修复增量列表(cloudexplorer 定时拉取以复位本地隐藏状态)

- 参数:
  - `since` (query, 必填) 起始时间 (ISO-8601, 例如 2026-08-26T00:00:00), 返回 resolvedAt >= since 的活跃反馈
  - `limit` (query) Integer
- 响应: [`ResponseDTOListUserFeedbackResolvedItemVO`](#schema-responsedtolistuserfeedbackresolveditemvo)

### `POST /openapi/v2/modpacks/{postId}/download-failure`

消费端资源下载失败上报(cloudexplorer 判定资源本身问题时上报,按 fingerprint 去重累加,达阈值自动隐藏)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`DownloadFailureReportParam`](#schema-downloadfailurereportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/modpacks/{postId}/mc-startup-command`

Minecraft 一键启动命令(出租等消费端传机器内存，返回带 -Xmx 与 loader 参数的 shell 命令)

- 参数:
  - `postId` (path, 必填) Long
  - `memoryMb` (query, 必填) Integer
- 响应: [`ResponseDTOMcStartupCommandVo`](#schema-responsedtomcstartupcommandvo)

### `POST /openapi/v2/modpacks/{postId}/mc-startup-command`

MC 一键启动命令消费端回传(出租等消费端把最终写入面板 startup 的命令+来源回传给上游,用于反哺推断质量)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`McStartupCommandReportParam`](#schema-mcstartupcommandreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `POST /openapi/v2/modpacks/{postId}/user-feedback-report`

消费端"是否有用"隐形投票阈值上报(cloudexplorer 侧本地聚合触发, 上报快照供作者通知 + 后台观察)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`UserFeedbackReportParam`](#schema-userfeedbackreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `POST /openapi/v2/mods`

批量获取资源摘要（最多 50 个 ID，结果按入参顺序返回）

- 请求体: [`OpenApiResourceBatchParam`](#schema-openapiresourcebatchparam)
- 响应: [`ResponseDTOListModSummaryVO`](#schema-responsedtolistmodsummaryvo)

### `POST /openapi/v2/mods/draft/init`

初始化资源帖子草稿（代理用户场景；返回新建草稿 postId）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiInitDraftParam`](#schema-baseopenapiinitdraftparam)
- 响应: [`ResponseDTOOpenApiPostIdVO`](#schema-responsedtoopenapipostidvo)

### `POST /openapi/v2/mods/draft/{draftId}/publish`

从草稿发布资源帖子（含审批流转；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `draftId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/mods/draft/{draftId}/save`

保存资源帖子草稿（draftId=0 表示新建草稿；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `draftId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOOpenApiPostIdVO`](#schema-responsedtoopenapipostidvo)

### `GET /openapi/v2/mods/featured`

精选 / 热门资源列表（top 20，按下载数 + 点赞 + 更新时间综合排序）

- 响应: [`ResponseDTOListModSummaryVO`](#schema-responsedtolistmodsummaryvo)

### `GET /openapi/v2/mods/search`

查询资源列表（CurseForge: search mods）

- 响应: [`ResponseDTOPageResultModSummaryVO`](#schema-responsedtopageresultmodsummaryvo)

### `GET /openapi/v2/mods/sync`

资源增量同步（按 updateTime cursor 翻页；首次请求 cursor 留空）

- 响应: [`ResponseDTOResourceSyncVO`](#schema-responsedtoresourcesyncvo)

### `GET /openapi/v2/mods/user-feedback/resolved-since`

"是否有用"投票已修复增量列表(cloudexplorer 定时拉取以复位本地隐藏状态)

- 参数:
  - `since` (query, 必填) 起始时间 (ISO-8601, 例如 2026-08-26T00:00:00), 返回 resolvedAt >= since 的活跃反馈
  - `limit` (query) Integer
- 响应: [`ResponseDTOListUserFeedbackResolvedItemVO`](#schema-responsedtolistuserfeedbackresolveditemvo)

### `GET /openapi/v2/mods/{postId}`

获取资源详情（不含完整描述，描述请走 /description 端点）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOModDetailVO`](#schema-responsedtomoddetailvo)

### `GET /openapi/v2/mods/{postId}/authors`

资源帖子的作者列表（含 userName / avatarUrl / role）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListAuthorBriefVO`](#schema-responsedtolistauthorbriefvo)

### `GET /openapi/v2/mods/{postId}/comments`

资源评论列表（分页；仅 status=NORMAL 且未删除；按 createTime 倒序）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommentVO`](#schema-responsedtopageresultcommentvo)

### `GET /openapi/v2/mods/{postId}/description`

获取资源完整描述（HTML + Markdown，独立端点避免详情 payload 膨胀）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOModDescriptionVO`](#schema-responsedtomoddescriptionvo)

### `POST /openapi/v2/mods/{postId}/download-failure`

消费端资源下载失败上报(cloudexplorer 判定资源本身问题时上报,按 fingerprint 去重累加,达阈值自动隐藏)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`DownloadFailureReportParam`](#schema-downloadfailurereportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `POST /openapi/v2/mods/{postId}/edit`

编辑已发布资源帖子（强制审批；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `GET /openapi/v2/mods/{postId}/files`

资源帖子的文件列表（fingerprint 字段为第 2 期产出，当前为 null）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListFileSummaryVO`](#schema-responsedtolistfilesummaryvo)

### `GET /openapi/v2/mods/{postId}/files/{fileId}`

单文件详情（含下载方式 downInfo 解析；归属校验 postId 必须与文件实际归属一致）

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long
- 响应: [`ResponseDTOFileDetailVO`](#schema-responsedtofiledetailvo)

### `GET /openapi/v2/mods/{postId}/files/{fileId}/download-file`

OpenAPI 直连文件下载(X-API-Key 鉴权,DIRECT_UPLOAD 流式,DIRECT_LINK 302,CLOUD_DISK 拒绝)

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long

### `GET /openapi/v2/mods/{postId}/install-config`

资源一键安装配置（解析 installScript JSON + 补齐资源基本字段）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOInstallConfigVo`](#schema-responsedtoinstallconfigvo)

### `GET /openapi/v2/mods/{postId}/install-info`

资源一键安装信息（完整：含已签名直链 + steam 外部源 + 验证版本；回源 biz。免费资源免登录，付费资源需代理用户且购买门禁）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOOpenApiInstallInfoVo`](#schema-responsedtoopenapiinstallinfovo)

### `GET /openapi/v2/mods/{postId}/install-launch`

资源一键安装唤起信息（deeplink + 探测 + 下载引导，供调用方渲染按钮）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOInstallLaunchVo`](#schema-responsedtoinstalllaunchvo)

### `GET /openapi/v2/mods/{postId}/mc-startup-command`

Minecraft 一键启动命令(出租等消费端传机器内存，返回带 -Xmx 与 loader 参数的 shell 命令)

- 参数:
  - `postId` (path, 必填) Long
  - `memoryMb` (query, 必填) Integer
- 响应: [`ResponseDTOMcStartupCommandVo`](#schema-responsedtomcstartupcommandvo)

### `POST /openapi/v2/mods/{postId}/mc-startup-command`

MC 一键启动命令消费端回传(出租等消费端把最终写入面板 startup 的命令+来源回传给上游,用于反哺推断质量)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`McStartupCommandReportParam`](#schema-mcstartupcommandreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/mods/{postId}/rating`

资源评分聚合（平均分 + 总人数 + 1~5 星分布；无评分时各项返回 0）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTORatingAggregateVO`](#schema-responsedtoratingaggregatevo)

### `GET /openapi/v2/mods/{postId}/relations`

资源帖子的关系链（依赖 / 不兼容 / 推荐；target 字段为空，请用 /mods 批量接口拉取目标摘要）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListRelationVO`](#schema-responsedtolistrelationvo)

### `POST /openapi/v2/mods/{postId}/user-feedback-report`

消费端"是否有用"隐形投票阈值上报(cloudexplorer 侧本地聚合触发, 上报快照供作者通知 + 后台观察)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`UserFeedbackReportParam`](#schema-userfeedbackreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/mods/{postId}/versions`

资源帖子的历史版本列表（仅审批通过的版本，按 versionNumber 倒序）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListVersionVO`](#schema-responsedtolistversionvo)

### `POST /openapi/v2/oauth/revoke`

吊销代理用户访问令牌

- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/oauth/token`

颁发代理用户访问令牌（24h 有效）

- 请求体: [`OpenApiAccessTokenIssueParam`](#schema-openapiaccesstokenissueparam)
- 响应: [`ResponseDTOOpenApiAccessTokenVO`](#schema-responsedtoopenapiaccesstokenvo)

### `POST /openapi/v2/pairing/redeem`

凭配对码换发代理令牌（面板配对：用户在社区生成配对码，面板换取代表其下载已购资源的令牌）

- 请求体: [`OpenApiPairingRedeemParam`](#schema-openapipairingredeemparam)
- 响应: [`ResponseDTOOpenApiAccessTokenVO`](#schema-responsedtoopenapiaccesstokenvo)

### `POST /openapi/v2/provider/activity/carousel`

服务商花活动积分自助投放轮播（免审直上，图片自传；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 响应: [`ResponseDTOServerProviderCarouselResultVo`](#schema-responsedtoserverprovidercarouselresultvo)

### `POST /openapi/v2/provider/activity/collect`

代表已授权用户扣其钱包积分并转入服务商活动积分账户（代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`ServerProviderActivityCollectParam`](#schema-serverprovideractivitycollectparam)
- 响应: [`ResponseDTOServerProviderActivityCollectResultVo`](#schema-responsedtoserverprovideractivitycollectresultvo)

### `POST /openapi/v2/proxy-user/register`

注册代理用户（一键绑定：mzgf 侧当场建号 + 下发 24h 代理令牌）

- 请求体: [`OpenApiProxyUserRegisterParam`](#schema-openapiproxyuserregisterparam)
- 响应: [`ResponseDTOOpenApiProxyUserRegisterVO`](#schema-responsedtoopenapiproxyuserregistervo)

### `GET /openapi/v2/proxy-user/{userId}/points`

查询代理用户积分余额（需 X-Proxy-Access-Token）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 参数:
  - `userId` (path, 必填) Long
- 响应: [`ResponseDTOOpenApiProxyUserPointsVO`](#schema-responsedtoopenapiproxyuserpointsvo)

### `POST /openapi/v2/proxy-user/{userId}/points/adjust`

调整代理用户积分（ADD 增加 / DEDUCT 扣减，需 X-Proxy-Access-Token）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `userId` (path, 必填) Long
- 请求体: [`OpenApiProxyUserPointsAdjustParam`](#schema-openapiproxyuserpointsadjustparam)
- 响应: [`ResponseDTOOpenApiProxyUserPointsAdjustVO`](#schema-responsedtoopenapiproxyuserpointsadjustvo)

### `POST /openapi/v2/proxy-user/{userId}/wallet/{currencyCode}/adjust`

调整代理用户任意币种余额(ADD/DEDUCT,白名单同 balance)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `userId` (path, 必填) Long
  - `currencyCode` (path, 必填) String
- 请求体: [`OpenApiProxyUserPointsAdjustParam`](#schema-openapiproxyuserpointsadjustparam)
- 响应: [`ResponseDTOOpenApiProxyUserPointsAdjustVO`](#schema-responsedtoopenapiproxyuserpointsadjustvo)

### `GET /openapi/v2/proxy-user/{userId}/wallet/{currencyCode}/balance`

查询代理用户任意币种余额(白名单:GOLD_COIN/POINTS/CASH,需 X-Proxy-Access-Token)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 参数:
  - `userId` (path, 必填) Long
  - `currencyCode` (path, 必填) String
- 响应: [`ResponseDTOOpenApiProxyUserPointsVO`](#schema-responsedtoopenapiproxyuserpointsvo)

### `POST /openapi/v2/resource/batch`

批量获取资源摘要（最多 50 个 ID，结果按入参顺序返回）

- 请求体: [`OpenApiResourceBatchParam`](#schema-openapiresourcebatchparam)
- 响应: [`ResponseDTOListModSummaryVO`](#schema-responsedtolistmodsummaryvo)

### `POST /openapi/v2/resource/draft/{draftId}/publish`

从草稿发布资源帖子（含审批流转；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `draftId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/resource/draft/{draftId}/save`

保存资源帖子草稿（draftId=0 表示新建草稿；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `draftId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOOpenApiPostIdVO`](#schema-responsedtoopenapipostidvo)

### `GET /openapi/v2/resource/featured`

精选 / 热门资源列表（top 20，按下载数 + 点赞 + 更新时间综合排序）

- 响应: [`ResponseDTOListModSummaryVO`](#schema-responsedtolistmodsummaryvo)

### `POST /openapi/v2/resource/init-draft`

初始化资源帖子草稿（代理用户场景；返回新建草稿 postId）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiInitDraftParam`](#schema-baseopenapiinitdraftparam)
- 响应: [`ResponseDTOOpenApiPostIdVO`](#schema-responsedtoopenapipostidvo)

### `GET /openapi/v2/resource/query`

查询资源列表（CurseForge: search mods）

- 响应: [`ResponseDTOPageResultModSummaryVO`](#schema-responsedtopageresultmodsummaryvo)

### `GET /openapi/v2/resource/sync`

资源增量同步（按 updateTime cursor 翻页；首次请求 cursor 留空）

- 响应: [`ResponseDTOResourceSyncVO`](#schema-responsedtoresourcesyncvo)

### `GET /openapi/v2/resource/user-feedback/resolved-since`

"是否有用"投票已修复增量列表(cloudexplorer 定时拉取以复位本地隐藏状态)

- 参数:
  - `since` (query, 必填) 起始时间 (ISO-8601, 例如 2026-08-26T00:00:00), 返回 resolvedAt >= since 的活跃反馈
  - `limit` (query) Integer
- 响应: [`ResponseDTOListUserFeedbackResolvedItemVO`](#schema-responsedtolistuserfeedbackresolveditemvo)

### `GET /openapi/v2/resource/{postId}`

获取资源详情（不含完整描述，描述请走 /description 端点）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOModDetailVO`](#schema-responsedtomoddetailvo)

### `GET /openapi/v2/resource/{postId}/authors`

资源帖子的作者列表（含 userName / avatarUrl / role）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListAuthorBriefVO`](#schema-responsedtolistauthorbriefvo)

### `GET /openapi/v2/resource/{postId}/comments`

资源评论列表（分页；仅 status=NORMAL 且未删除；按 createTime 倒序）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOPageResultCommentVO`](#schema-responsedtopageresultcommentvo)

### `GET /openapi/v2/resource/{postId}/description`

获取资源完整描述（HTML + Markdown，独立端点避免详情 payload 膨胀）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOModDescriptionVO`](#schema-responsedtomoddescriptionvo)

### `POST /openapi/v2/resource/{postId}/download-auth`

下载签名授权（站内 mirror 文件；颁发临时下载 token；fileId 在 body 里）

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseDownloadAuthParam`](#schema-basedownloadauthparam)
- 响应: [`ResponseDTODownloadAuthVo`](#schema-responsedtodownloadauthvo)

### `POST /openapi/v2/resource/{postId}/download-failure`

消费端资源下载失败上报(cloudexplorer 判定资源本身问题时上报,按 fingerprint 去重累加,达阈值自动隐藏)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`DownloadFailureReportParam`](#schema-downloadfailurereportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `POST /openapi/v2/resource/{postId}/edit`

编辑已发布资源帖子（强制审批；代理用户场景）

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseOpenApiResourceSaveParam`](#schema-baseopenapiresourcesaveparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `GET /openapi/v2/resource/{postId}/file/{fileId}`

单文件详情（含下载方式 downInfo 解析；归属校验 postId 必须与文件实际归属一致）

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long
- 响应: [`ResponseDTOFileDetailVO`](#schema-responsedtofiledetailvo)

### `GET /openapi/v2/resource/{postId}/file/{fileId}/download-file`

OpenAPI 直连文件下载(X-API-Key 鉴权,DIRECT_UPLOAD 流式,DIRECT_LINK 302,CLOUD_DISK 拒绝)

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long

### `GET /openapi/v2/resource/{postId}/file/{fileId}/download-url`

单文件下载 URL（外链原始地址；站内 mirror 文件请改用 /download-auth 接口）

- 参数:
  - `postId` (path, 必填) Long
  - `fileId` (path, 必填) Long
- 响应: [`ResponseDTOFileDownloadUrlVO`](#schema-responsedtofiledownloadurlvo)

### `GET /openapi/v2/resource/{postId}/files`

资源帖子的文件列表（fingerprint 字段为第 2 期产出，当前为 null）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListFileSummaryVO`](#schema-responsedtolistfilesummaryvo)

### `GET /openapi/v2/resource/{postId}/install-config`

资源一键安装配置（解析 installScript JSON + 补齐资源基本字段）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOInstallConfigVo`](#schema-responsedtoinstallconfigvo)

### `GET /openapi/v2/resource/{postId}/install-info`

资源一键安装信息（完整：含已签名直链 + steam 外部源 + 验证版本；回源 biz。免费资源免登录，付费资源需代理用户且购买门禁）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOOpenApiInstallInfoVo`](#schema-responsedtoopenapiinstallinfovo)

### `GET /openapi/v2/resource/{postId}/install-launch`

资源一键安装唤起信息（deeplink + 探测 + 下载引导，供调用方渲染按钮）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOInstallLaunchVo`](#schema-responsedtoinstalllaunchvo)

### `GET /openapi/v2/resource/{postId}/mc-startup-command`

Minecraft 一键启动命令(出租等消费端传机器内存，返回带 -Xmx 与 loader 参数的 shell 命令)

- 参数:
  - `postId` (path, 必填) Long
  - `memoryMb` (query, 必填) Integer
- 响应: [`ResponseDTOMcStartupCommandVo`](#schema-responsedtomcstartupcommandvo)

### `POST /openapi/v2/resource/{postId}/mc-startup-command`

MC 一键启动命令消费端回传(出租等消费端把最终写入面板 startup 的命令+来源回传给上游,用于反哺推断质量)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`McStartupCommandReportParam`](#schema-mcstartupcommandreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/resource/{postId}/rating`

资源评分聚合（平均分 + 总人数 + 1~5 星分布；无评分时各项返回 0）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTORatingAggregateVO`](#schema-responsedtoratingaggregatevo)

### `GET /openapi/v2/resource/{postId}/relations`

资源帖子的关系链（依赖 / 不兼容 / 推荐；target 字段为空，请用 /mods 批量接口拉取目标摘要）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListRelationVO`](#schema-responsedtolistrelationvo)

### `POST /openapi/v2/resource/{postId}/user-feedback-report`

消费端"是否有用"隐形投票阈值上报(cloudexplorer 侧本地聚合触发, 上报快照供作者通知 + 后台观察)

- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`UserFeedbackReportParam`](#schema-userfeedbackreportparam)
- 响应: [`ResponseDTOVoid`](#schema-responsedtovoid)

### `GET /openapi/v2/resource/{postId}/versions`

资源帖子的历史版本列表（仅审批通过的版本，按 versionNumber 倒序）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOListVersionVO`](#schema-responsedtolistversionvo)

### `GET /openapi/v2/run-platform/list`

运行平台列表（CurseForge: mod loaders）

- 响应: [`ResponseDTOListRunPlatformVO`](#schema-responsedtolistrunplatformvo)

### `GET /openapi/v2/run-platform/{code}`

运行平台详情

- 参数:
  - `code` (path, 必填) String
- 响应: [`ResponseDTORunPlatformVO`](#schema-responsedtorunplatformvo)

### `GET /openapi/v2/section/list`

板块（游戏）列表（CurseForge: list games）

- 响应: [`ResponseDTOListSectionVO`](#schema-responsedtolistsectionvo)

### `GET /openapi/v2/section/{sectionCode}`

板块（游戏）详情

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionVO`](#schema-responsedtosectionvo)

### `GET /openapi/v2/section/{sectionCode}/filter-options`

板块维度资源筛选选项（资源类型→主要类别两级联动 + 运行平台）

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionFilterOptionsVO`](#schema-responsedtosectionfilteroptionsvo)

### `POST /openapi/v2/server-post/lobby/publish`

联机帖一键公开 (代理用户创建 + 全量写入资源清单)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`BaseOpenApiServerPostLobbyPublishParam`](#schema-baseopenapiserverpostlobbypublishparam)
- 响应: [`ResponseDTOLong`](#schema-responsedtolong)

### `POST /openapi/v2/server-post/lobby/{postId}/close`

关闭联机帖 (软删主帖 + 资源行)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `GET /openapi/v2/server-post/lobby/{postId}/manifest`

联机小子拉资源清单 (匿名可访问)

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOOpenApiServerPostLobbyManifestVo`](#schema-responsedtoopenapiserverpostlobbymanifestvo)

### `POST /openapi/v2/server-post/lobby/{postId}/refresh-urls`

批量刷新资源预签名 URL

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOInteger`](#schema-responsedtointeger)

### `POST /openapi/v2/server-post/lobby/{postId}/resources/reserve-batch`

用户自建资源批量占位 (sha256 全库去重 + uploadToken 下发)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseOpenApiServerPostLobbyReserveBatchParam`](#schema-baseopenapiserverpostlobbyreservebatchparam)
- 响应: [`ResponseDTOOpenApiServerPostLobbyReserveBatchVo`](#schema-responsedtoopenapiserverpostlobbyreservebatchvo)

### `POST /openapi/v2/server-post/lobby/{postId}/resources/{resourceId}/cancel`

用户自建资源占位取消 (PENDING 物删 / UPLOADED tombstone)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
  - `resourceId` (path, 必填) Long
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/server-post/lobby/{postId}/resources/{resourceId}/upload`

用户自建资源实际上传 (multipart + 流式 sha256 校验)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
  - `resourceId` (path, 必填) Long
  - `file` (query, 必填) MultipartFile
- 响应: [`ResponseDTOOpenApiServerPostLobbyUploadResultVo`](#schema-responsedtoopenapiserverpostlobbyuploadresultvo)

### `POST /openapi/v2/server-post/lobby/{postId}/update`

更新联机帖 (覆盖字段 + 全量替换资源清单)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 参数:
  - `postId` (path, 必填) Long
- 请求体: [`BaseOpenApiServerPostLobbyPublishParam`](#schema-baseopenapiserverpostlobbypublishparam)
- 响应: [`ResponseDTOBoolean`](#schema-responsedtoboolean)

### `POST /openapi/v2/sso/exchange`

以 X-Proxy-Access-Token 换取 5 分钟一次性 SSO ticket(供浏览器无感登录 mzgf)

- 写接口，需 `X-Proxy-Access-Token`
- 响应: [`ResponseDTOOpenApiSsoTicketVO`](#schema-responsedtoopenapissoticketvo)

### `GET /openapi/v2/stats/games/{sectionCode}`

板块维度统计（资源数 + 累计浏览/下载/点赞/收藏聚合）

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionStatsVO`](#schema-responsedtosectionstatsvo)

### `GET /openapi/v2/stats/mods/{postId}`

单资源统计（累计浏览/下载/点赞/收藏/评论 + 平均评分）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOResourceStatsDetailVO`](#schema-responsedtoresourcestatsdetailvo)

### `GET /openapi/v2/stats/resource/{postId}`

单资源统计（累计浏览/下载/点赞/收藏/评论 + 平均评分）

- 参数:
  - `postId` (path, 必填) Long
- 响应: [`ResponseDTOResourceStatsDetailVO`](#schema-responsedtoresourcestatsdetailvo)

### `GET /openapi/v2/stats/section/{sectionCode}`

板块维度统计（资源数 + 累计浏览/下载/点赞/收藏聚合）

- 参数:
  - `sectionCode` (path, 必填) String
- 响应: [`ResponseDTOSectionStatsVO`](#schema-responsedtosectionstatsvo)

### `POST /openapi/v2/user-binding/link`

反向绑定第三方 App 用户(需 X-Proxy-Access-Token,幂等 upsert)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`OpenApiUserBindingLinkParam`](#schema-openapiuserbindinglinkparam)
- 响应: [`ResponseDTOOpenApiUserBindingVO`](#schema-responsedtoopenapiuserbindingvo)

### `POST /openapi/v2/user-binding/unlink`

解绑第三方 App 用户(需 X-Proxy-Access-Token)

- 需代理用户令牌 `X-Proxy-Access-Token`
- 写接口，需 `X-Proxy-Access-Token`
- 请求体: [`OpenApiUserBindingLinkParam`](#schema-openapiuserbindinglinkparam)
- 响应: [`ResponseDTOInteger`](#schema-responsedtointeger)


## 数据模型

<a id="schema-authorbriefvo"></a>
### AuthorBriefVO

作者列表（含主作者与协作者，按角色顺序）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | integer | 用户 ID（系统用户） |
| `userName` | string | 用户名 |
| `avatarUrl` | string | 头像 URL（已经过 buildDisplayUrl 处理） |
| `role` | string | 作者角色，取值见 cn.yuul.base.framework.constant.PostConstants.POSITION_TYPE：OWNER（管理者）/ COLLABORATOR（协作者）/ CONTRIBUTOR（贡献者） |

<a id="schema-basedownloadauthparam"></a>
### BaseDownloadAuthParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer | 文件信息 ID（不传则下载默认文件） |
| `proxyUserId` | integer | 代理用户 ID（可选，需具备代理权限） |

<a id="schema-baseopenapicommentpublishparam"></a>
### BaseOpenApiCommentPublishParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `entityType` | string | 根实体类型：DISCUSS_POST / QUESTION_POST / USER_MOMENT / RESOURCE_POST |
| `entityId` | integer | 根实体 ID（帖子 / 瞬间 ID） |
| `content` | string | 评论内容 |
| `parentCommentId` | integer | 父评论 ID（回复场景传入，顶层评论留空） |
| `mentionedUserIds` | array<integer> | @提及的用户 ID 列表（最多 10 个） |

<a id="schema-baseopenapifollowparam"></a>
### BaseOpenApiFollowParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `targetUserId` | integer | 目标用户 ID |

<a id="schema-baseopenapiinitdraftparam"></a>
### BaseOpenApiInitDraftParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sectionCode` | string | 板块（游戏）code |
| `resourceTypeId` | integer | 资源类型 ID（关联 resource_ext_info 表 type=RESOURCE_TYPE 行） |
| `categoryId` | string | 分类 ID（逗号分隔，最多 5 个；对应 resource_ext_info type=RESOURCE_MAIN_CATEGORY） |
| `title` | string | 标题（可选，未填时由用户在编辑页补全） |
| `presetCategory` | string | 预设类目（存档广场聚合场景使用，如 SAVE_GAME / CHALLENGE_CONFIG / GRAPHICS_PRESET） |

<a id="schema-baseopenapiinteractionparam"></a>
### BaseOpenApiInteractionParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `entityType` | string | 目标实体类型：DISCUSS_POST / QUESTION_POST / USER_MOMENT / RESOURCE_POST / POST_COMMENT |
| `entityId` | integer | 目标实体 ID |

<a id="schema-baseopenapimessagesendparam"></a>
### BaseOpenApiMessageSendParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `toUserId` | integer | 收信用户 ID |
| `content` | string | 私信内容 |

<a id="schema-baseopenapiresourcefileinfologparam"></a>
### BaseOpenApiResourceFileInfoLogParam

OpenAPI 资源文件信息日志

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `infoId` | integer | 文件信息ID |
| `logVersion` | string | 日志版本 |
| `mdContent` | string | Markdown内容 |
| `logType` | string | 日志类型 |

<a id="schema-baseopenapiresourcefileinfoparam"></a>
### BaseOpenApiResourceFileInfoParam

OpenAPI 资源文件信息

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `infoId` | integer | 文件信息ID |
| `resourcePostId` | integer | 资源帖子ID |
| `infoTitle` | string | 文件标题 |
| `fileVersion` | string | 文件版本 |
| `fileStatus` | string | 文件状态 |
| `runPlatform` | string | 运行平台 |
| `runPlatformName` | string | 运行平台名称 |
| `runPlatformIconUrl` | string | 运行平台图标URL |
| `resourceVersion` | array<string> | 资源版本列表 |
| `resourceVersionNames` | array<string> | 资源版本名称列表 |
| `downInfo` | string | 下载方式信息 |
| `directFileId` | string | 站内下载文件ID |
| `directFileUrl` | string | 站内下载文件URL |
| `directFileName` | string | 站内下载文件名 |
| `directFileSize` | integer | 站内下载文件大小 |
| `logs` | array<BaseOpenApiResourceFileInfoLogParam> | 日志信息列表 |

<a id="schema-baseopenapiresourcerelateparam"></a>
### BaseOpenApiResourceRelateParam

OpenAPI 资源帖关联信息

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `actualName` | string | 真实名称 |
| `avatar` | string | 头像URL |
| `positionType` | string | 职位类型 |
| `userId` | integer | 用户ID |
| `createTime` | string | 创建时间 |

<a id="schema-baseopenapiresourcesaveparam"></a>
### BaseOpenApiResourceSaveParam

OpenAPI 资源帖子保存/发布/编辑入参

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子ID（编辑时使用） |
| `mainName` | string | 资源主名称 |
| `subName` | string | 资源次名称 |
| `mainCategory` | string | 主要类别（支持多个，用逗号分隔，最多5个） |
| `presetCategory` | string | 预设类目（SAVE_GAME/CHALLENGE_CONFIG/GRAPHICS_PRESET），可选；普通资源传 null |
| `abbrName` | string | 缩写名称 |
| `introduction` | string | 资源简介 |
| `coverFileId` | string | 封面文件ID |
| `mdContent` | string | Markdown格式内容 |
| `content` | string | 普通文本内容 |
| `sectionCode` | string | 板块代码 |
| `gameTypeId` | integer | 游戏类型ID |
| `resourceTypeId` | integer | 资源类型ID |
| `runPlatformId` | integer | 运行平台ID |
| `contentCopyrightId` | integer | 内容版权ID |
| `contentCopyright` | string | 内容版权协议 |
| `resourceCopyrightId` | integer | 资源版权ID |
| `resourceCopyright` | string | 资源开源协议 |
| `resourceVersion` | string | 资源版本 |
| `authors` | string | 作者信息（JSON 数组字符串） |
| `postTags` | array<string> | 帖子标签列表 |
| `postTypeId` | string | 资源帖子类型ID |
| `clientEnvironment` | string | 客户端运行环境 |
| `serverEnvironment` | string | 服务端运行环境 |
| `resourceState` | string | 资源状态 |
| `sourceState` | string | 开源状态 |
| `relation` | `ResourceRelationParam` |  |
| `installScript` | string | 安装脚本 |
| `creationType` | string | 创作类型 |
| `refLink` | string | 参考链接（JSON数组字符串） |
| `resourceRelate` | array<BaseOpenApiResourceRelateParam> | 资源关联列表 |
| `resourceFileInfoVos` | array<BaseOpenApiResourceFileInfoParam> | 资源文件信息列表 |
| `images` | array<string> | 媒体图片文件ID列表 |
| `tempId` | string | 临时ID（用于文件迁移） |
| `updateCommit` | string | 更新说明 |
| `rewardEnabled` | boolean | 是否开启打赏激励 |
| `visibility` | string | 可见范围(PUBLIC/PRIVATE) |
| `isPaid` | boolean | 是否付费资源 |
| `priceCurrencyCode` | string | 价格货币代码 |
| `priceAmount` | number | 价格金额 |
| `isAllEdit` | boolean | 是否公开编辑 |
| `memberEnabled` | boolean | 是否开启项目成员功能 |
| `isNewDraft` | boolean | 是否为新建草稿（true=新建草稿，false/null=更新已有草稿） |
| `parentPostId` | integer | 父帖子ID（编辑已发布帖子时传入原帖ID，用于创建EDIT类型草稿） |

<a id="schema-baseopenapiserverpostlobbypublishparam"></a>
### BaseOpenApiServerPostLobbyPublishParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postTitle` | string | 帖子标题 |
| `mainName` | string | 服务器名字 |
| `sectionCode` | string | 板块 code |
| `serverIp` | string | 服务器 IP / 域名 |
| `serverPort` | integer | 服务器端口 |
| `serverPassword` | string | 联机加入密码 |
| `maxPlayers` | integer | 最大玩家数 |
| `serverVersion` | array<string> | 服务器版本列表 |
| `mainPlayType` | string | 主打类型 |
| `serverType` | string | 服务器类型 |
| `runPlatform` | string | 运行平台 |
| `queryType` | string | 查询协议 |
| `coverImageUrl` | string | 封面图 URL |
| `mdContent` | string | markdown 正文 |
| `onlineType` | string | 联机类型 |
| `isReqDownClient` | boolean | 是否需要下载客户端 |
| `resources` | array<BaseOpenApiServerPostLobbyResourceItemParam> | 资源清单 |

<a id="schema-baseopenapiserverpostlobbyreservebatchparam"></a>
### BaseOpenApiServerPostLobbyReserveBatchParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `items` | array<BaseOpenApiServerPostLobbyReserveItemParam> | 待占位的资源清单 (单次最多 50 条) |

<a id="schema-baseopenapiserverpostlobbyreserveitemparam"></a>
### BaseOpenApiServerPostLobbyReserveItemParam

待占位的资源清单 (单次最多 50 条)

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sha256` | string | 文件 sha256 (小写 hex, 64 位) |
| `sizeBytes` | integer | 文件字节数 |
| `name` | string | 资源显示名 (联机小子列给玩家看) |
| `clientInstallPath` | string | 客户端相对安装路径 (如 mods/xxx.jar) |
| `resourceType` | string | 资源类型: mod / modpack / world / plugin / config / core / loader / dataPack |
| `version` | string | 版本号 (可空) |
| `environmentSide` | string | 环境端: SERVER / CLIENT / BOTH, 默认 BOTH |
| `extraJson` | string | 兜底元数据 JSON (loader / gameVersion / dependencies 等) |

<a id="schema-baseopenapiserverpostlobbyresourceitemparam"></a>
### BaseOpenApiServerPostLobbyResourceItemParam

资源清单

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `source` | string | 资源来源: COMMUNITY / BUILTIN / USER_UPLOAD |
| `communityPostId` | integer | 社区资源帖 id (source=COMMUNITY 必填) |
| `communityFileId` | integer | 社区资源文件 id (source=COMMUNITY 必填) |
| `resourceType` | string | 资源类型 |
| `name` | string | 资源显示名 |
| `version` | string | 版本号 |
| `environmentSide` | string | 环境端: SERVER / CLIENT / BOTH, 默认 BOTH |
| `clientInstallPath` | string | 客户端相对安装路径 |
| `sizeBytes` | integer | 文件字节数 |
| `sha256` | string | sha256 |
| `downloadUrl` | string | 下载 URL |
| `downloadUrlExpiresAt` | string | URL 过期时间 |
| `extraJson` | string | 兜底元数据 JSON |

<a id="schema-categorynodevo"></a>
### CategoryNodeVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `categoryCode` | string | 分类 code（业务主键，URL 路径中使用） |
| `name` | string | 分类名称 |
| `description` | string | 分类描述 |
| `iconUrl` | string | 分类图标 URL（已经过 buildDisplayUrl 处理） |
| `parentCode` | string | 父分类 code（顶级分类为 null） |
| `children` | array<CategoryNodeVO> | 子分类节点（递归结构；叶子节点为空数组） |
| `postCount` | integer | 该分类下资源帖子总数（含子分类） |

<a id="schema-commentvo"></a>
### CommentVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `commentId` | integer | 评论 ID |
| `userId` | integer | 评论发布者 ID |
| `userName` | string | 评论发布者用户名 |
| `avatarUrl` | string | 评论发布者头像 URL（已经过 buildDisplayUrl 处理） |
| `content` | string | 评论内容（HTML，已做 XSS 过滤） |
| `parentId` | integer | 父评论 ID（顶级评论为 null） |
| `replyCount` | integer | 子回复数量 |
| `likeCount` | integer | 点赞数 |
| `createTime` | string | 评论发布时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communityanswervo"></a>
### CommunityAnswerVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `answerId` | integer | 回答 ID |
| `questionId` | integer | 所属问题 ID |
| `parentAnswerId` | integer | 父回答 ID（楼中楼，无则为 null） |
| `authorId` | integer | 回答作者用户 ID |
| `authorName` | string | 回答作者昵称 |
| `authorAvatarUrl` | string | 回答作者头像 URL（已经过 buildDisplayUrl 处理） |
| `content` | string | 回答正文 HTML 内容 |
| `mdContent` | string | 回答正文 Markdown 内容（无则为 null） |
| `isAccepted` | boolean | 是否被采纳 |
| `upvoteCount` | integer | 赞同数 |
| `downvoteCount` | integer | 反对数 |
| `voteScore` | integer | 投票分 |
| `commentCount` | integer | 评论数 |
| `createTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communityfollowuservo"></a>
### CommunityFollowUserVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | integer | 用户 ID |
| `nickname` | string | 昵称 |
| `avatarUrl` | string | 头像 URL（已经过 buildDisplayUrl 处理） |
| `bio` | string | 个性签名 |
| `followTime` | string | 关注关系建立时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communitymomentvo"></a>
### CommunityMomentVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `momentId` | integer | 瞬间 ID |
| `userId` | integer | 发布用户 ID |
| `userName` | string | 发布用户昵称 |
| `avatarUrl` | string | 发布用户头像 URL（已经过 buildDisplayUrl 处理） |
| `momentType` | string | 瞬间类型 |
| `content` | string | 瞬间正文内容 |
| `likeCount` | integer | 点赞数 |
| `commentCount` | integer | 评论数 |
| `collectCount` | integer | 收藏数 |
| `viewCount` | integer | 浏览数 |
| `createTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communitypostdetailvo"></a>
### CommunityPostDetailVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子 ID |
| `title` | string | 帖子标题 |
| `sectionCode` | string | 所属板块（游戏）code |
| `authorId` | integer | 作者用户 ID |
| `authorName` | string | 作者昵称 |
| `authorAvatarUrl` | string | 作者头像 URL（已经过 buildDisplayUrl 处理） |
| `summary` | string | AI 摘要（无则为 null） |
| `viewsCount` | integer | 浏览数 |
| `likeCount` | integer | 点赞数 |
| `commentCount` | integer | 评论数 |
| `collectionCount` | integer | 收藏数 |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 最近更新时间（yyyy-MM-dd HH:mm:ss） |
| `content` | string | 正文 HTML 内容 |
| `mdContent` | string | 正文 Markdown 内容（无则为 null） |

<a id="schema-communitypostsummaryvo"></a>
### CommunityPostSummaryVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子 ID |
| `title` | string | 帖子标题 |
| `sectionCode` | string | 所属板块（游戏）code |
| `authorId` | integer | 作者用户 ID |
| `authorName` | string | 作者昵称 |
| `authorAvatarUrl` | string | 作者头像 URL（已经过 buildDisplayUrl 处理） |
| `summary` | string | AI 摘要（无则为 null） |
| `viewsCount` | integer | 浏览数 |
| `likeCount` | integer | 点赞数 |
| `commentCount` | integer | 评论数 |
| `collectionCount` | integer | 收藏数 |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 最近更新时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communityquestionvo"></a>
### CommunityQuestionVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 问答帖 ID |
| `title` | string | 问题标题 |
| `sectionCode` | string | 所属板块（游戏）code |
| `authorId` | integer | 提问者用户 ID |
| `authorName` | string | 提问者昵称 |
| `authorAvatarUrl` | string | 提问者头像 URL（已经过 buildDisplayUrl 处理） |
| `questionStatus` | string | 问题状态 |
| `isResolved` | boolean | 是否已解决 |
| `acceptedAnswerId` | integer | 采纳的回答 ID（未采纳为 null） |
| `voteScore` | integer | 投票分 |
| `difficulty` | integer | 难度等级 |
| `tags` | array<string> | 标签列表（已从逗号分隔串解析为数组） |
| `rewardAmount` | number | 悬赏金额（无悬赏为 null） |
| `rewardCurrency` | string | 悬赏货币 |
| `viewsCount` | integer | 浏览数 |
| `commentCount` | integer | 回答数 |
| `content` | string | 正文 HTML 内容（仅详情接口返回） |
| `mdContent` | string | 正文 Markdown 内容（仅详情接口返回） |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 最近更新时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-communityuserprofilevo"></a>
### CommunityUserProfileVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | integer | 用户 ID |
| `nickname` | string | 昵称 |
| `avatarUrl` | string | 头像 URL（已经过 buildDisplayUrl 处理） |
| `coverImageUrl` | string | 封面图 URL（已经过 buildDisplayUrl 处理） |
| `bio` | string | 个性签名 |
| `location` | string | 地区 |
| `gender` | string | 性别 |
| `equippedTitleId` | integer | 穿戴头衔物品 ID（无则为 null） |
| `avatarFrameId` | integer | 穿戴头像框物品 ID（无则为 null） |
| `followingCount` | integer | 关注数（其关注的用户数） |
| `followerCount` | integer | 粉丝数（关注其的用户数） |

<a id="schema-dependency"></a>
### Dependency

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `resourcePostId` | integer |  |
| `name` | string |  |
| `required` | boolean |  |
| `versionRequirement` | string |  |

<a id="schema-downloadauthvo"></a>
### DownloadAuthVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer |  |
| `fileTitle` | string |  |
| `fileVersion` | string |  |
| `resourceVersion` | string |  |
| `runPlatform` | string |  |
| `downloadInfos` | array<DownloadInfo> |  |

<a id="schema-downloadfailurereportparam"></a>
### DownloadFailureReportParam

消费端资源下载失败上报参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer | 上报的下载文件 ID（install-info 阶段未拿到时可留空） |
| `failureType` | string | 失败类型：INSTALL_INFO_UNAVAILABLE / UPSTREAM_UNREACHABLE / FILE_INVALID / EXTRACT_FAILED / STRUCTURE_INVALID / SERVER_BOOT_FAILED |
| `resourceVersion` | string | 上报时的资源版本快照（resource_post.resource_version），用于版本更新后清零判定 |
| `errorMsg` | string | 客户端上报的错误描述（可为空；超过 1000 字符会被截断） |

<a id="schema-downloadinfo"></a>
### DownloadInfo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `downType` | string |  |
| `downSource` | string |  |
| `downLink` | string |  |
| `downPwd` | string |  |
| `extInfo` | string |  |

<a id="schema-filedetailvo"></a>
### FileDetailVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer | 文件信息 ID（resource_file_info.info_id） |
| `resourcePostId` | integer | 所属资源帖子 ID |
| `externalFileId` | string | 上游外部文件 ID（CurseForge / Modrinth 同步来源时存在，否则 null） |
| `infoTitle` | string | 文件标题 |
| `fileVersion` | string | 文件业务版本号 |
| `fileStatus` | string | 文件状态（业务定义，如 PUBLISHED / DRAFT / DELETED） |
| `runPlatform` | string | 运行平台 code |
| `environmentSide` | string | 文件端侧:CLIENT/SERVER/BOTH,null=未指定(消费端如出租面板按主贴 clientEnvironment/serverEnvironment 兜底判断) |
| `resourceVersion` | string | 对应资源版本号（与所属 resource_post.resource_version 对应） |
| `isServerPack` | boolean | 是否上游"服务端整合包"(CurseForge server pack)。true=服务端包(与同 resourceVersion 的客户端包配对),消费端做同版本归纳时可精确配对而不必依赖文件名硬解析;null 视为普通文件。 |
| `parentExternalFileId` | string | 服务端整合包所属客户端文件的上游文件 ID(上游 parentProjectFileId)。仅 isServerPack=true 的行有值,其值等于配对客户端包的 externalFileId —— 消费端据此把"同一个整合包版本的客户端包与服务端包"精确归为一组(CurseForge 语义),不必再靠 fileVersion/文件名字符串猜。非服务端包或站内手建文件为空串。 |
| `mirrorStatus` | string | 镜像状态（NONE / PENDING / DONE / FAILED） |
| `fileType` | string | 文件类型后缀（如 zip/jar/png），外链未镜像时为 null |
| `mime` | string | 文件 MIME 类型，外链未镜像时为 null |
| `fingerprint` | `FingerprintVO` |  |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 更新时间（yyyy-MM-dd HH:mm:ss） |
| `downType` | string | 下载类型（CLOUD_DISK / OUT_LINK） |
| `downSource` | string | 下载来源（网盘平台或外链类型，如 BAIDU_PAN / DIRECT_LINK / CDN） |
| `downLink` | string | 下载链接（外链原始 URL；站内 mirror 文件需走 download-auth 换取签名 URL） |
| `downPwd` | string | 提取码（CLOUD_DISK 类型有效，OUT_LINK 为 null） |
| `extInfo` | string | 链接附加描述（人类可读，例如"解压密码：xxx"） |

<a id="schema-filedownloadurlvo"></a>
### FileDownloadUrlVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer | 文件信息 ID（resource_file_info.info_id） |
| `resourcePostId` | integer | 所属资源帖子 ID |
| `downType` | string | 下载类型（CLOUD_DISK / OUT_LINK；其他类型时为 null） |
| `downSource` | string | 下载来源（如 BAIDU_PAN / DIRECT_LINK / CDN） |
| `downloadUrl` | string | 下载链接 URL（外链原始 URL；站内 mirror 文件请改用 /download-auth 接口） |
| `downPwd` | string | 提取码（CLOUD_DISK 类型有效，OUT_LINK 为 null） |

<a id="schema-filesummaryvo"></a>
### FileSummaryVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoId` | integer | 文件信息 ID（resource_file_info.info_id） |
| `resourcePostId` | integer | 所属资源帖子 ID |
| `externalFileId` | string | 上游外部文件 ID（CurseForge / Modrinth 同步来源时存在，否则 null） |
| `infoTitle` | string | 文件标题 |
| `fileVersion` | string | 文件业务版本号 |
| `fileStatus` | string | 文件状态（业务定义，如 PUBLISHED / DRAFT / DELETED） |
| `runPlatform` | string | 运行平台 code |
| `environmentSide` | string | 文件端侧:CLIENT/SERVER/BOTH,null=未指定(消费端如出租面板按主贴 clientEnvironment/serverEnvironment 兜底判断) |
| `resourceVersion` | string | 对应资源版本号（与所属 resource_post.resource_version 对应） |
| `isServerPack` | boolean | 是否上游"服务端整合包"(CurseForge server pack)。true=服务端包(与同 resourceVersion 的客户端包配对),消费端做同版本归纳时可精确配对而不必依赖文件名硬解析;null 视为普通文件。 |
| `parentExternalFileId` | string | 服务端整合包所属客户端文件的上游文件 ID(上游 parentProjectFileId)。仅 isServerPack=true 的行有值,其值等于配对客户端包的 externalFileId —— 消费端据此把"同一个整合包版本的客户端包与服务端包"精确归为一组(CurseForge 语义),不必再靠 fileVersion/文件名字符串猜。非服务端包或站内手建文件为空串。 |
| `mirrorStatus` | string | 镜像状态（NONE / PENDING / DONE / FAILED） |
| `fileType` | string | 文件类型后缀（如 zip/jar/png），外链未镜像时为 null |
| `mime` | string | 文件 MIME 类型，外链未镜像时为 null |
| `fingerprint` | `FingerprintVO` |  |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 更新时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-filteroptionvo"></a>
### FilterOptionVO

筛选选项

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | string | 选项 code（section_ext_info.info_id 字符串；作为过滤值回传） |
| `name` | string | 选项名称 |
| `parentCode` | string | 父级 code（mainCategories 指向 resourceTypes.code；其余为 null） |
| `serverInstallable` | boolean | 该类型是否适合安装到服务器(仅 resourceTypes 有值,其余为 null)。true=可装;false=不适合(resource_install_default.server_install_path 为 NULL,如 MC shader/modpack); null=未在默认表中配置(消费端按乐观放行处理)。出租/服务器面板据此过滤类型下拉,避免露出仅客户端类型。 |

<a id="schema-fingerprintvo"></a>
### FingerprintVO

指纹（仅 mirror_status=DONE 或上游回填后非空，否则 null）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sha1` | string | SHA1 哈希（大写，40 字符；主算法，所有客户端通用） |
| `md5` | string | MD5 哈希（大写，32 字符；为兼容老客户端提供） |
| `murmur2` | string | Murmur2 哈希（32 位无符号，CurseForge 启动器默认算法） |
| `size` | integer | 文件字节大小（用于二次校验） |

<a id="schema-installconfigvo"></a>
### InstallConfigVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `configVersion` | string |  |
| `resourcePostId` | integer |  |
| `resourceName` | string |  |
| `resourceVersion` | string |  |
| `platform` | string |  |
| `preChecks` | array<PreCheck> |  |
| `dependencies` | array<Dependency> |  |
| `steps` | array<InstallStep> |  |
| `postActions` | array<PostAction> |  |

<a id="schema-installfileinfo"></a>
### InstallFileInfo

安装文件信息

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `serverPackLayout` | `ServerPackLayout` |  |
| `index` | integer | 文件序号（从 0 开始，对应 FMSL 中的 @N） |
| `fileId` | integer | resource_file_info.info_id,稳定主键。cloudexplorer 侧上报该文件下载失败时按此 id 回传 |
| `name` | string | 文件标题 |
| `url` | string | 下载链接（站内直链或外链，可能为 null） |
| `size` | integer | 文件字节数（外链/网盘或未镜像时为 null） |
| `downType` | string | 下载类型：DIRECT_UPLOAD / CLOUD_DISK / DIRECT_LINK |
| `downSource` | string | 网盘平台或外链来源 |
| `downPwd` | string | 提取码（网盘文件时可能有值） |
| `fileHash` | string | 文件完整性校验哈希（仅 DIRECT_UPLOAD 站内文件有值） |
| `hashAlgo` | string | fileHash 的算法（当前为 MD5） |
| `fileVersion` | string | 文件版本（语义版本字符串） |
| `runPlatform` | string | 运行平台代码 |
| `runPlatformName` | string | 运行平台名称 |
| `environmentSide` | string | 文件端侧:CLIENT/SERVER/BOTH,null=未指定(消费端如出租面板按主贴 clientEnvironment/serverEnvironment 兜底判断) |
| `resourceVersionNames` | array<string> | 该文件声明的兼容游戏版本名列表 |
| `fileStatus` | string | 文件状态(PUBLISHED/BETA/DRAFT 等);消费端稳定推荐时按 PUBLISHED 优先 |
| `recommended` | boolean | 推荐首选文件标记(整帖仅一份为 true);消费端一键安装时按此挑,避免每次漂移 |
| `isServerPack` | boolean | 是否上游「服务端整合包」；true=服务端包，null=普通文件（不下发 false） |
| `upstreamFileId` | string | 上游侧文件 ID(resource_file_info.external_file_id)；与 externalFileId 语义不同 |
| `upstreamParentFileId` | string | 服务端包所属客户端文件的上游 ID；等于配对客户端包的 upstreamFileId |

<a id="schema-installlaunchvo"></a>
### InstallLaunchVo

资源一键安装唤起信息

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `resourcePostId` | integer | 资源帖ID |
| `deeplink` | string | 桌面端唤起 deeplink（fmod://install?source=ue-forum&postId=X） |
| `scheme` | string | 自定义协议 scheme |
| `detectUrl` | string | 客户端本地探测地址（GET 返回 200 表示 fmod 已安装运行） |
| `downloadPageUrl` | string | 桌面端下载引导页 URL（未探测到客户端时跳转；未配置时为 null） |
| `sourceType` | string | 外部搬运来源类型（如 STEAM_WORKSHOP，站内原创资源为 null） |
| `installable` | boolean | 资源是否可安装（对外可见即为 true） |

<a id="schema-installstep"></a>
### InstallStep

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `order` | integer |  |
| `type` | string |  |
| `source` | string |  |
| `target` | string |  |
| `overwrite` | boolean |  |
| `backup` | boolean |  |
| `description` | string |  |

<a id="schema-lucenesearchresultvo"></a>
### LuceneSearchResultVo

Lucene搜索结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `documentId` | string | 文档ID |
| `documentType` | string | 文档类型：discuss_post, resource_post, server_post, wiki_post, tutorial_post, user, group |
| `entityId` | integer | 帖子/实体ID |
| `title` | string | 标题 |
| `mainName` | string | 主名（中文名） |
| `subName` | string | 副名（英文名） |
| `content` | string | 内容摘要 |
| `aiTldr` | string | AI 一句话摘要（TL;DR） |
| `tags` | string | 标签 |
| `sectionCode` | string | 板块代码 |
| `sectionName` | string | 板块名称 |
| `sectionLogo` | string | 板块Logo |
| `status` | string | 状态 |
| `createBy` | integer | 创建者ID |
| `authorName` | string | 作者名称 |
| `authorAvatar` | string | 作者头像 |
| `viewsCount` | integer | 浏览量 |
| `likesCount` | integer | 点赞数 |
| `commentCount` | integer | 评论数 |
| `score` | number | 相关度得分 |
| `highlightedTitle` | string | 高亮标题 |
| `highlightedContent` | string | 高亮内容 |
| `highlightedMainName` | string | 高亮主名（中文名） |
| `highlightedSubName` | string | 高亮副名（英文名） |
| `isRecommend` | boolean | 是否推荐/精华 |
| `isHot` | boolean | 是否热门 |
| `coverImage` | string | 封面图片 |
| `createTime` | integer | 创建时间（时间戳） |
| `updateTime` | integer | 更新时间（时间戳） |

<a id="schema-mcstartupcommandreportparam"></a>
### McStartupCommandReportParam

MC 一键启动命令消费端回传参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `command` | string | 实际写入面板 startup 的完整启动命令 |
| `source` | string | 推断来源:upstream(mzgf openapi 返回) / ai(消费端 AI 生成) / heuristic(启发式) / manual(手填) / unknown |
| `runPlatform` | string | 运行平台(paper/vanilla/forge/neoforge/fabric/...),可选 |
| `mcVersion` | string | Minecraft 版本(1.20.1 等),可选 |
| `serverType` | string | 服务端类型:预留字段,与 runPlatform 语义重合时可留空 |

<a id="schema-mcstartupcommandvo"></a>
### McStartupCommandVo

Minecraft 一键启动命令

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `resourcePostId` | integer | 资源帖ID |
| `machineMemoryMb` | integer | 调用方声明的可用机器内存(MB) |
| `allocatedHeapMb` | integer | 实际分配给 JVM 的堆内存 -Xmx / -Xms(MB) |
| `runPlatform` | string | 运行平台代码(paper/vanilla/forge/neoforge/fabric/spigot/...) |
| `serverJar` | string | 服务端主 jar 相对路径(未在 install-info 中确定时给出通用兜底: server.jar) |
| `command` | string | 完整一键启动 shell 命令 |
| `notes` | string | 生成命令时使用的说明/注意事项，供 UI 展示 |

<a id="schema-messagevo"></a>
### MessageVO

结果集

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `messageId` | integer |  |
| `messageType` | integer |  |
| `receiverUserId` | integer | 接收者id |
| `receiverUserNickname` | string | 接收者昵称 |
| `dataId` | string | 相关业务id |
| `title` | string | 消息标题 |
| `content` | string | 消息内容 |
| `readFlag` | boolean | 是否已读 |
| `readTime` | string | 已读时间 |
| `createTime` | string | 创建时间 |
| `enableJump` | boolean | 是否启用跳转 |
| `jumpUrl` | string | 跳转URL |

<a id="schema-moddescriptionvo"></a>
### ModDescriptionVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 资源帖子 ID |
| `html` | string | HTML 格式描述（已渲染富文本，可直接展示） |
| `markdown` | string | Markdown 原始描述（用于二次渲染或离线展示） |
| `updateTime` | string | 描述最近更新时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-moddetailvo"></a>
### ModDetailVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 资源帖子 ID |
| `mainName` | string | 资源主标题 |
| `subName` | string | 副标题 |
| `introduction` | string | 资源简介（短文，<500 字；列表/卡片展示用，完整描述见 description 接口） |
| `abbrName` | string | 缩写名（用于 URL slug 等场景） |
| `coverImageUrl` | string | 封面图 URL（已经过 buildDisplayUrl 处理） |
| `detailUrl` | string | 资源源页面 URL（论坛站点资源详情页，可在浏览器直接打开；站点域名未配置时为空） |
| `sectionCode` | string | 所属板块（游戏）code |
| `mainCategories` | array<string> | 主要分类列表（已从逗号分隔串解析为数组，最多 5 个） |
| `presetCategory` | string | 预设类目（存档广场聚合场景使用，普通资源为 null） |
| `resourceType` | string | 资源类型 code（如 mod / shader / map） |
| `runPlatform` | string | 运行平台 code（如 forge / fabric / vanilla） |
| `clientEnvironment` | string | 客户端运行环境 |
| `serverEnvironment` | string | 服务端运行环境 |
| `clientInstallPath` | string | 客户端安装位置(相对游戏根目录);clientEnvironment=NO_NEED 时可能为空 |
| `serverInstallPath` | string | 服务端安装位置(相对游戏根目录);serverEnvironment=NO_NEED 时可能为空。出租等服务端场景据此决定文件落位 |
| `serverInstallable` | boolean | 该资源是否适合安装到服务器(mzgf 权威声明)。true=可装(作者填了 serverInstallPath,或默认表推荐了服务端位置); false=不适合(serverEnvironment=NO_NEED,或默认表明确 server_install_path=NULL,如 MC 的 shader/modpack/resource); null=旧版本 VO 尚未打标(消费端可回退到 serverEnvironment 判断)。 出租/服务器面板据此过滤列表、灰化「安装到服务器」按钮。 |
| `resourceVersion` | string | 当前资源版本号（业务语义版本，非帖子版本） |
| `resourceState` | string | 资源状态（ACTIVE / SEMI_ABANDONED / ABANDONED / UNKNOWN） |
| `authors` | array<AuthorBriefVO> | 作者列表（含主作者与协作者，按角色顺序） |
| `isPaid` | boolean | 是否付费资源 |
| `priceAmount` | number | 价格金额（isPaid=true 时有效） |
| `priceCurrencyCode` | string | 价格货币代码（ISO 4217） |
| `viewsCount` | integer | 浏览数 |
| `downloadCount` | integer | 下载次数 |
| `likeCount` | integer | 点赞数 |
| `collectionCount` | integer | 收藏数 |
| `commentCount` | integer | 评论数 |
| `averageRating` | number | 平均评分（0~5，保留两位小数） |
| `ratingCount` | integer | 评分总人数 |
| `publishTime` | string | 首次发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 最近更新时间（yyyy-MM-dd HH:mm:ss） |
| `contentCopyright` | string | 内容版权说明 |
| `resourceCopyright` | string | 资源版权说明 |
| `creationType` | string | 创作类型（ORIGINAL / DERIVATIVE / TRANSLATION / IMPORT 等） |
| `sourceState` | string | 开源状态（OPEN / CLOSED / UNKNOWN） |
| `refLink` | string | 相关链接（外站、官网、源码等） |
| `visibility` | string | 可见范围（PUBLIC / PRIVATE / FOLLOWERS） |
| `downloadPermission` | string | 下载权限（PUBLIC / REGISTERED / MEMBERS） |
| `commentPermission` | string | 评论权限（EVERYONE / REGISTERED / MEMBERS / DISABLED） |
| `postVersion` | integer | 帖子内部版本号（用于乐观锁与版本链管理） |
| `parentPostId` | integer | 父帖子 ID（版本链根，详见 ResourcePostEntity.parentPostId） |
| `displayImages` | array<string> | 展示图片 URL 列表（最多 5 张，已经过 buildDisplayUrl 处理） |
| `links` | array<ModLinkVO> | 结构化外部链接列表（如官网/源码/Wiki/Discord 等；refLink 字段为简单字符串形式，二者并存） |
| `stats` | `OpenApiStatsBriefVO` |  |
| `enableVersionGrouping` | boolean | 所属板块是否启用"同版本文件归纳"。true=前端(资源详情页/出租资源中心)应把同 resourceVersion+runPlatform 下的客户端/服务端文件合并成一行展示;null/false=按原始平铺列表展示。 |

<a id="schema-modlinkvo"></a>
### ModLinkVO

结构化外部链接列表（如官网/源码/Wiki/Discord 等；refLink 字段为简单字符串形式，二者并存）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `linkType` | string | 链接类型（如 HOMEPAGE / SOURCE / WIKI / DISCORD / ISSUE_TRACKER） |
| `url` | string | 完整链接 URL |
| `label` | string | 显示文本（可选，用于前端展示标签；未提供则使用 linkType 默认翻译） |

<a id="schema-modsummaryvo"></a>
### ModSummaryVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 资源帖子 ID |
| `mainName` | string | 资源主标题 |
| `subName` | string | 副标题 |
| `introduction` | string | 资源简介（短文，<500 字；列表/卡片展示用，完整描述见 description 接口） |
| `abbrName` | string | 缩写名（用于 URL slug 等场景） |
| `coverImageUrl` | string | 封面图 URL（已经过 buildDisplayUrl 处理） |
| `detailUrl` | string | 资源源页面 URL（论坛站点资源详情页，可在浏览器直接打开；站点域名未配置时为空） |
| `sectionCode` | string | 所属板块（游戏）code |
| `mainCategories` | array<string> | 主要分类列表（已从逗号分隔串解析为数组，最多 5 个） |
| `presetCategory` | string | 预设类目（存档广场聚合场景使用，普通资源为 null） |
| `resourceType` | string | 资源类型 code（如 mod / shader / map） |
| `runPlatform` | string | 运行平台 code（如 forge / fabric / vanilla） |
| `clientEnvironment` | string | 客户端运行环境 REQUIRED/OPTIONAL/NO_NEED/UNKNOWN(消费端可据此判断资源是否给客户端用) |
| `serverEnvironment` | string | 服务端运行环境 REQUIRED/OPTIONAL/NO_NEED/UNKNOWN(消费端可据此判断资源是否给服务端用) |
| `clientInstallPath` | string | 客户端安装位置(相对游戏根目录);NO_NEED 侧可能为空 |
| `serverInstallPath` | string | 服务端安装位置(相对游戏根目录);NO_NEED 侧可能为空 |
| `serverInstallable` | boolean | 该资源是否适合安装到服务器(mzgf 权威声明)。true=可装(作者填了 serverInstallPath,或默认表推荐了服务端位置); false=不适合(serverEnvironment=NO_NEED,或默认表明确 server_install_path=NULL,如 MC 的 shader/modpack/resource); null=旧版本 VO 尚未打标(消费端可回退到 serverEnvironment 判断)。 出租/服务器面板据此过滤列表、灰化「安装到服务器」按钮。 |
| `resourceVersion` | string | 当前资源版本号（业务语义版本，非帖子版本） |
| `resourceState` | string | 资源状态（ACTIVE / SEMI_ABANDONED / ABANDONED / UNKNOWN） |
| `authors` | array<AuthorBriefVO> | 作者列表（含主作者与协作者，按角色顺序） |
| `isPaid` | boolean | 是否付费资源 |
| `priceAmount` | number | 价格金额（isPaid=true 时有效） |
| `priceCurrencyCode` | string | 价格货币代码（ISO 4217） |
| `viewsCount` | integer | 浏览数 |
| `downloadCount` | integer | 下载次数 |
| `likeCount` | integer | 点赞数 |
| `collectionCount` | integer | 收藏数 |
| `commentCount` | integer | 评论数 |
| `averageRating` | number | 平均评分（0~5，保留两位小数） |
| `ratingCount` | integer | 评分总人数 |
| `publishTime` | string | 首次发布时间（yyyy-MM-dd HH:mm:ss） |
| `updateTime` | string | 最近更新时间（yyyy-MM-dd HH:mm:ss） |

<a id="schema-openapiaccesstokenissueparam"></a>
### OpenApiAccessTokenIssueParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | integer | 目标代理用户 ID（用户必须已在 biz 前端授权页完成确认，并生成对应授权 code） |
| `authCode` | string | biz 前端授权页输出的 6 位授权码（仅大写字母与数字，5 分钟内有效） |
| `requestedScopes` | array<string> | 申请的权限 scope 列表（必须是该 App 已审核通过的权限点子集，与 OpenApiConstant.PERMISSION 对齐）。可空，空时不下发 scope 限制。 |

<a id="schema-openapiaccesstokenvo"></a>
### OpenApiAccessTokenVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `accessToken` | string | 访问令牌（写接口请求时通过 X-Proxy-Access-Token 头携带） |
| `userId` | string | 代理用户 ID（字符串形式，与 OpenApiProxyUserRegisterVO 保持一致） |
| `scopes` | array<string> | 授权 scope 列表 |
| `issuedAt` | string | 颁发时间（yyyy-MM-dd HH:mm:ss） |
| `expiresAt` | string | 过期时间（yyyy-MM-dd HH:mm:ss） |
| `tokenType` | string | token 类型，固定为 Bearer |
| `expiresInSeconds` | integer | 有效时长（秒） |

<a id="schema-openapibatchpostdetailparam"></a>
### OpenApiBatchPostDetailParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postIds` | array<integer> | 帖子 ID 列表（最多 20 条） |

<a id="schema-openapifilebatchparam"></a>
### OpenApiFileBatchParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `fileInfoIds` | array<integer> | 文件信息 ID 列表（对应 resource_file_info.info_id；1~50） |

<a id="schema-openapiforumstatsvo"></a>
### OpenApiForumStatsVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `totalResourcePosts` | integer |  |
| `totalDiscussPosts` | integer |  |
| `totalServerPosts` | integer |  |
| `totalUsers` | integer |  |
| `todayNewPosts` | integer |  |
| `statsTime` | string |  |

<a id="schema-openapiinstallinfovo"></a>
### OpenApiInstallInfoVo

资源一键安装信息

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子ID |
| `name` | string | 资源名称 |
| `version` | string | 资源版本 |
| `game` | string | 游戏板块代码 |
| `script` | string | FMSL 安装脚本内容（可能为 null） |
| `scriptSignature` | string | FMSL 安装脚本服务端 RSA-SHA256 签名（Base64）；脚本为空或未配置签名私钥时为 null |
| `scriptSource` | string | 脚本来源：AUTHOR=作者编写，AI=AI生成，null=无脚本 |
| `scriptSummary` | string | 安装概要：脚本的人类可读文字说明；null=无概要 |
| `postUrl` | string | 帖子地址（前端页面 URL） |
| `sourceType` | string | 外部搬运来源类型（如 STEAM_WORKSHOP，站内原创资源为 null） |
| `externalId` | string | 外部源主键（Steam 创意工坊为 publishedfileid，站内原创资源为 null） |
| `externalGameId` | string | 来源侧游戏 ID（Steam 为 consumer_appid，站内原创资源为 null） |
| `externalUrl` | string | 外部源详情页完整 URL（站内原创资源为 null） |
| `files` | array<InstallFileInfo> | 文件列表（按顺序对应 FMSL 中 @0 @1 等引用） |
| `verifiedGameVersions` | array<string> | 社区验证可用的游戏版本（按成功安装数降序） |

<a id="schema-openapinotificationreadparam"></a>
### OpenApiNotificationReadParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `messageIds` | array<integer> | 待标记已读的消息 ID 列表 |

<a id="schema-openapipairingredeemparam"></a>
### OpenApiPairingRedeemParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pairingCode` | string | 用户在社区生成的 8 位配对码（仅大写字母与数字，1 天内有效） |

<a id="schema-openapipostidvo"></a>
### OpenApiPostIdVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 新建或操作的资源帖子 ID |

<a id="schema-openapiprivatemessageresultvo"></a>
### OpenApiPrivateMessageResultVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `messageId` | integer | 消息 ID |
| `hasSensitiveWords` | boolean | 内容是否命中敏感词（命中时仍可能被拦截或转人工，按业务规则处理） |

<a id="schema-openapiproxyuserpointsadjustparam"></a>
### OpenApiProxyUserPointsAdjustParam

代理用户积分调整参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `amount` | number | 调整金额（始终为正，方向由 direction 决定） |
| `reason` | string | 调整原因（记录到调整流水） |
| `direction` | string | 方向：ADD 增加 / DEDUCT 扣减 |

<a id="schema-openapiproxyuserpointsadjustvo"></a>
### OpenApiProxyUserPointsAdjustVO

代理用户积分调整结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `newBalance` | number | 调整后余额 |
| `recordId` | integer | 对应交易/流水 ID（wallet_account.lastTransactionId） |
| `currencyCode` | string | 本次调整的币种代码（GOLD_COIN / POINTS） |

<a id="schema-openapiproxyuserpointsvo"></a>
### OpenApiProxyUserPointsVO

代理用户积分余额

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `balance` | number | 余额（含冻结） |
| `frozenBalance` | number | 冻结金额 |
| `availableBalance` | number | 可用余额 = balance - frozenBalance |
| `currencyCode` | string | 货币代码，本接口固定 POINTS |

<a id="schema-openapiproxyuserregisterparam"></a>
### OpenApiProxyUserRegisterParam

代理用户注册参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `username` | string | 面板侧展示用户名 |
| `phone` | string | 手机号（可空） |
| `email` | string | 邮箱（可空） |
| `loginName` | string | 用户自选登录名(可空,面板一键绑定时由用户填写) |
| `password` | string | 用户自选密码(可空,面板一键绑定时由用户填写) |
| `externalUserId` | string | 第三方系统(调用方)用户唯一标识(可空,非空则写反向绑定) |
| `externalUsername` | string | 第三方用户名(展示/审计用,可空) |
| `externalDisplayName` | string | 第三方昵称(展示用,可空) |

<a id="schema-openapiproxyuserregistervo"></a>
### OpenApiProxyUserRegisterVO

代理用户注册结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | string | mzgf 侧用户 ID（字符串形式） |
| `accessToken` | string | 24 小时代理访问令牌（首次颁发） |
| `expiresInSeconds` | integer | 令牌有效期（秒） |
| `loginName` | string | 登录名（若外部希望展示 mzgf 登录入口） |
| `passwordAutoGenerated` | integer | 该账号的登录密码是否由系统随机生成（1=是，用户需走忘记密码重置后才能直接登录 mzgf） |
| `plainPassword` | string | 一次性明文密码：仅注册瞬间随响应下发一次，DB 只保留 Argon2 哈希。外部面板应向用户展示后立即抛弃，切勿落库/日志；用户需登录 mzgf 后尽快修改。 |

<a id="schema-openapiresourcebatchparam"></a>
### OpenApiResourceBatchParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postIds` | array<integer> | 资源帖子 ID 列表（1~50） |

<a id="schema-openapiserverpostlobbymanifestitemvo"></a>
### OpenApiServerPostLobbyManifestItemVo

资源清单条目 (只包含 environmentSide ∈ {CLIENT, BOTH})

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | integer | 行主键 (供联机小子按 id 记进度) |
| `source` | string | 资源来源: COMMUNITY / BUILTIN |
| `communityPostId` | integer | 社区资源帖 id |
| `communityFileId` | integer | 社区资源文件 id |
| `resourceType` | string | 资源类型 |
| `name` | string | 资源显示名 |
| `version` | string | 版本号 |
| `environmentSide` | string | 环境端: SERVER / CLIENT / BOTH (只会返回 CLIENT / BOTH) |
| `clientInstallPath` | string | 客户端相对安装路径 (如 mods/xxx.jar) |
| `sizeBytes` | integer | 文件字节数 |
| `sha256` | string | sha256, 下载后校验 |
| `downloadUrl` | string | 下载 URL (COMMUNITY 时可空, 联机小子按 postId+fileId 走本站下载令牌) |
| `downloadUrlExpiresAt` | string | URL 过期时间 |
| `extraJson` | string | 兜底元数据 JSON |

<a id="schema-openapiserverpostlobbymanifestvo"></a>
### OpenApiServerPostLobbyManifestVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子 id |
| `mainName` | string | 服务器名字 |
| `sectionCode` | string | 板块 code |
| `serverIp` | string | 服务器 IP / 域名 |
| `serverPort` | integer | 服务器端口 |
| `serverPassword` | string | 联机加入密码 (无密码时为空) |
| `serverVersion` | string | 服务器版本 (逗号或原始字符串) |
| `queryType` | string | 查询协议 |
| `updatedAt` | string | 帖子最近一次同步时间 (updateTime) |
| `items` | array<OpenApiServerPostLobbyManifestItemVo> | 资源清单条目 (只包含 environmentSide ∈ {CLIENT, BOTH}) |

<a id="schema-openapiserverpostlobbyreservebatchvo"></a>
### OpenApiServerPostLobbyReserveBatchVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 帖子 id (回显) |
| `results` | array<OpenApiServerPostLobbyReserveItemVo> | 占位结果列表, 顺序与请求 items 保持一致 |

<a id="schema-openapiserverpostlobbyreserveitemvo"></a>
### OpenApiServerPostLobbyReserveItemVo

占位结果列表, 顺序与请求 items 保持一致

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sha256` | string | 文件 sha256 (回显, 供客户端对齐) |
| `status` | string | 结果状态: REUSE / NEED_UPLOAD / REJECTED |
| `reservedResourceId` | integer | 已复用或占位的资源 id, REJECTED 时为 null |
| `uploadToken` | string | PENDING 行的一次性上传令牌, 仅 NEED_UPLOAD 有值 |
| `objectKey` | string | CE 对象 key, REUSE 有值, NEED_UPLOAD upload 完成后回填 |
| `downloadUrl` | string | 预签名下载 URL, 仅 REUSE 有值; NEED_UPLOAD 需 upload 后再拉 manifest 时才带 |
| `rejectReason` | string | REJECTED 时的拒绝原因 |

<a id="schema-openapiserverpostlobbyuploadresultvo"></a>
### OpenApiServerPostLobbyUploadResultVo

联机大厅用户自建资源上传结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `resourceId` | integer | 已落库的资源行 id |
| `objectKey` | string | 落库后的对象 key (user-upload/{userId}/{sha256Prefix}/{sha256}) |
| `sha256` | string | 实际存储的 sha256 (与入参 sha256 一致, 便于客户端断言) |
| `downloadUrl` | string | 预签名下载 URL (可能为空, 空则调用方走 refresh-urls 兜底) |
| `downloadUrlExpiresAt` | integer | downloadUrl 到期毫秒时间戳 (null 表示未生成 URL) |

<a id="schema-openapiserverstatusvo"></a>
### OpenApiServerStatusVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer |  |
| `mainName` | string |  |
| `queryEnabled` | boolean |  |
| `queryType` | string |  |
| `serverPort` | integer |  |
| `currentPlayers` | integer |  |
| `maxPlayers` | integer |  |
| `serverStatus` | string |  |
| `serverMotd` | string |  |
| `latencyMs` | integer |  |
| `lastHeartbeatTime` | string |  |

<a id="schema-openapissoticketvo"></a>
### OpenApiSsoTicketVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `ticket` | string | 一次性 SSO ticket(拼到站点 URL 的 ?sso_ticket= 参数) |
| `expiresInSeconds` | integer | 有效期(秒),默认 300 = 5 分钟 |

<a id="schema-openapistatsbriefvo"></a>
### OpenApiStatsBriefVO

时间分段统计（近 24h/7d/30d 的浏览/下载/收藏，无数据时返回 0）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `viewsLast24h` | integer | 近 24 小时浏览数 |
| `viewsLast7d` | integer | 近 7 天浏览数 |
| `viewsLast30d` | integer | 近 30 天浏览数 |
| `downloadsLast24h` | integer | 近 24 小时下载数 |
| `downloadsLast7d` | integer | 近 7 天下载数 |
| `downloadsLast30d` | integer | 近 30 天下载数 |
| `collectsLast24h` | integer | 近 24 小时新增收藏数 |
| `collectsLast7d` | integer | 近 7 天新增收藏数 |
| `collectsLast30d` | integer | 近 30 天新增收藏数 |

<a id="schema-openapiuserbindinglinkparam"></a>
### OpenApiUserBindingLinkParam

第三方 App 用户绑定 link/unlink 参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `externalUserId` | string | 第三方系统(调用方 App)的用户唯一标识 |
| `externalUsername` | string | 第三方用户名(展示/审计用,可空) |
| `externalDisplayName` | string | 第三方昵称(展示用,可空) |

<a id="schema-openapiuserbindingvo"></a>
### OpenApiUserBindingVO

第三方 App 用户绑定映射

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `bindingId` | integer | 绑定主键 ID |
| `userId` | integer | mzgf 内部 userId |
| `appId` | integer | 绑定的 OpenAPI App ID |
| `externalUserId` | string | 第三方系统用户唯一标识 |
| `externalUsername` | string | 第三方用户名 |
| `bindSource` | string | 绑定来源 |
| `status` | string | 状态:ACTIVE | UNBOUND |
| `bindTime` | string | 绑定时间 |

<a id="schema-openapiuserprofilevo"></a>
### OpenApiUserProfileVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `userId` | integer |  |
| `loginName` | string |  |
| `avatar` | string |  |
| `gender` | string |  |
| `bio` | string |  |
| `location` | string |  |
| `status` | string |  |
| `registerTime` | string |  |

<a id="schema-pageresultcommentvo"></a>
### PageResultCommentVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommentVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultcommunityanswervo"></a>
### PageResultCommunityAnswerVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommunityAnswerVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultcommunityfollowuservo"></a>
### PageResultCommunityFollowUserVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommunityFollowUserVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultcommunitymomentvo"></a>
### PageResultCommunityMomentVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommunityMomentVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultcommunitypostsummaryvo"></a>
### PageResultCommunityPostSummaryVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommunityPostSummaryVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultcommunityquestionvo"></a>
### PageResultCommunityQuestionVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<CommunityQuestionVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultlucenesearchresultvo"></a>
### PageResultLuceneSearchResultVo

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<LuceneSearchResultVo> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultmapstringobject"></a>
### PageResultMapStringObject

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<object> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultmessagevo"></a>
### PageResultMessageVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<MessageVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-pageresultmodsummaryvo"></a>
### PageResultModSummaryVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `pageNum` | integer | 当前页 |
| `pageSize` | integer | 每页的数量 |
| `total` | integer | 总记录数 |
| `pages` | integer | 总页数 |
| `list` | array<ModSummaryVO> | 结果集 |
| `emptyFlag` | boolean | 是否为空 |
| `hasMore` | boolean | 是否还有更多数据（用于游标分页） |
| `extData` | object | 扩展数据 |

<a id="schema-postaction"></a>
### PostAction

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `type` | string |  |
| `params` | object |  |

<a id="schema-precheck"></a>
### PreCheck

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `type` | string |  |
| `condition` | string |  |
| `failMessage` | string |  |

<a id="schema-ratingaggregatevo"></a>
### RatingAggregateVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `averageScore` | number | 平均评分（0~5，保留两位小数；无评分时返回 0） |
| `totalCount` | integer | 评分总人数 |
| `starDistribution` | object | 星级分布（key 为 1~5，value 为该星级评分人数；缺失的星级返回 0） |

<a id="schema-relationvo"></a>
### RelationVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `relationType` | string | 关系类型（DEPENDENCY / INCOMPATIBLE / RECOMMENDATION / EMBEDDED 等，详见 resource_post_relation.relation_type） |
| `targetPostId` | integer | 目标资源帖子 ID |
| `target` | `ModSummaryVO` |  |
| `isRequired` | boolean | 是否强制依赖（仅 relationType=DEPENDENCY 时有意义，true 表示缺失则无法运行） |
| `sortOrder` | integer | 排序值（同 relationType 下越小越靠前） |
| `dataSource` | string | 数据来源（USER_DEFINED / UPSTREAM_SYNC / AUTO_DETECTED） |

<a id="schema-resourcerelationitemparam"></a>
### ResourceRelationItemParam

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer |  |
| `required` | boolean |  |

<a id="schema-resourcerelationparam"></a>
### ResourceRelationParam

资源关系（依赖/不兼容/推荐搭配）

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `dependencies` | array<ResourceRelationItemParam> |  |
| `incompatible` | array<ResourceRelationItemParam> |  |
| `recommendations` | array<ResourceRelationItemParam> |  |

<a id="schema-resourcestatsdetailvo"></a>
### ResourceStatsDetailVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 资源帖子 ID |
| `totalViews` | integer | 累计浏览数 |
| `totalDownloads` | integer | 累计下载次数 |
| `totalLikes` | integer | 累计点赞数 |
| `totalCollects` | integer | 累计收藏数 |
| `totalComments` | integer | 累计评论数 |
| `averageRating` | number | 平均评分（0~5）；无评分时返回 0 |

<a id="schema-resourcesyncvo"></a>
### ResourceSyncVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `nextCursor` | string | 下次同步使用的 cursor（取本批次最新 updateTime 的时间戳）；hasMore=false 时仍需保留供下次请求使用 |
| `hasMore` | boolean | 是否还有未拉取的数据（true 表示客户端应立即用 nextCursor 再请求一次） |
| `items` | array<ModSummaryVO> | 本次同步返回的资源帖子列表（按 updateTime 升序） |
| `deletedPostIds` | array<integer> | 自上次 cursor 以来被软删除的资源帖子 ID 列表（客户端镜像站应同步删除本地缓存） |

<a id="schema-responsedtoboolean"></a>
### ResponseDTOBoolean

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | boolean | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtocommunitymomentvo"></a>
### ResponseDTOCommunityMomentVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `CommunityMomentVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtocommunitypostdetailvo"></a>
### ResponseDTOCommunityPostDetailVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `CommunityPostDetailVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtocommunityquestionvo"></a>
### ResponseDTOCommunityQuestionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `CommunityQuestionVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtocommunityuserprofilevo"></a>
### ResponseDTOCommunityUserProfileVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `CommunityUserProfileVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtodownloadauthvo"></a>
### ResponseDTODownloadAuthVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `DownloadAuthVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtofiledetailvo"></a>
### ResponseDTOFileDetailVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `FileDetailVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtofiledownloadurlvo"></a>
### ResponseDTOFileDownloadUrlVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `FileDownloadUrlVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoinstallconfigvo"></a>
### ResponseDTOInstallConfigVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `InstallConfigVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoinstalllaunchvo"></a>
### ResponseDTOInstallLaunchVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `InstallLaunchVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtointeger"></a>
### ResponseDTOInteger

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | integer | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistauthorbriefvo"></a>
### ResponseDTOListAuthorBriefVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<AuthorBriefVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistcategorynodevo"></a>
### ResponseDTOListCategoryNodeVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<CategoryNodeVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistfilesummaryvo"></a>
### ResponseDTOListFileSummaryVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<FileSummaryVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistmapstringobject"></a>
### ResponseDTOListMapStringObject

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<object> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistmodsummaryvo"></a>
### ResponseDTOListModSummaryVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<ModSummaryVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistrelationvo"></a>
### ResponseDTOListRelationVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<RelationVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistrunplatformvo"></a>
### ResponseDTOListRunPlatformVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<RunPlatformVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistsectionvo"></a>
### ResponseDTOListSectionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<SectionVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoliststring"></a>
### ResponseDTOListString

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<string> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistuserfeedbackresolveditemvo"></a>
### ResponseDTOListUserFeedbackResolvedItemVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<UserFeedbackResolvedItemVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolistversionvo"></a>
### ResponseDTOListVersionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | array<VersionVO> | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtolong"></a>
### ResponseDTOLong

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | integer | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtomapstringobject"></a>
### ResponseDTOMapStringObject

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | object | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtomcstartupcommandvo"></a>
### ResponseDTOMcStartupCommandVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `McStartupCommandVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtomoddescriptionvo"></a>
### ResponseDTOModDescriptionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ModDescriptionVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtomoddetailvo"></a>
### ResponseDTOModDetailVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ModDetailVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiaccesstokenvo"></a>
### ResponseDTOOpenApiAccessTokenVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiAccessTokenVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiforumstatsvo"></a>
### ResponseDTOOpenApiForumStatsVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiForumStatsVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiinstallinfovo"></a>
### ResponseDTOOpenApiInstallInfoVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiInstallInfoVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapipostidvo"></a>
### ResponseDTOOpenApiPostIdVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiPostIdVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiprivatemessageresultvo"></a>
### ResponseDTOOpenApiPrivateMessageResultVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiPrivateMessageResultVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiproxyuserpointsadjustvo"></a>
### ResponseDTOOpenApiProxyUserPointsAdjustVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiProxyUserPointsAdjustVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiproxyuserpointsvo"></a>
### ResponseDTOOpenApiProxyUserPointsVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiProxyUserPointsVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiproxyuserregistervo"></a>
### ResponseDTOOpenApiProxyUserRegisterVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiProxyUserRegisterVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiserverpostlobbymanifestvo"></a>
### ResponseDTOOpenApiServerPostLobbyManifestVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiServerPostLobbyManifestVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiserverpostlobbyreservebatchvo"></a>
### ResponseDTOOpenApiServerPostLobbyReserveBatchVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiServerPostLobbyReserveBatchVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiserverpostlobbyuploadresultvo"></a>
### ResponseDTOOpenApiServerPostLobbyUploadResultVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiServerPostLobbyUploadResultVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiserverstatusvo"></a>
### ResponseDTOOpenApiServerStatusVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiServerStatusVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapissoticketvo"></a>
### ResponseDTOOpenApiSsoTicketVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiSsoTicketVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiuserbindingvo"></a>
### ResponseDTOOpenApiUserBindingVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiUserBindingVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoopenapiuserprofilevo"></a>
### ResponseDTOOpenApiUserProfileVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `OpenApiUserProfileVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommentvo"></a>
### ResponseDTOPageResultCommentVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommentVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommunityanswervo"></a>
### ResponseDTOPageResultCommunityAnswerVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommunityAnswerVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommunityfollowuservo"></a>
### ResponseDTOPageResultCommunityFollowUserVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommunityFollowUserVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommunitymomentvo"></a>
### ResponseDTOPageResultCommunityMomentVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommunityMomentVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommunitypostsummaryvo"></a>
### ResponseDTOPageResultCommunityPostSummaryVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommunityPostSummaryVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultcommunityquestionvo"></a>
### ResponseDTOPageResultCommunityQuestionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultCommunityQuestionVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultlucenesearchresultvo"></a>
### ResponseDTOPageResultLuceneSearchResultVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultLuceneSearchResultVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultmapstringobject"></a>
### ResponseDTOPageResultMapStringObject

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultMapStringObject` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultmessagevo"></a>
### ResponseDTOPageResultMessageVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultMessageVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtopageresultmodsummaryvo"></a>
### ResponseDTOPageResultModSummaryVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `PageResultModSummaryVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoratingaggregatevo"></a>
### ResponseDTORatingAggregateVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `RatingAggregateVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoresourcestatsdetailvo"></a>
### ResponseDTOResourceStatsDetailVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ResourceStatsDetailVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoresourcesyncvo"></a>
### ResponseDTOResourceSyncVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ResourceSyncVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtorunplatformvo"></a>
### ResponseDTORunPlatformVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `RunPlatformVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtosectionfilteroptionsvo"></a>
### ResponseDTOSectionFilterOptionsVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `SectionFilterOptionsVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtosectionstatsvo"></a>
### ResponseDTOSectionStatsVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `SectionStatsVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtosectionvo"></a>
### ResponseDTOSectionVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `SectionVO` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoserverprovideractivitycollectresultvo"></a>
### ResponseDTOServerProviderActivityCollectResultVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ServerProviderActivityCollectResultVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtoserverprovidercarouselresultvo"></a>
### ResponseDTOServerProviderCarouselResultVo

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | `ServerProviderCarouselResultVo` |  |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-responsedtovoid"></a>
### ResponseDTOVoid

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 返回码 |
| `level` | string | 级别 |
| `msg` | string | 返回消息 |
| `ok` | boolean | 是否成功 |
| `data` | object | 返回数据 |
| `dataType` | integer |  |
| `traceId` | string | 追踪ID，用于日志串联 |

<a id="schema-runplatformvo"></a>
### RunPlatformVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `infoId` | integer | 运行平台数据库 ID |
| `code` | string | 运行平台 code（业务主键，URL 路径中使用） |
| `name` | string | 运行平台名称 |
| `description` | string | 描述 |
| `iconUrl` | string | 图标 URL（已经过 buildDisplayUrl 处理） |
| `enable` | boolean | 是否启用 |

<a id="schema-sectionfilteroptionsvo"></a>
### SectionFilterOptionsVO

板块维度资源筛选选项

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `resourceTypes` | array<FilterOptionVO> | 资源类型列表（一级父分类，section_ext_info.type=RESOURCE_TYPE） |
| `mainCategories` | array<FilterOptionVO> | 主要类别列表（二级子分类，parentCode 指向 resourceTypes.code） |
| `runPlatforms` | array<FilterOptionVO> | 运行平台列表（section_ext_info.type=PLATFORM） |

<a id="schema-sectionstatsvo"></a>
### SectionStatsVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sectionCode` | string | 板块 code（与请求参数一致） |
| `postCount` | integer | 板块下对外公开资源帖总数 |
| `totalViews` | integer | 板块下累计浏览总数 |
| `totalDownloads` | integer | 板块下累计下载总次数 |
| `totalLikes` | integer | 板块下累计点赞总数 |
| `totalCollects` | integer | 板块下累计收藏总数 |

<a id="schema-sectionvo"></a>
### SectionVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `sectionId` | integer | 板块数据库 ID |
| `sectionCode` | string | 板块代码（业务主键，URL 路径中使用） |
| `description` | string | 板块中文名 |
| `englishName` | string | 英文名 |
| `parentCode` | string | 父板块 code（顶级板块为 null） |
| `iconUrl` | string | 板块图标 URL（已经过 buildDisplayUrl 处理） |
| `sortOrder` | integer | 排序值（越小越靠前） |
| `enable` | boolean | 是否启用 |
| `serverPostEnabled` | boolean | 是否允许发服务器帖子 |
| `resourcePostEnabled` | boolean | 是否允许发资源帖子 |
| `resourcePostCount` | integer | 该板块下资源帖子总数（仅 enable=true 且未删除） |

<a id="schema-serverpacklayout"></a>
### ServerPackLayout

服务端目录判定：ROOT/WRAPPED/PENDING/UNKNOWN/AMBIGUOUS；rootPath 为解压后应提升到安装根的相对目录

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `version` | integer |  |
| `status` | string |  |
| `rootPath` | string |  |
| `stripComponents` | integer |  |
| `fileCount` | integer |  |
| `uncompressedSize` | integer |  |
| `sizesVerified` | boolean |  |
| `hasLibrariesJar` | boolean |  |
| `hasModsJar` | boolean |  |

<a id="schema-serverprovideractivitycollectparam"></a>
### ServerProviderActivityCollectParam

服务商活动积分转入请求参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `amount` | integer | 转入的积分数量（扣被代理用户钱包 POINTS） |
| `orderNo` | string | 外部业务单号（作幂等键，相同单号重复调用不重复扣款；缺省则每次独立） |
| `remark` | string | 备注 |

<a id="schema-serverprovideractivitycollectresultvo"></a>
### ServerProviderActivityCollectResultVo

服务商活动积分转入结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `providerId` | integer | 服务商档案ID |
| `activityBalance` | number | 转入后活动积分账户余额 |
| `transactionId` | integer | 钱包扣款交易ID |

<a id="schema-serverprovidercarouselresultvo"></a>
### ServerProviderCarouselResultVo

服务商自助投放轮播结果

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `carouselId` | integer | 生成的轮播图ID |
| `startTime` | string | 展示开始时间 |
| `endTime` | string | 展示结束时间 |
| `activityBalanceAfter` | number | 扣费后活动积分账户余额 |

<a id="schema-userfeedbackreportparam"></a>
### UserFeedbackReportParam

消费端"是否有用"隐形投票阈值上报参数

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `reportType` | string | 严重程度: RANK_DOWN (排序下沉阈值) / HIDE (隐藏阈值) |
| `usefulCount` | integer | 上报时该 app 侧累计 USEFUL 票数快照 (>=0) |
| `notUsefulCount` | integer | 上报时该 app 侧累计 NOT_USEFUL 票数快照 (>=0) |
| `shortTermBadCount` | integer | 上报时短期窗口 NOT_USEFUL 票数快照 (>=0) |
| `resourceVersion` | string | 上报时资源版本快照 (resource_post.resource_version), 用于新版本自动清零判定 |
| `detail` | string | 客户端上报的补充说明 (可为空, 超 1000 自动截断) |

<a id="schema-userfeedbackresolveditemvo"></a>
### UserFeedbackResolvedItemVO

"是否有用"投票已修复明细

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `postId` | integer | 资源帖 ID |
| `resolvedAt` | string | 被 mzgf 侧标记为已解决的时间 (作为下次轮询 cursor) |

<a id="schema-versionvo"></a>
### VersionVO

返回数据

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `versionId` | integer | 版本快照数据库 ID |
| `postId` | integer | 所属资源帖子 ID |
| `versionNumber` | integer | 版本序号（递增整数，与 resource_post.post_version 对应） |
| `resourceVersion` | string | 资源业务版本号（语义版本，如 1.2.3） |
| `updateCommit` | string | 更新说明（用户在发布版本时填写的 commit message） |
| `isBaseline` | boolean | 是否为基线版本（首次发布） |
| `approvalStatus` | string | 审批状态（WAIT / APPROVED / REJECTED） |
| `publishTime` | string | 发布时间（yyyy-MM-dd HH:mm:ss） |
| `files` | array<FileSummaryVO> | 该版本下的文件列表（轻量视图，详情请走文件接口） |

## 错误码

| code | 名称 | HTTP | 说明 | 解决方案 |
| --- | --- | --- | --- | --- |
| 200001 | 缺少 API Key | 200 | 请求头 X-API-Key 缺失或为空 |  |
| 200002 | API Key 无效 | 200 | API Key 不存在或与应用不匹配 |  |
| 200003 | API Key 已被禁用 | 200 | 应用已被管理员禁用，无法继续调用 |  |
| 200004 | API Key 待审核中 | 200 | 应用申请尚未通过审核 |  |
| 200005 | API Key 申请已被拒绝 | 200 | 应用申请已被驳回，请重新提交 |  |
| 200101 | 请求频率超限，请稍后再试 | 200 | 触发每分钟请求上限 |  |
| 200102 | 每日请求次数超限 | 200 | 触发每日请求上限 |  |
| 200103 | IP 不在白名单中 | 200 | 请求来源 IP 未配置在应用白名单内 |  |
| 200201 | 无此接口权限 | 200 | 应用未开通调用该接口所需的权限 |  |
| 200202 | 资源不存在 | 200 | 请求的资源不存在或已删除 |  |
| 200203 | 无下载权限，请先购买资源 | 200 | 资源需购买后才能下载 |  |
| 200204 | 代理用户不存在 | 200 | X-Proxy-User-Id 指向的用户不存在 |  |
| 200205 | 无代理用户权限 | 200 | 应用未开通 user:proxy 权限 |  |
| 200206 | 文件不存在 | 200 | 请求的文件不存在或已删除 |  |
| 200207 | 安装配置不存在 | 200 | 该文件尚未配置一键安装信息 |  |
| 200301 | 签名验证失败 | 200 | 请检查 X-Signature 的 HMAC-SHA256 计算与 StringToSign 拼接 |  |
| 200302 | 请求时间戳过期 | 200 | X-Timestamp 与服务器时间相差超过 5 分钟 |  |
| 200401 | 已有待审核的申请，请等待审核完成 | 200 | 用户已存在 PENDING 状态的应用申请 |  |
| 200402 | 应用名称已存在 | 200 | 应用名称在系统内不能重复 |  |
| 200403 | 应用不存在 | 200 | 应用 ID 不存在或已删除 |  |
| 200404 | 应用状态异常 | 200 | 应用当前状态不允许该操作 |  |
| 200405 | 参数校验失败 | 200 | 请求参数未通过服务端校验 |  |
| 200501 | 下载令牌无效或已过期 | 200 | 下载令牌已过期或已被吊销 |  |
| 200502 | 下载令牌已被使用 | 200 | 令牌为一次性使用，不可重复 |  |
| 200601 | Webhook URL 格式不正确，仅支持 HTTPS | 200 | Webhook URL 必须以 https:// 开头 |  |
| 200602 | Webhook 不存在 | 200 | Webhook ID 不存在或已删除 |  |
| 200603 | 无效的事件类型 | 200 | 订阅的事件类型不在受支持列表中 |  |
| 200604 | 每个应用最多注册 5 个 Webhook | 200 | Webhook 注册数量超过上限 |  |
| 200605 | Webhook 测试请求失败 | 200 | Test ping 调用未收到 2xx 响应 |  |
| 200606 | Webhook 投递记录不存在 | 200 | 投递 ID 不存在或已清理 |  |
| 200607 | 当前投递状态不允许重放 | 200 | 仅 FAILED 状态投递可重放 |  |
| 200701 | 帖子不存在或已删除 | 200 | postId 对应的帖子不存在或已下线 |  |
| 200702 | 帖子类型参数无效 | 200 | 当前接口不支持该 postType |  |
| 200703 | 批量查询数量不能超过 20 | 200 | 单次批量请求超过上限 |  |
| 200801 | 用户不存在 | 200 | 指定用户不存在或已注销 |  |
| 200802 | 此接口需要设置代理用户 ID | 200 | 请在请求头携带 X-Proxy-User-Id 或申请代理 token |  |
| 200901 | 内部服务网关调用失败，请稍后重试 | 200 | 内部 biz 服务暂时不可用 |  |
| 200902 | 内部业务调用返回错误 | 200 | 内部 biz 服务返回业务异常 |  |
| 200911 | 授权码无效或已过期 | 200 | OAuth auth code 不存在或已过期 |  |
| 200912 | 授权码与代理用户不匹配 | 200 | OAuth auth code 与 userId 绑定关系不符 |  |
| 200208 | 该资源为付费资源，请先登录后再下载 | 200 | 该资源为付费资源，请先登录后再下载 |  |
| 200209 | 该资源为付费资源，请先购买后再下载 | 200 | 该资源为付费资源，请先购买后再下载 |  |
| 200406 | 已达当前等级可申请的应用数量上限 | 200 | 已达当前等级可申请的应用数量上限 |  |
| 200721 | 占位资源行不存在或已回收 | 200 | 占位资源行不存在或已回收 |  |
| 200722 | 占位资源当前状态不允许该操作 | 200 | 占位资源当前状态不允许该操作 |  |
| 200723 | 上传令牌无效或已过期 | 200 | 上传令牌无效或已过期 |  |
| 200724 | 用户上传配额已用完 | 200 | 用户上传配额已用完 |  |
| 200803 | 配对码无效 | 200 | 配对码无效 |  |
| 200804 | 配对码不存在或已过期 | 200 | 配对码不存在或已过期 |  |
| 200913 | 公告不存在 | 200 | 公告不存在 |  |
| 200914 | 错误码不存在 | 200 | 错误码不存在 |  |
| 200915 | 错误码已存在 | 200 | 错误码已存在 |  |
| 200921 | 模组源类型不合法或未启用 | 200 | 模组源类型不合法或未启用 |  |
| 200922 | 模组不存在或已下架 | 200 | 模组不存在或已下架 |  |
| 200923 | 该文件暂无可用下载链接，可能需要源站账号或已被限制 | 200 | 该文件暂无可用下载链接，可能需要源站账号或已被限制 |  |
| 200924 | 上游模组源暂时不可用，请稍后再试 | 200 | 上游模组源暂时不可用，请稍后再试 |  |
| 200925 | 供应商展示名称不能为空 | 200 | 供应商展示名称不能为空 |  |
| 200926 | 服务器供应商不存在 | 200 | 服务器供应商不存在 |  |
| 200927 | 应用尚未通过服务器供应商认证 | 200 | 应用尚未通过服务器供应商认证 |  |
| 200928 | 供应商目录展示状态非法 | 200 | 供应商目录展示状态非法 |  |
| 200941 | 机器内存不足以启动 Minecraft 服务端 | 200 | 机器内存不足以启动 Minecraft 服务端 |  |
| 200942 | 无法从整合包内容清单推断启动命令，请由作者补充启动脚本或使用面板自定义启动命令 | 200 | 无法从整合包内容清单推断启动命令，请由作者补充启动脚本或使用面板自定义启动命令 |  |
| 200949 | 已有待审核的供应商认证申请，请等待审核完成 | 200 | 已有待审核的供应商认证申请，请等待审核完成 |  |
| 200950 | 供应商认证申请不存在 | 200 | 供应商认证申请不存在 |  |
| 200951 | 申请当前状态不允许该操作 | 200 | 申请当前状态不允许该操作 |  |
| 200961 | 沙箱数据集为空，请联系管理员登记联调资源 | 200 | 沙箱数据集为空，请联系管理员登记联调资源 |  |
| 200962 | 当前接口暂不支持沙箱模式 | 200 | 当前接口暂不支持沙箱模式 |  |
| 200971 | Steam 服务暂时不可用，请稍后再试 | 200 | Steam 服务暂时不可用，请稍后再试 |  |
| 200981 | 应用未启用 OIDC 登录能力 | 200 | 应用未启用 OIDC 登录能力 |  |
| 200982 | 回调地址不在白名单中 | 200 | 回调地址不在白名单中 |  |
| 200983 | 客户端认证失败 | 200 | 客户端认证失败 |  |
| 200984 | 授权码无效、已过期或已被使用 | 200 | 授权码无效、已过期或已被使用 |  |
| 200985 | 不支持的授权类型 | 200 | 不支持的授权类型 |  |
| 200986 | 申请的 scope 非法或超出应用授权范围 | 200 | 申请的 scope 非法或超出应用授权范围 |  |
| 200987 | 公共客户端必须提供 PKCE code_verifier | 200 | 公共客户端必须提供 PKCE code_verifier |  |
| 200988 | PKCE 校验失败 | 200 | PKCE 校验失败 |  |
| 200989 | access_token 无效或已过期 | 200 | access_token 无效或已过期 |  |
| 200990 | 请求参数不合法 | 200 | 请求参数不合法 |  |
| 200991 | 不支持的 response_type | 200 | 不支持的 response_type |  |
| 200992 | refresh_token 无效或已过期 | 200 | refresh_token 无效或已过期 |  |
| 200993 | OIDC 签名密钥不可用 | 200 | OIDC 签名密钥不可用 |  |
| 200994 | 授权确认已过期或不合法，请重新发起授权 | 200 | 授权确认已过期或不合法，请重新发起授权 |  |

