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 () => {