积分规则
积分概述
- 积分名称:shopPoints
- 存储位置:
userData.shopPoints(通过 Mock API 持久化到 localStorage) - 发放函数:
user.addPoints(amount, source, sourceId, desc)(user.ts) - 扣除函数:
shop.redeemReward(rewardId)(shop.ts,通过 Mock API 处理) - 日志系统:
userData.pointLog[]记录所有积分变动
积分获取途径
1. 书写练习
| 场景 | 积分 | 来源标识 | 说明 |
|---|---|---|---|
| 基础书写 | +1 | write_complete | 每次完成书写 |
| 满分奖励 | +1 | write_complete | score === 100 |
| 首次学会 | +1 | first_learn | score ≥ 60 且首次进入 learned[] |
单次书写最大:+3 积分
2. 认读练习
认读不产生积分(points = 0),仅产生 EXP。
3. 复习系统
| 场景 | 积分 | 来源标识 | 说明 |
|---|---|---|---|
| 复习单字全流程 | +1 | review_char | 去重,同字同会话只计一次 |
| 每日复习100% | +5 | daily_review | 每天只奖励一次 |
| 每日复习80%+ | +3 | daily_review | 每天只奖励一次 |
4. 游戏系统
核心函数:awardGameReward()
奖励公式:starReward.coins = baseCoins × starMultiplier × diffMultiplier
星级倍率:1星=1.0x, 2星=1.5x, 3星=2.0x 难度倍率:1=1.0x, 2=1.0x, 3=1.2x, 4=1.5x, 5=1.8x, 6=2.0x
象形配对 (pictograph_match) 积分
| 关卡 | 难度 | 基础积分 | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|
| 1 | 1 | 8 | 8 | 12 | 16 |
| 2 | 1 | 10 | 10 | 15 | 20 |
| 3 | 2 | 12 | 12 | 18 | 24 |
| 4 | 2 | 15 | 15 | 22 | 30 |
| 5 | 3 | 18 | 21 | 32 | 43 |
| 6 | 3 | 22 | 26 | 39 | 52 |
| 7 | 4 | 26 | 39 | 58 | 78 |
| 8 | 4 | 30 | 45 | 67 | 90 |
| 9 | 5 | 35 | 63 | 94 | 126 |
| 10 | 5 | 40 | 72 | 108 | 144 |
拼图闯关 (stroke_puzzle) 积分
| 关卡 | 难度 | 基础积分 | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|
| 1 | 1 | 8 | 8 | 12 | 16 |
| 2 | 1 | 10 | 10 | 15 | 20 |
| 3 | 2 | 12 | 12 | 18 | 24 |
| 4 | 2 | 15 | 15 | 22 | 30 |
| 5 | 3 | 18 | 21 | 32 | 43 |
| 6 | 3 | 22 | 26 | 39 | 52 |
| 7 | 4 | 26 | 39 | 58 | 78 |
| 8 | 4 | 30 | 45 | 67 | 90 |
| 9 | 5 | 35 | 63 | 94 | 126 |
| 10 | 5 | 40 | 72 | 108 | 144 |
汉字消消乐 (char_match3) 积分
| 关卡 | 难度 | 基础积分 | 1星 | 2星 | 3星 |
|---|---|---|---|---|---|
| 1 | 1 | 8 | 8 | 12 | 16 |
| 2 | 1 | 10 | 10 | 15 | 20 |
| 3 | 2 | 12 | 12 | 18 | 24 |
| 4 | 2 | 15 | 15 | 22 | 30 |
| 5 | 3 | 18 | 21 | 32 | 43 |
| 6 | 3 | 22 | 26 | 39 | 52 |
| 7 | 4 | 26 | 39 | 58 | 78 |
| 8 | 4 | 30 | 45 | 67 | 90 |
| 9 | 5 | 35 | 63 | 94 | 126 |
| 10 | 5 | 40 | 72 | 108 | 144 |
失败(stars ≤ 0)不发放积分。
5. 徽章解锁
每枚徽章解锁:+5 积分(自动发放,来源标识 badge_unlock)
6. 游戏成就积分
| 游戏 | 成就 | 积分 |
|---|---|---|
| 象形配对 | 配对新手 | 5 |
| 象形配对 | 配对达人 | 25 |
| 象形配对 | 配对大师 | 50 |
| 象形配对 | 连击王 | 40 |
| 拼图闯关 | 拼图新手 | 5 |
| 拼图闯关 | 拼图达人 | 25 |
| 拼图闯关 | 拼图大师 | 50 |
| 拼图闯关 | 完美书写 | 40 |
| 汉字消消乐 | 消除新手 | 5 |
| 汉字消消乐 | 消除达人 | 25 |
| 汉字消消乐 | 消除大师 | 50 |
| 汉字消消乐 | 连击大师 | 40 |
| 汉字消消乐 | 坚持就是胜利 | 100 |
| 全局 | 游戏爱好者 | 50 |
| 全局 | 三冠王 | 200 |
积分消耗
积分商店兑换(扣除积分)
核心函数:shop.redeemReward(rewardId)(shop.ts)
兑换流程(shop.ts → Mock API shop/redeem.ts):
- shop.ts 调用
api.post("/shop/rewards/${rewardId}/redeem") - Mock API 查找 reward、验证 enabled、检查积分是否足够
- Mock API 扣除积分、写入积分日志、记录兑换历史(保留最新 50 条)
- shop.ts 重新加载数据:
load()+user.load()
返回值:成功返回 true,失败返回 false。
自定义奖励项(家长管理)
家长可在商店管理页面(/shop-manage)自定义扣除积分的奖励项目,通过密码保护。
奖励项数据结构(shop.ts reward 接口):
json
{
"id": "r_1712345678901",
"name": "看30分钟动画片",
"cost": 10,
"icon": "tv",
"enabled": true,
"createdAt": "2026-07-13"
}管理接口(shop.ts 通过 Mock API 操作,需密码验证后使用):
| 方法 | 功能 | 参数 |
|---|---|---|
addReward(data) | 新增奖励项 | { name, cost, icon } — cost 为自定义扣除积分 |
updateReward(id, data) | 编辑奖励项 | { name, cost, icon } — 可修改任意字段 |
toggleReward(id) | 启用/禁用奖励项 | 切换 enabled 状态 |
deleteReward(id) | 删除奖励项 | 永久移除 |
预设图标(10种)
| 图标值 | 中文标签 |
|---|---|
star | 星星 |
gift | 礼物 |
gamepad | 游戏 |
book | 书本 |
candy | 糖果 |
bike | 骑行 |
phone | 电话 |
park | 公园 |
tv | 电视 |
toy | 玩具 |
图标通过 getIconSvg(iconValue) 查找 /src/assets/shop-icons/{icon}.svg,未匹配到则回退到 star 图标。
积分日志系统
每条日志格式:
json
{
"id": "pt_{timestamp}_{random}",
"type": "earn" | "spend",
"amount": 1,
"balance": 100,
"source": "write_complete",
"sourceId": "字",
"desc": "完成「字」书写",
"time": "2026-07-13T10:00:00.000Z"
}来源类型:
- earn: write_complete, first_learn, review_char, daily_review, game_reward, badge_unlock
- spend: shop
积分密码保护
- 密码通过 Mock API 管理(shop/password.ts),明文存储和比对
- 5 次错误尝试后锁定 30 分钟
- shopLockUntil / shopAttempts 控制锁定状态
- 密码验证使用
shop.verifyPassword(input)异步方法 - 密码设置使用
shop.setPassword(newPwd, oldPwd)异步方法,修改密码需要旧密码验证,新密码至少 4 位
积分总结
| 场景 | 单次积分 | 上限 |
|---|---|---|
| 基础书写 | 1 | 无上限 |
| 书写满分 | +1 | 每次 |
| 首次学会 | +1 | 每字仅一次 |
| 认读 | 0 | — |
| 复习单字 | 1 | 每字每日一次 |
| 每日复习全完成 | 5 | 每日一次 |
| 每日复习80%+ | 3 | 每日一次 |
| 游戏关卡 | 8-144 | 每关一次(差额制) |
| 徽章解锁 | 5 | 每枚一次 |
| 游戏成就 | 5-200 | 每成就一次 |
| 商店兑换 | 自定义 | 可自定义奖励项 |