Files
ipam/backend/app/models/notification.py
T
Your Name 365ab73e7d feat(alerts): 飞书通知支持 Web 界面配置(数据库存储+热更新)
1. 新增 notification_config 模型,飞书配置存数据库(单行id=1)
2. feishu_service 改为从数据库读配置,支持热更新,Web保存即生效
3. alerts.py 新增接口:
   - GET /alerts/notify/feishu/config 读配置(secret只返回是否已设)
   - PUT /alerts/notify/feishu/config 保存配置+热更新
   (status/test 同步改为走数据库配置)
4. 前端告警中心增加「飞书通知设置」弹窗:
   - 开关/Webhook/签名密钥/最低级别/类型白名单
   - 保存配置、发送测试按钮
5. alert_service.create_alert 推送时按数据库配置判断

配置无需改文件/重启,前端界面直接保存即生效。
2026-08-12 13:14:38 +08:00

32 lines
1.2 KiB
Python

from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text
from sqlalchemy.sql import func
from app.core.database import Base
class NotificationConfig(Base):
"""通知渠道配置(当前支持飞书机器人)。
使用单行记录(id=1)存储,便于 Web 界面读写和热更新。
"""
__tablename__ = "notification_config"
id = Column(Integer, primary_key=True)
# 飞书
feishu_enabled = Column(Boolean, default=False) # 总开关
feishu_webhook_url = Column(String(500), default="") # 机器人 webhook 地址
feishu_secret = Column(String(255), default="") # 签名校验密钥(可选)
feishu_min_severity = Column(String(20), default="warning") # 最低告警级别
feishu_alert_types = Column(Text, default="") # 逗号分隔的类型白名单,空=全部
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
@classmethod
def get_singleton(cls, db):
"""获取或创建单行配置"""
row = db.query(cls).filter(cls.id == 1).first()
if row is None:
row = cls(id=1)
db.add(row)
db.commit()
db.refresh(row)
return row