diff --git a/nezha-fronted/package.json b/nezha-fronted/package.json index e5ef18141..39126f7bc 100644 --- a/nezha-fronted/package.json +++ b/nezha-fronted/package.json @@ -45,6 +45,7 @@ "caniuse-lite": "^1.0.30001412", "codemirror-promql": "^0.19.0", "css-minimizer-webpack-plugin": "^1.0.0", + "csv-string": "^4.1.1", "cytoscape": "^3.15.2", "d3": "^6.7.0", "d3-hexbin": "^0.2.2", diff --git a/nezha-fronted/src/components/chart/chartMixin.js b/nezha-fronted/src/components/chart/chartMixin.js index b21da609b..6f810eb1c 100644 --- a/nezha-fronted/src/components/chart/chartMixin.js +++ b/nezha-fronted/src/components/chart/chartMixin.js @@ -9,6 +9,7 @@ import { chartTimeSeriesAreaOption, chartTimeSeriesScatterOption } from './chart/options/chartTimeSeries' +import * as CSV from 'csv-string'; export default { data () { return { @@ -532,6 +533,7 @@ export default { // 兼容ie11 const blobObject = new Blob([csv]) window.navigator.msSaveOrOpenBlob(blobObject, chart.name + '.csv') + this.$message.success(this.$t('tip.downloadSuccess')) } else { const blob = new Blob([csv]) const link = document.createElement('a') @@ -542,11 +544,12 @@ export default { link.click() // 点击下载 document.body.removeChild(link) // 下载完成移除元素 window.URL.revokeObjectURL(href) // 释放blob对象 + this.$message.success(this.$t('tip.downloadSuccess')) } }, convertTimeSertesToCSV (chartInfo) { const data = this.series - let csv = 'time,legend,value\n' + let csv = '"time","legend","value"\n' data.forEach((item, index) => { item.data.forEach(value => { let val = formatScientificNotation(value[1], this.$lodash.get(chartInfo, 'param.decimals', 2)) @@ -557,13 +560,16 @@ export default { unit = chartDataFormat.getUnit(this.$lodash.get(chartInfo, 'unit', 2)) } val = unit.compute(val, index, -1, chartInfo.param.decimals || 2) - csv += `${this.momentTz(value[0] * 1000)},${this.legends[index].alias},${val}\n` + csv += `"${this.momentTz(value[0] * 1000)}","${this.yasuo(this.legends[index].alias)}","${val}"\n` }) }) return csv }, + yasuo (str) { + return str.replace(/\"/g, '\"\"') + }, convertOtherToCSV (chartInfo) { - let csv = 'legend,value\n' + let csv = '"legend","value"\n' let keyByData = '' let legend = 'legend' switch (chartInfo.type) { @@ -618,18 +624,18 @@ export default { return } this.$lodash.get(this, keyByData, []).forEach(item => { - csv += `${item[legend]},${item.showValue}\n` + csv += `"${this.yasuo(item[legend])}","${item.showValue}"\n` }) return csv }, convertTableToCSV (chartInfo) { let csv = '' - csv = this.columns.map(item => item.title).join(',') + csv = this.columns.map(item => '"' + this.yasuo(item.title) + '"').join(',') csv += '\n' this.oldTableData.forEach(item => { let arr = [] this.columns.forEach(column => { - arr.push(item.display[column.title + 'display'].display) + arr.push(`"${this.yasuo(item.display[column.title + 'display'].display)}"`) }) arr = arr.join(',') csv += arr diff --git a/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue b/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue index a435c4b86..cd109ff48 100644 --- a/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue +++ b/nezha-fronted/src/components/common/bottomBox/tabs/cortexDetail.vue @@ -72,7 +72,8 @@ export default { servicesTableData: [], ringTableData: [], readyTableData: '', - loading: false + loading: false, + fromBottom: true } }, mounted () { diff --git a/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue b/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue index 9440977b3..57c10ef03 100644 --- a/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue +++ b/nezha-fronted/src/components/common/bottomBox/tabs/lokiStatus.vue @@ -73,7 +73,8 @@ export default { servicesTableTitle: [], ringTableData: [], readyTableData: '', - loading: false + loading: false, + fromBottom: true } }, mounted () {