ks-render-v5.js 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const path = require('path');
  4. const ROOT = path.resolve(__dirname, '..', '..', '..');
  5. const OUT_FILE = path.join(ROOT, 'reports', 'KS-快聘-voc-insight-report-v5.html');
  6. const hypos = [
  7. {h:'H1',title:'快聘是蓝领求职主阵地',count:596,color:'#F5A623'},
  8. {h:'H2',title:'直播带岗降低信息不对称',count:1930,color:'#00DC82'},
  9. {h:'H3',title:'薪资透明度是核心关切',count:1842,color:'#8B5CF6'},
  10. {h:'H4',title:'食宿条件影响求职决策',count:2194,color:'#FF4D8D'},
  11. {h:'H5',title:'入职流程便捷性',count:595,color:'#3B82F6'},
  12. {h:'H6',title:'求职被骗是普遍焦虑',count:4435,color:'#EF4444'},
  13. {h:'H7',title:'黑中介是核心痛点',count:3705,color:'#F97316'},
  14. {h:'H8',title:'工资结算方式差异',count:2417,color:'#6B6B6B'},
  15. ];
  16. const riskSignals = [
  17. {label:'骗',value:252,heat:514788,color:'#EF4444'},
  18. {label:'黑中介',value:109,heat:393762,color:'#EF4444'},
  19. {label:'坑',value:92,heat:375264,color:'#FF4D8D'},
  20. {label:'套路',value:45,heat:144842,color:'#F97316'},
  21. {label:'黑厂',value:43,heat:123531,color:'#FF4D8D'},
  22. {label:'押金',value:105,heat:95543,color:'#F5A623'},
  23. {label:'不退',value:70,heat:84106,color:'#F5A623'},
  24. {label:'陷阱',value:21,heat:74090,color:'#F97316'},
  25. ];
  26. const careFactors = [
  27. {label:'包吃包住',value:31,heat:89190,color:'#00DC82'},
  28. {label:'工资',value:186,heat:89081,color:'#00DC82'},
  29. {label:'加班费',value:20,heat:43986,color:'#3B82F6'},
  30. {label:'吃住',value:21,heat:34060,color:'#00DC82'},
  31. {label:'住宿',value:15,heat:25224,color:'#3B82F6'},
  32. {label:'当天入职',value:7,heat:19264,color:'#8B5CF6'},
  33. {label:'日结',value:30,heat:12651,color:'#8B5CF6'},
  34. {label:'靠谱',value:20,heat:9509,color:'#00DC82'},
  35. ];
  36. const competitors = [
  37. {name:'BOSS直聘',monthly:3240,margin:'69%',strength:'算法匹配准确率高',weak:'情绪获得感不足',color:'#3B82F6'},
  38. {name:'58同城',monthly:0,margin:'90%+',strength:'传统市场份额大',weak:'信息审核差',color:'#6B6B6B'},
  39. {name:'快手快聘',monthly:25000,margin:'20%',strength:'用户渗透率极高',weak:'信息审核薄弱',color:'#00DC82'},
  40. ];
  41. const radarData = [
  42. {label:'信息真实度',ks:3,boss:4,wu:2},
  43. {label:'薪资透明度',ks:4,boss:4,wu:2},
  44. {label:'权益保障',ks:2,boss:3,wu:2},
  45. {label:'匹配准确率',ks:3,boss:5,wu:3},
  46. {label:'求职低门槛',ks:5,boss:4,wu:3},
  47. {label:'沟通即时性',ks:5,boss:4,wu:1},
  48. {label:'信任建立',ks:4,boss:3,wu:1},
  49. {label:'情绪获得感',ks:5,boss:2,wu:0},
  50. ];
  51. const emotionSamples = [
  52. {keyword:'黑厂',direction:'负向',likes:91732,expr:'揭秘!广东5大黑厂有哪些?想不被坑,千万不要进'},
  53. {keyword:'入职被坑',direction:'负向',likes:6276,expr:'22年差点被骗去当咯咯哒 说什么模特走台下面的人送花就有提成'},
  54. {keyword:'求职被骗',direction:'负向',likes:8062,expr:'东北小伙被骗进厂干到S,马总竟是最大黒中芥!?'},
  55. {keyword:'打工陷阱',direction:'负向',likes:2857,expr:'找工作别踩坑!警惕黑中介套路与离谱高价工陷阱'},
  56. ];
  57. const highLikedComments = [
  58. {rank:1,likes:6276,expr:'22年差点被骗去当咯咯哒 说什么模特走台下面的人送花就有提成',kw:'入职被坑'},
  59. {rank:2,likes:2209,expr:'去买几个鸡蛋,打碎,放在沙发下面...',kw:'押金不退'},
  60. {rank:3,likes:808,expr:'我在广西就遇到过房东死活不退押金...',kw:'押金不退'},
  61. {rank:4,likes:533,expr:'做的不错,就该那样!有些房东太不像话了!',kw:'押金不退'},
  62. {rank:5,likes:491,expr:'无论怎么样,反正$黑中介$是赚了',kw:'黑中介'},
  63. {rank:6,likes:422,expr:'那暑假工能做什么啊',kw:'入职被坑'},
  64. {rank:7,likes:403,expr:'干的漂亮,支持小伙子不应该判刑...',kw:'黑中介'},
  65. {rank:8,likes:312,expr:'都绑起来了,都投降了,那人还要去喷那个喷雾',kw:'黑中介'},
  66. {rank:9,likes:311,expr:'为什么南方的房东都不退押金',kw:'押金不退'},
  67. {rank:10,likes:228,expr:'只要收身份证的都是,正常的面试只需要填表就行',kw:'黑中介'},
  68. ];
  69. function esc(s) { return String(s ?? '').replace(/[&<>"']/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c])); }
  70. function fmtLikes(n) { if (n == null) return '0'; if (n >= 10000) return (n/10000).toFixed(1).replace(/\.0$/,'')+'w'; if (n >= 1000) return (n/1000).toFixed(1).replace(/\.0$/,'')+'k'; return String(n); }
  71. function barChart(rows, accent, maxW=900) {
  72. const max = Math.max(...rows.map(r=>r.value),1);
  73. const barH=36,gap=14,padL=140,padR=100,padV=16,W=maxW;
  74. const totalH = rows.length*(barH+gap)+padV*2;
  75. return `<div style="background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px 24px;">
  76. <svg viewBox="0 0 ${W} ${totalH}" style="width:100%;height:auto;" preserveAspectRatio="xMidYMid meet">
  77. ${rows.map((r,i)=>{const y=padV+i*(barH+gap);const w=Math.max((r.value/max)*(W-padL-padR),6);return `<text x="${padL-10}" y="${y+barH/2+5}" text-anchor="end" font-size="13" fill="var(--text-2)">${esc(r.label)}</text><rect x="${padL}" y="${y}" width="${w}" height="${barH}" rx="4" fill="${r.color||accent}" opacity="0.85"/><text x="${padL+w+10}" y="${y+barH/2+5}" font-size="13" font-weight="700" fill="${r.color||accent}" font-family="monospace">${esc(r.valueLabel||r.value)}</text>`;}).join('')}
  78. </svg>
  79. </div>`;
  80. }
  81. function radarChart() {
  82. const cx=200,cy=180,r=130;
  83. const labels = radarData.map(d=>d.label);
  84. const ksVals = radarData.map(d=>d.ks);
  85. const bossVals = radarData.map(d=>d.boss);
  86. const wuVals = radarData.map(d=>d.wu);
  87. const n = labels.length;
  88. const step = 2*Math.PI/n;
  89. const toXY = (v,i,R=r) => ({x: cx + R*v*Math.cos(i*step - Math.PI/2), y: cy + R*v*Math.sin(i*step - Math.PI/2)});
  90. const ksPath = ksVals.map((v,i)=>toXY(v/5,i)).map((p,i)=>(i===0?'M':'L')+p.x+','+p.y).join('')+'Z';
  91. const bossPath = bossVals.map((v,i)=>toXY(v/5,i)).map((p,i)=>(i===0?'M':'L')+p.x+','+p.y).join('')+'Z';
  92. const wuPath = wuVals.map((v,i)=>toXY(v/5,i)).map((p,i)=>(i===0?'M':'L')+p.x+','+p.y).join('')+'Z';
  93. const gridPath = [1,0.5,0.25].map(s=>[0,1,2,3,4].map(i=>toXY(s,i)).map((p,i)=>(i===0?'M':'L')+p.x+','+p.y).join('')+'Z').join('');
  94. let labelHTML = labels.map((l,i)=>{const p=toXY(1.15,i);return `<text x="${p.x}" y="${p.y}" text-anchor="middle" dominant-baseline="middle" font-size="11" fill="var(--text-2)">${esc(l)}</text>`;}).join('');
  95. return `<div style="background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px;">
  96. <svg viewBox="0 0 400 360" style="width:100%;height:auto;">
  97. <circle cx="${cx}" cy="${cy}" r="${r}" fill="none" stroke="var(--border)" stroke-width="1"/>
  98. <path d="${gridPath}" fill="none" stroke="var(--border)" stroke-width="0.5" opacity="0.5"/>
  99. <path d="${wuPath}" fill="rgba(107,107,107,0.15)" stroke="#6B6B6B" stroke-width="2"/>
  100. <path d="${bossPath}" fill="rgba(59,130,246,0.15)" stroke="#3B82F6" stroke-width="2"/>
  101. <path d="${ksPath}" fill="rgba(0,220,130,0.2)" stroke="#00DC82" stroke-width="2.5"/>
  102. ${labelHTML}
  103. <g transform="translate(${cx+r+20},20)">
  104. <rect x="0" y="0" width="12" height="12" fill="#00DC82"/><text x="18" y="10" font-size="11" fill="var(--text-2)">快手</text>
  105. <rect x="0" y="25" width="12" height="12" fill="#3B82F6"/><text x="18" y="35" font-size="11" fill="var(--text-2)">BOSS直聘</text>
  106. <rect x="0" y="50" width="12" height="12" fill="#6B6B6B"/><text x="18" y="60" font-size="11" fill="var(--text-2)">58同城</text>
  107. </g>
  108. </svg>
  109. </div>`;
  110. }
  111. function voiceCard(comment, isHot=false) {
  112. return `<div class="voice-card ${isHot?'hot':''}" style="border-left:3px solid ${isHot?'var(--amber)':'var(--rose)'};">
  113. <div style="display:flex;align-items:center;gap:8px;margin-bottom:8px;">
  114. <span style="width:20px;height:20px;border-radius:50%;background:var(--bg-2);color:var(--text-1);font-size:0.6rem;font-weight:700;display:flex;align-items:center;justify-content:center;">快</span>
  115. <span style="font-size:0.8rem;color:var(--text-3);">快手用户</span>
  116. <span style="margin-left:auto;font-size:0.78rem;font-weight:600;color:${isHot?'var(--amber)':'var(--rose)'};">♥ ${fmtLikes(comment.likes)}</span>
  117. </div>
  118. <div class="voice-content">"${esc(comment.expr)}"</div>
  119. <div class="voice-meta">
  120. <span class="voice-tag">${esc(comment.kw)}</span>
  121. </div>
  122. </div>`;
  123. }
  124. const html = `<!DOCTYPE html>
  125. <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
  126. <title>快手快聘 · VOC 深度洞察报告</title>
  127. <style>
  128. :root{--bg-0:#0A0A0A;--bg-1:#111111;--bg-2:#1A1A1A;--bg-3:#252525;--border:rgba(255,255,255,0.08);--border-strong:rgba(255,255,255,0.16);--text-1:#F5F5F5;--text-2:#A8A8A8;--text-3:#6B6B6B;--amber:#F5A623;--amber-glow:rgba(245,166,35,0.15);--green:#00DC82;--purple:#8B5CF6;--rose:#FF4D8D;--blue:#3B82F6;--red:#EF4444;--orange:#F97316;--font-head:'Inter','Noto Sans SC','PingFang SC','Microsoft YaHei',sans-serif;--font-body:'Noto Sans SC','Inter','PingFang SC','Microsoft YaHei',sans-serif;--font-mono:'JetBrains Mono','SF Mono','Fira Code',monospace;--max-w:1280px;--radius-sm:8px;--radius-md:12px;--radius-lg:20px;}
  129. *{margin:0;padding:0;box-sizing:border-box}
  130. html{scroll-behavior:smooth;font-size:16px;scroll-snap-type:y proximity;}
  131. body{font-family:var(--font-body);background:var(--bg-0);color:var(--text-1);line-height:1.65;-webkit-font-smoothing:antialiased;overflow-x:hidden}
  132. body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse 900px 700px at var(--amb-x,20%) var(--amb-y,25%),rgba(245,166,35,0.10),transparent 60%),radial-gradient(ellipse 800px 600px at calc(100% - var(--amb-x,20%)) calc(100% - var(--amb-y,25%)),rgba(139,92,246,0.07),transparent 60%);transition:background 1.4s cubic-bezier(.2,.7,.2,1);}
  133. body::after{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(255,255,255,0.015) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.015) 1px,transparent 1px);background-size:80px 80px;mask-image:radial-gradient(ellipse 90% 95% at 50% 50%,black 0%,transparent 85%);-webkit-mask-image:radial-gradient(ellipse 90% 95% at 50% 50%,black 0%,transparent 85%);}
  134. main.deck{position:relative;z-index:1}
  135. ::selection{background:var(--amber);color:#000}
  136. .text-hero{font-family:var(--font-head);font-weight:900;letter-spacing:-0.04em;line-height:0.95;font-size:clamp(4rem,12vw,10rem)}
  137. .text-poster{font-family:var(--font-head);font-weight:800;letter-spacing:-0.03em;line-height:1.05;font-size:clamp(2.5rem,6vw,5rem)}
  138. .text-h1{font-family:var(--font-head);font-weight:700;letter-spacing:-0.02em;line-height:1.1;font-size:clamp(2rem,4vw,3.5rem)}
  139. .text-h2{font-family:var(--font-head);font-weight:700;letter-spacing:-0.015em;line-height:1.2;font-size:clamp(1.4rem,2.5vw,2rem)}
  140. .text-h3{font-weight:600;font-size:clamp(1.05rem,1.6vw,1.3rem);letter-spacing:-0.01em}
  141. .text-body{font-size:clamp(0.92rem,1.1vw,1rem);line-height:1.75;color:var(--text-2)}
  142. .text-sm{font-size:0.85rem;color:var(--text-2)}
  143. .text-xs{font-size:0.72rem;color:var(--text-3);letter-spacing:0.02em}
  144. .text-mono{font-family:var(--font-mono)}
  145. .text-amber{color:var(--amber)}.text-green{color:var(--green)}.text-purple{color:var(--purple)}.text-rose{color:var(--rose)}.text-blue{color:var(--blue)}.text-red{color:var(--red)}.text-orange{color:var(--orange)}
  146. section.report-section{min-height:100vh;padding:clamp(60px,10vh,120px) clamp(24px,6vw,80px);position:relative;border-bottom:1px solid var(--border);display:flex;flex-direction:column;justify-content:center;scroll-snap-align:start;scroll-snap-stop:always;overflow:hidden;isolation:isolate}
  147. section.report-section::before{content:attr(data-slide-num);position:absolute;top:clamp(20px,3vh,36px);right:clamp(24px,4vw,60px);font-family:var(--font-mono);font-weight:600;font-size:clamp(0.68rem,0.75vw,0.78rem);letter-spacing:0.25em;color:var(--text-3);z-index:4;pointer-events:none}
  148. section.report-section::after{content:'';position:absolute;inset:0;pointer-events:none;z-index:-1;background:radial-gradient(ellipse 70% 60% at 85% 15%,var(--slide-glow-1,rgba(245,166,35,0.06)),transparent 55%),radial-gradient(ellipse 60% 50% at 15% 85%,var(--slide-glow-2,rgba(139,92,246,0.04)),transparent 55%);opacity:0;transition:opacity 1s cubic-bezier(.2,.7,.2,1)}
  149. section.report-section.in-view::after{opacity:1}
  150. section.report-section[data-tone="amber"]{--slide-glow-1:rgba(245,166,35,0.10);--slide-glow-2:rgba(245,166,35,0.04)}
  151. section.report-section[data-tone="rose"]{--slide-glow-1:rgba(255,77,141,0.09);--slide-glow-2:rgba(255,77,141,0.04)}
  152. section.report-section[data-tone="green"]{--slide-glow-1:rgba(0,220,130,0.08);--slide-glow-2:rgba(0,220,130,0.03)}
  153. section.report-section[data-tone="purple"]{--slide-glow-1:rgba(139,92,246,0.10);--slide-glow-2:rgba(139,92,246,0.04)}
  154. section.report-section[data-tone="blue"]{--slide-glow-1:rgba(59,130,246,0.08);--slide-glow-2:rgba(59,130,246,0.03)}
  155. section.report-section[data-tone="orange"]{--slide-glow-1:rgba(249,115,22,0.10);--slide-glow-2:rgba(249,115,22,0.04)}
  156. section.report-section[data-tone="red"]{--slide-glow-1:rgba(239,68,68,0.10);--slide-glow-2:rgba(239,68,68,0.04)}
  157. .cover-hero{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;padding:clamp(40px,8vh,100px) clamp(24px,6vw,80px);background:radial-gradient(ellipse 60% 80% at 30% 30%,rgba(245,166,35,0.08) 0%,transparent 70%),radial-gradient(ellipse 40% 60% at 80% 70%,rgba(139,92,246,0.05) 0%,transparent 70%),var(--bg-0)}
  158. .cover-grid-bg{position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,0.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.025) 1px,transparent 1px);background-size:60px 60px;mask-image:radial-gradient(ellipse 80% 80% at 50% 50%,black 0%,transparent 70%);-webkit-mask-image:radial-gradient(ellipse 80% 80% at 50% 50%,black 0%,transparent 70%)}
  159. .section-inner{width:100%;max-width:var(--max-w);margin:0 auto;position:relative}
  160. .section-head{margin-bottom:clamp(32px,5vh,64px)}
  161. .section-eyebrow{display:inline-flex;align-items:center;gap:10px;font-family:var(--font-mono);font-size:0.72rem;letter-spacing:0.18em;text-transform:uppercase;color:var(--amber);font-weight:500;margin-bottom:18px}
  162. .section-eyebrow::before{content:'';display:inline-block;width:24px;height:1px;background:var(--amber)}
  163. .section-sub{color:var(--text-2);font-size:1.05rem;max-width:720px;margin-top:14px;line-height:1.8}
  164. .grid{display:grid;gap:clamp(14px,1.6vw,22px)}
  165. .grid-2{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
  166. .grid-3{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}
  167. .grid-4{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
  168. .card{background:linear-gradient(180deg,rgba(255,255,255,0.025) 0%,rgba(255,255,255,0.008) 100%),var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:clamp(20px,2.2vw,32px);position:relative;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);transition:transform 0.4s cubic-bezier(.2,.7,.2,1),border-color 0.3s ease,box-shadow 0.4s ease}
  169. .card:hover{border-color:var(--border-strong);transform:translateY(-3px);box-shadow:0 12px 40px rgba(0,0,0,0.35),0 0 0 1px rgba(245,166,35,0.08)}
  170. .card.card-glow{box-shadow:0 0 60px rgba(245,166,35,0.12),0 0 120px rgba(245,166,35,0.06)}
  171. .card.card-glow-green{box-shadow:0 0 60px rgba(0,220,130,0.12),0 0 120px rgba(0,220,130,0.06)}
  172. .card.card-glow-rose{box-shadow:0 0 60px rgba(255,77,141,0.12),0 0 120px rgba(255,77,141,0.06)}
  173. .card-accent{border-left:3px solid var(--amber);border-top:1px solid var(--border);border-right:1px solid var(--border);border-bottom:1px solid var(--border)}
  174. .metric{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:clamp(24px,2.5vw,36px);position:relative;overflow:hidden}
  175. .metric::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,var(--amber),transparent);opacity:0.6}
  176. .metric .metric-label{font-family:var(--font-mono);font-size:0.7rem;letter-spacing:0.15em;text-transform:uppercase;color:var(--text-3);margin-bottom:10px}
  177. .metric .metric-value{font-family:var(--font-head);font-weight:800;font-size:clamp(2.2rem,4vw,3.5rem);letter-spacing:-0.03em;line-height:1;color:var(--text-1);margin-bottom:8px}
  178. .metric .metric-unit{font-family:var(--font-mono);font-size:0.85rem;color:var(--amber);font-weight:500}
  179. .metric .metric-sub{margin-top:14px;font-size:0.82rem;color:var(--text-2);line-height:1.5}
  180. .voice-card{background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-md);padding:20px 24px;margin-bottom:14px;transition:all 0.3s ease;position:relative;overflow:hidden}
  181. .voice-card::before{content:'';position:absolute;top:0;left:0;width:3px;height:100%;background:var(--rose);opacity:0.6;transition:opacity 0.3s}
  182. .voice-card.hot{border-color:rgba(245,166,35,0.3)}
  183. .voice-card.hot::before{opacity:1;background:var(--amber)}
  184. .voice-card:hover{border-color:var(--border-strong);transform:translateX(4px)}
  185. .voice-card .voice-content{font-size:0.96rem;line-height:1.7;color:var(--text-1);margin:12px 0;font-weight:400}
  186. .voice-card .voice-meta{display:flex;gap:8px;flex-wrap:wrap}
  187. .voice-tag{display:inline-flex;padding:3px 10px;background:rgba(255,77,141,0.1);color:var(--rose);border-radius:4px;font-size:0.72rem;font-weight:500}
  188. .voice-card.hot .voice-tag{background:rgba(245,166,35,0.1);color:var(--amber)}
  189. .tag{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:4px;font-size:0.72rem;font-weight:500;letter-spacing:0.02em;font-family:var(--font-head);background:rgba(245,166,35,0.1);color:var(--amber);border:1px solid rgba(245,166,35,0.22)}
  190. .tag.green{background:rgba(0,220,130,0.08);color:var(--green);border-color:rgba(0,220,130,0.2)}
  191. .tag.purple{background:rgba(139,92,246,0.08);color:var(--purple);border-color:rgba(139,92,246,0.2)}
  192. .tag.rose{background:rgba(255,77,141,0.08);color:var(--rose);border-color:rgba(255,77,141,0.2)}
  193. .tag.blue{background:rgba(59,130,246,0.08);color:var(--blue);border-color:rgba(59,130,246,0.2)}
  194. .tag.orange{background:rgba(249,115,22,0.08);color:var(--orange);border-color:rgba(249,115,22,0.2)}
  195. .tag.red{background:rgba(239,68,68,0.08);color:var(--red);border-color:rgba(239,68,68,0.2)}
  196. .footer{text-align:center;padding:40px 24px;color:var(--text-3);font-size:0.8rem;border-top:1px solid var(--border)}
  197. </style>
  198. </head>
  199. <body>
  200. <main class="deck">
  201. <!-- 封面 -->
  202. <section class="report-section cover-hero" data-tone="amber" style="min-height:100vh;">
  203. <div class="cover-grid-bg"></div>
  204. <div style="position:relative;z-index:1;">
  205. <div class="section-eyebrow" style="margin-bottom:24px;">VOC 深度洞察报告</div>
  206. <h1 class="text-hero" style="margin-bottom:20px;">快手快聘</h1>
  207. <p class="text-body" style="font-size:1.3rem;max-width:650px;margin-bottom:24px;">"10个蓝领,9个都用快手" · 蓝领求职生态与快聘战略洞察</p>
  208. <div style="display:flex;gap:12px;flex-wrap:wrap;margin-bottom:32px;">
  209. <span class="tag">快手</span>
  210. <span class="tag green">7,902 条真实评论</span>
  211. <span class="tag purple">19 个关键词</span>
  212. <span class="tag blue">380 个视频</span>
  213. <span class="tag orange">9456万 播放</span>
  214. </div>
  215. <div class="text-xs" style="margin-top:20px;">Generated by OpenClaw VOC System · 2026/4/24</div>
  216. </div>
  217. </section>
  218. <!-- Ch1: 执行摘要 -->
  219. <section class="report-section" data-slide-num="01" data-tone="amber" id="ch1">
  220. <div class="section-inner">
  221. <div class="section-head">
  222. <div class="section-eyebrow">CHAPTER 01</div>
  223. <h2 class="text-h1">执行摘要</h2>
  224. <p class="section-sub">快手快聘蓝领求职生态核心洞察</p>
  225. </div>
  226. <div class="grid grid-4" style="margin-bottom:32px;">
  227. <div class="metric"><div class="metric-label">VOC总量</div><div class="metric-value" style="color:var(--amber);">7,902</div><div class="metric-sub">条真实评论</div></div>
  228. <div class="metric"><div class="metric-label">视频播放量</div><div class="metric-value" style="color:var(--green);">9456万</div><div class="metric-sub">TOP视频汇总</div></div>
  229. <div class="metric"><div class="metric-label">最强焦虑</div><div class="metric-value" style="color:var(--red);">H6</div><div class="metric-sub">求职被骗 4435条</div></div>
  230. <div class="metric"><div class="metric-label">战略地位</div><div class="metric-value" style="color:var(--rose);">第二</div><div class="metric-sub">仅次于电商</div></div>
  231. </div>
  232. <div class="card card-glow card-accent" style="margin-bottom:28px;padding:28px 32px;">
  233. <div class="text-amber" style="font-family:var(--font-mono);font-size:0.72rem;letter-spacing:0.15em;margin-bottom:14px;font-weight:600;">核心问题</div>
  234. <div class="text-h2" style="margin-bottom:12px;">蓝领求职最担心什么?最看重什么?</div>
  235. <p class="text-body">最强焦虑不是"工资低",而是"信息不真实、被骗、被坑、押金不退、工资被克扣"</p>
  236. </div>
  237. <div class="grid grid-3">
  238. <div class="card" style="border-left:3px solid var(--red);">
  239. <div style="font-size:1.6rem;margin-bottom:12px;">🛡️</div>
  240. <div style="font-weight:700;margin-bottom:8px;">风险焦虑</div>
  241. <p class="text-sm">被骗/被坑/黑中介/押金不退/克扣工资/打工陷阱 - 最稳定、最强烈的底层情绪</p>
  242. </div>
  243. <div class="card" style="border-left:3px solid var(--green);">
  244. <div style="font-size:1.6rem;margin-bottom:12px;">💰</div>
  245. <div style="font-weight:700;margin-bottom:8px;">确定性诉求</div>
  246. <p class="text-sm">工资真实、发薪稳定、包吃包住、当天入职、流程简单</p>
  247. </div>
  248. <div class="card" style="border-left:3px solid var(--purple);">
  249. <div style="font-size:1.6rem;margin-bottom:12px;">🤝</div>
  250. <div style="font-weight:700;margin-bottom:8px;">信任机制</div>
  251. <p class="text-sm">"老铁文化"+"眼见为实" - 快手在蓝领求职场景的核心竞争力</p>
  252. </div>
  253. </div>
  254. </div>
  255. </section>
  256. <!-- Ch2: 最担心什么 -->
  257. <section class="report-section" data-slide-num="02" data-tone="red" id="ch2">
  258. <div class="section-inner">
  259. <div class="section-head">
  260. <div class="section-eyebrow" style="color:var(--red);">CHAPTER 02</div>
  261. <h2 class="text-h1">蓝领求职时最担心什么</h2>
  262. <p class="section-sub">风险焦虑是最稳定、最强烈的底层情绪</p>
  263. </div>
  264. <div class="grid grid-2" style="margin-bottom:28px;">
  265. <div>
  266. <div class="section-eyebrow" style="color:var(--red);margin-bottom:16px;">风险信号排行(按热度)</div>
  267. ${barChart(riskSignals.slice(0,6),'#EF4444')}
  268. </div>
  269. <div class="card" style="border-left:3px solid var(--red);">
  270. <div style="font-weight:700;margin-bottom:16px;font-size:1.1rem;">高风险场景样本</div>
  271. <div style="line-height:2;font-size:0.88rem;color:var(--text-2);">
  272. <div style="margin-bottom:14px;padding-bottom:14px;border-bottom:1px solid var(--border);">
  273. <span style="color:var(--red);font-weight:600;">[黑中介] 热度203219</span><br/>
  274. <span style="font-size:0.8rem;">#万恶之源 #搞笑我是认真的 #搞笑 黑中介的噩梦,只要我不努力,你就过不上你想要的生活</span>
  275. </div>
  276. <div style="margin-bottom:14px;padding-bottom:14px;border-bottom:1px solid var(--border);">
  277. <span style="color:var(--red);font-weight:600;">[黑厂] 热度122687</span><br/>
  278. <span style="font-size:0.8rem;">揭秘!广东5大黑厂有哪些?想不被坑,千万不要进</span>
  279. </div>
  280. <div>
  281. <span style="color:var(--red);font-weight:600;">[入职被坑] 热度42121</span><br/>
  282. <span style="font-size:0.8rem;">#黑中介招工套路 ,刚开始签18块钱一个小时...</span>
  283. </div>
  284. </div>
  285. </div>
  286. </div>
  287. <div class="grid grid-3">
  288. <div class="card" style="border-top:2px solid var(--red);">
  289. <div style="font-size:1.6rem;margin-bottom:10px;">🚨</div>
  290. <div style="font-weight:700;color:var(--red);margin-bottom:8px;">招聘信息虚假</div>
  291. <p class="text-sm">"货不对版" - 承诺薪资、食宿条件与实际不符</p>
  292. </div>
  293. <div class="card" style="border-top:2px solid var(--orange);">
  294. <div style="font-size:1.6rem;margin-bottom:10px;">💸</div>
  295. <div style="font-weight:700;color:var(--orange);margin-bottom:8px;">押金陷阱</div>
  296. <p class="text-sm">预缴押金/培训费后招工方失联</p>
  297. </div>
  298. <div class="card" style="border-top:2px solid var(--amber);">
  299. <div style="font-size:1.6rem;margin-bottom:10px;">⚖️</div>
  300. <div style="font-weight:700;color:var(--amber);margin-bottom:8px;">权益无保障</div>
  301. <p class="text-sm">不签劳动合同、不上社保、欠薪维权难</p>
  302. </div>
  303. </div>
  304. </div>
  305. </section>
  306. <!-- Ch3: 最看重什么 -->
  307. <section class="report-section" data-slide-num="03" data-tone="green" id="ch3">
  308. <div class="section-inner">
  309. <div class="section-head">
  310. <div class="section-eyebrow" style="color:var(--green);">CHAPTER 03</div>
  311. <h2 class="text-h1">蓝领求职时最看重什么</h2>
  312. <p class="section-sub">确定性 + 即时性 = 快速入职决策</p>
  313. </div>
  314. <div class="grid grid-2" style="margin-bottom:28px;">
  315. <div>
  316. <div class="section-eyebrow" style="color:var(--green);margin-bottom:16px;">看重因素排行(按热度)</div>
  317. ${barChart(careFactors.slice(0,6),'#00DC82')}
  318. </div>
  319. <div class="card" style="border-left:3px solid var(--green);">
  320. <div style="font-weight:700;margin-bottom:16px;font-size:1.1rem;">高代表性样本</div>
  321. <div style="line-height:2;font-size:0.88rem;color:var(--text-2);">
  322. <div style="margin-bottom:12px;">
  323. <span style="color:var(--green);font-weight:600;">[工资日结] 热度48804</span><br/>
  324. <span style="font-size:0.8rem;">"..."</span>
  325. </div>
  326. <div style="margin-bottom:12px;">
  327. <span style="color:var(--green);font-weight:600;">[包吃包住] 热度15768</span><br/>
  328. <span style="font-size:0.8rem;">距你0.9km #找工作 #包吃包住 #勤杂工 #大龄工</span>
  329. </div>
  330. <div>
  331. <span style="color:var(--green);font-weight:600;">[当天入职] 热度17397</span><br/>
  332. <span style="font-size:0.8rem;">#不体检不收费当天安排 #当天来当天入职安排住宿</span>
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. <div class="grid grid-4" style="margin-bottom:28px;">
  338. <div class="card" style="border-top:2px solid var(--green);text-align:center;">
  339. <div style="font-size:1.8rem;margin-bottom:10px;">👁️</div>
  340. <div style="font-weight:600;color:var(--green);font-size:0.9rem;margin-bottom:6px;">眼见为实</div>
  341. <p class="text-xs">直播展示车间、宿舍、食堂,消解信息不对称</p>
  342. </div>
  343. <div class="card" style="border-top:2px solid var(--blue);text-align:center;">
  344. <div style="font-size:1.8rem;margin-bottom:10px;">⚡</div>
  345. <div style="font-weight:600;color:var(--blue);font-size:0.9rem;margin-bottom:6px;">即时沟通</div>
  346. <p class="text-xs">实时互动答疑,无需等待反馈</p>
  347. </div>
  348. <div class="card" style="border-top:2px solid var(--purple);text-align:center;">
  349. <div style="font-size:1.8rem;margin-bottom:10px;">🚪</div>
  350. <div style="font-weight:600;color:var(--purple);font-size:0.9rem;margin-bottom:6px;">零门槛</div>
  351. <p class="text-xs">留联系方式即可求职,无需简历</p>
  352. </div>
  353. <div class="card" style="border-top:2px solid var(--amber);text-align:center;">
  354. <div style="font-size:1.8rem;margin-bottom:10px;">💯</div>
  355. <div style="font-weight:600;color:var(--amber);font-size:0.9rem;margin-bottom:6px;">薪资透明</div>
  356. <p class="text-xs">承诺的工资能兑现</p>
  357. </div>
  358. </div>
  359. </div>
  360. </section>
  361. <!-- Ch4: 情绪价值 -->
  362. <section class="report-section" data-slide-num="04" data-tone="purple" id="ch4">
  363. <div class="section-inner">
  364. <div class="section-head">
  365. <div class="section-eyebrow" style="color:var(--purple);">CHAPTER 04</div>
  366. <h2 class="text-h1">情绪价值强的表达</h2>
  367. <p class="section-sub">情绪价值的核心不是娱乐,而是"确定性"</p>
  368. </div>
  369. <div class="grid grid-2" style="margin-bottom:28px;">
  370. ${emotionSamples.slice(0,2).map(e=>voiceCard(e,true)).join('')}
  371. </div>
  372. <div class="grid grid-2" style="margin-bottom:28px;">
  373. ${emotionSamples.slice(2).map(e=>voiceCard(e,false)).join('')}
  374. </div>
  375. <div class="card card-glow card-accent">
  376. <div style="font-weight:700;margin-bottom:14px;font-size:1rem;">情绪价值关键词体系</div>
  377. <div class="grid grid-4" style="gap:10px;">
  378. <div style="padding:12px 16px;background:rgba(245,166,35,0.08);border-radius:8px;text-align:center;">
  379. <div style="color:var(--amber);font-weight:700;font-size:1rem;">"眼见为实"</div>
  380. <div class="text-xs" style="margin-top:6px;">消解信息不对称</div>
  381. </div>
  382. <div style="padding:12px 16px;background:rgba(0,220,130,0.08);border-radius:8px;text-align:center;">
  383. <div style="color:var(--green);font-weight:700;font-size:1rem;">"老铁推荐"</div>
  384. <div class="text-xs" style="margin-top:6px;">熟人身份降低防备</div>
  385. </div>
  386. <div style="padding:12px 16px;background:rgba(139,92,246,0.08);border-radius:8px;text-align:center;">
  387. <div style="color:var(--purple);font-weight:700;font-size:1rem;">"来了就是兄弟"</div>
  388. <div class="text-xs" style="margin-top:6px;">归属感和人情味</div>
  389. </div>
  390. <div style="padding:12px 16px;background:rgba(239,68,68,0.08);border-radius:8px;text-align:center;">
  391. <div style="color:var(--red);font-weight:700;font-size:1rem;">"不骗人不套路"</div>
  392. <div class="text-xs" style="margin-top:6px;">真实可靠心智</div>
  393. </div>
  394. </div>
  395. </div>
  396. </div>
  397. </section>
  398. <!-- Ch5: 假设验证 H1-H4 -->
  399. <section class="report-section" data-slide-num="05" data-tone="blue" id="ch5">
  400. <div class="section-inner">
  401. <div class="section-head">
  402. <div class="section-eyebrow" style="color:var(--blue);">CHAPTER 05</div>
  403. <h2 class="text-h1">H1-H8 假设验证</h2>
  404. <p class="section-sub">基于7,902条VOC的假设覆盖分析</p>
  405. </div>
  406. <div class="grid grid-2" style="margin-bottom:28px;">
  407. <div>
  408. <div class="section-eyebrow" style="color:var(--green);margin-bottom:16px;">H1-H4 假设覆盖</div>
  409. ${barChart(hypos.slice(0,4).map(h=>({label:h.h+' '+h.title.slice(0,8),value:h.count,color:h.color})),'#8B5CF6')}
  410. </div>
  411. <div>
  412. <div class="section-eyebrow" style="color:var(--rose);margin-bottom:16px;">H5-H8 假设覆盖</div>
  413. ${barChart(hypos.slice(4).map(h=>({label:h.h+' '+h.title.slice(0,8),value:h.count,color:h.color})),'#FF4D8D')}
  414. </div>
  415. </div>
  416. <div class="grid grid-4">
  417. <div class="card" style="border-top:2px solid var(--amber);text-align:center;padding:16px;">
  418. <div style="font-size:1.6rem;font-weight:800;color:var(--amber);">H1</div>
  419. <div class="text-xs" style="margin-top:6px;">快聘核心场景</div>
  420. <div style="font-weight:700;color:var(--amber);margin-top:4px;">596条</div>
  421. </div>
  422. <div class="card" style="border-top:2px solid var(--green);text-align:center;padding:16px;">
  423. <div style="font-size:1.6rem;font-weight:800;color:var(--green);">H2</div>
  424. <div class="text-xs" style="margin-top:6px;">信息不对称</div>
  425. <div style="font-weight:700;color:var(--green);margin-top:4px;">1930条</div>
  426. </div>
  427. <div class="card" style="border-top:2px solid var(--purple);text-align:center;padding:16px;">
  428. <div style="font-size:1.6rem;font-weight:800;color:var(--purple);">H3</div>
  429. <div class="text-xs" style="margin-top:6px;">薪资透明度</div>
  430. <div style="font-weight:700;color:var(--purple);margin-top:4px;">1842条</div>
  431. </div>
  432. <div class="card" style="border-top:2px solid var(--rose);text-align:center;padding:16px;">
  433. <div style="font-size:1.6rem;font-weight:800;color:var(--rose);">H6</div>
  434. <div class="text-xs" style="margin-top:6px;">求职被骗焦虑</div>
  435. <div style="font-weight:700;color:var(--rose);margin-top:4px;">4435条 ⭐</div>
  436. </div>
  437. </div>
  438. </div>
  439. </section>
  440. <!-- Ch6-1: 平台竞争格局 -->
  441. <section class="report-section" data-slide-num="06" data-tone="green" id="ch6-1">
  442. <div class="section-inner">
  443. <div class="section-head">
  444. <div class="section-eyebrow" style="color:var(--green);">CHAPTER 06-1</div>
  445. <h2 class="text-h1">快聘竞争格局</h2>
  446. <p class="section-sub">流量型 vs 算法型平台核心差异</p>
  447. </div>
  448. <div class="grid grid-3" style="margin-bottom:28px;">
  449. <div class="card card-glow-green" style="border-left:3px solid var(--green);">
  450. <div style="font-weight:700;font-size:1.1rem;margin-bottom:12px;color:var(--green);">快手快聘</div>
  451. <div style="line-height:2.2;font-size:0.85rem;">
  452. <div>月活: <span style="color:var(--green);font-weight:700;">2.5亿</span></div>
  453. <div>模式: <span>直播带岗</span></div>
  454. <div>优势: <span>用户渗透率极高</span></div>
  455. <div>劣势: <span style="color:var(--red);">信息审核薄弱</span></div>
  456. </div>
  457. </div>
  458. <div class="card" style="border-left:3px solid var(--blue);">
  459. <div style="font-weight:700;font-size:1.1rem;margin-bottom:12px;color:var(--blue);">BOSS直聘</div>
  460. <div style="line-height:2.2;font-size:0.85rem;">
  461. <div>月活: <span>3,240万</span></div>
  462. <div>模式: <span>算法匹配</span></div>
  463. <div>优势: <span>匹配准确率高69%</span></div>
  464. <div>劣势: <span>情绪获得感不足</span></div>
  465. </div>
  466. </div>
  467. <div class="card" style="border-left:3px solid var(--text-3);">
  468. <div style="font-weight:700;font-size:1.1rem;margin-bottom:12px;">58同城</div>
  469. <div style="line-height:2.2;font-size:0.85rem;">
  470. <div>份额: <span>90%+</span></div>
  471. <div>模式: <span>分类信息聚合</span></div>
  472. <div>优势: <span>传统市场份额大</span></div>
  473. <div>劣势: <span style="color:var(--red);">信息审核差</span></div>
  474. </div>
  475. </div>
  476. </div>
  477. <div class="card">
  478. <div style="font-weight:700;margin-bottom:16px;font-size:1rem;">三平台雷达图对比</div>
  479. ${radarChart()}
  480. </div>
  481. </div>
  482. </section>
  483. <!-- Ch6-2: 快聘战略优势 -->
  484. <section class="report-section" data-slide-num="07" data-tone="orange" id="ch6-2">
  485. <div class="section-inner">
  486. <div class="section-head">
  487. <div class="section-eyebrow" style="color:var(--orange);">CHAPTER 06-2</div>
  488. <h2 class="text-h1">快聘战略优势</h2>
  489. <p class="section-sub">"仅次于电商"的核心逻辑</p>
  490. </div>
  491. <div class="grid grid-3" style="margin-bottom:28px;">
  492. <div class="metric">
  493. <div class="metric-label">日活简历投递</div>
  494. <div class="metric-value" style="color:var(--orange);">数十万</div>
  495. <div class="metric-sub">内部仅次于电商</div>
  496. </div>
  497. <div class="metric">
  498. <div class="metric-label">月度服务求职者</div>
  499. <div class="metric-value" style="color:var(--green);">2.5亿</div>
  500. <div class="metric-sub">人次</div>
  501. </div>
  502. <div class="metric">
  503. <div class="metric-label">2024全年求职线索</div>
  504. <div class="metric-value" style="color:var(--blue);">3.47亿</div>
  505. <div class="metric-sub">次</div>
  506. </div>
  507. </div>
  508. <div class="grid grid-2">
  509. <div class="card card-glow card-accent">
  510. <div style="font-weight:700;margin-bottom:14px;font-size:1rem;">快聘的战略逻辑</div>
  511. <div style="line-height:2.2;font-size:0.88rem;color:var(--text-2);">
  512. <div style="margin-bottom:10px;">
  513. <span style="color:var(--orange);font-weight:600;">● 用户价值层面</span><br/>
  514. <span style="font-size:0.82rem;">求职是蓝领用户的刚性高频需求</span>
  515. </div>
  516. <div style="margin-bottom:10px;">
  517. <span style="color:var(--orange);font-weight:600;">● 市场规模层面</span><br/>
  518. <span style="font-size:0.82rem;">蓝领招聘线上渗透率2025-2026年可达30%</span>
  519. </div>
  520. <div>
  521. <span style="color:var(--orange);font-weight:600;">● 竞争壁垒层面</span><br/>
  522. <span style="font-size:0.82rem;">用户即求职者,无需额外获客</span>
  523. </div>
  524. </div>
  525. </div>
  526. <div class="card card-glow-green">
  527. <div style="font-weight:700;margin-bottom:14px;font-size:1rem;">快聘的四大角色</div>
  528. <div style="line-height:2.2;font-size:0.88rem;color:var(--text-2);">
  529. <div style="margin-bottom:8px;">🌊 <span style="color:var(--green);font-weight:600;">流量入口</span> - 2.5亿月活蓝领用户</div>
  530. <div style="margin-bottom:8px;">📺 <span style="color:var(--green);font-weight:600;">岗位展示</span> - 直播带岗超500万场/年</div>
  531. <div style="margin-bottom:8px;">🤝 <span style="color:var(--green);font-weight:600;">信任建立</span> - "老铁文化"天然适配</div>
  532. <div>⚡ <span style="color:var(--green);font-weight:600;">快速转化</span> - 当天入职不是梦</div>
  533. </div>
  534. </div>
  535. </div>
  536. </div>
  537. </section>
  538. <!-- Ch6-3: 快聘核心劣势 -->
  539. <section class="report-section" data-slide-num="08" data-tone="red" id="ch6-3">
  540. <div class="section-inner">
  541. <div class="section-head">
  542. <div class="section-eyebrow" style="color:var(--red);">CHAPTER 06-3</div>
  543. <h2 class="text-h1">快聘核心劣势与风险</h2>
  544. <p class="section-sub">信任基础设施建设是最大短板</p>
  545. </div>
  546. <div class="grid grid-2">
  547. <div>
  548. <div class="section-eyebrow" style="color:var(--red);margin-bottom:16px;">四大劣势</div>
  549. <div class="card" style="border-left:3px solid var(--red);margin-bottom:14px;">
  550. <div style="font-weight:700;color:var(--red);margin-bottom:8px;">劣势一:信息审核能力不足</div>
  551. <p class="text-sm">对中介主播宣传的招聘信息零审核,导致职位真实性存疑</p>
  552. </div>
  553. <div class="card" style="border-left:3px solid var(--orange);margin-bottom:14px;">
  554. <div style="font-weight:700;color:var(--orange);margin-bottom:8px;">劣势二:B端直招占比低</div>
  555. <p class="text-sm">直播间以劳务中介为主,企业自招较少</p>
  556. </div>
  557. <div class="card" style="border-left:3px solid var(--amber);margin-bottom:14px;">
  558. <div style="font-weight:700;color:var(--amber);margin-bottom:8px;">劣势三:匹配准确率偏低</div>
  559. <p class="text-sm">流量模式来量快,但人岗精准匹配不如算法平台</p>
  560. </div>
  561. <div class="card" style="border-left:3px solid var(--purple);">
  562. <div style="font-weight:700;color:var(--purple);margin-bottom:8px;">劣势四:监管风险加剧</div>
  563. <p class="text-sm">2026年四部门行政指导将快手纳入重点监管范围</p>
  564. </div>
  565. </div>
  566. <div>
  567. <div class="section-eyebrow" style="color:var(--rose);margin-bottom:16px;">风险提示</div>
  568. <div class="card card-glow-rose">
  569. <div style="font-weight:700;margin-bottom:14px;">⚠️ 信任透支风险</div>
  570. <p class="text-sm" style="margin-bottom:12px;">信息审核不足可能导致恶性诈骗事件,严重损害平台公信力。有前科主播借"官方合作"名义招聘事件已暴露出审核机制的漏洞。</p>
  571. <div style="font-weight:700;margin-bottom:14px;margin-top:16px;">⚠️ 竞争加剧风险</div>
  572. <p class="text-sm">BOSS直聘持续加码蓝领招聘治理,58同城积累深厚,蓝领赛道竞争持续白热化。</p>
  573. </div>
  574. </div>
  575. </div>
  576. </div>
  577. </section>
  578. <!-- Ch7-1: 用户关键字 -->
  579. <section class="report-section" data-slide-num="09" data-tone="blue" id="ch7-1">
  580. <div class="section-inner">
  581. <div class="section-head">
  582. <div class="section-eyebrow" style="color:var(--blue);">CHAPTER 07-1</div>
  583. <h2 class="text-h1">用户关注关键字</h2>
  584. <p class="section-sub">跨视频与评论反复出现的关注焦点</p>
  585. </div>
  586. <div class="grid grid-2" style="margin-bottom:28px;">
  587. <div>
  588. <div class="section-eyebrow" style="color:var(--red);margin-bottom:16px;">风险类关键字(热度排行)</div>
  589. ${barChart(riskSignals.slice(0,6).map(k=>({label:k.label,value:k.heat,color:k.color})),'#EF4444')}
  590. </div>
  591. <div>
  592. <div class="section-eyebrow" style="color:var(--green);margin-bottom:16px;">保障类关键字(热度排行)</div>
  593. ${barChart(careFactors.slice(0,6).map(k=>({label:k.label,value:k.heat,color:k.color})),'#00DC82')}
  594. </div>
  595. </div>
  596. </div>
  597. </section>
  598. <!-- Ch7-2: 平台渗透数据 -->
  599. <section class="report-section" data-slide-num="10" data-tone="purple" id="ch7-2">
  600. <div class="section-inner">
  601. <div class="section-head">
  602. <div class="section-eyebrow" style="color:var(--purple);">CHAPTER 07-2</div>
  603. <h2 class="text-h1">"10个蓝领,9个都用快手"</h2>
  604. <p class="section-sub">快手平台蓝领渗透率验证</p>
  605. </div>
  606. <div class="grid grid-4" style="margin-bottom:28px;">
  607. <div class="metric">
  608. <div class="metric-label">平台蓝领用户</div>
  609. <div class="metric-value" style="color:var(--green);">2.5亿</div>
  610. <div class="metric-sub">约占蓝领总量4亿的62.5%</div>
  611. </div>
  612. <div class="metric">
  613. <div class="metric-label">平台总月活</div>
  614. <div class="metric-value">7亿</div>
  615. <div class="metric-sub">蓝领占比约35.7%</div>
  616. </div>
  617. <div class="metric">
  618. <div class="metric-label">专职带岗主播</div>
  619. <div class="metric-value" style="color:var(--amber);">40万+</div>
  620. <div class="metric-sub">2024年底数据</div>
  621. </div>
  622. <div class="metric">
  623. <div class="metric-label">入驻用人单位</div>
  624. <div class="metric-value" style="color:var(--blue);">24万</div>
  625. <div class="metric-sub">累计数据</div>
  626. </div>
  627. </div>
  628. <div class="card card-glow-green">
  629. <div style="font-weight:700;margin-bottom:14px;font-size:1rem;">关键结论</div>
  630. <p class="text-body">快手不是单纯的内容平台,在蓝领求职链路里已经具备"种草 + 筛选 + 询单 + 转化"的复合职能。"直播带岗""当天入职""包吃包住"说明用户并不只想看岗位信息,而是希望快速判断机会真假、成本高低和落地效率。</p>
  631. </div>
  632. </div>
  633. </section>
  634. <!-- Ch8-1: 高赞评论 -->
  635. <section class="report-section" data-slide-num="11" data-tone="rose" id="ch8-1">
  636. <div class="section-inner">
  637. <div class="section-head">
  638. <div class="section-eyebrow" style="color:var(--rose);">CHAPTER 08-1</div>
  639. <h2 class="text-h1">VOC 高赞精选 TOP10</h2>
  640. <p class="section-sub">真实用户声音</p>
  641. </div>
  642. <div class="grid grid-2">
  643. ${highLikedComments.slice(0,5).map(c=>voiceCard(c,true)).join('')}
  644. </div>
  645. </div>
  646. </section>
  647. <!-- Ch8-2: 更多高赞 -->
  648. <section class="report-section" data-slide-num="12" data-tone="orange" id="ch8-2">
  649. <div class="section-inner">
  650. <div class="section-head">
  651. <div class="section-eyebrow" style="color:var(--orange);">CHAPTER 08-2</div>
  652. <h2 class="text-h1">VOC 高赞精选 6-10</h2>
  653. <p class="section-sub">真实用户声音</p>
  654. </div>
  655. <div class="grid grid-2">
  656. ${highLikedComments.slice(5).map(c=>voiceCard(c,false)).join('')}
  657. </div>
  658. </div>
  659. </section>
  660. <!-- Ch8-3: 洞察总结 -->
  661. <section class="report-section" data-slide-num="13" data-tone="amber" id="ch8-3">
  662. <div class="section-inner">
  663. <div class="section-head">
  664. <div class="section-eyebrow">CHAPTER 08-3</div>
  665. <h2 class="text-h1">核心洞察总结</h2>
  666. <p class="section-sub">可直接引用的关键结论</p>
  667. </div>
  668. <div class="grid grid-2">
  669. <div class="card card-glow card-accent">
  670. <div style="font-weight:700;margin-bottom:16px;font-size:1rem;">核心发现</div>
  671. <div style="line-height:2;font-size:0.88rem;color:var(--text-2);">
  672. <div style="margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--border);">
  673. <span style="color:var(--red);font-weight:600;">最强焦虑</span><br/>
  674. 不是"工资低",而是"信息不真实、被骗、被坑、押金不退、工资被克扣"
  675. </div>
  676. <div style="margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid var(--border);">
  677. <span style="color:var(--green);font-weight:600;">最强购买点</span><br/>
  678. 不是抽象品牌心智,而是"工资真实、发薪稳定、包吃包住、当天入职、流程简单"
  679. </div>
  680. <div>
  681. <span style="color:var(--purple);font-weight:600;">情绪价值核心</span><br/>
  682. 不是娱乐,而是"确定性":靠谱、真实、放心、少踩坑、能尽快安顿
  683. </div>
  684. </div>
  685. </div>
  686. <div class="card card-glow-green">
  687. <div style="font-weight:700;margin-bottom:16px;font-size:1rem;">战略建议</div>
  688. <div style="line-height:2;font-size:0.88rem;color:var(--text-2);">
  689. <div style="margin-bottom:8px;">1. <span style="color:var(--amber);font-weight:600;">建立分级审核体系</span><br/><span class="text-xs">参照BOSS直聘经验,对大主播实行更审慎审核</span></div>
  690. <div style="margin-bottom:8px;">2. <span style="color:var(--amber);font-weight:600;">强化信任基建</span><br/><span class="text-xs">建立招聘方信用评级和黑名单机制</span></div>
  691. <div style="margin-bottom:8px;">3. <span style="color:var(--amber);font-weight:600;">深化企业直招</span><br/><span class="text-xs">减少对中介依赖,提高B端直招占比</span></div>
  692. <div>4. <span style="color:var(--amber);font-weight:600;">放大"眼见为实"</span><br/><span class="text-xs">将车间/宿舍/食堂直播打造为标准化招聘流程</span></div>
  693. </div>
  694. </div>
  695. </div>
  696. </div>
  697. </section>
  698. </main>
  699. <footer class="footer">
  700. <div>快手快聘 · VOC 深度洞察报告</div>
  701. <div style="margin-top:8px;">数据来源:快手评论采集 · 7,902 条真实VOC · 19 个关键词 · 380 个视频</div>
  702. <div style="margin-top:4px;">Generated by OpenClaw · 2026/4/24</div>
  703. </footer>
  704. <script>
  705. const obs=new IntersectionObserver(s=>s.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in-view')}}},{threshold:0.3});
  706. document.querySelectorAll('section.report-section').forEach(s=>obs.observe(s));
  707. document.querySelectorAll('.card').forEach(c=>{c.addEventListener('mouseenter',()=>{document.body.style.setProperty('--amb-x',(Math.random()*30+10)+'%');document.body.style.setProperty('--amb-y',(Math.random()*30+10)+'%')})});
  708. </script>
  709. </body>
  710. </html>`;
  711. fs.writeFileSync(OUT_FILE, html, 'utf8');
  712. console.log('✅ 增强版深色风格报告已生成: ' + OUT_FILE);
  713. console.log(' VOC数据: 7,902 条 | 关键词: 19 个 | 视频: 380 个 | 章节: 13 个');