icicle-demand-final-demo.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <style>
  2. .brief{max-width:1080px;margin-bottom:18px}.brief p{line-height:1.7}
  3. .demo{overflow:hidden;border:1px solid #dbe3ec;border-radius:18px;background:#fff;box-shadow:0 18px 50px rgba(15,23,42,.08)}
  4. .top{display:flex;align-items:center;justify-content:space-between;padding:17px 20px;background:#172554;color:#fff}
  5. .top h3{margin:0 0 4px;font-size:17px}.top p{margin:0;color:#bfdbfe;font-size:9px}
  6. .legend{display:flex;gap:8px;align-items:center;font-size:8px}.legend span{display:flex;align-items:center;gap:3px}.legend i{width:9px;height:9px;border-radius:2px;display:inline-block}
  7. .overview{display:grid;grid-template-columns:repeat(4,1fr);background:#f8fafc;border-bottom:1px solid #e2e8f0}
  8. .overview div{padding:11px 15px;border-right:1px solid #e2e8f0}.overview div:last-child{border:0}
  9. .overview b{display:block;color:#1e3a8a;font-size:11px}.overview small{color:#64748b;font-size:7px}
  10. .body{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(330px,.65fr);min-height:610px}
  11. .map{padding:16px;border-right:1px solid #e2e8f0}.maphead{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:11px}
  12. .maphead strong{font-size:12px}.maphead span{color:#64748b;font-size:8px}
  13. .axis{display:grid;grid-template-columns:repeat(8,1fr);margin:0 0 5px;color:#94a3b8;font-size:7px;text-align:center}
  14. .icicle{position:relative;height:465px;overflow:hidden;border:1px solid #cbd5e1;border-radius:12px;background:#f8fafc}
  15. .grid{position:absolute;inset:0;display:grid;grid-template-columns:repeat(8,1fr);pointer-events:none}.grid i{border-right:1px solid rgba(148,163,184,.2)}
  16. .block{position:absolute;overflow:hidden;padding:4px;border:1px solid rgba(255,255,255,.88);border-radius:3px;color:#fff;font-size:7px;font-weight:700;line-height:1.25}
  17. .block.cold,.block.none{color:#475569}.high{background:#ef4444}.rise{background:#f59e0b}.mid{background:#eab308}.low{background:#60a5fa}.cold{background:#dbeafe}.none{background:#f1f5f9}
  18. .selected{z-index:4;outline:3px solid #7c3aed;outline-offset:-3px}.score{display:block;margin-top:2px;opacity:.86;font-size:6px;font-weight:500}
  19. .hotspot{position:absolute;z-index:8;width:210px;padding:9px 10px;border:1px solid #c4b5fd;border-radius:9px;background:rgba(255,255,255,.96);box-shadow:0 8px 20px rgba(30,41,59,.1);color:#334155;font-size:7px;line-height:1.55}
  20. .hotspot b{display:block;color:#6d28d9;font-size:9px}.hotspot em{color:#dc2626;font-style:normal}
  21. .reading{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin-top:10px}.reading div{padding:8px 9px;border-radius:8px;background:#eff6ff;color:#1e3a8a;font-size:7px;line-height:1.5}
  22. .output{padding:15px;background:#fbfdff}.output h4{margin:0 0 3px;font-size:13px}.output>p{margin:0 0 10px;color:#64748b;font-size:8px;line-height:1.55}
  23. .filters{display:flex;gap:5px;margin-bottom:10px}.filters span{padding:4px 6px;border:1px solid #dbe3ec;border-radius:5px;background:#fff;color:#64748b;font-size:7px}.filters .active{border-color:#1d4ed8;background:#1d4ed8;color:#fff}
  24. .demand{margin-bottom:9px;padding:10px;border:1px solid #dbe3ec;border-radius:10px;background:#fff}
  25. .dtop{display:flex;justify-content:space-between;gap:8px}.demand strong{font-size:9px;line-height:1.45}.badge{flex:0 0 auto;padding:3px 5px;border-radius:4px;background:#fff7ed;color:#9a3412;font-size:6px;font-weight:800}
  26. .scores{display:flex;gap:4px;margin-top:6px}.scores span{padding:3px 5px;border-radius:4px;background:#eff6ff;color:#1e40af;font-size:6px}.scores .grain{background:#f3e8ff;color:#6b21a8}
  27. .reason{margin-top:6px;color:#64748b;font-size:7px;line-height:1.55}.reason b{color:#334155;font-size:7px}.model{margin-top:5px;padding-top:5px;border-top:1px dashed #dbe3ec;color:#7c3aed;font-size:6px;line-height:1.5}
  28. .not-demand{border-left:3px solid #94a3b8;background:#f8fafc}.not-demand .badge{background:#e2e8f0;color:#475569}
  29. .foot{padding:12px 18px;border-top:1px solid #e2e8f0;color:#526174;font-size:9px;line-height:1.65}
  30. @media(max-width:980px){.body{grid-template-columns:1fr}.map{border-right:0;border-bottom:1px solid #e2e8f0}.overview{grid-template-columns:1fr 1fr}}
  31. </style>
  32. <div class="brief">
  33. <h2>推荐版 Demo:全局热力地形 + 批量需求输出</h2>
  34. <p class="subtitle">热力图不再显示 P/H,也不要求阅读全部节点。每个节点只用 0~1 热度 Score 着色;所有冷区继续占有位置。右侧直接输出系统判断出的需求,并把“是否为需求”与“需求粒度”分开。</p>
  35. </div>
  36. <section class="demo" data-choice="approved-icicle" onclick="toggleSelect(this)">
  37. <header class="top">
  38. <div><h3>平台全局需求地图</h3><p>完整分类树、热冷分布与需求结果使用同一份上游数据</p></div>
  39. <div class="legend"><span><i class="high"></i>0.80–1 高热</span><span><i class="rise"></i>0.60–0.79</span><span><i class="mid"></i>0.40–0.59</span><span><i class="low"></i>0.20–0.39</span><span><i class="cold"></i>0–0.19</span><span><i class="none"></i>无数据</span></div>
  40. </header>
  41. <div class="overview">
  42. <div><b>热度 Score 0~1</b><small>颜色只表示当前热冷,不代表是否为需求</small></div>
  43. <div><b>冷区完整保留</b><small>所有节点都占据位置,提供全局比较基线</small></div>
  44. <div><b>需求按搜索意义判断</b><small>宽泛需求、主题需求和长尾需求都可成立</small></div>
  45. <div><b>Reason 可追溯</b><small>上游事实和模型解释分开显示</small></div>
  46. </div>
  47. <div class="body">
  48. <section class="map">
  49. <div class="maphead"><strong>完整分类树热力地形</strong><span>横向为层级 · 纵向为分支规模 · 点击色块放大</span></div>
  50. <div class="axis"><span>根</span><span>一级</span><span>二级</span><span>三级</span><span>四级</span><span>五级</span><span>六级+</span><span>元素</span></div>
  51. <div class="icicle">
  52. <div class="grid"><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></div>
  53. <div class="block mid" style="left:0;top:0;width:12.5%;height:58%">表象<span class="score">Score 0.52</span></div>
  54. <div class="block mid" style="left:0;top:58%;width:12.5%;height:42%">理念<span class="score">Score 0.49</span></div>
  55. <div class="block rise" style="left:12.5%;top:0;width:12.5%;height:23%">行为<span class="score">0.68</span></div>
  56. <div class="block cold" style="left:12.5%;top:23%;width:12.5%;height:7%">内容形态<span class="score">0.08</span></div>
  57. <div class="block rise" style="left:12.5%;top:30%;width:12.5%;height:12%">场景<span class="score">0.64</span></div>
  58. <div class="block none" style="left:12.5%;top:42%;width:12.5%;height:5%">声音<span class="score">数据较少</span></div>
  59. <div class="block low" style="left:12.5%;top:47%;width:12.5%;height:11%">实体<span class="score">0.38</span></div>
  60. <div class="block rise" style="left:12.5%;top:58%;width:12.5%;height:25%">知识<span class="score">0.72</span></div>
  61. <div class="block cold" style="left:12.5%;top:83%;width:12.5%;height:7%">现象<span class="score">0.16</span></div>
  62. <div class="block mid" style="left:12.5%;top:90%;width:12.5%;height:6%">事件<span class="score">0.51</span></div>
  63. <div class="block cold" style="left:12.5%;top:96%;width:12.5%;height:4%">观念<span class="score">0.13</span></div>
  64. <div class="block rise" style="left:25%;top:0;width:12.5%;height:8%">日常互动</div>
  65. <div class="block rise" style="left:25%;top:8%;width:12.5%;height:10%">日常活动</div>
  66. <div class="block none" style="left:25%;top:18%;width:12.5%;height:5%">纪念活动</div>
  67. <div class="block high selected" style="left:25%;top:23%;width:12.5%;height:7%">战斗作战<span class="score">0.91</span></div>
  68. <div class="block rise" style="left:25%;top:30%;width:12.5%;height:7%">空间</div>
  69. <div class="block mid" style="left:25%;top:37%;width:12.5%;height:5%">时间</div>
  70. <div class="block cold" style="left:25%;top:42%;width:12.5%;height:5%">音乐 / 语音</div>
  71. <div class="block rise" style="left:25%;top:47%;width:12.5%;height:8%">人物</div>
  72. <div class="block low" style="left:25%;top:55%;width:12.5%;height:3%">物品</div>
  73. <div class="block rise" style="left:25%;top:58%;width:12.5%;height:18%">概念</div>
  74. <div class="block rise" style="left:25%;top:76%;width:12.5%;height:7%">方法</div>
  75. <div class="block none" style="left:25%;top:83%;width:12.5%;height:7%">生活状态</div>
  76. <div class="block rise" style="left:25%;top:90%;width:12.5%;height:6%">历史事件</div>
  77. <div class="block none" style="left:25%;top:96%;width:12.5%;height:4%">社会 / 个人</div>
  78. <div class="block high selected" style="left:37.5%;top:8%;width:12.5%;height:6%">居家生活<span class="score">0.86</span></div>
  79. <div class="block rise" style="left:50%;top:8%;width:12.5%;height:2.8%">家务劳动<span class="score">0.68</span></div>
  80. <div class="block mid" style="left:50%;top:10.8%;width:12.5%;height:1.5%">阅读<span class="score">0.44</span></div>
  81. <div class="block cold" style="left:50%;top:12.3%;width:12.5%;height:1.7%">物品处置<span class="score">0.11</span></div>
  82. <div class="block rise" style="left:62.5%;top:8%;width:12.5%;height:2.8%">家庭清洁</div>
  83. <div class="block none" style="left:62.5%;top:10.8%;width:12.5%;height:1.5%">书本翻页</div>
  84. <div class="block rise" style="left:37.5%;top:47%;width:12.5%;height:4%">现实人物</div>
  85. <div class="block mid" style="left:50%;top:47%;width:12.5%;height:3%">历史名人</div>
  86. <div class="block low" style="left:62.5%;top:47%;width:12.5%;height:2%">政治领袖</div>
  87. <div class="block cold" style="left:75%;top:47%;width:12.5%;height:2%">共和国领导人</div>
  88. <div class="block mid" style="left:37.5%;top:76%;width:12.5%;height:7%">生活技巧</div>
  89. <div class="block none selected" style="left:50%;top:76%;width:12.5%;height:3%">居家生活<span class="score">数据缺失</span></div>
  90. <div class="block low" style="left:62.5%;top:76%;width:12.5%;height:3%">驱蚊技巧<span class="score">探索需求</span></div>
  91. <div class="hotspot" style="right:10px;top:10px"><b>全局阅读方式</b>先看红橙色区域在全树中的位置,再看周围蓝白冷区。<em>红色代表热,不代表更“像需求”</em>;需求成立与否由搜索意义单独判断。</div>
  92. </div>
  93. <div class="reading"><div><b>全局态</b><br>色块密度和颜色形成热冷地形,不依赖读取全部名称。</div><div><b>放大态</b><br>点击“居家生活”后用整个画布展示其子树和需求。</div><div><b>需求态</b><br>系统已完成全树判断,右侧直接给出数百条结果。</div></div>
  94. </section>
  95. <aside class="output">
  96. <h4>系统形成的需求</h4>
  97. <p>按热度、可信度和业务粒度排序。宽泛需求与具体需求可以同时保留,并建立父子关系。</p>
  98. <div class="filters"><span class="active">全部需求</span><span>宽泛</span><span>主题级</span><span>具体</span><span>探索</span></div>
  99. <div class="demand">
  100. <div class="dtop"><strong>战争</strong><span class="badge">宽泛需求</span></div>
  101. <div class="scores"><span>热度 0.91</span><span>可信度 0.78</span><span class="grain">粒度:宽泛</span></div>
  102. <div class="reason"><b>数据事实:</b>“战斗作战”外部信号强,存在真实 ROV / VOV;上游元素包含“战争”。</div>
  103. <div class="model">模型 Reason:“战争”能够独立表达外部搜索意图,因此成立为需求。范围较大只表示它是父级需求,应继续下挂抗日战争、解放战争、人物、事件等子需求。</div>
  104. </div>
  105. <div class="demand">
  106. <div class="dtop"><strong>家庭清洁</strong><span class="badge">主题级需求</span></div>
  107. <div class="scores"><span>热度 0.68</span><span>可信度 0.55</span><span class="grain">粒度:主题级</span></div>
  108. <div class="reason"><b>数据事实:</b>位于“居家生活 → 家务劳动”,上游元素为“家庭清洁”,真实 ROV / VOV 暂缺。</div>
  109. <div class="model">模型 Reason:可以独立搜索并承接多类内容。后验缺失属于验证空白,不应过滤该需求。</div>
  110. </div>
  111. <div class="demand">
  112. <div class="dtop"><strong>驱蚊技巧</strong><span class="badge">具体需求</span></div>
  113. <div class="scores"><span>热度 0.24</span><span>可信度 0.41</span><span class="grain">粒度:具体</span></div>
  114. <div class="reason"><b>数据事实:</b>位于“方法 → 生活技巧 → 居家生活”,上游存在同名具体元素,表现数据缺失。</div>
  115. <div class="model">模型 Reason:虽然属于冷区,但具有明确搜索意义,仍然成立为探索需求。</div>
  116. </div>
  117. <div class="demand not-demand">
  118. <div class="dtop"><strong>表象</strong><span class="badge">不是需求</span></div>
  119. <div class="scores"><span>热度 0.52</span><span class="grain">类型:分类结构词</span></div>
  120. <div class="reason"><b>数据事实:</b>它是全局树根节点,覆盖大量不同语义分支。</div>
  121. <div class="model">模型 Reason:“表象”不能独立表达有意义的外部搜索意图,因此只作为分类结构保留,不进入需求结果。</div>
  122. </div>
  123. </aside>
  124. </div>
  125. <div class="foot"><b>这版解决的问题:</b>深层级和大量节点通过连续面积表达,不再依靠密集线条;冷区始终存在;Score 统一为 0~1;“是否为需求”和“需求粒度”彻底分开。</div>
  126. </section>