4 changed files with 120 additions and 25 deletions
-
108src/components/common/FTDatetime/index.vue
-
21src/components/system/EditDate/index.vue
-
14src/layouts/default.vue
-
2src/main.ts
@ -0,0 +1,108 @@ |
|||||
|
<script setup lang="ts"> |
||||
|
import { getTime, setTime } from 'apis/system' |
||||
|
import { FtMessage } from 'libs/message' |
||||
|
import { formatDateTime } from 'libs/utils' |
||||
|
import { onMounted, onUnmounted, ref } from 'vue' |
||||
|
|
||||
|
const serverTime = ref<number | undefined>() // 初始服务器时间戳 |
||||
|
const clientFetchTime = ref<number | null>(null) // 获取服务器时间时的客户端时间戳 |
||||
|
const currentTime = ref<string>('0001-00-00 00:00:00') |
||||
|
const editVisible = ref(false) |
||||
|
|
||||
|
let interval: number | null = null |
||||
|
|
||||
|
onMounted(async () => { |
||||
|
try { |
||||
|
await getDateTime() |
||||
|
} |
||||
|
|
||||
|
catch (error) { |
||||
|
// currentTime.value = formatDateTime(undefined, new Date()) |
||||
|
console.error('获取服务器时间失败') |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const openDialog = () => { |
||||
|
form.value.epochMilli = serverTime.value |
||||
|
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({ epochMilli: time }) |
||||
|
await getDateTime() |
||||
|
} |
||||
|
|
||||
|
const form = ref<{ epochMilli?: number }>({}) |
||||
|
|
||||
|
const formRef = ref() |
||||
|
|
||||
|
const rules = { |
||||
|
epochMilli: [ |
||||
|
{ required: true, message: '请选择时间', trigger: 'change' }, |
||||
|
], |
||||
|
} |
||||
|
|
||||
|
const okHandle = async () => { |
||||
|
try { |
||||
|
const valid = await formRef.value.validate() |
||||
|
if (!valid) { |
||||
|
return |
||||
|
} |
||||
|
await setDateTime(form.value.epochMilli as number) |
||||
|
FtMessage.success('修改成功') |
||||
|
closeDialog() |
||||
|
} |
||||
|
catch (e) { |
||||
|
console.log(e) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
onUnmounted(() => { |
||||
|
if (interval) |
||||
|
clearInterval(interval) |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<template> |
||||
|
<span @click="openDialog">{{ currentTime }}</span> |
||||
|
<ft-dialog :visible="editVisible" title="设置日期与时间" width="40%" :ok-handle="okHandle" @cancel="closeDialog"> |
||||
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="auto"> |
||||
|
<el-form-item label="日期与时间" prop="epochMilli"> |
||||
|
<el-date-picker |
||||
|
v-model="form.epochMilli" |
||||
|
:show-now="false" |
||||
|
format="YYYY-MM-DD hh:mm:ss" |
||||
|
value-format="x" |
||||
|
style="width: 100%" |
||||
|
type="datetime" |
||||
|
placeholder="请选择日期和时间" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</ft-dialog> |
||||
|
</template> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue