Diagram‐draw.io - daniel-qa/Vue GitHub Wiki

  • 注音字型
flowchart TD
    subgraph INIT["初始化(每個 editor 獨立閉包)"]
        I1["addPhonicListener(editor)"]
        I2["savedRange = null\npopoverEl = null"]
        I3["document.addEventListener(mouseup / keyup)"]
        I4["fetch /fonts/phonic_table_Z.txt\n→ dictMap (lazy)"]
    end

    subgraph TRIGGER["觸發:使用者選取文字"]
        T1["onDocMouseUp / onDocKeyUp"]
        T2["確認事件來自此 editor.$textElem"]
        T3["handleSelection()"]
        T4{{"editor.isZhuyinFont ?\n(注音模式開啟?)"}}
        T5["getSelectionText() → firstChar"]
        T6["lookupPhonic(firstChar)\n→ candidates[]"]
        T7{{"candidates.length > 1 ?"}}
    end

    subgraph POPOVER["顯示候選字浮層"]
        P1["cloneRange → firstCharRange\n(縮小至第一個字元)"]
        P2["savedRange = firstCharRange\nsavedRange._firstChar = char"]
        P3["showPopover(candidates, rect)"]
        P4["建立 .phonic-popover DOM\n附加候選字按鈕"]
        P5["document.body.appendChild"]
    end

    subgraph PICK["使用者點選候選字"]
        C1["btn.mousedown → onPickPhonic(index)"]
        C2["buildIVS(char, index)\n→ ivsStr (Unicode IVS)"]
        C3["savedRange.deleteContents()\n→ insertNode(textNode)"]
        C4["editor.change.emit()"]
        C5["closePopover()\n移除 DOM,清除 savedRange"]
    end

    subgraph OUTSIDE["點選浮層外部"]
        O1["onOutsideClick\n(setTimeout 0ms)"]
        O2["closePopover()"]
    end

    I1 --> I2 --> I3
    I3 --> T1 --> T2 --> T3 --> T4
    T4 -->|是| T5 --> T6 --> T7
    T4 -->|否| STOP["略過"]
    T7 -->|是| P1 --> P2 --> P3 --> P4 --> P5
    T7 -->|否| STOP2["不顯示浮層"]
    P5 --> C1 --> C2 --> C3 --> C4 --> C5
    P5 --> O1 --> O2

  • 試題
flowchart TD
    A["使用者點擊 + 新增題目"] --> B["CreateExercises.vue / BaseEditExercise.vue\n填寫題型 難度 學段 科目 知識點"]

    B --> C["evTools.createBlobItem()\n完整富文本格式 含 HTML question/option"]
    B --> D["evTools.createCosmosItem()\n索引格式 純文字摘要 去除 base64"]

    C --> E["blobTool.upload()\n上傳 item/{guid}/{guid}.json 至 Azure Blob\n需先取得 SAS Token"]
    E --> F{上傳成功?}
    F -- 失敗 --> G["顯示錯誤訊息"]
    F -- 成功 取得 blob URL --> H

    D --> H["POST /item/upsert\nnewEvaluation.SaveSingleExercise()\n{ itemInfo, option: insert/update }"]

    B -- type = compose --> V["每個子題各自上傳 Blob\nitem/{childId}/{childId}.json"]
    V --> W["各自呼叫 POST /item/upsert\npid = 父題 id"]
    W --> X["父題 children 只存子題 ID 陣列"]
    X --> H

    H --> J["ItemController.Upsert()"]
    J --> K["計算 Blob 大小 itemInfo.size"]
    K --> L["BlobService.RefreshBlobRoot()\n發送 Service Bus 刷新訊息"]
    L --> M{scope?}

    M -- private --> N["Cosmos Teacher 容器\nPartitionKey = Item-teacherId"]
    M -- school --> O["Cosmos School 容器\nPartitionKey = Item-schoolCode"]
    M -- area/public --> P["Cosmos Normal 容器"]

    N --> Q{option?}
    O --> Q
    P --> Q

    Q -- insert --> R["CreateItemAsync()\n已存在回傳 409"]
    Q -- update --> S["ReplaceItemAsync()"]

    R --> T["發送 ServiceBus ItemCondQueue"]
    S --> T
    T --> U["非同步更新 Redis\nItemCond 統計快取"]

✅ 方法 1:直接貼 Mermaid(最推薦)

打開 diagrams.net

上方選單點: Arrange(排列) → Insert(插入) → Advanced(進階) → Mermaid

貼上你的 Mermaid code,例如:

graph TD

A[開始] --> B[處理]
B --> C[結束]

按 Insert

→ 會直接生成圖

✅ 方法 2:右鍵插入(新版 UI)

有些版本會變成:

右鍵畫布

Insert → Advanced → Mermaid

效果一樣

✅ 方法 3:如果你是 Mermaid 檔案(.mmd / .md)

draw.io 不能直接 import .mmd 檔變圖

你要:

打開檔案

複製 Mermaid 內容

用方法 1 貼進去

⚠️ 常見踩雷

❌ 不支援「整個 .md 自動轉 diagram」
❌ 不支援直接 drag & drop Mermaid file
⚠️ Mermaid 語法錯會「整張圖不生成」