frontend ├─ .eslintrc.cjs ├─ .git // Git 紀錄 │ └─ refs │ ├─ heads │ │ ├─ lucia-demo-v0.99.0 │ │ └─ main │ ├─ remotes │ │ └─ origin │ │ ├─ lucia-demo-v0.99.0 │ │ └─ main │ └─ tags │ ├─ v0.99.0 │ ├─ v0.99.1 │ ├─ v0.99.1.01 │ ├─ v0.99.1.02 │ ├─ v0.99.2 │ ├─ v0.99.3 │ ├─ v0.99.4 │ ├─ v0.99.5 │ ├─ v0.99.6 │ ├─ v0.99.7 │ ├─ v0.99.9 │ └─ v1.0.0 ├─ .gitignore ├─ .prettierrc.json ├─ README.md ├─ cypress // E2Etesting 檔 │ ├─ downloads │ ├─ e2e // 要跑測試的檔案放這邊 │ │ ├─ compare.cy.js │ │ └─ jsconfig.json │ ├─ fixtures │ │ ├─ csv // 上傳功能測試檔 │ │ │ ├─ big5.csv │ │ │ ├─ corrupted.csv │ │ │ ├─ empty.csv │ │ │ ├─ favicon.ico │ │ │ ├─ insufficient-columns.csv │ │ │ ├─ rightFile.csv │ │ │ └─ worngFile.csv │ │ ├─ doneTesting // 已經測試過的檔案 │ │ │ ├─ conformanceRule.cy.js │ │ │ ├─ conformanceSave.cy.js │ │ │ ├─ fileUploadEtc.cy.js │ │ │ ├─ filterFunnel.cy.js │ │ │ ├─ loginToLogout.cy.js │ │ │ ├─ performance.cy.js │ │ │ └─ saveLogAndFilter.cy.js │ │ └─ users // 測試用的假帳號資料 │ │ └─ id-not-exists.json │ ├─ screenshots │ ├─ support // E2Etesting 元件檔 │ │ ├─ commands.js │ │ └─ e2e.js │ └─ videos // E2Etesting 影片 │ └─ compare.cy.js.mp4 ├─ cypress.config.js // Cypress E2Etesting 設定檔 ├─ doc // 檔案總管 │ └─ structure.txt ├─ index.html // Vite的進入點 ├─ package-lock.json ├─ package.json ├─ postcss.config.cjs ├─ public // 不被 JavaScript 引用的靜態資源 │ ├─ chartSpace.jpg │ ├─ favicon.ico // 網頁標題欄 icon │ ├─ filterContainment.png │ └─ timeFrameSlope.jpg ├─ src │ ├─ App.vue // 網頁根元件 │ ├─ assets // 靜態資源 EX: 圖片, CSS │ │ ├─ base.css │ │ ├─ components.css │ │ ├─ layout.css │ │ ├─ main.css │ │ ├─ tailwind.css │ │ └─ vendors.css │ ├─ components // 元件檔 │ │ ├─ Compare │ │ │ └─ SidebarStates.vue │ │ ├─ Discover │ │ │ ├─ Conformance │ │ │ │ ├─ ConformanceResults.vue │ │ │ │ ├─ ConformanceSidebar │ │ │ │ │ ├─ ActList.vue │ │ │ │ │ ├─ ActRadio.vue │ │ │ │ │ ├─ ActSeqDrag.vue │ │ │ │ │ ├─ ConformanceRadioGroup.vue │ │ │ │ │ ├─ ConformanceSelectResult.vue │ │ │ │ │ ├─ ConformanceShowBar.vue │ │ │ │ │ ├─ ConformanceTimeRange.vue │ │ │ │ │ ├─ ResultArrow.vue │ │ │ │ │ ├─ ResultCheck.vue │ │ │ │ │ ├─ ResultDot.vue │ │ │ │ │ └─ TimeRangeDuration.vue │ │ │ │ ├─ ConformanceSidebar.vue │ │ │ │ └─ MoreModal.vue │ │ │ ├─ Map │ │ │ │ ├─ Filter │ │ │ │ │ ├─ ActAndSeq.vue │ │ │ │ │ ├─ ActOcc.vue │ │ │ │ │ ├─ ActOccCase.vue │ │ │ │ │ ├─ Attributes.vue │ │ │ │ │ ├─ Funnel.vue │ │ │ │ │ ├─ Timeframes.vue │ │ │ │ │ └─ Trace.vue │ │ │ │ ├─ SidebarFilter.vue │ │ │ │ ├─ SidebarState.vue │ │ │ │ ├─ SidebarTraces.vue │ │ │ │ └─ SidebarView.vue │ │ │ └─ StatusBar.vue │ │ ├─ File │ │ │ └─ UploadModal.vue │ │ ├─ Header.vue │ │ ├─ Loading.vue │ │ ├─ Navbar.vue │ │ ├─ Search.vue │ │ ├─ durationjs.vue │ │ └─ icons // 放所有 icon 的 svg 檔 │ │ ├─ DspLogo.vue │ │ ├─ IconDataFormat.vue │ │ ├─ IconEyeClose.vue │ │ ├─ IconEyeOpen.vue │ │ ├─ IconFlowChart.vue │ │ ├─ IconGrid.vue │ │ ├─ IconList.vue │ │ ├─ IconLockKey.vue │ │ ├─ IconMember.vue │ │ ├─ IconNA.vue │ │ ├─ IconRule.vue │ │ ├─ IconSearch.vue │ │ ├─ IconSetting.vue │ │ ├─ IconUploarding.vue │ │ ├─ IconVector.vue │ │ ├─ IconWarnTriangle.vue │ │ └─ IconsFilter.vue │ ├─ main.ts // 程式進入點 │ ├─ module // JavaScript 邏輯 │ │ ├─ abbreviateNumber.js │ │ ├─ alertModal.js // SweetAlert │ │ ├─ apiError.js // API Error 邏輯 │ │ ├─ cytoscapeMap.js │ │ ├─ cytoscapeMapTrace.js │ │ ├─ numberLabel.js │ │ ├─ setChartData.js │ │ ├─ shortScaleNumber.js │ │ ├─ sortNumEngZhtw.js │ │ └─ timeLabel.js │ ├─ router // Vue Router 路由管理 │ │ └─ index.js │ ├─ stores // 資料狀態管理器 │ │ ├─ allMapData.js │ │ ├─ compare.js │ │ ├─ conformance.js │ │ ├─ files.js │ │ ├─ loading.js │ │ ├─ login.ts │ │ ├─ main.ts │ │ └─ performance.js │ └─ views // 路由元件 │ ├─ AuthContainer.vue │ ├─ Compare │ │ └─ Dashboard │ │ └─ index.vue │ ├─ Discover │ │ ├─ Conformance │ │ │ └─ index.vue │ │ ├─ Map │ │ │ └─ index.vue │ │ └─ Performance │ │ └─ index.vue │ ├─ Files │ │ └─ index.vue │ ├─ Login │ │ └─ index.vue │ ├─ MainContainer.vue │ ├─ MemberArea │ │ └─ index.vue │ ├─ NotFound404.vue │ └─ Upload │ └─ index.vue ├─ tailwind.config.js // Tailwind 設定檔 └─ vite.config.js // Vite 設定檔