From 608cc8991b1e80f24685e52d9ed616b728a1bf3b Mon Sep 17 00:00:00 2001 From: tangly1024 Date: Sun, 29 Oct 2023 11:21:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E7=BA=A7slug-bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/notion/getPageProperties.js | 2 + pages/[prefix]/[slug]/[...suffix].js | 113 ++++++++++++++++++ pages/[prefix]/{[slug].js => [slug]/index.js} | 3 +- pages/[prefix]/index.js | 1 + 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 pages/[prefix]/[slug]/[...suffix].js rename pages/[prefix]/{[slug].js => [slug]/index.js} (96%) diff --git a/lib/notion/getPageProperties.js b/lib/notion/getPageProperties.js index 8d3add33..ddf47f3e 100644 --- a/lib/notion/getPageProperties.js +++ b/lib/notion/getPageProperties.js @@ -135,6 +135,8 @@ function mapProperties(properties) { /** * 获取自定义URL + * 可以根据变量生成URL + * 支持:%year%/%month%/%day%/%slug% * @param {*} postProperties * @returns */ diff --git a/pages/[prefix]/[slug]/[...suffix].js b/pages/[prefix]/[slug]/[...suffix].js new file mode 100644 index 00000000..67f099d7 --- /dev/null +++ b/pages/[prefix]/[slug]/[...suffix].js @@ -0,0 +1,113 @@ +import BLOG from '@/blog.config' +import { getPostBlocks } from '@/lib/notion' +import { getGlobalData } from '@/lib/notion/getNotionData' +import { idToUuid } from 'notion-utils' +import { getNotion } from '@/lib/notion/getNotion' +import Slug, { getRecommendPost } from '..' +import { uploadDataToAlgolia } from '@/lib/algolia' + +/** + * 根据notion的slug访问页面 + * 解析三级以上目录 /article/2023/10/29/test + * @param {*} props + * @returns + */ +const PrefixSlug = props => { + return +} + +/** + * 编译渲染页面路径 + * @returns + */ +export async function getStaticPaths() { + if (!BLOG.isProd) { + return { + paths: [], + fallback: true + } + } + + const from = 'slug-paths' + const { allPages } = await getGlobalData({ from }) + return { + paths: allPages?.filter(row => hasMultipleSlashes(row.slug) && row.type.indexOf('Menu') < 0).map(row => ({ params: { prefix: row.slug.split('/')[0], slug: row.slug.split('/')[1], suffix: row.slug.split('/').slice(1) } })), + fallback: true + } +} + +/** + * 抓取页面数据 + * @param {*} param0 + * @returns + */ +export async function getStaticProps({ params: { prefix, slug, suffix } }) { + let fullSlug = prefix + '/' + slug + '/' + suffix.join('/') + if (JSON.parse(BLOG.PSEUDO_STATIC)) { + if (!fullSlug.endsWith('.html')) { + fullSlug += '.html' + } + } + const from = `slug-props-${fullSlug}` + const props = await getGlobalData({ from }) + // 在列表内查找文章 + props.post = props?.allPages?.find((p) => { + return p.slug === fullSlug || p.id === idToUuid(fullSlug) + }) + + // 处理非列表内文章的内信息 + if (!props?.post) { + const pageId = fullSlug.slice(-1)[0] + if (pageId.length >= 32) { + const post = await getNotion(pageId) + props.post = post + } + } + + // 无法获取文章 + if (!props?.post) { + props.post = null + return { props, revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) } + } + + // 文章内容加载 + if (!props?.posts?.blockMap) { + props.post.blockMap = await getPostBlocks(props.post.id, from) + } + // 生成全文索引 && JSON.parse(BLOG.ALGOLIA_RECREATE_DATA) + if (BLOG.ALGOLIA_APP_ID) { + uploadDataToAlgolia(props?.post) + } + + // 推荐关联文章处理 + const allPosts = props.allPages?.filter(page => page.type === 'Post' && page.status === 'Published') + if (allPosts && allPosts.length > 0) { + const index = allPosts.indexOf(props.post) + props.prev = allPosts.slice(index - 1, index)[0] ?? allPosts.slice(-1)[0] + props.next = allPosts.slice(index + 1, index + 2)[0] ?? allPosts[0] + props.recommendPosts = getRecommendPost(props.post, allPosts, BLOG.POST_RECOMMEND_COUNT) + } else { + props.prev = null + props.next = null + props.recommendPosts = [] + } + + delete props.allPages + return { + props, + revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) + } +} + +/** + * 判断是否包含两个以上的 / + * @param {*} str + * @returns + */ +function hasMultipleSlashes(str) { + const regex = /\/+/g; // 创建正则表达式,匹配所有的斜杠符号 + const matches = str.match(regex); // 在字符串中找到所有匹配的斜杠符号 + return matches && matches.length >= 2; // 判断匹配的斜杠符号数量是否大于等于2 +} + +export default PrefixSlug diff --git a/pages/[prefix]/[slug].js b/pages/[prefix]/[slug]/index.js similarity index 96% rename from pages/[prefix]/[slug].js rename to pages/[prefix]/[slug]/index.js index 2beae09c..4571b791 100644 --- a/pages/[prefix]/[slug].js +++ b/pages/[prefix]/[slug]/index.js @@ -3,11 +3,12 @@ import { getPostBlocks } from '@/lib/notion' import { getGlobalData } from '@/lib/notion/getNotionData' import { idToUuid } from 'notion-utils' import { getNotion } from '@/lib/notion/getNotion' -import Slug, { getRecommendPost } from '.' +import Slug, { getRecommendPost } from '..' import { uploadDataToAlgolia } from '@/lib/algolia' /** * 根据notion的slug访问页面 + * 解析二级目录 /article/about * @param {*} props * @returns */ diff --git a/pages/[prefix]/index.js b/pages/[prefix]/index.js index ecfea4e1..6fa5d47b 100644 --- a/pages/[prefix]/index.js +++ b/pages/[prefix]/index.js @@ -13,6 +13,7 @@ import { uploadDataToAlgolia } from '@/lib/algolia' /** * 根据notion的slug访问页面 + * 只解析一级目录例如 /about * @param {*} props * @returns */