feat(admin): 添加后台显示设置功能
- 新增后台显示设置页面,允许自定义布局标题 - 在布局组件中动态显示自定义标题 - 在后端添加对应的 API 端点用于获取和保存显示配置 - 移除无用的 Demo.vue 组件文件
This commit is contained in:
@@ -49,6 +49,11 @@ const COMMENT_ADMIN_KEY_HASH_KEY = 'comment_admin_key_hash';
|
||||
const COMMENT_REQUIRE_REVIEW_KEY = 'comment_require_review';
|
||||
const COMMENT_BLOCKED_IPS_KEY = 'comment_blocked_ips';
|
||||
const COMMENT_BLOCKED_EMAILS_KEY = 'comment_blocked_emails';
|
||||
const ADMIN_DISPLAY_CONFIG_KEY = 'admin_display_config';
|
||||
|
||||
type AdminDisplaySettings = {
|
||||
layoutTitle: string;
|
||||
};
|
||||
|
||||
async function loadCommentSettings(env: Bindings) {
|
||||
await env.CWD_DB.prepare('CREATE TABLE IF NOT EXISTS Settings (key TEXT PRIMARY KEY, value TEXT NOT NULL)').run();
|
||||
@@ -119,6 +124,43 @@ async function loadCommentSettings(env: Bindings) {
|
||||
};
|
||||
}
|
||||
|
||||
async function loadAdminDisplaySettings(env: Bindings): Promise<AdminDisplaySettings> {
|
||||
await env.CWD_DB.prepare('CREATE TABLE IF NOT EXISTS Settings (key TEXT PRIMARY KEY, value TEXT NOT NULL)').run();
|
||||
const row = await env.CWD_DB.prepare('SELECT value FROM Settings WHERE key = ?')
|
||||
.bind(ADMIN_DISPLAY_CONFIG_KEY)
|
||||
.first<{ value: string }>();
|
||||
|
||||
const defaults: AdminDisplaySettings = {
|
||||
layoutTitle: 'CWD 评论系统',
|
||||
};
|
||||
|
||||
if (!row || !row.value) {
|
||||
return defaults;
|
||||
}
|
||||
|
||||
try {
|
||||
const parsed = JSON.parse(row.value) as Partial<AdminDisplaySettings>;
|
||||
const result: AdminDisplaySettings = {
|
||||
layoutTitle: typeof parsed.layoutTitle === 'string' && parsed.layoutTitle ? parsed.layoutTitle : defaults.layoutTitle,
|
||||
};
|
||||
return result;
|
||||
} catch {
|
||||
return defaults;
|
||||
}
|
||||
}
|
||||
|
||||
async function saveAdminDisplaySettings(env: Bindings, settings: Partial<AdminDisplaySettings>) {
|
||||
await env.CWD_DB.prepare('CREATE TABLE IF NOT EXISTS Settings (key TEXT PRIMARY KEY, value TEXT NOT NULL)').run();
|
||||
|
||||
const current = await loadAdminDisplaySettings(env);
|
||||
const next: AdminDisplaySettings = {
|
||||
layoutTitle: settings.layoutTitle !== undefined ? settings.layoutTitle : current.layoutTitle,
|
||||
};
|
||||
|
||||
const value = JSON.stringify(next);
|
||||
await env.CWD_DB.prepare('REPLACE INTO Settings (key, value) VALUES (?, ?)').bind(ADMIN_DISPLAY_CONFIG_KEY, value).run();
|
||||
}
|
||||
|
||||
async function saveCommentSettings(
|
||||
env: Bindings,
|
||||
settings: {
|
||||
@@ -291,6 +333,30 @@ app.put('/admin/settings/telegram', updateTelegramSettings);
|
||||
app.post('/admin/settings/telegram/setup', setupTelegramWebhook);
|
||||
app.post('/admin/settings/telegram/test', testTelegramMessage);
|
||||
|
||||
app.get('/admin/settings/admin-display', async (c) => {
|
||||
try {
|
||||
const settings = await loadAdminDisplaySettings(c.env);
|
||||
return c.json(settings);
|
||||
} catch (e: any) {
|
||||
return c.json({ message: e.message || '加载显示配置失败' }, 500);
|
||||
}
|
||||
});
|
||||
|
||||
app.put('/admin/settings/admin-display', async (c) => {
|
||||
try {
|
||||
const body = await c.req.json();
|
||||
const layoutTitle = typeof body.layoutTitle === 'string' ? body.layoutTitle : undefined;
|
||||
|
||||
await saveAdminDisplaySettings(c.env, {
|
||||
layoutTitle,
|
||||
});
|
||||
|
||||
return c.json({ message: '保存成功' });
|
||||
} catch (e: any) {
|
||||
return c.json({ message: e.message || '保存失败' }, 500);
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/admin/settings/comments', async (c) => {
|
||||
try {
|
||||
const settings = await loadCommentSettings(c.env);
|
||||
|
||||
Reference in New Issue
Block a user