Skip to content

积分规则

积分概述

  • 积分名称:shopPoints
  • 存储位置:userData.shopPoints(通过 Mock API 持久化到 localStorage)
  • 发放函数:user.addPoints(amount, source, sourceId, desc)(user.ts)
  • 扣除函数:shop.redeemReward(rewardId)(shop.ts,通过 Mock API 处理)
  • 日志系统:userData.pointLog[] 记录所有积分变动

积分获取途径

1. 书写练习

场景积分来源标识说明
基础书写+1write_complete每次完成书写
满分奖励+1write_completescore === 100
首次学会+1first_learnscore ≥ 60 且首次进入 learned[]

单次书写最大:+3 积分

2. 认读练习

认读不产生积分(points = 0),仅产生 EXP。

3. 复习系统

场景积分来源标识说明
复习单字全流程+1review_char去重,同字同会话只计一次
每日复习100%+5daily_review每天只奖励一次
每日复习80%++3daily_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星
11881216
2110101520
3212121824
4215152230
5318213243
6322263952
7426395878
8430456790
95356394126
1054072108144

拼图闯关 (stroke_puzzle) 积分

关卡难度基础积分1星2星3星
11881216
2110101520
3212121824
4215152230
5318213243
6322263952
7426395878
8430456790
95356394126
1054072108144

汉字消消乐 (char_match3) 积分

关卡难度基础积分1星2星3星
11881216
2110101520
3212121824
4215152230
5318213243
6322263952
7426395878
8430456790
95356394126
1054072108144

失败(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):

  1. shop.ts 调用 api.post("/shop/rewards/${rewardId}/redeem")
  2. Mock API 查找 reward、验证 enabled、检查积分是否足够
  3. Mock API 扣除积分、写入积分日志、记录兑换历史(保留最新 50 条)
  4. 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每成就一次
商店兑换自定义可自定义奖励项