# haixuan13/classfee-manager architecture

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

- Interactive diagram: https://gitdiagram.com/haixuan13/classfee-manager
- Repository: https://github.com/haixuan13/classfee-manager

## Overview

ClassFee Manager is a single-class ledger for operators and members. The main workflow is sign-in, then recording income/expenses or collecting fees through a batch; batch payments create ledger entries, and the dashboard reconciles balances and summarizes activity. Members can inspect ledger data and their own fee status; operators also manage receipts, categories, notices, class details, and accounts. The README identifies the Python/FastAPI and Vue application. A parallel Java implementation is also present; sampled Java services establish some of its corresponding paths, but its full wiring was not inspected.

Main entry points: [`server-py/app/routers`](https://github.com/haixuan13/classfee-manager/tree/main/server-py/app/routers) (HTTP routers), [`server-py/app/services/auth_service.py`](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/auth_service.py) (Authentication), [`server-py/app/main.py`](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/main.py) (API assembly), [`server/src/main/java/com/classfee/service/BatchService.java`](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/BatchService.java) (Java batch service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_users["People and interface"]
end

subgraph group_web["Vue application"]
  node_vue["Vue interface<br/>[App.vue]"]
  node_views["Feature views"]
  node_api_client["API client"]
end

subgraph group_api["Python API"]
  node_auth["Authentication<br/>[auth_service.py]"]
  node_routers["HTTP routers"]
  node_app["API assembly<br/>[main.py]"]
  node_security["JWT and roles<br/>[security.py]"]
  node_schemas["Request validation<br/>[schemas.py]"]
  node_responses["Response handling<br/>[responses.py]"]
  node_errors["Error handling<br/>[errors.py]"]
  node_serializers["Response serializers<br/>[serializers.py]"]
end

subgraph group_domain["Ledger services"]
  node_records["Ledger records<br/>[record_service.py]"]
  node_batches["Fee batches<br/>[batch_service.py]"]
  node_dashboard["Dashboard"]
  node_categories["Categories"]
  node_accounts["Account management<br/>[user_service.py]"]
  node_receipts["Receipt files<br/>[file_service.py]"]
  node_exports["Ledger export<br/>[export_service.py]"]
  node_notices["Class notices<br/>[notice_service.py]"]
  node_classinfo["Class information<br/>[class_service.py]"]
end

subgraph group_state["Persistence and Java"]
  node_db[("Database access<br/>[db.py]")]
  node_models["Domain models<br/>[models.py]"]
  node_java_auth["Java authentication<br/>[AuthService.java]"]
  node_java_batch["Java batch service<br/>[BatchService.java]"]
  node_java_record["Java record service<br/>[RecordService.java]"]
  node_java_batch_api["Java batch API"]
  node_java_error["Java exceptions<br/>[BizException.java]"]
  node_java_user["Java user context<br/>[UserContext.java]"]
  node_java_role["Java roles<br/>[Role.java]"]
  node_java_class_mapper["Java class mapper"]
  node_java_record_entity["Java ledger entity<br/>[FeeRecord.java]"]
  node_java_class_entity["Java class entity<br/>[ClsClass.java]"]
end

node_operator(("Operator"))
node_member(("Class member"))

node_operator -->|"uses"| node_vue
node_member -->|"uses"| node_vue
node_vue -.->|"renders"| node_views
node_views -.->|"requests"| node_api_client
node_api_client -->|"calls"| node_routers
node_routers -->|"registered by"| node_app
node_app -->|"initializes"| node_db
node_app -->|"installs"| node_security
node_app -->|"installs"| node_errors
node_routers -.->|"validates with"| node_schemas
node_routers -->|"dispatches to"| node_auth
node_routers -->|"dispatches to"| node_batches
node_routers -.->|"dispatches to"| node_records
node_routers -.->|"dispatches to"| node_dashboard
node_routers -.->|"dispatches to"| node_categories
node_routers -->|"dispatches to"| node_accounts
node_routers -.->|"dispatches to"| node_receipts
node_routers -.->|"dispatches to"| node_exports
node_routers -.->|"dispatches to"| node_notices
node_routers -.->|"dispatches to"| node_classinfo
node_auth -->|"reads and updates"| node_db
node_auth -->|"issues token"| node_security
node_auth -->|"reads users"| node_models
node_batches -->|"updates fee data"| node_models
node_records -->|"updates ledger"| node_models
node_records -->|"uses files"| node_receipts
node_auth -->|"serializes users"| node_serializers
node_routers -->|"returns envelopes"| node_responses
node_errors -->|"formats errors"| node_responses
node_java_batch_api -->|"calls"| node_java_batch
node_java_batch -->|"updates balance"| node_java_class_mapper
node_java_record -->|"updates balance"| node_java_class_mapper
node_java_record -->|"queries and changes"| node_java_record_entity
node_java_batch -->|"uses class data"| node_java_class_entity
node_java_auth -->|"reads context"| node_java_user
node_java_batch_api -->|"requires role"| node_java_role
node_java_batch -->|"raises"| node_java_error

click node_vue "https://github.com/haixuan13/classfee-manager/blob/main/web/src/App.vue"
click node_views "https://github.com/haixuan13/classfee-manager/tree/main/web/src/views"
click node_api_client "https://github.com/haixuan13/classfee-manager/tree/main/web/src/api"
click node_auth "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/auth_service.py"
click node_records "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/record_service.py"
click node_batches "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/batch_service.py"
click node_dashboard "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/dashboard_service.py"
click node_categories "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/category_service.py"
click node_accounts "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/user_service.py"
click node_receipts "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/file_service.py"
click node_exports "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/export_service.py"
click node_notices "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/notice_service.py"
click node_classinfo "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/class_service.py"
click node_routers "https://github.com/haixuan13/classfee-manager/tree/main/server-py/app/routers"
click node_app "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/main.py"
click node_security "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/security.py"
click node_schemas "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/schemas.py"
click node_responses "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/responses.py"
click node_errors "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/errors.py"
click node_db "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/db.py"
click node_models "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/models.py"
click node_serializers "https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/serializers.py"
click node_java_auth "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/AuthService.java"
click node_java_batch "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/BatchService.java"
click node_java_record "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/RecordService.java"
click node_java_batch_api "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/controller/BatchController.java"
click node_java_error "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/common/BizException.java"
click node_java_user "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/security/UserContext.java"
click node_java_role "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/security/Role.java"
click node_java_class_mapper "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/mapper/ClsClassMapper.java"
click node_java_record_entity "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/entity/FeeRecord.java"
click node_java_class_entity "https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/entity/ClsClass.java"

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_vue,node_views,node_api_client toneAmber
class node_auth,node_routers,node_app,node_security,node_schemas,node_responses,node_errors,node_serializers toneMint
class node_records,node_batches,node_dashboard,node_categories,node_accounts,node_receipts,node_exports,node_notices,node_classinfo toneRose
class node_db,node_models,node_java_auth,node_java_batch,node_java_record,node_java_batch_api,node_java_error,node_java_user,node_java_role,node_java_class_mapper,node_java_record_entity,node_java_class_entity,node_operator,node_member toneIndigo
```

## Components

### Vue application

- [Vue interface](https://github.com/haixuan13/classfee-manager/blob/main/web/src/App.vue): `web/src/App.vue`
- [Feature views](https://github.com/haixuan13/classfee-manager/tree/main/web/src/views): `web/src/views`
- [API client](https://github.com/haixuan13/classfee-manager/tree/main/web/src/api): `web/src/api`

### Python API

- [Authentication](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/auth_service.py): `server-py/app/services/auth_service.py`
- [HTTP routers](https://github.com/haixuan13/classfee-manager/tree/main/server-py/app/routers): `server-py/app/routers`
- [API assembly](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/main.py): `server-py/app/main.py`
- [JWT and roles](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/security.py): `server-py/app/security.py`
- [Request validation](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/schemas.py): `server-py/app/schemas.py`
- [Response handling](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/responses.py): `server-py/app/responses.py`
- [Error handling](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/errors.py): `server-py/app/errors.py`
- [Response serializers](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/serializers.py): `server-py/app/serializers.py`

### Ledger services

- [Ledger records](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/record_service.py): `server-py/app/services/record_service.py`
- [Fee batches](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/batch_service.py): `server-py/app/services/batch_service.py`
- [Dashboard](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/dashboard_service.py): `server-py/app/services/dashboard_service.py`
- [Categories](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/category_service.py): `server-py/app/services/category_service.py`
- [Account management](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/user_service.py): `server-py/app/services/user_service.py`
- [Receipt files](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/file_service.py): `server-py/app/services/file_service.py`
- [Ledger export](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/export_service.py): `server-py/app/services/export_service.py`
- [Class notices](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/notice_service.py): `server-py/app/services/notice_service.py`
- [Class information](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/services/class_service.py): `server-py/app/services/class_service.py`

### Persistence and Java

- [Database access](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/db.py): `server-py/app/db.py`
- [Domain models](https://github.com/haixuan13/classfee-manager/blob/main/server-py/app/models.py): `server-py/app/models.py`
- [Java authentication](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/AuthService.java): `server/src/main/java/com/classfee/service/AuthService.java`
- [Java batch service](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/BatchService.java): `server/src/main/java/com/classfee/service/BatchService.java`
- [Java record service](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/service/RecordService.java): `server/src/main/java/com/classfee/service/RecordService.java`
- [Java batch API](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/controller/BatchController.java): `server/src/main/java/com/classfee/controller/BatchController.java`
- [Java exceptions](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/common/BizException.java): `server/src/main/java/com/classfee/common/BizException.java`
- [Java user context](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/security/UserContext.java): `server/src/main/java/com/classfee/security/UserContext.java`
- [Java roles](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/security/Role.java): `server/src/main/java/com/classfee/security/Role.java`
- [Java class mapper](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/mapper/ClsClassMapper.java): `server/src/main/java/com/classfee/mapper/ClsClassMapper.java`
- [Java ledger entity](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/entity/FeeRecord.java): `server/src/main/java/com/classfee/entity/FeeRecord.java`
- [Java class entity](https://github.com/haixuan13/classfee-manager/blob/main/server/src/main/java/com/classfee/entity/ClsClass.java): `server/src/main/java/com/classfee/entity/ClsClass.java`

### Other components

- **Operator**
- **Class member**

## Connections

- Operator → Vue interface: uses (evidence: `README.md`)
- Class member → Vue interface: uses (evidence: `README.md`)
- Vue interface → Feature views: renders
- Feature views → API client: requests
- API client → HTTP routers: calls (evidence: `README.md`)
- HTTP routers → API assembly: registered by (evidence: `server-py/app/main.py`)
- API assembly → Database access: initializes (evidence: `server-py/app/main.py`)
- API assembly → JWT and roles: installs (evidence: `server-py/app/main.py`)
- API assembly → Error handling: installs (evidence: `server-py/app/main.py`)
- HTTP routers → Request validation: validates with (evidence: `server-py/app/routers/auth.py`)
- HTTP routers → Authentication: dispatches to (evidence: `server-py/app/routers/auth.py`)
- HTTP routers → Fee batches: dispatches to (evidence: `README.md`)
- HTTP routers → Ledger records: dispatches to
- HTTP routers → Dashboard: dispatches to
- HTTP routers → Categories: dispatches to
- HTTP routers → Account management: dispatches to (evidence: `server-py/app/routers/auth.py`)
- HTTP routers → Receipt files: dispatches to
- HTTP routers → Ledger export: dispatches to
- HTTP routers → Class notices: dispatches to
- HTTP routers → Class information: dispatches to
- Authentication → Database access: reads and updates (evidence: `server-py/app/services/auth_service.py`)
- Authentication → JWT and roles: issues token (evidence: `server-py/app/services/auth_service.py`)
- Authentication → Domain models: reads users (evidence: `server-py/app/services/auth_service.py`)
- Fee batches → Domain models: updates fee data (evidence: `server-py/app/services/batch_service.py`)
- Ledger records → Domain models: updates ledger (evidence: `server-py/app/services/record_service.py`)
- Ledger records → Receipt files: uses files (evidence: `server-py/app/services/record_service.py`)
- Authentication → Response serializers: serializes users (evidence: `server-py/app/services/auth_service.py`)
- HTTP routers → Response handling: returns envelopes (evidence: `server-py/app/main.py`)
- Error handling → Response handling: formats errors (evidence: `server-py/app/errors.py`)
- Java batch API → Java batch service: calls (evidence: `server/src/main/java/com/classfee/controller/BatchController.java`)
- Java batch service → Java class mapper: updates balance (evidence: `server/src/main/java/com/classfee/service/BatchService.java`)
- Java record service → Java class mapper: updates balance (evidence: `server/src/main/java/com/classfee/service/RecordService.java`)
- Java record service → Java ledger entity: queries and changes (evidence: `server/src/main/java/com/classfee/service/RecordService.java`)
- Java batch service → Java class entity: uses class data (evidence: `server/src/main/java/com/classfee/service/BatchService.java`)
- Java authentication → Java user context: reads context (evidence: `server/src/main/java/com/classfee/service/AuthService.java`)
- Java batch API → Java roles: requires role (evidence: `server/src/main/java/com/classfee/controller/BatchController.java`)
- Java batch service → Java exceptions: raises (evidence: `server/src/main/java/com/classfee/service/BatchService.java`)
