# lining-lo/qk-manager architecture

> Architecture diagram of the GitHub repository lining-lo/qk-manager, 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/lining-lo/qk-manager
- Repository: https://github.com/lining-lo/qk-manager

## Overview

This is a Spring-based education CRM and administration backend. Its central workflow manages incoming clues, assigns and follows them up, converts qualified clues into business opportunities, and can convert opportunities into customers. User login and role-based administration, activity and course management, reporting, uploads, and operation logs are additional product areas visible in the repository tree. Sampled controllers call service interfaces; the underlying implementations and wiring for several other areas were not sampled, so those links are omitted where uncertain.

Main entry points: [`qk-parent/qk-management/src/main/java/com/qk/controller`](https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/controller) (REST controllers), [`qk-parent/qk-management/src/main/java/com/qk/mapper`](https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/mapper) (Data mappers), [`qk-parent/qk-management/src/main/java/com/qk/service/impl/ClueServiceImpl.java`](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/ClueServiceImpl.java) (Clue workflows), [`qk-parent/qk-management/src/main/java/com/qk/service/impl/UserServiceImpl.java`](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/UserServiceImpl.java) (Login service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_sales["Sales pipeline"]
  node_clues["Clue management<br/>[ClueService.java]"]
  node_clueimpl["Clue workflows"]
  node_business["Opportunity management"]
  node_businessimpl["Opportunity workflows"]
end

subgraph group_admin["Administration"]
  node_activities["Activity management"]
  node_courses["Course management<br/>[CourseService.java]"]
  node_users["User management<br/>[UserService.java]"]
  node_roles["Role management<br/>[RoleService.java]"]
  node_departments["Department management<br/>[DeptService.java]"]
  node_reports["Reporting<br/>[ReportService.java]"]
end

subgraph group_platform["Application services"]
  node_api["REST controllers"]
  node_upload["File upload"]
  node_oss["Object storage client"]
  node_login["Login service"]
  node_jwt["JWT utilities<br/>[JwtUtils.java]"]
  node_token["Token interceptor"]
  node_logging["Operation logging<br/>[LogAspect.java]"]
  node_errors["Exception handling"]
end

subgraph group_data["Persistence"]
  node_mapper["Data mappers"]
  node_db[("Application database")]
end

node_staff(("Staff user"))
node_ossservice[("Aliyun OSS")]

node_staff -->|"sends requests"| node_api
node_api -->|"calls"| node_clues
node_api -->|"calls"| node_business
node_clues -->|"implemented by"| node_clueimpl
node_business -->|"implemented by"| node_businessimpl
node_clueimpl -->|"converts clue"| node_business
node_api -->|"calls"| node_activities
node_api -->|"calls"| node_courses
node_api -->|"calls"| node_users
node_api -->|"calls"| node_roles
node_api -->|"calls"| node_departments
node_api -->|"calls"| node_reports
node_api -->|"accepts uploads"| node_upload
node_upload -.->|"uses"| node_oss
node_oss -.->|"stores files"| node_ossservice
node_api -->|"calls"| node_login
node_login -->|"creates token"| node_jwt
node_staff -->|"presents token"| node_token
node_api -->|"annotated actions"| node_logging
node_clueimpl -->|"queries and writes"| node_mapper
node_businessimpl -->|"queries and writes"| node_mapper
node_login -->|"queries users"| node_mapper
node_mapper -->|"reads and writes"| node_db
node_api -->|"handled by"| node_errors

click node_api "https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/controller"
click node_clues "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ClueService.java"
click node_clueimpl "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/ClueServiceImpl.java"
click node_business "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/BusinessService.java"
click node_businessimpl "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/BusinessServiceImpl.java"
click node_activities "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ActivityService.java"
click node_courses "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/CourseService.java"
click node_users "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/UserService.java"
click node_roles "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/RoleService.java"
click node_departments "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/DeptService.java"
click node_reports "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ReportService.java"
click node_upload "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/controller/UploadController.java"
click node_oss "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-common/src/main/java/com/qk/utils/AliyunOSSOperator.java"
click node_login "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/UserServiceImpl.java"
click node_jwt "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-common/src/main/java/com/qk/utils/JwtUtils.java"
click node_token "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/interceptor/TokenInterceptor.java"
click node_logging "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/aop/LogAspect.java"
click node_mapper "https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/mapper"
click node_errors "https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/exception/GlobalExceptionHandler.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_clues,node_clueimpl,node_business,node_businessimpl,node_staff toneBlue
class node_activities,node_courses,node_users,node_roles,node_departments,node_reports,node_ossservice toneAmber
class node_api,node_upload,node_oss,node_login,node_jwt,node_token,node_logging,node_errors toneMint
class node_mapper,node_db toneRose
```

## Components

### Sales pipeline

- [Clue management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ClueService.java): `qk-parent/qk-management/src/main/java/com/qk/service/ClueService.java`
- [Clue workflows](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/ClueServiceImpl.java): `qk-parent/qk-management/src/main/java/com/qk/service/impl/ClueServiceImpl.java`
- [Opportunity management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/BusinessService.java): `qk-parent/qk-management/src/main/java/com/qk/service/BusinessService.java`
- [Opportunity workflows](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/BusinessServiceImpl.java): `qk-parent/qk-management/src/main/java/com/qk/service/impl/BusinessServiceImpl.java`

### Administration

- [Activity management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ActivityService.java): `qk-parent/qk-management/src/main/java/com/qk/service/ActivityService.java`
- [Course management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/CourseService.java): `qk-parent/qk-management/src/main/java/com/qk/service/CourseService.java`
- [User management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/UserService.java): `qk-parent/qk-management/src/main/java/com/qk/service/UserService.java`
- [Role management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/RoleService.java): `qk-parent/qk-management/src/main/java/com/qk/service/RoleService.java`
- [Department management](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/DeptService.java): `qk-parent/qk-management/src/main/java/com/qk/service/DeptService.java`
- [Reporting](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/ReportService.java): `qk-parent/qk-management/src/main/java/com/qk/service/ReportService.java`

### Application services

- [REST controllers](https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/controller): `qk-parent/qk-management/src/main/java/com/qk/controller`
- [File upload](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/controller/UploadController.java): `qk-parent/qk-management/src/main/java/com/qk/controller/UploadController.java`
- [Object storage client](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-common/src/main/java/com/qk/utils/AliyunOSSOperator.java): `qk-parent/qk-common/src/main/java/com/qk/utils/AliyunOSSOperator.java`
- [Login service](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/service/impl/UserServiceImpl.java): `qk-parent/qk-management/src/main/java/com/qk/service/impl/UserServiceImpl.java`
- [JWT utilities](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-common/src/main/java/com/qk/utils/JwtUtils.java): `qk-parent/qk-common/src/main/java/com/qk/utils/JwtUtils.java`
- [Token interceptor](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/interceptor/TokenInterceptor.java): `qk-parent/qk-management/src/main/java/com/qk/interceptor/TokenInterceptor.java`
- [Operation logging](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/aop/LogAspect.java): `qk-parent/qk-management/src/main/java/com/qk/aop/LogAspect.java`
- [Exception handling](https://github.com/lining-lo/qk-manager/blob/master/qk-parent/qk-management/src/main/java/com/qk/exception/GlobalExceptionHandler.java): `qk-parent/qk-management/src/main/java/com/qk/exception/GlobalExceptionHandler.java`

### Persistence

- [Data mappers](https://github.com/lining-lo/qk-manager/tree/master/qk-parent/qk-management/src/main/java/com/qk/mapper): `qk-parent/qk-management/src/main/java/com/qk/mapper`
- **Application database**

### Other components

- **Staff user**
- **Aliyun OSS**

## Connections

- Staff user → REST controllers: sends requests
- REST controllers → Clue management: calls
- REST controllers → Opportunity management: calls
- Clue management → Clue workflows: implemented by
- Opportunity management → Opportunity workflows: implemented by
- Clue workflows → Opportunity management: converts clue
- REST controllers → Activity management: calls
- REST controllers → Course management: calls
- REST controllers → User management: calls
- REST controllers → Role management: calls
- REST controllers → Department management: calls
- REST controllers → Reporting: calls
- REST controllers → File upload: accepts uploads
- File upload → Object storage client: uses
- Object storage client → Aliyun OSS: stores files
- REST controllers → Login service: calls
- Login service → JWT utilities: creates token
- Staff user → Token interceptor: presents token
- REST controllers → Operation logging: annotated actions
- Clue workflows → Data mappers: queries and writes
- Opportunity workflows → Data mappers: queries and writes
- Login service → Data mappers: queries users
- Data mappers → Application database: reads and writes
- REST controllers → Exception handling: handled by
