[{"data":1,"prerenderedAt":721},["ShallowReactive",2],{"\u002F2026\u002F04\u002Fnuxthotpage":3,"index_posts":204,"surround-\u002F2026\u002F04\u002Fnuxthotpage":716},{"id":4,"title":5,"body":6,"categories":179,"date":181,"description":182,"draft":183,"extension":184,"image":185,"meta":186,"navigation":188,"path":189,"permalink":185,"published":185,"readingTime":190,"recommend":185,"references":185,"seo":195,"sitemap":196,"stem":197,"subtitle":185,"tags":198,"type":201,"updated":202,"__hash__":203},"content\u002Fposts\u002F2026\u002F04\u002FnuxtHotPage.md","用Codex写一个热搜页面",{"type":7,"value":8,"toc":168},"minimark",[9,13,36,39,87,90,95,122,125],[10,11,12],"h2",{"id":12},"前言",[14,15,16,17,24,25,30,31,35],"p",{},"最近这段时间，我一直寻找一个新的功能而不需云服务器来进行托管的，而在",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fblog.liushen.fun",[22],"nofollow","柳神","的博客中翻看时有这么一篇",[18,26,29],{"href":27,"rel":28},"https:\u002F\u002Fblog.liushen.fun\u002Fposts\u002F891edc78\u002F",[22],"文章","。里面正好有一类没尝试过的东西，并且还是用json数据类型的，在查看仓库并且通过",[32,33,34],"code",{"code":34},"codex","来为Nuxt适配，也就有这样一篇文章。",[10,37,38],{"id":38},"核心代码列表",[40,41,42,53,59,65,71,81],"ul",{},[43,44,45,48,49,52],"li",{},[32,46,47],{"code":47},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotPageMain.vue","：主体框架，将其他的",[32,50,51],{"code":51},"vue","模块进行链接减少整体难维护",[43,54,55,58],{},[32,56,57],{"code":57},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotPageHeader.vue","：卡片顶部栏，作为展示热搜来源、热搜类型、热搜总数、热搜更新时间四类数据",[43,60,61,64],{},[32,62,63],{"code":63},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotPageLoading.vue","：整体加载文件，在切换的时候加载",[43,66,67,70],{},[32,68,69],{"code":69},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotPagePagination.vue","：底部导航条，作为无损切换不同页面展示且无需重新加载",[43,72,73,76,77,80],{},[32,74,75],{"code":75},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotCardList.vue","：卡片列表，作为链接",[32,78,79],{"code":79},"hotCardShow.vue","的工具",[43,82,83,86],{},[32,84,85],{"code":85},"\u002Fapp\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotCardShow.vue","：展示出热搜",[10,88,89],{"id":89},"核心代码",[91,92,94],"h3",{"id":93},"主页面主模块","主页面&主模块",[96,97,99,113],"tab",{":tabs":98},"[\"主页面\", \"主模块\"]",[100,101,103],"template",{"v-slot:tab1":102},"",[104,105,111],"pre",{"className":106,"code":108,"filename":109,"language":51,"meta":110},[107],"language-vue","\u003Cscript setup lang=\"ts\">\nimport HotPageCardItem from '~\u002Fcomponents\u002Fyjluo\u002Fhot\u002FhotPageMain.vue';\n\nconst hotTab = ['哔哩哔哩', '微博', '抖音', '知乎', '36氪', '百度']\nconst layoutStore = useLayoutStore()\n\u002F\u002F 设置侧边栏组件\nlayoutStore.setAside(['blog-stats', 'blog-tech', 'blog-log'])\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"HotPageMain\">\n    \u003Ctab :tabs=\"hotTab\">\n      \u003Ctemplate v-slot:tab1>\n        \u003CHotPageCardItem -cache='true' -name-type='哔哩哔哩' -mini-name-type='bilibili' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n      \u003Ctemplate v-slot:tab2>\n        \u003CHotPageCardItem -cache='true' -name-type='微博' -mini-name-type='weibo' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n      \u003Ctemplate v-slot:tab3>\n        \u003CHotPageCardItem -cache='true' -name-type='抖音' -mini-name-type='douyin' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n      \u003Ctemplate v-slot:tab4>\n        \u003CHotPageCardItem -cache='true' -name-type='知乎' -mini-name-type='zhihu' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n      \u003Ctemplate v-slot:tab5>\n        \u003CHotPageCardItem -cache='true' -name-type='36氪' -mini-name-type='36kr' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n      \u003Ctemplate v-slot:tab6>\n        \u003CHotPageCardItem -cache='true' -name-type='百度' -mini-name-type='baidu' -categrory-type='热搜' \u002F>\n      \u003C\u002Ftemplate>\n    \u003C\u002Ftab>    \n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n.HotPageMain {\n  padding: 1rem;\n}\n\u003C\u002Fstyle>\n","hot.vue","lang=\"vue\"",[32,112,108],{"__ignoreMap":102},[100,114,115],{"v-slot:tab2":102},[104,116,120],{"className":117,"code":118,"filename":119,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\nimport type { ApiResponse } from '~\u002Ftypes\u002Fhot'\nimport HotPageHeader from '.\u002Fheader\u002FhotPageHeader.vue';\nimport HotPageLoading from '.\u002Fbody\u002FhotPageLoading.vue';\nimport HotCardList from '.\u002Fbody\u002FhotCardList.vue';\nimport HotPagePagination from '.\u002Fbody\u002FhotPagePagination.vue';\n\nconst appConfig = useAppConfig()\n\nconst props = defineProps\u003C{\n  Cache: 'true' | 'false'\n  NameType: '哔哩哔哩' | '微博' | '抖音' | '知乎' | '36氪' | '百度'\n  MiniNameType: 'bilibili' | 'weibo' | 'douyin' | 'zhihu' | '36kr' | 'baidu'\n  CategroryType: '热搜'\n}>()\n\nconst requestHeaders = {}\n\nconst requestUrl = computed(() =>\n  `${appConfig.hotGetConfig.Api}\u002F${props.MiniNameType}`\n)\n\nconst fetchKey = computed(() => `hot-${props.MiniNameType}-${props.Cache}`)\n\nconst {\n  data: responseData,\n  pending,\n  error,\n  refresh,\n} = useFetch\u003CApiResponse>(requestUrl, {\n  query: { cache: props.Cache },\n  headers: requestHeaders,\n  key: fetchKey,\n  default: () => ({ total: 0, updateTime: '', data: [] }),\n  server: false,\n  lazy: false,\n  watch: [requestUrl, () => props.Cache],\n})\n\nconst hotList = computed(() => {\n  const list = responseData.value?.data\n  return Array.isArray(list) ? list : []\n})\n\nconst hotTotal = computed(() => {\n  return typeof responseData.value?.total === 'number'\n    ? responseData.value.total\n    : hotList.value.length\n})\n\nconst updateTime = computed(() => responseData.value?.updateTime ?? '')\n\n\u002F\u002F 分页状态\nconst currentPage = ref(1)\nconst itemsPerPage = ref(20)\n\nconst totalPages = computed(() =>\n  Math.max(1, Math.ceil(hotList.value.length \u002F itemsPerPage.value))\n)\n\nconst paginatedList = computed(() => {\n  const start = (currentPage.value - 1) * itemsPerPage.value\n  const end = start + itemsPerPage.value\n  return hotList.value.slice(start, end)\n})\n\nfunction goToPage(page: number) {\n  if (page >= 1 && page \u003C= totalPages.value) {\n    currentPage.value = page\n  }\n}\n\nfunction nextPage() {\n  if (currentPage.value \u003C totalPages.value) {\n    currentPage.value++\n  }\n}\n\nfunction prevPage() {\n  if (currentPage.value > 1) {\n    currentPage.value--\n  }\n}\n\n\u002F\u002F 当平台或缓存参数变化时，重置页码\nwatch(\n  () => [props.MiniNameType, props.Cache],\n  () => {\n    currentPage.value = 1\n  }\n)\n\n\u002F\u002F 当数据变化时，修正页码\nwatch(hotList, () => {\n  if (currentPage.value > totalPages.value) {\n    currentPage.value = totalPages.value || 1\n  }\n})\n\n\u002F\u002F 状态消息\nconst statusMessage = computed(() => {\n  if (pending.value) return '加载中...'\n  if (error.value) {\n    return error.value instanceof Error\n      ? error.value.message\n      : '加载失败'\n  }\n  if (!hotList.value.length) return '暂无数据'\n  return ''\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"cardMain\">\n    \u003CHotPageHeader\n      :mini-name-type=\"MiniNameType\"\n      :name-type=\"NameType\"\n      :categrory-type=\"CategroryType\"\n      :hot-total=\"hotTotal\"\n      :update-time=\"updateTime\"\n    \u002F>\n\n    \u003Cdiv class=\"cardBody\">\n      \u003CHotPageLoading\n        v-if=\"pending || error || !hotList.length\"\n        :pending=\"pending\"\n        :error=\"error\"\n        :is-empty=\"!pending && !error && !hotList.length\"\n        :message=\"statusMessage\"\n        @retry=\"refresh\"\n      \u002F>\n\n      \u003Cdiv v-else class=\"contentArea\">\n        \u003CHotCardList\n          :items=\"paginatedList\"\n          :current-page=\"currentPage\"\n          :items-per-page=\"itemsPerPage\"\n        \u002F>\n\n        \u003CHotPagePagination\n          v-if=\"totalPages > 1\"\n          :current-page=\"currentPage\"\n          :total-pages=\"totalPages\"\n          @go=\"goToPage\"\n          @prev=\"prevPage\"\n          @next=\"nextPage\"\n        \u002F>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$border-light: #eee;\n$shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.05);\n$bg-white: #fff;\n$spacing-lg: 16px;\n$radius-xl: 12px;\n\n.cardMain {\n  border: 1px solid $border-light;\n  border-radius: $radius-xl;\n  padding: $spacing-lg;\n  background: $bg-white;\n  box-shadow: $shadow-sm;\n}\n\n.cardBody {\n  min-height: 120px;\n\n  .contentArea {\n    display: flex;\n    flex-direction: column;\n  }\n}\n\u003C\u002Fstyle>\n","hotPageMain.vue",[32,121,118],{"__ignoreMap":102},[91,123,124],{"id":124},"分模块",[96,126,128,136,144,152,160],{":tabs":127},"[\"hotPageHeader.vue\", \"hotPageLoading.vue\", \"hotPagePagination.vue\", \"hotCardList.vue\", \"hotCardShow.vue\"]",[100,129,130],{"v-slot:tab1":102},[104,131,134],{"className":132,"code":133,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\nconst props = defineProps\u003C{\n  miniNameType: 'bilibili' | 'weibo' | 'douyin' | 'zhihu' | '36kr' | 'baidu'\n  nameType: '哔哩哔哩' | '微博' | '抖音' | '知乎' | '36氪' | '百度'\n  categroryType: '热搜'\n  hotTotal: number\n  updateTime: string\n}>()\n\nconst nowTimestamp = ref(Date.now())\nlet timer: ReturnType\u003Ctypeof setInterval> | null = null\n\nonMounted(() => {\n  timer = setInterval(() => {\n    nowTimestamp.value = Date.now()\n  }, 60 * 1000)\n})\n\nonBeforeUnmount(() => {\n  if (timer) {\n    clearInterval(timer)\n    timer = null\n  }\n})\n\nconst relativeUpdateText = computed(() => {\n  if (!props.updateTime) return '暂无更新时间'\n\n  const updated = new Date(props.updateTime).getTime()\n  if (Number.isNaN(updated)) return '暂无更新时间'\n\n  const diff = nowTimestamp.value - updated\n  if (diff \u003C= 0) return '刚刚更新'\n\n  const totalMinutes = Math.floor(diff \u002F 1000 \u002F 60)\n  const days = Math.floor(totalMinutes \u002F (60 * 24))\n  const hours = Math.floor((totalMinutes % (60 * 24)) \u002F 60)\n  const minutes = totalMinutes % 60\n\n  if (days > 0) return `${days}天前更新`\n  if (hours === 0 && minutes === 0) return '刚刚更新'\n  if (hours \u003C= 0 && minutes > 0) return `${minutes}分钟前更新`\n  if (hours > 0 && minutes === 0) return `${hours}小时前更新}`\n\n  return `${hours}小时${minutes}分钟前更新`\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"cardMainHeader\">\n    \u003Cdiv class=\"mainHeaderIcon\">\n      \u003CNuxtImg\n        :src=\"`\u002Fimage\u002FPageImageAssets\u002Fhot\u002F${miniNameType}.avif`\"\n        :alt=\"nameType\"\n        width=\"32\"\n        height=\"32\"\n      \u002F>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"mainHeaderName\">\n      \u003Cspan>{{ nameType }}\u003C\u002Fspan>\n      \u003Csmall class=\"category\">{{ categroryType }}\u003C\u002Fsmall>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"mainHeaderData\">\n      \u003Cdiv class=\"headerData\">\n        共 {{ hotTotal }} 条 · {{ relativeUpdateText }}\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$text-tertiary: #999;\n$border-lighter: #f5f5f5;\n$spacing-md: 12px;\n$spacing-lg: 16px;\n\n.cardMainHeader {\n  display: flex;\n  align-items: center;\n  gap: $spacing-md;\n  margin-bottom: $spacing-lg;\n  padding-bottom: $spacing-md;\n  border-bottom: 1px solid $border-lighter;\n\n  .mainHeaderName {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n\n    .category {\n      color: $text-tertiary;\n      font-size: 12px;\n    }\n  }\n\n  .mainHeaderData {\n    display: flex;\n    align-items: flex-end;\n    font-size: 12px;\n\n    .headerData {\n      font-weight: bold;\n      position: relative;\n    }\n  }\n}\n\u003C\u002Fstyle>\n",[32,135,133],{"__ignoreMap":102},[100,137,138],{"v-slot:tab2":102},[104,139,142],{"className":140,"code":141,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\ndefineProps\u003C{\n  pending: boolean\n  error: unknown\n  isEmpty: boolean\n  message: string\n}>()\n\nconst emit = defineEmits\u003C{\n  (e: 'retry'): void\n}>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv\n    class=\"status\"\n    :class=\"{\n      loading: pending,\n      error: !!error,\n      empty: isEmpty\n    }\"\n  >\n    \u003Cspan>{{ message }}\u003C\u002Fspan>\n    \u003Cbutton\n      v-if=\"error\"\n      class=\"retryBtn\"\n      @click=\"emit('retry')\"\n    >\n      重试\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$primary-color: #409eff;\n$text-secondary: #666;\n$bg-white: #fff;\n$spacing-sm: 8px;\n$spacing-md: 12px;\n$spacing-xl: 20px;\n$radius-md: 6px;\n\n.status {\n  text-align: center;\n  color: $text-secondary;\n  padding: $spacing-xl 0;\n\n  &.error {\n    color: #e74c3c;\n  }\n\n  .retryBtn {\n    display: inline-block;\n    margin-top: $spacing-sm;\n    margin-left: $spacing-md;\n    padding: 4px $spacing-md;\n    border: none;\n    border-radius: $radius-md;\n    background: $primary-color;\n    color: $bg-white;\n    cursor: pointer;\n  }\n}\n\u003C\u002Fstyle>\n",[32,143,141],{"__ignoreMap":102},[100,145,146],{"v-slot:tab3":102},[104,147,150],{"className":148,"code":149,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\ndefineProps\u003C{\n  currentPage: number\n  totalPages: number\n}>()\n\nconst emit = defineEmits\u003C{\n  (e: 'go', page: number): void\n  (e: 'prev'): void\n  (e: 'next'): void\n}>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"pagination\">\n    \u003Cbutton\n      class=\"pageBtn\"\n      :disabled=\"currentPage === 1\"\n      @click=\"emit('prev')\"\n    >\n      上一页\n    \u003C\u002Fbutton>\n\n    \u003Cdiv class=\"pageNumbers\">\n      \u003Cbutton\n        v-for=\"page in totalPages\"\n        :key=\"page\"\n        class=\"pageNumber\"\n        :class=\"{ active: page === currentPage }\"\n        @click=\"emit('go', page)\"\n      >\n        {{ page }}\n      \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n\n    \u003Cbutton\n      class=\"pageBtn\"\n      :disabled=\"currentPage === totalPages\"\n      @click=\"emit('next')\"\n    >\n      下一页\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$primary-color: #409eff;\n$border-light: #eee;\n$border-lighter: #f5f5f5;\n$bg-white: #fff;\n$spacing-xs: 4px;\n$spacing-sm: 8px;\n$spacing-md: 12px;\n$spacing-lg: 16px;\n$radius-sm: 4px;\n\n.pagination {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: $spacing-sm;\n  margin-top: $spacing-lg;\n  padding-top: $spacing-lg;\n  border-top: 1px solid $border-lighter;\n\n  .pageBtn {\n    padding: $spacing-xs $spacing-md;\n    border: 1px solid $border-light;\n    border-radius: $radius-sm;\n    background: $bg-white;\n    cursor: pointer;\n    transition: all 0.2s;\n\n    &:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n\n    &:not(:disabled):hover {\n      background: $border-lighter;\n    }\n  }\n\n  .pageNumbers {\n    display: flex;\n    gap: $spacing-xs;\n\n    .pageNumber {\n      width: 32px;\n      height: 32px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      border: 1px solid $border-light;\n      border-radius: $radius-sm;\n      background: $bg-white;\n      cursor: pointer;\n      transition: all 0.2s;\n\n      &:hover {\n        background: $border-lighter;\n      }\n\n      &.active {\n        background: $primary-color;\n        color: $bg-white;\n        border-color: $primary-color;\n      }\n    }\n  }\n}\n\u003C\u002Fstyle>\n",[32,151,149],{"__ignoreMap":102},[100,153,154],{"v-slot:tab4":102},[104,155,158],{"className":156,"code":157,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\nimport type { HotItem } from '~\u002Ftypes\u002Fhot'\nimport HotCardShow from '.\u002FhotCardShow.vue';\n\ndefineProps\u003C{\n  items: HotItem[]\n  currentPage: number\n  itemsPerPage: number\n}>()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"hotList\">\n    \u003CHotCardShow\n      v-for=\"(item, index) in items\"\n      :key=\"item.id || index\"\n      :item=\"item\"\n      :rank=\"(currentPage - 1) * itemsPerPage + index + 1\"\n    \u002F>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$spacing-md: 12px;\n\n.hotList {\n  display: flex;\n  flex-direction: column;\n  gap: $spacing-md;\n}\n\u003C\u002Fstyle>\n",[32,159,157],{"__ignoreMap":102},[100,161,162],{"v-slot:tab5":102},[104,163,166],{"className":164,"code":165,"language":51,"meta":110},[107],"\u003Cscript setup lang=\"ts\">\nimport type { HotItem } from '~\u002Ftypes\u002Fhot'\n\nconst props = defineProps\u003C{\n  item: HotItem\n  rank: number\n}>()\n\nconst itemLink = computed(() => {\n  const url = props.item.url || props.item.mobileUrl || ''\n  return typeof url === 'string' ? url.trim() : ''\n})\n\nconst hasValidLink = computed(() => !!itemLink.value)\n\nconst rankClass = computed(() => ({\n  top1: props.rank === 1,\n  top2: props.rank === 2,\n  top3: props.rank === 3,\n}))\n\nconst descText = computed(() => {\n  return props.item.desc?.trim() || '暂无描述'\n})\n\nconst authorText = computed(() => {\n  return props.item.author?.trim() || ''\n})\n\nconst hotText = computed(() => {\n  return props.item.hot ? String(props.item.hot) : ''\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv class=\"hotItem\">\n    \u003Ccomponent\n      :is=\"hasValidLink ? 'a' : 'div'\"\n      class=\"hotItemLink\"\n      :href=\"hasValidLink ? itemLink : undefined\"\n      :target=\"hasValidLink ? '_blank' : undefined\"\n      :rel=\"hasValidLink ? 'noopener noreferrer' : undefined\"\n    >\n      \u003Cdiv class=\"rank\" :class=\"rankClass\">\n        {{ rank }}\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"content\">\n        \u003Cdiv class=\"title\">{{ item.title }}\u003C\u002Fdiv>\n        \u003Cdiv class=\"desc\">{{ descText }}\u003C\u002Fdiv>\n\n        \u003Cdiv v-if=\"authorText || hotText\" class=\"meta\">\n          \u003Cspan v-if=\"authorText\">作者：{{ authorText }}\u003C\u002Fspan>\n          \u003Cspan v-if=\"hotText\">热度：{{ hotText }}\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fcomponent>\n  \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n\n\u003Cstyle lang=\"scss\" scoped>\n$text-primary: #222;\n$text-secondary: #666;\n$text-tertiary: #999;\n$border-lightest: #f2f2f2;\n$border-lighter: #f5f5f5;\n$spacing-xs: 4px;\n$spacing-md: 12px;\n$radius-md: 6px;\n\n.hotItem {\n  border-bottom: 1px solid $border-lightest;\n  padding-bottom: $spacing-md;\n\n  &:last-child {\n    border-bottom: none;\n  }\n\n  .hotItemLink {\n    display: flex;\n    gap: $spacing-md;\n    text-decoration: none;\n    color: inherit;\n\n    .rank {\n      width: 24px;\n      height: 24px;\n      min-width: 24px;\n      font-size: 12px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background-color: $border-lighter;\n      border-radius: $radius-md;\n      transition: all 0.3s;\n      color: #333;\n\n      &.top1 {\n        background-color: #ea444d;\n        color: #fff;\n      }\n\n      &.top2 {\n        background-color: #ed702d;\n        color: #fff;\n      }\n\n      &.top3 {\n        background-color: #eead3f;\n        color: #fff;\n      }\n    }\n\n    .content {\n      flex: 1;\n      min-width: 0;\n\n      .title {\n        font-size: 15px;\n        font-weight: 600;\n        color: $text-primary;\n        margin-bottom: $spacing-xs;\n        word-break: break-word;\n      }\n\n      .desc {\n        font-size: 13px;\n        color: $text-secondary;\n        margin-bottom: $spacing-xs;\n        word-break: break-word;\n      }\n\n      .meta {\n        display: flex;\n        flex-wrap: wrap;\n        gap: $spacing-md;\n        font-size: 12px;\n        color: $text-tertiary;\n      }\n    }\n  }\n}\n\u003C\u002Fstyle>\n",[32,167,165],{"__ignoreMap":102},{"title":102,"searchDepth":169,"depth":169,"links":170},4,[171,173,174],{"id":12,"depth":172,"text":12},2,{"id":38,"depth":172,"text":38},{"id":89,"depth":172,"text":89,"children":175},[176,178],{"id":93,"depth":177,"text":94},3,{"id":124,"depth":177,"text":124},[180],"技术探索","2026-04-13 14:00:00","该文章主要写了对于低价机器的试水，并提醒是超开类型的机器。在测试的过程中发现机器性能较高，且展示出机器的具体价格，并单独列出只有精简版未采用完整版测试。",false,"md",null,{"slots":187},{},true,"\u002F2026\u002F04\u002Fnuxthotpage",{"text":191,"minutes":192,"time":193,"words":194},"9 min read",8.985,539100,1797,{"title":5,"description":182},{"loc":189},"posts\u002F2026\u002F04\u002FnuxtHotPage",[199,200],"Nuxt","页面","tech","2026-04-13 22:00:00","LVVErxtRFJmxzoi8xU4SKnx-E0OlGIgTEmKvdphrKVw",[205,221,237,250,264,277,290,302,316,328,339,353,368,383,396,413,427,442,457,472,487,503,520,536,548,562,575,587,601,613,623,635,647,659,670,674,685,698,707],{"categories":206,"date":207,"description":208,"image":185,"path":209,"readingTime":210,"recommend":185,"tags":215,"title":219,"type":201,"updated":220},[180],"2023-12-06 12:45:00","本篇转载三种不同方案（已经放好原文章链接）","\u002F2023\u002F03\u002Fessaythree",{"text":211,"minutes":212,"time":213,"words":214},"48 min read",47.34,2840400,9468,[216,217,218],"hexo","butterfly","美化","即刻短文的三种部署方案","2023-12-07 14:09:00",{"categories":222,"date":224,"description":225,"image":226,"path":227,"readingTime":228,"recommend":233,"tags":234,"title":235,"type":201,"updated":236},[223],"站点魔改","2024-04-19 10:00:00","友链页面美化以及添加功能","\u002Fimage\u002FPostCover\u002FflinkPage.avif","\u002F2024\u002F04\u002Fflinkpagemeihua",{"text":229,"minutes":230,"time":231,"words":232},"11 min read",10.8,648000,2160,1,[216,217],"友链魔改","2025-04-19 12:09:00",{"categories":238,"date":239,"description":240,"image":241,"path":242,"readingTime":243,"recommend":233,"tags":247,"title":248,"type":201,"updated":249},[223],"2025-02-05 09:00:00","这篇文章讲述在博客中对导航栏进行修改，并添加多个产品页面地址，且采用安知鱼的导航栏CSS样式表。","\u002Fimage\u002FPostCover\u002FnavMuogai.avif","\u002F2025\u002F02\u002Fbutterflynavadd",{"text":191,"minutes":244,"time":245,"words":246},8.585,515100,1717,[216,217],"butterfly导航栏修改方案","2025-03-05 10:00:00",{"categories":251,"date":252,"description":253,"image":254,"path":255,"readingTime":256,"recommend":233,"tags":261,"title":262,"type":201,"updated":263},[223],"2025-02-27 10:10:55","本篇文章讲述了如何在博客的底部模块进行魔改添加图标、来源图片、返回顶部以及建站时间，对建站时间进行js内联到模块中。","\u002Fimage\u002FPostCover\u002FfooterMeihua.avif","\u002F2025\u002F02\u002Ffooterqcqxstyle",{"text":257,"minutes":258,"time":259,"words":260},"4 min read",3.31,198600,662,[216,217,218],"轻笑底部美化","2025-02-28 10:00:00",{"categories":265,"date":266,"description":267,"image":268,"path":269,"readingTime":270,"recommend":185,"tags":274,"title":275,"type":201,"updated":276},[223],"2025-03-24 08:00:09","这篇简述如何给自己博客中的归档、分类、标签页三个页面的文章卡片加上所属分类和标签，并说明了具体的实践环境，以最大限度的方式进行CSS美化。但也请注意要经常备份以免出现大量错误。","\u002Fimage\u002FPostCover\u002FarchiveMougai.avif","\u002F2025\u002F03\u002Farchivemougai",{"text":257,"minutes":271,"time":272,"words":273},3.08,184800,616,[216,217],"给页面加上所属分类和标签以及美化","2025-03-24 10:56:09",{"categories":278,"date":279,"description":280,"image":281,"path":282,"readingTime":283,"recommend":185,"tags":287,"title":288,"type":201,"updated":289},[223],"2025-03-05 08:00:00","这篇文章讲述如何给自己博客中的归档、分类、标签页三个页面的文章卡片添加数字来进行编排，以及对添加的数字进行CSS美化，但也请注意要经常备份以免出现错误。","https:\u002F\u002Fsourceimage.s3.bitiful.net\u002Fimg\u002Fdefault_cover_29.avif?v=20260104","\u002F2025\u002F03\u002Fartice-sort",{"text":257,"minutes":284,"time":285,"words":286},3.48,208800,696,[216,217],"美化文章卡片显示数字","2025-03-06 18:00:00",{"categories":291,"date":279,"description":292,"image":293,"path":294,"readingTime":295,"recommend":185,"tags":300,"title":301,"type":201,"updated":289},[223],"这篇文章讲述如何在页面中添加模块以及使用CSS添加颜色以及背景图片。","https:\u002F\u002Fsourceimage.s3.bitiful.net\u002Fimg\u002Fdefault_cover_21.avif","\u002F2025\u002F03\u002Fbackgroud-qcqx",{"text":296,"minutes":297,"time":298,"words":299},"1 min read",0.71,42600,142,[216,217],"轻笑风格背景",{"categories":303,"date":304,"description":305,"image":306,"path":307,"readingTime":308,"recommend":185,"tags":313,"title":314,"type":201,"updated":315},[223],"2025-03-24 09:00:00","本文章以安知鱼的页面文件为模版进行大幅度修改，仿轻笑的关于页面的模块摆放以及调整CSS样式来进行细致魔改。","\u002Fimage\u002FPostCover\u002FbtfAboutPage.avif","\u002F2025\u002F03\u002Fbtfaboutpage",{"text":309,"minutes":310,"time":311,"words":312},"24 min read",23.275,1396500,4655,[216,217],"关于页面(butterfly)","2025-03-25 11:20:00",{"categories":317,"date":279,"description":318,"image":319,"path":320,"readingTime":321,"recommend":185,"tags":326,"title":327,"type":201,"updated":289},[223],"这篇文章讲述了如何美化博客侧边栏，并调整各个卡片内容的样式表。","\u002Fimage\u002FPostCover\u002FcardMeihua.avif","\u002F2025\u002F03\u002Fcardmeihua",{"text":322,"minutes":323,"time":324,"words":325},"5 min read",4.77,286200,954,[216,217],"卡片美化",{"categories":329,"date":279,"description":330,"image":331,"path":332,"readingTime":333,"recommend":185,"tags":337,"title":338,"type":201,"updated":289},[223],"从零开始魔改butterfly","\u002Fimage\u002FPostCover\u002FfunctionMeihua.avif","\u002F2025\u002F03\u002Ffunctionmeihua",{"text":296,"minutes":334,"time":335,"words":336},0.345,20700,69,[216,217],"功能美化",{"categories":340,"date":341,"description":342,"image":343,"path":344,"readingTime":345,"recommend":185,"tags":350,"title":351,"type":201,"updated":352},[223],"2025-03-01 10:00:00","本文依照轻笑的部分内容，参考首页banner写法以及对首页banner添加鼠标滚动以及移动端滑动，通过CSS样式进行美化整个首页banner，此篇文章重点讲述了如何解决轻笑给的js内容在首页会出现不断加载的问题。","\u002Fimage\u002FPostCover\u002FrandomPost.avif","\u002F2025\u002F03\u002Frandompost",{"text":346,"minutes":347,"time":348,"words":349},"6 min read",5.595,335700,1119,[216,217,218],"Banner随机文章展示(轻笑同款)","2025-03-05 12:09:00",{"categories":354,"date":355,"description":356,"image":357,"path":358,"readingTime":359,"recommend":363,"tags":364,"title":366,"type":201,"updated":367},[223],"2025-08-11 10:00:00","本篇文章讲述了添加模块代码并在博客的友情链接中添加模块，且使用css美化","\u002Fimage\u002FPostCover\u002FlinkTop.avif","\u002F2025\u002F08\u002Flinktop",{"text":191,"minutes":360,"time":361,"words":362},8.88,532800,1776,11,[199,365,218],"魔改","在友链页面添加滚动头像banner","2025-08-11 20:49:00",{"categories":369,"date":370,"description":371,"image":372,"path":373,"readingTime":374,"recommend":379,"tags":380,"title":381,"type":201,"updated":382},[223],"2025-08-22 10:00:00","近期将博客迁移至Nuxt框架时，重新搭建了「关于页面」。过程中添加了技能展示组件（skillinfo.vue），实现标签分组渲染；新建about.vue页面，整合个人信息、技能、偏好等多模块内容，并通过ts定义数据接口（about.ts\u002Fcreativity.ts）。","\u002Fimage\u002FPostCover\u002FnuxtAboutPage.avif","\u002F2025\u002F08\u002Fnuxtaboutpage",{"text":375,"minutes":376,"time":377,"words":378},"16 min read",15.92,955200,3184,10,[199,365,218],"关于页面(Nuxt)","2025-09-01 20:49:00",{"categories":384,"date":385,"description":386,"image":387,"path":388,"readingTime":389,"recommend":393,"tags":394,"title":395,"type":201,"updated":382},[223],"2025-09-02 10:00:00","本篇文章主要简述了如何给Nuxt框架添加站点详情","https:\u002F\u002Fwww.yjluo.top\u002Fimage\u002FPostCover\u002FsiteInfo.avif","\u002F2025\u002F09\u002Fsitelinkpageadd",{"text":322,"minutes":390,"time":391,"words":392},4.38,262800,876,9,[199,365,218],"添加站点详情页面",{"categories":397,"date":399,"description":400,"image":401,"path":402,"readingTime":403,"recommend":185,"tags":407,"title":410,"type":411,"updated":412},[398],"日志记录","2025-12-28 10:00:00","该文章详细记录了2025年中的上下半年所做的事情，并且还透露出后续计划中会干什么。而在前言中也写到此文为水字数而出，上下半年均写到更换框架与服务有关于的内容。对于未来计划中提到了要对一些网站进行恢复、以及明年将在文章中加入与自创小说有关的内容","\u002Fimage\u002FPostCover\u002FannualSummary.avif","\u002F2025\u002F12\u002Fannualsummary",{"text":257,"minutes":404,"time":405,"words":406},3.855,231300,771,[408,409],"总结",2025,"年度总结：旧去新","story","2025-12-28 20:49:00",{"categories":414,"date":415,"description":416,"image":417,"path":418,"readingTime":419,"recommend":393,"tags":424,"title":425,"type":201,"updated":426},[223],"2025-12-01 10:00:00","该文章详细介绍了基于Vue3+TypeScript开发的豆瓣追更记录系统，采用组件化架构实现两栏筛选菜单、动态加载动画和卡片式作品展示，通过Pinia状态管理+Vite构建工具实现数据流管理，集成防抖加载、虚拟滚动等性能优化方案。","\u002Fimage\u002FPostCover\u002FbanguimPage.avif","\u002F2025\u002F12\u002Fbanguimpageadd",{"text":420,"minutes":421,"time":422,"words":423},"23 min read",22.175,1330500,4435,[199,365,218],"添加追更历史","2025-12-01 20:49:00",{"categories":428,"date":429,"description":430,"image":431,"path":432,"readingTime":433,"recommend":438,"tags":439,"title":440,"type":201,"updated":441},[223],"2025-12-23 10:00:00","该文章介绍Nuxt博客适配中评论模块的Vue组件实现与Artalk评论系统单例管理逻辑，并提供具体的适配评论表情包的Json信息，评论功能有着KaTeX数学公式渲染、图片灯箱、动态监听以及管理逻辑的初始化、计数、暗黑模式切换等方式。","\u002Fimage\u002FPostCover\u002FcommentMeihua.avif","\u002F2025\u002F12\u002Fcommentadd",{"text":434,"minutes":435,"time":436,"words":437},"32 min read",31.72,1903200,6344,8,[199,365,218],"评论优化","2026-03-01 20:49:00",{"categories":443,"date":444,"description":445,"image":446,"path":447,"readingTime":448,"recommend":453,"tags":454,"title":455,"type":201,"updated":456},[223],"2025-12-03 10:05:09","该博客持续维护Nuxt框架博客系统，新增装备页面实现硬件\u002F外设分类展示，支持动态过滤、标签筛选与规格参数渲染，通过TypeScript定义数据接口，结合Vue3响应式布局与SCSS响应式设计，完成设备卡片动态加载、悬停动效及跨端适配优化，集成评论跳转与购买信息展示功能。","\u002Fimage\u002FPostCover\u002FequipmentPage.avif","\u002F2025\u002F12\u002Fequipmentpageadd",{"text":449,"minutes":450,"time":451,"words":452},"8 min read",7.28,436800,1456,7,[199,365,218],"添加装备页面","2025-12-03 20:49:09",{"categories":458,"date":459,"description":460,"image":461,"path":462,"readingTime":463,"recommend":468,"tags":469,"title":470,"type":201,"updated":471},[223],"2025-12-09 10:00:00","该文章记录了项目版本迭代中的UI优化与功能调整，包括增加可后期换配置且内置移动到赞赏总览触发效果的打赏弹窗、优化头部封面移动端预览、增加版权图标虚化及打赏入口、将本地desc预览改ai摘要样式、增加版权卡片及更换头部信息样式。","\u002Fimage\u002FPostCover\u002FpostMeihua.avif","\u002F2025\u002F12\u002Fpostpagexiugai",{"text":464,"minutes":465,"time":466,"words":467},"12 min read",11.165,669900,2233,6,[199,365,218],"文章美化","2025-12-09 20:49:00",{"categories":473,"date":474,"description":475,"image":476,"path":477,"readingTime":478,"recommend":483,"tags":484,"title":485,"type":201,"updated":486},[223],"2025-12-04 10:00:00","该文章记录了项目版本迭代中的UI优化与功能调整，包括站点详情卡片组件化改造（采用Badge组件优化布局）、分类卡片新增文章数量统计功能（重新严重问题）、标签卡片新增文章标签统计功能、博主信息模块的拆分与重构，同时删除了冗余的左侧图片和完整博主卡片，最终形成模块化组件结构（涉及5个核心组件及数据调用逻辑调整）。","\u002Fimage\u002FPostCover\u002FsmallCard.avif","\u002F2025\u002F12\u002Fsmallcardadd",{"text":479,"minutes":480,"time":481,"words":482},"10 min read",9.745,584700,1949,5,[199,365,218],"侧边组件美化","2025-12-04 20:49:00",{"categories":488,"date":489,"description":490,"image":491,"path":492,"readingTime":493,"recommend":185,"tags":498,"title":501,"type":201,"updated":502},[223],"2026-01-27 10:00:00","自定义全局的样式颜色，具有对特定CSS中所具有的自定义样式颜色来进行整合，并且作者还顺便水了一篇文章","\u002Fimage\u002FPostCover\u002FcolorStyleAll.avif","\u002F2026\u002F01\u002Fcolorstyleall",{"text":494,"minutes":495,"time":496,"words":497},"14 min read",13.155,789300,2631,[499,500],"全局颜色","自定义","自定义全局颜色","2026-01-27 20:49:00",{"categories":504,"date":505,"description":506,"image":507,"path":508,"readingTime":509,"recommend":185,"tags":514,"title":518,"type":201,"updated":519},[180],"2026-01-11 10:00:00","这篇文章是一篇实战经验分享，主要讲解了如何利用腾讯云的EdgeOne边缘安全加速平台，为网站字体等静态资源搭建一个自定义的、高性能的镜像加速服务。","\u002Fimage\u002FPostCover\u002FjsdmEdge.avif","\u002F2026\u002F01\u002Fjsdmedge",{"text":510,"minutes":511,"time":512,"words":513},"3 min read",2.72,163200,544,[515,516,517],"镜像","EdgeOne","jsdmirror","使用EdgeOne CDN搭建自用Jsd镜像","2026-01-11 20:49:00",{"categories":521,"date":522,"description":523,"image":524,"path":525,"readingTime":526,"recommend":185,"tags":531,"title":534,"type":201,"updated":535},[180],"2026-01-28 19:00:00","本文是一篇关于 Komari Monitor（一款服务器监控系统）的详细介绍与实用指南。文章以作者个人经验为引，对比了哪吒监控（V0\u002FV1版本）与 Komari 在各方面的差异，并逐步演示了如何部署、配置和使用 Komari。","\u002Fimage\u002FPostCover\u002FkomariMonitor.avif","\u002F2026\u002F01\u002Fkomarimonitor",{"text":527,"minutes":528,"time":529,"words":530},"7 min read",6.86,411600,1372,[532,533],"探针","监控","komari：全新的探针站点","2026-01-29 13:00:00",{"categories":537,"date":538,"description":475,"image":539,"path":540,"readingTime":541,"recommend":169,"tags":545,"title":546,"type":201,"updated":547},[223],"2026-01-01 10:00:00","\u002Fimage\u002FPostCover\u002FNewYear.avif","\u002F2026\u002F01\u002Fnewyear",{"text":510,"minutes":542,"time":543,"words":544},2.15,129000,430,[199,365,218],"踏入2026：目标新方向","2026-01-01 20:49:00",{"categories":549,"date":550,"description":551,"image":552,"path":553,"readingTime":554,"recommend":185,"tags":559,"title":560,"type":411,"updated":561},[223],"2026-01-05 10:00:00","该文章记录了项目中对于字体、图片以及构建产物等静态资源的优化与处理，并且表示自身对于图片的存放位置进行优化。","\u002Fimage\u002FPostCover\u002FsiteAssets.avif","\u002F2026\u002F01\u002Fsiteassets",{"text":555,"minutes":556,"time":557,"words":558},"2 min read",1.82,109200,364,[199,365,218],"站点资源优化","2026-01-07 20:49:00",{"categories":563,"date":565,"description":182,"image":566,"path":567,"readingTime":568,"recommend":185,"tags":572,"title":573,"type":201,"updated":574},[564],"日常随笔","2026-01-12 10:00:00","\u002Fimage\u002FPostCover\u002FvpsTalk.avif","\u002F2026\u002F01\u002Fvpstalk",{"text":375,"minutes":569,"time":570,"words":571},15.545,932700,3109,[199,365,218],"随笔：低价主机试水","2026-01-12 20:49:00",{"categories":576,"date":577,"description":578,"image":566,"path":579,"readingTime":580,"recommend":185,"tags":584,"title":585,"type":201,"updated":586},[564],"2026-01-30 10:00:00","该文章主要写了对于大容量硬盘主机的试水。在测试的过程中发现机器性能较高，且展示出机器的具体价格，并单独列出只有精简版未采用完整版测试。","\u002F2026\u002F01\u002Fvpstalk-2",{"text":494,"minutes":581,"time":582,"words":583},13.965,837900,2793,[199,365,218],"随笔：大容量主机测试","2026-01-30 20:49:00",{"categories":588,"date":589,"description":590,"image":591,"path":592,"readingTime":593,"recommend":233,"tags":598,"title":599,"type":201,"updated":600},[223],"2026-02-20 10:00:00","该文章展示多个以鸣潮为主题的档案组件，包含具体代码、属性表格对应、预览整体组件、写法展示四种类型，并在文章末尾附加更新报告。","\u002Fimage\u002FPostCover\u002FWutheringWavesPostWidget.avif","\u002F2026\u002F02\u002Fwutheringwavespostwidget",{"text":594,"minutes":595,"time":596,"words":597},"100 min read",99.23,5953800,19846,[199,365,218],"【鸣潮】档案文章组件","2026-02-26 10:00:00",{"categories":602,"date":603,"description":182,"image":604,"path":605,"readingTime":606,"recommend":185,"tags":610,"title":611,"type":201,"updated":612},[180],"2026-02-03 10:00:00","\u002Fimage\u002FPostCover\u002FfnosInstall.avif","\u002F2026\u002F02\u002Ffnosinstall",{"text":191,"minutes":607,"time":608,"words":609},8.91,534600,1782,[199,365,218],"给老MAC升级为飞牛OS","2026-02-05 20:49:00",{"categories":614,"date":603,"description":182,"image":615,"path":616,"readingTime":617,"recommend":185,"tags":621,"title":622,"type":201,"updated":612},[223],"\u002Fimage\u002FPostCover\u002FmacBookPerformancTest.avif","\u002F2026\u002F02\u002Fmacbookperformanctest",{"text":510,"minutes":618,"time":619,"words":620},2.47,148200,494,[199,365,218],"【精简】测试老MAC性能",{"categories":624,"date":625,"description":182,"image":626,"path":627,"readingTime":628,"recommend":185,"tags":632,"title":633,"type":201,"updated":634},[223],"2026-02-04 10:00:00","\u002Fimage\u002FPostCover\u002FmusicInstall.avif","\u002F2026\u002F02\u002Fmusicinstall",{"text":191,"minutes":629,"time":630,"words":631},8.19,491400,1638,[199,365,218],"【本地+云端】搭建道理鱼音乐","2026-02-06 20:49:00",{"categories":636,"date":637,"description":182,"image":638,"path":639,"readingTime":640,"recommend":177,"tags":644,"title":645,"type":201,"updated":646},[223],"2026-03-03 10:00:00","\u002Fimage\u002FPostCover\u002FfooterNuxtMeihua.avif","\u002F2026\u002F03\u002Ffooternuxtmeihua",{"text":257,"minutes":641,"time":642,"words":643},3.235,194100,647,[199,365,218],"页脚魔改(Nuxt版本)","2026-03-06 10:00:00",{"categories":648,"date":649,"description":182,"image":638,"path":650,"readingTime":651,"recommend":172,"tags":656,"title":657,"type":201,"updated":658},[223],"2026-03-21 14:00:00","\u002F2026\u002F03\u002Fsteamgamepage",{"text":652,"minutes":653,"time":654,"words":655},"18 min read",17.265,1035900,3453,[199,200],"游戏展示页面","2026-03-22 10:00:00",{"categories":660,"date":661,"description":182,"image":638,"path":662,"readingTime":663,"recommend":233,"tags":667,"title":668,"type":201,"updated":669},[223],"2026-04-11 14:00:00","\u002F2026\u002F04\u002Fessaynuxtpage",{"text":346,"minutes":664,"time":665,"words":666},5.93,355800,1186,[199,200],"说说页面（Nuxt版本）","2026-04-11 22:00:00",{"categories":671,"date":181,"description":182,"image":185,"path":189,"readingTime":672,"recommend":185,"tags":673,"title":5,"type":201,"updated":202},[180],{"text":191,"minutes":192,"time":193,"words":194},[199,200],{"categories":675,"date":676,"description":182,"image":185,"path":677,"readingTime":678,"recommend":185,"tags":682,"title":683,"type":201,"updated":684},[223],"2026-04-21 14:00:00","\u002F2026\u002F04\u002Fnuxtserviceworker",{"text":464,"minutes":679,"time":680,"words":681},11.735,704100,2347,[199,200],"用元宝写一个ServiceWorker","2026-04-21 22:00:00",{"categories":686,"date":688,"description":400,"image":689,"path":690,"readingTime":691,"recommend":185,"tags":695,"title":696,"type":411,"updated":697},[687],"自设记录","2025-12-29 10:00:00","https:\u002F\u002Fsourceimage.s3.bitiful.net\u002Fpost\u002Fimg\u002FannualSummary\u002Fcover.webp","\u002Fnovel\u002Fworld\u002Fharmworld",{"text":555,"minutes":692,"time":693,"words":694},1.31,78600,262,[408,409],"世界志：鸿蒙界","2025-12-29 20:49:00",{"categories":699,"date":688,"description":400,"image":689,"path":700,"readingTime":701,"recommend":185,"tags":705,"title":706,"type":411,"updated":697},[687],"\u002Fnovel\u002Fworld\u002Flmmortalgod",{"text":527,"minutes":702,"time":703,"words":704},6.295,377700,1259,[408,409],"世界志：仙神界",{"categories":708,"date":688,"description":400,"image":689,"path":709,"readingTime":710,"recommend":185,"tags":714,"title":715,"type":411,"updated":697},[687],"\u002Fnovel\u002Fworld\u002Fdh",{"text":555,"minutes":711,"time":712,"words":713},1.65,99000,330,[408,409],"世界志：大荒",[717,719],{"title":668,"path":662,"stem":718,"date":661,"type":201,"children":-1},"posts\u002F2026\u002F04\u002FessayNuxtPage",{"title":683,"path":677,"stem":720,"date":676,"type":201,"children":-1},"posts\u002F2026\u002F04\u002FnuxtServiceWorker",1784195346194]