d4-completion-rate.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #!/usr/bin/env node
  2. /**
  3. * D4: completion-rate.vue 完成率分析页清理 (debt 121)
  4. *
  5. * 1) template 5 处内联 SVG/legend 色绑定到 data.rateColors(JS 色板收编)
  6. * 2) style 块 ~25 处专属 hex 收编为页面级局部 SCSS 变量
  7. * 3) 3 个全局令牌映射:#F97316->$brand-primary / #FFF5F5->$status-danger-tint / #E74C3C->$status-danger-flat
  8. */
  9. const fs = require('fs');
  10. const F = 'pages/stats/completion-rate.vue';
  11. let src = fs.readFileSync(F, 'utf8');
  12. // ---- 1. template 内联色 -> 动态绑定 ----
  13. const TEMPLATE_REPL = [
  14. ['stroke="#FFF0E6"', ':stroke="rateColors.track"'],
  15. ['stroke="#4ECDC4"', ':stroke="rateColors.done"'],
  16. ['stop-color="#4ECDC4"', ':stop-color="rateColors.done"'],
  17. ['stop-color="#44B09E"', ':stop-color="rateColors.doneDeep"'],
  18. ['style="background: #4ECDC4;"', ':style="{ background: rateColors.done }"'],
  19. ['style="background: #FFB088;"', ':style="{ background: rateColors.pending }"'],
  20. ['style="background: #F97316;"', ':style="{ background: rateColors.overdue }"'],
  21. ];
  22. for (const [from, to] of TEMPLATE_REPL) {
  23. if (!src.includes(from)) console.warn('TPL NOT FOUND:', from);
  24. src = src.split(from).join(to);
  25. }
  26. // ---- 2. script data 增加色板 ----
  27. const PALETTE_JS = [
  28. "import { BrandColors } from '../../utils/brand-colors.js'",
  29. "",
  30. "// 完成率页专属色板(flat 青绿图表系 + 米白卡片系,单页专用)",
  31. "const RATE_COLORS = {",
  32. " track: '#FFF0E6', // 环形底轨",
  33. " done: '#4ECDC4', // 已完成(青绿)",
  34. " doneDeep: '#44B09E', // 青绿渐变深档",
  35. " pending: '#FFB088', // 进行中(浅橙)",
  36. " overdue: BrandColors.primary, // 已逾期(品牌橙)",
  37. " bar: '#FFD93D', // 柱图高亮黄",
  38. " barGreen: '#A8E063', // 柱图渐变绿起",
  39. " barGreenTo: '#56AB2F', // 柱图渐变绿终",
  40. "};",
  41. ].join('\n');
  42. src = src.replace(
  43. "import { getChildCompletionStats, getFamilyCompletionStats, getChildren } from '../../utils/api.js'",
  44. "import { getChildCompletionStats, getFamilyCompletionStats, getChildren } from '../../utils/api.js'\n" + PALETTE_JS
  45. );
  46. // data() 中注入 rateColors
  47. src = src.replace(
  48. / return \{\n loading: true,/,
  49. " return {\n rateColors: RATE_COLORS,\n loading: true,"
  50. );
  51. // ---- 3. style 块收编 ----
  52. const styleIdx = src.indexOf('<style');
  53. const before = src.slice(0, styleIdx);
  54. let styleBody = src.slice(styleIdx);
  55. const GLOBAL_MAP = [
  56. ['#F97316', '$brand-primary'],
  57. ['#FFF5F5', '$status-danger-tint'],
  58. ['#E74C3C', '$status-danger-flat'],
  59. ];
  60. const PALETTE_MAP = [
  61. ['#FFF9F0', '$c-comp-bg'], // 页面米白底 x3
  62. ['#2D3436', '$c-comp-ink'], // 主文字(深灰)x9
  63. ['#4223FC', '$c-comp-ink'], // 防呆(实际无此值,占位无害)
  64. ['#B2BEC3', '$c-comp-muted'], // 次要灰文字 x5
  65. ['#636E72', '$c-comp-muted2'], // 辅助灰文字 x2
  66. ['#FFF5EB', '$c-comp-card'], // 暖白卡片底 x3
  67. ['#FFF0E6', '$c-comp-warm'], // 暖米底色(环形轨/按钮)x4
  68. ['#FFE0E0', '$c-comp-danger-line'], // 危险浅描边 x1
  69. ['#E17055', '$c-comp-orange-text'], // 警示橙文字(未打卡)x1
  70. ['#FFD93D', '$c-comp-bar-yellow'], // 柱图黄 x1
  71. ['#A8E063', '$c-comp-bar-green'], // 柱图绿渐变起 x1
  72. ['#56AB2F', '$c-comp-bar-green-to'],// 柱图绿渐变终 x1
  73. ];
  74. for (const [from, to] of [...GLOBAL_MAP, ...PALETTE_MAP.filter(p => p[0] !== '#4223FC')]) {
  75. const esc = from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  76. styleBody = styleBody.replace(new RegExp(esc + '(?![0-9a-fA-F])', 'g'), to);
  77. }
  78. const palette = [
  79. '// ===== 完成率页专属色阶(flat 图表青绿 + 米白卡片,单页专用;约定见 uni.scss §14)=====',
  80. '$c-comp-bg: #FFF9F0; // 页面米白底',
  81. '$c-comp-card: #FFF5EB; // 暖白卡片底',
  82. '$c-comp-warm: #FFF0E6; // 暖米色(环形底轨 / 分隔)',
  83. '$c-comp-ink: #2D3436; // 主文字(深灰)',
  84. '$c-comp-muted: #B2BEC3; // 次要文字(灰)',
  85. '$c-comp-muted2: #636E72; // 辅助文字(中灰)',
  86. '$c-comp-danger-line: #FFE0E0; // 危险浅描边',
  87. '$c-comp-orange-text: #E17055; // 警示橙文字',
  88. '$c-comp-bar-yellow: #FFD93D; // 柱图高亮黄',
  89. '$c-comp-bar-green: #A8E063; // 柱图绿渐变起',
  90. '$c-comp-bar-green-to: #56AB2F; // 柱图绿渐变终',
  91. ''
  92. ].join('\n');
  93. styleBody = styleBody.replace(/(<style[^>]*>\s*\n)/, '$1' + palette + '\n');
  94. fs.writeFileSync(F, before + styleBody);
  95. console.log('D4 done');