Skip to content

Mock API 层

31个RESTful接口,按模块分类 | 文件位于 web/src/mock/


架构概览

mock/
├── index.ts              ← 入口文件(注册所有 Mock 拦截)
├── data/
│   └── index.ts          ← 共享数据(JSON导入 + 用户状态管理 + 游戏进度)
└── modules/
    ├── user/
    │   ├── profile.ts    ← 用户信息
    │   ├── exp-points.ts ← 经验值/积分
    │   └── badges.ts     ← 徽章管理
    ├── character/
    │   └── list.ts       ← 汉字列表/分类
    ├── game/
    │   ├── config.ts     ← 游戏配置
    │   ├── progress.ts   ← 游戏进度
    │   └── powerups.ts   ← 道具管理
    ├── achievement/
    │   ├── level.ts      ← 段位信息
    │   └── badges.ts     ← 徽章定义
    ├── shop/
    │   ├── rewards.ts    ← 奖励管理
    │   ├── redeem.ts     ← 兑换操作
    │   └── password.ts   ← 密码管理
    └── planet/
        └── list.ts       ← 星球列表

入口文件 (mock/index.ts)

文件: web/src/mock/index.ts

职责

  • 导入所有 Mock 模块以注册 mockjs 拦截
  • 设置全局 Mock 配置(200-400ms 网络延迟)
  • 自动持久化:页面关闭时保存 + 每10秒自动保存

启动条件

typescript
// main.ts
// Mock 在所有环境(开发/生产)无条件加载,确保无后端时数据正常
await import("./mock");

注册的模块

typescript
// 用户模块
import "./modules/user/profile";
import "./modules/user/exp-points";
import "./modules/user/badges";

// 汉字模块
import "./modules/character/list";

// 游戏模块
import "./modules/game/config";
import "./modules/game/progress";
import "./modules/game/powerups";

// 成就模块
import "./modules/achievement/level";
import "./modules/achievement/badges";

// 商店模块
import "./modules/shop/rewards";
import "./modules/shop/redeem";
import "./modules/shop/password";

// 星球模块
import "./modules/planet/list";

统一响应格式

typescript
interface ApiResponse<T> {
  code: number    // 0 = 成功, 非0 = 失败
  msg: string     // 提示信息
  data: T         // 响应数据
}

interface PaginatedData<T> {
  list: T[]       // 数据列表
  total: number   // 总数
  page: number    // 当前页
  pageSize: number // 每页条数
}

核心函数

函数说明
success(data, msg)成功响应 { code: 0, msg: "ok", data }
fail(msg, code)失败响应 { code: 400, msg, data: null }
genId(prefix)生成唯一 ID
parseUrlParams(url, pattern)从 URL 提取路径参数
parsePagination(searchParams)解析分页参数(pageSize 上限 1000)
paginate(list, page, pageSize)分页包装

共享数据 (mock/data/index.ts)

文件: web/src/mock/data/index.ts

职责

  • 从本地 JSON 导入数据(汉字、分类、游戏、星球)
  • 管理用户状态(MockUser)
  • 管理游戏进度(gameProgressMap + powerUpMap)
  • localStorage 持久化(tzxq_mock_db key)

数据来源

typescript
import characterData from "@/data/character.json";   // 500 汉字
import categoriesData from "@/data/categories.json";   // 6 分类
import gamesData from "@/data/games.json";             // 3 游戏
import planetsData from "@/data/planets.json";         // 6 星球

用户状态管理

函数说明
getCurrentUser()获取/初始化当前用户
loadMockDb()从 localStorage 恢复数据
saveMockDb()保存数据到 localStorage

接口清单

用户模块 (3个文件,8个接口)

方法路径说明文档
GET/api/v1/users/me获取当前用户信息profile
PUT/api/v1/users/me更新用户信息profile
GET/api/v1/users/me/exp获取经验值exp-points
POST/api/v1/users/me/exp增加经验值exp-points
GET/api/v1/users/me/points获取积分exp-points
POST/api/v1/users/me/points增加积分exp-points
GET/api/v1/users/me/badges获取我的徽章列表badges
POST/api/v1/users/me/badges/:badgeId解锁徽章badges

汉字模块 (1个文件,4个接口)

方法路径说明文档
GET/api/v1/characters获取汉字列表(分页+筛选)list
GET/api/v1/characters/:char获取单个汉字详情list
GET/api/v1/characters/categories获取分类列表list
GET/api/v1/characters/categories/:id/chars获取分类下的汉字list

游戏模块 (3个文件,7个接口)

方法路径说明文档
GET/api/v1/games获取游戏配置列表config
GET/api/v1/games/:id获取单个游戏配置config
GET/api/v1/games/data获取游戏进度数据config
PUT/api/v1/games/data同步游戏进度config
POST/api/v1/games/:gameId/levels/:levelId/result提交关卡结果progress
POST/api/v1/games/:gameId/power-ups/:type/use使用道具powerups
POST/api/v1/games/:gameId/power-ups/:type/add添加道具powerups

成就模块 (2个文件,2个接口)

方法路径说明文档
GET/api/v1/achievements/levels获取段位体系level
GET/api/v1/achievements/badges获取徽章定义badges

商店模块 (3个文件,9个接口)

方法路径说明文档
GET/api/v1/shop/rewards获取奖励列表rewards
POST/api/v1/shop/rewards创建自定义奖励rewards
PUT/api/v1/shop/rewards/:id更新奖励rewards
DELETE/api/v1/shop/rewards/:id删除奖励rewards
PUT/api/v1/shop/rewards/:id/toggle启用/禁用奖励rewards
POST/api/v1/shop/rewards/:rewardId/redeem兑换奖励redeem
GET/api/v1/shop/history获取兑换历史redeem
POST/api/v1/shop/password/verify验证密码password
PUT/api/v1/shop/password设置密码password

星球模块 (1个文件,1个接口)

方法路径说明文档
GET/api/v1/planets获取星球列表list

数据流

main.ts (DEV环境)
  ↓ await import("./mock")
mock/index.ts
  ↓ 导入所有模块
Mock.js 拦截 axios 请求
  ↓ 匹配 URL + Method
模块处理函数
  ↓ 读写 mock/data/index.ts
localStorage (tzxq_mock_db)

Pinia Store → api-service → Mock API

  ├─ UserStore        → /users/me, /users/me/exp, /users/me/points, /users/me/badges
  ├─ CharacterStore   → /characters, /characters/categories, /planets
  ├─ GameStore        → /games, /games/data, /games/:id/levels/:id/result, /games/:id/power-ups
  ├─ AchievementStore → /achievements/levels, /achievements/badges
  └─ ShopStore        → /shop/rewards, /shop/history, /shop/password

设计原则

  1. RESTful 风格: 资源路径 + HTTP 方法
  2. 统一响应格式: { code, msg, data }
  3. 模块化: 每个功能独立文件,按模块分类
  4. 数据持久化: localStorage 自动保存,页面关闭/定时保存
  5. 模拟延迟: 200-400ms 网络延迟,模拟真实 API 体验
  6. 条件加载: 仅 DEV 环境启用,生产构建不包含 Mock 代码