# wxriw/ucas-sign-in architecture

> Architecture diagram of the GitHub repository wxriw/ucas-sign-in, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wxriw/ucas-sign-in
- Repository: https://github.com/wxriw/ucas-sign-in

## Overview

果壳签到 is a native multi-platform client for UCAS Qingxin Classroom. The main workflow is account login, course/schedule retrieval, course and attendance inspection, then manual or automatic sign-in using a time-synchronized QR code; users can also configure reminders and browse cached schedules offline. Windows and Android share the .NET core, while Apple has a separate Swift implementation. The README documents additional capabilities such as course preferences, widgets, demo mode, and updates; links for unsampled subsystems are limited to documented behavior and supported paths.

Main entry points: [`packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.cs`](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.cs) (Account coordinator), [`apps/apple/UCASSignIn/UI/AppModel.swift`](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/AppModel.swift) (Apple app model), [`apps/windows/UCASSignIn.Windows/ViewModels/MainViewModel.cs`](https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/ViewModels/MainViewModel.cs) (Windows view model), [`apps/android/UCASSignIn.Android/ViewModels/MainViewModel.cs`](https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/ViewModels/MainViewModel.cs) (Android view model)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["Platform clients"]
  node_appleui["Apple interface<br/>[RootView.swift]"]
  node_winui["Windows interface<br/>[MainWindow.xaml.cs]"]
  node_androidui["Android interface"]
  node_widget["Apple widget"]
end

subgraph group_coordination["Application coordination"]
  node_applemodel["Apple app model<br/>[AppModel.swift]"]
  node_dotnetcoord["Account coordinator"]
  node_winmodel["Windows view model<br/>[MainViewModel.cs]"]
  node_androidmodel["Android view model<br/>[MainViewModel.cs]"]
  node_autsign["Android auto sign"]
end

subgraph group_school["School and domain"]
  node_swiftservice["Apple school client"]
  node_schoolclient["Shared school client<br/>[SchoolClient.cs]"]
  node_parser["Response parser<br/>[ResponseParser.cs]"]
  node_coursemodels["Course and attendance<br/>[Models.cs]"]
  node_schedulelogic["Schedule logic<br/>[CourseSchedule.cs]"]
end

subgraph group_state["Local state and services"]
  node_appleaccounts[("Apple account store<br/>[AccountStore.swift]")]
  node_dotnetstores[("Core file stores<br/>[FileStores.cs]")]
  node_platformservices["Platform services"]
  node_androidstore["Android account store"]
  node_reminders["Reminder scheduling"]
  node_widgetclient["Widget snapshot client"]
  node_release["Release checker"]
end

node_user(("Student"))
node_school{{"Qingxin Classroom"}}
node_keychain[("Apple Keychain")]
node_github{{"GitHub releases"}}

node_user -->|"uses"| node_appleui
node_user -->|"uses"| node_winui
node_user -->|"uses"| node_androidui
node_appleui -->|"actions"| node_applemodel
node_winui -->|"actions"| node_winmodel
node_androidui -->|"actions"| node_androidmodel
node_applemodel -->|"requests"| node_swiftservice
node_swiftservice -->|"HTTPS requests"| node_school
node_dotnetcoord -->|"calls"| node_schoolclient
node_schoolclient -->|"HTTPS requests"| node_school
node_schoolclient -->|"parses responses"| node_parser
node_parser -->|"creates models"| node_coursemodels
node_dotnetcoord -->|"manages"| node_coursemodels
node_dotnetcoord -->|"uses schedule logic"| node_schedulelogic
node_winmodel -->|"uses core"| node_dotnetcoord
node_androidmodel -->|"uses core"| node_dotnetcoord
node_applemodel -->|"loads and saves"| node_appleaccounts
node_appleaccounts -->|"secures credentials"| node_keychain
node_dotnetcoord -->|"persists state"| node_dotnetstores
node_winmodel -->|"uses services"| node_platformservices
node_androidmodel -->|"stores accounts"| node_androidstore
node_androidui -->|"starts service"| node_autsign
node_autsign -->|"ticks sign-in"| node_androidmodel
node_dotnetcoord -->|"replaces reminders"| node_reminders
node_winmodel -->|"schedules reminders"| node_platformservices
node_applemodel -.->|"publishes snapshot"| node_widgetclient
node_widgetclient -.->|"reloads timelines"| node_widget
node_applemodel -.->|"checks updates"| node_release
node_release -.->|"queries releases"| node_github

click node_appleui "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/RootView.swift"
click node_winui "https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/MainWindow.xaml.cs"
click node_androidui "https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Fragments/MainPageFragment.cs"
click node_applemodel "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/AppModel.swift"
click node_dotnetcoord "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.cs"
click node_winmodel "https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/ViewModels/MainViewModel.cs"
click node_androidmodel "https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/ViewModels/MainViewModel.cs"
click node_swiftservice "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/Core/QingxinService.swift"
click node_schoolclient "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Networking/SchoolClient.cs"
click node_parser "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Networking/ResponseParser.cs"
click node_coursemodels "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Models/Models.cs"
click node_schedulelogic "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Courses/CourseSchedule.cs"
click node_appleaccounts "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/Core/AccountStore.swift"
click node_dotnetstores "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/FileStores.cs"
click node_platformservices "https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/Services/PlatformServices.cs"
click node_androidstore "https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Services/AndroidAccountStore.cs"
click node_autsign "https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Services/AndroidAutoSignService.cs"
click node_reminders "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.Reminders.cs"
click node_widget "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignInWidget/UCASSignInWidget.swift"
click node_widgetclient "https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/AccountClients.swift"
click node_release "https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Updates/GitHubReleaseChecker.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_appleui,node_winui,node_androidui,node_widget toneBlue
class node_applemodel,node_dotnetcoord,node_winmodel,node_androidmodel,node_autsign,node_keychain toneAmber
class node_swiftservice,node_schoolclient,node_parser,node_coursemodels,node_schedulelogic toneMint
class node_appleaccounts,node_dotnetstores,node_platformservices,node_androidstore,node_reminders,node_widgetclient,node_release toneRose
class node_user,node_school,node_github toneIndigo
```

## Components

### Platform clients

- [Apple interface](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/RootView.swift): `apps/apple/UCASSignIn/UI/RootView.swift`
- [Windows interface](https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/MainWindow.xaml.cs): `apps/windows/UCASSignIn.Windows/MainWindow.xaml.cs`
- [Android interface](https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Fragments/MainPageFragment.cs): `apps/android/UCASSignIn.Android/Fragments/MainPageFragment.cs`
- [Apple widget](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignInWidget/UCASSignInWidget.swift): `apps/apple/UCASSignInWidget/UCASSignInWidget.swift`

### Application coordination

- [Apple app model](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/AppModel.swift): `apps/apple/UCASSignIn/UI/AppModel.swift`
- [Account coordinator](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.cs): `packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.cs`
- [Windows view model](https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/ViewModels/MainViewModel.cs): `apps/windows/UCASSignIn.Windows/ViewModels/MainViewModel.cs`
- [Android view model](https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/ViewModels/MainViewModel.cs): `apps/android/UCASSignIn.Android/ViewModels/MainViewModel.cs`
- [Android auto sign](https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Services/AndroidAutoSignService.cs): `apps/android/UCASSignIn.Android/Services/AndroidAutoSignService.cs`

### School and domain

- [Apple school client](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/Core/QingxinService.swift): `apps/apple/UCASSignIn/Core/QingxinService.swift`
- [Shared school client](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Networking/SchoolClient.cs): `packages/dotnet/UCASSignIn.Core/Networking/SchoolClient.cs`
- [Response parser](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Networking/ResponseParser.cs): `packages/dotnet/UCASSignIn.Core/Networking/ResponseParser.cs`
- [Course and attendance](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Models/Models.cs): `packages/dotnet/UCASSignIn.Core/Models/Models.cs`
- [Schedule logic](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Courses/CourseSchedule.cs): `packages/dotnet/UCASSignIn.Core/Courses/CourseSchedule.cs`

### Local state and services

- [Apple account store](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/Core/AccountStore.swift): `apps/apple/UCASSignIn/Core/AccountStore.swift`
- [Core file stores](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/FileStores.cs): `packages/dotnet/UCASSignIn.Core/Accounts/FileStores.cs`
- [Platform services](https://github.com/wxriw/ucas-sign-in/blob/main/apps/windows/UCASSignIn.Windows/Services/PlatformServices.cs): `apps/windows/UCASSignIn.Windows/Services/PlatformServices.cs`
- [Android account store](https://github.com/wxriw/ucas-sign-in/blob/main/apps/android/UCASSignIn.Android/Services/AndroidAccountStore.cs): `apps/android/UCASSignIn.Android/Services/AndroidAccountStore.cs`
- [Reminder scheduling](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.Reminders.cs): `packages/dotnet/UCASSignIn.Core/Accounts/AccountCoordinator.Reminders.cs`
- [Widget snapshot client](https://github.com/wxriw/ucas-sign-in/blob/main/apps/apple/UCASSignIn/UI/AccountClients.swift): `apps/apple/UCASSignIn/UI/AccountClients.swift`
- [Release checker](https://github.com/wxriw/ucas-sign-in/blob/main/packages/dotnet/UCASSignIn.Core/Updates/GitHubReleaseChecker.cs): `packages/dotnet/UCASSignIn.Core/Updates/GitHubReleaseChecker.cs`

### Other components

- **Student**
- **Qingxin Classroom**
- **Apple Keychain**
- **GitHub releases**

## Connections

- Student → Apple interface: uses
- Student → Windows interface: uses
- Student → Android interface: uses
- Apple interface → Apple app model: actions
- Windows interface → Windows view model: actions
- Android interface → Android view model: actions
- Apple app model → Apple school client: requests
- Apple school client → Qingxin Classroom: HTTPS requests
- Account coordinator → Shared school client: calls
- Shared school client → Qingxin Classroom: HTTPS requests
- Shared school client → Response parser: parses responses
- Response parser → Course and attendance: creates models
- Account coordinator → Course and attendance: manages
- Account coordinator → Schedule logic: uses schedule logic
- Windows view model → Account coordinator: uses core
- Android view model → Account coordinator: uses core
- Apple app model → Apple account store: loads and saves
- Apple account store → Apple Keychain: secures credentials
- Account coordinator → Core file stores: persists state
- Windows view model → Platform services: uses services
- Android view model → Android account store: stores accounts
- Android interface → Android auto sign: starts service
- Android auto sign → Android view model: ticks sign-in
- Account coordinator → Reminder scheduling: replaces reminders
- Windows view model → Platform services: schedules reminders
- Apple app model → Widget snapshot client: publishes snapshot
- Widget snapshot client → Apple widget: reloads timelines
- Apple app model → Release checker: checks updates
- Release checker → GitHub releases: queries releases
