Files
smartClean/docs/backend-glossary.md
xqzp2026 8373460096 feat: 添加自动化部署方案(Docker + 远程服务器两套方案)
- 新增 deploy/docker/:Docker 本机模拟部署,含 Dockerfile、docker-compose、deploy.sh 一键脚本
- 新增 deploy/remote/:远程服务器部署,含 SSH 自动上传、重启、回滚脚本
- 新增 deploy/README.md:完整使用手册,含现状分析、落地调整工作清单、命令速查
- 新增 build.sh/start.sh:本地构建和启动脚本(含飞书通知)
- 新增前端 .env.docker 环境配置,API 指向测试服务器
- 前端 package.json 新增 build-docker 命令
- 更新 .gitignore:排除 IDE 配置、SQL 数据、Docker 敏感文件
- 前端 UI 样式优化(多个页面组件)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 18:41:15 +09:30

359 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后端技术术语详解 - 写给前端工程师
> 用前端类比的方式,帮助前端同学理解后端架构和术语
---
## 一、框架与运行环境
### Spring Boot
**类比**:相当于前端的 Vite + Vue 全家桶的脚手架。
**解释**Java 后端的"一站式开发框架",帮你把 Web 服务器、数据库连接、配置管理等都自动配置好,开箱即用。就像 Vite 帮你配好了 webpack、热更新、打包一样Spring Boot 帮后端配好了 Tomcat 服务器、数据库连接池等。
### WAR 包 / ROOT.war
**类比**:相当于前端 `npm run build` 打出来的 `dist` 文件夹。
**解释**:后端代码编译打包后的产物,是一个压缩包(类似 zip`ROOT.war` 部署到 Tomcat 服务器上运行,就像你把 `dist` 丢到 Nginx 上一样。
### Tomcat
**类比**:相当于前端的 Nginx。
**解释**Java Web 应用的运行容器/服务器。前端用 Nginx 托管静态文件,后端用 Tomcat 运行 Java 代码。
### Maven / pom.xml
**类比**Maven = npmpom.xml = package.json。
**解释**Java 的包管理工具。`mvn install` 类似 `npm install``mvn clean package` 类似 `npm run build`。pom.xml 里定义了项目依赖(类似 dependencies和构建配置类似 scripts
### mvn clean install
**类比**`rm -rf node_modules && npm install && npm run build`
**解释**清除旧的编译产物clean重新编译并安装到本地仓库install供其他模块引用。
---
## 二、项目分层架构
后端代码是分层的,**请求从上往下走,响应从下往上回**
```
前端请求
Controller ← 相当于前端的路由 (Router),定义 URL 和接收参数
Service ← 相当于前端的 Vuex actions / 业务逻辑层
Mapper ← 相当于前端的 ApiService负责跟数据库"通信"
MySQL ← 相当于前端的后端 API但这次是真正的数据存储
```
### Controller控制器
**类比**Vue Router 的路由定义 + 页面组件的入口方法。
**解释**:定义 API 接口地址(如 `POST /task/pageList`),接收前端传来的参数,调用 Service 处理,返回结果。你在 `api.js` 里写的每个接口地址,后端都有一个 Controller 方法与之对应。
```
前端: api.js 里定义 /task/pageList
后端: TaskController.java 里有个方法处理这个请求
```
### Service服务层
**类比**Vuex 的 actions + 复杂的业务逻辑函数。
**解释**:处理业务逻辑的地方。比如"创建任务"不只是往数据库插一条数据,还要检查权限、分配人员、发通知等,这些逻辑都在 Service 里。
### Mapper数据访问层
**类比**:前端的 `ApiService/*.js`,但操作对象是数据库而非 HTTP 接口。
**解释**:负责跟 MySQL 数据库交互,执行增删改查 SQL。每个 Mapper 对应一张数据库表。
### Entity / Model实体类
**类比**TypeScript 的 `interface``type` 定义。
**解释**:定义数据结构。比如 `TaskInfo` 实体就是定义了任务表有哪些字段id、name、status...),类似前端定义的:
```typescript
// 前端 TypeScript 的写法
interface TaskInfo {
id: number;
name: string;
status: number;
}
```
---
## 三、数据库相关
### MySQL
**类比**:一个超大的、持久化的、结构化的 JSON 数据仓库。
**解释**关系型数据库数据按表Table存储。一张表就像一个 Excel 表格,有固定的列(字段),每一行是一条数据。跟前端的 localStorage 不同MySQL 可以存海量数据、支持复杂查询、多人并发访问。
### 数据源 / DataSource
**类比**:前端 axios 实例配置不同的 `baseURL`
**解释**本项目有两个数据库DB1 基础信息、DB2 业务数据),后端配置了两个数据源,不同的 Mapper 连接不同的数据库。就像前端可能有多个 axios 实例,一个请求 `api.example.com`,另一个请求 `auth.example.com`
### MyBatis-Plus
**类比**:一个帮你自动写 SQL 的工具,类似前端用 Axios 封装了 fetch。
**解释**Java 的 ORM 框架(对象关系映射)。不用手写 SQL直接操作 Java 对象就能完成数据库增删改查。比如 `mapper.selectById(1)` 自动生成 `SELECT * FROM task_info WHERE id = 1`
### Mapper XML
**类比**:复杂的 GraphQL 查询定义文件。
**解释**:当自动生成的 SQL 不够用时(比如多表关联查询),在 XML 文件里手写 SQL 语句。类似前端遇到复杂请求时要手动拼接参数。
### QueryWrapper
**类比**:前端拼接 URL 查询参数的工具函数。
**解释**:用代码构造 SQL 查询条件。比如:
```java
// 后端
wrapper.eq("status", 1).like("name", "保洁")
// 等同于 SQL: WHERE status = 1 AND name LIKE '%保洁%'
// 类比前端
params = { status: 1, name: '保洁' } // 传给后端做筛选
```
### IPage分页
**类比**:前端 `el-pagination` 组件的 `currentPage``pageSize`
**解释**:后端分页查询对象,包含页码、每页条数、总数、数据列表。前端传 `pageNum``pageSize`,后端返回对应页的数据。
### Druid 连接池
**类比**:浏览器的 HTTP 连接复用HTTP/2 多路复用)。
**解释**:数据库连接的"缓存池"。创建数据库连接很耗时(类似 TCP 握手),连接池预先创建一批连接放着,用完归还而不是销毁,下次直接取用,提升性能。
### 事务 / Transaction
**类比**:前端表单提交时的"全部成功才提交,否则全部撤销"。
**解释**:保证多个数据库操作要么全部成功,要么全部回滚。比如"创建任务"要同时插入 task_info、task_user、task_scenes 三张表,如果 task_scenes 插入失败,前面两张表的数据也要撤销,保持数据一致。
### 软删除 / soft_delete
**类比**:前端列表中的"隐藏"而非"删除"。
**解释**:删除数据时不是真的从数据库删掉,而是把 `soft_delete` 字段从 0 改为 1。查询时自动过滤 `soft_delete=1` 的记录。好处是数据可恢复。
---
## 四、Redis 相关
### Redis
**类比**:一个超级强化版的 `sessionStorage`,速度极快,支持多种数据结构,多个服务可以共享。
**解释**:内存数据库,数据存在内存中所以读写极快。本项目用 Redis 做三件事:
1. **缓存** - 避免频繁查数据库(类似前端用变量缓存 API 响应)
2. **消息队列** - 服务之间传递消息(类似前端的 EventBus
3. **分布式锁** - 防止并发冲突(类似前端的防重复点击)
### Redis DB4 / DB5
**类比**localStorage 和 sessionStorage 的区别,两个独立的存储空间。
**解释**Redis 支持 16 个独立数据库(编号 0-15本项目用了 DB4 和 DB5存放不同类型的数据互不干扰。
### Redis 数据类型
| Redis 类型 | 前端类比 | 说明 |
|-----------|---------|------|
| **String** | `localStorage.setItem('key', 'value')` | 最简单的键值对,存一个字符串值 |
| **List** | JavaScript 数组 `[]`,支持 push/pop | 有序列表,常用作消息队列(先进先出) |
| **Set** | JavaScript `new Set()` | 无序集合,元素不重复 |
| **Hash** | JavaScript 对象 `{}` | 键值对的集合,类似一个小型的 JSON 对象 |
| **ZSet** | 带排序分数的 Set | 有序集合,每个元素有一个分数,按分数排序 |
### Redis 消息队列
**类比**:前端的 EventBus / Vuex 的 dispatch。
**解释**:用 Redis 的 List 当消息队列:
- **生产者**用 `LPUSH` 往列表左边塞消息(类似 `eventBus.$emit`
- **消费者**用 `RPOP` 从列表右边取消息(类似 `eventBus.$on`
- 实现了 Web 服务和 Task 服务之间的异步通信
```
// 类比前端
// Web 服务(生产者)
eventBus.$emit('taskPushQueue', { taskId: 123, type: '新任务' })
// Task 服务(消费者,每秒轮询)
setInterval(() => {
const msg = eventBus.popMessage('taskPushQueue')
if (msg) sendPushNotification(msg)
}, 1000)
```
### Redis 分布式锁
**类比**:前端按钮的 `loading` + `disabled` 防重复点击,但是跨服务器生效。
**解释**:用 Redis 的 `SETNX`Set if Not Exists命令实现。多个请求同时到达时只有第一个能设置成功获得锁其他的被拒绝。30秒后锁自动过期释放。
### TTLTime To Live
**类比**`setTimeout(() => localStorage.removeItem('key'), 30000)` — 数据过期自动删除。
**解释**Redis 数据的过期时间。设置 TTL=30秒30秒后这个 Key 自动消失。用于登录 Token 过期、临时缓存清理等。
### Dictionary Hash
**类比**:前端 Vuex Store 里的全局配置 state。
**解释**Redis 里存了一个叫 `Dictionary` 的 Hash里面存各种系统开关和配置项`UserAppointFlag``AutoOffWorkTime`),后端需要时直接从 Redis 读取,不用每次查数据库。
---
## 五、定时任务相关
### XXL-Job
**类比**:一个可视化的 `setInterval` 管理平台。
**解释**分布式定时任务调度中心。你可以在管理界面上创建定时任务设置执行时间比如每天早上8点它会自动触发后端的方法执行。比前端的 `setInterval` 强大很多:支持 cron 表达式、失败重试、集群分发等。
### @Scheduled
**类比**:写在代码里的 `setInterval`
**解释**Spring 框架提供的定时任务注解,直接写在方法上。比如 `@Scheduled(fixedRate = 1000)` 表示每 1 秒执行一次。与 XXL-Job 的区别是:@Scheduled 写死在代码里XXL-Job 可以在管理界面动态调整。
### Cron 表达式
**类比**:一种描述"什么时候执行"的规则字符串。
**解释**:格式为 `秒 分 时 日 月 周`。例如:
```
* * * * * ? → 每秒执行(类似 setInterval(fn, 1000)
0 0 8 * * ? → 每天早上8点执行
0 0 8 ? * MON → 每周一早上8点执行
6 6 6 28 12 ? → 每年12月28日 6:06:06 执行
```
---
## 六、消息通信相关
### MQTT
**类比**WebSocket但更轻量专为物联网设备设计。
**解释**:一种消息通信协议,用于手表等 IoT 设备和服务器之间的实时双向通信。跟 WebSocket 类似,建立长连接后可以互相推送消息。区别是 MQTT 有"主题"Topic概念设备订阅特定主题接收消息。
```
// 类比前端 WebSocket
// WebSocket
ws.send(JSON.stringify({ type: 'task', data: {...} }))
ws.onmessage = (msg) => { ... }
// MQTT
mqtt.publish('watch_IMEI_123', JSON.stringify({ messageType: 1, ... }))
mqtt.subscribe('watch_IMEI_123', (msg) => { ... })
```
### MQTT Topic主题
**类比**WebSocket 里的消息 `type` 字段 / 前端路由路径。
**解释**:消息的"频道"。设备订阅某个 Topic 后,只会收到发到这个 Topic 的消息。比如手表订阅自己的 IMEI 号作为 Topic服务器往这个 Topic 发消息,只有这块手表能收到。
### MQTT QoS服务质量等级
**类比**HTTP 请求的重试策略。
**解释**
- QoS 0发了就不管了类似 `fetch` 不处理失败)
- QoS 1至少送达一次可能重复类似 `fetch` + 自动重试)
- QoS 2恰好送达一次最可靠但最慢
- 本项目用 QoS 1。
### MQTT Broker
**类比**WebSocket 服务器 / 消息中转站。
**解释**MQTT 的中心服务器,所有设备和后端都连接到 Broker由它负责消息的转发。类似一个邮局发件人投到邮局邮局派送给收件人。
### 个推 / GeTui
**类比**:浏览器的 `Notification API` / PWA 推送通知。
**解释**:第三方手机 APP 推送服务。后端调用个推 SDK个推通过 APNs苹果/ FCM谷歌/ 各厂商通道把通知推送到用户手机。就像浏览器推送通知,但是走的是手机系统级通道。
---
## 七、认证与安全
### Interceptor拦截器
**类比**Axios 的请求/响应拦截器。
**解释**:在请求到达 Controller 之前先经过拦截器,做统一处理(如认证检查、日志记录)。跟前端 Axios 拦截器一模一样的概念,只是在后端执行。
```
// 前端 Axios 拦截器
axios.interceptors.request.use(config => { /* 加 token */ })
// 后端 Interceptor
public boolean preHandle(request, response) { /* 验证签名 */ }
```
### AOP面向切面编程
**类比**Vue 的全局混入mixin/ 全局前置守卫。
**解释**:在不修改业务代码的情况下,给方法"织入"额外逻辑。比如 `@RepeatSubmit` 注解加在 Controller 方法上,自动加上防重复提交逻辑,不用每个方法手动写。类似前端用装饰器或全局 mixin 给所有组件加统一行为。
### UUID
**类比**:前端 `sessionStorage` 里的 `token`
**解释**:登录成功后后端生成的唯一标识符(一串随机字符),存在 Redis 中30天有效期。前端每次请求都带上 UUID后端据此识别用户身份。
### 签名 / Signature
**类比**:前端请求的防篡改校验。
**解释**:前端把 UUID + 时间戳 + 手机号通过 MD5 算法生成一个签名字符串,放在请求头里。后端用同样的算法重新计算,对比一致则说明请求没被篡改。类似前端某些支付场景的签名验证。
### MD5
**类比**:一种"指纹"算法。
**解释**把任意长度的字符串转换成固定长度32位的字符串。同样的输入永远得到同样的输出但无法从输出反推输入。常用于签名验证、密码存储但不推荐用于安全场景因为已被破解
---
## 八、Java 特有概念
### 注解 / Annotation@xxx
**类比**:前端的装饰器 `@decorator` / Vue 的指令 `v-xxx`
**解释**Java 用 `@` 开头的标记给代码添加元信息。常见的:
- `@Controller` → 标记这个类处理 HTTP 请求
- `@PostMapping("/task/pageList")` → 标记这个方法处理 POST /task/pageList
- `@Autowired` → 自动注入依赖(类似 Vue 的 `inject`
- `@TableName("task_info")` → 标记这个类对应数据库的 task_info 表
### Lombok
**类比**TypeScript 的自动生成 getter/setter。
**解释**Java 的代码简化工具。加个 `@Data` 注解就自动生成 getter、setter、toString 等方法,不用手写。类似 TypeScript 的 `class` 可以直接访问属性。
### Bean / IoC / 依赖注入
**类比**Vue 的 `provide/inject` 或 Vuex Store 的全局共享。
**解释**Spring 框架帮你创建和管理对象Bean需要用的时候自动"注入"进来,不用手动 `new`。类似 Vue 的 `inject` 可以直接使用祖先组件 `provide` 的数据。
```java
// 后端Spring 自动注入
@Autowired
private TaskService taskService; // 不用自己 new
// 类比前端Vue inject
const taskStore = inject('taskStore') // 不用自己创建
```
### profile环境配置
**类比**:前端的 `.env.develop` / `.env.test` / `.env.production`
**解释**:后端的环境区分。`application-test.yml` 存测试环境配置,`application-prod.yml` 存生产环境配置。启动时通过 `--spring.profiles.active=test` 指定用哪个配置,跟前端 `npm run dev``npm run build` 类似。
---
## 九、日志与监控
### Log4j
**类比**:前端的 `console.log`,但更强大。
**解释**Java 的日志框架。可以控制日志级别DEBUG/INFO/WARN/ERROR、输出位置控制台/文件)、格式等。相当于 `console.log` 的高级版本,支持自动按日期分割日志文件。
### Swagger
**类比**:自动生成的 API 文档,可以在线调试。
**解释**:后端加注解后自动生成 API 文档网页,能看到所有接口的地址、参数、返回值,还能直接在页面上发请求测试。访问 `/doc.html` 查看。相当于一个自动生成的 Postman。
---
## 十、部署相关
### 连接池 vs 直连
**类比**
```javascript
// 直连(每次都新建)
async function query() {
const conn = await createConnection() // 耗时操作
const result = await conn.query(sql)
conn.close()
}
// 连接池(复用连接)
const pool = createPool({ max: 100 }) // 预先创建
async function query() {
const conn = pool.getConnection() // 直接取,很快
const result = await conn.query(sql)
conn.release() // 归还,不关闭
}
```
### 多模块依赖
**类比**npm 的 monorepo如 lerna / pnpm workspace
**解释**:本项目有 3 个子模块:
```
public (公共模块) ← 类似前端的 @shared/utils 包
↑ ↑
| |
web task ← 类似前端的 @app/admin 和 @app/worker
```
修改 public 后需要先 `mvn install`发布到本地web 和 task 才能用到最新代码。类似 monorepo 里改了 shared 包要先 build。
### Lettuce
**类比**Axios 之于 HTTPLettuce 之于 Redis。
**解释**Java 连接 Redis 的客户端驱动。负责跟 Redis 服务器建立连接、发送命令、接收结果。你不需要关心它,只需要知道后端通过它操作 Redis。
### Elasticsearch / BBoss
**类比**:一个超级强大的全文搜索引擎,类似浏览器的 Ctrl+F 但能搜索海量数据。
**解释**:目前项目中这部分代码被注释掉了(`#`),暂未启用。如果启用,可以实现类似"模糊搜索任务名称"的功能,比数据库的 `LIKE` 查询快得多。