290 lines
7.6 KiB
Vue
290 lines
7.6 KiB
Vue
|
<script lang="ts" setup>
|
|||
|
import type {serverValueItem} from "~/components/SettingCard.vue";
|
|||
|
import {useMainLayoutStore} from "~/strores/UseMainLayoutStore";
|
|||
|
import {useToast} from "vue-toastification";
|
|||
|
|
|||
|
type alertConfigs={
|
|||
|
"alertType": string,
|
|||
|
"serverId": string,
|
|||
|
"notify": string,
|
|||
|
"warning": string,
|
|||
|
"typeName": string,
|
|||
|
"description": string
|
|||
|
}
|
|||
|
const mainLayoutStore=useMainLayoutStore()
|
|||
|
const toast=useToast()
|
|||
|
const alertConfig = ref<alertConfigs[]>([])
|
|||
|
const ServerValues = ref<serverValueItem[]>([])
|
|||
|
const selectServer=ref<string>("")
|
|||
|
const serverIds = ref<string[]>([])
|
|||
|
const selectedDataName = ref<string>("")
|
|||
|
const Description = ref<string>()
|
|||
|
const Notify = ref<string>("50")
|
|||
|
const Warning = ref<string>("80")
|
|||
|
onMounted(()=>{
|
|||
|
config()
|
|||
|
})
|
|||
|
const config=()=>{
|
|||
|
$fetch('/Api/Config/GetAlertConfig', {
|
|||
|
method: 'GET',
|
|||
|
headers: {
|
|||
|
'Content-Type': 'application/json',
|
|||
|
'Authorization': "Bearer " + useCookie('token').value
|
|||
|
},
|
|||
|
baseURL: useRuntimeConfig().public.baseUrl
|
|||
|
}).then(res => {
|
|||
|
alertConfig.value = res as alertConfigs[]
|
|||
|
})
|
|||
|
}
|
|||
|
onMounted(() => {
|
|||
|
$fetch('/Api/Job/GetJobList', {
|
|||
|
method: 'GET',
|
|||
|
headers: {
|
|||
|
'Content-Type': 'application/json',
|
|||
|
'Authorization': 'Bearer ' + useCookie('token').value
|
|||
|
},
|
|||
|
params: {
|
|||
|
serverId: mainLayoutStore.SelectServer.id
|
|||
|
},
|
|||
|
baseURL: useRuntimeConfig().public.baseUrl
|
|||
|
}).then(res => {
|
|||
|
ServerValues.value = res as serverValueItem[];
|
|||
|
ServerValues.value.sort((a, b) => {
|
|||
|
return a.dataName.localeCompare(b.dataName);
|
|||
|
})
|
|||
|
//提取serverValues的唯一serverId
|
|||
|
serverIds.value = ServerValues.value.map(item => item.serverId)
|
|||
|
serverIds.value=[...new Set(serverIds.value)]
|
|||
|
selectServer.value =serverIds.value[0]
|
|||
|
selectedDataName.value=ServerValues.value.filter(x=>x.serverId===selectServer.value)[0].dataType
|
|||
|
})
|
|||
|
})
|
|||
|
const addAlertVisible= ref(false)
|
|||
|
watch(()=>selectServer.value,(newValue)=>{
|
|||
|
selectedDataName.value=ServerValues.value.filter(x=>x.serverId===newValue)[0].dataType
|
|||
|
})
|
|||
|
const saveAlertVisible=()=>{
|
|||
|
|
|||
|
const data={
|
|||
|
ServerId:selectServer.value,
|
|||
|
DataType:selectedDataName.value,
|
|||
|
Description:Description.value,
|
|||
|
Notify:Notify.value,
|
|||
|
Warning:Warning.value,
|
|||
|
DataName:ServerValues.value.filter(x=>x.dataType===selectedDataName.value)[0].dataName
|
|||
|
}
|
|||
|
const isEmpty = (value:any) => value === null || value === undefined || value === '';
|
|||
|
if (!Object.values(data).every(value => !isEmpty(value))) {
|
|||
|
toast.error("请填写完整")
|
|||
|
return
|
|||
|
}
|
|||
|
$fetch('/Api/Config/AddAlertConfig', {
|
|||
|
method: 'POST',
|
|||
|
headers: {
|
|||
|
'Content-Type': 'application/json',
|
|||
|
'Authorization': "Bearer " + useCookie('token').value
|
|||
|
},
|
|||
|
body: data,
|
|||
|
baseURL: useRuntimeConfig().public.baseUrl
|
|||
|
}).then(res => {
|
|||
|
console.log(res);
|
|||
|
toast.success("创建成功 "+res)
|
|||
|
setTimeout(()=>{
|
|||
|
addAlertVisible.value=false
|
|||
|
config()
|
|||
|
},2000)
|
|||
|
}).catch(err=>{
|
|||
|
toast.error("创建失败"+err)
|
|||
|
})
|
|||
|
}
|
|||
|
const deleteAlert=(alert:alertConfigs)=>{
|
|||
|
$fetch('/Api/Config/DeleteAlertConfig', {
|
|||
|
method:'DELETE',
|
|||
|
params:{
|
|||
|
DataType:alert.alertType,
|
|||
|
ServerId:alert.serverId
|
|||
|
},
|
|||
|
headers: {
|
|||
|
'Content-Type': 'application/json',
|
|||
|
'Authorization': "Bearer " + useCookie('token').value
|
|||
|
},
|
|||
|
baseURL: useRuntimeConfig().public.baseUrl
|
|||
|
}).then(res=>{
|
|||
|
toast.success(res)
|
|||
|
setTimeout(()=>{ config()},1000)
|
|||
|
}).catch(err=>{
|
|||
|
toast.error(err)
|
|||
|
})
|
|||
|
}
|
|||
|
const confirm = useConfirm();
|
|||
|
const confirm2 = (alert:alertConfigs) => {
|
|||
|
confirm.require({
|
|||
|
message: '你真的打算删除这个警告么?',
|
|||
|
header: '警告',
|
|||
|
rejectLabel: 'Cancel',
|
|||
|
accept: () => {
|
|||
|
deleteAlert(alert)
|
|||
|
},
|
|||
|
});
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<template>
|
|||
|
<div class="alert-setting-layout">
|
|||
|
<ConfirmDialog></ConfirmDialog>
|
|||
|
<Dialog
|
|||
|
v-model:visible="addAlertVisible"
|
|||
|
:pt="{
|
|||
|
root: {
|
|||
|
style:'border:unset;background-color:unset;'
|
|||
|
},
|
|||
|
mask: {
|
|||
|
style: 'backdrop-filter: blur(20px)'
|
|||
|
}
|
|||
|
}"
|
|||
|
modal
|
|||
|
>
|
|||
|
<div class="add-alert-box">
|
|||
|
<h3>新的告警</h3>
|
|||
|
<div class="form-item">
|
|||
|
<label>监控对象</label>
|
|||
|
<select v-model="selectedDataName">
|
|||
|
<option v-for="item in ServerValues.filter(x=>x.serverId===selectServer)" :value="item.dataType">{{item.dataName}}</option>
|
|||
|
</select>
|
|||
|
</div>
|
|||
|
<div class="form-item">
|
|||
|
<label>监控服务器</label>
|
|||
|
<select v-model="selectServer">
|
|||
|
<option v-for="item in serverIds">{{item}}</option>
|
|||
|
</select>
|
|||
|
</div>
|
|||
|
<div class="form-item">
|
|||
|
<label>告警描述</label>
|
|||
|
<input type="text" placeholder="告警描述" v-model="Description" required/>
|
|||
|
</div>
|
|||
|
<div class="form-item">
|
|||
|
<label>通知阈值</label>
|
|||
|
<input type="number" placeholder="通知阈值" v-model="Notify" required/>
|
|||
|
</div>
|
|||
|
<div class="form-item">
|
|||
|
<label>报警阈值</label>
|
|||
|
<input type="number" placeholder="报警阈值" v-model="Warning" required/>
|
|||
|
</div>
|
|||
|
<div class="form-item">
|
|||
|
<button @click="saveAlertVisible">保存</button>
|
|||
|
<button @click="addAlertVisible=false">取消</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</Dialog>
|
|||
|
<div class="tool-bar">
|
|||
|
<h3>告警设置</h3>
|
|||
|
<div class="actions">
|
|||
|
<button @click="config">
|
|||
|
<Icon name="RefreshCw" />
|
|||
|
<p>刷新</p>
|
|||
|
</button>
|
|||
|
<button>
|
|||
|
<Icon name="RotateCcw"/>
|
|||
|
<p>重载配置</p>
|
|||
|
</button>
|
|||
|
<button @click="addAlertVisible=true">
|
|||
|
<Icon name="Plus"/>
|
|||
|
<p>新的告警</p>
|
|||
|
</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="alert-configs-box">
|
|||
|
<div v-for="alert in alertConfig" class="alert-item">
|
|||
|
<Icon name="TriangleAlert" :stroke-width="2" :size="45"/>
|
|||
|
<div>
|
|||
|
<p>{{alert.typeName}}</p>
|
|||
|
<p>介绍:{{alert.description}}</p>
|
|||
|
<p>监控服务器:{{alert.serverId}}</p>
|
|||
|
<p>通知阈值:{{alert.notify}}</p>
|
|||
|
<p>警告阈值:{{alert.warning}}</p>
|
|||
|
</div>
|
|||
|
<Icon name="X" :stroke-width="2" @click="confirm2(alert)"/>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
@import "base";
|
|||
|
|
|||
|
.alert-setting-layout {
|
|||
|
display: flex;
|
|||
|
padding: $padding;
|
|||
|
width: 100%;
|
|||
|
flex-direction: column;
|
|||
|
|
|||
|
* {
|
|||
|
@include SC_Font
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.tool-bar {
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
align-items: center;
|
|||
|
.actions{
|
|||
|
display: flex;
|
|||
|
gap: $gap*1.5;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
button {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
border: $border;
|
|||
|
gap: $gap;
|
|||
|
padding: $padding*.3 $padding*.5;
|
|||
|
border-radius: $radius*.5;
|
|||
|
background: $primary-color;
|
|||
|
color: #fff;
|
|||
|
cursor: pointer;
|
|||
|
}
|
|||
|
}
|
|||
|
.alert-configs-box{
|
|||
|
display: flex;
|
|||
|
padding: $padding $padding*.5;
|
|||
|
gap: $gap*2;
|
|||
|
.alert-item{
|
|||
|
display: flex;
|
|||
|
gap: $gap;
|
|||
|
padding: $padding;
|
|||
|
background: $light-bg-underline-color;
|
|||
|
border-radius: $radius;
|
|||
|
border: $border;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
.add-alert-box{
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
gap: $gap;
|
|||
|
.form-item{
|
|||
|
display: flex;
|
|||
|
gap: $gap;
|
|||
|
align-items: center;
|
|||
|
label{
|
|||
|
width: 120px;
|
|||
|
}
|
|||
|
input,select{
|
|||
|
flex: 1;
|
|||
|
border: $border;
|
|||
|
background: $light-bg-underline-color;
|
|||
|
padding: $padding*.5;
|
|||
|
border-radius: $radius;
|
|||
|
}
|
|||
|
button{
|
|||
|
padding: $padding*.5 $padding;
|
|||
|
border-radius: $radius;
|
|||
|
border: $border;
|
|||
|
margin-top: 20px;
|
|||
|
&:first-of-type{
|
|||
|
margin-left: auto;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|