style: 统一定时任务布局

This commit is contained in:
YorhaL
2026-02-04 00:27:27 +08:00
parent bac0e7fb20
commit 381fc6b2cf

View File

@@ -490,10 +490,10 @@
<template #actions> <template #actions>
<Button <Button
size="sm" size="sm"
:disabled="checkinTimeLoading || !hasCheckinTimeChanged" :disabled="schedulerConfigLoading || !hasSchedulerConfigChanges"
@click="handleCheckinTimeSave" @click="handleSchedulerConfigSave"
> >
{{ checkinTimeLoading ? '保存中...' : '保存' }} {{ schedulerConfigLoading ? '保存中...' : '保存' }}
</Button> </Button>
</template> </template>
@@ -567,7 +567,7 @@
</div> </div>
<div class="mt-6 grid grid-cols-1 md:grid-cols-2 gap-6"> <div class="mt-6 grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="flex items-start space-x-2"> <div class="flex items-center space-x-2">
<Switch <Switch
id="enable-user-quota-reset" id="enable-user-quota-reset"
:model-value="systemConfig.enable_user_quota_reset" :model-value="systemConfig.enable_user_quota_reset"
@@ -588,22 +588,12 @@
<div <div
v-if="systemConfig.enable_user_quota_reset" v-if="systemConfig.enable_user_quota_reset"
class="space-y-4" class="grid grid-cols-1 md:grid-cols-2 gap-6"
> >
<div> <div>
<div class="flex items-center justify-between gap-2"> <Label class="block text-sm font-medium">
<Label class="block text-sm font-medium"> 执行时间
执行时间 </Label>
</Label>
<Button
size="sm"
variant="outline"
:disabled="userQuotaResetTimeLoading || !hasUserQuotaResetTimeChanged"
@click="handleUserQuotaResetTimeSave"
>
{{ userQuotaResetTimeLoading ? '保存中...' : '保存' }}
</Button>
</div>
<div class="mt-1 flex items-center gap-2"> <div class="mt-1 flex items-center gap-2">
<Select <Select
v-model:open="userQuotaResetHourSelectOpen" v-model:open="userQuotaResetHourSelectOpen"
@@ -658,17 +648,10 @@
v-model.number="systemConfig.user_quota_reset_interval_days" v-model.number="systemConfig.user_quota_reset_interval_days"
type="number" type="number"
min="1" min="1"
step="1"
class="w-24" class="w-24"
/> />
<span class="text-xs text-muted-foreground">天</span> <span class="text-xs text-muted-foreground">天</span>
<Button
size="sm"
variant="outline"
:disabled="userQuotaResetIntervalSaving"
@click="saveUserQuotaResetInterval"
>
{{ userQuotaResetIntervalSaving ? '保存中...' : '保存' }}
</Button>
</div> </div>
<p class="mt-1 text-xs text-muted-foreground"> <p class="mt-1 text-xs text-muted-foreground">
滚动计算:距离上次成功执行满 N 天后才会再次执行 滚动计算:距离上次成功执行满 N 天后才会再次执行
@@ -1103,7 +1086,6 @@ const basicConfigLoading = ref(false)
const logConfigLoading = ref(false) const logConfigLoading = ref(false)
const cleanupConfigLoading = ref(false) const cleanupConfigLoading = ref(false)
const logLevelSelectOpen = ref(false) const logLevelSelectOpen = ref(false)
const userQuotaResetIntervalSaving = ref(false)
// 导出/导入相关 // 导出/导入相关
const exportLoading = ref(false) const exportLoading = ref(false)
@@ -1287,6 +1269,7 @@ async function loadSystemConfig() {
previousCheckinTime.value = systemConfig.value.provider_checkin_time previousCheckinTime.value = systemConfig.value.provider_checkin_time
// 初始化配额重置时间的原始值(用于回滚) // 初始化配额重置时间的原始值(用于回滚)
previousUserQuotaResetTime.value = systemConfig.value.user_quota_reset_time previousUserQuotaResetTime.value = systemConfig.value.user_quota_reset_time
previousUserQuotaResetIntervalDays.value = systemConfig.value.user_quota_reset_interval_days
} catch (err) { } catch (err) {
error('加载系统配置失败') error('加载系统配置失败')
log.error('加载系统配置失败:', err) log.error('加载系统配置失败:', err)
@@ -1429,9 +1412,8 @@ async function handleProviderCheckinToggle(enabled: boolean) {
} }
} }
// 签到时间相关
const previousCheckinTime = ref('') const previousCheckinTime = ref('')
const checkinTimeLoading = ref(false) const schedulerConfigLoading = ref(false)
const checkinHourSelectOpen = ref(false) const checkinHourSelectOpen = ref(false)
const checkinMinuteSelectOpen = ref(false) const checkinMinuteSelectOpen = ref(false)
@@ -1458,32 +1440,6 @@ const hasCheckinTimeChanged = computed(() => {
return systemConfig.value.provider_checkin_time !== previousCheckinTime.value return systemConfig.value.provider_checkin_time !== previousCheckinTime.value
}) })
async function handleCheckinTimeSave() {
const newTime = systemConfig.value.provider_checkin_time
// 验证时间格式
if (!newTime || !/^\d{2}:\d{2}$/.test(newTime)) {
error('请输入有效的时间格式 (HH:MM)')
return
}
checkinTimeLoading.value = true
try {
await adminApi.updateSystemConfig(
'provider_checkin_time',
newTime,
'Provider 自动签到执行时间HH:MM 格式)'
)
previousCheckinTime.value = newTime
success(`签到时间已设置为 ${newTime}`)
} catch (err) {
error('保存签到时间失败')
log.error('保存签到时间失败:', err)
} finally {
checkinTimeLoading.value = false
}
}
async function handleUserQuotaResetToggle(enabled: boolean) { async function handleUserQuotaResetToggle(enabled: boolean) {
const previousValue = systemConfig.value.enable_user_quota_reset const previousValue = systemConfig.value.enable_user_quota_reset
systemConfig.value.enable_user_quota_reset = enabled systemConfig.value.enable_user_quota_reset = enabled
@@ -1504,9 +1460,9 @@ async function handleUserQuotaResetToggle(enabled: boolean) {
// 用户配额重置时间相关 // 用户配额重置时间相关
const previousUserQuotaResetTime = ref('') const previousUserQuotaResetTime = ref('')
const userQuotaResetTimeLoading = ref(false)
const userQuotaResetHourSelectOpen = ref(false) const userQuotaResetHourSelectOpen = ref(false)
const userQuotaResetMinuteSelectOpen = ref(false) const userQuotaResetMinuteSelectOpen = ref(false)
const previousUserQuotaResetIntervalDays = ref(1)
const userQuotaResetHour = computed(() => { const userQuotaResetHour = computed(() => {
const time = systemConfig.value.user_quota_reset_time const time = systemConfig.value.user_quota_reset_time
@@ -1528,54 +1484,94 @@ const hasUserQuotaResetTimeChanged = computed(() => {
return systemConfig.value.user_quota_reset_time !== previousUserQuotaResetTime.value return systemConfig.value.user_quota_reset_time !== previousUserQuotaResetTime.value
}) })
async function handleUserQuotaResetTimeSave() { const hasUserQuotaResetIntervalChanged = computed(() => {
const newTime = systemConfig.value.user_quota_reset_time return systemConfig.value.user_quota_reset_interval_days !== previousUserQuotaResetIntervalDays.value
})
if (!newTime || !/^\d{2}:\d{2}$/.test(newTime)) { const hasSchedulerConfigChanges = computed(() => {
error('请输入有效的时间格式 (HH:MM)') return (
return hasCheckinTimeChanged.value ||
hasUserQuotaResetTimeChanged.value ||
hasUserQuotaResetIntervalChanged.value
)
})
async function handleSchedulerConfigSave() {
const configItems: Array<{ key: string, value: any, description: string, onSuccess: () => void }> = []
if (hasCheckinTimeChanged.value) {
const newTime = systemConfig.value.provider_checkin_time
if (!newTime || !/^\d{2}:\d{2}$/.test(newTime)) {
error('请输入有效的时间格式 (HH:MM)')
return
}
configItems.push({
key: 'provider_checkin_time',
value: newTime,
description: 'Provider 自动签到执行时间HH:MM 格式)',
onSuccess: () => {
previousCheckinTime.value = newTime
}
})
} }
userQuotaResetTimeLoading.value = true if (hasUserQuotaResetTimeChanged.value) {
try { const newTime = systemConfig.value.user_quota_reset_time
await adminApi.updateSystemConfig( if (!newTime || !/^\d{2}:\d{2}$/.test(newTime)) {
'user_quota_reset_time', error('请输入有效的时间格式 (HH:MM)')
newTime, return
'用户配额自动重置执行时间HH:MM 格式)' }
) configItems.push({
previousUserQuotaResetTime.value = newTime key: 'user_quota_reset_time',
success(`用户配额重置时间已设置为 ${newTime}`) value: newTime,
} catch (err) { description: '用户配额自动重置执行时间HH:MM 格式)',
error('保存用户配额重置时间失败') onSuccess: () => {
log.error('保存用户配额重置时间失败:', err) previousUserQuotaResetTime.value = newTime
} finally { }
userQuotaResetTimeLoading.value = false })
} }
}
async function saveUserQuotaResetInterval() { if (hasUserQuotaResetIntervalChanged.value) {
const previousValue = systemConfig.value.user_quota_reset_interval_days let intervalDays = Number(systemConfig.value.user_quota_reset_interval_days)
let intervalDays = Number(systemConfig.value.user_quota_reset_interval_days) if (!Number.isFinite(intervalDays) || intervalDays < 1) intervalDays = 1
if (!Number.isFinite(intervalDays) || intervalDays < 1) intervalDays = 1 intervalDays = Math.trunc(intervalDays)
// 规范化显示值 systemConfig.value.user_quota_reset_interval_days = intervalDays
systemConfig.value.user_quota_reset_interval_days = intervalDays
configItems.push({
key: 'user_quota_reset_interval_days',
value: intervalDays,
description: '用户配额重置周期(天数),滚动计算',
onSuccess: () => {
previousUserQuotaResetIntervalDays.value = intervalDays
}
})
}
if (configItems.length === 0) return
schedulerConfigLoading.value = true
const failedKeys: string[] = []
userQuotaResetIntervalSaving.value = true
try { try {
await adminApi.updateSystemConfig( for (const item of configItems) {
'user_quota_reset_interval_days', try {
intervalDays, await adminApi.updateSystemConfig(item.key, item.value, item.description)
'用户配额重置周期(天数),滚动计算' item.onSuccess()
) } catch (err) {
success('用户配额重置周期已保存') failedKeys.push(item.key)
} catch (err) { log.error(`保存定时任务配置失败: ${item.key}`, err)
error('保存配置失败') }
log.error('保存用户配额重置周期失败:', err) }
// 回滚状态
systemConfig.value.user_quota_reset_interval_days = previousValue if (failedKeys.length > 0) {
error(`部分配置保存失败: ${failedKeys.join(', ')}`)
return
}
success('定时任务配置已保存')
} finally { } finally {
userQuotaResetIntervalSaving.value = false schedulerConfigLoading.value = false
} }
} }