You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

98 lines
2.4 KiB

<script setup lang="ts">
import { request, unwrapApiBody, type ApiResponse } from '../../../../utils/http/factory'
import { useAuthSession } from '../../../../composables/useAuthSession'
definePageMeta({ title: '应用配置' })
type GlobalConfigPayload = {
config: {
siteName: string
allowRegister: boolean
}
}
const { user, refresh } = useAuthSession()
const { refresh: refreshGlobalConfig } = useGlobalConfig()
const loading = ref(true)
const saving = ref(false)
const siteName = ref('')
const allowRegister = ref(true)
async function ensureAdmin() {
await refresh(true)
if (user.value?.role !== 'admin') {
await navigateTo('/me')
}
}
async function load() {
loading.value = true
try {
const res = await request<ApiResponse<GlobalConfigPayload>>('/api/config/global')
const cfg = unwrapApiBody(res).config
siteName.value = cfg.siteName
allowRegister.value = cfg.allowRegister
} finally {
loading.value = false
}
}
onMounted(async () => {
await ensureAdmin()
await load()
})
async function putKey(key: string, value: unknown) {
await request('/api/config/global', {
method: 'PUT',
body: { key, value },
})
}
async function save() {
saving.value = true
try {
await putKey('siteName', siteName.value.trim())
await putKey('allowRegister', allowRegister.value)
await load()
await refreshGlobalConfig()
} finally {
saving.value = false
}
}
</script>
<template>
<UContainer class="py-8 space-y-8 max-w-4xl">
<h1 class="text-2xl font-semibold">
应用配置
</h1>
<p class="text-sm text-muted">
全局设置站点名称与开放注册
</p>
<UCard>
<template #header>
全局项
</template>
<div v-if="loading" class="text-muted">
加载中…
</div>
<div v-else class="space-y-4 max-w-xl">
<UFormField label="站点名称">
<UInput v-model="siteName" maxlength="64" placeholder="Person Panel" />
</UFormField>
<UFormField
label="允许自助注册"
description="关闭后,登录页不再显示注册入口;管理员仍可创建用户。"
>
<UCheckbox v-model="allowRegister" label="开启" />
</UFormField>
<UButton :loading="saving" @click="save">
保存
</UButton>
</div>
</UCard>
</UContainer>
</template>