diff --git a/nezha-fronted/src/components/charts/chart-table.vue b/nezha-fronted/src/components/charts/chart-table.vue index 5b42138f7..b319a19cd 100644 --- a/nezha-fronted/src/components/charts/chart-table.vue +++ b/nezha-fronted/src/components/charts/chart-table.vue @@ -375,9 +375,16 @@ export default { let mapping if (type == 'value') { - mapping = mappings.find(t => { return Number(t.value) == value }) + mapping = mappings.find(t => { + let mappingValue = t.value ===''?'':Number(t.value) //Number('') 值为0 + return mappingValue === value + }) } else { - mapping = mappings.find(t => { return Number(t.from) <= value && Number(t.to) >= value }) + mapping = mappings.find(t => { + let mappingFrom = t.from ===''?'':Number(t.from) + let mappingTo = t.to ===''?'':Number(t.to) + return Number(mappingFrom) <= value && Number(mappingTo) >= value + }) } this.mapping = mapping item.mapping = mapping @@ -423,97 +430,160 @@ export default { this.endLoading() } }, - getStatisticsResult (statistics, seriesItem) { + getStatisticsResult: function (statistics, seriesItem) { if (!seriesItem || !seriesItem.length > 0) return [] if (!statistics) return seriesItem let copy = JSON.parse(JSON.stringify(seriesItem)) - const last = copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[0] + copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[0] + let classifies=[]; + let maxGroup=0 + let map = new Map();//用于记录在第几组 + copy.forEach(item => { + let element = item.element.element; + let group = map.get(element); + if(typeof group != "undefined"){ + classifies[group].push(item) + }else{ + classifies.push([item]); + map.set(element,maxGroup++) + } + }) + let result switch (statistics) { case 'null': { - return copy.map(item => { + + result = copy.map(item => { return { element: item.element, time: bus.timeFormate(new Date(item.data[0]), 'yyyy-MM-dd hh:mm:ss'), value: item.data[1] } }) + break } case 'min': { - result = copy.sort((x, y) => { return parseFloat(x.data[1]) - parseFloat(y.data[1]) })[0] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let groupMin = group.sort((x, y) => { + return parseFloat(x.data[1]) - parseFloat(y.data[1]) + })[0] + + return { + element: groupMin.element, + time: bus.timeFormate(new Date(groupMin.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: groupMin.data[1] + } + }) break } case 'max': { - result = copy.sort((x, y) => { return parseFloat(y.data[1]) - parseFloat(x.data[1]) })[0] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let groupMax = group.sort((x, y) => { + return parseFloat(y.data[1]) - parseFloat(x.data[1]) + })[0] + + return { + element: groupMax.element, + time: bus.timeFormate(new Date(groupMax.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: groupMax.data[1] + } + }) break } case 'average': { - copy = copy.map(t => parseFloat(t.data[1])) - const sum = eval(copy.join('+')) - const avg = sum / copy.length - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: avg - }] + result = classifies.map(group=>{ + let groupData=group.map(t => parseFloat(t.data[1])) + const sum = eval(groupData.join('+')) + const avg = sum / groupData.length + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: avg + } + }) break } case 'total': { - copy = copy.map(t => parseFloat(t.data[1])) - const total = eval(copy.join('+')) - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: total - }] + result = classifies.map(group=>{ + let groupData=group.map(t => parseFloat(t.data[1])) + const total = eval(groupData.join('+')) + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: total + } + }) break } case 'first': { - result = copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[copy.length - 1] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let first = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[copy.length - 1] + + return { + element: first.element, + time: bus.timeFormate(new Date(first.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: first.data[1] + } + }) break } case 'last': { - result = last - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: last.data[1] + } + }) break } case 'range': { - const sort = copy.sort((x, y) => { return parseFloat(y.data[1]) - parseFloat(x.data[1]) }) - const max = sort[0] - const min = sort[sort.length - 1] - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: max.data[1] - min.data[1] - }] + result = classifies.map(group=>{ + + const sort = JSON.parse(JSON.stringify(group)).sort((x, y) => { + return parseFloat(y.data[1]) - parseFloat(x.data[1]) + }) + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + const max = sort[0] + const min = sort[sort.length - 1] + let range = max.data[1] - min.data[1]; + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: range + } + }) break } case 'different': { - const first = copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[copy.length - 1] - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: last.data[1] - first.data[1] - }] + result = classifies.map(group=>{ + + const sort = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + }) + let last = sort[0] + let first = sort[copy.length - 1] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: last.data[1] - first.data[1] + } + }) + break } } diff --git a/nezha-fronted/src/components/charts/chartPreview.vue b/nezha-fronted/src/components/charts/chartPreview.vue index fae8a965f..6a83ff9c1 100644 --- a/nezha-fronted/src/components/charts/chartPreview.vue +++ b/nezha-fronted/src/components/charts/chartPreview.vue @@ -1388,95 +1388,160 @@ export default { this.tableShow = true this.$refs.loadingPreview.endLoading() }, - getStatisticsResult (statistics, seriesItem) { + getStatisticsResult: function (statistics, seriesItem) { + if (!seriesItem || !seriesItem.length > 0) return [] + if (!statistics) return seriesItem let copy = JSON.parse(JSON.stringify(seriesItem)) - const last = copy.sort((x, y) => { return parseFloat(y[0]) - parseFloat(x[0]) })[0] + copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[0] + let classifies=[]; + let maxGroup=0 + let map = new Map();//用于记录在第几组 + copy.forEach(item => { + let element = item.element.element; + let group = map.get(element); + if(typeof group != "undefined"){ + classifies[group].push(item) + }else{ + classifies.push([item]); + map.set(element,maxGroup++) + } + }) + let result switch (statistics) { case 'null': { - return copy.map(item => { + + result = copy.map(item => { return { element: item.element, time: bus.timeFormate(new Date(item.data[0]), 'yyyy-MM-dd hh:mm:ss'), value: item.data[1] } }) + break } case 'min': { - result = copy.sort((x, y) => { return parseFloat(x.data[1]) - parseFloat(y.data[1]) })[0] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let groupMin = group.sort((x, y) => { + return parseFloat(x.data[1]) - parseFloat(y.data[1]) + })[0] + + return { + element: groupMin.element, + time: bus.timeFormate(new Date(groupMin.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: groupMin.data[1] + } + }) break } case 'max': { - result = copy.sort((x, y) => { return parseFloat(y.data[1]) - parseFloat(x.data[1]) })[0] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let groupMax = group.sort((x, y) => { + return parseFloat(y.data[1]) - parseFloat(x.data[1]) + })[0] + + return { + element: groupMax.element, + time: bus.timeFormate(new Date(groupMax.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: groupMax.data[1] + } + }) break } case 'average': { - copy = copy.map(t => parseFloat(t.data[1])) - const sum = eval(copy.join('+')) - const avg = sum / copy.length - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: avg - }] + result = classifies.map(group=>{ + let groupData=group.map(t => parseFloat(t.data[1])) + const sum = eval(groupData.join('+')) + const avg = sum / groupData.length + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: avg + } + }) break } case 'total': { - copy = copy.map(t => parseFloat(t.data[1])) - const total = eval(copy.join('+')) - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: total - }] + result = classifies.map(group=>{ + let groupData=group.map(t => parseFloat(t.data[1])) + const total = eval(groupData.join('+')) + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: total + } + }) break } case 'first': { - result = copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[copy.length - 1] - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + let first = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[copy.length - 1] + + return { + element: first.element, + time: bus.timeFormate(new Date(first.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: first.data[1] + } + }) break } case 'last': { - result = last - result = [{ - element: result.element, - time: bus.timeFormate(new Date(result.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: result.data[1] - }] + result = classifies.map(group=>{ + + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: last.data[1] + } + }) break } case 'range': { - const sort = copy.sort((x, y) => { return parseFloat(y.data[1]) - parseFloat(x.data[1]) }) - const max = sort[0] - const min = sort[sort.length - 1] - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: max.data[1] - min.data[1] - }] + result = classifies.map(group=>{ + + const sort = JSON.parse(JSON.stringify(group)).sort((x, y) => { + return parseFloat(y.data[1]) - parseFloat(x.data[1]) + }) + let last = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + })[0] + const max = sort[0] + const min = sort[sort.length - 1] + let range = max.data[1] - min.data[1]; + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: range + } + }) break } case 'different': { - const first = copy.sort((x, y) => { return parseFloat(y.data[0]) - parseFloat(x.data[0]) })[copy.length - 1] - result = [{ - element: last.element, - time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), - value: last.data[1] - first.data[1] - }] + result = classifies.map(group=>{ + + const sort = group.sort((x, y) => { + return parseFloat(y.data[0]) - parseFloat(x.data[0]) + }) + let last = sort[0] + let first = sort[copy.length - 1] + return { + element: last.element, + time: bus.timeFormate(new Date(last.data[0]), 'yyyy-MM-dd hh:mm:ss'), + value: last.data[1] - first.data[1] + } + }) + break } } diff --git a/nezha-fronted/src/components/common/language/cn.js b/nezha-fronted/src/components/common/language/cn.js index da6d3b214..193ad4300 100644 --- a/nezha-fronted/src/components/common/language/cn.js +++ b/nezha-fronted/src/components/common/language/cn.js @@ -147,7 +147,8 @@ const cn = { reloadTimeout: '重新启动服务器花了太多时间,安装可能有一些问题', hadConfig: '已经有人开始配置系统', invalidCode: '身份验证无效,请按照{page}中的描述继续', - welcomePage: '欢迎页面' + welcomePage: '欢迎页面', + inited: '系统已经被初始化', }, webshell: { shellTitle: '本地 Shell', diff --git a/nezha-fronted/src/components/common/language/en.js b/nezha-fronted/src/components/common/language/en.js index 2f7a55b34..4e0ebbd9f 100644 --- a/nezha-fronted/src/components/common/language/en.js +++ b/nezha-fronted/src/components/common/language/en.js @@ -153,7 +153,8 @@ const en = { reloadTimeout: 'It took too much time to restart the server, there may be some problems when you install', hadConfig: 'Someone has started to configure the system', invalidCode: "The authentication is invalid ,please follow the description in {page} 'To continue'", - welcomePage: 'Welcome page' + welcomePage: 'Welcome page', + inited:'The system has been initialized', }, webshell: { shellTitle: 'Local Shell', diff --git a/nezha-fronted/src/components/page/config/setup.vue b/nezha-fronted/src/components/page/config/setup.vue index 42776ca73..30940467f 100644 --- a/nezha-fronted/src/components/page/config/setup.vue +++ b/nezha-fronted/src/components/page/config/setup.vue @@ -237,6 +237,16 @@ export default { } else { this.getValidateCode() this.$get('setup/checkCode?code=' + this.validateCode).then(response => { + if(response.status == 404){ + this.$alert(this.$t('setup.hadConfig'), { type: 'warning' }) + const self = this; + setTimeout(()=>{ + self.$router.push({ + path: '/' + }) + },2000) + return; + } if (response.code == 200) { this.activeStep = 1 this.step = 1 diff --git a/nezha-fronted/src/components/page/dashboard/chartBox.vue b/nezha-fronted/src/components/page/dashboard/chartBox.vue index e40e3c3da..9e8ffedc5 100644 --- a/nezha-fronted/src/components/page/dashboard/chartBox.vue +++ b/nezha-fronted/src/components/page/dashboard/chartBox.vue @@ -439,7 +439,7 @@ -