From b89177644fd0a90aba5fbd90a80fd14ed30ec095 Mon Sep 17 00:00:00 2001 From: tangly1024 Date: Tue, 1 Mar 2022 12:49:38 +0800 Subject: [PATCH] =?UTF-8?q?NEXT=E4=B8=BB=E9=A2=98=EF=BC=8C=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=A0=87=E7=AD=BE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blog.config.js | 3 +++ lib/notion/getAllCategories.js | 22 ++++++++++++++++++---- lib/notion/getAllTags.js | 23 ++++++++++++----------- lib/notion/getNotionData.js | 15 ++++++++++++--- pages/category/index.js | 2 +- themes/NEXT/LayoutCategoryIndex.js | 8 ++++---- themes/NEXT/LayoutTagIndex.js | 2 +- themes/NEXT/components/CategoryGroup.js | 9 +++++---- themes/NEXT/components/CategoryList.js | 8 ++++---- themes/NEXT/components/SideAreaRight.js | 23 +++++++++-------------- 10 files changed, 69 insertions(+), 46 deletions(-) diff --git a/blog.config.js b/blog.config.js index b1e5a876..15718929 100644 --- a/blog.config.js +++ b/blog.config.js @@ -25,6 +25,9 @@ const BLOG = { POSTS_PER_PAGE: 6, // post counts per page POSTS_SORT_BY: 'notion', // 排序方式 'date'按时间,'notion'由notion控制 + PREVIEW_CATEGORY_COUNT: 16, // 首页最多展示的分类数量,0为不限制 + PREVIEW_TAG_COUNT: 16, // 首页最多展示的标签数量,0为不限制 + // 社交链接,不需要可留空白,例如 CONTACT_WEIBO:'' CONTACT_EMAIL: 'tlyong1992@hotmail.com', CONTACT_WEIBO: '', diff --git a/lib/notion/getAllCategories.js b/lib/notion/getAllCategories.js index 8e94e8ba..61aab49c 100644 --- a/lib/notion/getAllCategories.js +++ b/lib/notion/getAllCategories.js @@ -3,11 +3,11 @@ * @param allPosts * @returns {Promise<{}|*[]>} */ -export async function getAllCategories (allPosts) { - if (!allPosts) { +export async function getAllCategories ({ allPosts, categoryOptions, sliceCount = 0 }) { + if (!allPosts || !categoryOptions) { return [] } - + // 计数 let categories = allPosts.map(p => p.category) categories = [...categories.flat()] const categoryObj = {} @@ -18,5 +18,19 @@ export async function getAllCategories (allPosts) { categoryObj[category] = 1 } }) - return categoryObj + const list = [] + categoryOptions.forEach(c => { + const count = categoryObj[c.value] + if (count) { + list.push({ id: c.id, name: c.value, color: c.color, count }) + } + }) + + // 按照数量排序 + // list.sort((a, b) => b.count - a.count) + if (sliceCount && sliceCount > 0) { + return list.slice(0, sliceCount) + } else { + return list + } } diff --git a/lib/notion/getAllTags.js b/lib/notion/getAllTags.js index f1a9681b..3ac01f54 100644 --- a/lib/notion/getAllTags.js +++ b/lib/notion/getAllTags.js @@ -6,15 +6,13 @@ * @param tagOptions tags的下拉选项 * @returns {Promise<{}|*[]>} */ -export async function getAllTags ({ allPosts, sliceCount = 16, tagOptions }) { - if (!allPosts) { +export async function getAllTags ({ allPosts, sliceCount = 0, tagOptions }) { + if (!allPosts || !tagOptions) { return [] } - + // 计数 let tags = allPosts.map(p => p.tags) tags = [...tags.flat()] - - // 标签计数 const tagObj = {} tags.forEach(tag => { if (tag in tagObj) { @@ -23,13 +21,16 @@ export async function getAllTags ({ allPosts, sliceCount = 16, tagOptions }) { tagObj[tag] = 1 } }) - - // 按照标签数量排序 - const list = Object.keys(tagObj).map((tag) => { - const color = tagOptions.find(option => option.value === tag)?.color || 'gray' - return { name: tag, count: tagObj[tag], color } + const list = [] + tagOptions.forEach(c => { + const count = tagObj[c.value] + if (count) { + list.push({ id: c.id, name: c.value, color: c.color, count }) + } }) - list.sort((a, b) => b.count - a.count) + + // 按照数量排序 + // list.sort((a, b) => b.count - a.count) if (sliceCount && sliceCount > 0) { return list.slice(0, sliceCount) } else { diff --git a/lib/notion/getNotionData.js b/lib/notion/getNotionData.js index 7b4aebbe..dd26937e 100644 --- a/lib/notion/getNotionData.js +++ b/lib/notion/getNotionData.js @@ -11,6 +11,7 @@ import { getAllTags } from './getAllTags' * @param {*} pageId * @param {*} from * @param latestPostCount 截取最新文章数量 + * @param categoryCount * @param tagsCount 截取标签数量 * @param pageType 过滤的文章类型,数组格式 ['Page','Post'] * @returns { @@ -27,15 +28,17 @@ export async function getGlobalNotionData ({ pageId = BLOG.NOTION_PAGE_ID, from, latestPostCount = 5, - tagsCount = 16, + categoryCount = BLOG.PREVIEW_CATEGORY_COUNT, + tagsCount = BLOG.PREVIEW_TAG_COUNT, pageType = ['Post'] }) { const notionPageData = await getNotionPageData({ pageId, from }) const tagOptions = notionPageData.tagOptions + const categoryOptions = notionPageData.categoryOptions const allPosts = await getAllPosts({ notionPageData, from, pageType }) const postCount = await getAllPostCount({ notionPageData, from }) const customNav = await getCustomNav({ notionPageData }) - const categories = await getAllCategories(allPosts) + const categories = await getAllCategories({ allPosts, categoryOptions, sliceCount: categoryCount }) const tags = await getAllTags({ allPosts, tagOptions, sliceCount: tagsCount }) const latestPosts = await getLatestPosts({ notionPageData, from, latestPostCount }) return { allPosts, latestPosts, categories, postCount, customNav, tags } @@ -110,6 +113,11 @@ function getTagOptions (schema) { return tagSchema?.options || {} } +function getCategoryOptions (schema) { + const categorySchema = Object.values(schema).find(e => e.name === 'category') + return categorySchema?.options || {} +} + /** * 调用NotionAPI获取Page数据 * @returns {Promise} @@ -119,7 +127,6 @@ async function getPageRecordMapByNotionAPI ({ pageId, from }) { if (!pageRecordMap) { return [] } - pageId = idToUuid(pageId) const collection = Object.values(pageRecordMap.collection)[0]?.value const collectionQuery = pageRecordMap.collection_query @@ -127,6 +134,7 @@ async function getPageRecordMapByNotionAPI ({ pageId, from }) { const schema = collection?.schema const rawMetadata = block[pageId].value const tagOptions = getTagOptions(schema) + const categoryOptions = getCategoryOptions(schema) // Check Type Page-Database和Inline-Database if ( @@ -143,6 +151,7 @@ async function getPageRecordMapByNotionAPI ({ pageId, from }) { block, schema, tagOptions, + categoryOptions, rawMetadata } } diff --git a/pages/category/index.js b/pages/category/index.js index f9739597..7361a706 100644 --- a/pages/category/index.js +++ b/pages/category/index.js @@ -8,7 +8,7 @@ export default function Category (props) { export async function getStaticProps () { const from = 'category-index-props' - const { allPosts, categories, tags, postCount, latestPosts, customNav } = await getGlobalNotionData({ from }) + const { allPosts, categories, tags, postCount, latestPosts, customNav } = await getGlobalNotionData({ from, categoryCount: 0 }) return { props: { diff --git a/themes/NEXT/LayoutCategoryIndex.js b/themes/NEXT/LayoutCategoryIndex.js index b4a5ef51..ac443a94 100644 --- a/themes/NEXT/LayoutCategoryIndex.js +++ b/themes/NEXT/LayoutCategoryIndex.js @@ -12,16 +12,16 @@ export const LayoutCategoryIndex = (props) => { type: 'website' } return -
+
{locale.COMMON.CATEGORY}:
- {Object.keys(categories).map(category => { - return + {categories.map(category => { + return
- {category}({categories[category]}) + {category.name}({category.count})
})} diff --git a/themes/NEXT/LayoutTagIndex.js b/themes/NEXT/LayoutTagIndex.js index 8ddd5bc4..b452874a 100644 --- a/themes/NEXT/LayoutTagIndex.js +++ b/themes/NEXT/LayoutTagIndex.js @@ -12,7 +12,7 @@ export const LayoutTagIndex = (props) => { type: 'website' } return -
+
{locale.COMMON.TAGS}:
{ tags.map(tag => { diff --git a/themes/NEXT/components/CategoryGroup.js b/themes/NEXT/components/CategoryGroup.js index a0c8eed0..1c22d04e 100644 --- a/themes/NEXT/components/CategoryGroup.js +++ b/themes/NEXT/components/CategoryGroup.js @@ -2,16 +2,17 @@ import Link from 'next/link' import React from 'react' const CategoryGroup = ({ currentCategory, categories }) => { + if (!categories) return <> return <>
- {Object.keys(categories).map(category => { - const selected = currentCategory === category - return + {categories.map(category => { + const selected = currentCategory === category.name + return - {category}({categories[category]}) + {category.name}({category.count}) })} diff --git a/themes/NEXT/components/CategoryList.js b/themes/NEXT/components/CategoryList.js index d7447424..5390a769 100644 --- a/themes/NEXT/components/CategoryList.js +++ b/themes/NEXT/components/CategoryList.js @@ -10,10 +10,10 @@ const CategoryList = ({ currentCategory, categories }) => { return
  • {locale.COMMON.CATEGORY}
  • - {Object.keys(categories).map(category => { - const selected = category === currentCategory + {categories.map(category => { + const selected = category.name === currentCategory return ( - +
  • { > - {`${category} `} + {`${category.name} (${category.count})`}
  • ) diff --git a/themes/NEXT/components/SideAreaRight.js b/themes/NEXT/components/SideAreaRight.js index daaa62c2..d7632936 100644 --- a/themes/NEXT/components/SideAreaRight.js +++ b/themes/NEXT/components/SideAreaRight.js @@ -5,6 +5,7 @@ import Card from './Card' import CategoryGroup from './CategoryGroup' import TagGroups from './TagGroups' import CONFIG_NEXT from '../config_next' +import { useRouter } from 'next/router' /** * 侧边平铺 @@ -16,18 +17,13 @@ import CONFIG_NEXT from '../config_next' * @returns {JSX.Element} * @constructor */ -const SideAreaRight = ({ - tags, - currentTag, - slot, - categories, - currentCategory -}) => { +const SideAreaRight = (props) => { + const { tags, currentTag, slot, categories, currentCategory } = props const { locale } = useGlobal() if (!CONFIG_NEXT.RIGHT_BAR) { return <> } - + const router = useRouter() return (