diff --git a/src/routes/admin/tags/+page.server.ts b/src/routes/admin/tags/+page.server.ts index 741247b..ce94c24 100644 --- a/src/routes/admin/tags/+page.server.ts +++ b/src/routes/admin/tags/+page.server.ts @@ -76,5 +76,29 @@ export const actions: Actions = { console.error('Error deleting tag:', err); return { success: false, error: '删除标签失败' }; } + }, + + update: async ({ request, platform }) => { + const db = platform?.env?.DB; + if (!db) return fail(500, { error: '数据库未连接' }); + + const formData = await request.formData(); + const id = formData.get('id'); + const name = formData.get('name')?.toString().trim(); + + if (!id || !name) { + return fail(400, { error: '标签 ID 和名称为必填项' }); + } + + try { + await db.prepare('UPDATE tags SET name = ? WHERE id = ?').bind(name, id).run(); + return { success: true }; + } catch (err: unknown) { + console.error('Error updating tag:', err); + if ((err as any)?.message?.includes('UNIQUE constraint failed')) { + return fail(400, { error: '标签名称已存在' }); + } + return fail(500, { error: '更新标签失败' }); + } } }; diff --git a/src/routes/admin/tags/+page.svelte b/src/routes/admin/tags/+page.svelte index 3cbb218..fcc9a69 100644 --- a/src/routes/admin/tags/+page.svelte +++ b/src/routes/admin/tags/+page.svelte @@ -6,6 +6,7 @@ let { data, form }: { data: PageData; form: ActionData } = $props(); let newTagName = $state(''); + let editingId = $state(null);
@@ -58,33 +59,69 @@ {#each data.tags as tag (tag.id || tag)} {tag.id} - {tag.name} + + {#if editingId === tag.id} + + {:else} + {tag.name} + {/if} + {tag.post_count} 篇文章 -
{ - if ((e.target as HTMLFormElement).dataset.confirmed === 'true') { - (e.target as HTMLFormElement).removeAttribute('data-confirmed'); - return; - } - e.preventDefault(); - const form = e.target as HTMLFormElement; - const submitter = e.submitter; - const confirmed = await confirmState.show( - `确定要删除${$page.data.aliases?.tag || '标签'} "${tag.name}" 吗?` - ); - if (confirmed) { - form.dataset.confirmed = 'true'; - form.requestSubmit(submitter); - } - }} - > - - -
+ {#if editingId === tag.id} +
{ + setTimeout(() => { + editingId = null; + }, 0); + }} + > + + +
+ + {:else} + +
{ + if ((e.target as HTMLFormElement).dataset.confirmed === 'true') { + (e.target as HTMLFormElement).removeAttribute('data-confirmed'); + return; + } + e.preventDefault(); + const form = e.target as HTMLFormElement; + const submitter = e.submitter; + const confirmed = await confirmState.show( + `确定要删除${$page.data.aliases?.tag || '标签'} "${tag.name}" 吗?` + ); + if (confirmed) { + form.dataset.confirmed = 'true'; + form.requestSubmit(submitter); + } + }} + > + + +
+ {/if} {/each} @@ -275,4 +312,21 @@ text-align: center; color: var(--text-muted, rgba(0, 0, 0, 0.6)); } + + .edit-input { + width: 100%; + padding: 6px 8px; + border: 1px solid rgba(0, 0, 0, 0.2); + background: transparent; + font-family: inherit; + font-size: 0.95rem; + color: var(--text-color); + box-sizing: border-box; + border-radius: 4px; + } + + .edit-input:focus { + outline: none; + border-color: var(--accent-color, #419b38); + }