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