diff --git a/web-app/src/app/pojo/NoticeReceiver.ts b/web-app/src/app/pojo/NoticeReceiver.ts
new file mode 100644
index 0000000..334d7ed
--- /dev/null
+++ b/web-app/src/app/pojo/NoticeReceiver.ts
@@ -0,0 +1,14 @@
+export class NoticeReceiver {
+ id!: number;
+ name!: string;
+ // 通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号
+ type: number = 1;
+ phone!: string;
+ email!: number;
+ hookUrl!: string;
+ wechatId!: string;
+ creator!: string;
+ modifier!: string;
+ gmtCreate!: number;
+ gmtUpdate!: number;
+}
diff --git a/web-app/src/app/pojo/NoticeRule.ts b/web-app/src/app/pojo/NoticeRule.ts
new file mode 100644
index 0000000..8b627d3
--- /dev/null
+++ b/web-app/src/app/pojo/NoticeRule.ts
@@ -0,0 +1,13 @@
+export class NoticeRule {
+ id!: number;
+ name!: string;
+ receiverId!: string;
+ receiverName!: string;
+ enable: boolean = true;
+ // 是否转发所有
+ filterAll: boolean = true;
+ creator!: string;
+ modifier!: string;
+ gmtCreate!: number;
+ gmtUpdate!: number;
+}
diff --git a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
index 7f7375d..942ee03 100644
--- a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
+++ b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.html
@@ -1 +1,234 @@
-
alert-notice works!
+
+
+
+
+
+ 仪表盘
+
+
+
+
+ 告警通知配置
+
+
+
+
+
+
+
+
+
+
+ | 接收人 |
+ 通知方式 |
+ 配置 |
+ 最新修改时间 |
+ 操作 |
+
+
+
+
+ |
+ {{ data.name}}
+ |
+
+
+
+ 短信
+
+
+
+ 邮件
+
+
+
+ WebHook
+
+
+
+ 微信公众号
+
+ |
+
+ {{data.phone}}
+ {{data.email}}
+ {{data.hookUrl}}
+ {{data.wechatId}}
+ |
+ {{ data.gmtUpdate? data.gmtUpdate : data.gmtCreate }} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+ | 策略名称 |
+ 接收人 |
+ 转发所有 |
+ 最新修改时间 |
+ 操作 |
+
+
+
+
+ |
+ {{ data.name}}
+ |
+
+ {{ data.receiverName}}
+ |
+
+
+ 是
+
+
+ 否
+
+ |
+ {{ data.gmtUpdate? data.gmtUpdate : data.gmtCreate }} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
index 4a9661f..1ea8a00 100644
--- a/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
+++ b/web-app/src/app/routes/alert/alert-notice/alert-notice.component.ts
@@ -1,4 +1,13 @@
import { Component, OnInit } from '@angular/core';
+import {ActivatedRoute, Router} from "@angular/router";
+import {NzModalService} from "ng-zorro-antd/modal";
+import {NzNotificationService} from "ng-zorro-antd/notification";
+import {NzMessageService} from "ng-zorro-antd/message";
+import {NoticeReceiverService} from "../../../service/notice-receiver.service";
+import {NoticeRuleService} from "../../../service/notice-rule.service";
+import {NoticeReceiver} from "../../../pojo/NoticeReceiver";
+import {finalize} from "rxjs/operators";
+import {NoticeRule} from "../../../pojo/NoticeRule";
@Component({
selector: 'app-alert-notice',
@@ -8,9 +17,209 @@ import { Component, OnInit } from '@angular/core';
})
export class AlertNoticeComponent implements OnInit {
- constructor() { }
+ constructor(private route: ActivatedRoute,
+ private router: Router,
+ private modal: NzModalService,
+ private notifySvc: NzNotificationService,
+ private msg: NzMessageService,
+ private noticeReceiverSvc: NoticeReceiverService,
+ private noticeRuleSvc : NoticeRuleService) { }
+
+ receivers!: NoticeReceiver[];
+ receiverTableLoading: boolean = true;
+ rules!: NoticeRule[];
+ ruleTableLoading: boolean = true;
ngOnInit(): void {
+ this.loadReceiversTable();
+ this.loadRulesTable();
+ }
+
+ loadReceiversTable() {
+ this.receiverTableLoading = true;
+ let receiverInit$ = this.noticeReceiverSvc.getReceivers()
+ .subscribe(message => {
+ this.receiverTableLoading = false;
+ if (message.code === 0) {
+ this.receivers = message.data;
+ } else {
+ console.warn(message.msg);
+ }
+ receiverInit$.unsubscribe();
+ }, error => {
+ this.receiverTableLoading = false;
+ receiverInit$.unsubscribe();
+ });
+ }
+ loadRulesTable() {
+ this.ruleTableLoading = true;
+ let rulesInit$ = this.noticeRuleSvc.getNoticeRules()
+ .subscribe(message => {
+ this.ruleTableLoading = false;
+ if (message.code === 0) {
+ this.rules = message.data;
+ } else {
+ console.warn(message.msg);
+ }
+ rulesInit$.unsubscribe();
+ }, error => {
+ this.ruleTableLoading = false;
+ rulesInit$.unsubscribe();
+ });
+ }
+
+ onDeleteOneNoticeReceiver(receiveId : number) {
+ const deleteReceiver$ = this.noticeReceiverSvc.deleteReceiver(receiveId)
+ .pipe(finalize(() => {
+ deleteReceiver$.unsubscribe();
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.notifySvc.success("删除成功!", "");
+ this.loadReceiversTable();
+ } else {
+ this.notifySvc.error("删除失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("删除失败!", error.msg);
+ })
+ }
+
+ onDeleteOneNoticeRule(ruleId : number) {
+ const deleteRule$ = this.noticeRuleSvc.deleteNoticeRule(ruleId)
+ .pipe(finalize(() => {
+ deleteRule$.unsubscribe();
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.notifySvc.success("删除成功!", "");
+ this.loadRulesTable();
+ } else {
+ this.notifySvc.error("删除失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("删除失败!", error.msg);
+ })
+ }
+
+ // start 新增或修改通知接收人弹出框
+ isManageReceiverModalVisible : boolean = false;
+ isManageReceiverModalAdd: boolean = true;
+ isManageReceiverModalOkLoading: boolean = false;
+ receiver!: NoticeReceiver;
+
+ onNewNoticeReceiver() {
+ this.receiver = new NoticeReceiver();
+ this.isManageReceiverModalVisible = true;
+ this.isManageReceiverModalAdd = true;
+ }
+ onEditOneNoticeReceiver(receiver : NoticeReceiver) {
+ this.receiver = receiver;
+ this.isManageReceiverModalVisible = true;
+ this.isManageReceiverModalAdd = false;
+ }
+
+ onManageReceiverModalCancel() {
+ this.isManageReceiverModalVisible = false;
+ }
+ onManageReceiverModalOk() {
+ this.isManageReceiverModalOkLoading = true;
+ if (this.isManageReceiverModalAdd) {
+ const modalOk$ = this.noticeReceiverSvc.newReceiver(this.receiver)
+ .pipe(finalize(() => {
+ modalOk$.unsubscribe();
+ this.isManageReceiverModalOkLoading = false;
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.isManageReceiverModalVisible = false;
+ this.notifySvc.success("新增成功!", "");
+ this.loadReceiversTable();
+ } else {
+ this.notifySvc.error("新增失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("新增失败!", error.msg);
+ })
+ } else {
+ const modalOk$ = this.noticeReceiverSvc.editReceiver(this.receiver)
+ .pipe(finalize(() => {
+ modalOk$.unsubscribe();
+ this.isManageReceiverModalOkLoading = false;
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.isManageReceiverModalVisible = false;
+ this.notifySvc.success("修改成功!", "");
+ this.loadReceiversTable();
+ } else {
+ this.notifySvc.error("修改失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("修改失败!", error.msg);
+ })
+ }
+ }
+
+ // start 新增或修改通知策略弹出框
+ isManageRuleModalVisible : boolean = false;
+ isManageRuleModalAdd: boolean = true;
+ isManageRuleModalOkLoading: boolean = false;
+ rule!: NoticeRule;
+
+ onNewNoticeRule() {
+ this.rule = new NoticeRule();
+ this.isManageRuleModalVisible = true;
+ this.isManageRuleModalAdd = true;
+ }
+
+ onEditOneNoticeRule(rule : NoticeRule) {
+ this.rule = rule;
+ this.isManageRuleModalVisible = true;
+ this.isManageRuleModalAdd = false;
+ }
+
+ onManageRuleModalCancel() {
+ this.isManageRuleModalVisible = false;
+ }
+
+ onManageRuleModalOk() {
+ this.isManageRuleModalOkLoading = true;
+ if (this.isManageRuleModalAdd) {
+ const modalOk$ = this.noticeRuleSvc.newNoticeRule(this.rule)
+ .pipe(finalize(() => {
+ modalOk$.unsubscribe();
+ this.isManageRuleModalOkLoading = false;
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.isManageRuleModalVisible = false;
+ this.notifySvc.success("新增成功!", "");
+ this.loadRulesTable();
+ } else {
+ this.notifySvc.error("新增失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("新增失败!", error.msg);
+ })
+ } else {
+ const modalOk$ = this.noticeRuleSvc.editNoticeRule(this.rule)
+ .pipe(finalize(() => {
+ modalOk$.unsubscribe();
+ this.isManageRuleModalOkLoading = false;
+ }))
+ .subscribe(message => {
+ if (message.code === 0) {
+ this.isManageRuleModalVisible = false;
+ this.notifySvc.success("修改成功!", "");
+ this.loadRulesTable();
+ } else {
+ this.notifySvc.error("修改失败!", message.msg);
+ }
+ }, error => {
+ this.notifySvc.error("修改失败!", error.msg);
+ })
+ }
}
}
diff --git a/web-app/src/app/routes/alert/alert.module.ts b/web-app/src/app/routes/alert/alert.module.ts
index 559356f..ad432a9 100644
--- a/web-app/src/app/routes/alert/alert.module.ts
+++ b/web-app/src/app/routes/alert/alert.module.ts
@@ -19,17 +19,17 @@ const COMPONENTS: Type[] = [
];
@NgModule({
- imports: [
- SharedModule,
- AlertRoutingModule,
- NzDividerModule,
- NzBreadCrumbModule,
- NzTagModule,
- NzRadioModule,
- NzSwitchModule,
- NzCascaderModule,
- NzTransferModule,
- ],
+ imports: [
+ SharedModule,
+ AlertRoutingModule,
+ NzDividerModule,
+ NzBreadCrumbModule,
+ NzTagModule,
+ NzRadioModule,
+ NzSwitchModule,
+ NzCascaderModule,
+ NzTransferModule
+ ],
declarations: COMPONENTS,
})
export class AlertModule { }
diff --git a/web-app/src/app/service/notice-receiver.service.spec.ts b/web-app/src/app/service/notice-receiver.service.spec.ts
new file mode 100644
index 0000000..d1d1dfb
--- /dev/null
+++ b/web-app/src/app/service/notice-receiver.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { NoticeReceiverService } from './notice-receiver.service';
+
+describe('NoticeReceiverService', () => {
+ let service: NoticeReceiverService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(NoticeReceiverService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
diff --git a/web-app/src/app/service/notice-receiver.service.ts b/web-app/src/app/service/notice-receiver.service.ts
new file mode 100644
index 0000000..7438a57
--- /dev/null
+++ b/web-app/src/app/service/notice-receiver.service.ts
@@ -0,0 +1,32 @@
+import { Injectable } from '@angular/core';
+import {HttpClient} from "@angular/common/http";
+import {Observable} from "rxjs";
+import {Message} from "../pojo/Message";
+import {NoticeReceiver} from "../pojo/NoticeReceiver";
+
+const notice_receiver_uri = '/notice/receiver';
+const notice_receivers_uri = '/notice/receivers';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class NoticeReceiverService {
+
+ constructor(private http : HttpClient) { }
+
+ public newReceiver(body: NoticeReceiver) : Observable> {
+ return this.http.post>(notice_receiver_uri, body);
+ }
+
+ public editReceiver(body: NoticeReceiver) : Observable> {
+ return this.http.put>(notice_receiver_uri, body);
+ }
+ public deleteReceiver(receiverId: number) : Observable> {
+ return this.http.delete>(`${notice_receiver_uri}/${receiverId}`);
+ }
+
+ public getReceivers() : Observable> {
+ return this.http.get>(notice_receivers_uri);
+ }
+
+}
diff --git a/web-app/src/app/service/notice-rule.service.spec.ts b/web-app/src/app/service/notice-rule.service.spec.ts
new file mode 100644
index 0000000..4ad6f04
--- /dev/null
+++ b/web-app/src/app/service/notice-rule.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { NoticeRuleService } from './notice-rule.service';
+
+describe('NoticeRuleService', () => {
+ let service: NoticeRuleService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(NoticeRuleService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
diff --git a/web-app/src/app/service/notice-rule.service.ts b/web-app/src/app/service/notice-rule.service.ts
new file mode 100644
index 0000000..91d7c68
--- /dev/null
+++ b/web-app/src/app/service/notice-rule.service.ts
@@ -0,0 +1,32 @@
+import { Injectable } from '@angular/core';
+import {Observable} from "rxjs";
+import {Message} from "../pojo/Message";
+import {HttpClient} from "@angular/common/http";
+import {NoticeRule} from "../pojo/NoticeRule";
+
+const notice_rule_uri = '/notice/rule';
+const notice_rules_uri = '/notice/rules';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class NoticeRuleService {
+
+ constructor(private http : HttpClient) { }
+
+ public newNoticeRule(body: NoticeRule) : Observable> {
+ return this.http.post>(notice_rule_uri, body);
+ }
+
+ public editNoticeRule(body: NoticeRule) : Observable> {
+ return this.http.put>(notice_rule_uri, body);
+ }
+
+ public deleteNoticeRule(ruleId: number) : Observable> {
+ return this.http.delete>(`${notice_rule_uri}/${ruleId}`);
+ }
+
+ public getNoticeRules() : Observable> {
+ return this.http.get>(notice_rules_uri);
+ }
+}
diff --git a/web-app/src/assets/tmp/app-data.json b/web-app/src/assets/tmp/app-data.json
index b31f061..a116bf1 100644
--- a/web-app/src/assets/tmp/app-data.json
+++ b/web-app/src/assets/tmp/app-data.json
@@ -99,7 +99,7 @@
"link": "/alert/setting"
},
{
- "text": "告警转发",
+ "text": "告警通知",
"i18n": "menu.alert.dispatch",
"icon": "anticon-notification",
"link": "/alert/notice"
diff --git a/web-app/src/assets/tmp/i18n/zh-CN.json b/web-app/src/assets/tmp/i18n/zh-CN.json
index aed2726..c2812e4 100644
--- a/web-app/src/assets/tmp/i18n/zh-CN.json
+++ b/web-app/src/assets/tmp/i18n/zh-CN.json
@@ -25,7 +25,7 @@
"": "告警",
"center": "告警中心",
"setting": "告警配置",
- "dispatch": "告警转发"
+ "dispatch": "告警通知"
},
"extras": {
"": "更多",
diff --git a/web-app/src/styles/theme.less b/web-app/src/styles/theme.less
index a33e5fb..e5e921c 100644
--- a/web-app/src/styles/theme.less
+++ b/web-app/src/styles/theme.less
@@ -8,6 +8,9 @@
// The theme parameters can be generated at https://ng-alain.github.io/ng-alain/
// @primary-color: #f50;
@primary-color: #722ED1;
+@font-size-base: 12px;
+@nz-table-rep-padding-vertical: 2px;
+@nz-table-rep-padding-horizontal: 2px;
@alain-default-header-hg: 52px;
@alain-default-header-bg: #722ED1;
@alain-default-header-padding: 8px;