diff --git a/src/routes/admin/settings/+page.server.ts b/src/routes/admin/settings/+page.server.ts index f4d4322..024935a 100644 --- a/src/routes/admin/settings/+page.server.ts +++ b/src/routes/admin/settings/+page.server.ts @@ -68,6 +68,28 @@ export const actions: Actions = { return fail(500, { error: '保存站点信息失败' }); } }, + updateApiToken: async ({ request, platform }) => { + const db = platform?.env?.DB; + if (!db) return fail(500, { error: '数据库未连接' }); + + const data = await request.formData(); + const token = data.get('agent_api_token')?.toString() || ''; + + try { + 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('agent.api_token', token) + .run(); + return { success: true }; + } catch (err: unknown) { + console.error('Failed to update api token', err); + return fail(500, { error: '保存 API Token 失败' }); + } + }, updateAliases: async ({ request, platform }) => { const db = platform?.env?.DB; if (!db) return fail(500, { error: '数据库未连接' }); diff --git a/src/routes/admin/settings/+page.svelte b/src/routes/admin/settings/+page.svelte index 5d2424e..74cb473 100644 --- a/src/routes/admin/settings/+page.svelte +++ b/src/routes/admin/settings/+page.svelte @@ -16,6 +16,17 @@ let avatarEnabled = $state(initialData.settings['site.avatar_enabled'] !== 'false'); let avatarUrl = $state(initialData.settings['site.avatar_url'] || ''); + let apiToken = $state(initialData.settings['agent.api_token'] || ''); + let showApiToken = $state(false); + + function generateApiToken() { + const randomPart = Array.from(crypto.getRandomValues(new Uint8Array(16))) + .map((b) => b.toString(16).padStart(2, '0')) + .join(''); + apiToken = 'bf_agent_' + randomPart; + showApiToken = true; + } + $effect(() => { if (form?.success) { addToast('设置保存成功!', 'success'); @@ -131,6 +142,49 @@ Cloudflare Access (Zero Trust) + +
+ 配置允许 AI 或第三方工具直接管理文章的 API 访问令牌 (Token)。请求 API 时请在 HTTP Header
+ 中添加 Authorization: Bearer <Token>。
+