File diff suppressed because it is too large
Load Diff
@ -1,52 +1,297 @@ |
|||||||
import { Component, Input, OnInit } from '@angular/core'; |
import { Component, Input, OnInit, OnChanges, SimpleChanges, Output } from '@angular/core'; |
||||||
import { NzMessageService } from 'ng-zorro-antd'; |
import { NzMessageService } from 'ng-zorro-antd'; |
||||||
import { NoticeService } from '../../../service/https/notice.service'; |
import { NoticeService } from '../../../service/https/notice.service'; |
||||||
|
import { exportAsExcelFile, convertKeys } from '../utils/utils'; |
||||||
|
|
||||||
|
// data mapping
|
||||||
|
// IP
|
||||||
|
const ipKeyMaps = { |
||||||
|
'req_ip': '访问源IP', |
||||||
|
'req_frequency': '访问频次' |
||||||
|
}; |
||||||
|
|
||||||
|
const accountKeyMaps = { |
||||||
|
'req_account': '账号', |
||||||
|
'req_frequency': '访问频次', |
||||||
|
'req_jobnum': '工号' |
||||||
|
}; |
||||||
|
|
||||||
|
const interfaceKeyMaps = { |
||||||
|
'interface_addr': '接口地址', |
||||||
|
'req_ip': '访问IP', |
||||||
|
'req_account': '访问账号', |
||||||
|
'req_frequency': '访问频次' , |
||||||
|
'req_jobnum': '工号' |
||||||
|
}; |
||||||
|
|
||||||
|
const menuKeyMaps = { |
||||||
|
'menu_name': '菜单名称', |
||||||
|
'req_ip': '访问IP', |
||||||
|
'req_account': '访问账号', |
||||||
|
'req_frequency': '访问频次' , |
||||||
|
'req_jobnum': '工号' |
||||||
|
}; |
||||||
|
|
||||||
@Component({ |
@Component({ |
||||||
selector: 'app-path', |
selector: 'app-path', |
||||||
templateUrl: './path.component.html', |
templateUrl: './path.component.html', |
||||||
styleUrls: ['./path.component.styl'] |
styleUrls: ['./path.component.styl'] |
||||||
}) |
}) |
||||||
export class PathComponent implements OnInit { |
|
||||||
@Input() datas: any; |
export class PathComponent implements OnInit, OnChanges { |
||||||
|
@Input() detail_data: any; |
||||||
|
// @Output() detailDataChange = new EventEmitter();
|
||||||
data; |
data; |
||||||
viewType = 0; |
viewType = 0; |
||||||
|
whiteListParam = {}; |
||||||
|
greyListParam = {}; |
||||||
|
rules; |
||||||
|
queryLogUrl = "/WebApi/isoc/static/base/#/route/threat-state/log/action?" |
||||||
|
// /WebApi/isoc/static/base/#/route/threat-state/log/action?startTime=1717396269&endTime=1717403469&sip=zhang3
|
||||||
|
startTime; |
||||||
|
endTime; |
||||||
constructor( |
constructor( |
||||||
private noticeService: NoticeService, |
private noticeService: NoticeService, |
||||||
public message: NzMessageService, |
public message: NzMessageService, |
||||||
|
|
||||||
) {} |
) {} |
||||||
|
|
||||||
ngOnInit() { |
ngOnInit() { |
||||||
// const jsonStr = '{"type":3,"http://190.89.233.2:8909/getpublicconfig":[{"req_ip":"192.156.3.12","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":43327,"req_frequency":43,"req_account":"liuhr"},{"req_ip":"192.156.3.12","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":43328,"req_frequency":44,"req_account":"sunxq01"},{"req_ip":"192.156.3.18","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65341,"req_frequency":45,"req_account":"shicl"},{"req_ip":"192.106.3.33","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65342,"req_frequency":46,"req_account":"gongxs"},{"req_ip":"192.106.3.34","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65343,"req_frequency":47,"req_account":"sunzs"}]}'
|
// const jsonStr = '{"type":3,"http://190.89.233.2:8909/getpublicconfig":[{"req_ip":"192.156.3.12","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":43327,"req_frequency":43,"req_account":"liuhr"},{"req_ip":"192.156.3.12","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":43328,"req_frequency":44,"req_account":"sunxq01"},{"req_ip":"192.156.3.18","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65341,"req_frequency":45,"req_account":"shicl"},{"req_ip":"192.106.3.33","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65342,"req_frequency":46,"req_account":"gongxs"},{"req_ip":"192.106.3.34","interface_addr":"http://190.89.233.2:8909/getpublicconfig","req_jobnum":65343,"req_frequency":47,"req_account":"sunzs"}]}'
|
||||||
// if (this.datas == null) {
|
// if (this.detail_data == null) {
|
||||||
// this.datas = JSON.parse(jsonStr);
|
// this.detail_data = JSON.parse(jsonStr);
|
||||||
// }
|
// }
|
||||||
this.parseData(this.datas); |
|
||||||
} |
|
||||||
|
|
||||||
parseData(datas: any) { |
if (this.rules === undefined) { |
||||||
for (const dataKey in datas) { |
this.noticeService.getDefaultRule().subscribe( |
||||||
if (datas.hasOwnProperty(dataKey)) { |
resp => { |
||||||
if (dataKey === 'type') { |
if (resp.code === 200) { |
||||||
this.viewType = datas[dataKey]; |
this.rules = resp.data; |
||||||
} else { |
} else { |
||||||
this.data = datas[dataKey]; |
this.message.error(resp.msg); |
||||||
|
} |
||||||
|
}, |
||||||
|
error => { |
||||||
|
this.message.error('服务器错误'); |
||||||
|
} |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges) { |
||||||
|
if ('detail_data' in changes) { |
||||||
|
this.parseData(); |
||||||
|
// 在这里处理接收到的数据
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
parseData() { |
||||||
|
for (const dataKey in this.detail_data) { |
||||||
|
if (this.detail_data.hasOwnProperty(dataKey)) { |
||||||
|
|
||||||
|
switch (dataKey) { |
||||||
|
case 'type': |
||||||
|
this.viewType = this.detail_data[dataKey]; |
||||||
|
break; |
||||||
|
case 'startTime': |
||||||
|
this.startTime = this.detail_data[dataKey]; |
||||||
|
break; |
||||||
|
case 'endTime': |
||||||
|
this.endTime = this.detail_data[dataKey]; |
||||||
|
break; |
||||||
|
default: |
||||||
|
this.data = this.detail_data[dataKey]; |
||||||
|
this.data.forEach(item => { |
||||||
|
item['is_in_white_list'] = 0;
|
||||||
|
item['is_in_grey_list'] = 0;
|
||||||
|
}); |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
clickWihteList(data) { |
clickWihteList(data) { |
||||||
alert("点击白名单"); |
let index = -1; |
||||||
|
// this.message.success('添加白名单成功!');
|
||||||
|
// this.data[index]['is_in_white_list'] = 1;
|
||||||
|
this.whiteListParam['range'] = ["ueba"]; |
||||||
|
this.whiteListParam['des'] = ""; |
||||||
|
this.whiteListParam['is_enable'] = 1; |
||||||
|
switch(this.viewType) { |
||||||
|
case 1: |
||||||
|
this.whiteListParam['fields'] = ["sip"]; |
||||||
|
this.whiteListParam['name'] = data.req_ip + '-' + this.getCurrentTime(); |
||||||
|
this.whiteListParam['content'] = {"sip": data.req_ip}; |
||||||
|
this.whiteListParam['alert_rule_id'] = this.rules["white_list"]["ip"]; |
||||||
|
index = this.data.findIndex(item => item.req_ip === data.req_ip); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
this.whiteListParam['fields'] = ["url"]; |
||||||
|
this.whiteListParam['name'] = data.interface_addr + '-' + this.getCurrentTime(); |
||||||
|
this.whiteListParam['content'] = {"url": data.interface_addr}; |
||||||
|
this.whiteListParam['alert_rule_id'] = this.rules["white_list"]["interface"]; |
||||||
|
index = this.data.findIndex(item => item.interface_addr === data.interface_addr); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
break; |
||||||
|
} |
||||||
|
this.noticeService.addWhitelist(this.whiteListParam).subscribe( |
||||||
|
resp => { |
||||||
|
if (resp.code === 200) { |
||||||
|
this.message.success('添加白名单成功!'); |
||||||
|
this.data[index]['is_in_white_list'] = 1; |
||||||
|
} else { |
||||||
|
this.message.error(resp.msg); |
||||||
|
} |
||||||
|
}, |
||||||
|
error => { |
||||||
|
this.message.error('服务器错误'); |
||||||
|
} |
||||||
|
); |
||||||
|
var log_params = { |
||||||
|
"action":"add wihte list", |
||||||
|
"params":this.whiteListParam |
||||||
|
} |
||||||
|
|
||||||
|
this.noticeService.writeAuditlog(log_params).subscribe(resp => { |
||||||
|
if (resp.code !== 200) { |
||||||
|
this.message.error("审计日志记录失败"); |
||||||
|
} |
||||||
|
}, |
||||||
|
error => { |
||||||
|
this.message.error('服务器错误'); |
||||||
|
}); |
||||||
} |
} |
||||||
|
|
||||||
clickGreyList(data) { |
clickGreyList(data) { |
||||||
alert("点击灰名单"); |
let index = -1; |
||||||
|
// this.message.success('添加灰名单成功!');
|
||||||
|
// this.data[index]['is_in_grey_list'] = 1;
|
||||||
|
this.greyListParam['des'] = ""; |
||||||
|
this.greyListParam['is_enable'] = 1; |
||||||
|
switch(this.viewType) { |
||||||
|
case 1: |
||||||
|
this.greyListParam['fields'] = ["sip"]; |
||||||
|
this.greyListParam['name'] = data.req_ip + '-' + this.getCurrentTime(); |
||||||
|
this.greyListParam['content'] = {"sip": data.req_ip}; |
||||||
|
this.greyListParam['alert_rule_id'] = this.rules["grey_list"]["ip"]; |
||||||
|
index = this.data.findIndex(item => item.req_ip === data.req_ip); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
this.greyListParam['fields'] = ["url"]; |
||||||
|
this.greyListParam['name'] = data.interface_addr + '-' + this.getCurrentTime(); |
||||||
|
this.greyListParam['content'] = {"url": data.interface_addr}; |
||||||
|
this.greyListParam['alert_rule_id'] = this.rules["grey_list"]["interface"]; |
||||||
|
index = this.data.findIndex(item => item.interface_addr === data.interface_addr); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
break; |
||||||
|
} |
||||||
|
this.greyListParam["type"]=0; |
||||||
|
this.noticeService.addGreyList(this.greyListParam).subscribe( |
||||||
|
resp => { |
||||||
|
if (resp.code === 200) { |
||||||
|
this.message.success('添加灰名单成功!'); |
||||||
|
this.data[index]['is_in_grey_list'] = 1; |
||||||
|
} else { |
||||||
|
this.message.error(resp.msg); |
||||||
|
} |
||||||
|
}, |
||||||
|
error => { |
||||||
|
this.message.error('服务器错误'); |
||||||
|
} |
||||||
|
); |
||||||
|
|
||||||
|
var log_params = { |
||||||
|
"action":"add greyList", |
||||||
|
"params":this.greyListParam |
||||||
|
} |
||||||
|
|
||||||
|
this.noticeService.writeAuditlog(log_params).subscribe(resp => { |
||||||
|
if (resp.code!== 200) { |
||||||
|
this.message.error("审计日志记录失败"); |
||||||
|
} |
||||||
|
}, |
||||||
|
error => { |
||||||
|
this.message.error('服务器错误'); |
||||||
|
}); |
||||||
} |
} |
||||||
|
|
||||||
clickFrequency(data) { |
clickFrequency(data) { |
||||||
alert("点击超链接"); |
if(this.detail_data!=undefined){ |
||||||
|
var params = "startTime="+this.detail_data.startTime+"&endTime="+this.detail_data.endTime; |
||||||
|
switch(this.detail_data.type) { |
||||||
|
case 1: |
||||||
|
params += "&sip="+data.req_ip; |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
params += "&sip="+data.req_account; |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
params += "&sip="+data.interface_addr; |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
params += "&sip="+data.menu_name; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
window.open(this.queryLogUrl+params, '_blank'); |
||||||
} |
} |
||||||
|
} |
||||||
|
|
||||||
|
// 在组件类中
|
||||||
|
getCurrentTime(): string { |
||||||
|
const now = new Date(); |
||||||
|
const year = now.getFullYear(); |
||||||
|
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份是从0开始的
|
||||||
|
const day = String(now.getDate()).padStart(2, '0'); |
||||||
|
const hours = String(now.getHours()).padStart(2, '0'); |
||||||
|
const minutes = String(now.getMinutes()).padStart(2, '0'); |
||||||
|
const seconds = String(now.getSeconds()).padStart(2, '0'); |
||||||
|
|
||||||
|
return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`; |
||||||
|
} |
||||||
|
exportExcel(){ |
||||||
|
var keysMap :any; |
||||||
|
var fileName = ""; |
||||||
|
switch(this.viewType){ |
||||||
|
case 1: |
||||||
|
keysMap= ipKeyMaps; |
||||||
|
fileName="ip维度" |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
keysMap= accountKeyMaps; |
||||||
|
fileName="账号维度" |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
keysMap= interfaceKeyMaps; |
||||||
|
fileName="接口维度" |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
keysMap= menuKeyMaps; |
||||||
|
fileName="菜单维度" |
||||||
|
break; |
||||||
|
} |
||||||
|
console.log(JSON.stringify(keysMap)); |
||||||
|
var data =convertKeys(this.data,keysMap) |
||||||
|
exportAsExcelFile(data,fileName); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// async getval(){
|
||||||
|
// const [ewAssetDetailsRes, assetTypeRes] = await Promise.all([
|
||||||
|
// this.noticeService.getUebaResult(this.di),
|
||||||
|
// this.noticeService.getQueryRange(this.di)
|
||||||
|
// ]);
|
||||||
|
|
||||||
|
// if(ewAssetDetailsRes && assetTypeRes){
|
||||||
|
// this.ewAssetDetails = ewAssetDetailsRes.data;
|
||||||
|
// this.assetType = assetTypeRes.data;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
} |
} |
||||||
|
@ -0,0 +1,18 @@ |
|||||||
|
<nz-modal [(nzVisible)]="open" |
||||||
|
[nzMaskClosable]="false" |
||||||
|
[nzKeyboard]="false" |
||||||
|
(nzOnCancel)="justClose()" |
||||||
|
[nzFooter]="footer" |
||||||
|
nzTitle="搜索进度"> |
||||||
|
<nz-row> |
||||||
|
<nz-col nzSpan="4">查询进度</nz-col> |
||||||
|
<nz-col nzSpan="20"> |
||||||
|
<nz-progress [nzPercent]="process"> |
||||||
|
</nz-progress> |
||||||
|
</nz-col> |
||||||
|
</nz-row> |
||||||
|
</nz-modal> |
||||||
|
|
||||||
|
<ng-template #footer> |
||||||
|
<button nz-button (click)="cancel()">取消查询</button> |
||||||
|
</ng-template> |
@ -0,0 +1,28 @@ |
|||||||
|
/* tslint:disable:no-unused-variable */ |
||||||
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; |
||||||
|
import { By } from '@angular/platform-browser'; |
||||||
|
import { DebugElement } from '@angular/core'; |
||||||
|
|
||||||
|
import { PathComponent } from './process.component'; |
||||||
|
|
||||||
|
describe('PathComponent', () => { |
||||||
|
let component: PathComponent; |
||||||
|
let fixture: ComponentFixture<PathComponent>; |
||||||
|
|
||||||
|
beforeEach(async(() => { |
||||||
|
TestBed.configureTestingModule({ |
||||||
|
declarations: [ PathComponent ] |
||||||
|
}) |
||||||
|
.compileComponents(); |
||||||
|
})); |
||||||
|
|
||||||
|
beforeEach(() => { |
||||||
|
fixture = TestBed.createComponent(PathComponent); |
||||||
|
component = fixture.componentInstance; |
||||||
|
fixture.detectChanges(); |
||||||
|
}); |
||||||
|
|
||||||
|
it('should create', () => { |
||||||
|
expect(component).toBeTruthy(); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,88 @@ |
|||||||
|
import { |
||||||
|
ChangeDetectionStrategy, |
||||||
|
ChangeDetectorRef, |
||||||
|
Component, |
||||||
|
EventEmitter, |
||||||
|
Input, |
||||||
|
OnChanges, |
||||||
|
Output, |
||||||
|
SimpleChanges |
||||||
|
} from '@angular/core'; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
selector: 'app-process', |
||||||
|
templateUrl: './process.component.html', |
||||||
|
styleUrls: ['./process.component.styl'], |
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush |
||||||
|
}) |
||||||
|
// @ts-ignore
|
||||||
|
export class ProcessComponent implements OnChanges { |
||||||
|
// @ts-ignore
|
||||||
|
@Input() visible = false; |
||||||
|
// @ts-ignore
|
||||||
|
// tslint:disable-next-line:no-output-on-prefix
|
||||||
|
@Output() onCancel = new EventEmitter(); |
||||||
|
|
||||||
|
open = false; |
||||||
|
process = 0; |
||||||
|
intervalId = -1; |
||||||
|
|
||||||
|
constructor( |
||||||
|
private cdr: ChangeDetectorRef |
||||||
|
) {} |
||||||
|
|
||||||
|
ngOnChanges(changes: SimpleChanges): void { |
||||||
|
const visible = changes['visible']; |
||||||
|
|
||||||
|
if (visible.currentValue !== null) { |
||||||
|
if (visible.currentValue) { |
||||||
|
this.start(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
random() { |
||||||
|
const acc = Math.ceil(Math.random() * 10); |
||||||
|
const added = this.process + acc; |
||||||
|
this.process = added >= 99 ? 99 : added; |
||||||
|
} |
||||||
|
|
||||||
|
start() { |
||||||
|
this.open = true; |
||||||
|
this.process = 0; |
||||||
|
clearTimeout(this.intervalId); |
||||||
|
this.ticker(); |
||||||
|
} |
||||||
|
|
||||||
|
ticker() { |
||||||
|
this.intervalId = setTimeout(() => { |
||||||
|
if (this.visible) { |
||||||
|
this.random(); |
||||||
|
this.ticker(); |
||||||
|
} else { |
||||||
|
this.process = 100; |
||||||
|
this.autoClose(); |
||||||
|
} |
||||||
|
this.cdr.markForCheck(); |
||||||
|
}, 1000); |
||||||
|
} |
||||||
|
|
||||||
|
cancel() { |
||||||
|
this.open = false; |
||||||
|
clearTimeout(this.intervalId); |
||||||
|
this.onCancel.emit(); |
||||||
|
} |
||||||
|
|
||||||
|
autoClose() { |
||||||
|
clearTimeout(this.intervalId); |
||||||
|
setTimeout(() => { |
||||||
|
this.open = false; |
||||||
|
this.cdr.markForCheck(); |
||||||
|
}, 300); |
||||||
|
} |
||||||
|
|
||||||
|
justClose() { |
||||||
|
this.open = false; |
||||||
|
clearTimeout(this.intervalId); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
import * as XLSX from 'xlsx';
|
||||||
|
import { saveAs } from 'file-saver';
|
||||||
|
|
||||||
|
const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
|
||||||
|
const EXCEL_EXTENSION = '.xlsx'; |
||||||
|
export function exportAsExcelFile(json: any[], excelFileName: string): void {
|
||||||
|
const worksheet: XLSX.WorkSheet = XLSX.utils.json_to_sheet(json);
|
||||||
|
const workbook: XLSX.WorkBook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] };
|
||||||
|
const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
|
||||||
|
saveAsExcelFile(excelBuffer, excelFileName);
|
||||||
|
} |
||||||
|
|
||||||
|
export function saveAsExcelFile(buffer: any, fileName: string): void {
|
||||||
|
const data: Blob = new Blob([buffer], {
|
||||||
|
type: EXCEL_TYPE
|
||||||
|
});
|
||||||
|
saveAs(data, fileName + '_export_' + new Date().getTime() + EXCEL_EXTENSION);
|
||||||
|
} |
||||||
|
|
||||||
|
export function convertKeys<Raw = any, Target = any>(excelData: Raw[], keysMap: Record<string, string>): Target[] { |
||||||
|
return excelData.map(excelItem => { |
||||||
|
const reorderedItem: any = {}; |
||||||
|
|
||||||
|
// 按照keysMap中定义的顺序重建对象
|
||||||
|
Object.entries(keysMap).forEach(([originalKey, newKey]) => { |
||||||
|
if (excelItem.hasOwnProperty(originalKey)) { |
||||||
|
reorderedItem[newKey] = excelItem[originalKey]; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
return reorderedItem; |
||||||
|
}); |
||||||
|
} |
@ -1,5 +1,5 @@ |
|||||||
export const environment = { |
export const environment = { |
||||||
production: true, |
production: true, |
||||||
productionUrls: '/WebApi/notice/static/dist/', |
productionUrls: '/WebApi/uebaMetricsAnalysis/static/dist/', |
||||||
hashPrefx: '' |
hashPrefx: '' |
||||||
}; |
}; |
||||||
|
Loading…
Reference in new issue