Files
blogflare/src/routes/admin/settings/+page.server.ts
T
2026-08-14 17:49:13 +08:00

130 lines
3.9 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-explicit-any */
import { fail } from '@sveltejs/kit';
import type { PageServerLoad, Actions } from './$types';
export const load: PageServerLoad = async ({ locals, platform }) => {
const db = platform?.env?.DB;
const settings: Record<string, string> = {};
if (db) {
try {
const { results } = await db.prepare('SELECT key, value FROM settings').all();
results.forEach((row: any) => {
settings[row.key] = row.value;
});
} catch (err: any) {
console.error('Failed to load settings', err);
}
}
return {
user: locals.user,
platformEnv: db ? 'Cloudflare D1 (Connected)' : 'Local Mock',
settings
};
};
export const actions: Actions = {
updateSiteInfo: async ({ request, platform }) => {
const db = platform?.env?.DB;
if (!db) return fail(500, { error: '数据库未连接' });
const data = await request.formData();
const updates = [
{ key: 'site.title', value: data.get('site_title')?.toString() || 'BlogFlare' },
{
key: 'site.description',
value:
data.get('site_description')?.toString() ||
'A high-performance blog powered by Cloudflare D1, R2, and KV.'
},
{
key: 'r2.public_domain',
value: data.get('r2_public_domain')?.toString() || 'https://assets.yourdomain.com'
},
{
key: 'site.launch_date',
value: data.get('site_launch_date')?.toString() || ''
}
];
try {
for (const { key, value } of updates) {
await db
.prepare(
`INSERT INTO settings (key, value, updated_at)
VALUES (?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
)
.bind(key, value)
.run();
}
return { success: true };
} catch (err: any) {
console.error('Failed to update site info', err);
return fail(500, { error: '保存站点信息失败' });
}
},
updateAliases: async ({ request, platform }) => {
const db = platform?.env?.DB;
if (!db) return fail(500, { error: '数据库未连接' });
const data = await request.formData();
const updates = [
{ key: 'alias.post', value: data.get('alias_post')?.toString() || '文章' },
{ key: 'alias.page', value: data.get('alias_page')?.toString() || '页面' },
{ key: 'alias.category', value: data.get('alias_category')?.toString() || '分类' },
{ key: 'alias.tag', value: data.get('alias_tag')?.toString() || '标签' },
{ key: 'alias.series', value: data.get('alias_series')?.toString() || '系列' }
];
try {
for (const { key, value } of updates) {
await db
.prepare(
`INSERT INTO settings (key, value, updated_at)
VALUES (?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
)
.bind(key, value)
.run();
}
return { success: true };
} catch (err: any) {
console.error('Failed to update aliases', err);
return fail(500, { error: '保存失败' });
}
},
updateAppearance: async ({ request, platform }) => {
const db = platform?.env?.DB;
if (!db) return fail(500, { error: '数据库未连接' });
const data = await request.formData();
const avatarEnabled = data.get('site_avatar_enabled')?.toString() === 'true' ? 'true' : 'false';
const avatarUrl = data.get('site_avatar_url')?.toString() || '';
const updates = [
{ key: 'site.avatar_enabled', value: avatarEnabled },
{ key: 'site.avatar_url', value: avatarUrl }
];
try {
for (const { key, value } of updates) {
await db
.prepare(
`INSERT INTO settings (key, value, updated_at)
VALUES (?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP`
)
.bind(key, value)
.run();
}
return { success: true };
} catch (err: any) {
console.error('Failed to update appearance', err);
return fail(500, { error: '保存外观偏好失败' });
}
}
};