2021-06-22 17:07:46 +08:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="cn-refresh-box" v-ele-click-outside="dropdownShowFalse">
|
|
|
|
|
|
<span>
|
2024-03-07 19:18:18 +08:00
|
|
|
|
<el-button-group size="small">
|
|
|
|
|
|
<el-button size="small" @click="$emit('change')"><i class="cn-icon cn-icon-refresh1"></i></el-button>
|
|
|
|
|
|
<el-button class="cn-button" size="small" @click="showRefreshList">
|
2022-07-15 18:06:50 +08:00
|
|
|
|
<span class="cn-button-label" v-if="interLabel">{{interLabel}}</span>
|
2021-06-22 17:07:46 +08:00
|
|
|
|
<i class="cn-icon cn-icon-dropdown" :class="dropdownShow?'active' : ''"></i>
|
|
|
|
|
|
</el-button>
|
|
|
|
|
|
</el-button-group>
|
|
|
|
|
|
</span>
|
|
|
|
|
|
<transition name="el-zoom-in-top">
|
|
|
|
|
|
<div v-if="dropdownShow" class="refresh-list">
|
|
|
|
|
|
<div v-for="(item, index) in refreshArr" :key="index" @click="setRefresh(item)" class="refresh-list-item" :class="item.value==interval ? 'active' : ''">
|
2022-10-19 15:27:26 +08:00
|
|
|
|
{{ item.label }}
|
|
|
|
|
|
<i v-if="item.value===interval" class="cn-icon cn-icon-check"></i>
|
2021-06-22 17:07:46 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</transition>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
// import { ref } from 'vue'
|
2022-10-12 16:13:23 +08:00
|
|
|
|
import { overwriteUrl, urlParamsHandler } from '@/utils/tools'
|
|
|
|
|
|
import { useRoute } from 'vue-router'
|
2022-10-12 18:20:08 +08:00
|
|
|
|
import { useStore } from 'vuex'
|
2022-10-12 16:13:23 +08:00
|
|
|
|
|
2021-06-22 17:07:46 +08:00
|
|
|
|
export default {
|
|
|
|
|
|
name: 'TimeRefresh',
|
|
|
|
|
|
props: {
|
|
|
|
|
|
endTime: {
|
|
|
|
|
|
type: Number
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
data () {
|
|
|
|
|
|
return {
|
|
|
|
|
|
searchTime: [],
|
|
|
|
|
|
lastRefreshTime: '',
|
|
|
|
|
|
intervalTimer: null,
|
|
|
|
|
|
interval: -1,
|
|
|
|
|
|
unit: 2,
|
|
|
|
|
|
dropdownShow: false,
|
2022-10-12 16:13:23 +08:00
|
|
|
|
interLabel: ''
|
2021-06-22 17:07:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
2022-12-29 16:17:26 +08:00
|
|
|
|
setup () {
|
2022-10-12 16:13:23 +08:00
|
|
|
|
const { query } = useRoute()
|
2022-10-12 18:20:08 +08:00
|
|
|
|
const store = useStore()
|
2022-10-12 16:13:23 +08:00
|
|
|
|
const refreshArr = [
|
|
|
|
|
|
{ value: -1, label: 'off' },
|
|
|
|
|
|
{ value: 30, label: '30s' },
|
|
|
|
|
|
{ value: 60, label: '1m' },
|
|
|
|
|
|
{ value: 300, label: '5m' },
|
|
|
|
|
|
{ value: 900, label: '15m' },
|
|
|
|
|
|
{ value: 1800, label: '30m' }
|
|
|
|
|
|
]
|
|
|
|
|
|
let refreshObj = {}
|
|
|
|
|
|
|
2022-10-12 18:20:08 +08:00
|
|
|
|
// 是否关闭refreshTime标志,
|
|
|
|
|
|
// 即时间选择30s后再off,下钻再返回时,地址栏会带着refreshTime,
|
|
|
|
|
|
// 此时通过refreshFlag判断已经off,再清除地址栏地址栏会带着refreshTime
|
|
|
|
|
|
const refreshFlag = store.state.panel.refreshFlag
|
|
|
|
|
|
const refreshTime = store.state.panel.refreshTime
|
|
|
|
|
|
|
|
|
|
|
|
if (refreshFlag) {
|
2022-10-13 09:47:11 +08:00
|
|
|
|
if (refreshTime !== null) {
|
2022-10-12 18:20:08 +08:00
|
|
|
|
// 此处是避免下钻后浏览器返回,获取不到url的refreshTime情况
|
2022-10-13 09:47:11 +08:00
|
|
|
|
// 以及重新加载后改变时间但url回退仍保留上次数据的情况
|
2023-05-16 15:13:27 +08:00
|
|
|
|
refreshObj = refreshArr.find(item => item.value === refreshTime) || refreshArr[0]
|
2022-10-13 09:47:11 +08:00
|
|
|
|
} else if (query.refreshTime !== undefined) {
|
2023-05-16 15:13:27 +08:00
|
|
|
|
// 若地址栏的refreshTime不是数组里的值,直接关闭刷新
|
|
|
|
|
|
refreshObj = refreshArr.find(item => item.value === Number(query.refreshTime)) || refreshArr[0]
|
2022-10-12 18:20:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 浏览器回退时,清除掉地址栏的refreshTime
|
|
|
|
|
|
const newQuery = JSON.parse(JSON.stringify(query))
|
|
|
|
|
|
delete newQuery.refreshTime
|
|
|
|
|
|
const newUrl = urlParamsHandler(window.location.href, query, newQuery, 'clean')
|
|
|
|
|
|
overwriteUrl(newUrl)
|
2022-10-12 16:13:23 +08:00
|
|
|
|
}
|
2021-06-22 17:07:46 +08:00
|
|
|
|
|
2022-10-12 16:13:23 +08:00
|
|
|
|
return {
|
|
|
|
|
|
refreshArr,
|
|
|
|
|
|
refreshObj
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
mounted () {
|
|
|
|
|
|
if (Object.keys(this.refreshObj).length > 0) {
|
|
|
|
|
|
this.setRefresh(this.refreshObj)
|
|
|
|
|
|
}
|
2021-06-22 17:07:46 +08:00
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
setRefresh (val) {
|
|
|
|
|
|
this.interval = val.value
|
2022-12-29 16:17:26 +08:00
|
|
|
|
this.interLabel = val.value === -1 ? '' : val.label
|
2021-06-22 17:07:46 +08:00
|
|
|
|
this.dropdownShow = false
|
|
|
|
|
|
const now = window.$dayJs.tz().valueOf()
|
2022-10-19 15:27:26 +08:00
|
|
|
|
if (val && val.value !== -1) {
|
|
|
|
|
|
// 切换轮询请求时间频率时,发现有未结束的请求,终止请求
|
|
|
|
|
|
const cancelList = this.$store.state.panel.httpCancel
|
|
|
|
|
|
if (cancelList.length > 0) {
|
|
|
|
|
|
cancelList.forEach((cancel, index) => {
|
|
|
|
|
|
cancel()
|
|
|
|
|
|
delete cancelList[index]
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2022-10-12 16:13:23 +08:00
|
|
|
|
// 向地址栏添加自动刷新频率
|
|
|
|
|
|
const dateParam = {
|
|
|
|
|
|
refreshTime: val.value
|
|
|
|
|
|
}
|
|
|
|
|
|
this.reloadUrl(dateParam)
|
2022-10-12 18:20:08 +08:00
|
|
|
|
this.$store.commit('setRefreshTime', val.value)
|
2022-12-29 16:17:26 +08:00
|
|
|
|
this.$store.commit('setRefreshFlag', true)
|
2022-10-12 16:13:23 +08:00
|
|
|
|
|
2023-05-16 15:13:27 +08:00
|
|
|
|
// 在新的轮询开始前清除掉已经可能存在的定时器,避免新的刷新时间不生效
|
|
|
|
|
|
clearInterval(this.intervalTimer)
|
2021-06-22 17:07:46 +08:00
|
|
|
|
// 设置定时器
|
|
|
|
|
|
this.intervalTimer = setInterval(() => {
|
|
|
|
|
|
this.$emit('change')
|
|
|
|
|
|
}, val.value * 1000)
|
|
|
|
|
|
// 设置定时器 比上次刷新间隔大于30s 立马刷新一次
|
|
|
|
|
|
if ((now - this.endTime) / 1000 > 30) {
|
|
|
|
|
|
this.$emit('change')
|
|
|
|
|
|
}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2022-10-19 15:27:26 +08:00
|
|
|
|
if (val && val.value === -1) {
|
2021-06-22 17:07:46 +08:00
|
|
|
|
// 清除定时器
|
|
|
|
|
|
clearInterval(this.intervalTimer)
|
2022-10-12 16:13:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 地址栏中清除自动刷新频率refreshTime
|
|
|
|
|
|
const routeQuery = this.$route.query
|
|
|
|
|
|
delete routeQuery.refreshTime
|
|
|
|
|
|
this.reloadUrl(routeQuery, 'cleanOldParams')
|
2022-10-12 18:20:08 +08:00
|
|
|
|
this.$store.commit('setRefreshTime', null)
|
|
|
|
|
|
this.$store.commit('setRefreshFlag', false)
|
2021-06-22 17:07:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
showRefreshList () {
|
|
|
|
|
|
this.dropdownShow = !this.dropdownShow
|
|
|
|
|
|
},
|
|
|
|
|
|
dropdownShowFalse () {
|
|
|
|
|
|
this.dropdownShow = false
|
2022-10-12 16:13:23 +08:00
|
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 向地址栏添加/删除参数
|
|
|
|
|
|
*/
|
|
|
|
|
|
reloadUrl (newParam, clean) {
|
|
|
|
|
|
const { query } = this.$route
|
|
|
|
|
|
let newUrl = urlParamsHandler(window.location.href, query, newParam)
|
|
|
|
|
|
if (clean) {
|
|
|
|
|
|
newUrl = urlParamsHandler(window.location.href, query, newParam, clean)
|
|
|
|
|
|
}
|
|
|
|
|
|
overwriteUrl(newUrl)
|
2021-06-22 17:07:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|