# 第二轮 10 个 uniapp 小程序 · 规格与状态（内部工作文件，11-20 号）

沿用 miniapps 产线：scaffold.sh（已含 vite.config.js）+ 共享 node_modules 软链 + utils/ad.js 变现层。
规范：Vue3 `<script setup>`；store=reactive+watch+setStorageSync 防抖持久化；纯逻辑 `src/utils/logic.mjs` 用 ESM export（严禁 module.exports）；日期/随机由参数注入保证可测；每项目 node 测试 ≥5 组；build:h5 + build:mp-weixin 双端全绿；README 含盈利模式/验证记录/已知限制。
每条命令前 `export PATH=/home/muqing/.nvm/versions/node/v22.22.1/bin:$PATH`。
变现统一：免费限额/锁功能 + unlockByAd()（微信激励视频，H5 演示模式直接成功）+ README 写虚拟支付定价建议。

## 状态表
| # | 目录 | 名称 | 状态 |
|---|------|------|------|
| 11 | 11-party-splitter | 聚会分账 | ✅ |
| 12 | 12-mortgage-calc | 房贷计算器 | ✅ |
| 13 | 13-tax-calc | 个税计算器 | ✅ |
| 14 | 14-compound-grow | 复利定投 | ✅ |
| 15 | 15-sleep-cycle | 睡眠周期 | ✅ |
| 16 | 16-unit-convert | 单位换算 | ✅ |
| 17 | 17-date-calc | 日期计算器 | ✅ |
| 18 | 18-memory-game | 记忆翻牌 | ✅ |
| 19 | 19-game-24 | 24点挑战 | ✅ |
| 20 | 20-expiring-items | 囤货保质期 | ✅ |

## 规格

### 11 party-splitter 聚会分账
2页：活动列表+新建 / 活动详情（成员管理、记一笔[付款人/金额/参与人均摊]、结算结果）。
logic.mjs：addExpense(balances,payer,amount,participants)→余额更新（金额分摊余数给前几人，总额精确守恒）；settle(balances)→贪心最少转账列表（最大应收对最大应付）；tests：总额守恒、余数处理（100/3）、settle 次数≤n-1 且清零校验。变现：免费每活动限 4 人 10 笔，解锁无限+导出结算文本。

### 12 mortgage-calc 房贷计算器
2页：计算页（金额/年限/利率/等额本息|等额本金）+ 方案对比与还款明细（解锁）。
logic.mjs：annuityMonthly(P, annualRate, years)（M=P·i(1+i)^n/((1+i)^n−1)），totalInterest；straightMonthly(P,annualRate,years,month)→当月供（P/n+剩余·i）；tests：100万/30年/4.9% 月供≈5307.27 断言、等额本金首月 6861.11、末月递减、总利息比较。变现：解锁双方案对比+完整还款表导出。

### 13 tax-calc 个税计算器
2页：年度个税计算（年收入/五险一金/专项附加）+ 年终奖对比（解锁）。
logic.mjs：annualTax(taxable)（7 档税率表+速算扣除：3%/10%/20%/25%/30%/35%/45%，0/2520/16920/31920/52920/85920/181920）；bonusTax(bonus)（bonus/12 找档，全额×税率−速算）；tests：月薪 2 万年 24 万减 6 万减社保 3 万 → 应税 15 万 → 税 12480；bonus 36000→36000×3%=1080；36001→36001×10%−210=3390.1（临界跳档断言）。变现：解锁年终奖「并入 vs 单独」对比+明细导出。

### 14 compound-grow 复利定投
2页：复利/定投计算 + 目标倒推（解锁）。
logic.mjs：compoundFV(P,annualRate,years)→P(1+r)^n；savingsFV(monthly,annualRate,months)→普通年金 monthly·((1+i)^n−1)/i（i=年率/12）；monthlyFor(target,annualRate,months)→目标倒推月投；tests：10000@10%10年=25937.42、每月1000@12%12月=12682.50、倒推反算一致。变现：解锁目标倒推+多方案对比。

### 15 sleep-cycle 睡眠周期
2页：起床倒推（输入起床时刻→3-6 周期入睡时刻列表）/ 入睡正推（解锁）。
logic.mjs：hmToMin/hm(min)→'HH:MM' 跨日取模；wakeOptions(wakeMin, latency=15, cycle=90)→[6,5,4]周期的入睡时刻；sleepOptions(asleepMin,...)→起床时刻；tests：07:00 起床 → 6周期=22:15/5周期=23:45/4周期=01:15 断言、跨午夜正确。变现：解锁 20 分钟小睡模式+主题。

### 16 unit-convert 单位换算大全
2页：分类换算（长度/重量/温度/面积/体积/速度/数据/时间）+ 常用收藏。
logic.mjs：UNITS 表（基准因子），convert(cat,from,to,v)（温度特殊函数换算），每类免费 4 单位、解锁全部（每类 6-9 单位）；tests：1 mile=1.609344 km、100°F=37.78°C、1 亩=2000/3 m²、1 GB=1024 MB、往返一致。变现：解锁全部单位+小数位设置。

### 17 date-calc 日期计算器
2页：间隔/加减/工作日三个工具卡 + 自定义节假日管理（解锁）。
logic.mjs：diffDays(a,b)；addDays(dateStr,n)；workdays(a,b,skipSet)（跳过周六日+自定义节假日集合）；tests：跨年/闰年 2024-02-29、工作日窗口、addDays 负数。变现：解锁自定义节假日（内置空表由用户添加）+ 工作日统计导出。

### 18 memory-game 记忆翻牌
2页：游戏页（翻牌网格+步数/计时+最佳纪录）+ 难度选择弹层（4x4 免费 / 6x6 解锁）。
logic.mjs：newBoard(pairs,emojiPool,rand)→洗牌卡组（每对恰好2张）；resolveFlip(state,a,b)→纯状态机（匹配配对消失/不匹配盖回）；tests：卡组完整性（同集合、成对）、状态机匹配/不匹配/重复点击。变现：解锁 6x6+牌背主题。

### 19 game-24 24点挑战
2页：游戏页（4 张牌，两两合并交互，表达式历史）+ 规则。
logic.mjs：applyOp(x,y,op)；solve24(nums)→可解性（递归两两合并枚举+浮点容差 1e-6）；genRound(rand)→保证有解的 4 个数（尝试次数上限后兜底 [1,2,3,4]）；tests：[1,3,4,6] 可解、[1,1,1,1] 不可解、[3,3,8,8] 可解（8/(3−8/3)）、genRound 全部有解 100 局。变现：解锁提示/答案/无限局（免费 5 局/天）。

### 20 expiring-items 囤货保质期
2页：清单（临期色标排序：过期红/≤3天橙/≤7天黄/正常）+ 统计（解锁）。
logic.mjs：daysLeft(expire,today)；statusOf(days)→{level:'expired'|'soon3'|'soon7'|'ok', color}；sortByUrgency(items,today)；tests：边界 0/3/7 天、排序、过期置顶。变现：免费 10 条，解锁无限+分类统计+导出清单。
