jim800121chen c54f16fca0 Initial commit: visionA monorepo with local-tool subproject
local-tool/: visionA-local desktop app
- M1: Wails shell + Go server + Next.js UI + Mock mode (macOS dmg ready)
- M2: i18n (zh-TW/en) + Settings 4-tab refactor
- M3: Embedded Python 3.12 runtime (python-build-standalone) + KneronPLUS wheels
- M4: Windows Inno Setup script (build on Windows runner)
- M5: Linux AppImage script + udev rule (build on Linux runner)
- M6: ffmpeg (GPL, pending legal review) + yt-dlp bundled
- Lifecycle: watchServer health check, fatal native dialog,
            Wails IPC raise endpoint, stale process cleanup

.autoflow/: full PRD / Design Spec / Architecture / Testing docs
            (4 rounds tri-party discussion + cross review)
.github/workflows/: macOS / Windows / Linux build CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 22:10:38 +08:00

240 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 03 — 主要頁面 Wireframe結構化描述
以下為文字版 wireframe。所有尺寸以 Desktop 1280×800 為基準sidebar 固定 240px。
## 3.1 Dashboard`/`
**設計意圖**原本是叢集總覽local 版改為「快速開始 + 單機狀態」,幫使用者 3 秒內決定下一步動作。
```
┌─ Sidebar ─┬──────────────────────── Content ───────────────────────┐
│ │ Dashboard [Mock?] [●Server] [?] │
│ ├────────────────────────────────────────────────────────┤
│ │ │
│ │ 你好 👋 │
│ │ visionA-local 已準備就緒 │
│ │ │
│ │ ┌─ Quick Start ──────────────────────────────────┐ │
│ │ │ [①接上裝置] [②選擇模型] [③前往 Workspace →] │ │
│ │ │ (步驟卡,已完成的打勾) │ │
│ │ └────────────────────────────────────────────────┘ │
│ │ │
│ │ ┌─ Status ────┐ ┌─ Status ────┐ ┌─ Status ────┐ │
│ │ │ 🔌 已連裝置 │ │ 📦 可用模型 │ │ ⏱ Uptime │ │
│ │ │ 2 │ │ 6 │ │ 00:12:34 │ │
│ │ │ (KL720×1, │ │ (預置 5 + │ │ │ │
│ │ │ KL520×1) │ │ 自訂 1) │ │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ │ ┌─ 最近活動 ────────────────────────────────────┐ │
│ │ │ • 10:42 USB 裝置「KL720-A」已連線 │ │
│ │ │ • 10:41 模型「fd_mask.nef」已載入 │ │
│ │ │ • 10:40 Server 已啟動localhost:3721 │ │
│ │ │ ... │ │
│ │ └────────────────────────────────────────────────┘ │
│ │ │
└───────────┴────────────────────────────────────────────────────────┘
```
**元件組成:**
- `QuickStartCard`3 步卡片,根據狀態打勾(狀態來自 `/api/devices` + `/api/models`
- 3 個 `StatCard`:已連裝置 / 可用模型 / Uptime原有元件調整 label
- `ActivityTimeline`:沿用,過濾掉 cluster 事件
**互動:**
- 點「③前往 Workspace」= 跳到 `/workspace`
- 點 StatCard 上的數字可跳到對應頁
- 最近活動項目可 hover 顯示完整時間戳
**空狀態**:若還沒有任何裝置/模型,步驟卡會顯示引導文字「先接上一顆 Kneron 裝置吧」並附 CTA 到 Devices。
---
## 3.2 Models`/models`
**設計意圖**沿用原設計model-grid + filters + detail drawer只移除 cluster 欄位。
```
┌─ Sidebar ─┬────────────────────────── Content ─────────────────────┐
│ │ Models [+ 上傳模型] │
│ ├────────────────────────────────────────────────────────┤
│ │ [搜尋____] [架構▾] [類別▾] [排序▾] 共 6 個模型 │
│ │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ │ Card │ │ Card │ │ Card │ │ Card │ │
│ │ │ 縮圖 │ │ 縮圖 │ │ 縮圖 │ │ 縮圖 │ │
│ │ │ 名稱 │ │ 名稱 │ │ 名稱 │ │ 名稱 │ │
│ │ │ 類別 │ │ 類別 │ │ 類別 │ │ 類別 │ │
│ │ │ [詳情]│ │ [詳情]│ │ [詳情]│ │ [詳情]│ │
│ │ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │ │
│ │ ┌──────┐ ┌──────┐ │
│ │ │ Card │ │ Card │ │
│ │ └──────┘ └──────┘ │
│ │ │
│ │ [將 .nef 拖放到這裡也可以上傳] ← dropzone 提示 │
└───────────┴────────────────────────────────────────────────────────┘
```
- 拖放區域覆蓋整個 Models 頁面hover 拖曳時變藍色高亮
- 點 Card 開啟 Detail Drawer側邊滑出
- 上傳 Dialog 沿用原 `model-upload-dialog`
**空狀態**:無模型時顯示「還沒有模型,上傳一個 .nef 試試 →」,附大型上傳按鈕與預置模型列表連結。
---
## 3.3 Devices`/devices`
```
┌─ Sidebar ─┬────────────────────────── Content ─────────────────────┐
│ │ Devices [🔄 重新掃描] [真實 / Mock]│
│ ├────────────────────────────────────────────────────────┤
│ │ ⓘ 插上 Kneron USB 裝置後自動出現在下方 │
│ │ │
│ │ ┌─ Connected ─────────────────────────────────────┐ │
│ │ │ ┌──────────┐ ┌──────────┐ │ │
│ │ │ │ KL720-A │ │ KL520-B │ │ │
│ │ │ │ 🟢 Ready │ │ 🟢 Ready │ │ │
│ │ │ │ FW 2.1.0 │ │ FW 1.8.3 │ │ │
│ │ │ │ [Workspc]│ │ [Workspc]│ │ │
│ │ │ └──────────┘ └──────────┘ │ │
│ │ └─────────────────────────────────────────────────┘ │
│ │ │
│ │ ┌─ Disconnected History ──────────────────────────┐ │
│ │ │ (過去連接過的裝置,用於顯示連線紀錄) │ │
│ │ └─────────────────────────────────────────────────┘ │
│ │ │
│ │ ⓘ Connection Log (drawer, 點右下角按鈕展開) │
└───────────┴────────────────────────────────────────────────────────┘
```
- 右上角 `真實 / Mock` 是切換 pill點擊彈出確認對話框避免誤觸
- Device Card 點「Workspace」直接跳到 `/workspace?device=<id>`
- 韌體燒錄按鈕**已移除**
- Connection Log drawer 從右側滑出(沿用 `device-connection-log.tsx`
**空狀態**
- 真實模式無裝置:顯示大型 empty state — 插圖USB 接頭)+ 「沒偵測到 Kneron 裝置」+ 排錯清單(重插 USB / 檢查權限 / 切到 Mock 模式)
- Mock 模式:固定顯示 3 顆假裝置,每個都有 `Mock` 小標
---
## 3.4 Workspace`/workspace`
**設計意圖**:核心操作頁,左右分欄 — 左邊攝影機畫面+推論 overlay右邊控制面板。
```
┌─ Sidebar ─┬────────────────────────── Content ─────────────────────┐
│ │ Workspace [裝置▾ KL720-A] [▣ Live | ▤ Batch | ▧ Video]│
│ ├────────────────────────────────────────────────────────┤
│ │ ┌─────────── Camera Feed ────────────┐ ┌─ Control ──┐ │
│ │ │ │ │ 模型: │ │
│ │ │ │ │ [fd_mask]│ │
│ │ │ [MJPEG + Overlay] │ │ │ │
│ │ │ │ │ Confidence│ │
│ │ │ │ │ ━━━● 0.7 │ │
│ │ │ │ │ │ │
│ │ │ │ │ Source: │ │
│ │ │ │ │ [webcam ▾]│ │
│ │ │ │ │ │ │
│ │ │ │ │ [▶ Start] │ │
│ │ └────────────────────────────────────┘ │ │ │
│ │ ┌── Results Timeline ─────────────────┐ │ Perf: │ │
│ │ │ (bounding boxes / classes list) │ │ FPS: 24 │ │
│ │ └────────────────────────────────────┘ │ Latency: │ │
│ │ │ 180ms │ │
│ │ └────────────┘ │
└───────────┴────────────────────────────────────────────────────────┘
```
- **頂部 Tab**Live即時串流/ Batch批次圖片/ Video影片檔— 三模式切換
- **裝置選擇器**top bar 左邊,下拉選單顯示所有已連裝置;只有 1 顆時直接顯示名稱;無裝置時顯示 EmptyWorkspace
- **Camera Feed**:沿用 `camera-feed` + `camera-overlay`
- **Control Panel**:沿用 `inference-panel` + `confidence-slider` + `source-selector`
- **Results Timeline**:底部時間軸,顯示每秒的推論結果摘要
- **Perf 指標說明**
- `FPS` 顯示目前即時影格率
- `Latency`**MJPEG 端到端延遲**(拍到→瀏覽器顯示),第四輪 R4-2 定案目標:**首次 ≤250ms、穩定後 ≤150ms**。上圖示例 180ms 為「穩定後但略高於理想」的典型值;實際數字會隨硬體與解析度變動。
- 當 Latency > 250ms 時以 `warning` 顏色顯示,使用者可點擊查看瓶頸(未來功能)
**空狀態**EmptyWorkspace 元件):
```
┌────────────────────────────────────────────────────┐
│ │
│ 🔌 │
│ │
│ 還沒有可用的裝置 │
│ │
│ 接上一顆 Kneron USB 裝置,或切到 Mock 模式 │
│ 先體驗看看。 │
│ │
│ [前往 Devices] [切到 Mock 模式] │
│ │
└────────────────────────────────────────────────────┘
```
---
## 3.5 Settings`/settings/[tab]`
```
┌─ Sidebar ─┬────────────────────────── Content ─────────────────────┐
│ │ Settings │
│ ├────────────────────────────────────────────────────────┤
│ │ ┌── Tabs ──┬── Panel ────────────────────────────────┐│
│ │ │ ● 一般 │ ││
│ │ │ ○ 硬體 │ 語言 [繁中 ▾] ││
│ │ │ ○ 模型 │ ││
│ │ │ ○ 進階 │ 啟動時開啟 [Dashboard ▾] ││
│ │ │ │ ││
│ │ │ │ 資料目錄 ~/Library/Application ││
│ │ │ │ Support/visiona-local/ ││
│ │ │ │ [在 Finder 顯示] ││
│ │ │ │ ││
│ │ │ │ 主題 跟隨系統(目前:深色) ││
│ │ │ │ ⓘ 深色模式自動跟隨系統 ││
│ │ │ │ ││
│ │ └──────────┴──────────────────────────────────────────┘│
└───────────┴────────────────────────────────────────────────────────┘
```
### 分頁內容
**一般**
- 語言(繁中 / English / 跟隨系統)
- 啟動時預設頁Dashboard / Workspace / 上次開啟的頁)
- 資料目錄(唯讀顯示 + 「在 Finder/Explorer 顯示」按鈕)
- 主題(唯讀顯示「跟隨系統」+ 當前 light/dark 狀態)
**硬體**
- 執行模式(真實硬體 / Mock— 切換時有確認對話框
- USB 權限狀態(唯讀)
- Server Port預設 3721衝突時可改
- 裝置自動掃描頻率(預設 5 秒)
**模型**
- 預置模型顯示開關(可隱藏內建模型只看自訂)
- 自訂模型路徑(唯讀顯示 + 「新增路徑」)
- 清除模型快取
**進階**
- 開啟日誌 viewer嵌入 `server-log-viewer`
- 開啟 Server 狀態(嵌入 `server-status-dashboard`
- **Server Port** 唯讀顯示(預設 3721若被占用會自動挑下一個顯示實際使用的 port + 「複製」按鈕)
- **Python 執行模式**(第四輪新增 UI 入口,對應 Architect `dependency-bundling.md §1.5``--python-mode` CLI flag
```
Python 執行模式 [內嵌 (推薦) ▾]
選項:
• 內嵌 — 使用 App 內建的 python-build-standalone完全離線
• 系統 — 使用系統 Python需自行安裝 KneronPLUS
• 自動 — 優先內嵌,失敗時退回系統
目前狀態:內嵌 Python 3.11.7(✓ 已就緒)
[重新偵測]
```
切換後**需要重啟 App** 才能生效(顯示 toast 提示。此區塊資料來源Architect 需提供 `/api/system/python-mode`GET 讀目前狀態、POST 切換)。
- 重置所有設定(危險操作,雙重確認)
- 關於 visionA-local版本、授權、第三方套件、Kneron SDK 版本)
**備註**:原規劃有「外觀」分頁,因為只剩語言一項且主題跟隨系統,合併到「一般」分頁。