返回作品

小程序报警通知系统

创建于 2025 年 6 月 18 日

标签
  • Java 8
  • Spring Boot 2.5.15
  • RuoYi-Vue 3.9.0
  • SQL Server
  • easy-query
  • Redis
  • Quartz
  • 微信小程序订阅消息
  • 个推 restful-sdk
  • JavaMailSender
  • uni-app
  • Vue 2
  • Element UI

项目介绍

设备报警、系统异常这类信息往往等不到人主动查看——值班人员不会一直盯着后台页面。这个项目的思路是把”报警”变成主动触达:监控程序把报警写入数据库,后端定时任务扫描到新记录后,按接收人预设的方式把报警内容推送出去,微信小程序、个推 App、邮件三端同时触达,并在小程序里提供历史报警的查询与筛选。

项目以若依 RuoYi-Vue 3.9.0(SQL Server 版)为底座,核心业务集中在新增的 ruoyi-alarm 模块(com.ruoyi.alarm):controller/AlarmTaskController 提供 /alarm/task 的 CRUD、导出与状态更新接口;service/AlarmTaskService 基于 easy-query 的 EasyEntityQuery 实现列表分页、模糊查询、时间范围查询与物理删除;task/AlarmJob 是报警分发的核心——Quartz 定时任务每 5 秒执行一次 ryNoParams(),把未发送成功的报警按渠道发出去;util/GeTuiUtilsservice/GeTuiConfig 封装个推推送。需求文档(订制报警通知相关需求.xlsx)明确了业务规则:notification_method 字段中含”微信”字符串即发微信通知,接收者字段需要自行拆分(分号分隔),发送后把 statuserror_message 回写数据库,微信通知内容为 alert_IDnotification_contentsent_TIMESTAMP

项目架构

系统由三部分组成:若依后端(多模块 Maven 工程,含 ruoyi-alarm 报警模块、ruoyi-wx 微信对接模块、ruoyi-member 会员模块)、Vue 2 管理后台(src/views/alarm/task.vue)与 uni-app(Vue 2)小程序端。

  • 数据层:SQL Server 承载,业务表 alert_notifications(报警任务:通知方式、微信号/手机号/邮箱接收者、通知内容、发送时间、状态、错误信息),member_user 记录会员的 openId(微信 openid)、wx(微信号)、templateId(订阅消息模板)与 cid(个推客户端标识)。ORM 采用 easy-query,@EntityProxy 注解生成类型安全代理,列表查询用 EasyEntityQuery 完成动态条件拼装与 PageHelper 分页。
  • 任务调度:若依内置 Quartz 定时任务,SQL 初始化脚本中注册了”报警任务”(alarmJob.ryNoParams(),cron 0/5 * * * * ?,即每 5 秒扫描一次),调度执行情况记录在 sys_job_log
  • 通知通道:微信侧由 ruoyi-wx 模块的 CgiBin.getAccessToken() 获取接口凭证、Subscribe.send() 调用 cgi-bin/message/subscribe/send 发送订阅消息,access_token 缓存于 Redis(wx_access_token,6000 秒);个推侧用 com.getui.pushrestful-sdk(PushApi)做 App 离线推送;邮件用 spring-boot-starter-mail(QQ 邮箱 SMTP)。
  • 端侧:小程序是 uni-app 工程(小程序.zip,Vue 2 语法,mp-weixin.appid 与后端 weChat.minApp.appId 一致),报警页 pages/alarm/index.vue 通过 api/alarm.jsgetAlarmList 请求 /alarm/task/list;管理端由代码生成器基于表结构生成,菜单 path=alert、component=alarm/task,权限标识 system:task:add/edit/remove/export

核心功能

  • 定时扫描 + 渠道分发AlarmJob.ryNoParams() 每 5 秒查询 status <> '成功'(含 status 为空)的报警记录;对每条记录按 notificationMethod 判断——含”微信”则走微信/个推通道,含”邮件”则走邮件通道,逐条发送之间 Thread.sleep(1000) 限速,发送结果记录到日志并回写数据库。
  • 微信小程序订阅消息:把 recipientWechat; 拆分为多个微信号,逐个在 member_user 中查询(a.wx().eq(wx));匹配到会员后组装模板数据——thing8 为”报警内容|alertId”、time6 为当前时间 yyyy-MM-dd HH:mm:ss,以硬编码模板 ID 调用 Subscribe.send(wxAccessToken, openId, templateId, data),返回结果写入 task.wx 字段;若会员绑定了个推 cid,同时调用 getuiUtils.offlinePushMsg(cid, "报警通知", 内容|alertId) 做 App 离线推送。
  • 邮件通知JavaMailSender 发送 SimpleMailMessage(主题”报警通知”、正文为通知内容、收件人为 recipientEmail),发送成功后把 status 置为”成功”、记录 sentTimestamp
  • 管理端报警任务管理:后台页面支持按通知方式、微信号、手机号、邮箱、通知内容、发送时间范围检索,新增/修改弹窗维护通知方式、接收者、内容与错误信息,支持多选删除与 Excel 导出,另提供 /alarm/task/updateStatus 接口单独修改状态。
  • 小程序报警查询:报警页顶部为筛选区——状态下拉(全部/成功/失败/待确认/待定/部分失败)、内容关键词搜索、开始/结束日期选择(自动校验起止顺序,变化即触发查询);中部统计概览展示总报警/成功/部分失败/失败四项计数;下方报警卡片展示通知方式、内容、微信号、电话、邮箱、发送时间与失败原因,空数据有占位提示,并预留了 wx.requestSubscribeMessage 订阅消息授权逻辑(模板 ArVNeOVcelY1OL17x7-cCMLljuu3VbYOCIKrxn_pXFU)。

功能截图

暂无运行截图。

快速上手

项目为若依标准前后端分离工程:先执行 ruoyi-sqlserver.sql 初始化 SQL Server 数据库(含若依基础表、alert_notifications 业务表、报警定时任务与”报警任务”菜单),再按需修改 ruoyi-admin/src/main/resources 下的 application.yml(SQL Server/Redis 连接、weChat.minApp 小程序凭证、getui 个推参数、spring.mail 邮箱 SMTP)与 application-druid.yml,启动 ruoyi-admin 模块即可。管理后台在 20250618-小程序报警通知-web 目录 npm install && npm run dev 访问 /alert 菜单管理报警任务;小程序端为 uni-app 工程(小程序.zip),在 HBuilderX 中打开、修改 config.jsbaseUrl 指向后端地址后运行到微信开发者工具,登录后进入”报警信息”页查看与筛选报警记录。注意微信订阅消息需用户主动授权订阅,且一次性订阅消息仅能推送一次,正式使用需设计订阅授权引导。

总结

这个项目把”报警入库 → 定时扫描 → 多通道触达 → 小程序查询”串成了一条完整链路:报警来源只需往 alert_notifications 写一条记录,剩下的事交给 AlarmJob——拆接收者、查会员、发微信、推个推、发邮件、回写状态,职责划分清晰;管理端复用若依的代码生成与权限体系,小程序端以 uni-app 快速搭建,三端(后台/小程序/App)数据同源。同时项目也保留了原型阶段的特征:订阅消息模板 ID 与微信 access_token 采用硬编码/Redis 缓存的轻量方案,模板消息字段仅用了 thing8/time6 两个位,短信通道虽有字段预留但未实际接入,Thread.sleep 限速与每 5 秒全表扫描在数据量增长后需要改为增量轮询或消息队列驱动,这些是生产化改造的主要方向。