Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

99 řádky
4.5 KiB

  1. <template>
  2. <div>
  3. <!-- Hero -->
  4. <section class="border-b border-[var(--c-e8eef7)] bg-gradient-to-br from-[var(--c-ffffff)] via-[var(--c-f3f0ff)] to-[var(--c-eef6ff)]">
  5. <div class="mx-auto max-w-7xl px-4 py-10 sm:px-6 lg:px-8 lg:py-14">
  6. <nav aria-label="面包屑" class="flex items-center gap-1.5 text-xs text-[var(--c-8a97a8)]">
  7. <NuxtLink to="/" class="hover:text-[var(--c-0b8cff)]">首页</NuxtLink>
  8. <span>/</span>
  9. <span class="text-[var(--c-4b5b70)]">AI 图片</span>
  10. </nav>
  11. <h1 class="mt-4 text-3xl font-extrabold text-[var(--c-172033)] sm:text-4xl">AI 图片大全</h1>
  12. <p class="mt-3 max-w-2xl text-sm leading-relaxed text-[var(--c-66758a)] sm:text-base">
  13. 精选 AI 在线用户生成的作品,包含 AI 绘画、AI 动漫头像等,点击查看提示词与大图。
  14. </p>
  15. <div class="mt-6 flex flex-wrap gap-3">
  16. <NuxtLink
  17. to="/draw/anime/"
  18. class="inline-flex h-10 items-center gap-1.5 rounded-full bg-gradient-to-r from-[var(--c-0b8cff)] to-[var(--c-3aa9ff)] px-5 text-sm font-bold text-white shadow-[0_10px_22px_var(--sh-11-140-255-240)] transition-opacity hover:opacity-90"
  19. >
  20. <UIcon name="i-lucide-zap" class="size-4" />
  21. 我也要生成
  22. </NuxtLink>
  23. <NuxtLink
  24. to="/info"
  25. class="inline-flex h-10 items-center rounded-full bg-[var(--c-ffffff)] px-5 text-sm font-bold text-[var(--c-5b6b80)] shadow-sm transition-colors hover:text-[var(--c-0b8cff)]"
  26. >
  27. 看 AI 资讯
  28. </NuxtLink>
  29. </div>
  30. </div>
  31. </section>
  32. <!-- 瀑布流图片 -->
  33. <div class="mx-auto max-w-7xl px-4 py-8 sm:px-6 lg:px-8 lg:py-12">
  34. <div v-if="pending" class="columns-2 gap-4 sm:columns-3 lg:columns-4">
  35. <div v-for="i in 12" :key="i" class="mb-4 h-56 animate-pulse rounded-2xl bg-[var(--c-ffffff)]" />
  36. </div>
  37. <div v-else-if="list.length" class="columns-2 gap-4 sm:columns-3 lg:columns-4">
  38. <NuxtLink
  39. v-for="item in list"
  40. :key="`${item.chat_open_id}_${item.img_index}`"
  41. :to="picUrl(item)"
  42. class="group mb-4 block break-inside-avoid overflow-hidden rounded-2xl bg-[var(--c-ffffff)] shadow-[0_8px_24px_var(--sh-34-68-112-60)] transition-shadow hover:shadow-[0_14px_34px_var(--sh-34-68-112-140)]"
  43. >
  44. <div class="relative overflow-hidden bg-[var(--c-eef3f8)]">
  45. <img
  46. :src="item.img"
  47. :alt="item.prompts || 'AI 生成图片'"
  48. class="w-full transition-transform duration-500 group-hover:scale-105"
  49. loading="lazy"
  50. >
  51. </div>
  52. <div v-if="item.prompts" class="p-3">
  53. <p class="line-clamp-2 text-xs leading-relaxed text-[var(--c-66758a)]">{{ item.prompts }}</p>
  54. </div>
  55. </NuxtLink>
  56. </div>
  57. <!-- 空态 -->
  58. <div v-else class="rounded-2xl bg-[var(--c-ffffff)] py-20 text-center shadow-[0_8px_28px_var(--sh-34-68-112-50)]">
  59. <UIcon name="i-lucide-image-off" class="mx-auto mb-4 size-12 text-[var(--c-a0aabb)]" />
  60. <div class="text-base font-extrabold text-[var(--c-172033)]">暂无公开作品</div>
  61. <div class="mt-2 text-sm text-[var(--c-8a95a6)]">成为第一个分享 AI 作品的人</div>
  62. <NuxtLink
  63. to="/draw/anime/"
  64. class="mt-5 inline-flex h-10 items-center rounded-full bg-[var(--c-0b8cff)] px-6 text-sm font-extrabold text-white transition-colors hover:bg-[var(--c-0a7ce0)]"
  65. >
  66. 去创作
  67. </NuxtLink>
  68. </div>
  69. </div>
  70. </div>
  71. </template>
  72. <script setup>
  73. const { post } = useApi()
  74. /** 详情 URL 与原站一致:/pic/{chat_open_id}_{img_index}.html */
  75. function picUrl(item) {
  76. return `/pic/${item.chat_open_id}_${item.img_index || 0}.html`
  77. }
  78. await useLegacyAppSeo({
  79. appKey: 'pic',
  80. fallbackTitle: 'AI动漫头像图片-AI作画生成动漫头像图片大全',
  81. fallbackDescription: 'AI图片通常指的是利用人工智能技术生成或编辑的图片。这种技术可以应用于多个领域,根据用户的需求或偏好,AI可以生成个性化的图片,例如定制的动漫头像、表情包等。',
  82. fallbackKeywords: '动漫头像,AI图片,头像图片,AI动漫,AI头像',
  83. canonicalPath: '/pic/',
  84. })
  85. const { data, pending } = await useAsyncData('pic-list', () =>
  86. post('/art/getlist', { page_no: 1, page_size: 30 }).catch(() => ({ list: [] })))
  87. const list = computed(() => (data.value?.list || []).filter(i => i.img))
  88. </script>