小程序报警通知系统
创建于 2025 年 6 月 18 日
项目介绍
设备报警、系统异常这类信息往往等不到人主动查看——值班人员不会一直盯着后台页面。这个项目的思路是把”报警”变成主动触达:监控程序把报警写入数据库,后端定时任务扫描到新记录后,按接收人预设的方式把报警内容推送出去,微信小程序、个推 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/GeTuiUtils 与 service/GeTuiConfig 封装个推推送。需求文档(订制报警通知相关需求.xlsx)明确了业务规则:notification_method 字段中含”微信”字符串即发微信通知,接收者字段需要自行拆分(分号分隔),发送后把 status、error_message 回写数据库,微信通知内容为 alert_ID、notification_content、sent_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(),cron0/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.push的restful-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.js的getAlarmList请求/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.js 的 baseUrl 指向后端地址后运行到微信开发者工具,登录后进入”报警信息”页查看与筛选报警记录。注意微信订阅消息需用户主动授权订阅,且一次性订阅消息仅能推送一次,正式使用需设计订阅授权引导。
总结
这个项目把”报警入库 → 定时扫描 → 多通道触达 → 小程序查询”串成了一条完整链路:报警来源只需往 alert_notifications 写一条记录,剩下的事交给 AlarmJob——拆接收者、查会员、发微信、推个推、发邮件、回写状态,职责划分清晰;管理端复用若依的代码生成与权限体系,小程序端以 uni-app 快速搭建,三端(后台/小程序/App)数据同源。同时项目也保留了原型阶段的特征:订阅消息模板 ID 与微信 access_token 采用硬编码/Redis 缓存的轻量方案,模板消息字段仅用了 thing8/time6 两个位,短信通道虽有字段预留但未实际接入,Thread.sleep 限速与每 5 秒全表扫描在数据量增长后需要改为增量轮询或消息队列驱动,这些是生产化改造的主要方向。