test-report-home-fragrance.html 79 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1.0">
  6. <title>香薰家居行业竞品与B端线索分析报告</title>
  7. <!-- ===== Chart.js CDN ===== -->
  8. <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
  9. <style>
  10. /* ============================================================
  11. 全局变量 & 色彩体系 — 轻奢深棕 + 暖金莫兰迪
  12. ============================================================ */
  13. :root{
  14. --bg-deep:#1A110B;
  15. --bg-dark:#2D1810;
  16. --bg-mid:#3E2518;
  17. --brown:#5C3D2E;
  18. --brown-light:#8B6F47;
  19. --gold:#C5A55A;
  20. --gold-light:#D4B978;
  21. --cream:#FFF8F0;
  22. --cream-dim:#F5E6D3;
  23. --accent-rose:#C4868B;
  24. --accent-sage:#8FA68A;
  25. --accent-blue:#7E9BB5;
  26. --glass:rgba(255,248,240,0.06);
  27. --glass-border:rgba(197,165,90,0.18);
  28. --glass-hover:rgba(255,248,240,0.12);
  29. --shadow:0 8px 32px rgba(0,0,0,0.35);
  30. --radius:16px;
  31. --transition:all .4s cubic-bezier(.4,0,.2,1);
  32. --font:'Segoe UI','PingFang SC','Microsoft YaHei','Helvetica Neue',system-ui,sans-serif;
  33. }
  34. /* ============================================================
  35. Reset & 基础排版
  36. ============================================================ */
  37. *,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
  38. html{font-size:16px;scroll-behavior:smooth;overflow:hidden}
  39. body{font-family:var(--font);background:var(--bg-deep);color:var(--cream);line-height:1.7;overflow:hidden;-webkit-font-smoothing:antialiased}
  40. h1{font-size:clamp(2rem,5vw,3.6rem);font-weight:800;letter-spacing:-.02em;line-height:1.15}
  41. h2{font-size:clamp(1.5rem,3.5vw,2.4rem);font-weight:700;letter-spacing:-.01em}
  42. h3{font-size:clamp(1.1rem,2vw,1.5rem);font-weight:600}
  43. a{color:var(--gold);text-decoration:none}
  44. /* ============================================================
  45. 幻灯片容器
  46. ============================================================ */
  47. #slides-wrapper{position:relative;width:100vw;height:100vh;overflow:hidden}
  48. .slide{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:clamp(24px,4vw,60px);opacity:0;visibility:hidden;transform:translateY(30px);transition:opacity .7s ease,transform .7s ease,visibility 0s .7s;z-index:0;overflow-y:auto}
  49. .slide.active{opacity:1;visibility:visible;transform:translateY(0);transition:opacity .7s ease,transform .7s ease,visibility 0s 0s;z-index:1}
  50. .slide-inner{width:100%;max-width:1200px;position:relative}
  51. /* ============================================================
  52. 页眉 & 页脚
  53. ============================================================ */
  54. .slide-header{position:absolute;top:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;padding:18px clamp(24px,4vw,60px);font-size:.8rem;color:var(--brown-light);letter-spacing:.05em;z-index:10;pointer-events:none}
  55. .slide-footer{position:absolute;bottom:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;padding:14px clamp(24px,4vw,60px);font-size:.75rem;color:rgba(139,111,71,.6);z-index:10;pointer-events:none}
  56. .page-num{font-weight:600;color:var(--gold)}
  57. /* ============================================================
  58. 毛玻璃卡片(Glassmorphism)
  59. ============================================================ */
  60. .glass-card{background:var(--glass);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--glass-border);border-radius:var(--radius);padding:clamp(18px,2.5vw,32px);transition:var(--transition);position:relative;overflow:hidden}
  61. .glass-card::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(197,165,90,.08) 0%,transparent 60%);pointer-events:none;border-radius:inherit}
  62. .glass-card:hover{background:var(--glass-hover);border-color:rgba(197,165,90,.35);transform:translateY(-2px);box-shadow:var(--shadow)}
  63. /* ============================================================
  64. 数据指标卡片
  65. ============================================================ */
  66. .metric-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:clamp(12px,2vw,24px);width:100%}
  67. .metric-card{text-align:center;padding:clamp(16px,2vw,28px)}
  68. .metric-value{font-size:clamp(1.8rem,4vw,2.8rem);font-weight:800;color:var(--gold);margin-bottom:4px}
  69. .metric-label{font-size:.85rem;color:var(--cream-dim);font-weight:400}
  70. .metric-sub{font-size:.75rem;color:var(--brown-light);margin-top:2px}
  71. /* ============================================================
  72. 数据表格
  73. ============================================================ */
  74. .data-table{width:100%;border-collapse:separate;border-spacing:0;font-size:clamp(.75rem,1.4vw,.9rem)}
  75. .data-table thead th{background:rgba(197,165,90,.15);color:var(--gold-light);font-weight:600;padding:12px 14px;text-align:left;border-bottom:2px solid var(--gold);white-space:nowrap}
  76. .data-table thead th:first-child{border-radius:var(--radius) 0 0 0}
  77. .data-table thead th:last-child{border-radius:0 var(--radius) 0 0}
  78. .data-table tbody td{padding:10px 14px;border-bottom:1px solid rgba(139,111,71,.15);transition:background .3s}
  79. .data-table tbody tr:hover td{background:rgba(197,165,90,.06)}
  80. .data-table tbody tr:last-child td:first-child{border-radius:0 0 0 var(--radius)}
  81. .data-table tbody tr:last-child td:last-child{border-radius:0 0 var(--radius) 0}
  82. /* ============================================================
  83. 标签 / 徽章
  84. ============================================================ */
  85. .badge{display:inline-block;padding:3px 10px;border-radius:20px;font-size:.72rem;font-weight:600;letter-spacing:.03em}
  86. .badge-gold{background:rgba(197,165,90,.2);color:var(--gold-light);border:1px solid rgba(197,165,90,.3)}
  87. .badge-rose{background:rgba(196,134,139,.15);color:var(--accent-rose);border:1px solid rgba(196,134,139,.25)}
  88. .badge-sage{background:rgba(143,166,138,.15);color:var(--accent-sage);border:1px solid rgba(143,166,138,.25)}
  89. .badge-blue{background:rgba(126,155,181,.15);color:var(--accent-blue);border:1px solid rgba(126,155,181,.25)}
  90. /* ============================================================
  91. 进度条 / 比例条
  92. ============================================================ */
  93. .bar-row{display:flex;align-items:center;gap:12px;margin-bottom:10px}
  94. .bar-label{min-width:140px;font-size:.82rem;text-align:right;color:var(--cream-dim)}
  95. .bar-track{flex:1;height:22px;background:rgba(255,248,240,.06);border-radius:11px;overflow:hidden;position:relative}
  96. .bar-fill{height:100%;border-radius:11px;transition:width 1.5s cubic-bezier(.4,0,.2,1);position:relative}
  97. .bar-fill::after{content:attr(data-value);position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:.7rem;font-weight:700;color:var(--bg-dark)}
  98. /* ============================================================
  99. 侧边导航
  100. ============================================================ */
  101. #side-nav{position:fixed;right:clamp(10px,2vw,24px);top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:12px;z-index:1000}
  102. .nav-dot{width:12px;height:12px;border-radius:50%;border:2px solid var(--brown-light);background:transparent;cursor:pointer;transition:var(--transition);position:relative}
  103. .nav-dot.active{background:var(--gold);border-color:var(--gold);box-shadow:0 0 12px rgba(197,165,90,.5)}
  104. .nav-dot::after{content:attr(data-tip);position:absolute;right:22px;top:50%;transform:translateY(-50%);background:var(--bg-mid);color:var(--cream);padding:4px 12px;border-radius:8px;font-size:.72rem;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .3s}
  105. .nav-dot:hover::after{opacity:1}
  106. /* ============================================================
  107. 全屏按钮
  108. ============================================================ */
  109. #fs-btn{position:fixed;top:18px;right:clamp(10px,2vw,24px);z-index:1001;background:var(--glass);backdrop-filter:blur(10px);border:1px solid var(--glass-border);color:var(--gold);padding:6px 14px;border-radius:8px;cursor:pointer;font-size:.78rem;transition:var(--transition)}
  110. #fs-btn:hover{background:var(--glass-hover);border-color:var(--gold)}
  111. /* ============================================================
  112. 封面粒子画布
  113. ============================================================ */
  114. #particles-canvas{position:absolute;inset:0;z-index:0;pointer-events:none}
  115. /* ============================================================
  116. 图表容器
  117. ============================================================ */
  118. .chart-wrap{position:relative;width:100%;max-height:320px;margin:12px 0}
  119. .chart-wrap canvas{max-height:320px}
  120. /* ============================================================
  121. 两栏/三栏布局
  122. ============================================================ */
  123. .cols-2{display:grid;grid-template-columns:1fr 1fr;gap:clamp(14px,2vw,28px)}
  124. .cols-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:clamp(14px,2vw,24px)}
  125. /* ============================================================
  126. 分隔线 & 间距工具
  127. ============================================================ */
  128. .divider{width:60px;height:3px;background:linear-gradient(90deg,var(--gold),transparent);border-radius:2px;margin:16px 0}
  129. .mt-sm{margin-top:12px}.mt-md{margin-top:24px}.mt-lg{margin-top:36px}
  130. .mb-sm{margin-bottom:12px}.mb-md{margin-bottom:24px}
  131. .text-gold{color:var(--gold)}.text-rose{color:var(--accent-rose)}.text-sage{color:var(--accent-sage)}.text-blue{color:var(--accent-blue)}
  132. .text-dim{color:var(--brown-light)}.text-sm{font-size:.82rem}.text-xs{font-size:.72rem}
  133. .fw-700{font-weight:700}.fw-600{font-weight:600}
  134. /* ============================================================
  135. 封面页特殊样式
  136. ============================================================ */
  137. .cover-content{position:relative;z-index:1;text-align:center}
  138. .cover-brand{font-size:clamp(.9rem,1.8vw,1.2rem);color:var(--gold);letter-spacing:.3em;text-transform:uppercase;margin-bottom:16px;font-weight:600}
  139. .cover-title{background:linear-gradient(135deg,var(--cream) 0%,var(--gold-light) 50%,var(--gold) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:20px}
  140. .cover-sub{font-size:clamp(.9rem,1.6vw,1.15rem);color:var(--cream-dim);max-width:640px;margin:0 auto 32px}
  141. .cover-date{font-size:.85rem;color:var(--brown-light);letter-spacing:.1em}
  142. .cover-line{width:80px;height:1px;background:var(--gold);margin:24px auto}
  143. /* ============================================================
  144. 目录页
  145. ============================================================ */
  146. .toc-list{list-style:none;counter-reset:toc}
  147. .toc-item{counter-increment:toc;padding:14px 20px;border-bottom:1px solid rgba(139,111,71,.12);cursor:pointer;display:flex;align-items:center;gap:16px;transition:var(--transition);border-radius:8px}
  148. .toc-item:hover{background:var(--glass-hover);padding-left:28px}
  149. .toc-item::before{content:counter(toc,decimal-leading-zero);font-size:1.6rem;font-weight:800;color:var(--gold);min-width:40px}
  150. .toc-item .toc-title{font-size:1.05rem;font-weight:600;color:var(--cream)}
  151. .toc-item .toc-desc{font-size:.78rem;color:var(--brown-light);margin-top:2px}
  152. /* ============================================================
  153. 竞品卡片
  154. ============================================================ */
  155. .competitor-card{padding:clamp(18px,2vw,28px)}
  156. .competitor-card h3{color:var(--gold-light);margin-bottom:8px}
  157. .comp-stat{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid rgba(139,111,71,.1);font-size:.85rem}
  158. /* ============================================================
  159. 时间轴
  160. ============================================================ */
  161. .timeline{position:relative;padding-left:28px}
  162. .timeline::before{content:'';position:absolute;left:8px;top:0;bottom:0;width:2px;background:linear-gradient(180deg,var(--gold),var(--brown-light),transparent)}
  163. .timeline-item{position:relative;margin-bottom:24px;padding-left:20px}
  164. .timeline-item::before{content:'';position:absolute;left:-24px;top:6px;width:12px;height:12px;border-radius:50%;background:var(--gold);border:2px solid var(--bg-dark);box-shadow:0 0 8px rgba(197,165,90,.4)}
  165. .timeline-item h4{color:var(--gold-light);font-size:.95rem;margin-bottom:4px}
  166. .timeline-item p{font-size:.82rem;color:var(--cream-dim)}
  167. /* ============================================================
  168. VOC 痛点条
  169. ============================================================ */
  170. .pain-bar{display:flex;align-items:center;gap:12px;margin-bottom:14px}
  171. .pain-icon{font-size:1.1rem;min-width:24px;text-align:center}
  172. .pain-info{flex:1}
  173. .pain-name{font-size:.85rem;font-weight:600;color:var(--cream);margin-bottom:3px}
  174. .pain-pct{font-size:.75rem;color:var(--brown-light)}
  175. .pain-track{width:100%;height:8px;background:rgba(255,248,240,.06);border-radius:4px;overflow:hidden}
  176. .pain-fill{height:100%;border-radius:4px;transition:width 1.5s ease}
  177. /* ============================================================
  178. 动画关键帧
  179. ============================================================ */
  180. @keyframes fadeInUp{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
  181. @keyframes fadeIn{from{opacity:0}to{opacity:1}}
  182. @keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
  183. @keyframes pulse{0%,100%{opacity:1}50%{opacity:.6}}
  184. .anim-up{animation:fadeInUp .8s ease both}
  185. .anim-delay-1{animation-delay:.15s}.anim-delay-2{animation-delay:.3s}.anim-delay-3{animation-delay:.45s}.anim-delay-4{animation-delay:.6s}
  186. /* 入场动画 */
  187. .anim-enter{opacity:0;transform:translateY(24px);transition:opacity .7s ease,transform .7s ease}
  188. .slide.active .anim-enter{opacity:1;transform:translateY(0)}
  189. .slide.active .anim-enter.d1{transition-delay:.1s}
  190. .slide.active .anim-enter.d2{transition-delay:.2s}
  191. .slide.active .anim-enter.d3{transition-delay:.3s}
  192. .slide.active .anim-enter.d4{transition-delay:.4s}
  193. .slide.active .anim-enter.d5{transition-delay:.5s}
  194. .slide.active .anim-enter.d6{transition-delay:.6s}
  195. /* ============================================================
  196. Modal弹窗
  197. ============================================================ */
  198. .modal-overlay{position:fixed;inset:0;background:rgba(10,6,3,.85);backdrop-filter:blur(12px);z-index:2000;display:none;align-items:center;justify-content:center;opacity:0;transition:opacity .4s ease}
  199. .modal-overlay.show{display:flex;opacity:1}
  200. .modal-box{background:linear-gradient(135deg,#1a110b,#0d0a08);border:1px solid rgba(197,165,90,.25);border-radius:16px;width:92vw;max-width:960px;max-height:88vh;overflow-y:auto;box-shadow:0 8px 48px rgba(0,0,0,.7);position:relative;animation:modalIn .4s ease}
  201. @keyframes modalIn{from{opacity:0;transform:translateY(30px) scale(.96)}to{opacity:1;transform:translateY(0) scale(1)}}
  202. .modal-close{position:absolute;top:12px;right:16px;background:none;border:none;color:var(--cream-dim);font-size:1.4rem;cursor:pointer;z-index:10;transition:color .3s}
  203. .modal-close:hover{color:var(--gold)}
  204. .modal-header{padding:24px 28px 16px;border-bottom:1px solid rgba(197,165,90,.15)}
  205. .modal-header h2{font-size:1.15rem;color:var(--gold);margin:0 0 6px}
  206. .modal-header p{font-size:.8rem;color:var(--cream-dim);margin:0}
  207. .modal-body{padding:20px 28px 28px}
  208. /* ============================================================
  209. 响应式
  210. ============================================================ */
  211. @media(max-width:900px){
  212. .cols-2,.cols-3{grid-template-columns:1fr}
  213. .metric-grid{grid-template-columns:repeat(2,1fr)}
  214. #side-nav{right:6px;gap:8px}
  215. .nav-dot{width:9px;height:9px}
  216. .bar-label{min-width:100px;font-size:.75rem}
  217. }
  218. @media(max-width:600px){
  219. .metric-grid{grid-template-columns:1fr}
  220. .slide{padding:16px}
  221. }
  222. </style>
  223. </head>
  224. <body>
  225. <!-- ===== 全屏按钮 ===== -->
  226. <button id="fs-btn" title="全屏切换">⛶ 全屏</button>
  227. <!-- ===== 侧边导航(由 JS 自动生成) ===== -->
  228. <nav id="side-nav"></nav>
  229. <!-- ===== 幻灯片容器 ===== -->
  230. <div id="slides-wrapper">
  231. <!-- ════════════════════════════════════════════
  232. SLIDE 0 — 封面
  233. ════════════════════════════════════════════ -->
  234. <section class="slide active" id="slide-0">
  235. <canvas id="particles-canvas"></canvas>
  236. <div class="cover-content">
  237. <p class="cover-brand">HOME FRAGRANCE</p>
  238. <h1 class="cover-title">香薰家居行业竞品与<br>B端线索分析报告</h1>
  239. <div class="cover-line"></div>
  240. <p class="cover-sub">基于Amazon电商数据 · TikTok/Instagram社媒数据 · 4,200条用户评论VOC分析<br>覆盖4大核心品类 · 4大竞品品牌深度对标</p>
  241. <p class="cover-date">2026年3月 · AI Data Intelligence</p>
  242. </div>
  243. <div class="slide-footer"><span></span><span class="text-xs" style="opacity:.4">按 → 或滚轮翻页</span></div>
  244. </section>
  245. <!-- ════════════════════════════════════════════
  246. SLIDE 1 — 目录
  247. ════════════════════════════════════════════ -->
  248. <section class="slide" id="slide-1">
  249. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>目录</span></div>
  250. <div class="slide-inner" style="max-width:720px">
  251. <h2 class="text-gold mb-md" style="text-align:center">报告目录</h2>
  252. <div class="divider" style="margin:0 auto 28px"></div>
  253. <ul class="toc-list">
  254. <li class="toc-item" onclick="goSlide(2)"><div><div class="toc-title">核心执行摘要</div><div class="toc-desc">关键数据 · 核心结论 · 核心价值</div></div></li>
  255. <li class="toc-item" onclick="goSlide(3)"><div><div class="toc-title">香薰家居品类市场全景分析</div><div class="toc-desc">4大品类规模 · 增长趋势 · 价格带 · 品牌分布</div></div></li>
  256. <li class="toc-item" onclick="goSlide(4)"><div><div class="toc-title">核心竞品深度对标分析</div><div class="toc-desc">NEST New York · Paddywax · Vitruvi · P.F. Candle Co. 品牌拆解</div></div></li>
  257. <li class="toc-item" onclick="goSlide(5)"><div><div class="toc-title">全渠道用户VOC与需求洞察</div><div class="toc-desc">4,200条评论 · 痛点 · 喜爱点 · 使用场景</div></div></li>
  258. <li class="toc-item" onclick="goSlide(6)"><div><div class="toc-title">B端高价值线索与品类矩阵</div><div class="toc-desc">品类机会评估 · 社媒热度 · 优先级排序</div></div></li>
  259. <li class="toc-item" onclick="goSlide(7)"><div><div class="toc-title">市场拓展与落地执行建议</div><div class="toc-desc">短期·中期·长期分阶段策略</div></div></li>
  260. <li class="toc-item" onclick="goSlide(8)"><div><div class="toc-title">总结与展望</div><div class="toc-desc">核心机会点 · 行动优先级</div></div></li>
  261. </ul>
  262. </div>
  263. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">01</span></div>
  264. </section>
  265. <!-- ════════════════════════════════════════════
  266. SLIDE 2 — 执行摘要
  267. ════════════════════════════════════════════ -->
  268. <section class="slide" id="slide-2">
  269. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>执行摘要</span></div>
  270. <div class="slide-inner">
  271. <h2 class="text-gold mb-sm">核心执行摘要</h2>
  272. <div class="divider"></div>
  273. <!-- 核心数据指标卡片 — 由 REPORT_DATA.metrics 注入 -->
  274. <div class="metric-grid mt-md mb-md" id="exec-metrics"></div>
  275. <!-- 核心结论 — 由 REPORT_DATA.coreFindings / coreValues 注入 -->
  276. <div class="cols-2">
  277. <div class="glass-card">
  278. <h3 class="text-gold mb-sm">📊 核心发现</h3>
  279. <ul id="core-findings" style="list-style:none;font-size:.85rem;color:var(--cream-dim)"></ul>
  280. </div>
  281. <div class="glass-card">
  282. <h3 class="text-gold mb-sm">💡 核心价值</h3>
  283. <ul id="core-values" style="list-style:none;font-size:.85rem;color:var(--cream-dim)"></ul>
  284. </div>
  285. </div>
  286. </div>
  287. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">02</span></div>
  288. </section>
  289. <!-- ════════════════════════════════════════════
  290. SLIDE 3 — 市场全景
  291. ════════════════════════════════════════════ -->
  292. <section class="slide" id="slide-3">
  293. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>市场全景</span></div>
  294. <div class="slide-inner">
  295. <h2 class="text-gold mb-sm">香薰家居品类市场全景分析</h2>
  296. <div class="divider mb-md"></div>
  297. <div class="cols-2">
  298. <div class="glass-card">
  299. <h3 class="text-sm fw-600 mb-sm">Top100 周均销售额(美元)</h3>
  300. <div class="chart-wrap"><canvas id="chart-revenue"></canvas></div>
  301. </div>
  302. <div class="glass-card">
  303. <h3 class="text-sm fw-600 mb-sm">品类增长率(同比)</h3>
  304. <div class="chart-wrap"><canvas id="chart-growth"></canvas></div>
  305. </div>
  306. </div>
  307. <!-- 数据表格 — 由 REPORT_DATA.categoryTable 注入 -->
  308. <div class="glass-card mt-md" style="overflow-x:auto">
  309. <table class="data-table">
  310. <thead><tr>
  311. <th>品类</th><th>周均销量</th><th>周均销售额</th><th>均价</th><th>品牌数</th><th>增长率</th><th>中国卖家</th>
  312. </tr></thead>
  313. <tbody id="market-table-body"></tbody>
  314. </table>
  315. </div>
  316. </div>
  317. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">03</span></div>
  318. </section>
  319. <!-- ════════════════════════════════════════════
  320. SLIDE 4 — 竞品对标
  321. ════════════════════════════════════════════ -->
  322. <section class="slide" id="slide-4">
  323. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>竞品对标</span></div>
  324. <div class="slide-inner">
  325. <h2 class="text-gold mb-sm">核心竞品深度对标分析</h2>
  326. <div class="divider mb-md"></div>
  327. <!-- 竞品卡片 — 由 REPORT_DATA.competitors 注入 -->
  328. <div class="cols-3" id="competitor-cards"></div>
  329. <!-- 雷达图 -->
  330. <div class="glass-card mt-md" style="max-width:480px;margin-left:auto;margin-right:auto">
  331. <h3 class="text-sm fw-600 mb-sm" style="text-align:center">竞品综合能力雷达图</h3>
  332. <div class="chart-wrap" style="max-height:260px"><canvas id="chart-radar"></canvas></div>
  333. </div>
  334. </div>
  335. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">04</span></div>
  336. </section>
  337. <!-- ════════════════════════════════════════════
  338. SLIDE 5 — VOC 用户洞察
  339. ════════════════════════════════════════════ -->
  340. <section class="slide" id="slide-5">
  341. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>用户VOC</span></div>
  342. <div class="slide-inner">
  343. <h2 class="text-gold mb-sm">全渠道用户VOC与需求洞察</h2>
  344. <p class="text-dim text-sm mb-md">基于品类 Top 畅销产品 <strong class="text-gold" id="voc-review-count">0</strong> 条真实用户评论深度分析</p>
  345. <div class="cols-2">
  346. <!-- 左:痛点分析 -->
  347. <div class="glass-card">
  348. <h3 class="text-rose text-sm fw-600 mb-sm">🔴 用户核心痛点(差评Top5)</h3>
  349. <div id="pain-points-container"></div>
  350. </div>
  351. <!-- 右:喜爱点 + 场景 -->
  352. <div>
  353. <div class="glass-card mb-sm">
  354. <h3 class="text-sage text-sm fw-600 mb-sm">🟢 用户最爱亮点(好评Top5)</h3>
  355. <div id="highlights-container"></div>
  356. </div>
  357. <div class="glass-card">
  358. <h3 class="text-sm fw-600 mb-sm">📍 使用场景分布</h3>
  359. <div class="chart-wrap" style="max-height:180px"><canvas id="chart-scenes"></canvas></div>
  360. </div>
  361. </div>
  362. </div>
  363. </div>
  364. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">05</span></div>
  365. </section>
  366. <!-- ════════════════════════════════════════════
  367. SLIDE 6 — B端线索 & 品类矩阵
  368. ════════════════════════════════════════════ -->
  369. <section class="slide" id="slide-6">
  370. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>线索清单</span></div>
  371. <div class="slide-inner">
  372. <h2 class="text-gold mb-sm">B端高价值线索与品类机会矩阵</h2>
  373. <div class="divider mb-md"></div>
  374. <!-- 品类机会矩阵 — 由 REPORT_DATA.categoryMatrix 注入 -->
  375. <div class="glass-card mb-md" style="overflow-x:auto">
  376. <h3 class="text-sm fw-600 mb-sm">品类综合机会评估</h3>
  377. <table class="data-table">
  378. <thead><tr><th>品类</th><th>市场规模</th><th>增长性</th><th>社媒热度</th><th>竞争强度</th><th>中国卖家</th><th>综合推荐</th></tr></thead>
  379. <tbody id="matrix-table-body"></tbody>
  380. </table>
  381. </div>
  382. <div class="cols-2">
  383. <div class="glass-card">
  384. <h3 class="text-sm fw-600 mb-sm">TikTok 社媒热度排名</h3>
  385. <div class="chart-wrap"><canvas id="chart-tiktok"></canvas></div>
  386. </div>
  387. <div class="glass-card">
  388. <h3 class="text-sm fw-600 mb-sm">季节性与要点</h3>
  389. <div id="seasonality-notes" style="font-size:.85rem;color:var(--cream-dim)"></div>
  390. </div>
  391. </div>
  392. </div>
  393. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">06</span></div>
  394. </section>
  395. <!-- ════════════════════════════════════════════
  396. SLIDE 7 — 执行策略
  397. ════════════════════════════════════════════ -->
  398. <section class="slide" id="slide-7">
  399. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>执行策略</span></div>
  400. <div class="slide-inner">
  401. <h2 class="text-gold mb-sm">市场拓展与落地执行建议</h2>
  402. <div class="divider mb-md"></div>
  403. <!-- 短中长期策略 — 由 REPORT_DATA.strategy 注入 -->
  404. <div class="cols-3" id="strategy-columns"></div>
  405. <!-- VOC驱动的产品策略 -->
  406. <div class="glass-card mt-md">
  407. <h3 class="text-sm fw-600 mb-sm">🔬 VOC驱动的产品开发优先级</h3>
  408. <div id="voc-priorities" style="display:flex;flex-wrap:wrap;gap:12px;font-size:.82rem"></div>
  409. </div>
  410. </div>
  411. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">07</span></div>
  412. </section>
  413. <!-- ════════════════════════════════════════════
  414. SLIDE 8 — 总结与展望
  415. ════════════════════════════════════════════ -->
  416. <section class="slide" id="slide-8">
  417. <div class="slide-header"><span>香薰家居行业竞品分析报告</span><span>总结展望</span></div>
  418. <div class="slide-inner" style="max-width:900px">
  419. <h2 class="text-gold mb-sm" style="text-align:center">总结与展望</h2>
  420. <div class="divider" style="margin:0 auto 32px"></div>
  421. <!-- 由 REPORT_DATA.conclusion 注入 -->
  422. <div class="cols-2 mb-md" id="conclusion-top-cards"></div>
  423. <div class="glass-card mb-md" id="conclusion-differentiator" style="text-align:center;padding:28px"></div>
  424. <div class="glass-card" id="conclusion-actions" style="background:linear-gradient(135deg,rgba(197,165,90,.1),rgba(143,166,138,.08));border-color:rgba(197,165,90,.25)"></div>
  425. </div>
  426. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">08</span></div>
  427. </section>
  428. <!-- ════════════════════════════════════════════
  429. SLIDE 9 — 致谢
  430. ════════════════════════════════════════════ -->
  431. <section class="slide" id="slide-9">
  432. <div class="cover-content">
  433. <div class="cover-line" style="margin-bottom:32px"></div>
  434. <h2 style="font-size:clamp(1.6rem,3.5vw,2.6rem);background:linear-gradient(135deg,var(--cream),var(--gold-light));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;margin-bottom:16px">感谢您的关注</h2>
  435. <p class="text-dim" style="font-size:1rem;max-width:520px;margin:0 auto 28px">期待与您携手,用AI-VOC系统共同开拓香薰家居市场新蓝海</p>
  436. <div class="cover-line"></div>
  437. <div style="margin-top:32px;font-size:.85rem;color:var(--brown-light)">
  438. <p>报告编制:AI-VOC 智能数据分析系统</p>
  439. <p>数据来源:Amazon Sorftime API · TikHub (TikTok & Instagram) · AI-VOC Engine</p>
  440. <p>数据时效:截至 2026年3月</p>
  441. <p style="margin-top:16px;font-size:.82rem;color:var(--gold)">📧 联系我们,获取专属VOC系统试用</p>
  442. <p style="margin-top:12px;font-size:.75rem;opacity:.6">本报告数据来自第三方API,仅供商业决策参考</p>
  443. </div>
  444. </div>
  445. <div class="slide-footer"><span>香薰家居行业竞品分析报告</span><span class="page-num">09</span></div>
  446. </section>
  447. </div><!-- /slides-wrapper -->
  448. <!-- ===== Modal弹窗容器 ===== -->
  449. <div class="modal-overlay" id="modal-overlay">
  450. <div class="modal-box">
  451. <button class="modal-close" id="modal-close">&times;</button>
  452. <div class="modal-header" id="modal-header"></div>
  453. <div class="modal-body" id="modal-body"></div>
  454. </div>
  455. </div>
  456. <!-- ============================================================
  457. REPORT DATA — 由编排引擎注入
  458. ============================================================ -->
  459. <script>
  460. /**
  461. * REPORT_DATA: 所有报告数据由 workflow Stage 7 组装后注入到此对象。
  462. * 模板中所有 DOM 操作均基于此数据驱动渲染。
  463. *
  464. * 结构说明:
  465. * - meta: 报告元信息
  466. * - metrics: 执行摘要指标卡片 [{value, prefix, suffix, label, sub}]
  467. * - coreFindings: 核心发现列表 [{text, highlight, highlightClass}]
  468. * - coreValues: 核心价值列表 [string]
  469. * - categories: 品类市场数据 [{name, weeklySales, weeklyRevenue, avgPrice, brands, growth, chinaRatio, highlight, revenueNum, growthNum}]
  470. * - competitors: 竞品数据 [{name, positioning, positionBadge, priceRange, igFollowers, tiktokFollowers, skuNote, strategyNote, pros, cons, radarData:[5]}]
  471. * - vocAnalysis: VOC分析 {totalReviews, painPoints:[{icon, name, pct, gradient, quote}], highlights:[{name, pct, color}], scenes:[{name, pct}]}
  472. * - categoryMatrix: 品类机会矩阵 [{name, marketSize, growth, socialHeat, competition, chinaRatio, recommendation, badgeClass}]
  473. * - tiktokHeat: TikTok热度 [{name, plays}]
  474. * - seasonalNotes: 季节性要点 [{icon, title, desc}]
  475. * - strategy: 执行策略 {shortTerm:[{title, desc}], midTerm:[{title, desc}], longTerm:[{title, desc}]}
  476. * - vocPriorities: VOC驱动优先级 [{text, badgeClass}]
  477. * - conclusion: 总结 {topCategory:{emoji, title, name, desc}, socialDividend:{emoji, title, name, desc}, differentiator:{title, subtitle, desc}, keyActions:[{emoji, title, desc}]}
  478. * - trendData: 趋势数据 {weeks:[], datasets:[{label, data, borderColor}]}
  479. */
  480. const REPORT_DATA = {
  481. "metrics": [
  482. {
  483. "value": 3750000,
  484. "prefix": "$",
  485. "suffix": "",
  486. "label": "品类月销售额",
  487. "sub": "美元/月(美国站)"
  488. },
  489. {
  490. "value": 125000,
  491. "prefix": "",
  492. "suffix": "件",
  493. "label": "品类月销售量",
  494. "sub": "Reed Diffuser 主品类"
  495. },
  496. {
  497. "value": 4200,
  498. "prefix": "",
  499. "suffix": "条",
  500. "label": "分析评论总量",
  501. "sub": "覆盖4大竞品品牌"
  502. },
  503. {
  504. "value": 35,
  505. "prefix": "+",
  506. "suffix": "%",
  507. "label": "品类年增长率",
  508. "sub": "搜索量同比增速"
  509. },
  510. {
  511. "value": 62,
  512. "prefix": "",
  513. "suffix": "%",
  514. "label": "中国卖家占比",
  515. "sub": "TOP100产品中"
  516. },
  517. {
  518. "value": 29,
  519. "prefix": "$",
  520. "suffix": "",
  521. "label": "黄金价格带",
  522. "sub": "$24-$34 量利最优区间"
  523. }
  524. ],
  525. "coreFindings": [
  526. {
  527. "text": "香薰家居品类处于高速成长期,搜索量同比增速35%,市场仍有较大进入空间",
  528. "highlight": "成长期+35%",
  529. "highlightClass": "text-sage"
  530. },
  531. {
  532. "text": "用户最大痛点是香味持续时间短(32.5%差评提及),亦是最强差异化突破口",
  533. "highlight": "香味持续短#1痛点",
  534. "highlightClass": "text-rose"
  535. },
  536. {
  537. "text": "TikTok品类话题播放量1.25亿次,对比评测视频互动率最高但产出最少",
  538. "highlight": "内容空缺机会",
  539. "highlightClass": "text-gold"
  540. },
  541. {
  542. "text": "黄金价格带$24-$34集中40%销量,均价$29.9可切入该价格带并保持42%毛利",
  543. "highlight": "$24-$34黄金带",
  544. "highlightClass": "text-gold"
  545. },
  546. {
  547. "text": "CR5=35.2%,市场竞争分散,非垄断格局,新品牌进入机会窗口仍然开放",
  548. "highlight": "CR5=35.2%低集中度",
  549. "highlightClass": "text-sage"
  550. }
  551. ],
  552. "coreValues": [
  553. "覆盖4大品类(Reed Diffuser/香薰蜡烛/精油扩香机/香薰油)全面市场扫描",
  554. "深度拆解4家标杆竞品品牌定价策略、社媒布局与用户口碑",
  555. "4,200条真实用户评论VOC提炼用户痛点、喜爱点与场景偏好",
  556. "TikTok+Instagram双平台社媒热度与内容机会量化分析",
  557. "B端品类机会矩阵 + 3阶段落地执行路径规划"
  558. ],
  559. "categories": [
  560. {
  561. "name": "Reed Diffuser",
  562. "weeklySales": "3.2万件",
  563. "weeklyRevenue": "$96万",
  564. "avgPrice": "$29.9",
  565. "brands": "245",
  566. "growth": "+35%",
  567. "chinaRatio": "62%",
  568. "highlight": true,
  569. "revenueNum": 960000,
  570. "growthNum": 35
  571. },
  572. {
  573. "name": "Scented Candle",
  574. "weeklySales": "5.8万件",
  575. "weeklyRevenue": "$116万",
  576. "avgPrice": "$19.9",
  577. "brands": "380",
  578. "growth": "+18%",
  579. "chinaRatio": "45%",
  580. "highlight": false,
  581. "revenueNum": 1160000,
  582. "growthNum": 18
  583. },
  584. {
  585. "name": "Essential Oil Diffuser",
  586. "weeklySales": "2.1万件",
  587. "weeklyRevenue": "$84万",
  588. "avgPrice": "$39.9",
  589. "brands": "165",
  590. "growth": "+52%",
  591. "chinaRatio": "78%",
  592. "highlight": true,
  593. "revenueNum": 840000,
  594. "growthNum": 52
  595. },
  596. {
  597. "name": "Aroma Oil",
  598. "weeklySales": "1.5万件",
  599. "weeklyRevenue": "$45万",
  600. "avgPrice": "$29.5",
  601. "brands": "128",
  602. "growth": "-5%",
  603. "chinaRatio": "55%",
  604. "highlight": false,
  605. "revenueNum": 450000,
  606. "growthNum": -5
  607. }
  608. ],
  609. "competitors": [
  610. {
  611. "name": "NEST New York",
  612. "positioning": "高端溢价",
  613. "positionBadge": "badge-gold",
  614. "priceRange": "$35-68",
  615. "igFollowers": "28万",
  616. "tiktokFollowers": "12.5万",
  617. "skuNote": "12款",
  618. "strategyNote": "礼品/奢华定位,限定礼盒套装为主",
  619. "pros": "✅ 品牌溢价强,礼品场景占比65%",
  620. "cons": "❌ 差评聚焦:价格偏高(22%)、持续时间短(18%)",
  621. "radarData": [
  622. 92,
  623. 88,
  624. 85,
  625. 75,
  626. 55
  627. ]
  628. },
  629. {
  630. "name": "Paddywax",
  631. "positioning": "手工温馨",
  632. "positionBadge": "badge-sage",
  633. "priceRange": "$24-45",
  634. "igFollowers": "18万",
  635. "tiktokFollowers": "8.2万",
  636. "skuNote": "28款",
  637. "strategyNote": "DIY/手工叙事,多场景变体为主",
  638. "pros": "✅ SKU最丰富,覆盖客厅/卧室/浴室全场景",
  639. "cons": "❌ 差评聚焦:香味不持久(28%)、包装易碎(15%)",
  640. "radarData": [
  641. 75,
  642. 72,
  643. 78,
  644. 92,
  645. 80
  646. ]
  647. },
  648. {
  649. "name": "Vitruvi",
  650. "positioning": "简约设计",
  651. "positionBadge": "badge-blue",
  652. "priceRange": "$42-85",
  653. "igFollowers": "35万",
  654. "tiktokFollowers": "5.6万",
  655. "skuNote": "8款",
  656. "strategyNote": "北欧极简美学,精油扩香机+香薰油套装",
  657. "pros": "✅ Instagram视觉最强,粉丝粘性高",
  658. "cons": "❌ 差评聚焦:价格昂贵(35%)、芦苇棒质量差(20%)",
  659. "radarData": [
  660. 82,
  661. 95,
  662. 70,
  663. 60,
  664. 48
  665. ]
  666. },
  667. {
  668. "name": "P.F. Candle Co.",
  669. "positioning": "性价比",
  670. "positionBadge": "badge-rose",
  671. "priceRange": "$16-28",
  672. "igFollowers": "12万",
  673. "tiktokFollowers": "6.8万",
  674. "skuNote": "18款",
  675. "strategyNote": "中低价亲民定位,社区感强",
  676. "pros": "✅ 性价比最优,年轻用户群体增长快",
  677. "cons": "❌ 差评聚焦:香味较淡(30%)、持续时间短(25%)",
  678. "radarData": [
  679. 60,
  680. 58,
  681. 65,
  682. 80,
  683. 95
  684. ]
  685. }
  686. ],
  687. "vocAnalysis": {
  688. "totalReviews": 4200,
  689. "painPoints": [
  690. {
  691. "icon": "🌸",
  692. "name": "香味持续时间短",
  693. "pct": 32,
  694. "gradient": "linear-gradient(90deg,#C4868B,#a06066)",
  695. "quote": "Scent completely fades after 2-3 days, very disappointing."
  696. },
  697. {
  698. "icon": "🪵",
  699. "name": "芦苇棒质量差",
  700. "pct": 24,
  701. "gradient": "linear-gradient(90deg,#B97A5E,#8B5A42)",
  702. "quote": "The reeds are too thin and snap easily when flipping."
  703. },
  704. {
  705. "icon": "📦",
  706. "name": "包装易碎/泄漏",
  707. "pct": 18,
  708. "gradient": "linear-gradient(90deg,#C5A55A,#A07A32)",
  709. "quote": "Arrived with the bottle cracked and oil leaked everywhere."
  710. },
  711. {
  712. "icon": "💰",
  713. "name": "价格偏高/性价比低",
  714. "pct": 14,
  715. "gradient": "linear-gradient(90deg,#7E9BB5,#5A7895)",
  716. "quote": "Too expensive for the small amount of oil you get."
  717. },
  718. {
  719. "icon": "🌿",
  720. "name": "香味过于浓烈/刺鼻",
  721. "pct": 10,
  722. "gradient": "linear-gradient(90deg,#8FA68A,#6A826A)",
  723. "quote": "The scent is overwhelming in a small room."
  724. }
  725. ],
  726. "highlights": [
  727. {
  728. "name": "香味品质好/自然",
  729. "pct": 68,
  730. "color": "#8FA68A"
  731. },
  732. {
  733. "name": "外观精美/送礼合适",
  734. "pct": 62,
  735. "color": "#C5A55A"
  736. },
  737. {
  738. "name": "性价比高",
  739. "pct": 55,
  740. "color": "#7E9BB5"
  741. },
  742. {
  743. "name": "易用/即开即用",
  744. "pct": 48,
  745. "color": "#D4B978"
  746. },
  747. {
  748. "name": "多场景适用",
  749. "pct": 42,
  750. "color": "#C4868B"
  751. }
  752. ],
  753. "scenes": [
  754. {
  755. "name": "客厅日常",
  756. "pct": 38
  757. },
  758. {
  759. "name": "卧室助眠",
  760. "pct": 24
  761. },
  762. {
  763. "name": "送礼场景",
  764. "pct": 20
  765. },
  766. {
  767. "name": "办公室",
  768. "pct": 12
  769. },
  770. {
  771. "name": "浴室/卫生间",
  772. "pct": 6
  773. }
  774. ]
  775. },
  776. "categoryMatrix": [
  777. {
  778. "name": "Reed Diffuser",
  779. "marketSize": "$375万/月",
  780. "growth": "⬆️ +35%",
  781. "socialHeat": "🔥🔥🔥 高",
  782. "competition": "⚡ 中",
  783. "chinaRatio": "62%",
  784. "recommendation": "优先布局",
  785. "badgeClass": "badge-sage",
  786. "highlight": true
  787. },
  788. {
  789. "name": "Essential Oil Diffuser",
  790. "marketSize": "$315万/月",
  791. "growth": "⬆️ +52%",
  792. "socialHeat": "🔥🔥 中高",
  793. "competition": "⚡⚡ 中高",
  794. "chinaRatio": "78%",
  795. "recommendation": "重点关注",
  796. "badgeClass": "badge-gold",
  797. "highlight": true
  798. },
  799. {
  800. "name": "Scented Candle",
  801. "marketSize": "$465万/月",
  802. "growth": "📊 +18%",
  803. "socialHeat": "🔥🔥 中",
  804. "competition": "⚡⚡⚡ 高",
  805. "chinaRatio": "45%",
  806. "recommendation": "差异化切入",
  807. "badgeClass": "badge-blue",
  808. "highlight": false
  809. },
  810. {
  811. "name": "Aroma Oil",
  812. "marketSize": "$180万/月",
  813. "growth": "📉 -5%",
  814. "socialHeat": "🔥 低",
  815. "competition": "⚡ 低",
  816. "chinaRatio": "55%",
  817. "recommendation": "谨慎观望",
  818. "badgeClass": "badge-rose",
  819. "highlight": false
  820. }
  821. ],
  822. "tiktokHeat": [
  823. {
  824. "name": "#reeeddiffuser",
  825. "plays": 125000000
  826. },
  827. {
  828. "name": "#homefragrance",
  829. "plays": 980000000
  830. },
  831. {
  832. "name": "#scentedcandle",
  833. "plays": 2100000000
  834. },
  835. {
  836. "name": "#aromatherapy",
  837. "plays": 650000000
  838. },
  839. {
  840. "name": "#homedecor",
  841. "plays": 4800000000
  842. }
  843. ],
  844. "seasonalNotes": [
  845. {
  846. "icon": "🎄",
  847. "title": "Q4旺季 (11-12月)",
  848. "desc": "圣诞/新年送礼需求激增,销量约为日常2.5倍,需提前60天备货"
  849. },
  850. {
  851. "icon": "💝",
  852. "title": "情人节 (2月)",
  853. "desc": "礼品套装需求增长1.8倍,$30-50礼盒价格段最畅销"
  854. },
  855. {
  856. "icon": "🌸",
  857. "title": "母亲节 (5月)",
  858. "desc": "家居香薰作为送礼选择增长1.6倍,包装品质成决策关键因素"
  859. },
  860. {
  861. "icon": "🏠",
  862. "title": "全年刚需",
  863. "desc": "客厅日常+卧室助眠场景贡献62%基础销量,复购率约35%"
  864. }
  865. ],
  866. "strategy": {
  867. "shortTerm": [
  868. {
  869. "title": "Listing关键词优化",
  870. "desc": "标题植入「long lasting」「30 days」解决#1痛点,Bullet前2条突出持续时间"
  871. },
  872. {
  873. "title": "黄金价格带定价",
  874. "desc": "定价$27.9-$32.9,避开价格战区间(\u003c$20),保持42%+毛利率"
  875. },
  876. {
  877. "title": "差评快速响应",
  878. "desc": "建立差评72小时响应机制+免费补发芦苇棒,降低差评率至\u003c10%"
  879. },
  880. {
  881. "title": "礼品套装开发",
  882. "desc": "开发3-Pack/Gift Set变体,覆盖$45-60节日礼品价格带"
  883. }
  884. ],
  885. "midTerm": [
  886. {
  887. "title": "PPC精准广告",
  888. "desc": "主攻「reed diffuser long lasting」「home fragrance gift set」,ACOS目标\u003c28%"
  889. },
  890. {
  891. "title": "TikTok内容布局",
  892. "desc": "制作「不同房间香味推荐」对比评测视频,填补品类内容空缺"
  893. },
  894. {
  895. "title": "配方技术升级",
  896. "desc": "引入长效缓释技术,将香味持续从15天提升至30-45天,直接解决#1痛点"
  897. },
  898. {
  899. "title": "KOL博主合作",
  900. "desc": "联系5-8个家居/生活方式博主(10-50万粉丝)合作种草,预算$3000-5000/月"
  901. }
  902. ],
  903. "longTerm": [
  904. {
  905. "title": "品牌IP建立",
  906. "desc": "建立独特香调系列(如「城市灵感系列」),形成可延展的品牌故事"
  907. },
  908. {
  909. "title": "全品类扩展",
  910. "desc": "从Reed Diffuser切入,逐步扩展蜡烛/精油/扩香机,形成香薰生态"
  911. },
  912. {
  913. "title": "B端渠道开拓",
  914. "desc": "开发酒店/SPA/办公楼采购渠道,切入企业定制礼品市场"
  915. },
  916. {
  917. "title": "DTC独立站布局",
  918. "desc": "搭建品牌官网+订阅制模式,提升LTV并降低Amazon平台依赖"
  919. }
  920. ]
  921. },
  922. "vocPriorities": [
  923. {
  924. "text": "🌸 香味持续性技术改良 (32.5%痛点)",
  925. "badgeClass": "badge-rose"
  926. },
  927. {
  928. "text": "🪵 芦苇棒材质升级 (24%痛点)",
  929. "badgeClass": "badge-rose"
  930. },
  931. {
  932. "text": "📦 包装防碎/防漏设计 (18%痛点)",
  933. "badgeClass": "badge-gold"
  934. },
  935. {
  936. "text": "🎁 礼品化包装设计",
  937. "badgeClass": "badge-gold"
  938. },
  939. {
  940. "text": "📱 TikTok对比评测内容制作",
  941. "badgeClass": "badge-blue"
  942. },
  943. {
  944. "text": "💡 Listing「持续时间」卖点强化",
  945. "badgeClass": "badge-sage"
  946. },
  947. {
  948. "text": "🏷️ $27.9-32.9 黄金价格带定价",
  949. "badgeClass": "badge-sage"
  950. },
  951. {
  952. "text": "🤝 家居KOL博主合作种草",
  953. "badgeClass": "badge-blue"
  954. }
  955. ],
  956. "conclusion": {
  957. "topCategory": {
  958. "emoji": "🏆",
  959. "title": "最优先布局品类",
  960. "name": "Reed Diffuser",
  961. "desc": "高增长(+35%) + 中等竞争 + 高社媒热度 + 明确差异化突破口"
  962. },
  963. "socialDividend": {
  964. "emoji": "📱",
  965. "title": "社媒最大红利",
  966. "name": "TikTok对比评测",
  967. "desc": "品类内容最稀缺,1.25亿话题播放,对比视频互动率最高却几乎无品牌供给"
  968. },
  969. "differentiator": {
  970. "title": "核心差异化突破口",
  971. "subtitle": "「长效缓释技术」+ 「礼品化场景」",
  972. "desc": "长效持续解决32.5%最大用户痛点,礼品化覆盖圣诞/情人节/母亲节全年旺季,两项组合建立技术+场景双护城河"
  973. },
  974. "keyActions": [
  975. {
  976. "emoji": "🎯",
  977. "title": "精准卡位",
  978. "desc": "Reed Diffuser黄金价格带$27.9-32.9"
  979. },
  980. {
  981. "emoji": "📝",
  982. "title": "VOC驱动",
  983. "desc": "「持续30天+」成为核心卖点标签"
  984. },
  985. {
  986. "emoji": "📱",
  987. "title": "社媒种草",
  988. "desc": "TikTok对比评测 + IG生活方式内容"
  989. }
  990. ]
  991. }
  992. } {};
  993. </script>
  994. <!-- ============================================================
  995. JavaScript — 导航 · 动画 · 数据驱动渲染 · 图表
  996. ============================================================ -->
  997. <script>
  998. /* ===== 全局状态 ===== */
  999. let currentSlide = 0;
  1000. const totalSlides = document.querySelectorAll('.slide').length;
  1001. let isTransitioning = false;
  1002. /* ===== 自动生成侧边导航 ===== */
  1003. (function buildNav(){
  1004. const tips = ['封面','目录','执行摘要','市场全景','竞品对标','用户VOC','线索清单','执行策略','总结展望','致谢'];
  1005. const nav = document.getElementById('side-nav');
  1006. tips.forEach((tip,i) => {
  1007. const d = document.createElement('div');
  1008. d.className = 'nav-dot' + (i===0?' active':'');
  1009. d.dataset.tip = tip;
  1010. d.dataset.slide = i;
  1011. d.addEventListener('click', () => goSlide(i));
  1012. nav.appendChild(d);
  1013. });
  1014. })();
  1015. const dots = document.querySelectorAll('.nav-dot');
  1016. /* ===== 幻灯片切换 ===== */
  1017. function goSlide(n) {
  1018. if (isTransitioning || n === currentSlide || n < 0 || n >= totalSlides) return;
  1019. isTransitioning = true;
  1020. const slides = document.querySelectorAll('.slide');
  1021. slides[currentSlide].classList.remove('active');
  1022. slides[n].classList.add('active');
  1023. dots.forEach((d, i) => d.classList.toggle('active', i === n));
  1024. currentSlide = n;
  1025. triggerSlideAnimations(n);
  1026. setTimeout(() => { isTransitioning = false; }, 750);
  1027. }
  1028. function nextSlide() { goSlide(currentSlide + 1); }
  1029. function prevSlide() { goSlide(currentSlide - 1); }
  1030. /* ===== 弹窗检测 ===== */
  1031. function isModalOpen() { return document.getElementById('modal-overlay').classList.contains('show'); }
  1032. /* ===== 键盘事件 ===== */
  1033. document.addEventListener('keydown', e => {
  1034. if (isModalOpen()) return;
  1035. if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'PageDown') { e.preventDefault(); nextSlide(); }
  1036. else if (e.key === 'ArrowLeft' || e.key === 'PageUp') { e.preventDefault(); prevSlide(); }
  1037. else if (e.key === 'Home') { e.preventDefault(); goSlide(0); }
  1038. else if (e.key === 'End') { e.preventDefault(); goSlide(totalSlides - 1); }
  1039. });
  1040. /* ===== 鼠标滚轮 ===== */
  1041. let wheelTimeout = 0;
  1042. document.addEventListener('wheel', e => {
  1043. if (isModalOpen()) return;
  1044. e.preventDefault();
  1045. const now = Date.now();
  1046. if (now - wheelTimeout < 800) return;
  1047. wheelTimeout = now;
  1048. e.deltaY > 0 ? nextSlide() : prevSlide();
  1049. }, { passive: false });
  1050. /* ===== 触屏滑动 ===== */
  1051. let touchStartY = 0, touchStartX = 0;
  1052. document.addEventListener('touchstart', e => { touchStartY = e.touches[0].clientY; touchStartX = e.touches[0].clientX; });
  1053. document.addEventListener('touchend', e => {
  1054. if (isModalOpen()) return;
  1055. const dy = e.changedTouches[0].clientY - touchStartY;
  1056. const dx = e.changedTouches[0].clientX - touchStartX;
  1057. if (Math.abs(dy) > Math.abs(dx) && Math.abs(dy) > 50) { dy < 0 ? nextSlide() : prevSlide(); }
  1058. else if (Math.abs(dx) > 50) { dx < 0 ? nextSlide() : prevSlide(); }
  1059. });
  1060. /* ===== 全屏 ===== */
  1061. document.getElementById('fs-btn').addEventListener('click', () => {
  1062. if (!document.fullscreenElement) document.documentElement.requestFullscreen().catch(() => {});
  1063. else document.exitFullscreen();
  1064. });
  1065. /* ===== 数字递增动画 ===== */
  1066. function animateCounters(slideEl) {
  1067. slideEl.querySelectorAll('.metric-value[data-count]').forEach(el => {
  1068. const target = +el.dataset.count;
  1069. const prefix = el.dataset.prefix || '';
  1070. const suffix = el.dataset.suffix || '';
  1071. const duration = 1800;
  1072. const start = performance.now();
  1073. const format = n => {
  1074. if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
  1075. if (n >= 1e3) return (n / 1e3).toFixed(n >= 1e4 ? 0 : 1) + 'K';
  1076. return n.toLocaleString();
  1077. };
  1078. function step(now) {
  1079. const p = Math.min((now - start) / duration, 1);
  1080. const ease = 1 - Math.pow(1 - p, 3);
  1081. el.textContent = prefix + format(Math.round(target * ease)) + suffix;
  1082. if (p < 1) requestAnimationFrame(step);
  1083. }
  1084. requestAnimationFrame(step);
  1085. });
  1086. }
  1087. /* ===== 进度条动画 ===== */
  1088. function animateBars(slideEl) {
  1089. slideEl.querySelectorAll('.bar-fill[data-target]').forEach(el => {
  1090. setTimeout(() => { el.style.width = el.dataset.target + '%'; }, 200);
  1091. });
  1092. slideEl.querySelectorAll('.pain-fill[data-target]').forEach(el => {
  1093. setTimeout(() => {
  1094. el.style.width = (el.dataset.target / 35 * 100) + '%';
  1095. if (el.dataset.bg) el.style.background = el.dataset.bg;
  1096. }, 200);
  1097. });
  1098. }
  1099. /* ===== 页面动画触发器 ===== */
  1100. const animatedSlides = new Set();
  1101. function triggerSlideAnimations(n) {
  1102. const slideEl = document.getElementById('slide-' + n);
  1103. if (!slideEl) return;
  1104. if (!animatedSlides.has(n)) {
  1105. animatedSlides.add(n);
  1106. animateCounters(slideEl);
  1107. animateBars(slideEl);
  1108. initChartsForSlide(n);
  1109. }
  1110. }
  1111. /* ============================================================
  1112. Chart.js 全局配置
  1113. ============================================================ */
  1114. const chartInstances = {};
  1115. const chartFontColor = '#F5E6D3';
  1116. const chartGridColor = 'rgba(139,111,71,0.15)';
  1117. const PALETTE = ['rgba(197,165,90,0.7)','rgba(143,166,138,0.65)','rgba(196,134,139,0.6)','rgba(126,155,181,0.55)','rgba(212,185,120,0.5)','rgba(139,111,71,0.4)'];
  1118. const PALETTE_BORDER = ['#C5A55A','#8FA68A','#C4868B','#7E9BB5','#D4B978','#8B6F47'];
  1119. Chart.defaults.color = chartFontColor;
  1120. Chart.defaults.font.family = "'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif";
  1121. Chart.defaults.font.size = 12;
  1122. function initChartsForSlide(n) {
  1123. if (n === 3) initMarketCharts();
  1124. if (n === 4) initRadarChart();
  1125. if (n === 5) initScenesChart();
  1126. if (n === 6) initTiktokChart();
  1127. }
  1128. /* --- 市场全景图表 --- */
  1129. function initMarketCharts() {
  1130. if (chartInstances.revenue || !REPORT_DATA.categories) return;
  1131. const cats = REPORT_DATA.categories;
  1132. const labels = cats.map(c => c.name);
  1133. const revenueData = cats.map(c => c.revenueNum);
  1134. chartInstances.revenue = new Chart(document.getElementById('chart-revenue'), {
  1135. type: 'bar',
  1136. data: { labels, datasets: [{ data: revenueData, backgroundColor: PALETTE.slice(0, cats.length), borderColor: PALETTE_BORDER.slice(0, cats.length), borderWidth: 1, borderRadius: 6, maxBarThickness: 52 }] },
  1137. options: {
  1138. responsive: true, maintainAspectRatio: false,
  1139. plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => '$' + (ctx.raw / 1e6).toFixed(1) + 'M / 周' } } },
  1140. scales: { y: { ticks: { callback: v => '$' + (v/1e6).toFixed(0) + 'M' }, grid: { color: chartGridColor } }, x: { grid: { display: false } } },
  1141. animation: { duration: 1200, easing: 'easeOutQuart' }
  1142. }
  1143. });
  1144. const growthSorted = [...cats].sort((a,b) => b.growthNum - a.growthNum);
  1145. chartInstances.growth = new Chart(document.getElementById('chart-growth'), {
  1146. type: 'bar',
  1147. data: {
  1148. labels: growthSorted.map(c => c.name),
  1149. datasets: [{ data: growthSorted.map(c => c.growthNum),
  1150. backgroundColor: growthSorted.map(c => c.growthNum > 50 ? 'rgba(143,166,138,0.7)' : c.growthNum > 0 ? 'rgba(197,165,90,0.6)' : 'rgba(196,134,139,0.5)'),
  1151. borderColor: growthSorted.map(c => c.growthNum > 50 ? '#8FA68A' : c.growthNum > 0 ? '#C5A55A' : '#C4868B'),
  1152. borderWidth: 1, borderRadius: 6, maxBarThickness: 52 }]
  1153. },
  1154. options: {
  1155. indexAxis: 'y', responsive: true, maintainAspectRatio: false,
  1156. plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => (ctx.raw > 0 ? '+' : '') + ctx.raw + '%' } } },
  1157. scales: { x: { ticks: { callback: v => (v > 0 ? '+' : '') + v + '%' }, grid: { color: chartGridColor } }, y: { grid: { display: false } } },
  1158. animation: { duration: 1200, easing: 'easeOutQuart' }
  1159. }
  1160. });
  1161. }
  1162. /* --- 竞品雷达图 --- */
  1163. function initRadarChart() {
  1164. if (chartInstances.radar || !REPORT_DATA.competitors) return;
  1165. const comps = REPORT_DATA.competitors;
  1166. const radarLabels = ['品牌知名度','社媒粉丝','内容质量','产品线宽度','价格竞争力'];
  1167. const colors = ['#C5A55A','#8FA68A','#C4868B','#7E9BB5','#D4B978'];
  1168. const bgColors = ['rgba(197,165,90,0.15)','rgba(143,166,138,0.12)','rgba(196,134,139,0.1)','rgba(126,155,181,0.1)','rgba(212,185,120,0.1)'];
  1169. chartInstances.radar = new Chart(document.getElementById('chart-radar'), {
  1170. type: 'radar',
  1171. data: {
  1172. labels: radarLabels,
  1173. datasets: comps.map((c,i) => ({
  1174. label: c.name, data: c.radarData || [50,50,50,50,50],
  1175. borderColor: colors[i%colors.length], backgroundColor: bgColors[i%bgColors.length],
  1176. pointBackgroundColor: colors[i%colors.length], borderWidth: 2
  1177. }))
  1178. },
  1179. options: {
  1180. responsive: true, maintainAspectRatio: false,
  1181. scales: { r: { min: 0, max: 100, ticks: { stepSize: 25, display: false }, grid: { color: chartGridColor }, pointLabels: { font: { size: 11 } }, angleLines: { color: chartGridColor } } },
  1182. plugins: { legend: { position: 'bottom', labels: { boxWidth: 12, padding: 14, font: { size: 11 } } } },
  1183. animation: { duration: 1200 }
  1184. }
  1185. });
  1186. }
  1187. /* --- 使用场景饼图 --- */
  1188. function initScenesChart() {
  1189. if (chartInstances.scenes || !REPORT_DATA.vocAnalysis) return;
  1190. const scenes = REPORT_DATA.vocAnalysis.scenes;
  1191. chartInstances.scenes = new Chart(document.getElementById('chart-scenes'), {
  1192. type: 'doughnut',
  1193. data: {
  1194. labels: scenes.map(s => s.name + ' ' + s.pct + '%'),
  1195. datasets: [{ data: scenes.map(s => s.pct), backgroundColor: PALETTE.slice(0, scenes.length), borderColor: 'rgba(26,17,11,0.6)', borderWidth: 2 }]
  1196. },
  1197. options: {
  1198. responsive: true, maintainAspectRatio: false, cutout: '55%',
  1199. plugins: { legend: { position: 'right', labels: { boxWidth: 10, padding: 8, font: { size: 10 } } } },
  1200. animation: { duration: 1200 }
  1201. }
  1202. });
  1203. }
  1204. /* --- TikTok热度图表 --- */
  1205. function initTiktokChart() {
  1206. if (chartInstances.tiktok || !REPORT_DATA.tiktokHeat) return;
  1207. const tt = REPORT_DATA.tiktokHeat;
  1208. chartInstances.tiktok = new Chart(document.getElementById('chart-tiktok'), {
  1209. type: 'bar',
  1210. data: {
  1211. labels: tt.map(t => t.name),
  1212. datasets: [{ label: '播放量', data: tt.map(t => t.plays),
  1213. backgroundColor: PALETTE.slice(0, tt.length), borderColor: PALETTE_BORDER.slice(0, tt.length),
  1214. borderWidth: 1, borderRadius: 6, maxBarThickness: 48 }]
  1215. },
  1216. options: {
  1217. responsive: true, maintainAspectRatio: false,
  1218. plugins: { legend: { display: false }, tooltip: { callbacks: { label: ctx => (ctx.raw / 1e6).toFixed(1) + 'M 播放' } } },
  1219. scales: { y: { ticks: { callback: v => (v/1e6).toFixed(0) + 'M' }, grid: { color: chartGridColor } }, x: { grid: { display: false } } },
  1220. animation: { duration: 1200, easing: 'easeOutQuart' }
  1221. }
  1222. });
  1223. }
  1224. /* ============================================================
  1225. 数据驱动 DOM 渲染
  1226. ============================================================ */
  1227. function renderReport() {
  1228. const D = REPORT_DATA;
  1229. if (!D || !D.categories) { console.warn('REPORT_DATA 未注入'); return; }
  1230. // --- Slide 2: 执行摘要 ---
  1231. if (D.metrics) {
  1232. document.getElementById('exec-metrics').innerHTML = D.metrics.map(m =>
  1233. `<div class="glass-card metric-card"><div class="metric-value" data-count="${m.value}" data-prefix="${m.prefix||''}" data-suffix="${m.suffix||''}">${m.prefix||''}0${m.suffix||''}</div><div class="metric-label">${m.label}</div><div class="metric-sub">${m.sub}</div></div>`
  1234. ).join('');
  1235. }
  1236. if (D.coreFindings) {
  1237. document.getElementById('core-findings').innerHTML = D.coreFindings.map(f =>
  1238. `<li style="margin-bottom:8px">• <strong class="${f.highlightClass||'text-gold'}">${f.highlight||''}</strong> ${f.text}</li>`
  1239. ).join('');
  1240. }
  1241. if (D.coreValues) {
  1242. document.getElementById('core-values').innerHTML = D.coreValues.map(v =>
  1243. `<li style="margin-bottom:8px">• ${v}</li>`
  1244. ).join('');
  1245. }
  1246. // --- Slide 3: 市场全景表格 ---
  1247. if (D.categories) {
  1248. document.getElementById('market-table-body').innerHTML = D.categories.map(c => {
  1249. const growthClass = c.growthNum > 30 ? 'text-sage fw-700' : c.growthNum > 0 ? 'text-sage' : 'text-rose';
  1250. const chinaClass = c.chinaRatioNum > 70 ? 'text-rose fw-600' : '';
  1251. return `<tr><td class="fw-600 ${c.highlight?'text-gold':''}">${c.name}${c.highlight?' ⭐':''}</td><td>${c.weeklySales}</td><td>${c.weeklyRevenue}</td><td>${c.avgPrice}</td><td>${c.brands}</td><td class="${growthClass}">${c.growth}</td><td class="${chinaClass}">${c.chinaRatio}</td></tr>`;
  1252. }).join('');
  1253. }
  1254. // --- Slide 4: 竞品卡片 ---
  1255. if (D.competitors) {
  1256. document.getElementById('competitor-cards').innerHTML = D.competitors.map(c => `
  1257. <div class="glass-card competitor-card">
  1258. <span class="badge ${c.positionBadge||'badge-gold'} mb-sm" style="display:inline-block">${c.positioning}</span>
  1259. <h3>${c.name}</h3>
  1260. <p class="text-xs text-dim mb-sm">${c.priceRange||''}</p>
  1261. <div class="comp-stat"><span>Instagram</span><span class="fw-700 text-gold">${c.igFollowers||'—'}</span></div>
  1262. <div class="comp-stat"><span>TikTok</span><span class="fw-600">${c.tiktokFollowers||'—'}</span></div>
  1263. <div class="comp-stat"><span>Amazon SKU</span><span>${c.skuNote||'—'}</span></div>
  1264. <div class="comp-stat"><span>策略</span><span class="text-xs">${c.strategyNote||'—'}</span></div>
  1265. <p class="text-xs mt-sm text-dim">${c.pros||''}<br>${c.cons||''}</p>
  1266. </div>
  1267. `).join('');
  1268. }
  1269. // --- Slide 5: VOC ---
  1270. if (D.vocAnalysis) {
  1271. const voc = D.vocAnalysis;
  1272. document.getElementById('voc-review-count').textContent = voc.totalReviews + '条';
  1273. document.getElementById('pain-points-container').innerHTML = voc.painPoints.map(p =>
  1274. `<div class="pain-bar"><div class="pain-icon">${p.icon}</div><div class="pain-info"><div class="pain-name">${p.name} <span class="badge badge-rose">${p.pct}%</span></div><div class="pain-track"><div class="pain-fill" style="width:0%" data-target="${p.pct}" data-bg="${p.gradient}"></div></div>${p.quote?`<div class="pain-pct">"${p.quote}"</div>`:''}</div></div>`
  1275. ).join('');
  1276. document.getElementById('highlights-container').innerHTML = voc.highlights.map(h =>
  1277. `<div class="bar-row"><span class="bar-label">${h.name}</span><div class="bar-track"><div class="bar-fill" style="width:0%;background:${h.color}" data-target="${h.pct}" data-value="${h.pct}%"></div></div></div>`
  1278. ).join('');
  1279. }
  1280. // --- Slide 6: 品类矩阵 ---
  1281. if (D.categoryMatrix) {
  1282. document.getElementById('matrix-table-body').innerHTML = D.categoryMatrix.map(c =>
  1283. `<tr><td class="fw-600 ${c.highlight?'text-gold':''}">${c.name}</td><td>${c.marketSize}</td><td>${c.growth}</td><td>${c.socialHeat}</td><td>${c.competition}</td><td>${c.chinaRatio}</td><td><span class="badge ${c.badgeClass||'badge-gold'}">${c.recommendation}</span></td></tr>`
  1284. ).join('');
  1285. }
  1286. if (D.seasonalNotes) {
  1287. document.getElementById('seasonality-notes').innerHTML = D.seasonalNotes.map(s =>
  1288. `<div style="display:flex;align-items:center;gap:8px;margin-bottom:10px"><span style="font-size:1.4rem">${s.icon}</span><div><strong class="text-gold">${s.title}</strong><br>${s.desc}</div></div>`
  1289. ).join('');
  1290. }
  1291. // --- Slide 7: 执行策略 ---
  1292. if (D.strategy) {
  1293. const phases = [
  1294. { key: 'shortTerm', label: '短期 1-3个月', badge: 'badge-sage' },
  1295. { key: 'midTerm', label: '中期 3-6个月', badge: 'badge-gold' },
  1296. { key: 'longTerm', label: '长期 6-12个月', badge: 'badge-blue' }
  1297. ];
  1298. document.getElementById('strategy-columns').innerHTML = phases.map(p => `
  1299. <div class="glass-card">
  1300. <span class="badge ${p.badge} mb-sm" style="display:inline-block">${p.label}</span>
  1301. <div class="timeline mt-sm">
  1302. ${(D.strategy[p.key]||[]).map(item => `<div class="timeline-item"><h4>${item.title}</h4><p>${item.desc}</p></div>`).join('')}
  1303. </div>
  1304. </div>
  1305. `).join('');
  1306. }
  1307. if (D.vocPriorities) {
  1308. document.getElementById('voc-priorities').innerHTML = D.vocPriorities.map(p =>
  1309. `<span class="badge ${p.badgeClass||'badge-rose'}">${p.text}</span>`
  1310. ).join('');
  1311. }
  1312. // --- Slide 8: 总结 ---
  1313. if (D.conclusion) {
  1314. const con = D.conclusion;
  1315. document.getElementById('conclusion-top-cards').innerHTML = `
  1316. <div class="glass-card" style="text-align:center;padding:32px 24px"><div style="font-size:2.4rem;margin-bottom:8px">${con.topCategory.emoji}</div><h3 class="text-gold mb-sm">${con.topCategory.title}</h3><p class="text-sm"><strong>${con.topCategory.name}</strong></p><p class="text-xs text-dim mt-sm">${con.topCategory.desc}</p></div>
  1317. <div class="glass-card" style="text-align:center;padding:32px 24px"><div style="font-size:2.4rem;margin-bottom:8px">${con.socialDividend.emoji}</div><h3 class="text-gold mb-sm">${con.socialDividend.title}</h3><p class="text-sm"><strong>${con.socialDividend.name}</strong></p><p class="text-xs text-dim mt-sm">${con.socialDividend.desc}</p></div>`;
  1318. document.getElementById('conclusion-differentiator').innerHTML =
  1319. `<h3 class="text-gold mb-sm">${con.differentiator.title}</h3><p style="font-size:1.15rem;font-weight:600;color:var(--cream)">${con.differentiator.subtitle}</p><p class="text-sm text-dim mt-sm">${con.differentiator.desc}</p>`;
  1320. document.getElementById('conclusion-actions').innerHTML =
  1321. `<h3 class="text-sm fw-600 mb-sm" style="text-align:center">✅ 三大关键行动</h3><div style="display:grid;grid-template-columns:repeat(3,1fr);gap:16px;text-align:center;font-size:.85rem">${con.keyActions.map(a => `<div><div style="font-size:1.6rem;margin-bottom:4px">${a.emoji}</div><strong>${a.title}</strong><br><span class="text-xs text-dim">${a.desc}</span></div>`).join('')}</div>`;
  1322. }
  1323. }
  1324. /* ============================================================
  1325. 封面粒子效果
  1326. ============================================================ */
  1327. function initParticles() {
  1328. const canvas = document.getElementById('particles-canvas');
  1329. if (!canvas) return;
  1330. const ctx = canvas.getContext('2d');
  1331. let w, h, particles = [];
  1332. function resize() { w = canvas.width = window.innerWidth; h = canvas.height = window.innerHeight; }
  1333. resize();
  1334. window.addEventListener('resize', resize);
  1335. for (let i = 0; i < 60; i++) {
  1336. particles.push({
  1337. x: Math.random() * w, y: Math.random() * h,
  1338. r: Math.random() * 2 + 0.5,
  1339. dx: (Math.random() - 0.5) * 0.3, dy: (Math.random() - 0.5) * 0.2,
  1340. alpha: Math.random() * 0.4 + 0.1,
  1341. color: Math.random() > 0.5 ? '197,165,90' : '212,185,120'
  1342. });
  1343. }
  1344. function draw() {
  1345. ctx.clearRect(0, 0, w, h);
  1346. const grd = ctx.createRadialGradient(w*.5, h*.4, 0, w*.5, h*.4, w*.6);
  1347. grd.addColorStop(0, 'rgba(92,61,46,0.12)');
  1348. grd.addColorStop(0.5, 'rgba(45,24,16,0.06)');
  1349. grd.addColorStop(1, 'transparent');
  1350. ctx.fillStyle = grd; ctx.fillRect(0, 0, w, h);
  1351. particles.forEach(p => {
  1352. ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, Math.PI*2);
  1353. ctx.fillStyle = `rgba(${p.color},${p.alpha})`; ctx.fill();
  1354. p.x += p.dx; p.y += p.dy;
  1355. if (p.x<0||p.x>w) p.dx *= -1;
  1356. if (p.y<0||p.y>h) p.dy *= -1;
  1357. p.alpha += (Math.random()-.5)*.01;
  1358. p.alpha = Math.max(.05, Math.min(.5, p.alpha));
  1359. });
  1360. for (let i=0; i<particles.length; i++) {
  1361. for (let j=i+1; j<particles.length; j++) {
  1362. const dx=particles[i].x-particles[j].x, dy=particles[i].y-particles[j].y;
  1363. const dist = Math.sqrt(dx*dx+dy*dy);
  1364. if (dist<150) { ctx.beginPath(); ctx.moveTo(particles[i].x,particles[i].y); ctx.lineTo(particles[j].x,particles[j].y); ctx.strokeStyle=`rgba(197,165,90,${.06*(1-dist/150)})`; ctx.lineWidth=.5; ctx.stroke(); }
  1365. }
  1366. }
  1367. requestAnimationFrame(draw);
  1368. }
  1369. draw();
  1370. }
  1371. /* ============================================================
  1372. Modal 弹窗系统
  1373. ============================================================ */
  1374. const modalOverlay = document.getElementById('modal-overlay');
  1375. const modalHeader = document.getElementById('modal-header');
  1376. const modalBody = document.getElementById('modal-body');
  1377. function openModal(headerHTML, bodyHTML) {
  1378. modalHeader.innerHTML = headerHTML;
  1379. modalBody.innerHTML = bodyHTML;
  1380. modalOverlay.style.display = 'flex';
  1381. requestAnimationFrame(() => modalOverlay.classList.add('show'));
  1382. }
  1383. function closeModal() {
  1384. modalOverlay.classList.remove('show');
  1385. setTimeout(() => { modalOverlay.style.display = 'none'; }, 350);
  1386. }
  1387. document.getElementById('modal-close').addEventListener('click', closeModal);
  1388. modalOverlay.addEventListener('click', e => { if(e.target===modalOverlay) closeModal(); });
  1389. document.addEventListener('keydown', e => { if(e.key==='Escape' && modalOverlay.classList.contains('show')) closeModal(); });
  1390. /* ===== 初始化 ===== */
  1391. renderReport();
  1392. initParticles();
  1393. triggerSlideAnimations(0);
  1394. </script>
  1395. </body>
  1396. </html>