feature: support init db in admin portal (#658)

This commit is contained in:
Dream Hunter
2025-05-20 17:45:55 +08:00
committed by GitHub
parent 272b624b9b
commit 50326bcc98
15 changed files with 1897 additions and 1809 deletions

View File

@@ -18,6 +18,7 @@ import Mails from './admin/Mails.vue';
import MailsUnknow from './admin/MailsUnknow.vue';
import About from './common/About.vue';
import Maintenance from './admin/Maintenance.vue';
import DatabaseManager from './admin/DatabaseManager.vue';
import Appearance from './common/Appearance.vue';
import Telegram from './admin/Telegram.vue';
import Webhook from './admin/Webhook.vue';
@@ -67,6 +68,7 @@ const { t } = useI18n({
webhookSettings: 'Webhook Settings',
statistics: 'Statistics',
maintenance: 'Maintenance',
database: 'Database',
workerconfig: 'Worker Config',
appearance: 'Appearance',
about: 'About',
@@ -93,6 +95,7 @@ const { t } = useI18n({
webhookSettings: 'Webhook 设置',
statistics: '统计',
maintenance: '维护',
database: '数据库',
workerconfig: 'Worker 配置',
appearance: '外观',
about: '关于',
@@ -126,6 +129,9 @@ onMounted(async () => {
<n-tabs v-if="showAdminPage" type="card" v-model:value="adminTab" :placement="globalTabplacement">
<n-tab-pane name="qucickSetup" :tab="t('qucickSetup')">
<n-tabs type="bar" justify-content="center" animated>
<n-tab-pane name="database" :tab="t('database')">
<DatabaseManager />
</n-tab-pane>
<n-tab-pane name="account_settings" :tab="t('account_settings')">
<AccountSettings />
</n-tab-pane>
@@ -196,6 +202,9 @@ onMounted(async () => {
</n-tab-pane>
<n-tab-pane name="maintenance" :tab="t('maintenance')">
<n-tabs type="bar" justify-content="center" animated>
<n-tab-pane name="database" :tab="t('database')">
<DatabaseManager />
</n-tab-pane>
<n-tab-pane name="workerconfig" :tab="t('workerconfig')">
<WorkerConfig />
</n-tab-pane>

View File

@@ -0,0 +1,126 @@
<script setup>
import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n'
import { CleaningServicesFilled } from '@vicons/material'
import { api } from '../../api'
import { init } from 'vooks/lib/on-fonts-ready';
const message = useMessage()
const dbVersionData = ref({
need_initialization: false,
need_migration: false,
current_db_version: '',
code_db_version: ''
})
const { t } = useI18n({
messages: {
en: {
need_initialization_tip: 'Database initialization is required. Please initialize the database.',
need_migration_tip: 'Database migration is required. Please migrate the database.',
current_db_version: 'Current DB Version',
code_db_version: 'Code Needed DB Version',
init: 'Initialize Database',
migration: 'Migrate Database',
initializationSuccess: 'Database initialized successfully',
migrationSuccess: 'Database migrated successfully',
},
zh: {
need_initialization_tip: '需要初始化数据库,请初始化数据库',
need_migration_tip: '需要迁移数据库,请迁移数据库',
current_db_version: '当前数据库版本',
code_db_version: '需要的数据库版本',
init: '初始化数据库',
migration: '升级数据库 Schema',
initializationSuccess: '数据库初始化成功',
migrationSuccess: '数据库升级成功',
}
}
});
const fetchData = async () => {
try {
const res = await api.fetch('/admin/db_version');
if (res) Object.assign(dbVersionData.value, res);
} catch (error) {
message.error(error.message || "error");
}
}
const initialization = async () => {
try {
await api.fetch('/admin/db_initialize', {
method: 'POST'
});
await fetchData();
message.success(t('initializationSuccess'));
} catch (error) {
message.error(error.message || "error");
}
}
const migration = async () => {
try {
await api.fetch('/admin/db_migration', {
method: 'POST'
});
await fetchData();
message.success(t('migrationSuccess'));
} catch (error) {
message.error(error.message || "error");
}
}
onMounted(async () => {
await fetchData();
})
</script>
<template>
<div class="center">
<n-card :bordered="false" embedded>
<n-alert v-if="dbVersionData.need_initialization" type="warning" :show-icon="false" :bordered="false">
<span>{{ t('need_initialization_tip') }}</span>
<n-button @click="initialization" type="primary" secondary block :loading="loading">
{{ t('init') }}
</n-button>
</n-alert>
<n-alert v-if="dbVersionData.need_migration" type="warning" :show-icon="false" :bordered="false">
<span>{{ t('need_migration_tip') }}</span>
<n-button @click="migration" type="primary" secondary block :loading="loading">
{{ t('migration') }}
</n-button>
</n-alert>
<n-alert type="info" :show-icon="false" :bordered="false">
<span>
{{ t('current_db_version') }}: {{ dbVersionData.current_db_version || "unknown" }},
{{ t('code_db_version') }}: {{ dbVersionData.code_db_version }}
</span>
</n-alert>
</n-card>
</div>
</template>
<style scoped>
.n-card {
max-width: 800px;
}
.n-alert {
margin-bottom: 10px;
}
.center {
display: flex;
text-align: center;
place-items: center;
justify-content: center;
}
.n-button {
margin-top: 10px;
}
</style>