feat: 实现管理后台 W1-W3 假数据界面

This commit is contained in:
Nixevol
2026-09-30 07:02:33 +08:00
parent 8dde564517
commit 1cff321f2a
33 changed files with 4773 additions and 31 deletions
+104
View File
@@ -0,0 +1,104 @@
<script setup lang="ts">
import { onMounted, ref } from "vue";
import { NButton, NForm, NFormItem, NInput, NSpace, NSpin, NSwitch, NText } from "naive-ui";
import PageHeader from "@/components/PageHeader.vue";
import HelpTip from "@/components/HelpTip.vue";
import { getRegistration, updateRegistration, type RegistrationSettings } from "@/api/admin";
import { formatLocalMs } from "@/utils/time";
import { message } from "@/utils/notify";
const loading = ref(true);
const saving = ref(false);
const data = ref<RegistrationSettings | null>(null);
const codeDraft = ref("");
async function load() {
loading.value = true;
try {
data.value = await getRegistration();
codeDraft.value = data.value.code;
} finally {
loading.value = false;
}
}
onMounted(() => {
void load();
});
async function onToggle(enabled: boolean) {
if (!data.value) return;
saving.value = true;
try {
data.value = await updateRegistration({ enabled });
message.success(enabled ? "已开启自助注册" : "已关闭自助注册");
} finally {
saving.value = false;
}
}
async function saveCode() {
saving.value = true;
try {
data.value = await updateRegistration({ code: codeDraft.value });
codeDraft.value = data.value.code;
message.success("安全码已更新");
} finally {
saving.value = false;
}
}
async function generateCode() {
saving.value = true;
try {
data.value = await updateRegistration({ generate: true });
codeDraft.value = data.value.code;
message.success("已生成新安全码");
} finally {
saving.value = false;
}
}
</script>
<template>
<div class="page">
<PageHeader title="注册设置" help="关闭时任何自助注册失败。安全码 8–64 字符,可手填或生成,后台可查看明文。" />
<div class="page-body">
<n-spin :show="loading">
<n-form v-if="data" label-placement="left" label-width="100" :show-feedback="false" style="max-width: 560px">
<n-form-item>
<template #label>
开放注册
<HelpTip>开启后需同时设置安全码,客户端注册时携带。</HelpTip>
</template>
<n-switch :value="data.enabled" :loading="saving" @update:value="onToggle" />
</n-form-item>
<n-form-item label="安全码">
<n-input v-model:value="codeDraft" placeholder="8–64 字符" />
</n-form-item>
<n-form-item label="更新时间">
<n-text>{{ formatLocalMs(data.updated_at_ms) }}</n-text>
</n-form-item>
<n-space>
<n-button type="primary" :loading="saving" @click="saveCode">保存安全码</n-button>
<n-button :loading="saving" @click="generateCode">生成安全码</n-button>
</n-space>
</n-form>
</n-spin>
</div>
</div>
</template>
<style scoped>
.page {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
}
.page-body {
flex: 1;
overflow: auto;
padding: 16px;
}
</style>