# nmethuy/stml architecture

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

- Interactive diagram: https://gitdiagram.com/nmethuy/stml
- Repository: https://github.com/nmethuy/stml

## Overview

刷题吗喽！是一个面试题库与在线刷题平台，管理员维护题库和题目，用户注册登录、检索题目并刷题。README 还说明了题库关联、帖子、年度刷题记录、缓存与安全能力。图依据目录、README 和已提供的源码摘录整理；未提供的实现细节不展开推断。

Main entry points: [`src/main/java/icu/banalord/shuatimalou/controller/QuestionController.java`](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionController.java) (题目接口), [`src/main/java/icu/banalord/shuatimalou/controller/UserController.java`](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/UserController.java) (用户接口), [`src/main/java/icu/banalord/shuatimalou/controller/QuestionBankController.java`](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionBankController.java) (题库接口), [`src/main/java/icu/banalord/shuatimalou/service/QuestionService.java`](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionService.java) (题目服务)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API 与身份"]
  node_user_api["用户接口"]
  node_user_service["用户服务<br/>[UserService.java]"]
  node_auth["登录认证"]
end

subgraph group_content["题库与练习"]
  node_question_api["题目接口"]
  node_question_service["题目服务"]
  node_bank_api["题库接口"]
  node_bank_service["题库服务"]
  node_bank_links["题库题目关联"]
  node_mysql[("MySQL")]
end

subgraph group_community["用户内容"]
  node_post_api["帖子接口"]
  node_post_service["帖子服务<br/>[PostService.java]"]
  node_post_reactions["点赞与收藏"]
  node_file_api["文件上传"]
  node_cos_manager["对象存储管理<br/>[CosManager.java]"]
  node_cos[("腾讯云对象存储")]
  node_wx_api["微信接口"]
  node_wechat["微信开放平台"]
end

subgraph group_platform["搜索与性能"]
  node_es[("Elasticsearch")]
  node_es_dao["搜索访问层<br/>[QuestionEsDao.java]"]
  node_sync["搜索索引同步"]
  node_counter["频率计数"]
  node_redis[("Redis")]
end

subgraph group_safety["安全控制"]
  node_sentinel["限流熔断规则"]
  node_blacklist["动态 IP 黑名单<br/>[BlackIpFilter.java]"]
  node_nacos["Nacos 配置"]
end

node_user(("用户"))
node_admin(("管理员"))

node_user -->|"提交账户请求"| node_user_api
node_admin -->|"管理账户"| node_user_api
node_user_api -->|"调用账户服务"| node_user_service
node_user_service -->|"建立登录态"| node_auth
node_user_api -->|"读写用户"| node_mysql
node_user -->|"浏览与刷题"| node_question_api
node_admin -->|"维护题目"| node_question_api
node_question_api -->|"调用题目服务"| node_question_service
node_question_service -->|"查询与维护题目"| node_mysql
node_admin -->|"管理题库"| node_bank_api
node_user -->|"浏览题库"| node_bank_api
node_bank_api -->|"调用题库服务"| node_bank_service
node_bank_api -->|"关联题目"| node_bank_links
node_bank_service -->|"读写题库"| node_mysql
node_bank_links -->|"读写题库关联"| node_mysql
node_question_api -->|"统计访问频率"| node_counter
node_counter -->|"原子计数"| node_redis
node_question_service -.->|"搜索题目"| node_es_dao
node_es_dao -->|"检索索引"| node_es
node_sync -->|"读取更新题目"| node_mysql
node_sync -->|"更新搜索索引"| node_es_dao
node_user -->|"浏览与发布帖子"| node_post_api
node_post_api -->|"调用帖子服务"| node_post_service
node_post_service -->|"读写帖子"| node_mysql
node_user -->|"点赞或收藏"| node_post_reactions
node_post_reactions -->|"处理帖子互动"| node_post_service
node_user -->|"上传文件"| node_file_api
node_file_api -->|"上传对象"| node_cos_manager
node_cos_manager -->|"写入文件"| node_cos
node_user -->|"微信登录或交互"| node_wx_api
node_wx_api -->|"获取微信身份"| node_wechat
node_question_api -->|"受规则保护"| node_sentinel
node_admin -->|"访问受过滤"| node_blacklist
node_blacklist -->|"监听名单配置"| node_nacos

click node_user_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/UserController.java"
click node_user_service "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/UserService.java"
click node_auth "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/satoken/SaTokenConfigure.java"
click node_question_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionController.java"
click node_question_service "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionService.java"
click node_bank_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionBankController.java"
click node_bank_service "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionBankService.java"
click node_bank_links "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionBankQuestionService.java"
click node_post_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/PostController.java"
click node_post_service "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/PostService.java"
click node_post_reactions "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/PostThumbController.java"
click node_file_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/FileController.java"
click node_cos_manager "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/manager/CosManager.java"
click node_wx_api "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/WxMpController.java"
click node_es_dao "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/esdao/QuestionEsDao.java"
click node_sync "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/job/cycle/IncSyncQuestionToEs.java"
click node_counter "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/manager/CounterManager.java"
click node_sentinel "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/sentinel/SentinelRulesManager.java"
click node_blacklist "https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/blackfilter/BlackIpFilter.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_user_api,node_user_service,node_auth toneBlue
class node_question_api,node_question_service,node_bank_api,node_bank_service,node_bank_links,node_mysql toneAmber
class node_post_api,node_post_service,node_post_reactions,node_file_api,node_cos_manager,node_cos,node_wx_api,node_wechat toneMint
class node_es,node_es_dao,node_sync,node_counter,node_redis toneRose
class node_sentinel,node_blacklist,node_nacos,node_user,node_admin toneIndigo
```

## Components

### API 与身份

- [用户接口](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/UserController.java): `src/main/java/icu/banalord/shuatimalou/controller/UserController.java`
- [用户服务](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/UserService.java): `src/main/java/icu/banalord/shuatimalou/service/UserService.java`
- [登录认证](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/satoken/SaTokenConfigure.java): `src/main/java/icu/banalord/shuatimalou/satoken/SaTokenConfigure.java`

### 题库与练习

- [题目接口](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionController.java): `src/main/java/icu/banalord/shuatimalou/controller/QuestionController.java`
- [题目服务](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionService.java): `src/main/java/icu/banalord/shuatimalou/service/QuestionService.java`
- [题库接口](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/QuestionBankController.java): `src/main/java/icu/banalord/shuatimalou/controller/QuestionBankController.java`
- [题库服务](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionBankService.java): `src/main/java/icu/banalord/shuatimalou/service/QuestionBankService.java`
- [题库题目关联](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/QuestionBankQuestionService.java): `src/main/java/icu/banalord/shuatimalou/service/QuestionBankQuestionService.java`
- **MySQL**

### 用户内容

- [帖子接口](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/PostController.java): `src/main/java/icu/banalord/shuatimalou/controller/PostController.java`
- [帖子服务](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/service/PostService.java): `src/main/java/icu/banalord/shuatimalou/service/PostService.java`
- [点赞与收藏](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/PostThumbController.java): `src/main/java/icu/banalord/shuatimalou/controller/PostThumbController.java`
- [文件上传](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/FileController.java): `src/main/java/icu/banalord/shuatimalou/controller/FileController.java`
- [对象存储管理](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/manager/CosManager.java): `src/main/java/icu/banalord/shuatimalou/manager/CosManager.java`
- **腾讯云对象存储**
- [微信接口](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/controller/WxMpController.java): `src/main/java/icu/banalord/shuatimalou/controller/WxMpController.java`
- **微信开放平台**

### 搜索与性能

- **Elasticsearch**
- [搜索访问层](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/esdao/QuestionEsDao.java): `src/main/java/icu/banalord/shuatimalou/esdao/QuestionEsDao.java`
- [搜索索引同步](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/job/cycle/IncSyncQuestionToEs.java): `src/main/java/icu/banalord/shuatimalou/job/cycle/IncSyncQuestionToEs.java`
- [频率计数](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/manager/CounterManager.java): `src/main/java/icu/banalord/shuatimalou/manager/CounterManager.java`
- **Redis**

### 安全控制

- [限流熔断规则](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/sentinel/SentinelRulesManager.java): `src/main/java/icu/banalord/shuatimalou/sentinel/SentinelRulesManager.java`
- [动态 IP 黑名单](https://github.com/nmethuy/stml/blob/master/src/main/java/icu/banalord/shuatimalou/blackfilter/BlackIpFilter.java): `src/main/java/icu/banalord/shuatimalou/blackfilter/BlackIpFilter.java`
- **Nacos 配置**

### Other components

- **用户**
- **管理员**

## Connections

- 用户 → 用户接口: 提交账户请求
- 管理员 → 用户接口: 管理账户
- 用户接口 → 用户服务: 调用账户服务
- 用户服务 → 登录认证: 建立登录态
- 用户接口 → MySQL: 读写用户
- 用户 → 题目接口: 浏览与刷题
- 管理员 → 题目接口: 维护题目
- 题目接口 → 题目服务: 调用题目服务
- 题目服务 → MySQL: 查询与维护题目
- 管理员 → 题库接口: 管理题库
- 用户 → 题库接口: 浏览题库
- 题库接口 → 题库服务: 调用题库服务
- 题库接口 → 题库题目关联: 关联题目
- 题库服务 → MySQL: 读写题库
- 题库题目关联 → MySQL: 读写题库关联
- 题目接口 → 频率计数: 统计访问频率
- 频率计数 → Redis: 原子计数
- 题目服务 → 搜索访问层: 搜索题目
- 搜索访问层 → Elasticsearch: 检索索引
- 搜索索引同步 → MySQL: 读取更新题目
- 搜索索引同步 → 搜索访问层: 更新搜索索引
- 用户 → 帖子接口: 浏览与发布帖子
- 帖子接口 → 帖子服务: 调用帖子服务
- 帖子服务 → MySQL: 读写帖子
- 用户 → 点赞与收藏: 点赞或收藏
- 点赞与收藏 → 帖子服务: 处理帖子互动
- 用户 → 文件上传: 上传文件
- 文件上传 → 对象存储管理: 上传对象
- 对象存储管理 → 腾讯云对象存储: 写入文件
- 用户 → 微信接口: 微信登录或交互
- 微信接口 → 微信开放平台: 获取微信身份
- 题目接口 → 限流熔断规则: 受规则保护
- 管理员 → 动态 IP 黑名单: 访问受过滤
- 动态 IP 黑名单 → Nacos 配置: 监听名单配置
