From 9f7101eebfc0a644ba01401895822101940b340e Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 13 Aug 2025 11:49:06 +0800 Subject: [PATCH 01/18] Update wrangler.jsonc --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index defa90e54..e3ffabf5b 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -24,7 +24,7 @@ "kv_namespaces": [ { "binding": "KV", - "id": "ef93d42dc4b34969bab404d2e80f8dd3" // IMPORTANT: Change this to your KV namespace ID + "id": "2f63f85478544527ae1c3c1cec097d5d" // IMPORTANT: Change this to your KV namespace ID } ] } From 0eafba3c71341d8cba26e84dc7291b9058ec44f1 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 13 Aug 2025 12:00:10 +0800 Subject: [PATCH 02/18] Update wrangler.jsonc --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index e3ffabf5b..a1695a1c9 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -1,6 +1,6 @@ { "$schema": "node_modules/wrangler/config-schema.json", - "name": "sink", + "name": "shorturl", "main": "dist/server/index.mjs", "assets": { "binding": "ASSETS", From 46cc8d6a836d13bcd376ffc26b13bca598d1828b Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 13 Aug 2025 12:14:54 +0800 Subject: [PATCH 03/18] Update wrangler.jsonc --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index a1695a1c9..0f3a29f58 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -17,7 +17,7 @@ }, "analytics_engine_datasets": [ { - "binding": "ANALYTICS", + "binding": "sink", "dataset": "sink" } ], From 6fa416e22b3dbb3b18f0ec4d042c76229b253dca Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 13 Aug 2025 18:19:20 +0800 Subject: [PATCH 04/18] Update wrangler.jsonc --- wrangler.jsonc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wrangler.jsonc b/wrangler.jsonc index 0f3a29f58..38e355cc7 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -27,4 +27,10 @@ "id": "2f63f85478544527ae1c3c1cec097d5d" // IMPORTANT: Change this to your KV namespace ID } ] + "routes": [ + { + "pattern": "socialabc.ai", + "custom_domain": true + } + ] } From 2144816269b6b94c3eb58d03614cc35d3bb2b61f Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 13 Aug 2025 18:26:03 +0800 Subject: [PATCH 05/18] Update wrangler.jsonc --- wrangler.jsonc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 38e355cc7..0f3a29f58 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -27,10 +27,4 @@ "id": "2f63f85478544527ae1c3c1cec097d5d" // IMPORTANT: Change this to your KV namespace ID } ] - "routes": [ - { - "pattern": "socialabc.ai", - "custom_domain": true - } - ] } From 96059906dee1df790bab596a90dc06d770e7ab2e Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 15:24:08 +0800 Subject: [PATCH 06/18] Update wrangler.jsonc --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 0f3a29f58..00eff1bf9 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -6,7 +6,7 @@ "binding": "ASSETS", "directory": "dist/public" }, - "compatibility_date": "2025-05-08", + "compatibility_date": "2025-08-14", "compatibility_flags": [ "nodejs_compat" ], From 445601906393ee033f176839f346c32cc1164d4d Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 16:09:54 +0800 Subject: [PATCH 07/18] Update wrangler.jsonc --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 00eff1bf9..b94de5a6e 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -24,7 +24,7 @@ "kv_namespaces": [ { "binding": "KV", - "id": "2f63f85478544527ae1c3c1cec097d5d" // IMPORTANT: Change this to your KV namespace ID + "id": "2f63f85478544527ae1c3c1cec097d5d" } ] } From 36fce22533d1e0842da865936a728960ade05955 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 16:13:52 +0800 Subject: [PATCH 08/18] Update wrangler.jsonc add log --- wrangler.jsonc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index b94de5a6e..19a6903f3 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -26,5 +26,10 @@ "binding": "KV", "id": "2f63f85478544527ae1c3c1cec097d5d" } - ] + ], + "observability": { + "logs": { + "enabled": true + } + } } From 1924845e8e5ee77ba30d2f20be504ead9834979d Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 17:02:26 +0800 Subject: [PATCH 09/18] Update wrangler.jsonc -sink --- wrangler.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 19a6903f3..ef3695446 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -1,6 +1,6 @@ { "$schema": "node_modules/wrangler/config-schema.json", - "name": "shorturl", + "name": "sink", "main": "dist/server/index.mjs", "assets": { "binding": "ASSETS", From 13498656015275e863df07ba1e98cc26f4c447c8 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 17:03:49 +0800 Subject: [PATCH 10/18] Update wrangler.jsonc - update dataset --- wrangler.jsonc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index ef3695446..e21243e74 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -15,12 +15,10 @@ "ai": { "binding": "AI" }, - "analytics_engine_datasets": [ - { + "analytics_engine_datasets": { "binding": "sink", "dataset": "sink" - } - ], + }, "kv_namespaces": [ { "binding": "KV", From 4dd5ae0bbc0238f4e6fb0187bb852f811d9052ea Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 17:19:32 +0800 Subject: [PATCH 11/18] Update wrangler.jsonc= --- wrangler.jsonc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index e21243e74..ef3695446 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -15,10 +15,12 @@ "ai": { "binding": "AI" }, - "analytics_engine_datasets": { + "analytics_engine_datasets": [ + { "binding": "sink", "dataset": "sink" - }, + } + ], "kv_namespaces": [ { "binding": "KV", From 72d8b145ea9edee179f3b5f88874417fc1a2b19b Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 18:49:18 +0800 Subject: [PATCH 12/18] Update wrangler.jsonc delete dataset --- wrangler.jsonc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index ef3695446..8fea7e508 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -15,12 +15,6 @@ "ai": { "binding": "AI" }, - "analytics_engine_datasets": [ - { - "binding": "sink", - "dataset": "sink" - } - ], "kv_namespaces": [ { "binding": "KV", From 0c38d63d138130a80934c5f6b97cf5f9ae9d41c4 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 19:12:18 +0800 Subject: [PATCH 13/18] Update wrangler.jsonc - dataset --- wrangler.jsonc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 8fea7e508..5b18912b0 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -25,5 +25,15 @@ "logs": { "enabled": true } - } + }, + "analytics_engine_datasets": [ + { + "binding": "ANALYTICS", + "dataset": "sink" + }, + { + "binding": "NUXT_DATASET", + "dataset": "sink" + } + ] } From 416866a774ed01680703f0644bb71740f4d6ad6c Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 19:39:24 +0800 Subject: [PATCH 14/18] Update wrangler.jsonc sink dataset --- wrangler.jsonc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wrangler.jsonc b/wrangler.jsonc index 5b18912b0..1a56bc255 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -34,6 +34,10 @@ { "binding": "NUXT_DATASET", "dataset": "sink" + }, + { + "binding": "sink", + "dataset": "sink" } ] } From 6e6be259b45b5c3b32d8995d0b6c2265aa7da8da Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 14 Aug 2025 19:49:20 +0800 Subject: [PATCH 15/18] Update wrangler.jsonc --- wrangler.jsonc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 1a56bc255..1ec046a8b 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -30,14 +30,6 @@ { "binding": "ANALYTICS", "dataset": "sink" - }, - { - "binding": "NUXT_DATASET", - "dataset": "sink" - }, - { - "binding": "sink", - "dataset": "sink" } ] } From 0bccc07e9ace28682645a9081ac6c05621948f71 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 15 Aug 2025 18:37:49 +0800 Subject: [PATCH 16/18] Update wrangler.jsonc --- wrangler.jsonc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/wrangler.jsonc b/wrangler.jsonc index 1ec046a8b..a3fbb8d73 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -26,10 +26,4 @@ "enabled": true } }, - "analytics_engine_datasets": [ - { - "binding": "ANALYTICS", - "dataset": "sink" - } - ] } From 1d8152670f749387f5e9fb8296a838835d8b1f15 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 15 Aug 2025 19:22:15 +0800 Subject: [PATCH 17/18] Update wrangler.jsonc --- wrangler.jsonc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/wrangler.jsonc b/wrangler.jsonc index a3fbb8d73..d0d2c6e69 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -15,6 +15,12 @@ "ai": { "binding": "AI" }, + "analytics_engine_datasets": [ + { + "binding": "ANALYTICS", + "dataset": "sink" + } + ], "kv_namespaces": [ { "binding": "KV", From f33975f38c095e09a1b0c4e84b54c82115aaf907 Mon Sep 17 00:00:00 2001 From: phoenix Date: Mon, 18 Aug 2025 12:07:28 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E5=88=86=E6=94=AF=E7=9A=84=E6=89=80=E6=9C=89=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=92=8C=E6=96=B0=E5=A2=9E=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/dashboard/Logout.vue | 27 +- .../dashboard/analysis/Counters.vue | 13 +- app/components/dashboard/links/Editor.vue | 27 +- app/components/dashboard/links/Index.vue | 15 +- app/components/dashboard/realtime/Chart.vue | 9 +- app/components/login/index.vue | 43 +- app/components/register/index.vue | 115 + app/components/spark-ui/AnimatedList.vue | 2 +- app/components/spark-ui/Notification.vue | 2 +- app/components/ui/drawer/DrawerContent.vue | 2 +- .../ui/drawer/DrawerDescription.vue | 2 +- app/components/ui/drawer/DrawerFooter.vue | 2 +- app/components/ui/drawer/DrawerHeader.vue | 2 +- app/components/ui/drawer/DrawerOverlay.vue | 2 +- app/components/ui/drawer/DrawerTitle.vue | 2 +- app/middleware/auth.global.ts | 21 +- app/pages/dashboard/admin/links.vue | 150 + app/pages/dashboard/admin/users.vue | 127 + app/pages/dashboard/register.vue | 5 + app/utils/api.ts | 7 +- package-lock.json | 25422 ++++++++++++++++ pnpm-lock.yaml | 14789 --------- schemas/link.ts | 6 +- schemas/user.ts | 24 + server/api/admin/links.get.ts | 25 + server/api/admin/users.get.ts | 25 + server/api/auth/login.post.ts | 88 + server/api/auth/logout.post.ts | 23 + server/api/auth/register.post.ts | 83 + server/api/link/create.post.ts | 85 +- server/api/link/delete.post.ts | 29 + server/api/link/edit.put.ts | 19 +- server/api/link/me.get.ts | 77 + server/api/link/search.get.ts | 2 + server/api/link/upsert.post.ts | 27 +- server/api/logs/events.ts | 77 +- server/api/logs/locations.ts | 67 +- server/api/stats/counters.get.ts | 69 +- server/api/stats/metrics.get.ts | 68 +- server/api/stats/views.get.ts | 61 +- server/api/verify.ts | 48 +- server/middleware/1.redirect.ts | 4 +- server/middleware/2.auth.ts | 63 +- server/utils/auth.ts | 103 + 44 files changed, 26931 insertions(+), 14928 deletions(-) create mode 100644 app/components/register/index.vue create mode 100644 app/pages/dashboard/admin/links.vue create mode 100644 app/pages/dashboard/admin/users.vue create mode 100644 app/pages/dashboard/register.vue create mode 100644 package-lock.json delete mode 100644 pnpm-lock.yaml create mode 100644 schemas/user.ts create mode 100644 server/api/admin/links.get.ts create mode 100644 server/api/admin/users.get.ts create mode 100644 server/api/auth/login.post.ts create mode 100644 server/api/auth/logout.post.ts create mode 100644 server/api/auth/register.post.ts create mode 100644 server/api/link/me.get.ts create mode 100644 server/utils/auth.ts diff --git a/app/components/dashboard/Logout.vue b/app/components/dashboard/Logout.vue index cc4a1bb48..8e32715d8 100644 --- a/app/components/dashboard/Logout.vue +++ b/app/components/dashboard/Logout.vue @@ -1,9 +1,30 @@ diff --git a/app/components/dashboard/analysis/Counters.vue b/app/components/dashboard/analysis/Counters.vue index 60b2ace97..18828cd00 100644 --- a/app/components/dashboard/analysis/Counters.vue +++ b/app/components/dashboard/analysis/Counters.vue @@ -23,7 +23,12 @@ async function getLinkCounters() { ...filters.value, }, }) - counters.value = data?.[0] + // 确保即使API返回数据不完整,所有字段也有默认值0 + counters.value = { + visits: Number(data?.[0]?.visits) || 0, + visitors: Number(data?.[0]?.visitors) || 0, + referers: Number(data?.[0]?.referers) || 0, + } } watch([time, filters], getLinkCounters, { @@ -45,7 +50,7 @@ onMounted(async () => { - + @@ -56,7 +61,7 @@ onMounted(async () => { - + @@ -67,7 +72,7 @@ onMounted(async () => { - + diff --git a/app/components/dashboard/links/Editor.vue b/app/components/dashboard/links/Editor.vue index bd3785c73..17b4e16a6 100644 --- a/app/components/dashboard/links/Editor.vue +++ b/app/components/dashboard/links/Editor.vue @@ -22,21 +22,16 @@ const dialogOpen = ref(false) const isEdit = !!props.link.id -const EditLinkSchema = LinkSchema.pick({ - url: true, - slug: true, -}).extend({ - optional: LinkSchema.omit({ - id: true, - url: true, - slug: true, - createdAt: true, - updatedAt: true, - title: true, - description: true, - image: true, - }).extend({ +// 重新定义EditLinkSchema,确保不包含userId字段 +const EditLinkSchema = z.object({ + url: z.string().trim().url().max(2048), + slug: z.string().trim().max(2048).regex(new RegExp(useAppConfig().slugRegex)).default(nanoid()), + optional: z.object({ + comment: z.string().trim().max(2048).optional(), expiration: z.coerce.date().optional(), + title: z.string().trim().max(2048).optional(), + description: z.string().trim().max(2048).optional(), + image: z.string().trim().url().max(2048).optional(), }).optional(), }) @@ -85,9 +80,7 @@ async function aiSlug() { aiSlugPending.value = true try { const { slug } = await useAPI('/api/link/ai', { - query: { - url: form.values.url, - }, + query: { url: form.values.url }, }) form.setFieldValue('slug', slug) } diff --git a/app/components/dashboard/links/Index.vue b/app/components/dashboard/links/Index.vue index 849e9e495..f7b1efc6f 100644 --- a/app/components/dashboard/links/Index.vue +++ b/app/components/dashboard/links/Index.vue @@ -8,7 +8,7 @@ let cursor = '' let listComplete = false let listError = false -const sortBy = ref('az') +const sortBy = ref('newest') // 默认按最新排序 const displayedLinks = computed(() => { const sorted = [...links.value] @@ -28,15 +28,20 @@ const displayedLinks = computed(() => { async function getLinks() { try { - const data = await useAPI('/api/link/list', { + // 调用获取当前用户链接的API + const data = await useAPI('/api/link/me', { query: { limit, cursor, }, }) - links.value = links.value.concat(data.links).filter(Boolean) // Sometimes cloudflare will return null, filter out - cursor = data.cursor - listComplete = data.list_complete + + // 添加新链接到列表中 + links.value = links.value.concat(data.data || []).filter(Boolean) + + // 更新分页信息 + cursor = data.cursor || '' + listComplete = data.total <= links.value.length || !cursor listError = false } catch (error) { diff --git a/app/components/dashboard/realtime/Chart.vue b/app/components/dashboard/realtime/Chart.vue index ece50c39c..894f61193 100644 --- a/app/components/dashboard/realtime/Chart.vue +++ b/app/components/dashboard/realtime/Chart.vue @@ -17,7 +17,10 @@ async function getRealtimeStats() { }, }) - stats.value = data?.[0] || {} + // 确保visits字段有默认值0 + stats.value = { + visits: Number(data?.[0]?.visits) || 0 + } } watch([time, filters], getRealtimeStats, { @@ -32,7 +35,7 @@ onMounted(async () => {