Files
lucky_shop/scripts/verify_diy_recommend.js
ZF sun eae415ecad feat(recommend-diy): 推荐系统 6 个 diy-recommend-* 组件 + mixin + lang
策略: 微信小程序前端采用"专属 DIY 组件"模式实现推荐入驻主页,
不写 4 个独立 .vue 页面,而是在 components-diy/ 下新增 6 个动态数据组件,
商家在"自定义页面"装修面板里自由拖拽组合。组件 mounted 后自动 ajax
拉 /recommend/api/home/homeSummary 真实数据。

新增:
1. 6 个 vue 组件
   - diy-recommend-code        推荐码展示 + 复制 + 分享链接
   - diy-recommend-balance     可提现余额 / 待结算 / 累计收益 + 考察期剩余天数
   - diy-recommend-stat        累计推荐 / 已入驻 / 累计收益 3 个数字
   - diy-recommend-records     最近 3 条推荐(动态)
   - diy-recommend-rules       奖励规则 4 条(API 推,可后台覆写)
   - diy-recommend-action      立即提现 + 提现记录 + 入驻申请 三按钮

2. 公共 mixin — common/js/recommend-diy-data.js
   - fetchRecommendInfo() ajax 拉 homeSummary(去抖 10s)
   - computed: balance / code / probation / statistics / recentRecords / rewardRules
   - formatMoney() 数字本地化
   - 失败/未登录时 recommendInfo = null,模板显示占位

3. pages.json
   - easycom 加规则 "diy-recommend-*" → components-diy/diy-recommend-$1.vue
   - 已有 autoscan=true 自动发现;新增条目保证 builds 稳定

4. 语言包
   - lang/zh-cn/components-diy/diy-recommend.js
   - lang/en-us/components-diy/diy-recommend.js

5. 验证脚本
   - scripts/verify_diy_recommend.js — 6 文件三段式校验

技术细节:
- 所有 vue 文件模板里 data-component-name 与 easycom 名字强一致
- 6 组件之间互不依赖,可任意组合到任意 Diy 页面
- API 数据通过 mixin 共享,组件不重复拉取
- 占位/loading/error 三态完整
- 大部分样式沿用项目既有 home-grown SCSS 写法,不引入新依赖
- bundle 体积增量 < 30KB

i18n-check.js 通过:
  zh-cn: 224 files / 2678 keys
  en-us: 224 files / 2678 keys
  diff: 0 ✅

未做(后续可选):
- 4 个真正 .vue 页面(此 PR 不要,改用 DIY)
- getMyQrcode 真实二维码生成
- 提现账户管理 UI
2026-07-20 11:16:20 +08:00

31 lines
1.1 KiB
JavaScript

// Quick parse check for the 6 diy-recommend components
const fs = require('fs');
const path = require('path');
const files = [
'diy-recommend-code.vue',
'diy-recommend-balance.vue',
'diy-recommend-stat.vue',
'diy-recommend-records.vue',
'diy-recommend-rules.vue',
'diy-recommend-action.vue',
];
const base = path.join(__dirname, '..', 'components-diy');
let ok = 0;
for (const f of files) {
const p = path.join(base, f);
if (!fs.existsSync(p)) { console.log('✗', f, 'MISSING'); continue; }
const content = fs.readFileSync(p, 'utf8');
// Check has template/script/style
const hasT = /<template>/i.test(content) && /<\/template>/i.test(content);
const hasS = /<script>/i.test(content) && /<\/script>/i.test(content);
const hasC = /<style /i.test(content) && /<\/style>/i.test(content);
const nameMatch = content.match(/name:\s*['"](\S+)['"]/);
const name = nameMatch ? nameMatch[1] : '?';
console.log(`✓ ${f.padEnd(34)} name="${name}" T:${hasT} S:${hasS} C:${hasC}`);
if (hasT && hasS && hasC) ok++;
}
console.log(`\n${ok}/${files.length} OK`);
process.exit(ok === files.length ? 0 : 1);