# fbox-backend **Repository Path**: hhf002/fbox-backend ## Basic Information - **Project Name**: fbox-backend - **Description**: fbox后端管理 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-28 - **Last Updated**: 2026-07-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FBox Backend - 游戏盒子后台管理系统 ## 📋 项目概述 FBox 游戏盒子的后台管理系统,为 Android 端 FBox App 提供灵活的配置化管理接口。包含 **REST API** 和 **Web 管理后台**,所有 Tab 的数据均可通过后台配置灵活控制展示内容。 | 项目 | 说明 | |------|------| | 开发语言 | Java 17 | | 框架 | Spring Boot 3.2.5 + Thymeleaf | | ORM | MyBatis-Plus 3.5.7 | | 数据库 | MySQL 8.x (MariaDB) | | 构建工具 | Maven | | 管理页面 | Bootstrap 5 (暗色主题) | | 测试 | JUnit 5 + Mockito, **45 个单元测试全部通过** | --- ## 📐 系统架构 ```mermaid graph TB subgraph "Web 管理后台" A_Dashboard["📊 控制台"] A_Games["🎮 游戏管理"] A_ConfigHome["🏠 首页配置"] A_ConfigFeatured["✨ 特色Tab配置"] A_ConfigRepo["📁 仓库配置"] A_Recommends["⭐ 每日推荐"] A_Members["👤 会员管理"] A_Versions["📦 App版本管理"] end subgraph "后端 REST API" ConfigAPI["/api/config"] GameAPI["/api/games"] RecommendAPI["/api/recommends"] MemberAPI["/api/member"] AppVersionAPI["/api/app"] end subgraph "数据库 MySQL" DB_GAME["fbox_game"] DB_CONFIG["fbox_config"] DB_RECOMMEND["fbox_recommend"] DB_MEMBER["fbox_member"] DB_APPVERSION["fbox_app_version"] end A_Dashboard --> GameAPI A_Dashboard --> RecommendAPI A_Games --> GameAPI A_ConfigHome --> ConfigAPI A_ConfigFeatured --> ConfigAPI A_ConfigRepo --> ConfigAPI A_Recommends --> RecommendAPI A_Members --> MemberAPI A_Versions --> AppVersionAPI ConfigAPI --> DB_CONFIG GameAPI --> DB_GAME RecommendAPI --> DB_RECOMMEND MemberAPI --> DB_MEMBER AppVersionAPI --> DB_APPVERSION ``` --- ## 🖥️ 后台管理页面 管理后台通过浏览器访问,基于 Thymeleaf + Bootstrap 5 构建,深色主题白色高对比度字体。 **访问地址:** [http://localhost:8080/admin](http://localhost:8080/admin) ### 页面总览 | 页面 | 路由 | 功能 | |------|------|------| | 📊 **控制台** | `/admin` | 系统概览统计(游戏总数/平台数/推荐数)+ 快捷操作 + 最近游戏 | | 🎮 **游戏管理** | `/admin/games` | 游戏 CRUD:搜索筛选、新增、编辑、删除,支持分页;新增/编辑表单含**版本号**输入字段,web 平台上传时也可从 zip 内 `manifest.json` 自动读取 | | 🏠 **首页配置** | `/admin/config-home` | 配置「热门游戏」,支持**自动模式**(按下载量排序取前N个)和**手动模式**(手动选择游戏),带游戏选择器 + 实时预览 | | ✨ **特色Tab配置** | `/admin/config-featured` | 配置特色页今日可玩,带倒计时显示 + 实时预览 | | 📁 **游戏仓库配置** | `/admin/config-repository` | 配置平台Tab和类型Tab:排序、重命名、启用/禁用、新增/删除 | | ⭐ **每日推荐** | `/admin/recommends` | 自动/手动设置推荐,倒计时实时显示,推荐历史记录 | | 👤 **会员管理** | `/admin/members` | 会员信息查询,激活会员(日/月/年/永久卡) | | 📦 **App版本管理** | `/admin/versions` | 上传 APK、版本 CRUD、强制更新开关、启用/禁用版本 | ### 页面截图功能说明 **游戏选择器组件** — 所有配置页面通用: - 搜索游戏(按名称或Game ID) - 多选,上限限制(今日可玩3个,热门20个) - 已选标签展示,支持删除 - 确认后即时生效 **Tab编辑器** — 游戏仓库配置页面: - 每行独立编辑:排序值、显示名称、筛选值 - 开关控制启用/禁用 - 新增/删除 Tab - 一键保存全部 --- ## 🗄️ 数据库设计 ### 1. `fbox_game` - 游戏表 存储所有游戏数据,包含前端 Android App 所需的完整字段。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | BIGINT | 主键ID | | `game_id` | VARCHAR(64) | **游戏唯一标识**,如 `mg_snake`、`rom_fc_魂斗罗` | | `name` | VARCHAR(200) | 游戏名称 | | `platform` | VARCHAR(32) | 平台代码: `fc`, `gba`, `sfc`, `mg`, `arcade`, `md`, `web` | | `platform_label` | VARCHAR(32) | 平台显示名: `NES/FC`, `GBA`, `SNES`, `内置`, `H5游戏` | | `genre` | VARCHAR(32) | 类型代码: `动作`, `益智`, `RPG`, `射击`, `格斗`, `体育`, `策略` | | `genre_label` | VARCHAR(32) | 类型显示名 | | `cover` | VARCHAR(500) | 封面URL(详情页大图) | | `logo` | VARCHAR(500) | Logo图标URL(列表小图标,方形) | | `is_free` | TINYINT | 是否免费(0-收费, 1-免费) | | `file_size` | BIGINT | 文件大小(字节) | | `download_url` | VARCHAR(500) | 下载相对路径 | | `download_count` | BIGINT | 下载次数 | | `md5` | VARCHAR(64) | 文件 MD5 校验值 | | `version` | VARCHAR(32) | 游戏版本号(语义化 `x.y.z`,默认 `1.0.0`),用于 App 端检测更新 | | `sort_order` | INT | 排序序号 | ### 2. `fbox_config` - 配置表 ⭐ **核心表**,用于灵活配置所有 Tab 的展示数据。 | 字段 | 类型 | 说明 | |------|------|------| | `config_type` | VARCHAR(64) | **配置类型**,见下方枚举 | | `config_name` | VARCHAR(200) | 配置名称/标题 | | `game_ids` | TEXT | 关联的游戏ID列表(逗号分隔) | | `config_value` | TEXT | 配置值(JSON格式,如Banner配置) | | `sort_order` | INT | 排序序号 | | `enabled` | TINYINT | 是否启用(0-禁用, 1-启用) | **`config_type` 枚举说明:** | 类型 | 用途 | game_ids 含义 | 示例 | |------|------|---------------|------| | `HOME_TODAY` | 首页-今日可玩 | 展示3个游戏 | `mg_snake,rom_fc_魂斗罗,rom_fc_超级玛丽` | | `HOME_HOT` | 首页-热门游戏 | 热门游戏ID列表(20个) | 同 `HOME_TODAY` | | `FEATURED` | 特色tab-今日可玩 | 当前展示的游戏 | 同 `HOME_TODAY` | | `BANNER` | 首页Banner图 | 不使用,见config_value | `{"imageUrl":"...","linkType":"game","linkValue":"rom_fc_xxx"}` | | `REPOSITORY_TAB` | 游戏仓库-平台Tab | 不使用,见config_value | config_value填平台代码 | | `REPOSITORY_TYPE` | 游戏仓库-类型Tab | 不使用,见config_value | config_value填类型代码 | ### 3. `fbox_recommend` - 每日推荐表 | 字段 | 类型 | 说明 | |------|------|------| | `recommend_date` | DATE | 推荐日期(唯一约束) | | `game_ids` | TEXT | 推荐的游戏ID列表(逗号分隔) | | `batch_no` | VARCHAR(32) | 推荐批次号(`yyyyMMdd`) | ### 4. `fbox_member` - 会员表 | 字段 | 类型 | 说明 | |------|------|------| | `user_id` | BIGINT | 用户ID | | `member_type` | VARCHAR(32) | 会员类型: `day`/`month`/`year`/`permanent` | | `is_valid` | TINYINT | 是否有效 | | `is_permanent` | TINYINT | 是否永久 | | `expire_time` | DATETIME | 到期时间 | ### 5. `fbox_app_version` - App版本表 存储 App 客户端版本信息,用于自动更新检测。每次发布新版本时通过后台上传 APK,客户端启动时调用 `/api/app/check-update` 检查是否有新版本。 | 字段 | 类型 | 说明 | |------|------|------| | `id` | BIGINT | 主键ID | | `version_name` | VARCHAR(32) | 版本号(语义化 `x.y.z`),如 `1.0.1` | | `version_code` | INT | 版本数字码(单调递增),用于强比较,唯一约束 | | `download_url` | VARCHAR(500) | APK下载相对路径,如 `/apps/fbox-1.0.1.apk` | | `file_size` | BIGINT | 文件大小(字节) | | `file_size_label` | VARCHAR(32) | 格式化文件大小,如 `15.2 MB` | | `md5` | VARCHAR(64) | MD5校验值 | | `release_notes` | TEXT | 更新说明(多行文本) | | `force_update` | TINYINT(1) | 是否强制更新(0-否, 1-是) | | `enabled` | TINYINT(1) | 是否启用(0-禁用, 1-启用),仅启用版本才会被客户端检测到 | | `sort_order` | INT | 排序序号 | | `deleted` | TINYINT(1) | 逻辑删除 | | `create_time` | DATETIME | 创建时间 | | `update_time` | DATETIME | 更新时间 | --- ## 🔌 API 接口文档 ### 1. 游戏接口 `/api/games` ``` GET /api/games # 游戏列表(分页+搜索+筛选) GET /api/games/hot # 热门游戏(按下载量排序) GET /api/games/{id} # 游戏详情(按主键) GET /api/games/gameId/{gameId} # 游戏详情(按gameId) POST /api/games # 新增游戏 POST /api/games/upload # 上传游戏包(含封面,支持 fc/gba/sfc/md/web 全平台) POST /api/games/gameId/{gameId}/download # 上报下载事件(递增下载次数) PUT /api/games/{id} # 更新游戏 DELETE /api/games/{id} # 删除游戏(逻辑删除) ``` **上传接口说明** `POST /api/games/upload`(multipart/form-data) | 参数 | 必填 | 说明 | |------|:----:|------| | `gameId` | ✅ | 游戏唯一标识(同 gameId 上传会覆盖更新) | | `name` | ✅ | 游戏名称 | | `platform` | ✅ | 平台代码:`fc`/`gba`/`sfc`/`md`/`web` | | `file` | ✅ | 游戏包文件(ROM 或 H5 zip) | | `cover` | ❌ | 封面图片(详情页大图) | | `logo` | ❌ | Logo图标(列表方形小图) | | `version` | ❌ | 游戏版本号(语义化 `x.y.z`)。`platform=web` 时若不传,自动从 zip 内 `manifest.json` 的 `version` 字段读取 | 存储约定: - 游戏包:`cdn/games///.` - 封面图:`cdn/games///cover.` - Logo图:`cdn/games///logo.` - `download_url`、`cover`、`logo` 字段由系统自动生成相对路径(`/games/...`),通过 CDN 静态映射(`/cdn/**`)访问。管理后台预览时需拼接 `/cdn` 前缀(由前端 `resolveCdnUrl()` 处理) **下载量统计接口** `POST /api/games/gameId/{gameId}/download` App 端每次下载完成后调用此接口,后端通过 SQL 原子自增 `download_count = download_count + 1`(避免读-改-写并发问题),用于: - 游戏管理列表 `/admin/games` 的「下载量」列展示 - 热门游戏接口 `GET /api/games/hot` 的排序依据(按 `download_count` 降序) - 游戏详情页「已下载: X 次」展示 > 接口为幂等 +1 设计(每次调用 +1),fire-and-forget,App 端上报失败不影响本地下载流程。 ### 2. 配置接口 `/api/config` ⭐ **核心业务接口** ``` GET /api/config/home # 首页配置(热门游戏+Banner) GET /api/config/featured # 特色Tab配置(今日可玩+倒计时) GET /api/config/repository # 游戏仓库Tab配置(平台+类型筛选) GET /api/config/all # 所有配置列表 GET /api/config/type/{type} # 按类型查询配置 POST /api/config # 新增配置 PUT /api/config/{id} # 更新配置 DELETE /api/config/{id} # 删除配置 ``` ### 3. 推荐接口 `/api/recommends` ``` GET /api/recommends/today # 今日推荐游戏 GET /api/recommends/countdown # 推荐刷新倒计时 GET /api/recommends/admin/all # 所有推荐记录 POST /api/recommends/admin/set # 手动设置推荐 POST /api/recommends/admin/generate # 自动生成今日推荐 ``` ### 4. 会员接口 `/api/member` ``` GET /api/member/info?userId=1 # 获取会员信息 POST /api/member/activate?userId=1&memberType=month # 激活会员 ``` ### 5. App版本接口 `/api/app` 客户端自动更新 + 后台版本管理。 ``` # 客户端 GET /api/app/check-update?versionCode=1 # 检查更新(返回最新启用版本或null) # 后台 CRUD GET /api/app # 版本列表(按versionCode倒序) GET /api/app/{id} # 版本详情 POST /api/app # 新增版本元信息 PUT /api/app/{id} # 更新版本元信息 DELETE /api/app/{id} # 删除版本(逻辑删除) # 后台上传 APK(一步完成文件+元信息) POST /api/app/upload # 上传 APK 并自动创建/更新版本记录 ``` **检查更新接口** `GET /api/app/check-update?versionCode={clientVersionCode}` 返回最新启用版本(按 `version_code` 倒序取第一条)。若客户端 `versionCode` ≥ 最新 `versionCode`,返回 `data: null` 表示已是最新。 **APK 上传接口** `POST /api/app/upload`(multipart/form-data) | 参数 | 必填 | 说明 | |------|:----:|------| | `file` | ✅ | APK 文件(仅 `.apk`) | | `versionName` | ✅ | 版本号(语义化 `x.y.z`),如 `1.0.1` | | `versionCode` | ✅ | 版本数字码(单调递增),如 `2` | | `releaseNotes` | ❌ | 更新说明(多行文本) | | `forceUpdate` | ❌ | 是否强制更新(默认 `false`) | | `enabled` | ❌ | 是否启用(默认 `true`) | 存储约定: - APK 文件:`cdn/apps/fbox-.apk`(同 versionCode 上传会覆盖) - 自动计算 MD5 和文件大小 - 同 `versionCode` 已存在则更新,否则新增 - `download_url` 为相对路径,客户端拼接 baseUrl 后下载 --- ## 🚀 快速开始 ### 环境要求 - JDK 17+ - Maven 3.8+ - MySQL 8.0+ / MariaDB 10.5+ ### 1. 初始化数据库 ```bash mysql -uroot -p < src/main/resources/db/init.sql ``` ### 2. 修改数据库配置 编辑 `src/main/resources/application.yml`: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/fbox?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: your_password ``` ### 3. 启动项目 ```bash # 方式一:Maven 直接启动 mvn spring-boot:run # 方式二:打包后启动 mvn clean package -DskipTests java -jar target/fbox-backend-1.0.0.jar ``` ### 4. 验证 ```bash # API 验证 curl http://localhost:8080/api/config/home # 浏览器访问管理后台 open http://localhost:8080/admin ``` ### 5. 运行测试 ```bash mvn test # 结果: Tests run: 45, Failures: 0, Errors: 0 ``` --- ## 📂 项目结构 ``` fbox-backend/ ├── pom.xml ├── README.md ├── src/ │ ├── main/ │ │ ├── java/com/fbox/backend/ │ │ │ ├── FboxBackendApplication.java # 启动类 │ │ │ ├── common/ │ │ │ │ ├── Result.java # 统一响应 {code, message, data, total} │ │ │ │ └── PageParam.java # 分页参数 │ │ │ ├── config/ │ │ │ │ ├── MybatisPlusConfig.java # MyBatis-Plus 分页插件 │ │ │ │ ├── MyMetaObjectHandler.java # 自动填充 createTime/updateTime │ │ │ │ └── WebMvcConfig.java # 静态资源映射 │ │ │ ├── entity/ │ │ │ │ ├── Game.java # 游戏实体 │ │ │ │ ├── Config.java # ⭐配置实体(核心) │ │ │ │ ├── Recommend.java # 推荐实体 │ │ │ │ ├── Member.java # 会员实体 │ │ │ │ └── AppVersion.java # App版本实体 │ │ │ ├── dto/ # 6个DTO │ │ │ ├── mapper/ # 5个Mapper(含物理删除) │ │ │ ├── service/ & impl/ # 5个Service │ │ │ └── controller/ │ │ │ ├── AdminController.java # 🆕 管理后台页面路由 │ │ │ ├── GameController.java # 游戏接口 │ │ │ ├── ConfigController.java # ⭐配置接口(核心) │ │ │ ├── RecommendController.java # 推荐接口 │ │ │ ├── MemberController.java # 会员接口 │ │ │ └── AppVersionController.java # App版本接口(检查更新/上传APK/CRUD) │ │ └── resources/ │ │ ├── application.yml # 应用配置 │ │ ├── static/admin/ │ │ │ ├── style.css # 🆕 管理后台样式 │ │ │ └── script.js # 🆕 管理后台公共脚本 │ │ ├── templates/admin/ │ │ │ ├── layout.html # 🆕 布局模板 │ │ │ ├── dashboard.html # 🆕 控制台 │ │ │ ├── games.html # 🆕 游戏管理 │ │ │ ├── config-home.html # 🆕 首页配置 │ │ │ ├── config-featured.html # 🆕 特色Tab配置 │ │ │ ├── config-repository.html # 🆕 游戏仓库配置 │ │ │ ├── recommends.html # 🆕 每日推荐 │ │ │ ├── members.html # 🆕 会员管理 │ │ │ └── versions.html # 🆕 App版本管理 │ │ └── db/ │ │ └── init.sql # 数据库建表+25条示例数据 │ └── test/java/com/fbox/backend/ │ ├── FboxBackendApplicationTests.java # 基础数据完整性测试 │ └── service/ │ ├── GameServiceTest.java # 16个游戏测试 │ ├── ConfigServiceTest.java # 13个配置测试 │ ├── RecommendServiceTest.java # 7个推荐测试 │ └── MemberServiceTest.java # 10个会员测试 ``` --- ## 💡 配置使用说明 ### 场景一:首页展示由后台完全控制 通过 `fbox_config` 表配置,无需改代码: | 配置类型 | 说明 | 管理页面 | |---------|------|---------| | `HOME_TODAY` | 首页今日可玩(3个) | `/admin/config-home` | | `HOME_HOT` | 首页热门游戏(20个) | `/admin/config-home` | | `FEATURED` | 特色Tab今日可玩 | `/admin/config-featured` | | `REPOSITORY_TAB` | 游戏仓库平台筛选Tab | `/admin/config-repository` | | `REPOSITORY_TYPE` | 游戏仓库类型筛选Tab | `/admin/config-repository` | **回退逻辑:** 如果没有对应配置,系统自动使用默认行为(热门按下载量排序、推荐按日期种子随机)。 **热门游戏双模式(`HOME_HOT` 配置):** `config_value` 字段存储模式 JSON: | 模式 | config_value | 说明 | game_ids 字段 | |------|-------------|------|--------------| | 自动模式 | `{"mode":"auto","count":20}` | 按下载量从大到小自动取前 N 个游戏 | 不使用 | | 手动模式 | `{"mode":"manual"}` | 使用手动选择的游戏列表 | 游戏ID列表 | | 向后兼容 | null 或无 mode 字段 | 有 game_ids 视为手动,无则视为自动 | 视情况 | 管理页面 `/admin/config-home` 提供模式切换单选框 + 自动模式数量输入框,保存时自动写入 `config_value`。 ### 场景二:非免费游戏让用户试玩 将游戏ID配置到 `HOME_TODAY` 或 `FEATURED` 中,这些游戏在当天会成为"今日可玩",前端 App 允许非会员用户免费游玩。 ### 场景三:新游戏上架 在 `/admin/games` 页面新增游戏,填写 Game ID、名称、平台、类型、下载路径等信息,保存后即刻在 App 中可见。 ### 场景四:游戏版本更新(H5/ROM) | 步骤 | 操作 | |------|------| | 1. 准备新版本包 | H5 游戏先在 zip 内 `manifest.json` 中 bump `version` 字段(如 `1.0.0` → `1.1.0`),再重新打包 | | 2. 上传覆盖 | 在 `/admin/games` 通过「新增游戏」表单用**相同 gameId** 上传新包;`version` 可手动填写,web 平台留空会自动从 `manifest.json` 读取 | | 3. 自动生效 | 后端覆盖 `fbox_game.version`、`download_url`、`md5`、`file_size` 等字段;App 下次拉取详情时通过 `version` 字段判断是否有新版本并提示更新 | > 版本号采用语义化版本 `x.y.z`,App 端 `VersionUtil` 按数值逐段比较(`1.10.0` > `1.9.0`),与字符串字典序不同。 ### 场景五:App 客户端自动更新 通过 `fbox_app_version` 表 + `/api/app` 接口实现 App 客户端的整包自动更新,支持强制/可选双策略。 **发布新版本流程:** | 步骤 | 操作 | |------|------| | 1. 升级 App 版本号 | 在 `fbox/app/build.gradle` 中 bump `versionCode`(+1)和 `versionName`(如 `1.0.0` → `1.0.1`) | | 2. 打包 APK | `gradlew assembleDebug` 或 `assembleRelease` | | 3. 后台上传 | 浏览器打开 `/admin/versions` → 点击「上传新版本」→ 填写版本号/更新说明/是否强制 → 选择 APK 文件 → 保存 | | 4. 自动检测 | App 下次启动时自动调用 `/api/app/check-update` 检测到新版本,弹出更新对话框 | **更新策略说明:** | 策略 | 行为 | |------|------| | **可选更新**(`forceUpdate=false`) | 用户可点击「稍后再说」跳过本次,下次启动再提示;也可前往应用市场更新 | | **强制更新**(`forceUpdate=true`) | 对话框无法关闭,返回键无效,用户必须更新才能继续使用 | **客户端检查时机:** | 时机 | 触发方 | 失败处理 | |------|--------|---------| | App 启动 | `SplashActivity` 启动时自动检查 | 静默失败,不提示用户 | | 手动检查 | 「我的」→「检查更新」 | 显示错误信息 | | 应用市场 | 「我的」→「检查更新」→ 对话框「前往应用市场」 | 跳转设备已安装的应用市场(市场不存在时提示) | **APK 存储约定:** - 存储路径:`cdn/apps/fbox-.apk` - 访问路径:通过 `/cdn/**` 静态映射 + 客户端拼接 baseUrl - 同 `versionCode` 重复上传会覆盖原 APK 文件 - 上传时自动计算 MD5 和文件大小,客户端下载后校验 MD5 **权限说明:** - 客户端需声明 `REQUEST_INSTALL_PACKAGES` 权限才能安装 APK - 首次安装时 Android 系统会弹窗询问「是否允许安装未知应用」,需用户授权 - 通过 `FileProvider` 安全共享 APK 文件给系统安装器 --- ## ✅ 测试覆盖 ``` Tests run: 45, Failures: 0, Errors: 0, Skipped: 0 BUILD SUCCESS ``` | 测试类 | 测试数 | 覆盖内容 | |--------|:------:|---------| | `FboxBackendApplicationTests` | 3 | 上下文加载、数据库连接、数据完整性 | | `GameServiceTest` | 16 | 分页/搜索/筛选、批量查询、热门排序、CRUD、推荐 | | `ConfigServiceTest` | 9 | 首页/特色/仓库配置、启用/禁用、排序、CRUD(已移除 HOME_TODAY 相关测试) | | `RecommendServiceTest` | 7 | 今日推荐、按日期查询、手动设置/覆盖、自动生成 | | `MemberServiceTest` | 10 | 会员查询、日/月/年/永久卡激活、多用户隔离、异常处理 | --- ## ✅ 与前端 App 的接口对应关系 | 前端页面 | 前端代码 | 后端接口 | |---------|---------|---------| | 首页-热门游戏 | `HomeFragment` | `GET /api/config/home` → `hotGames`(支持自动/手动模式) | | 特色-今日可玩+倒计时 | `RecommendFragment` | `GET /api/config/featured` | | 游戏仓库-搜索+筛选 | `HallFragment` | `GET /api/games` | | 游戏仓库-Tab配置 | `HallFragment` | `GET /api/config/repository` | | 游戏详情 | `GameDetailActivity` | `GET /api/games/{id}` | | 每日推荐 | `RecommendManager` | `GET /api/recommends/today` | | 推荐倒计时 | `RecommendFragment` | `GET /api/recommends/countdown` | | 会员信息 | `MemberActivity` | `GET /api/member/info` | | App 自动更新(启动检查) | `SplashActivity` | `GET /api/app/check-update` | | App 自动更新(手动检查) | `MineFragment` | `GET /api/app/check-update` | | App 下载更新包 | `AppUpdateManager` | `GET /api/app/{downloadUrl}` (静态资源) |