|
19 | 19 |
|
20 | 20 | ```mermaid |
21 | 21 | flowchart TB |
22 | | - App["Android App"] --> School["學校系統 API"] |
| 22 | + subgraph Repo["Repo"] |
| 23 | + Android["android/\nKotlin / Jetpack Compose / Material 3"] |
| 24 | + Demo["demo/\n展示網站與截圖素材"] |
| 25 | + Workflows[".github/workflows/\nrelease、demo deploy、CodeQL"] |
| 26 | + end |
| 27 | +
|
| 28 | + subgraph AndroidApp["Android app: com.clhs.score"] |
| 29 | + Main["MainActivity\n入口、deep link、FLAG_SECURE、生物識別鎖"] |
| 30 | + AppShell["ScoreApp\nCompose NavHost 與全域狀態同步"] |
| 31 | +
|
| 32 | + subgraph UI["ui/"] |
| 33 | + Login["WebViewLoginScreen\n學校登入與 cookie 回收"] |
| 34 | + Grades["GradesScreen / Subject / Charts\n成績總覽、分析、趨勢、模擬器"] |
| 35 | + ScheduleUi["schedule/ScheduleScreen\n課表查詢與 Widget 設定"] |
| 36 | + SettingsUi["SettingsScreen\n主題、通知、更新、匯出、生物識別"] |
| 37 | + LockUi["BiometricLockScreen\n指紋 / PIN 解鎖覆蓋層"] |
| 38 | + end |
| 39 | +
|
| 40 | + subgraph ViewModels["viewmodel/"] |
| 41 | + ScoreVm["ScoreViewModel\n登入、成績、比較、趨勢、匯出、段考提醒"] |
| 42 | + ScheduleVm["ScheduleViewModel\n課表查詢與 Widget 偏好"] |
| 43 | + SettingsVm["SettingsViewModel\n設定、通知 topic、更新檢查"] |
| 44 | + end |
| 45 | +
|
| 46 | + subgraph Data["data/"] |
| 47 | + GradeRepo["GradeRepository\nsession restore、cache-first 成績讀取"] |
| 48 | + ScheduleRepo["ScheduleRepository\n課表年份、班級、課表內容"] |
| 49 | + SchoolClient["SchoolGradeClient\nOkHttp + Jsoup + JSON parsing"] |
| 50 | + CookieJar["SchoolCookieJar\n同步鎖保護 cookie 讀寫"] |
| 51 | + Stores["SessionStore / GradeCacheStore / SettingsRepository\nDataStore、Security Crypto、本機快取"] |
| 52 | + Analysis["GradeAnalysis / GradeReportDiffer\n分析、趨勢、可見資訊 diff"] |
| 53 | + Exporter["GradeExporter\nMediaStore CSV 匯出"] |
| 54 | + Biometric["BiometricHelper\nKeystore key wrapping"] |
| 55 | + FakeData["FakeData\n-PuseFakeData / demo mode"] |
| 56 | + end |
| 57 | +
|
| 58 | + subgraph Background["背景與系統整合"] |
| 59 | + Reminder["GradeReminderWorker + Scheduler + Notifier\nWorkManager 15 分鐘週期檢查"] |
| 60 | + Widget["ScheduleWidget + Receivers\nGlance widget 與 AlarmManager 更新"] |
| 61 | + Fcm["ScoreFirebaseMessagingService + TopicManager\nFCM 通知與 topic 訂閱"] |
| 62 | + Channels["NotificationChannels\nscore_updates / grade_reminders"] |
| 63 | + FileProvider["FileProvider\nAPK 更新安裝與匯出分享 URI"] |
| 64 | + end |
| 65 | +
|
| 66 | + subgraph Analytics["analytics/"] |
| 67 | + Logger["AnalyticsLogger / FirebaseAnalyticsLogger\n集中匿名事件記錄"] |
| 68 | + Sanitizer["AnalyticsParameterSanitizer\n白名單與敏感欄位防護"] |
| 69 | + end |
| 70 | + end |
| 71 | +
|
| 72 | + subgraph External["外部服務 / Android 系統"] |
| 73 | + School["欣河智慧校園 / 學校系統\nhttps://shcloud2.k12ea.gov.tw/CLHSTYC"] |
| 74 | + Firebase["Firebase\nAnalytics + Cloud Messaging"] |
| 75 | + GitHub["GitHub Releases\n版本檢查與 APK 發布"] |
| 76 | + AndroidSystem["Android System\n通知權限、Keystore、MediaStore、AppWidget、WorkManager"] |
| 77 | + end |
| 78 | +
|
| 79 | + subgraph Tests["驗證"] |
| 80 | + UnitTests["src/test\nRepository、ViewModel、Analytics、Reminder、Boundary tests"] |
| 81 | + UiTests["src/androidTest\nCompose UI test"] |
| 82 | + DebugOnly["src/debug\nGradeReminderDebugReceiver"] |
| 83 | + end |
| 84 | +
|
| 85 | + Android --> Main |
| 86 | + Main --> AppShell |
| 87 | + Main --> LockUi |
| 88 | + AppShell --> UI |
| 89 | + UI --> ViewModels |
| 90 | + Login --> ScoreVm |
| 91 | + ScoreVm --> GradeRepo |
| 92 | + ScoreVm --> Analysis |
| 93 | + ScoreVm --> Exporter |
| 94 | + ScoreVm --> Reminder |
| 95 | + ScheduleVm --> ScheduleRepo |
| 96 | + SettingsVm --> Stores |
| 97 | + SettingsVm --> Fcm |
| 98 | + SettingsVm --> GitHub |
| 99 | + GradeRepo --> SchoolClient |
| 100 | + GradeRepo --> Stores |
| 101 | + ScheduleRepo --> SchoolClient |
| 102 | + ScheduleRepo --> Stores |
| 103 | + SchoolClient --> CookieJar |
| 104 | + SchoolClient --> School |
| 105 | + Reminder --> GradeRepo |
| 106 | + Reminder --> Stores |
| 107 | + Widget --> Stores |
| 108 | + Fcm --> Firebase |
| 109 | + Logger --> Firebase |
| 110 | + Sanitizer --> Logger |
| 111 | + FileProvider --> AndroidSystem |
| 112 | + Biometric --> AndroidSystem |
| 113 | + Stores --> AndroidSystem |
| 114 | + Reminder --> AndroidSystem |
| 115 | + Widget --> AndroidSystem |
| 116 | + Channels --> AndroidSystem |
| 117 | + Workflows --> GitHub |
| 118 | + Workflows --> Android |
| 119 | + Demo --> Workflows |
| 120 | + UnitTests --> ScoreVm |
| 121 | + UnitTests --> GradeRepo |
| 122 | + UiTests --> AppShell |
| 123 | + DebugOnly --> Reminder |
23 | 124 | ``` |
24 | 125 |
|
| 126 | +核心資料流是 `Compose UI -> ViewModel -> Repository -> SchoolGradeClient -> 學校系統`。Repository 會先讀取本機快取與 session,必要時才透過 `SchoolGradeClient` 連線;背景提醒、桌面 Widget、通知、更新檢查與匯出則透過各自的 Android 系統服務保持在 app 邊界內。 |
| 127 | + |
25 | 128 | ## 專案結構 |
26 | 129 |
|
27 | 130 | | 目錄 | 說明 | 文件 | |
|
0 commit comments