diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 88626eb837..3047267caa 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -12,8 +12,8 @@ const DOMAIN_NAME = 'xugaoyi.com' // 域名 (不带https) const WEB_SITE = `https://${DOMAIN_NAME}` // 网址 export default defineConfig4CustomTheme({ - theme: 'vdoing', // 使用npm主题包 - // theme: resolve(__dirname, '../../vdoing'), // 使用本地主题包 + // theme: 'vdoing', // 使用npm主题包 + theme: resolve(__dirname, '../../vdoing'), // 使用本地主题包 locales: { '/': { @@ -114,6 +114,7 @@ export default defineConfig4CustomTheme({ { text: '分类', link: '/categories/' }, { text: '标签', link: '/tags/' }, { text: '归档', link: '/archives/' }, + { text: '统计', link: '/statistics/' }, ], }, ], diff --git a/docs/.vuepress/public/data/statistics.json b/docs/.vuepress/public/data/statistics.json new file mode 100644 index 0000000000..25f35e163f --- /dev/null +++ b/docs/.vuepress/public/data/statistics.json @@ -0,0 +1,457 @@ +{ + "dailyVisits": [ + { + "date": "2026-04-20", + "count": 1256 + }, + { + "date": "2026-04-19", + "count": 1892 + }, + { + "date": "2026-04-18", + "count": 2134 + }, + { + "date": "2026-04-17", + "count": 1567 + }, + { + "date": "2026-04-16", + "count": 2045 + }, + { + "date": "2026-04-15", + "count": 1789 + }, + { + "date": "2026-04-14", + "count": 2345 + }, + { + "date": "2026-04-13", + "count": 1987 + }, + { + "date": "2026-04-12", + "count": 1654 + }, + { + "date": "2026-04-11", + "count": 2234 + }, + { + "date": "2026-04-10", + "count": 1876 + }, + { + "date": "2026-04-09", + "count": 1543 + }, + { + "date": "2026-04-08", + "count": 2198 + }, + { + "date": "2026-04-07", + "count": 1765 + }, + { + "date": "2026-04-06", + "count": 2087 + }, + { + "date": "2026-04-05", + "count": 1432 + }, + { + "date": "2026-04-04", + "count": 1987 + }, + { + "date": "2026-04-03", + "count": 2321 + }, + { + "date": "2026-04-02", + "count": 1876 + }, + { + "date": "2026-04-01", + "count": 1543 + }, + { + "date": "2026-03-31", + "count": 2198 + }, + { + "date": "2026-03-30", + "count": 1765 + }, + { + "date": "2026-03-29", + "count": 2087 + }, + { + "date": "2026-03-28", + "count": 1432 + }, + { + "date": "2026-03-27", + "count": 1987 + }, + { + "date": "2026-03-26", + "count": 2321 + }, + { + "date": "2026-03-25", + "count": 1876 + }, + { + "date": "2026-03-24", + "count": 1543 + }, + { + "date": "2026-03-23", + "count": 2198 + }, + { + "date": "2026-03-22", + "count": 1765 + }, + { + "date": "2026-03-21", + "count": 2087 + }, + { + "date": "2026-03-20", + "count": 1432 + }, + { + "date": "2026-03-19", + "count": 1987 + }, + { + "date": "2026-03-18", + "count": 2321 + }, + { + "date": "2026-03-17", + "count": 1876 + }, + { + "date": "2026-03-16", + "count": 1543 + }, + { + "date": "2026-03-15", + "count": 2198 + }, + { + "date": "2026-03-14", + "count": 1765 + }, + { + "date": "2026-03-13", + "count": 2087 + }, + { + "date": "2026-03-12", + "count": 1432 + }, + { + "date": "2026-03-11", + "count": 1987 + }, + { + "date": "2026-03-10", + "count": 2321 + }, + { + "date": "2026-03-09", + "count": 1876 + }, + { + "date": "2026-03-08", + "count": 1543 + }, + { + "date": "2026-03-07", + "count": 2198 + }, + { + "date": "2026-03-06", + "count": 1765 + }, + { + "date": "2026-03-05", + "count": 2087 + }, + { + "date": "2026-03-04", + "count": 1432 + }, + { + "date": "2026-03-03", + "count": 1987 + }, + { + "date": "2026-03-02", + "count": 2321 + }, + { + "date": "2026-03-01", + "count": 1876 + }, + { + "date": "2026-02-28", + "count": 1543 + }, + { + "date": "2026-02-27", + "count": 2198 + }, + { + "date": "2026-02-26", + "count": 1765 + }, + { + "date": "2026-02-25", + "count": 2087 + }, + { + "date": "2026-02-24", + "count": 1432 + }, + { + "date": "2026-02-23", + "count": 1987 + }, + { + "date": "2026-02-22", + "count": 2321 + }, + { + "date": "2026-02-21", + "count": 1876 + }, + { + "date": "2026-02-20", + "count": 1543 + }, + { + "date": "2026-02-19", + "count": 2198 + }, + { + "date": "2026-02-18", + "count": 1765 + }, + { + "date": "2026-02-17", + "count": 2087 + }, + { + "date": "2026-02-16", + "count": 1432 + }, + { + "date": "2026-02-15", + "count": 1987 + }, + { + "date": "2026-02-14", + "count": 2321 + }, + { + "date": "2026-02-13", + "count": 1876 + }, + { + "date": "2026-02-12", + "count": 1543 + }, + { + "date": "2026-02-11", + "count": 2198 + }, + { + "date": "2026-02-10", + "count": 1765 + }, + { + "date": "2026-02-09", + "count": 2087 + }, + { + "date": "2026-02-08", + "count": 1432 + }, + { + "date": "2026-02-07", + "count": 1987 + }, + { + "date": "2026-02-06", + "count": 2321 + }, + { + "date": "2026-02-05", + "count": 1876 + }, + { + "date": "2026-02-04", + "count": 1543 + }, + { + "date": "2026-02-03", + "count": 2198 + }, + { + "date": "2026-02-02", + "count": 1765 + }, + { + "date": "2026-02-01", + "count": 2087 + }, + { + "date": "2026-01-31", + "count": 1432 + }, + { + "date": "2026-01-30", + "count": 1987 + }, + { + "date": "2026-01-29", + "count": 2321 + }, + { + "date": "2026-01-28", + "count": 1876 + }, + { + "date": "2026-01-27", + "count": 1543 + }, + { + "date": "2026-01-26", + "count": 2198 + }, + { + "date": "2026-01-25", + "count": 1765 + }, + { + "date": "2026-01-24", + "count": 2087 + }, + { + "date": "2026-01-23", + "count": 1432 + }, + { + "date": "2026-01-22", + "count": 1987 + }, + { + "date": "2026-01-21", + "count": 2321 + }, + { + "date": "2026-01-20", + "count": 1876 + }, + { + "date": "2026-01-19", + "count": 1543 + }, + { + "date": "2026-01-18", + "count": 2198 + }, + { + "date": "2026-01-17", + "count": 1765 + }, + { + "date": "2026-01-16", + "count": 2087 + }, + { + "date": "2026-01-15", + "count": 1432 + }, + { + "date": "2026-01-14", + "count": 1987 + }, + { + "date": "2026-01-13", + "count": 2321 + }, + { + "date": "2026-01-12", + "count": 1876 + }, + { + "date": "2026-01-11", + "count": 1543 + }, + { + "date": "2026-01-10", + "count": 2198 + }, + { + "date": "2026-01-09", + "count": 1765 + }, + { + "date": "2026-01-08", + "count": 2087 + }, + { + "date": "2026-01-07", + "count": 1432 + } + ], + "popularArticles": [ + { + "title": "33个非常实用的JavaScript一行代码", + "path": "/pages/8143cc480faf9a11/", + "views": 56890 + }, + { + "title": "《ES6 教程》笔记", + "path": "/note/es6/", + "views": 45230 + }, + { + "title": "CSS3之transition过渡", + "path": "/pages/0a83b083bdf257cb/", + "views": 38760 + }, + { + "title": "《Vue》笔记", + "path": "/note/vue/", + "views": 32450 + }, + { + "title": "Git分支-新建与合并", + "path": "/note/git/", + "views": 28970 + } + ], + "trafficSources": { + "direct": 35, + "searchEngine": 45, + "externalLink": 20 + }, + "summary": { + "totalViews": 125680, + "totalArticles": 86, + "todayVisits": 1256 + } +} diff --git a/docs/@pages/statisticsPage.md b/docs/@pages/statisticsPage.md new file mode 100644 index 0000000000..1fc7b14891 --- /dev/null +++ b/docs/@pages/statisticsPage.md @@ -0,0 +1,7 @@ +--- +statisticsPage: true +title: 统计 +permalink: /statistics/ +article: false +sidebar: false +--- diff --git a/package.json b/package.json index 1c88b1aff0..0db05fbb6b 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "license": "MIT", "devDependencies": { + "chart.js": "^2.9.4", "dayjs": "^1.9.7", "inquirer": "^7.1.0", "json2yaml": "^1.1.0", diff --git a/vdoing/components/StatisticsPage.vue b/vdoing/components/StatisticsPage.vue new file mode 100644 index 0000000000..da03a01b37 --- /dev/null +++ b/vdoing/components/StatisticsPage.vue @@ -0,0 +1,549 @@ + + + + + diff --git a/vdoing/index.js b/vdoing/index.js index d40b863654..1184ff7bc8 100644 --- a/vdoing/index.js +++ b/vdoing/index.js @@ -59,6 +59,13 @@ module.exports = (options, ctx) => { deletePage(sourceDir, 'archivesPage') } + // 统计页 + if (themeConfig.statistics !== false) { + createPage(sourceDir, 'statisticsPage') + } else { + deletePage(sourceDir, 'statisticsPage') + } + // resolve algolia const isAlgoliaSearch = ( themeConfig.algolia diff --git a/vdoing/layouts/Layout.vue b/vdoing/layouts/Layout.vue index 62dda707ea..f201d6180b 100644 --- a/vdoing/layouts/Layout.vue +++ b/vdoing/layouts/Layout.vue @@ -47,6 +47,9 @@ + + +