Prechádzať zdrojové kódy

feat(query):阶段意图→改名「阶段」,前端按 灵感/选题/脚本 分组缩进展示

依用户:① 轴名/家族名 阶段意图→阶段;② 阶段列在前端按 灵感/选题/脚本 分组、子词缩进显示。
阶段值改存分组结构 {灵感:[找素材/内容方向/案例拆解], 选题:[...], 脚本:[...]},前端 AxisValues
组件对分组对象渲染父级(加粗)+缩进子词、扁平数组照旧。灵感组按用户清单去掉裸"灵感"。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SamLee 2 týždňov pred
rodič
commit
e0bedc6db1

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
acquisition/web/app/dist/assets/index-BweFrMrP.css


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
acquisition/web/app/dist/assets/index-C63djDTc.js


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
acquisition/web/app/dist/assets/index-C_LZCGg-.css


+ 2 - 2
acquisition/web/app/dist/index.html

@@ -4,8 +4,8 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>创作知识 · 找帖子</title>
-    <script type="module" crossorigin src="/app/assets/index-zBoyjJ5B.js"></script>
-    <link rel="stylesheet" crossorigin href="/app/assets/index-C_LZCGg-.css">
+    <script type="module" crossorigin src="/app/assets/index-C63djDTc.js"></script>
+    <link rel="stylesheet" crossorigin href="/app/assets/index-BweFrMrP.css">
   </head>
   <body>
     <div id="root"></div>

+ 19 - 3
acquisition/web/app/src/pages/CreationDemo.jsx

@@ -4,7 +4,23 @@ import React, { useEffect, useState } from 'react'
 // 右侧「Query 词」列出该家族机械正交出的原串(过 query_filter 后标 留/扔)。顶部 5 家族切换。
 const AXIS_KEY = {        // 家族里写的轴名 → axis_values 里的键
   '实质': '实质', '形式': '形式', '作用/感受/意图': '目的池',
-  '阶段意图': '阶段意图', '模态': '模态', '知识类型': '知识类型',
+  '阶段': '阶段', '模态': '模态', '知识类型': '知识类型',
+}
+
+// 阶段值是 {灵感:[...],选题:[...],脚本:[...]} 分组结构,按组+缩进渲染;其余轴是扁平数组。
+function AxisValues({ vals }) {
+  if (Array.isArray(vals)) {
+    return vals.map((v, i) => <div className="axv" key={i}>{v}</div>)
+  }
+  return Object.entries(vals || {}).map(([grp, words]) => (
+    <div key={grp}>
+      <div className="axv grp">{grp}</div>
+      {words.map((w, i) => <div className="axv child" key={i}>{w}</div>)}
+    </div>
+  ))
+}
+function axisCount(vals) {
+  return Array.isArray(vals) ? vals.length : Object.values(vals || {}).reduce((n, w) => n + w.length, 0)
 }
 
 export default function CreationDemo() {
@@ -35,9 +51,9 @@ export default function CreationDemo() {
       <div className="cdemo">
         {fam.axes.map(ax => (
           <div className="axcol" key={ax}>
-            <div className="axhd">{ax}<span className="gn">{(data.axis_values[AXIS_KEY[ax]] || []).length}</span></div>
+            <div className="axhd">{ax}<span className="gn">{axisCount(data.axis_values[AXIS_KEY[ax]])}</span></div>
             <div className="axlist">
-              {(data.axis_values[AXIS_KEY[ax]] || []).map((v, i) => <div className="axv" key={i}>{v}</div>)}
+              <AxisValues vals={data.axis_values[AXIS_KEY[ax]]} />
             </div>
           </div>
         ))}

+ 3 - 0
acquisition/web/app/src/styles.css

@@ -38,6 +38,9 @@ h1 { font-size: 22px; margin: 0 0 2px; letter-spacing: .5px; }
 .axhd .gn { font-size: 11px; font-weight: 600; color: var(--muted); background: #f0f0f3; border-radius: 10px; padding: 1px 7px; }
 .axlist { max-height: 62vh; overflow: auto; }
 .axv { font-size: 12.5px; padding: 5px 11px; border-bottom: 1px solid #f3f3f5; color: #555; white-space: nowrap; }
+.axv.grp { font-weight: 700; color: #222; background: #fafafb; }
+.axv.child { padding-left: 26px; color: #666; }
+.axv.child::before { content: '·'; color: var(--muted); margin-right: 6px; }
 .qrow { display: flex; align-items: baseline; gap: 7px; padding: 6px 11px; border-bottom: 1px solid #f3f3f5; font-size: 13px; }
 .qrow.keep .qmark { color: var(--ok); font-weight: 700; }
 .qrow.drop { color: var(--muted); }

+ 17 - 16
scripts/build_creation_demo.py

@@ -30,7 +30,7 @@ MODALITY = ["视频", "图片"]   # 被创作内容的形态(与教学帖本身
 # 创作阶段意图轴(脊柱):灵感/选题/脚本 展开成创作者真会搜的词(query构造.md)。真实数据里
 # "脚本"0次、但 开头/钩子/标题/封面/选题 各几十次——故用展开词,不用三个干阶段词。
 STAGE_INTENT = {
-    "灵感": ["找素材", "内容方向", "案例拆解", "灵感"],
+    "灵感": ["找素材", "内容方向", "案例拆解"],
     "选题": ["选题", "爆款选题", "选题方向"],
     "脚本": ["脚本", "文案", "开头", "钩子", "结构", "标题", "封面", "结尾"],
 }
@@ -109,29 +109,30 @@ def main():
     SHI = _nonleaf(idx, "实质", depths=(3, 4), under="理念")   # 类目层,非元素
     XING = _nonleaf(idx, "形式", depths=(3, 4), under="架构")  # 类目层,非元素
     POOL = _leaves(idx, "作用") + _leaves(idx, "感受") + _leaves(idx, "意图")
-    print(f"实质 {len(SHI)} / 形式 {len(XING)} / 目的池 {len(POOL)} / 阶段意图 {len(INTENT)}")
+    print(f"实质 {len(SHI)} / 形式 {len(XING)} / 目的池 {len(POOL)} / 阶段 {len(INTENT)}")
 
     def pick(seq):
         return rng.choice(seq)
 
     # 每家族:生成器 + 用到的轴(给前端标列)
-    # 阶段意图=脊柱,每族必带;模态+知识类型固定收尾;前面配 实质/形式/目的 之一或组合
+    # 阶段=脊柱,每族必带;模态+知识类型固定收尾;前面配 实质/形式/目的 之一或组合
     families = [
-        {"key": "f1", "name": "实质 × 阶段意图", "axes": ["实质", "阶段意图", "模态", "知识类型"],
-         "gen": lambda: {"parts": {"实质": pick(SHI), "阶段意图": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
-        {"key": "f2", "name": "形式 × 阶段意图", "axes": ["形式", "阶段意图", "模态", "知识类型"],
-         "gen": lambda: {"parts": {"形式": pick(XING), "阶段意图": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
-        {"key": "f3", "name": "实质 × 形式 × 阶段意图", "axes": ["实质", "形式", "阶段意图", "模态", "知识类型"],
-         "gen": lambda: {"parts": {"实质": pick(SHI), "形式": pick(XING), "阶段意图": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
-        {"key": "f4", "name": "(作用/感受/意图) × 阶段意图", "axes": ["作用/感受/意图", "阶段意图", "模态", "知识类型"],
-         "gen": lambda: {"parts": {"目的": pick(POOL), "阶段意图": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
-        {"key": "f5", "name": "纯阶段意图", "axes": ["阶段意图", "模态", "知识类型"],
-         "gen": lambda: {"parts": {"阶段意图": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f1", "name": "实质 × 阶段", "axes": ["实质", "阶段", "模态", "知识类型"],
+         "gen": lambda: {"parts": {"实质": pick(SHI), "阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f2", "name": "形式 × 阶段", "axes": ["形式", "阶段", "模态", "知识类型"],
+         "gen": lambda: {"parts": {"形式": pick(XING), "阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f3", "name": "实质 × 形式 × 阶段", "axes": ["实质", "形式", "阶段", "模态", "知识类型"],
+         "gen": lambda: {"parts": {"实质": pick(SHI), "形式": pick(XING), "阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f4", "name": "(作用/感受/意图) × 阶段", "axes": ["作用/感受/意图", "阶段", "模态", "知识类型"],
+         "gen": lambda: {"parts": {"目的": pick(POOL), "阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
+        {"key": "f5", "name": "纯阶段", "axes": ["阶段", "模态", "知识类型"],
+         "gen": lambda: {"parts": {"阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
     ]
-    # 各部件按固定顺序拼成原串(内容维度在前,阶段意图+模态+知识类型固定收尾)
-    order = ["实质", "形式", "目的", "阶段意图", "模态", "知识类型"]
+    # 各部件按固定顺序拼成原串(内容维度在前,阶段+模态+知识类型固定收尾)
+    order = ["实质", "形式", "目的", "阶段", "模态", "知识类型"]
 
-    out = {"axis_values": {"实质": SHI, "形式": XING, "目的池": POOL, "阶段意图": INTENT, "模态": MODALITY, "知识类型": KTYPE},
+    # 阶段值存「分组结构」(STAGE_INTENT),前端按 灵感/选题/脚本 分组+缩进展示;其余轴是扁平数组
+    out = {"axis_values": {"实质": SHI, "形式": XING, "目的池": POOL, "阶段": STAGE_INTENT, "模态": MODALITY, "知识类型": KTYPE},
            "families": []}
     for fam in families:
         seen, items = set(), []

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov