# duckmanz205/qlkientap architecture

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

- Interactive diagram: https://gitdiagram.com/duckmanz205/qlkientap
- Repository: https://github.com/duckmanz205/qlkientap

## Overview

QLKienTap manages the university’s factory-placement lifecycle: faculty plans terms and placements, students register or propose trips, lecturers supervise attendance and assessment, and faculty processes fees, results, and reporting. The React web portals call a NestJS API backed by SQL Server. The README also documents a developing AI service and Flutter client; their runtime wiring is not established by the sampled source, so those links are dashed. The sampled upload storage helper supports Cloudflare R2, but its caller is not shown.

Main entry points: [`frontend/src/App.jsx`](https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/App.jsx) (React web app), [`backend/src/khoa/quan-ly-khoa/quan-ly-khoa.controller.ts`](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/quan-ly-khoa/quan-ly-khoa.controller.ts) (Faculty API), [`backend/src/khoa/shared/khoa.service.ts`](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/shared/khoa.service.ts) (Faculty operations), [`backend/src/entities/qlkt.entity.ts`](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/entities/qlkt.entity.ts) (Domain entities)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["User portals"]
  node_web["React web app<br/>[App.jsx]"]
  node_student_pages["Student portal"]
  node_lecturer_pages["Lecturer portal"]
  node_faculty_pages["Faculty portals"]
  node_login_page["Login page<br/>[Login.jsx]"]
  node_mobile["Flutter app"]
end

subgraph group_identity["Identity and access"]
  node_auth_client["Auth client<br/>[auth.service.js]"]
  node_auth_api["Auth API<br/>[auth.controller.ts]"]
  node_auth_service["Authentication<br/>[auth.service.ts]"]
  node_role_guards["Role guards<br/>[roles.guard.ts]"]
end

subgraph group_placement["Placement operations"]
  node_student_api["Student API"]
  node_student_service["Student operations"]
  node_faculty_api["Faculty API"]
  node_club_api["CLB API<br/>[clb.controller.ts]"]
  node_faculty_service["Faculty operations<br/>[khoa.service.ts]"]
  node_trip_queue["Background tasks"]
end

subgraph group_assessment["Assessment and administration"]
  node_lecturer_api["Lecturer API"]
  node_lecturer_service["Lecturer operations"]
  node_uploads["File uploads"]
  node_file_storage["R2 storage helper"]
  node_admin_api["Account administration<br/>[qtv.controller.ts]"]
end

subgraph group_infrastructure["Data and integrations"]
  node_entities["Domain entities<br/>[qlkt.entity.ts]"]
  node_database[("SQL Server")]
  node_r2[("Cloudflare R2")]
  node_ai["AI service<br/>[main.py]"]
end

node_student(("Student"))
node_lecturer(("Lecturer"))
node_faculty(("Faculty manager"))
node_admin(("System administrator"))

node_student -->|"uses"| node_web
node_lecturer -->|"uses"| node_web
node_faculty -->|"uses"| node_web
node_admin -->|"uses"| node_web
node_web -->|"routes"| node_login_page
node_web -->|"routes"| node_student_pages
node_web -->|"routes"| node_lecturer_pages
node_web -->|"routes"| node_faculty_pages
node_login_page -->|"signs in via"| node_auth_client
node_auth_client -->|"HTTP requests"| node_auth_api
node_auth_api -->|"delegates"| node_auth_service
node_auth_api -->|"guards routes"| node_role_guards
node_auth_service -->|"queries accounts"| node_entities
node_student_pages -->|"uses API"| node_student_api
node_lecturer_pages -->|"uses API"| node_lecturer_api
node_faculty_pages -->|"uses API"| node_faculty_api
node_faculty_pages -->|"uses API"| node_club_api
node_student_api -->|"delegates"| node_student_service
node_faculty_api -->|"delegates"| node_faculty_service
node_club_api -->|"delegates"| node_faculty_service
node_faculty_api -->|"enqueues tasks"| node_trip_queue
node_club_api -->|"enqueues tasks"| node_trip_queue
node_lecturer_api -->|"delegates"| node_lecturer_service
node_admin_api -->|"delegates"| node_faculty_service
node_uploads -.->|"storage helper"| node_file_storage
node_file_storage -->|"stores files"| node_r2
node_student_service -->|"queries data"| node_entities
node_faculty_service -->|"queries data"| node_entities
node_lecturer_service -->|"queries data"| node_entities
node_faculty_service -->|"reads and writes"| node_database
node_student_service -->|"reads and writes"| node_database
node_lecturer_service -->|"reads and writes"| node_database
node_auth_service -->|"reads and writes"| node_database
node_mobile -.->|"API access"| node_faculty_api
node_ai -.->|"integration"| node_faculty_api

click node_web "https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/App.jsx"
click node_student_pages "https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/sinh-vien"
click node_lecturer_pages "https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/giang-vien"
click node_faculty_pages "https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/quan-ly-khoa"
click node_login_page "https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/pages/Login.jsx"
click node_auth_client "https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/services/auth.service.js"
click node_auth_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/auth.controller.ts"
click node_auth_service "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/auth.service.ts"
click node_role_guards "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/guards/roles.guard.ts"
click node_student_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/sinh-vien/sinh-vien.controller.ts"
click node_student_service "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/sinh-vien/sinh-vien.service.ts"
click node_faculty_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/quan-ly-khoa/quan-ly-khoa.controller.ts"
click node_club_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/clb/clb.controller.ts"
click node_faculty_service "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/shared/khoa.service.ts"
click node_trip_queue "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/queue/task-queue.service.ts"
click node_lecturer_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/giang-vien/giang-vien.controller.ts"
click node_lecturer_service "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/giang-vien/giang-vien.service.ts"
click node_uploads "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/upload/upload.controller.ts"
click node_file_storage "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/upload/r2-storage.service.ts"
click node_admin_api "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/qtv/qtv.controller.ts"
click node_entities "https://github.com/duckmanz205/qlkientap/blob/main/backend/src/entities/qlkt.entity.ts"
click node_ai "https://github.com/duckmanz205/qlkientap/blob/main/ai-service/src/main.py"
click node_mobile "https://github.com/duckmanz205/qlkientap/tree/main/mobile"

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_web,node_student_pages,node_lecturer_pages,node_faculty_pages,node_login_page,node_mobile toneBlue
class node_auth_client,node_auth_api,node_auth_service,node_role_guards toneAmber
class node_student_api,node_student_service,node_faculty_api,node_club_api,node_faculty_service,node_trip_queue toneMint
class node_lecturer_api,node_lecturer_service,node_uploads,node_file_storage,node_admin_api toneRose
class node_entities,node_database,node_r2,node_ai,node_student,node_lecturer,node_faculty,node_admin toneIndigo
```

## Components

### User portals

- [React web app](https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Student portal](https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/sinh-vien): `frontend/src/pages/sinh-vien`
- [Lecturer portal](https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/giang-vien): `frontend/src/pages/giang-vien`
- [Faculty portals](https://github.com/duckmanz205/qlkientap/tree/main/frontend/src/pages/quan-ly-khoa): `frontend/src/pages/quan-ly-khoa`
- [Login page](https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/pages/Login.jsx): `frontend/src/pages/Login.jsx`
- [Flutter app](https://github.com/duckmanz205/qlkientap/tree/main/mobile): `mobile`

### Identity and access

- [Auth client](https://github.com/duckmanz205/qlkientap/blob/main/frontend/src/services/auth.service.js): `frontend/src/services/auth.service.js`
- [Auth API](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/auth.controller.ts): `backend/src/auth/auth.controller.ts`
- [Authentication](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/auth.service.ts): `backend/src/auth/auth.service.ts`
- [Role guards](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/auth/guards/roles.guard.ts): `backend/src/auth/guards/roles.guard.ts`

### Placement operations

- [Student API](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/sinh-vien/sinh-vien.controller.ts): `backend/src/sinh-vien/sinh-vien.controller.ts`
- [Student operations](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/sinh-vien/sinh-vien.service.ts): `backend/src/sinh-vien/sinh-vien.service.ts`
- [Faculty API](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/quan-ly-khoa/quan-ly-khoa.controller.ts): `backend/src/khoa/quan-ly-khoa/quan-ly-khoa.controller.ts`
- [CLB API](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/clb/clb.controller.ts): `backend/src/khoa/clb/clb.controller.ts`
- [Faculty operations](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/shared/khoa.service.ts): `backend/src/khoa/shared/khoa.service.ts`
- [Background tasks](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/queue/task-queue.service.ts): `backend/src/queue/task-queue.service.ts`

### Assessment and administration

- [Lecturer API](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/giang-vien/giang-vien.controller.ts): `backend/src/giang-vien/giang-vien.controller.ts`
- [Lecturer operations](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/giang-vien/giang-vien.service.ts): `backend/src/giang-vien/giang-vien.service.ts`
- [File uploads](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/upload/upload.controller.ts): `backend/src/upload/upload.controller.ts`
- [R2 storage helper](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/upload/r2-storage.service.ts): `backend/src/upload/r2-storage.service.ts`
- [Account administration](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/khoa/qtv/qtv.controller.ts): `backend/src/khoa/qtv/qtv.controller.ts`

### Data and integrations

- [Domain entities](https://github.com/duckmanz205/qlkientap/blob/main/backend/src/entities/qlkt.entity.ts): `backend/src/entities/qlkt.entity.ts`
- **SQL Server**
- **Cloudflare R2**
- [AI service](https://github.com/duckmanz205/qlkientap/blob/main/ai-service/src/main.py): `ai-service/src/main.py`

### Other components

- **Student**
- **Lecturer**
- **Faculty manager**
- **System administrator**

## Connections

- Student → React web app: uses
- Lecturer → React web app: uses
- Faculty manager → React web app: uses
- System administrator → React web app: uses
- React web app → Login page: routes
- React web app → Student portal: routes
- React web app → Lecturer portal: routes
- React web app → Faculty portals: routes
- Login page → Auth client: signs in via
- Auth client → Auth API: HTTP requests
- Auth API → Authentication: delegates
- Auth API → Role guards: guards routes
- Authentication → Domain entities: queries accounts
- Student portal → Student API: uses API
- Lecturer portal → Lecturer API: uses API
- Faculty portals → Faculty API: uses API
- Faculty portals → CLB API: uses API
- Student API → Student operations: delegates
- Faculty API → Faculty operations: delegates
- CLB API → Faculty operations: delegates
- Faculty API → Background tasks: enqueues tasks
- CLB API → Background tasks: enqueues tasks
- Lecturer API → Lecturer operations: delegates
- Account administration → Faculty operations: delegates
- File uploads → R2 storage helper: storage helper
- R2 storage helper → Cloudflare R2: stores files
- Student operations → Domain entities: queries data
- Faculty operations → Domain entities: queries data
- Lecturer operations → Domain entities: queries data
- Faculty operations → SQL Server: reads and writes
- Student operations → SQL Server: reads and writes
- Lecturer operations → SQL Server: reads and writes
- Authentication → SQL Server: reads and writes
- Flutter app → Faculty API: API access
- AI service → Faculty API: integration
