slug 兼容性优化,支持用任意前缀访问文章不限于article

This commit is contained in:
tangly1024.com
2024-05-08 15:13:12 +08:00
parent f803b7ad06
commit de0908ea94
7 changed files with 209 additions and 151 deletions

View File

@@ -2,9 +2,9 @@ import BLOG from '@/blog.config'
import { siteConfig } from '@/lib/config'
import { getGlobalData, getPost, getPostBlocks } from '@/lib/db/getSiteData'
import { uploadDataToAlgolia } from '@/lib/plugins/algolia'
import { checkContainHttp } from '@/lib/utils'
import { checkSlugHasMorThanTwoSlash, getRecommendPost } from '@/lib/utils/post'
import { idToUuid } from 'notion-utils'
import Slug, { getRecommendPost } from '..'
import Slug from '..'
/**
* 根据notion的slug访问页面
@@ -33,7 +33,7 @@ export async function getStaticPaths() {
return {
paths: allPages
?.filter(row => checkSlug(row))
?.filter(row => checkSlugHasMorThanTwoSlash(row))
.map(row => ({
params: {
prefix: row.slug.split('/')[0],
@@ -54,20 +54,15 @@ export async function getStaticProps({
params: { prefix, slug, suffix },
locale
}) {
let fullSlug = prefix + '/' + slug + '/' + suffix.join('/')
const fullSlug = prefix + '/' + slug + '/' + suffix.join('/')
const from = `slug-props-${fullSlug}`
const props = await getGlobalData({ from, locale })
if (siteConfig('PSEUDO_STATIC', BLOG.PSEUDO_STATIC, props.NOTION_CONFIG)) {
if (!fullSlug.endsWith('.html')) {
fullSlug += '.html'
}
}
// 在列表内查找文章
props.post = props?.allPages?.find(p => {
return (
p.type.indexOf('Menu') < 0 &&
(p.slug === fullSlug || p.id === idToUuid(fullSlug))
(p.slug === slug || p.slug === fullSlug || p.id === idToUuid(fullSlug))
)
})
@@ -132,16 +127,4 @@ export async function getStaticProps({
}
}
function checkSlug(row) {
let slug = row.slug
if (slug.startsWith('/')) {
slug = slug.substring(1)
}
return (
(slug.match(/\//g) || []).length >= 2 &&
row.type.indexOf('Menu') < 0 &&
!checkContainHttp(slug)
)
}
export default PrefixSlug

View File

@@ -2,9 +2,13 @@ import BLOG from '@/blog.config'
import { siteConfig } from '@/lib/config'
import { getGlobalData, getPost, getPostBlocks } from '@/lib/db/getSiteData'
import { uploadDataToAlgolia } from '@/lib/plugins/algolia'
import { checkContainHttp } from '@/lib/utils'
import {
checkSlugHasNoSlash,
checkSlugHasOneSlash,
getRecommendPost
} from '@/lib/utils/post'
import { idToUuid } from 'notion-utils'
import Slug, { getRecommendPost } from '..'
import Slug from '..'
/**
* 根据notion的slug访问页面
@@ -26,12 +30,26 @@ export async function getStaticPaths() {
const from = 'slug-paths'
const { allPages } = await getGlobalData({ from })
// 根据slug中的 / 分割成prefix和slug两个字段 ; 例如 article/test
// 最终用户可以通过 [domain]/[prefix]/[slug] 路径访问,即这里的 [domain]/article/test
const paths = allPages
?.filter(row => checkSlug(row))
?.filter(row => checkSlugHasOneSlash(row))
.map(row => ({
params: { prefix: row.slug.split('/')[0], slug: row.slug.split('/')[1] }
}))
// 增加一种访问路径 允许通过 [category]/[slug] 访问文章
// 例如文章slug 是 test 然后文章的分类category是 production
// 则除了 [domain]/[slug] 以外,还支持分类名访问: [domain]/[category]/[slug]
console.log(
allPages
?.filter(row => checkSlugHasNoSlash(row) && row.category)
.map(row => ({
params: { prefix: row.category, slug: row.slug }
}))
)
return {
paths: paths,
fallback: true
@@ -39,20 +57,15 @@ export async function getStaticPaths() {
}
export async function getStaticProps({ params: { prefix, slug }, locale }) {
let fullSlug = prefix + '/' + slug
const fullSlug = prefix + '/' + slug
const from = `slug-props-${fullSlug}`
const props = await getGlobalData({ from, locale })
if (siteConfig('PSEUDO_STATIC', BLOG.PSEUDO_STATIC, props.NOTION_CONFIG)) {
if (!fullSlug.endsWith('.html')) {
fullSlug += '.html'
}
}
// 在列表内查找文章
props.post = props?.allPages?.find(p => {
return (
p.type.indexOf('Menu') < 0 &&
(p.slug === fullSlug || p.id === idToUuid(fullSlug))
(p.slug === slug || p.slug === fullSlug || p.id === idToUuid(fullSlug))
)
})
@@ -116,15 +129,5 @@ export async function getStaticProps({ params: { prefix, slug }, locale }) {
)
}
}
function checkSlug(row) {
let slug = row.slug
if (slug.startsWith('/')) {
slug = slug.substring(1)
}
return (
(slug.match(/\//g) || []).length === 1 &&
!checkContainHttp(slug) &&
row.type.indexOf('Menu') < 0
)
}
export default PrefixSlug

View File

@@ -3,7 +3,7 @@ import { siteConfig } from '@/lib/config'
import { getGlobalData, getPost, getPostBlocks } from '@/lib/db/getSiteData'
import { getPageTableOfContents } from '@/lib/notion/getPageTableOfContents'
import { uploadDataToAlgolia } from '@/lib/plugins/algolia'
import { checkContainHttp } from '@/lib/utils'
import { checkSlugHasNoSlash, getRecommendPost } from '@/lib/utils/post'
import { getLayoutByTheme } from '@/themes/theme'
import md5 from 'js-md5'
import { useRouter } from 'next/router'
@@ -71,7 +71,7 @@ export async function getStaticPaths() {
const from = 'slug-paths'
const { allPages } = await getGlobalData({ from })
const paths = allPages
?.filter(row => checkSlug(row))
?.filter(row => checkSlugHasNoSlash(row))
.map(row => ({ params: { prefix: row.slug } }))
return {
paths: paths,
@@ -158,51 +158,4 @@ export async function getStaticProps({ params: { prefix }, locale }) {
}
}
/**
* 获取文章的关联推荐文章列表,目前根据标签关联性筛选
* @param post
* @param {*} allPosts
* @param {*} count
* @returns
*/
export function getRecommendPost(post, allPosts, count = 6) {
let recommendPosts = []
const postIds = []
const currentTags = post?.tags || []
for (let i = 0; i < allPosts.length; i++) {
const p = allPosts[i]
if (p.id === post.id || p.type.indexOf('Post') < 0) {
continue
}
for (let j = 0; j < currentTags.length; j++) {
const t = currentTags[j]
if (postIds.indexOf(p.id) > -1) {
continue
}
if (p.tags && p.tags.indexOf(t) > -1) {
recommendPosts.push(p)
postIds.push(p.id)
}
}
}
if (recommendPosts.length > count) {
recommendPosts = recommendPosts.slice(0, count)
}
return recommendPosts
}
function checkSlug(row) {
let slug = row.slug
if (slug.startsWith('/')) {
slug = slug.substring(1)
}
return (
(slug.match(/\//g) || []).length === 0 &&
!checkContainHttp(slug) &&
row.type.indexOf('Menu') < 0
)
}
export default Slug