diff --git a/nezha-fronted/src/components/common/bottomBox/tabs/alertMessageTab.vue b/nezha-fronted/src/components/common/bottomBox/tabs/alertMessageTab.vue index 7dfb17774..40a73a14e 100644 --- a/nezha-fronted/src/components/common/bottomBox/tabs/alertMessageTab.vue +++ b/nezha-fronted/src/components/common/bottomBox/tabs/alertMessageTab.vue @@ -528,7 +528,7 @@ setTimeout(() => { this.$get('alert/message', this.searchLabel).then(response => { if (response.code == 200) { - this.nowTime=response.time; + this.nowTime=this.utcTimeToTimezoneStr(response.time); this.tableData = response.data.list; let axiosAll=[] this.$nextTick(() => { diff --git a/nezha-fronted/src/components/common/exportXLSX.vue b/nezha-fronted/src/components/common/exportXLSX.vue index 9a78e30c2..aa12cef8e 100644 --- a/nezha-fronted/src/components/common/exportXLSX.vue +++ b/nezha-fronted/src/components/common/exportXLSX.vue @@ -156,6 +156,8 @@ url = "/alert/rule/cancelImport"; } else if(this.importUrl.indexOf("panel") > -1){ url = "/panel/cancelImport"; + }else if(this.importUrl.indexOf("tmpl") > -1){ + url = "/expression/tmpl/cancelImport"; } this.$delete(url + '?seq='+this.importResult.seq).then(response=>{ if(response.code == 200 ){ @@ -223,6 +225,8 @@ url = "/panel/template"; }else if(this.importUrl.indexOf('endpoint') > -1){ url = '/endpoint/template' + }else if(this.importUrl.indexOf("tmpl") > -1){ + url = "/expression/tmpl/template"; } let param={language:language} diff --git a/nezha-fronted/src/components/common/js/tools.js b/nezha-fronted/src/components/common/js/tools.js index 7df251914..cdc61ebee 100644 --- a/nezha-fronted/src/components/common/js/tools.js +++ b/nezha-fronted/src/components/common/js/tools.js @@ -4,7 +4,7 @@ import MessageBox from "element-ui/packages/message-box/src/main"; import vuex from 'vuex' import i18n from "../i18n"; /*弹窗点击外部后关闭*/ -const exceptClassName = ["config-dropdown", "nz-pop", "el-picker", "chart-box-dropdown", 'metric-dropdown', 'el-cascader__dropdown', "asset-dropdown", "no-style-class", 'el-message-box','nz-dashboard-dropdown', "el-autocomplete-suggestion"]; //clickoutside排除的class(白名单) no-style-class:没有任何样式的class +const exceptClassName = ["config-dropdown", "nz-pop", "el-picker", "chart-box-dropdown", 'metric-dropdown', 'el-cascader__dropdown', "asset-dropdown", "no-style-class", 'el-message-box','nz-dashboard-dropdown', "el-autocomplete-suggestion",'nz-temp-box']; //clickoutside排除的class(白名单) no-style-class:没有任何样式的class export const clickoutside = { // 初始化指令 bind(el, binding, vnode) { @@ -515,6 +515,7 @@ export const tableSet = { case 'threshold': case 'idc': case 'alertNum': + case 'gname': return'custom'; default : return false; } @@ -633,6 +634,13 @@ export const tableSet = { case 'severity': return'ar.severity'; default : return prop; } + case 'exprTemp': + switch(prop){ + case 'id': return'id'; + case 'name': return'name'; + case 'gname': return'gname'; + default : return prop; + } default: break; } }, diff --git a/nezha-fronted/src/components/common/language/cn.js b/nezha-fronted/src/components/common/language/cn.js index 784fd149d..cfff206e5 100644 --- a/nezha-fronted/src/components/common/language/cn.js +++ b/nezha-fronted/src/components/common/language/cn.js @@ -857,6 +857,23 @@ const cn = { yes: "是", no: "否" } + }, + exprTemp:{ + exprTemp:'expression模板', + exprTempInfo:'Expression 模板详情', + exprTempRender:'expression模板渲染', + exprTempDown:"expression模板下载", + exprTempImport:"expression模板导入", + exprTempExport:"expression模板导出", + exprTempImportCancel:"expression模板导入撤销", + name:'名称', + gname:'组名', + expression:'表达式', + remark:'备注', + errorStr:'请填写 {errorStr} 的值', + edit:'修改表达式模板', + create:'创建表达式模板', + expressionError:'请填写表达式', } }, alert: { diff --git a/nezha-fronted/src/components/common/language/en.js b/nezha-fronted/src/components/common/language/en.js index 62eaae402..8e5f2333c 100644 --- a/nezha-fronted/src/components/common/language/en.js +++ b/nezha-fronted/src/components/common/language/en.js @@ -860,6 +860,23 @@ const en = { yes:'Yes', no:'No', } + }, + exprTemp:{ + exprTemp:'Expression template', + exprTempInfo:'Expression template Info', + exprTempRender:'expression template render', + exprTempDown:"expression template download", + exprTempImport:"expression template import", + exprTempExport:"expression template export", + exprTempImportCancel:"expression template import rollback", + name:'Name', + gname:'Group', + expression:'Expression', + remark:'Reason', + errorStr:'Please fill in the {errorStr} value', + edit:'Edit expression template', + create:'New expression template', + expressionError:'Please fill in the "expression" value', } }, alert: { diff --git a/nezha-fronted/src/components/common/project/popData/alertTable.vue b/nezha-fronted/src/components/common/project/popData/alertTable.vue index 8c21abc38..cab7bcb42 100644 --- a/nezha-fronted/src/components/common/project/popData/alertTable.vue +++ b/nezha-fronted/src/components/common/project/popData/alertTable.vue @@ -345,7 +345,7 @@ this.$get('alert/message', {...this.searchLabel}).then(response => { this.loading=false; if (response.code == 200) { - this.nowTime=response.time; + this.nowTime=this.utcTimeToTimezoneStr(response.time); this.tableData = response.data.list; this.tableData.forEach((item) => { item.labels = JSON.parse(item.labels); diff --git a/nezha-fronted/src/components/common/project/topologyL5.vue b/nezha-fronted/src/components/common/project/topologyL5.vue index a583763dd..a25fe59e5 100644 --- a/nezha-fronted/src/components/common/project/topologyL5.vue +++ b/nezha-fronted/src/components/common/project/topologyL5.vue @@ -1762,6 +1762,10 @@ getTopology(this.topologyIndex).lock(0); getTopology(this.topologyIndex).data.pens.forEach((item)=>{//停止动画 以及赋值默认data item.stopAnimate(); + if(!item.data.expressArr.length) { + item.data.expressArr=['']; + item.data.legends=['']; + } item.animateType=item.data.animateType; if(item.type===0){ item.fillStyle=item.data.fillStyle; diff --git a/nezha-fronted/src/components/common/rightBox/exprTempBox.vue b/nezha-fronted/src/components/common/rightBox/exprTempBox.vue new file mode 100644 index 000000000..9095ae310 --- /dev/null +++ b/nezha-fronted/src/components/common/rightBox/exprTempBox.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/nezha-fronted/src/components/common/searchInput.vue b/nezha-fronted/src/components/common/searchInput.vue index 6d8aba406..455e423a2 100644 --- a/nezha-fronted/src/components/common/searchInput.vue +++ b/nezha-fronted/src/components/common/searchInput.vue @@ -140,6 +140,17 @@
  • {{item.name}}
  • + +
    + + + + +
    { + if(res.code===200){ + this.gnameList = res.data.list.map((item,index)=>{ + return { + value:item, + name:item, + id:index, + } + }) + } + }) + }, //点击确认选择下拉内容 tr_selectInfo(selectLabel,value,label,e){ this.stop_click(e); @@ -1292,6 +1317,9 @@ if (this.$route.path == '/asset') { this.getModelData(); } + if (this.$route.path == '/exprTemp') { + this.getGnameList(); + } }, 1000); JSON.parse(JSON.stringify(this.searchMsg.searchLabelList)).forEach(val => { if(val.name=='Protocol'){ diff --git a/nezha-fronted/src/components/page/alert/list.vue b/nezha-fronted/src/components/page/alert/list.vue index 9e5739e5a..44bf076b7 100644 --- a/nezha-fronted/src/components/page/alert/list.vue +++ b/nezha-fronted/src/components/page/alert/list.vue @@ -355,7 +355,7 @@ this.$get('alert/message', this.searchLabel).then(response => { this.tools.loading = false; if (response.code == 200) { - this.nowTime=response.time; + this.nowTime=this.utcTimeToTimezoneStr(response.time); this.tableData = response.data.list; let axiosAll=[] this.$nextTick(() => { diff --git a/nezha-fronted/src/components/page/config/exprTemp.vue b/nezha-fronted/src/components/page/config/exprTemp.vue new file mode 100644 index 000000000..4c854aba9 --- /dev/null +++ b/nezha-fronted/src/components/page/config/exprTemp.vue @@ -0,0 +1,466 @@ + + + + + diff --git a/nezha-fronted/src/components/page/config/terminallog.vue b/nezha-fronted/src/components/page/config/terminallog.vue index f2e37a625..fef448ccf 100644 --- a/nezha-fronted/src/components/page/config/terminallog.vue +++ b/nezha-fronted/src/components/page/config/terminallog.vue @@ -284,7 +284,7 @@ this.tools.loading = false; if (response.code === 200) { this.tableData = response.data.list; - this.nowTime=response.time; + this.nowTime=this.utcTimeToTimezoneStr(response.time); this.pageObj.total = response.data.total; if (!this.scrollbarWrap) { this.$nextTick(() => { diff --git a/nezha-fronted/src/components/page/dashboard/explore/promqlInput.vue b/nezha-fronted/src/components/page/dashboard/explore/promqlInput.vue index 0bc9f017d..6c91719a8 100644 --- a/nezha-fronted/src/components/page/dashboard/explore/promqlInput.vue +++ b/nezha-fronted/src/components/page/dashboard/explore/promqlInput.vue @@ -1,227 +1,484 @@ diff --git a/nezha-fronted/src/router/index.js b/nezha-fronted/src/router/index.js index 8cca1b803..43555a2ff 100644 --- a/nezha-fronted/src/router/index.js +++ b/nezha-fronted/src/router/index.js @@ -92,6 +92,10 @@ export default new Router({ { path: '/alertSilence', component: resolve => require(['../components/page/alert/silence.vue'], resolve), + }, + { + path: '/exprtemp', + component: resolve => require(['../components/page/config/exprTemp.vue'], resolve), } ] },