d5-report-result.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/usr/bin/env node
  2. /**
  3. * D5: report-result.vue DAN 测评报告页清理 (debt 120)
  4. *
  5. * 1) template 6 处 RadarChart 内联色属性(fillColor/gridColor/labelColor x2 组)绑定到 data.chartColors
  6. * 2) style 块 7 色映射全局等值令牌
  7. * 3) style 块 15 个专属色(紫罗兰系 + 青/米黄/灰阶)收编为页面级局部 SCSS 变量
  8. */
  9. const fs = require('fs');
  10. const F = 'pages/dan-assessment/report-result.vue';
  11. let src = fs.readFileSync(F, 'utf8');
  12. // ---- 1. template 内联色属性 -> 动态绑定 ----
  13. const TEMPLATE_REPL = [
  14. ['fillColor="#6366F1"', ':fill-color="chartColors.wisdomFill"'],
  15. ['gridColor="#EEF0F6"', ':grid-color="chartColors.grid"'],
  16. ['labelColor="#1F2937"', ':label-color="chartColors.label"'],
  17. ['fillColor="#8B5CF6"', ':fill-color="chartColors.violetFill"'],
  18. ['gridColor="#F0ECFA"', ':grid-color="chartColors.gridViolet"'],
  19. ['labelColor="#5B21B6"', ':label-color="chartColors.labelViolet"'],
  20. ];
  21. for (const [from, to] of TEMPLATE_REPL) {
  22. if (!src.includes(from)) console.warn('TPL NOT FOUND:', from);
  23. src = src.split(from).join(to);
  24. }
  25. // ---- 2. script 顶部插入 JS 色板 + import ----
  26. const PALETTE_JS = [
  27. "import { getDanReportDetail } from '../../utils/api.js'",
  28. "import RadarChart from '../../components/RadarChart.vue'",
  29. "import { BrandColors } from '../../utils/brand-colors.js'",
  30. "",
  31. "// DAN 报告页专属色板(雷达图填充/网格/标签靛蓝+紫罗兰双主题)",
  32. "var REPORT_COLORS = {",
  33. " wisdomFill: BrandColors.dimWisdom, // #6366F1 能力雷达填充(靛蓝)",
  34. " grid: '#EEF0F6', // 能力雷达网格灰",
  35. " label: '#1F2937', // 能力雷达标签深灰",
  36. " violetFill: '#8B5CF6', // 大五人格雷达填充(紫罗兰)",
  37. " gridViolet: '#F0ECFA', // 大五雷达网格浅紫",
  38. " labelViolet: '#5B21B6', // 大五雷达标签深紫",
  39. "};",
  40. ].join('\n');
  41. src = src.replace(
  42. "import { getDanReportDetail } from '../../utils/api.js'\nimport RadarChart from '../../components/RadarChart.vue'",
  43. PALETTE_JS
  44. );
  45. // data() 注入 chartColors
  46. src = src.replace(
  47. / return \{\n reportId: null,/,
  48. " return {\n chartColors: REPORT_COLORS,\n reportId: null,"
  49. );
  50. // ---- 3. style 块 ----
  51. const styleIdx = src.indexOf('<style');
  52. const before = src.slice(0, styleIdx);
  53. let styleBody = src.slice(styleIdx);
  54. const GLOBAL_MAP = [
  55. ['#4F46E5', '$dim-wisdom-deep'],
  56. ['#7C3AED', '$facade-violet-deep'],
  57. ['#FDE68A', '$status-warning-light'],
  58. ['#FBBF24', '$status-warning'],
  59. ['#6EE7B7', '$status-success-light-2'],
  60. ['#F5F3FF', '$facade-violet-tint-2'],
  61. ['#A78BFA', '$facade-violet-light'],
  62. ];
  63. const PALETTE_MAP = [
  64. ['#F3F2FA', '$c-rpt-bg'], // 页面底(淡紫)
  65. ['#7C2D12', '$c-rpt-brown'], // 深棕徽章文字
  66. ['#A5F3FC', '$c-rpt-cyan-1'], // 渐变青浅档
  67. ['#67E8F9', '$c-rpt-cyan-2'], // 渐变青深档
  68. ['#FDBA74', '$c-rpt-orange'], // 暖橙(需关注/边框)
  69. ['#EEF0F6', '$c-rpt-grid'], // 网格灰(指标条底)
  70. ['#F0ECFA', '$c-rpt-violet-grid'], // 紫罗兰网格/底
  71. ['#C7C9D9', '$c-rpt-gray-line'], // 灰色分隔
  72. ['#C4B5FD', '$c-rpt-violet-soft'], // 紫罗兰浅渐变
  73. ['#FCD34D', '$c-rpt-yellow'], // 黄渐变
  74. ['#6D28D9', '$c-rpt-violet-text'], // 紫罗兰文字
  75. ['#F1F2F7', '$c-rpt-line'], // 浅紫分隔线
  76. ['#4B5563', '$c-rpt-body'], // 正文灰
  77. ['#B0B3C3', '$c-rpt-foot'], // 脚注灰
  78. ['#000', '$c-rpt-mask-ink'], // 遮罩渐变异色
  79. ];
  80. for (const [from, to] of [...GLOBAL_MAP, ...PALETTE_MAP]) {
  81. const esc = from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
  82. styleBody = styleBody.replace(new RegExp(esc + '(?![0-9a-fA-F])', 'g'), to);
  83. }
  84. const palette = [
  85. '// ===== DAN 报告页专属色阶(紫罗兰主题 + 图表色板,单页专用;约定见 uni.scss §14)=====',
  86. '$c-rpt-bg: #F3F2FA; // 页面底(淡紫)',
  87. '$c-rpt-brown: #7C2D12; // 深棕徽章文字',
  88. '$c-rpt-cyan-1: #A5F3FC; // 渐变青浅档(星级光谱)',
  89. '$c-rpt-cyan-2: #67E8F9; // 渐变青深档',
  90. '$c-rpt-orange: #FDBA74; // 需关注暖橙(徽章/渐变/边框)',
  91. '$c-rpt-grid: #EEF0F6; // 图表网格灰',
  92. '$c-rpt-violet-grid: #F0ECFA; // 雷达网格/底(浅紫)',
  93. '$c-rpt-gray-line: #C7C9D9; // 灰色分隔',
  94. '$c-rpt-violet-soft: #C4B5FD; // 紫罗兰浅渐变起',
  95. '$c-rpt-yellow: #FCD34D; // 黄渐变起',
  96. '$c-rpt-violet-text: #6D28D9; // 紫罗兰文字',
  97. '$c-rpt-line: #F1F2F7; // 浅紫分隔线',
  98. '$c-rpt-body: #4B5563; // 正文灰',
  99. '$c-rpt-foot: #B0B3C3; // 脚注灰',
  100. '$c-rpt-mask-ink: #000; // 遮罩渐变异色(mask-image)',
  101. ''
  102. ].join('\n');
  103. styleBody = styleBody.replace(/(<style[^>]*>\s*\n)/, '$1' + palette + '\n');
  104. fs.writeFileSync(F, before + styleBody);
  105. console.log('D5 done');