import { getTime, setTime } from 'apis/system' import { formatDateTime } from 'libs/utils' import { onMounted, onUnmounted, ref } from 'vue' export function useServerTime() { const serverTime = ref(null) // 初始服务器时间戳 const clientFetchTime = ref(null) // 获取服务器时间时的客户端时间戳 const currentTime = ref('0000-00-00 00:00:00') const editVisible = ref(false) let interval: number | null = null onMounted(async () => { try { await getDateTime() } // eslint-disable-next-line unused-imports/no-unused-vars catch (error) { // currentTime.value = formatDateTime(undefined, new Date()) console.error('获取服务器时间失败') } }) const openDialog = () => { editVisible.value = true } const closeDialog = () => { editVisible.value = false } const getDateTime = async () => { serverTime.value = (await getTime())?.epochMilli clientFetchTime.value = Date.now() let num = 0 if (interval) clearInterval(interval) interval = window.setInterval(async () => { if (num > 60) { serverTime.value = (await getTime())?.epochMilli clientFetchTime.value = Date.now() num = 0 } if (serverTime.value && clientFetchTime.value) { const elapsed = Date.now() - clientFetchTime.value const currentServerTime = serverTime.value + elapsed currentTime.value = formatDateTime(undefined, new Date(currentServerTime)) num++ } }, 1000) } const setDateTime = async (time: number) => { await setTime(time) await getDateTime() } onUnmounted(() => { if (interval) clearInterval(interval) }) return { currentTime, serverTime, editVisible, setDateTime, openDialog, closeDialog } }