Skip to content

Commit 0927c53

Browse files
improve README architecture overview
1 parent e93c90f commit 0927c53

1 file changed

Lines changed: 104 additions & 1 deletion

File tree

README.md

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,112 @@
1919

2020
```mermaid
2121
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
23124
```
24125

126+
核心資料流是 `Compose UI -> ViewModel -> Repository -> SchoolGradeClient -> 學校系統`。Repository 會先讀取本機快取與 session,必要時才透過 `SchoolGradeClient` 連線;背景提醒、桌面 Widget、通知、更新檢查與匯出則透過各自的 Android 系統服務保持在 app 邊界內。
127+
25128
## 專案結構
26129

27130
| 目錄 | 說明 | 文件 |

0 commit comments

Comments
 (0)