+ 新增告警规则
| 设备类型 | 监控指标 | 运算符 | 阈值 | 告警级别 | 状态 | 操作 |
|---|---|---|---|---|---|---|
| 温度传感器 | temperature | > | 80.00 | 严重 | 启用 | |
| 温度传感器 | temperature | > | 65.00 | 警告 | 启用 | |
| 电表 | voltage | >= | 250.00 | 警告 | 启用 | |
| 温度传感器 | temperature | > | 50.00 | 提醒 | 禁用 |
从需求评审到部署上线,记录一个全栈开发者如何独立完成"设备告警通知"功能的全部过程。没有前后端分工,没有运维协助 — 一个人搞定一切。
5年经验,前后端都能做。在小公司里,一个人就是一支队伍。
今天的目标:独立完成"设备告警通知"功能 — 告警规则配置、实时检测、钉钉消息推送、系统内通知列表,从需求讨论到部署上线,全部一个人搞定。
小公司的生存法则:什么都要会,什么都得做,出了问题自己兜底。
和PM确认需求,理清功能边界
需求不算复杂,但涉及前后端 + 消息推送 + 定时任务,对于一个人来说工作量还是有的。
优先级排序:先搞定核心链路(检测→告警→通知),再做管理页面。先设计表和API,然后并行写前后端。
DataGrip 设计数据库表,明确 API 接口
RESTful 风格,5个接口覆盖所有需求:
| Method | URL | Description | 备注 |
|---|---|---|---|
| POST | /api/alert/rules | 创建告警规则 | 运维配置新规则 |
| GET | /api/alert/rules | 查询规则列表 | 支持分页 |
| GET | /api/alert/logs | 查询告警记录 | 分页 + 筛选 |
| PUT | /api/alert/rules/{id} | 修改规则 | 更新阈值等 |
| DELETE | /api/alert/rules/{id} | 删除规则 | 软删除 |
POST /api/alert/rules
Content-Type: application/json
{
"deviceType": "sensor",
"metric": "temperature",
"operator": ">",
"threshold": 80.00,
"level": 3
}
HTTP 201 Created
{ // code:0 表示成功(部分团队用 code:200,本项目统一用 0)
"code": 0,
"message": "success",
"data": {
"id": 1,
"deviceType": "sensor",
"metric": "temperature",
"operator": ">",
"threshold": 80.00,
"level": 3,
"enabled": true,
"createTime": "2026-03-18T09:35:00"
}
}
GET /api/alert/rules
HTTP 200 OK
{
"code": 0,
"message": "success",
"data": [
{
"id": 1,
"deviceType": "sensor",
"metric": "temperature",
"operator": ">",
"threshold": 80.00,
"level": 3,
"enabled": true
},
{
"id": 2,
"deviceType": "sensor",
"metric": "temperature",
"operator": ">",
"threshold": 65.00,
"level": 2,
"enabled": true
}
]
}
PUT /api/alert/rules/1
Content-Type: application/json
{
"threshold": 85.00,
"level": 2
}
HTTP 200 OK
{
"code": 0,
"message": "success",
"data": {
"id": 1,
"deviceType": "sensor",
"metric": "temperature",
"operator": ">",
"threshold": 85.00,
"level": 2,
"enabled": true,
"updateTime": "2026-03-18T09:40:00"
}
}
HTTP 400 Bad Request
{
"code": 400,
"message": "参数校验失败: threshold 不能为空",
"data": null
}
HTTP 404 Not Found
{
"code": 404,
"message": "告警规则不存在: id=999",
"data": null
}
表设计和API都规划好了。接下来开始写代码 — 先写后端(Controller + Service + Mapper),确保接口通了再写前端页面。
全栈的好处是:自己设计API自己用,前后端接口不用来回沟通对齐。
Spring Boot 后端开发 — Controller / Service / Mapper
@Scheduled(cron = "0 * * * * ?")
public void checkAlertRules() {
List<AlertRule> rules = alertRuleRepo.findByEnabled(true);
for (AlertRule rule : rules) {
Double currentValue = metricService.getLatest(rule.getMetric());
if (currentValue != null && currentValue > rule.getThreshold()) {
// 持续超过阈值 duration 秒才告警
if (alertService.isOverDuration(rule, currentValue)) {
alertService.sendAlert(rule, currentValue);
}
}
}
}
@Scheduled(cron = "0 */5 * * * ?")
public void cleanExpiredAlertLogs() {
LocalDateTime expireTime = LocalDateTime.now().minusDays(30);
int deleted = alertLogMapper.deleteBefore(expireTime);
log.info("清理过期告警记录: 删除 {} 条", deleted);
}
spring:
task:
scheduling:
pool:
size: 3
thread-name-prefix: alert-scheduler-
后端核心代码写完了。Controller 负责 HTTP 接口,Service 负责业务逻辑(检测告警 + 发钉钉),Mapper 负责 SQL。
定时任务负责每分钟扫描设备数据,匹配告警规则,超阈值就触发告警和钉钉通知。接下来用 Postman 自测一下接口是否正常。
Postman 测试所有 API 接口
Vue.js + Element Plus 构建告警管理页面
| 设备类型 | 监控指标 | 运算符 | 阈值 | 告警级别 | 状态 | 操作 |
|---|---|---|---|---|---|---|
| 温度传感器 | temperature | > | 80.00 | 严重 | 启用 | |
| 温度传感器 | temperature | > | 65.00 | 警告 | 启用 | |
| 电表 | voltage | >= | 250.00 | 警告 | 启用 | |
| 温度传感器 | temperature | > | 50.00 | 提醒 | 禁用 |
前后端对接,发现并修复 Bug
| Name | Method | Status | Time | Size |
|---|---|---|---|---|
| /api/alert/rules | POST | 200 OK ✓ | 45ms | 128 B |
| /api/alert/rules | GET | 200 OK ✓ | 23ms | 512 B |
| /api/alert/rules/1 | PUT | 400 Bad Request ✗ | 12ms | 256 B |
找到了!后端 AlertController 第35行的 updateRule 方法,第二个参数忘了加 @RequestBody,导致 Spring 无法解析 JSON 请求体。
| Name | Method | Status | Time | Size |
|---|---|---|---|---|
| /api/alert/rules | POST | 200 OK ✓ | 42ms | 128 B |
| /api/alert/rules | GET | 200 OK ✓ | 21ms | 512 B |
| /api/alert/rules/1 | PUT | 200 OK ✓ | 35ms | 96 B |
| /api/alert/rules/2 | DELETE | 200 OK ✓ | 15ms | 80 B |
所有接口都通了!这就是全栈的好处 — 自己的 Bug 自己修,不用等后端同事排查。前后端联调效率极高。
构建前后端,Docker Compose 一键部署全部服务
打开生产 URL 验证功能是否正常
| 设备类型 | 监控指标 | 运算符 | 阈值 | 告警级别 | 状态 | 操作 |
|---|---|---|---|---|---|---|
| 温度传感器 | temperature | > | 80.00 | 严重 | 启用 | |
| 温度传感器 | temperature | > | 65.00 | 警告 | 启用 | |
| 电表 | voltage | >= | 250.00 | 警告 | 启用 |
模拟设备数据触发告警,验证钉钉消息推送
钉钉消息推送正常!整个告警链路跑通了:设备数据 → 规则匹配 → 创建告警记录 → 钉钉消息通知。
功能完成,可以收工了!
一天完成从需求到上线的全流程
| 角色 | 典型工作流程 | 需要协作 |
|---|---|---|
| 纯前端 | 看设计稿 → 搭页面 → 调接口 → 修Bug | 需要后端给接口 |
| 纯后端 | 看需求 → 建表 → 写接口 → Debug → 部署 | 需要前端对接 |
| 全栈 | 全都要做!从需求讨论到部署上线一条龙 | 基本不需要 |
| 步骤 | Git 命令 | 说明 |
|---|---|---|
| 1. 拉取最新代码 | git checkout main && git pull | 切到主分支,拉取最新 |
| 2. 创建功能分支 | git checkout -b feature/user-login | 从 main 拉出新分支 |
| 3. 开发+多次提交 | git add . && git commit -m "feat: 添加登录接口" | 在自己分支随便提交 |
| 4. 推送到远程 | git push origin feature/user-login | 推到远程仓库 |
| 5. 创建 Pull Request | 在 GitLab/GitHub 网页上操作 | 请求合并到 main |
| 6. Code Review | 同事在 PR 里看代码、提意见 | 质量把关 |
| 7. 修改意见 | git add . && git commit -m "fix: 修改Review意见" | 继续在同一个分支改 |
| 8. 合并到 main | 在网页上点 Merge 按钮 | 合并后自动部署 |
| 9. 删除功能分支 | git branch -d feature/user-login | 清理已合并的分支 |
| 分支类型 | 命名格式 | 示例 |
|---|---|---|
| 新功能 | feature/功能名 | feature/user-login, feature/search |
| Bug修复 | hotfix/bug描述 | hotfix/fix-login-error, hotfix/fix-null-pointer |
| 重构 | refactor/重构内容 | refactor/order-service |
| 发布 | release/版本号 | release/v2.1.0 |