{"id":748,"date":"2024-05-15T19:19:43","date_gmt":"2024-05-15T11:19:43","guid":{"rendered":"http:\/\/www.huerpu.cc:7000\/?p=748"},"modified":"2024-05-15T19:19:43","modified_gmt":"2024-05-15T11:19:43","slug":"vuepress1-9-10%e8%af%a6%e7%bb%86%e6%95%99%e7%a8%8b%e8%af%a6%e7%bb%86%e9%9d%a0%e8%b0%b1%e7%89%88","status":"publish","type":"post","link":"http:\/\/www.huerpu.cc:7000\/?p=748","title":{"rendered":"vuepress1.9.10\u8be6\u7ec6\u6559\u7a0b(\u8be6\u7ec6\u9760\u8c31\u7248)"},"content":{"rendered":"<h1>vuepress1.9.10\u8be6\u7ec6\u6559\u7a0b(\u8be6\u7ec6\u9760\u8c31\u7248)<\/h1>\n<h2>\u4e00\u3001\u786e\u4fdd<code>Git<\/code>\u3001<code>Node<\/code>\u3001<code>yarn<\/code>\u5b89\u88c5\u5b8c\u6bd5<\/h2>\n<p>\u7248\u672c\u8bf4\u660e<\/p>\n<pre><code class=\"language-cmd\">PS C:\\Users\\jason&gt; git -v\ngit version 2.37.0.windows.1\nPS C:\\Users\\jason&gt; node -v\nv16.20.2\nPS C:\\Users\\jason&gt; npm -v\n8.19.4\nPS C:\\Users\\jason&gt; yarn -v\n1.22.22\nPS C:\\Users\\jason&gt; vuepress -v\ncli.js\/1.9.10 <\/code><\/pre>\n<p>\u6700\u5f00\u59cb\u4f7f\u7528\u7684node20\uff0c\u540e\u9762\u5207\u6362\u5230\u4e8617\uff0c\u6700\u540e\u5207\u6362\u5230\u4e8616.20.2\uff0c\u6ca1\u5565\u95ee\u9898\u4e86\u3002<\/p>\n<h2>\u4e8c\u3001vuepress\u521d\u4f53\u9a8c<\/h2>\n<p>\u5728<code>GitHub<\/code>\u521b\u5efa\u4e00\u4e2a\u540d\u79f0\u4e3a<code>KelsenJing<\/code>\u7684\u516c\u5f00\u4ed3\u5e93\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/07\/image-20240507224714496.png\" alt=\"image-20240507224714496\" \/><\/p>\n<p>\u4f7f\u7528idea\u62c9\u53d6\u521a\u521b\u5efa\u7684\u4ed3\u5e93\u4ee3\u7801\uff0c\u5730\u5740\u4e3ahttps:\/\/github.com\/jinglisen\/KelsenJing.git<\/p>\n<p>win11\u6253\u5f00cmd\u7a97\u53e3\uff0c\u8fdb\u5165\u5230\u547d\u4ee4\u7a97\u53e3<\/p>\n<pre><code class=\"language-cmd\">cd C:\\Users\\jason\\IdeaProjects\\KelsenJing\nyarn add -D vuepress\nnpm init -y<\/code><\/pre>\n<p>\u521b\u5efa\u4f60\u7684\u7b2c\u4e00\u7bc7\u6587\u6863<\/p>\n<pre><code class=\"language-bash\">mkdir docs &amp;&amp; echo &#039;### KelsenJing&#039; &gt; docs\/README.md<\/code><\/pre>\n<p>\u5728 <code>package.json<\/code> \u4e2d\u6dfb\u52a0\u4e00\u4e9b\u811a\u672c<\/p>\n<pre><code class=\"language-json\">{\n  &quot;scripts&quot;: {\n    &quot;docs:dev&quot;: &quot;vuepress dev docs&quot;,\n    &quot;docs:build&quot;: &quot;vuepress build docs&quot;\n  }\n}<\/code><\/pre>\n<p>idea\u4e2d\uff0c\u9009\u4e2ddocs:dev\u7684\u7eff\u8272\u5c0f\u7bad\u5934\uff0c\u8fd0\u884c\u9879\u76ee<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/07\/image-20240507230531092.png\" alt=\"image-20240507230531092\" \/><\/p>\n<p>\u5728\u672c\u5730\u542f\u52a8\u670d\u52a1\u5668\u4e5f\u53ef\u4ee5\u7528<\/p>\n<pre><code class=\"language-bash\">yarn docs:dev # npm run docs:dev<\/code><\/pre>\n<h2>\u4e09\u3001\u4e3b\u9875\u8bbe\u7f6e<\/h2>\n<p>VuePress \u9075\u5faa <strong>\u7ea6\u5b9a\u4f18\u4e8e\u914d\u7f6e<\/strong> \u7684\u539f\u5219\uff0c\u63a8\u8350\u7684\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a<\/p>\n<pre><code>.\n\u251c\u2500\u2500 docs\n\u2502   \u251c\u2500\u2500 .vuepress (\u53ef\u9009\u7684)\n\u2502   \u2502   \u251c\u2500\u2500 components (\u53ef\u9009\u7684)\n\u2502   \u2502   \u251c\u2500\u2500 theme (\u53ef\u9009\u7684)\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 Layout.vue\n\u2502   \u2502   \u251c\u2500\u2500 public (\u53ef\u9009\u7684)\n\u2502   \u2502   \u251c\u2500\u2500 styles (\u53ef\u9009\u7684)\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 index.styl\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 palette.styl\n\u2502   \u2502   \u251c\u2500\u2500 templates (\u53ef\u9009\u7684, \u8c28\u614e\u914d\u7f6e)\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 dev.html\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 ssr.html\n\u2502   \u2502   \u251c\u2500\u2500 config.js (\u53ef\u9009\u7684)\n\u2502   \u2502   \u2514\u2500\u2500 enhanceApp.js (\u53ef\u9009\u7684)\n\u2502   \u2502 \n\u2502   \u251c\u2500\u2500 README.md\n\u2502   \u251c\u2500\u2500 guide\n\u2502   \u2502   \u2514\u2500\u2500 README.md\n\u2502   \u2514\u2500\u2500 config.md\n\u2502 \n\u2514\u2500\u2500 package.json<\/code><\/pre>\n<p>\u5728docs\u76ee\u5f55\u4e2d\u521b\u5efa\u914d\u7f6e\u6587\u4ef6 <code>.vuepress\/config.js<\/code>\uff0c\u76ee\u5f55\u7ed3\u6784\u662f\u8fd9\u6837\u7684<\/p>\n<pre><code class=\"language-text\">.\n\u251c\u2500 docs\n\u2502  \u251c\u2500 README.md\n\u2502  \u2514\u2500 .vuepress\n\u2502     \u2514\u2500 config.js\n\u2514\u2500 package.json<\/code><\/pre>\n<p>config.js\u5185\u5bb9\u4e3a<\/p>\n<pre><code class=\"language-js\">module.exports = {\n  title: &#039;\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66&#039;,\n    description: &#039;KelsenJing VuePress Site&#039;,\n}<\/code><\/pre>\n<p>\u53ef\u4ee5\u901a\u8fc7 <code>themeConfig.nav<\/code> \u589e\u52a0\u4e00\u4e9b\u5bfc\u822a\u680f\u94fe\u63a5<\/p>\n<pre><code class=\"language-js\">\/\/ .vuepress\/config.js\nmodule.exports = {\n  themeConfig: {\n    nav: [\n      { text: &#039;Home&#039;, link: &#039;\/&#039; },\n      { text: &#039;Guide&#039;, link: &#039;\/guide\/&#039; },\n      { text: &#039;External&#039;, link: &#039;https:\/\/google.com&#039; },\n    ]\n  }\n}<\/code><\/pre>\n<p>\u5728<code>docs\/.vuepress<\/code>\u4e0b\u521b\u5efapublic\u6587\u4ef6\u5939\uff0c\u91cc\u9762\u5b58\u653e\u6211\u4eec\u7684\u56fe\u7247kelsen.png\u3002<\/p>\n<p>\u628a<code>docs\/README.md<\/code>\u5185\u5bb9\u66ff\u6362\u6210\u4e0b\u9762\u5185\u5bb9\uff0c\u8fd9\u91cc\u663e\u793a\u7684\u5c31\u662f\u4e3b\u9875\u7684\u5185\u5bb9<\/p>\n<pre><code class=\"language-md\">---\nhome: true\ntitle: Home\nheroImage: \/kelsen.png\nheroText: \u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66\ntagline: \u6bcf\u4e00\u4e2a\u70ed\u7231\u6280\u672f\u7684\u4eba\uff0c\u90fd\u503c\u5f97\u656c\u754f\n\nactions:\n  - text: Get Started\n    link: \/get-started.html\n    type: primary\n\n  - text: Introduction\n    link: https:\/\/vuejs.press\/guide\/introduction.html\n    type: secondary\n\nfeatures:\n  - title: Java\u540e\u7aef\u5f00\u53d1\u5de5\u7a0b\u5e08\u8bad\u7ec3\u8425\n    details: \u4ece\u5c0f\u767d\u5230\u5927\u795e\u7684\u8715\u53d8\uff0c\u7531\u5185\u5411\u5916\u7684\u63d0\u5347\uff0c\u7eaf\u7eaf\u7684\u5e72\u8d27.\n  - title: \u5206\u5e03\u5f0f\u9ad8\u5e76\u53d1\u4e0e\u5fae\u670d\u52a1\n    details: SpringBoot\u3001SpringCloud\u6846\u67b6\uff0c\u5e94\u5bf9\u9ad8\u53ef\u7528\u9ad8\u5e76\u53d1\u5e94\u7528\u573a\u666f.\n  - title: \u67b6\u6784\u4e0e\u4e2d\u95f4\u4ef6\n    details: \u4ee5\u67b6\u6784\u5e08\u7684\u773c\u5149\u770b\u5f85\u5206\u5e03\u5f0f\u7cfb\u7edf\uff0c\u628a\u63e1\u5404\u79cd\u4e2d\u95f4\u4ef6\u7684\u7075\u6d3b\u8fd0\u7528.\n\nfooter: Copyright \u00a9 2024-present KelsenJing All Rights Reserved. | Author KelsenJing\n---\n\nThis is the content of home page. Check [\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66][default-theme-home] for more details.\n\n[default-theme-home]: https:\/\/kelsen.huerpu.cc<\/code><\/pre>\n<h3>3.1\u9996\u9875\u6807\u9898\u548c\u6807\u8bed<\/h3>\n<p>\ud83d\udcc1<code>.vuepress<\/code>\u6587\u4ef6\u5939\u5185\u65b0\u5efa\ud83d\udcc1<code>public<\/code>\u6587\u4ef6\u5939\uff0c\u653e\u5165<code>kelsen.png<\/code>\u548c<code>favicon.ico<\/code>\u6587\u4ef6\uff0c<code>heroImage: \/kelsen.png<\/code>\u8bbe\u7f6e\u4e3akelsen\u7684\u5934\u50cf\uff0cheroText\u548ctagline\u5206\u522b\u4e3a\u9996\u9875\u6807\u9898\u548c\u6807\u8bed\u3002<\/p>\n<p>\u91cd\u542f\u9879\u76ee\u53ef\u4ee5\u770b\u5230\u4e3b\u9875\u5982\u4e0b<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/07\/image-20240507233229411.png\" alt=\"image-20240507233229411\" \/><\/p>\n<h3>3.2 Logo\u8bbe\u7f6e<\/h3>\n<p>\u5728themeConfig\u4e0b\u589e\u52a0\u4e00\u4e2alogo\u7684\u56fe\u7247\u8def\u5f84\uff0c\u8be5\u56fe\u7247\u5b58\u653e\u5728public\u6587\u4ef6\u5939\u4e0b\u3002<\/p>\n<pre><code class=\"language-js\">themeConfig: {\n        logo: &#039;\/kelsen.png&#039;,\n}<\/code><\/pre>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508155815426.png\" alt=\"image-20240508155815426\" \/><\/p>\n<h3>3.3 \u7ad9\u70b9\u56fe\u6807\u8bbe\u7f6e<\/h3>\n<p>\u5728<code>config.js<\/code>\u4e2d\u589e\u52a0\u4fe1\u606f\uff0c\u6307\u5411\u4e00\u4e2a\u7f8e\u5973\u7684\u56fe\u7247\uff0c\u56fe\u7247\u5b58\u5728public\u6587\u4ef6\u5939\u4e0b\u3002<\/p>\n<pre><code class=\"language-js\">export default defineUserConfig({\n  head: [[&#039;link&#039;, { rel: &#039;icon&#039;, href: &#039;\/beauty.jpg&#039; }]],\n})<\/code><\/pre>\n<p>\u663e\u793a\u6548\u679c\u5982\u4e0b<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508160409974.png\" alt=\"image-20240508160409974\" \/><\/p>\n<h2>\u56db\u3001\u5bfc\u822a\u680f\u4e8c\u7ea7\u83dc\u5355<\/h2>\n<p>\u5728.vuepress\u4e0b\u521b\u5efa\u6587\u4ef6\u5939<code>SpringCloud(Finchley)<\/code>\u548c<code>SpringCloud(Kilburn)<\/code>\uff0c\u91cc\u9762\u5b58\u653e\u6211\u4eec\u7684md\u6587\u6863\u3002<\/p>\n<pre><code class=\"language-tree\">\u251c\u2500.vuepress\n\u2502  \u251c\u2500dist\n\u2502  \u2502  \u2514\u2500manifest\n\u2502  \u2514\u2500public\n\u251c\u2500SpringCloud(Finchley)\n\u2514\u2500SpringCloud(Kilburn)<\/code><\/pre>\n<p>\u4fee\u6539themeConfig.nav\u5bfc\u822a\u680f\uff0c\u4e8c\u7ea7\u83dc\u5355\u5c31\u662f\u5d4c\u5957\u4e24\u5c42\uff0c\u4e5f\u633a\u7b80\u5355\u3002<\/p>\n<pre><code class=\"language-js\">themeConfig: {\n        nav: [\n            { text: &#039;Home&#039;, link: &#039;\/&#039; },\n            { text: &#039;Guide&#039;, link: &#039;\/guide\/&#039; },\n            {\n                text: &#039;SpringCloud\u7cfb\u5217\u6559\u7a0b&#039;,\n                items: [\n                    {\n                        text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                        items: [\n                            { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0(eureka)&#039;, link: &#039;\/SpringCloud(Finchley)\/SpringCloud-(Finchley-version)-series-of-tutorials-(1)-Service-Registration-and-Discovery-(eureka).md&#039; },\n                            { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u5ba2\u6237\u7aef\u8d1f\u8f7d\u5747\u8861Ribbon&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-Version)-Series-Tutorial-(2)-Client-Load-Balancing-Ribbon.md&#039; },\n                            { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-Edition)-Series-Tutorial-(3)-Service-Consumer-(OpenFeign).md&#039; },\n                            { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668(Hystrix)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-version)-series-tutorial-(4)-Circuit-breaker-(Hystrix).md&#039; },\n                            { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e94) \u670d\u52a1\u7f51\u5173(Zuul)&#039;, link: &#039;\/SpringCloud(Finchley)\/SpringCloud-(Finchley-version)-series-of-tutorials-(5)-Service-Gateway-(Zuul).md&#039; },\n                        ]\n                    },\n                    {\n                        text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                        items: [\n                            { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0(eureka)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(1)-Service-Registration-and-Discovery-(eureka).md&#039; },\n                            { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u670d\u52a1\u6d88\u8d39\u8005(RestTemplate+Loadbalancer)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2)-Tutorial-Series-(2)-Service-Consumers-(RestTemplate+LoadBalancer).md&#039; },\n                            { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(3)-Service-Consumer-(OpenFeign).md&#039; },\n                            { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668(Resilience4JCircuitBreaker\u3001RetryCircuitBreaker)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(4)-Circuit-Breakers-(Resilience4JCircuitBreaker-RetryCircuit-Breaker).md&#039; },\n                            { text: &#039;&#039;, link: &#039;\/SpringCloud(Kilburn)\/&#039; },\n                        ]\n                    },\n\n                ]\n            },\n            { text: &#039;About&#039;, link: &#039;\/about&#039; },\n        ]\n    },<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230\u4e8c\u7ea7\u83dc\u5355\u6548\u679c\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508130817399.png\" alt=\"image-20240508130817399\" \/><\/p>\n<h2>\u4e94\u3001\u4fa7\u8fb9\u680f<\/h2>\n<h3>5.1 docs\u76ee\u5f55\u7ed3\u6784<\/h3>\n<pre><code class=\"language-tree\">.\n\u251c\u2500.vuepress\n\u2502  \u251c\u2500dist\n\u2502  \u2502  \u2514\u2500manifest\n\u2502  \u2514\u2500public\n\u251c\u2500SpringBoot\n\u251c\u2500SpringCloud(Finchley)\n\u2514\u2500SpringCloud(Kilburn)<\/code><\/pre>\n<h3>5.2 \u4e8c\u7ea7\u76ee\u5f55\u8bbe\u7f6e<\/h3>\n<p>\u5728themeConfig\u7684nav\u5bfc\u822a\u680f\u4e2d\uff0c\u589e\u52a0\u4e00\u4e0b<code>SpringBoot\u6574\u5408\u7cfb\u5217\u6559\u7a0b<\/code>\u4e8c\u7ea7\u83dc\u5355\u3002\u5728docs\u4e0b\u521b\u5efaSpringBoot\u6587\u4ef6\u5939\uff0c\u91cc\u9762\u5b58\u653e\u5bf9\u5e94\u7684md\u6587\u4ef6\uff0c\u5e76\u4e14\u5728\u8be5\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2aREADME.md\u7684\u6587\u4ef6\u3002<\/p>\n<pre><code class=\"language-js\">nav: [\n    { text: &#039;Home&#039;, link: &#039;\/&#039; },\n    { text: &#039;Guide&#039;, link: &#039;\/guide\/&#039; },\n    {\n        text: &#039;SpringCloud\u7cfb\u5217\u6559\u7a0b&#039;,\n        items: [\n            {\n                text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                items: [\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0(eureka)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-version)-series-of-tutorials-(1)-Service-Registration-and-Discovery-(eureka).md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u5ba2\u6237\u7aef\u8d1f\u8f7d\u5747\u8861Ribbon&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-Version)-Series-Tutorial-(2)-Client-Load-Balancing-Ribbon.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-version)-Series-Tutorial-(3)-Service-Consumer-OpenFeign.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668(Hystrix)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-version)-series-tutorial-(4)-Circuit-breaker-(Hystrix).md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e94) \u670d\u52a1\u7f51\u5173(Zuul)&#039;, link: &#039;\/SpringCloud(Finchley)\/Spring-Cloud-(Finchley-version)-series-of-tutorials-(5)-Service-Gateway-(Zuul).md&#039; },\n                ]\n            },\n            {\n                text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                items: [\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0(eureka)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(1)-Service-Registration-and-Discovery-(eureka).md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u670d\u52a1\u6d88\u8d39\u8005(RestTemplate+Loadbalancer)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2)-Tutorial-Series-(2)-Service-Consumers-(RestTemplate+LoadBalancer).md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(3)-Service-Consumer-(OpenFeign).md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668(Resilience4JCircuitBreaker\u3001RetryCircuitBreaker)&#039;, link: &#039;\/SpringCloud(Kilburn)\/Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(4)-Circuit-Breakers-(Resilience4JCircuitBreaker-RetryCircuit-Breaker).md&#039; },\n                    \/*{ text: &#039;&#039;, link: &#039;\/SpringCloud(Kilburn)\/&#039; },*\/\n                ]\n            },\n\n        ]\n    },\n    {\n        text: &#039;SpringBoot\u6574\u5408\u7cfb\u5217\u6559\u7a0b&#039;,\n        items:[\n            { text: &#039;SpringBoot\u6574\u5408MyBatis&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-MyBatis&#039; },\n            { text: &#039;SpringBoot\u6574\u5408Redis&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-Redis&#039; },\n            { text: &#039;SpringBoot\u6574\u5408es&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-es&#039; },\n            { text: &#039;SpringBoot\u6574\u5408thymeleaf&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-thymeleaf&#039; },\n        ]\n    },\n    { text: &#039;About&#039;, link: &#039;\/about&#039; },\n],<\/code><\/pre>\n<h3>5.3 \u589e\u52a0\u4fa7\u8fb9\u680f<\/h3>\n<p>\u5728themeConfig\u4e2d\u589e\u52a0sidebar\u3002<\/p>\n<pre><code class=\"language-js\">sidebar: {\n\n    &quot;\/SpringCloud(Finchley)\/&quot;: [\n        &#039;&#039;,\n        &#039;Spring-Cloud-(Finchley-version)-series-of-tutorials-(1)-Service-Registration-and-Discovery-(eureka)&#039;,\n        &#039;Spring-Cloud-(Finchley-Version)-Series-Tutorial-(2)-Client-Load-Balancing-Ribbon&#039;,\n        &#039;Spring-Cloud-(Finchley-version)-Series-Tutorial-(3)-Service-Consumer-OpenFeign&#039;,\n        &#039;Spring-Cloud-(Finchley-version)-series-tutorial-(4)-Circuit-breaker-(Hystrix)&#039;,\n        &#039;Spring-Cloud-(Finchley-version)-series-of-tutorials-(5)-Service-Gateway-(Zuul)&#039;\n    ],\n    &quot;\/SpringCloud(Kilburn)\/&quot;: [\n        &#039;&#039;,\n        &#039;Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(1)-Service-Registration-and-Discovery-(eureka)&#039;,\n        &#039;Spring-Cloud-(Kilburn-2022-0-2)-Tutorial-Series-(2)-Service-Consumers-(RestTemplate+LoadBalancer)&#039;,\n        &#039;Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(3)-Service-Consumer-(OpenFeign)&#039;,\n        &#039;Spring-Cloud-(Kilburn-2022-0-2-Edition)-Tutorial-Series-(4)-Circuit-Breakers-(Resilience4JCircuitBreaker-RetryCircuit-Breaker)&#039;\n    ],\n    &quot;\/SpringBoot\/&quot;: [\n            &#039;&#039;,\n            &#039;SpringBoot-integrates-MyBatis&#039;,\n            &#039;SpringBoot-integrates-es&#039;,\n            &#039;SpringBoot-integrates-Redis&#039;,\n            &#039;SpringBoot-integrates-thymeleaf&#039;\n     ],\n    &#039;\/&#039;: [\n        &#039;&#039;,        \/* \/ *\/\n        &#039;contact&#039;, \/* \/contact.html *\/\n        &#039;about&#039;    \/* \/about.html *\/\n    ]\n}<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230\u4fa7\u8fb9\u680f\u6548\u679c\u3002\u4f46\u662f\u73b0\u5728\u6807\u9898\u53ea\u663e\u793a\u5230\u4e86\u4e09\u7ea7\u6807\u9898\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508153647878.png\" alt=\"image-20240508153647878\" \/><\/p>\n<p>SpringCloud\u8fd9\u8fb9\u4e5f\u662f\u53ea\u663e\u793a\u5230\u4e86\u4e09\u7ea7\u6807\u9898\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508153147272.png\" alt=\"image-20240508153147272\" \/><\/p>\n<h3>5.4 \u591a\u7ea7\u522b\u4fa7\u8fb9\u680f\u6e32\u67d3<\/h3>\n<p>\u5728sidebar\u540c\u7ea7\u76ee\u5f55\u4e0b\uff0c\u589e\u52a0\u5e76\u914d\u7f6e<code>sidebarDepth<\/code>\u4e3a6\uff0c\u8ba9\u5b83\u663e\u793a\u7684\u6807\u9898\u591a\u4e00\u70b9\u3002\u7136\u540e\u5728sidebar\u540c\u7ea7\u522b\u4e0b\u589e\u52a0\u591a\u7ea7\u522b\u6807\u9898\u6e32\u67d3\u3002<\/p>\n<pre><code class=\"language-js\">markdown: {\n    \/\/ \u5f00\u542f\u4ee3\u7801\u5757\u7684\u884c\u53f7\n    lineNumbers: true,\n    \/\/ \u652f\u6301 4 \u7ea7\u4ee5\u4e0a\u7684\u6807\u9898\u6e32\u67d3\n    extractHeaders: [&quot;h2&quot;, &quot;h3&quot;, &quot;h4&quot;, &quot;h5&quot;, &quot;h6&quot;],\n},<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230sidebar\u53ef\u4ee5\u6e32\u67d3\u52306\u7ea7\u6807\u9898\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508154901994.png\" alt=\"image-20240508154901994\" \/><\/p>\n<p>SpringCloud\u8fd9\u8fb9\u4e5f\u53ef\u4ee5\u770b\u5230\u4e0b\u9762\u7684\u591a\u7ea7\u6807\u9898\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508154952735.png\" alt=\"image-20240508154952735\" \/><\/p>\n<h3>5.5 \u4fa7\u8fb9\u680f\u81ea\u52a8\u5c55\u5f00<\/h3>\n<p>\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u5b83\u6253\u5f00\u4e4b\u540e\uff0c\u81ea\u52a8\u5c55\u5f00\u5404\u79cd\u6807\u9898\uff0c\u800c\u4e0d\u662f\u6211\u4eec\u70b9\u51fb\u7684\u65f6\u5019\u518d\u6253\u5f00\u3002\u5728sidebar\u540c\u7ea7\u76ee\u5f55\u4e0b\uff0c\u589e\u52a0\u5e76\u914d\u7f6edisplayAllHeaders\u4e3atrue\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508155128155.png\" alt=\"image-20240508155128155\" \/><\/p>\n<h2>\u516d\u3001\u66f4\u65b0\u65f6\u95f4\u663e\u793a\u8c03\u6574<\/h2>\n<p>\u5728themeConfig\u4e2d\u589e\u52a0\u4e00\u4e2alastUpdated\uff0c\u6307\u793a\u66f4\u65b0\u63d0\u793a\u5185\u5bb9\u3002<\/p>\n<pre><code class=\"language-js\">themeConfig: {\n        lastUpdated: &#039;\u6700\u8fd1\u66f4\u65b0&#039;,\n}<\/code><\/pre>\n<p>\u65b0\u589e\u4e00\u4e2a\u5305moment\u3002<\/p>\n<pre><code class=\"language-cmd\">yarn add moment<\/code><\/pre>\n<p>\u5728config.js\u4e2d\u589e\u52a0\u4e0b\u9762\u5185\u5bb9\uff0c\u60f3\u8981\u81ea\u5df1\u7684\u683c\u5f0f\u53ef\u4ee5\u53bbmoment\u5b98\u7f51\u67e5\u770b\u3002<\/p>\n<pre><code class=\"language-javascript\">const moment = require(&#039;moment&#039;);\n\nmodule.exports = {\n  plugins: [\n    [\n      &#039;@vuepress\/last-updated&#039;,\n      {\n        transformer: (timestamp, lang) =&gt; {\n          \/\/ \u4e0d\u8981\u5fd8\u4e86\u5b89\u88c5 moment\n          const moment = require(&#039;moment&#039;)\n          moment.locale(lang)\n          return moment(timestamp).fromNow()\n        }\n      }\n    ]\n  ]\n}<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u6548\u679c\u5982\u4e0b\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508162807020.png\" alt=\"image-20240508162807020\" \/><\/p>\n<h2>\u4e03\u3001\u90e8\u7f72<\/h2>\n<h3>7.1 \u90e8\u7f72\u5230github pages<\/h3>\n<p>\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efa\u6587\u4ef6<code>deploy.sh<\/code>\uff0c\u5176\u5185\u5bb9\u5982\u4e0b\u3002<\/p>\n<pre><code class=\"language-sh\">#!\/usr\/bin\/env sh\n\n# \u786e\u4fdd\u811a\u672c\u629b\u51fa\u9047\u5230\u7684\u9519\u8bef\nset -e\n\n# \u751f\u6210\u9759\u6001\u6587\u4ef6\nnpm run docs:build\n\n# \u8fdb\u5165\u751f\u6210\u7684\u6587\u4ef6\u5939\n#cd docs\/.vuepress\/dist\ncd dist\n\n# \u5982\u679c\u662f\u53d1\u5e03\u5230\u81ea\u5b9a\u4e49\u57df\u540d\n# echo &#039;www.example.com&#039; &gt; CNAME\n\ngit init\ngit add -A\ngit commit -m &#039;deploy&#039;\n\n# \u5982\u679c\u53d1\u5e03\u5230 https:\/\/&lt;USERNAME&gt;.github.io\n# git push -f git@github.com:&lt;&gt;\/&lt;USERNAME&gt;.github.io.git master\n\n# \u5982\u679c\u53d1\u5e03\u5230 https:\/\/&lt;USERNAME&gt;.github.io\/&lt;REPO&gt;\ngit push -f git@github.com:jinglisen\/Kelsen.git master:gh-pages\n\ncd -<\/code><\/pre>\n<p>\u4e0a\u9762\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u6709\u914d\u7f6e\u751f\u6210\u7684\u6587\u4ef6\u5939\u4e3adist\uff0c\u6240\u4ee5\u5728config.js\u4e2d\u589e\u52a0\u4e0b\u9762\u4e00\u6761\u8def\u5f84\u6307\u5b9a\u3002<\/p>\n<pre><code class=\"language-js\">export default defineUserConfig({\n  dest: &#039;dist&#039;,\n})<\/code><\/pre>\n<p>\u8fd0\u884cdeploy.sh<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508172759461.png\" alt=\"image-20240508172759461\" \/><\/p>\n<p>\u521a\u5f00\u59cb\u6253\u5305\u62a5\u9519\u4e86\uff1a<\/p>\n<pre><code class=\"language-cmd\">(undefined) assets\/js\/styles.9f84806b.js from Terser\nError: error:0308010C:digital envelope routines::unsupported\n    at new Hash (node:internal\/crypto\/hash:79:19)\n    at Object.createHash (node:crypto:139:10)<\/code><\/pre>\n<blockquote>\n<p>\u8fd0\u884c\u62a5\u9519\u8bf7\u53c2\u8003\uff1a<a href=\"https:\/\/blog.csdn.net\/scholar_man\/article\/details\/134491200\">https:\/\/blog.csdn.net\/scholar_man\/article\/details\/134491200<\/a><\/p>\n<\/blockquote>\n<p>\u6211\u4eec\u589e\u52a0\u4e86\u8fd9\u6761script\uff1a<code>&quot;docs:build&quot;: &quot;SET NODE_OPTIONS=--openssl-legacy-provider &amp;&amp; vuepress build docs&quot;,<\/code>\u89e3\u51b3\u4e86\u8fd9\u4e2a\u62a5\u9519\u3002<\/p>\n<pre><code class=\"language-js\">&quot;scripts&quot;: {\n    &quot;dev&quot;: &quot;SET NODE_OPTIONS=--openssl-legacy-provider &amp;&amp; vue-cli-service serve&quot;,\n    &quot;docs:build&quot;: &quot;SET NODE_OPTIONS=--openssl-legacy-provider &amp;&amp; vuepress build docs&quot;,\n    &quot;docs:clean-dev&quot;: &quot;vuepress dev docs --clean-cache&quot;,\n    &quot;docs:dev&quot;: &quot;SET NODE_OPTIONS=--openssl-legacy-provider &amp;&amp; vuepress dev docs&quot;,\n    &quot;docs:update-package&quot;: &quot;pnpm dlx vp-update&quot;,\n    &quot;deploy&quot;: &quot;bash deploy.sh&quot;\n  },<\/code><\/pre>\n<p>\u6211\u8fd8\u8bd5\u4e86\u4e00\u4e0b\uff0c\u628anode\u9000\u56de\u523016\u7248\u672c\uff0c\u76f4\u63a5\u4ece\u6839\u672c\u4e0a\u89e3\u51b3\u8fd9\u4e2a\u5305\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509113011620.png\" alt=\"image-20240509113011620\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509113031574.png\" alt=\"image-20240509113031574\" \/><\/p>\n<p>\u65b0\u5efa\u4e00\u4e2a<code>GitHub Action<\/code><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508185303333.png\" alt=\"image-20240508185303333\" \/><\/p>\n<p>\u8fd9\u91cc\u53ea\u9700\u8981\u4fdd\u6301\u548cdeploy.sh\u4e2dpush\u7684\u5206\u652f\u4e00\u6837\u5c31\u597d\u3002\u5176\u4f59\u9ed8\u8ba4\uff0c\u70b9\u51fb\u63d0\u4ea4\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508185404478.png\" alt=\"image-20240508185404478\" \/><\/p>\n<p>\u7136\u540e\u8fd4\u56desettings\u7684pages\uff0c\u70b9\u51fb<code>https:\/\/jinglisen.github.io\/KelsenJing\/<\/code>\u5c31\u53ef\u4ee5\u8bbf\u95ee\u5230\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508193216477.png\" alt=\"image-20240508193216477\" \/><\/p>\n<p>\u9875\u9762\u5c55\u793a\u5c31\u662f\u8fd9\u6837\u5b50\u7684<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/Untitled.png\" alt=\"Untitled\" \/><\/p>\n<h3>7.2 \u81ea\u5b9a\u4e49\u57df\u540d\u8bbf\u95ee<\/h3>\n<p>\u5728deploy.sh\u4e2d\u589e\u52a0<code>echo &#039;kelsenjing.huerpu.cc&#039; &gt; CNAME<\/code>\u3002<\/p>\n<pre><code class=\"language-sh\">#!\/usr\/bin\/env sh\n\n# \u786e\u4fdd\u811a\u672c\u629b\u51fa\u9047\u5230\u7684\u9519\u8bef\nset -e\n\n# \u751f\u6210\u9759\u6001\u6587\u4ef6\nnpm run docs:build\n\n# \u8fdb\u5165\u751f\u6210\u7684\u6587\u4ef6\u5939\n#cd docs\/.vuepress\/dist\ncd dist\n\n# \u5982\u679c\u662f\u53d1\u5e03\u5230\u81ea\u5b9a\u4e49\u57df\u540d\necho &#039;kelsenjing.huerpu.cc&#039; &gt; CNAME\n\ngit init\ngit add -A\ngit commit -m &#039;deploy&#039;\n\n# \u5982\u679c\u53d1\u5e03\u5230 https:\/\/&lt;USERNAME&gt;.github.io\n# git push -f git@github.com:&lt;&gt;\/&lt;USERNAME&gt;.github.io.git master\n\n# \u5982\u679c\u53d1\u5e03\u5230 https:\/\/&lt;USERNAME&gt;.github.io\/&lt;REPO&gt;\ngit push -f git@github.com:jinglisen\/Kelsen.git master:gh-pages\n\ncd -<\/code><\/pre>\n<p>\u5728\u57df\u540d\u89e3\u6790\u589e\u52a0\u4e00\u6761CNAME\u7684\u8bb0\u5f55\uff0c\u4e3b\u673a\u8bb0\u5f55\u4e3akelsen\uff0c\u4e5f\u5c31\u662f\u4e8c\u7ea7\u57df\u540d\uff0c\u8bb0\u5f55\u503c\u6307\u5411<code>jinglisen.github.io.<\/code>\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508193637784.png\" alt=\"image-20240508193637784\" \/><\/p>\n<p>\u5728\u9879\u76ee\u7684settings\u4e2d\uff0c\u589e\u52a0\u81ea\u5b9a\u4e49\u57df\u540d<code>kelsenjing.huerpu.cc<\/code>\uff0c\u6dfb\u52a0\u4e4b\u540e\u68c0\u6d4b<code>DNS check successful<\/code>\u3002\u5982\u679c\u57df\u540d\u8bbf\u95ee\u4e0d\u5230\uff0c\u5927\u5bb6\u8010\u5fc3\u7b49\u5f85\u4e00\u4e0b\uff0c\u57df\u540d\u63d0\u4f9b\u554610\u5206\u949f\u5185\u751f\u6548\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508201052006.png\" alt=\"image-20240508201052006\" \/><\/p>\n<p>\u8bbf\u95ee<code>https:\/\/kelsenjing.huerpu.cc\/<\/code>\uff0c\u53ef\u4ee5\u770b\u5230\u6837\u5f0f\u90fd\u4e71\u6389\u4e86\uff0c\u522b\u614c\uff0c\u6211\u4eec\u4fee\u6539\u4e00\u4e0bbase\u3002<\/p>\n<p>\u5728config.js\u4e2d\u4fee\u6539<code>base: &#039;\/&#039;<\/code>\uff0c\u7136\u540e\u91cd\u65b0deploy\u53d1\u5e03\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508200924540.png\" alt=\"image-20240508200924540\" \/><\/p>\n<h3>7.3 \u90e8\u7f72\u5230Ubuntu\u670d\u52a1\u5668<\/h3>\n<pre><code class=\"language-shell\">sudo su -\n\napt install  net-tools -y \n\napt install ssh \n\ncd \/usr\n\nmkdir software\n\nchmod -R 777 software \n\napt install unzip\n\nunzip dist.zip\n\nmv dist\/ kelsen\/\n\nchmod -R 777 kelsen\n\n#\u5b89\u88c5nginx\napt install nginx-core -y\n#\u67e5\u770bnginx\u7248\u672c\nnginx -v\n#\u542f\u52a8nginx\nservice nginx start\n#\u505c\u6b62nginx\nservice nginx stop\n#\u5f00\u653e80\u7aef\u53e3\uff0cnginx\u9ed8\u8ba4\u7aef\u53e3\nufw allow 80\n\n# \u6253\u5f00\u9ed8\u8ba4\u7684 nginx \u914d\u7f6e\u6587\u4ef6\nvim \/etc\/nginx\/sites-available\/default\n\n#\u524d\u7aef\u8bbf\u95ee\u5730\u5740\nlocation \/ {\n                # First attempt to serve request as file, then\n                # as directory, then fall back to displaying a 404.\n                root \/usr\/software\/kelsen;\n                index index.html index.htm;\n                try_files $uri $uri\/ =404;\n}<\/code><\/pre>\n<p>\u8f93\u5165IP\u5730\u5740\uff0c\u53ef\u4ee5\u8bbf\u95ee\u5230vuepress\u90e8\u7f72\u5230Ubuntu\u9996\u9875\u9762\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508195302070.png\" alt=\"image-20240508195302070\" \/><\/p>\n<h3>7.4 \u5185\u7f51\u7a7f\u900f\u57df\u540d\u8bbf\u95ee<\/h3>\n<p>\u56e0\u4e3a\u6211\u6709\u4e00\u53f0\u963f\u91cc\u4e91\u4e3b\u673a\uff0c\u6709\u505a\u5185\u7f51\u7a7f\u900f\uff0c\u6240\u4ee5\u76f4\u63a5\u5728frpc.ini\u4e2d\u589e\u52a0\u4e00\u6761\u8bb0\u5f55<\/p>\n<pre><code class=\"language-ini\">[hep-vuepress]\ntype = tcp\nlocal_ip = 192.168.31.116\nlocal_port = 80\nremote_port = 80<\/code><\/pre>\n<p>\u5728\u963f\u91cc\u4e91\u4e3b\u673a\u5b89\u5168\u89c4\u5219\u4e2d\uff0c\u653e\u884c80\u7aef\u53e3\u3002<\/p>\n<p>\u8bbf\u95ee<code>http:\/\/www.huerpu.cc\/<\/code>\u5373\u53ef\u8bbf\u95ee\u5230\u535a\u5ba2\u4e3b\u9875\u5566\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/08\/image-20240508195353688.png\" alt=\"image-20240508195353688\" \/><\/p>\n<h2>\u516b\u3001Vssue\u8bc4\u8bba\u63d2\u4ef6<\/h2>\n<h3>8.1 \u83b7\u5f97clientId\u548cclientSecret<\/h3>\n<p>\u521b\u5efa\u4e00\u4e2a<code>OAuth App<\/code>\uff0c\u5730\u5740<code>https:\/\/vssue.js.org\/zh\/guide\/github.html<\/code><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509115724628.png\" alt=\"image-20240509115724628\" \/><\/p>\n<p>\u8fd9\u91cc\u628a\u672c\u5730\u5730\u5740\u8d34\u8fdb\u6765<code>http:\/\/localhost:8080\/<\/code><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509115925039.png\" alt=\"image-20240509115925039\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509120056328.png\" alt=\"image-20240509120056328\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509120144058.png\" alt=\"image-20240509120144058\" \/><\/p>\n<h3>8.2 \u5b89\u88c5\u4f7f\u7528vssue<\/h3>\n<p>\u5b89\u88c5vssue\u5305\u548c<code>api-github-v4<\/code>\u5305<\/p>\n<pre><code class=\"language-shell\">yarn add @vssue\/vuepress-plugin-vssue\n\nyarn add  @vssue\/api-github-v4<\/code><\/pre>\n<p>\u5728Config.js\u7684plugins\u4e2d\u589e\u52a0vssue<\/p>\n<pre><code class=\"language-js\">\/\/\u4e2a\u4eba\u7684\u4ec5\u4f9b\u53c2\u8003\uff0c\u9700\u8981\u66f4\u6362\u6210\u81ea\u5df1github\u7684OAuth App clientId\u548cclientSecret\n[\n            &#039;@vssue\/vuepress-plugin-vssue&#039;, {\n                \/\/ \u8bbe\u7f6e `platform` \u800c\u4e0d\u662f `api`\n                platform: &#039;github-v4&#039;,\n\n                \/\/ \u5176\u4ed6\u7684 Vssue \u914d\u7f6e\n                owner: &#039;jinglisen&#039;,\n                repo: &#039;KelsenJing&#039;,\n                clientId: &#039;Ov23li40sj0Aqfpe44n5&#039;,\n                clientSecret: &#039;ea2132d27d6f922adce20aca49639bd3abea7190&#039;,\n            },\n],<\/code><\/pre>\n<h3>8.3 \u5355\u9875\u9762\u4f7f\u7528vssue<\/h3>\n<p>\u5728\u6211\u4eec\u7684docs\u4e0b\u6709\u4e00\u4e2aabout\u9875\u9762\uff0c\u5728about\u4e2d\u6dfb\u52a0\u4e00\u4e2a<code>&lt;Vssue  \/&gt;<\/code>\u6807\u7b7e<\/p>\n<pre><code class=\"language-md\">### About Me\n\n\u4e00\u4e2a\u559c\u6b22\u82f1\u8bed\u7684\u7a0b\u5e8f\u733f\n\n&lt;Vssue  \/&gt;<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230\u6709\u8bc4\u8bba\u6548\u679c<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509121821553.png\" alt=\"image-20240509121821553\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509121954958.png\" alt=\"image-20240509121954958\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509122043418.png\" alt=\"image-20240509122043418\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509122556187.png\" alt=\"image-20240509122556187\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509122659925.png\" alt=\"image-20240509122659925\" \/><\/p>\n<h3>8.4 \u81ea\u52a8\u521b\u5efa\u8bc4\u8bba\u529f\u80fd<\/h3>\n<p>\u5728vssue\u4e2d\u8bbe\u7f6e\u81ea\u52a8\u521b\u5efa\u8bc4\u8bba<code>autoCreateIssue: true,<\/code>\u5373\u53ef<\/p>\n<pre><code class=\"language-js\">\/\/\u4e2a\u4eba\u7684\u4ec5\u4f9b\u53c2\u8003\uff0c\u9700\u8981\u66f4\u6362\u6210\u81ea\u5df1github\u7684OAuth App clientId\u548cclientSecret\n[\n            &#039;@vssue\/vuepress-plugin-vssue&#039;, {\n                \/\/ \u8bbe\u7f6e `platform` \u800c\u4e0d\u662f `api`\n                platform: &#039;github-v4&#039;,\n\n                \/\/ \u5176\u4ed6\u7684 Vssue \u914d\u7f6e\n                owner: &#039;jinglisen&#039;,\n                repo: &#039;KelsenJing&#039;,\n                clientId: &#039;Ov23li40sj0Aqfpe44n5&#039;,\n                clientSecret: &#039;ea2132d27d6f922adce20aca49639bd3abea7190&#039;,\n                autoCreateIssue: true,\n            },\n],<\/code><\/pre>\n<p>\u5728about\u540c\u7ea7\u76ee\u5f55\u4e0b\uff0c\u521b\u5efa\u4e00\u4e2aabout1.md\u6587\u4ef6\uff0c\u91cd\u542f\u9879\u76ee\uff0c\u8bbf\u95ee<code>http:\/\/localhost:8080\/about1.html<\/code>\uff0c\u53ef\u4ee5\u770b\u5230\u4e0d\u9700\u8981\u521b\u5efa\uff0c\u8bc4\u8bba\u5df2\u7ecf\u81ea\u52a8\u521b\u5efa\u4e86\u3002github\u5bf9\u5e94\u9879\u76ee\u4e2d\uff0c\u4e5f\u6709\u4e86\u5bf9\u5e94\u7684about1\u7684\u8bc4\u8bba\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509125054921.png\" alt=\"image-20240509125054921\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509125217599.png\" alt=\"image-20240509125217599\" \/><\/p>\n<h3>8.5 \u5168\u5c40\u8bbe\u7f6eVssue<\/h3>\n<p>\u5982\u679c\u5728\u6bcf\u4e00\u4e2a\u9875\u9762\u90fd\u53bb\u6dfb\u52a0\u4e00\u4e2a<code>&lt;Vssue\/&gt;<\/code>\u6807\u7b7e\u4e5f\u592a\u9ebb\u70e6\u4e86\uff0c\u6211\u4eec\u5e0c\u671bvuepress\u53ef\u4ee5\u5e2e\u6211\u4eec\u81ea\u52a8\u6dfb\u52a0\u4e0a\u53bb\u3002<\/p>\n<h4>8.5.1 \u4e3b\u9898\u7684\u7ee7\u627f\u51c6\u5907\u5de5\u4f5c<\/h4>\n<p>\u53bbvuepress\u7684github\u4e0b\u8f7d\u6e90\u7801<code>https:\/\/github.com\/vuejs\/vuepress<\/code>\uff0c\u628a\u8def\u5f84<code>\/vuepress-master\/packages\/@vuepress\/theme-default<\/code>\u4e0b\uff0clayouts\u548cutil\u62f7\u8d1d\u51fa\u6765\uff0c\u5b58\u653e\u76ee\u5f55\u5982\u4e0b\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509133214582.png\" alt=\"image-20240509133214582\" \/><\/p>\n<p>\u5728theme\u6587\u4ef6\u5939\u4e0b\uff0c\u521b\u5efa\u4e00\u4e2aindex.js\u5176\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-js\">\/\/ .vuepress\/theme\/index.js\nmodule.exports = {\n    extend: &#039;@vuepress\/theme-default&#039;\n}<\/code><\/pre>\n<p>\u4e3a\u4e86\u65b9\u4fbf\u8d77\u89c1\uff0c\u628a\u4ee3\u7801\u8d34\u51fa\u6765\u5427\u3002<\/p>\n<p><code>util\/index.js<\/code>\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-js\">export const hashRE = \/#.*$\/\nexport const extRE = \/\\.(md|html)$\/\nexport const endingSlashRE = \/\\\/$\/\nexport const outboundRE = \/^[a-z]+:\/i\n\nexport function normalize (path) {\n  return decodeURI(path)\n    .replace(hashRE, &#039;&#039;)\n    .replace(extRE, &#039;&#039;)\n}\n\nexport function getHash (path) {\n  const match = path.match(hashRE)\n  if (match) {\n    return match[0]\n  }\n}\n\nexport function isExternal (path) {\n  return outboundRE.test(path)\n}\n\nexport function isMailto (path) {\n  return \/^mailto:\/.test(path)\n}\n\nexport function isTel (path) {\n  return \/^tel:\/.test(path)\n}\n\nexport function ensureExt (path) {\n  if (isExternal(path)) {\n    return path\n  }\n  const hashMatch = path.match(hashRE)\n  const hash = hashMatch ? hashMatch[0] : &#039;&#039;\n  const normalized = normalize(path)\n\n  if (endingSlashRE.test(normalized)) {\n    return path\n  }\n  return normalized + &#039;.html&#039; + hash\n}\n\nexport function isActive (route, path) {\n  const routeHash = decodeURIComponent(route.hash)\n  const linkHash = getHash(path)\n  if (linkHash &amp;&amp; routeHash !== linkHash) {\n    return false\n  }\n  const routePath = normalize(route.path)\n  const pagePath = normalize(path)\n  return routePath === pagePath\n}\n\nexport function resolvePage (pages, rawPath, base) {\n  if (isExternal(rawPath)) {\n    return {\n      type: &#039;external&#039;,\n      path: rawPath\n    }\n  }\n  if (base) {\n    rawPath = resolvePath(rawPath, base)\n  }\n  const path = normalize(rawPath)\n  for (let i = 0; i &lt; pages.length; i++) {\n    if (normalize(pages[i].regularPath) === path) {\n      return Object.assign({}, pages[i], {\n        type: &#039;page&#039;,\n        path: ensureExt(pages[i].path)\n      })\n    }\n  }\n  console.error(`[vuepress] No matching page found for sidebar item &quot;${rawPath}&quot;`)\n  return {}\n}\n\nfunction resolvePath (relative, base, append) {\n  const firstChar = relative.charAt(0)\n  if (firstChar === &#039;\/&#039;) {\n    return relative\n  }\n\n  if (firstChar === &#039;?&#039; || firstChar === &#039;#&#039;) {\n    return base + relative\n  }\n\n  const stack = base.split(&#039;\/&#039;)\n\n  \/\/ remove trailing segment if:\n  \/\/ - not appending\n  \/\/ - appending to trailing slash (last segment is empty)\n  if (!append || !stack[stack.length - 1]) {\n    stack.pop()\n  }\n\n  \/\/ resolve relative path\n  const segments = relative.replace(\/^\\\/\/, &#039;&#039;).split(&#039;\/&#039;)\n  for (let i = 0; i &lt; segments.length; i++) {\n    const segment = segments[i]\n    if (segment === &#039;..&#039;) {\n      stack.pop()\n    } else if (segment !== &#039;.&#039;) {\n      stack.push(segment)\n    }\n  }\n\n  \/\/ ensure leading slash\n  if (stack[0] !== &#039;&#039;) {\n    stack.unshift(&#039;&#039;)\n  }\n\n  return stack.join(&#039;\/&#039;)\n}\n\n\/**\n * @param { Page } page\n * @param { string } regularPath\n * @param { SiteData } site\n * @param { string } localePath\n * @returns { SidebarGroup }\n *\/\nexport function resolveSidebarItems (page, regularPath, site, localePath) {\n  const { pages, themeConfig } = site\n\n  const localeConfig = localePath &amp;&amp; themeConfig.locales\n    ? themeConfig.locales[localePath] || themeConfig\n    : themeConfig\n\n  const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar\n  if (pageSidebarConfig === &#039;auto&#039;) {\n    return resolveHeaders(page)\n  }\n\n  const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar\n  if (!sidebarConfig) {\n    return []\n  } else {\n    const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig)\n    if (config === &#039;auto&#039;) {\n      return resolveHeaders(page)\n    }\n    return config\n      ? config.map(item =&gt; resolveItem(item, pages, base))\n      : []\n  }\n}\n\n\/**\n * @param { Page } page\n * @returns { SidebarGroup }\n *\/\nfunction resolveHeaders (page) {\n  const headers = groupHeaders(page.headers || [])\n  return [{\n    type: &#039;group&#039;,\n    collapsable: false,\n    title: page.title,\n    path: null,\n    children: headers.map(h =&gt; ({\n      type: &#039;auto&#039;,\n      title: h.title,\n      basePath: page.path,\n      path: page.path + &#039;#&#039; + h.slug,\n      children: h.children || []\n    }))\n  }]\n}\n\nexport function groupHeaders (headers) {\n  \/\/ group h3s under h2\n  headers = headers.map(h =&gt; Object.assign({}, h))\n  let lastH2\n  headers.forEach(h =&gt; {\n    if (h.level === 2) {\n      lastH2 = h\n    } else if (lastH2) {\n      (lastH2.children || (lastH2.children = [])).push(h)\n    }\n  })\n  return headers.filter(h =&gt; h.level === 2)\n}\n\nexport function resolveNavLinkItem (linkItem) {\n  return Object.assign(linkItem, {\n    type: linkItem.items &amp;&amp; linkItem.items.length ? &#039;links&#039; : &#039;link&#039;\n  })\n}\n\n\/**\n * @param { Route } route\n * @param { Array&lt;string|string[]&gt; | Array&lt;SidebarGroup&gt; | [link: string]: SidebarConfig } config\n * @returns { base: string, config: SidebarConfig }\n *\/\nexport function resolveMatchingConfig (regularPath, config) {\n  if (Array.isArray(config)) {\n    return {\n      base: &#039;\/&#039;,\n      config: config\n    }\n  }\n  for (const base in config) {\n    if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) {\n      return {\n        base,\n        config: config[base]\n      }\n    }\n  }\n  return {}\n}\n\nfunction ensureEndingSlash (path) {\n  return \/(\\.html|\\\/)$\/.test(path)\n    ? path\n    : path + &#039;\/&#039;\n}\n\nfunction resolveItem (item, pages, base, groupDepth = 1) {\n  if (typeof item === &#039;string&#039;) {\n    return resolvePage(pages, item, base)\n  } else if (Array.isArray(item)) {\n    return Object.assign(resolvePage(pages, item[0], base), {\n      title: item[1]\n    })\n  } else {\n    const children = item.children || []\n    if (children.length === 0 &amp;&amp; item.path) {\n      return Object.assign(resolvePage(pages, item.path, base), {\n        title: item.title\n      })\n    }\n    return {\n      type: &#039;group&#039;,\n      path: item.path,\n      title: item.title,\n      sidebarDepth: item.sidebarDepth,\n      initialOpenGroupIndex: item.initialOpenGroupIndex,\n      children: children.map(child =&gt; resolveItem(child, pages, base, groupDepth + 1)),\n      collapsable: item.collapsable !== false\n    }\n  }\n}<\/code><\/pre>\n<p><code>Layout.vue<\/code>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-vue\">&lt;template&gt;\n    &lt;div\n            class=&quot;theme-container&quot;\n            :class=&quot;pageClasses&quot;\n            @touchstart=&quot;onTouchStart&quot;\n            @touchend=&quot;onTouchEnd&quot;\n    &gt;\n        &lt;Navbar\n                v-if=&quot;shouldShowNavbar&quot;\n                @toggle-sidebar=&quot;toggleSidebar&quot;\n        \/&gt;\n\n        &lt;div\n                class=&quot;sidebar-mask&quot;\n                @click=&quot;toggleSidebar(false)&quot;\n        \/&gt;\n\n        &lt;Sidebar\n                :items=&quot;sidebarItems&quot;\n                @toggle-sidebar=&quot;toggleSidebar&quot;\n        &gt;\n            &lt;template #top&gt;\n                &lt;slot name=&quot;sidebar-top&quot; \/&gt;\n            &lt;\/template&gt;\n            &lt;template #bottom&gt;\n                &lt;slot name=&quot;sidebar-bottom&quot; \/&gt;\n            &lt;\/template&gt;\n        &lt;\/Sidebar&gt;\n\n        &lt;Home v-if=&quot;$page.frontmatter.home&quot; \/&gt;\n\n        &lt;Page\n                v-else\n                :sidebar-items=&quot;sidebarItems&quot;\n        &gt;\n            &lt;template #top&gt;\n                &lt;slot name=&quot;page-top&quot; \/&gt;\n            &lt;\/template&gt;\n            &lt;template #bottom&gt;\n                &lt;slot name=&quot;page-bottom&quot; \/&gt;\n            &lt;\/template&gt;\n        &lt;\/Page&gt;\n    &lt;\/div&gt;\n&lt;\/template&gt;\n\n&lt;script&gt;\nimport Home from &#039;@theme\/components\/Home.vue&#039;\nimport Navbar from &#039;@theme\/components\/Navbar.vue&#039;\nimport Page from &#039;@theme\/components\/Page.vue&#039;\nimport Sidebar from &#039;@theme\/components\/Sidebar.vue&#039;\nimport { resolveSidebarItems } from &#039;..\/util&#039;\n\nexport default {\n    name: &#039;Layout&#039;,\n\n    components: {\n        Home,\n        Page,\n        Sidebar,\n        Navbar\n    },\n\n    data () {\n        return {\n            isSidebarOpen: false\n        }\n    },\n\n    computed: {\n        shouldShowNavbar () {\n            const { themeConfig } = this.$site\n            const { frontmatter } = this.$page\n            if (\n                frontmatter.navbar === false\n                || themeConfig.navbar === false) {\n                return false\n            }\n            return (\n                this.$title\n                || themeConfig.logo\n                || themeConfig.repo\n                || themeConfig.nav\n                || this.$themeLocaleConfig.nav\n            )\n        },\n\n        shouldShowSidebar () {\n            const { frontmatter } = this.$page\n            return (\n                !frontmatter.home\n                &amp;&amp; frontmatter.sidebar !== false\n                &amp;&amp; this.sidebarItems.length\n            )\n        },\n\n        sidebarItems () {\n            return resolveSidebarItems(\n                this.$page,\n                this.$page.regularPath,\n                this.$site,\n                this.$localePath\n            )\n        },\n\n        pageClasses () {\n            const userPageClass = this.$page.frontmatter.pageClass\n            return [\n                {\n                    &#039;no-navbar&#039;: !this.shouldShowNavbar,\n                    &#039;sidebar-open&#039;: this.isSidebarOpen,\n                    &#039;no-sidebar&#039;: !this.shouldShowSidebar\n                },\n                userPageClass\n            ]\n        }\n    },\n\n    mounted () {\n        this.$router.afterEach(() =&gt; {\n            this.isSidebarOpen = false\n        })\n    },\n\n    methods: {\n        toggleSidebar (to) {\n            this.isSidebarOpen = typeof to === &#039;boolean&#039; ? to : !this.isSidebarOpen\n            this.$emit(&#039;toggle-sidebar&#039;, this.isSidebarOpen)\n        },\n\n        \/\/ side swipe\n        onTouchStart (e) {\n            this.touchStart = {\n                x: e.changedTouches[0].clientX,\n                y: e.changedTouches[0].clientY\n            }\n        },\n\n        onTouchEnd (e) {\n            const dx = e.changedTouches[0].clientX - this.touchStart.x\n            const dy = e.changedTouches[0].clientY - this.touchStart.y\n            if (Math.abs(dx) &gt; Math.abs(dy) &amp;&amp; Math.abs(dx) &gt; 40) {\n                if (dx &gt; 0 &amp;&amp; this.touchStart.x &lt;= 80) {\n                    this.toggleSidebar(true)\n                } else {\n                    this.toggleSidebar(false)\n                }\n            }\n        }\n    }\n}\n&lt;\/script&gt;<\/code><\/pre>\n<p>\u6b64\u65f6\u91cd\u542f\u9879\u76ee\uff0c\u6ca1\u6709\u62a5\u9519\uff0c\u6b63\u5e38\u8fd0\u884c\u7684\u3002<\/p>\n<h4>8.5.2 \u8bbe\u7f6e\u5168\u5c40\u81ea\u52a8\u6dfb\u52a0Vssue\u6807\u7b7e<\/h4>\n<p>\u5728Layout.vue\u4e2d\u7684Page\u6807\u7b7e\uff0c\u627e\u5230bottom\uff0c\u6dfb\u52a0\u4e00\u884c\u4ee3\u7801<code>&lt;Vssue class=&quot;theme-default-content content__default&quot; :options=&quot;{ locale: &#039;zh&#039; }&quot; \/&gt;<\/code>\u3002<\/p>\n<pre><code class=\"language-vue\">&lt;Page\n        v-else\n        :sidebar-items=&quot;sidebarItems&quot;\n>\n    &lt;template #top&gt;\n        &lt;slot name=&quot;page-top&quot; \/&gt;\n    &lt;\/template&gt;\n    &lt;template #bottom&gt;\n        &lt;slot name=&quot;page-bottom&quot; \/&gt;\n        &lt;Vssue class=&quot;theme-default-content content__default&quot; :options=&quot;{ locale: &#039;zh&#039; }&quot; \/&gt;\n    &lt;\/template&gt;\n&lt;\/Page&gt;<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230\u6bcf\u4e2a\u9875\u9762\u6709\u81ea\u52a8\u6709\u4e00\u4e2aVssue\u7684\u8bc4\u8bba\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509140050619.png\" alt=\"image-20240509140050619\" \/><\/p>\n<p>github\u5bf9\u5e94\u9879\u76ee\u4e2d\uff0c\u4e5f\u6709\u4e86\u5bf9\u5e94\u7684\u6587\u7ae0\u7684\u8bc4\u8bba\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509140317197.png\" alt=\"image-20240509140317197\" \/><\/p>\n<h3>8.6 \u9690\u85cf\u654f\u611f\u4fe1\u606f<\/h3>\n<p>\u73b0\u5728\u6709\u4e2a\u81f4\u547d\u7684\u95ee\u9898\u5c31\u662f\uff0c\u6211\u8fd9\u4e2a\u9879\u76ee\u5fc5\u987b\u662fpublic\u7684\uff0c\u8fd9\u4e2a\u8bc4\u8bba\u624d\u751f\u6548\uff0c\u800c\u4e14\u662f\u672c\u5730\u8fd0\u884c\u751f\u6548\u3002\u6211\u4eec\u60f3\u8ba9\u5b83\u53ef\u4ee5\u5728<code>www.huerpu.cc<\/code>\u4e0b\u751f\u6548\uff0c\u5e76\u4e14\u63d0\u4ea4\u5230GitHub\u7684\u6587\u6863\u4e0d\u8ba9\u522b\u4eba\u770b\u5230\u3002<\/p>\n<p>\u9996\u5148\u628a\u8fd9\u4fe9\u5730\u65b9\u6539\u6210\u81ea\u5df1\u7684\u57df\u540d\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728\u5916\u7f51\u751f\u6548\u8bc4\u8bba\u529f\u80fd\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/11\/image-20240511105123896.png\" alt=\"image-20240511105123896\" \/><\/p>\n<p>\u5176\u6b21\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a<code>KelsenComment<\/code>\u7a7a\u7684GitHub\u4ed3\u5e93\uff0c\u5e76\u4e14\u4e3apublic\uff0c\u8fd9\u65f6\u5019\u5c31\u53ef\u4ee5\u628a<code>KelsenJing<\/code>\u4ed3\u5e93\u8bbe\u7f6e\u4e3aprivate\u7684\u4e86\u3002<\/p>\n<p>\u6700\u540e\uff0c\u628a\u63d2\u4ef6\u914d\u7f6e\u91ccrepo\u6539\u6210<code>KelsenComment<\/code>\uff0c\u5373\u53ef\u3002<\/p>\n<pre><code class=\"language-js\">[\n            &#039;@vssue\/vuepress-plugin-vssue&#039;, {\n                \/\/ \u8bbe\u7f6e `platform` \u800c\u4e0d\u662f `api`\n                platform: &#039;github-v4&#039;,\n\n                \/\/ \u5176\u4ed6\u7684 Vssue \u914d\u7f6e\n                owner: &#039;jinglisen&#039;,\n                repo: &#039;KelsenComment&#039;,\n                clientId: &#039;Ov23li40sj0Aqfpe44n5&#039;,\n                clientSecret: &#039;ea2132d27d6f922adce20aca49639bd3abea7190&#039;,\n                autoCreateIssue: true,\n            },\n],<\/code><\/pre>\n<p>\u8fd9\u4e2a<code>KelsenComment<\/code>\u4ed3\u5e93\u5565\u90fd\u6ca1\u6709\uff0c\u5c31\u53ea\u6709\u8bc4\u8bbaissue\u4fe1\u606f\u3002\u539f\u6709\u7684<code>KelsenJing<\/code>\u4ed3\u5e93\u662f\u79c1\u6709\u7684\uff0c\u4f60\u53ef\u4ee5\u968f\u4fbf\u63d0\u4ea4\u4efb\u4f55\u654f\u611f\u4fe1\u606f\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/11\/image-20240511105603053.png\" alt=\"image-20240511105603053\" \/><\/p>\n<h2>\u4e5d\u3001back-to-top<\/h2>\n<p>\u5b89\u88c5\u4e00\u4e0b<code>plugin-back-to-top<\/code>\u63d2\u4ef6\uff0c\u7136\u540e\u5728config.js\u4e2d\u589e\u52a0\u8be5\u63d2\u4ef6\u3002<\/p>\n<pre><code class=\"language-bash\">yarn add -D @vuepress\/plugin-back-to-top\n\nmodule.exports = {\n  plugins: [&#039;@vuepress\/back-to-top&#039;]\n}<\/code><\/pre>\n<p>\u91cd\u542f\u9879\u76ee\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u7bc7\u6587\u7ae0\u5f88\u957f\uff0c\u8fd9\u91cc\u5c31\u6709\u4e00\u4e2a\u5411\u4e0a\u7684\u7eff\u8272\u5c0f\u7bad\u5934\uff0c\u70b9\u51fb\u5c31\u53ef\u4ee5\u56de\u5230\u9876\u90e8\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509141852359.png\" alt=\"image-20240509141852359\" \/><\/p>\n<h2>\u5341\u3001\u6dfb\u52a0\u8c37\u6b4c\u5206\u6790<\/h2>\n<h3>10.1 \u5b89\u88c5\u8c37\u6b4c\u5206\u6790\u63d2\u4ef6<\/h3>\n<p>\u4e0b\u8f7d\u5b89\u88c5<code>@vuepress\/plugin-google-analytics<\/code>\u63d2\u4ef6\uff0c\u5e76\u5728config.js\u4e2d\u5f15\u5165\u63d2\u4ef6\u3002\u5176\u4e2d\u7684ga\u4e0b\u9762\u6709\u4ecb\u7ecd\u3002<\/p>\n<pre><code class=\"language-bash\">yarn add -D @vuepress\/plugin-google-analytics\n\nmodule.exports = {\n  plugins: [\n    [\n      &#039;@vuepress\/google-analytics&#039;,\n      {\n        &#039;ga&#039;: &#039;G-VW5HQQV415&#039; \/\/ UA-00000000-0\n      }\n    ]\n  ]\n}<\/code><\/pre>\n<h3>10.2 \u83b7\u53d6\u8c37\u6b4c\u5206\u6790\u8861\u91cfID<\/h3>\n<p>\u8c37\u6b4c\u5206\u6790\u5730\u5740<code>https:\/\/analytics.google.com\/<\/code>\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/001.png\" alt=\"001\" \/><\/p>\n<p>\u65b0\u5efa\u4e00\u4e2a\u8c37\u6b4c\u5206\u6790\u8d26\u53f7\uff0c\u8fd9\u91cc\u7684\u8861\u91cfID\u7528\u4e8e\u4e0a\u9762\u4ee3\u7801\u7684ga\u5b57\u6bb5\u4ee5\u53cajs\u4e2d\u7684\u90a3\u4e32\u5b57\u7b26\u3002\u70b9\u51fb\u67e5\u770b\u4ee3\u7801\u8bf4\u660e\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/002.png\" alt=\"002\" \/><\/p>\n<h3>10.3 head\u6dfb\u52a0\u8c37\u6b4c\u5206\u6790\u4ee3\u7801<\/h3>\n<p>\u628a\u8fd9\u4e00\u6bb5\u4ee3\u7801\u62f7\u8d1d\u51fa\u6765<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509154759391.png\" alt=\"image-20240509154759391\" \/><\/p>\n<p>\u5728config.js\u7684head\u4e2d\uff0c\u589e\u52a0\u521a\u62f7\u8d1d\u7684\u4ee3\u7801\u3002\u5176\u4e2d\u7684<code>G-195NQR6PDD<\/code>\u66ff\u6362\u6210\u81ea\u5df1\u7684\u8c37\u6b4c\u5206\u6790\u4e2d\u7684\u8861\u91cfID\u3002<\/p>\n<pre><code class=\"language-js\">head: [\n        [&#039;script&#039;, { src: &#039;https:\/\/www.googletagmanager.com\/gtag\/js?id=G-195NQR6PDD&#039; }],\n        \/\/ google\u7edf\u8ba1\n        [\n            &quot;script&quot;,\n            {},\n            `\n            window.dataLayer = window.dataLayer || [];\n            function gtag(){dataLayer.push(arguments);}\n            gtag(&#039;js&#039;, new Date());\n\n            gtag(&#039;config&#039;, &#039;G-195NQR6PDD&#039;);\n            `,\n        ],\n],<\/code><\/pre>\n<p>\u91cd\u65b0\u90e8\u7f72\u597d\u9879\u76ee\uff0c\u70b9\u51fb\u8fd9\u91cc\u7684\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u770b\u5230\u7eff\u8272\u7684\u7bad\u5934\uff0c\u8bc1\u660e\u8c37\u6b4c\u5206\u6790\u751f\u6548\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509155308280.png\" alt=\"image-20240509155308280\" \/><\/p>\n<p>\u56de\u5230\u9996\u9875\uff0c\u53ef\u4ee5\u770b\u5230\u6709\u4e00\u4e2a\u7528\u6237\u8bbf\u95ee\u8fc7\uff0c\u8fd9\u662f\u56e0\u4e3a\u6211\u521a\u521a\u70b9\u51fb\u4e86\u8fd9\u4e2a\u535a\u5ba2\u7f51\u7ad9\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509155111447.png\" alt=\"image-20240509155111447\" \/><\/p>\n<h2>\u5341\u4e00\u3001\u6dfb\u52a0\u767e\u5ea6\u5206\u6790<\/h2>\n<h3>11.1 \u6dfb\u52a0\u767e\u5ea6\u7edf\u8ba1<\/h3>\n<p>\u5728\u767e\u5ea6\u7edf\u8ba1\u8d26\u53f7\u4e2d\uff0c\u9009\u62e9\u65b0\u589e\u7f51\u7ad9\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509182421519.png\" alt=\"image-20240509182421519\" \/><\/p>\n<p>\u586b\u5165\u4f60\u7684\u57df\u540d\u4e0e\u7f51\u7ad9\u4fe1\u606f\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509182631666.png\" alt=\"image-20240509182631666\" \/><\/p>\n<p>\u628a\u8fd9\u91cc\u7684\u4ee3\u7801\u590d\u5236\u4e0b\u6765\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509182712528.png\" alt=\"image-20240509182712528\" \/><\/p>\n<p>\u628a\u4ee3\u7801\u653e\u5165config.js\u4e2d\u7684head\uff0c\u91cd\u65b0\u90e8\u7f72\u5373\u53ef\u3002\u591a\u7b80\u5355\u3002<\/p>\n<pre><code class=\"language-js\">\/\/ \u767e\u5ea6\u7edf\u8ba1\n[\n    &quot;script&quot;,\n    {},\n    `\n    var _hmt = _hmt || [];\n    (function() {\n      var hm = document.createElement(&quot;script&quot;);\n      hm.src = &quot;https:\/\/hm.baidu.com\/hm.js?36ab8e66b824759611096f4c91f3e584&quot;;\n      var s = document.getElementsByTagName(&quot;script&quot;)[0]; \n      s.parentNode.insertBefore(hm, s);\n    })();\n  `,\n],<\/code><\/pre>\n<p>\u91cd\u65b0\u90e8\u7f72\u4e4b\u540e\uff0c\u8bbf\u95ee\u7f51\u9875\uff0c\u67e5\u770b\u6e90\u7801\uff0c\u53ef\u4ee5\u770b\u5230\u8fd9\u6bb5\u4ee3\u7801\u5df2\u7ecf\u6709\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/09\/image-20240509183347291.png\" alt=\"image-20240509183347291\" \/><\/p>\n<p>\u6dfb\u52a0\u597d\u4e86\u4e4b\u540e\u7acb\u9a6c\u53bb\u770b\u662f\u6ca1\u6709\u6548\u679c\u7684\uff0c\u4e0b\u9762\u662f\u7b2c\u4e8c\u5929\u53bb\u770b\u7684\u65f6\u5019\u7684\u7edf\u8ba1\uff0c\u53ef\u4ee5\u770b\u5230\u6709\u4e00\u70b9\u70b9\u6570\u636e\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510102804229.png\" alt=\"image-20240510102804229\" \/><\/p>\n<h3>11.2 \u4e3a\u6bcf\u4e2a\u9875\u9762\u6dfb\u52a0\u767e\u5ea6\u7edf\u8ba1<\/h3>\n<p>\u767e\u5ea6\u7edf\u8ba1\u6dfb\u52a0, \u8003\u8651\u5728\u6bcf\u4e2a\u9875\u9762\u70b9\u51fb\u65f6\u4f5c\u8bb0\u5f55\uff0c\u5728<code>theme\/enhanceApp.js<\/code>\u4e2d\u62e6\u622arouter\uff0c<\/p>\n<pre><code class=\"language-js\">export default ({router}) =&gt; {\n    router.beforeEach((to, from, next) =&gt; {\n        \/\/\u5bf9\u6bcf\u4e2a\u9875\u9762\u70b9\u51fb\u6dfb\u52a0\u767e\u5ea6\u7edf\u8ba1\n        if(typeof _hmt!=&#039;undefined&#039;){\n            if (to.path) {\n                _hmt.push([&#039;_trackPageview&#039;, to.fullPath]);\n            }\n        }\n\n        \/\/ continue\n        next();     \n    })\n};<\/code><\/pre>\n<h3>11.3 \u6dfb\u52a0\u767e\u5ea6\u7ad9\u70b9\u81ea\u52a8\u63a8\u9001<\/h3>\n<pre><code class=\"language-js\">yarn add -D vuepress-plugin-baidu-autopush\n\nmodule.exports = {\n  plugins: [\n    &#039;vuepress-plugin-baidu-autopush&#039;\n  ]\n};<\/code><\/pre>\n<h2>\u5341\u4e8c\u3001config.js\u62c6\u5206<\/h2>\n<p>\u968f\u7740\u9879\u76ee\u7684\u9010\u6b65\u6269\u5927\uff0cconfig.js\u540e\u9762\u4f1a\u7206\u70b8\u5f0f\u589e\u957f\uff0c\u4e3a\u4e86\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u628aconfig.js\u5206\u5272\u4e00\u4e0b\uff0c\u5f04\u6210\u51e0\u4e2a\u5355\u72ec\u7684\u6587\u4ef6\u8fdb\u884c\u4f7f\u7528\u3002<\/p>\n<pre><code class=\"language-tree\">\/\/.vuepress\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u7ed3\u6784\n\u2502  config.js\n\u2502  \n\u251c\u2500config\n\u2502      headConfig.js\n\u2502      navConfig.js\n\u2502      pluginsConfig.js\n\u2502      sidebarConfig.js\n\u2502\n\u251c\u2500public\n\u2502      beauty.jpg\n\u2502      favicon.ico\n\u2502      kelsen.png\n\u2502\n\u2514\u2500theme\n    \u2502  index.js\n    \u2502\n    \u251c\u2500layouts\n    \u2502      Layout.vue\n    \u2502\n    \u2514\u2500util\n            index.js<\/code><\/pre>\n<p>\u5728.vuepress\u76ee\u5f55\u4e0b\u521b\u5efaconfig\u6587\u4ef6\u5939\uff0c\u8be5\u6587\u4ef6\u5939\u4e0b\u521b\u5efa<code>headConfig.js<\/code>\u3001<code>navConfig.js<\/code>\u3001<code>pluginsConfig.js<\/code>\u3001<code>sidebarConfig.js<\/code>\u3002<\/p>\n<p><code>headConfig.js<\/code><\/p>\n<pre><code class=\"language-js\">module.exports = [\n    [&#039;link&#039;, { rel: &#039;icon&#039;, href: &#039;\/kelsen.png&#039; }],\n    \/\/ SEO\n    [\n        &quot;meta&quot;,\n        {\n            name: &quot;keywords&quot;,\n            content:\n                &quot;\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66, Java\u540e\u7aef\u5f00\u53d1\u5de5\u7a0b\u5e08, \u540e\u7aef\u5f00\u53d1\u5de5\u7a0b\u5e08, Java, \u7f16\u7a0b\u5bfc\u822a, \u524d\u7aef, \u5f00\u53d1, \u7f16\u7a0b\u5206\u4eab, \u9879\u76ee, IT, \u6c42\u804c, \u9762\u7ecf&quot;,\n        },\n    ],\n    [&quot;meta&quot;, {name: &quot;robots&quot;, content: &quot;all&quot;}],\n    [&quot;meta&quot;, {name: &quot;author&quot;, content: &quot;Kelsen&quot;}],\n    [&quot;meta&quot;, {name: &quot;apple-mobile-web-app-capable&quot;, content: &quot;yes&quot;}],\n    [&#039;script&#039;, { src: &#039;https:\/\/www.googletagmanager.com\/gtag\/js?id=G-195NQR6PDD&#039; }],\n    \/\/ google\u7edf\u8ba1\n    [\n        &quot;script&quot;,\n        {},\n        `\n            window.dataLayer = window.dataLayer || [];\n            function gtag(){dataLayer.push(arguments);}\n            gtag(&#039;js&#039;, new Date());\n\n            gtag(&#039;config&#039;, &#039;G-195NQR6PDD&#039;);\n            `,\n    ],\n\n    \/\/ \u767e\u5ea6\u7edf\u8ba1\n    [\n        &quot;script&quot;,\n        {},\n        `\n            var _hmt = _hmt || [];\n            (function() {\n              var hm = document.createElement(&quot;script&quot;);\n              hm.src = &quot;https:\/\/hm.baidu.com\/hm.js?36ab8e66b824759611096f4c91f3e584&quot;;\n              var s = document.getElementsByTagName(&quot;script&quot;)[0]; \n              s.parentNode.insertBefore(hm, s);\n            })();\n          `,\n    ],\n\n]<\/code><\/pre>\n<p><code>navConfig.js<\/code><\/p>\n<pre><code class=\"language-js\">module.exports = [\n    { text: &#039;Home&#039;, link: &#039;\/&#039; },\n    { text: &#039;Guide&#039;, link: &#039;\/guide\/&#039; },\n    {\n        text: &#039;SpringCloud\u7cfb\u5217\u6559\u7a0b&#039;,\n        items: [\n            {\n                text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                items: [\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0eureka&#039;, link: &#039;\/SpringCloudFinchley\/Spring-Cloud-Finchley-version-series-of-tutorials-1-Service-registration-and-discovery-eureka.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u5ba2\u6237\u7aef\u8d1f\u8f7d\u5747\u8861Ribbon&#039;, link: &#039;\/SpringCloudFinchley\/Spring-Cloud-Finchley-Version-Series-Tutorial-2-Client-Load-Balancing-Ribbon.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloudFinchley\/Spring-Cloud-Finchley-Edition-Series-Tutorial-3-Service-Consumer-OpenFeign.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668Hystrix&#039;, link: &#039;\/SpringCloudFinchley\/Spring-Cloud-Finchley-version-series-tutorial-4-Hystrix-circuit-breaker.md&#039; },\n                    { text: &#039;Spring Cloud(Finchley\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e94) \u670d\u52a1\u7f51\u5173Zuul&#039;, link: &#039;\/SpringCloudFinchley\/Spring-Cloud-Finchley-Version-Series-Tutorial-5-Service-Gateway-Zuul.md&#039; },\n                ]\n            },\n            {\n                text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b&#039;,\n                items: [\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e00) \u670d\u52a1\u6ce8\u518c\u4e0e\u53d1\u73b0eureka&#039;, link: &#039;\/SpringCloudKilburn\/Spring-Cloud-Kilburn-2022-Edition-Tutorial-Series-1-Service-Registration-and-Discovery-Eureka.md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e8c) \u670d\u52a1\u6d88\u8d39\u8005(RestTemplate+Loadbalancer)&#039;, link: &#039;\/SpringCloudKilburn\/Spring-Cloud-Kilburn-2022-Tutorial-Series-2-Service-Consumers-RestTemplate-LoadBalancer.md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u4e09) \u670d\u52a1\u6d88\u8d39\u8005(OpenFeign)&#039;, link: &#039;\/SpringCloudKilburn\/Spring-Cloud-Kilburn-2022-Tutorial-Series-3-Service-Consumer-OpenFeign.md&#039; },\n                    { text: &#039;Spring Cloud(Kilburn 2022.0.2\u7248\u672c)\u7cfb\u5217\u6559\u7a0b(\u56db) \u65ad\u8def\u5668(Resilience4JCircuitBreaker\u3001RetryCircuitBreaker)&#039;, link: &#039;\/SpringCloudKilburn\/Spring-Cloud-Kilburn-2022-Tutorial-Series-4-Circuit-Breakers-Resilience4JCircuitBreaker-RetryCircuit-Breaker.md&#039; },\n                ]\n            },\n\n        ]\n    },\n    {\n        text: &#039;SpringBoot\u6574\u5408\u7cfb\u5217\u6559\u7a0b&#039;,\n        items:[\n            { text: &#039;SpringBoot\u6574\u5408MyBatis&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-MyBatis&#039; },\n            { text: &#039;SpringBoot\u6574\u5408Redis&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-Redis&#039; },\n            { text: &#039;SpringBoot\u6574\u5408es&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-es&#039; },\n            { text: &#039;SpringBoot\u6574\u5408thymeleaf&#039;, link: &#039;\/SpringBoot\/SpringBoot-integrates-thymeleaf&#039; },\n        ]\n    },\n    { text: &#039;About&#039;, link: &#039;\/about&#039; },\n]<\/code><\/pre>\n<p><code>pluginsConfig.js<\/code><\/p>\n<pre><code class=\"language-js\">const moment = require(&#039;moment&#039;);\n\nmodule.exports = [\n    [\n        &#039;@vuepress\/last-updated&#039;,\n        {\n            transformer: (timestamp, lang) =&gt; {\n                \/\/ \u4e0d\u8981\u5fd8\u4e86\u5b89\u88c5 moment\n                const moment = require(&#039;moment&#039;)\n                moment.locale(&#039;zh-cn&#039;)\n                return moment(timestamp).format(&quot;LLL&quot;)\n            }\n        }\n    ],\n\n    [\n        &#039;@vssue\/vuepress-plugin-vssue&#039;, {\n        \/\/ \u8bbe\u7f6e `platform` \u800c\u4e0d\u662f `api`\n        platform: &#039;github-v4&#039;,\n\n        \/\/ \u5176\u4ed6\u7684 Vssue \u914d\u7f6e\n        owner: &#039;jinglisen&#039;,\n        repo: &#039;KelsenJing&#039;,\n        clientId: &#039;Ov23li40sj0Aqfpehqn5&#039;,\n        clientSecret: &#039;ea2132d27d6f9a1adce20aca49639bd3abea7190&#039;,\n        autoCreateIssue: true,\n    },\n    ],\n\n    [&#039;@vuepress\/back-to-top&#039;],\n\n    [\n        &#039;@vuepress\/google-analytics&#039;,\n        {\n            &#039;ga&#039;: &#039;G-195NQR6PDD&#039; \/\/ UA-00000000-0\n        }\n    ],\n\n]<\/code><\/pre>\n<p><code>sidebarConfig.js<\/code><\/p>\n<pre><code class=\"language-js\">module.exports = {\n    &quot;\/SpringCloudFinchley\/&quot;: [\n        &#039;Spring-Cloud-Finchley-version-series-of-tutorials-1-Service-registration-and-discovery-eureka&#039;,\n        &#039;Spring-Cloud-Finchley-Version-Series-Tutorial-2-Client-Load-Balancing-Ribbon&#039;,\n        &#039;Spring-Cloud-Finchley-Edition-Series-Tutorial-3-Service-Consumer-OpenFeign&#039;,\n        &#039;Spring-Cloud-Finchley-version-series-tutorial-4-Hystrix-circuit-breaker&#039;,\n        &#039;Spring-Cloud-Finchley-Version-Series-Tutorial-5-Service-Gateway-Zuul&#039;\n    ],\n    &quot;\/SpringCloudKilburn\/&quot;: [\n        &#039;Spring-Cloud-Kilburn-2022-Edition-Tutorial-Series-1-Service-Registration-and-Discovery-Eureka&#039;,\n        &#039;Spring-Cloud-Kilburn-2022-Tutorial-Series-2-Service-Consumers-RestTemplate-LoadBalancer&#039;,\n        &#039;Spring-Cloud-Kilburn-2022-Tutorial-Series-3-Service-Consumer-OpenFeign&#039;,\n        &#039;Spring-Cloud-Kilburn-2022-Tutorial-Series-4-Circuit-Breakers-Resilience4JCircuitBreaker-RetryCircuit-Breaker&#039;,\n    ],\n    &quot;\/SpringBoot\/&quot;: [\n        &#039;SpringBoot-integrates-MyBatis&#039;,\n        &#039;SpringBoot-integrates-es&#039;,\n        &#039;SpringBoot-integrates-Redis&#039;,\n        &#039;SpringBoot-integrates-thymeleaf&#039;\n    ]\n}<\/code><\/pre>\n<p>config.js\u4e2d\u5bfc\u5165\u56db\u4e2ajs\u6587\u4ef6<\/p>\n<pre><code class=\"language-js\">const headConf = require(&#039;.\/config\/headConfig&#039;);\nconst navConfig = require(&#039;.\/config\/navConfig&#039;);\nconst sidebarConfig = require(&#039;.\/config\/sidebarConfig&#039;);\nconst pluginsConfig = require(&#039;.\/config\/pluginsConfig&#039;);<\/code><\/pre>\n<p>\u5e76\u5728\u56db\u4e2a\u914d\u7f6e\u9879\u7684\u5bf9\u5e94\u4f4d\u7f6e\uff0c\u505a\u53d8\u91cf\u66ff\u6362\u5f15\u7528\u3002<\/p>\n<pre><code class=\"language-js\">head: headConf,\nnav: navConfig,    \nsidebar: sidebarConfig,    \nplugins: pluginsConfig,    <\/code><\/pre>\n<p>\u6700\u7ec8\u7684config.js\u6587\u4ef6\u5982\u4e0b\uff0c\u662f\u4e0d\u662f\u6e05\u723d\u4e86\u8bb8\u591a\u3002<\/p>\n<pre><code class=\"language-js\">const headConf = require(&#039;.\/config\/headConfig&#039;);\nconst navConfig = require(&#039;.\/config\/navConfig&#039;);\nconst sidebarConfig = require(&#039;.\/config\/sidebarConfig&#039;);\nconst pluginsConfig = require(&#039;.\/config\/pluginsConfig&#039;);\n\nmodule.exports = {\n    lang: &#039;en-zh&#039;,\n    title: &#039;\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66&#039;,\n    description: &#039;KelsenJing Blog&#039;,\n    base: &quot;\/&quot;,\n    dest: &#039;dist&#039;,\n\n    head: headConf,\n\n    themeConfig: {\n        logo: &#039;\/kelsen.png&#039;,\n        lastUpdated: &#039;\u6700\u8fd1\u66f4\u65b0&#039;,\n        nav: navConfig,\n        sidebarDepth: 6,\n        displayAllHeaders: true,\n        sidebar: sidebarConfig,\n\n    },\n\n    markdown: {\n        \/\/ \u5f00\u542f\u4ee3\u7801\u5757\u7684\u884c\u53f7\n        lineNumbers: true,\n        \/\/ \u652f\u6301 4 \u7ea7\u4ee5\u4e0a\u7684\u6807\u9898\u6e32\u67d3\n        extractHeaders: [&quot;h2&quot;, &quot;h3&quot;, &quot;h4&quot;, &quot;h5&quot;, &quot;h6&quot;],\n    },\n\n    plugins: pluginsConfig,\n\n}<\/code><\/pre>\n<h2>\u5341\u4e09\u3001\u56fe\u7247\u81ea\u52a8\u7f29\u653e\u63d2\u4ef6<\/h2>\n<p>\u5b89\u88c5\u63d2\u4ef6\uff0c\u5e76\u5728plugins\u4e2d\u5f15\u5165\u3002<\/p>\n<pre><code class=\"language-shell\">yarn add -D @vuepress\/plugin-medium-zoom\n\nmodule.exports = {\n  plugins: [&#039;@vuepress\/medium-zoom&#039;]\n}<\/code><\/pre>\n<p>\u628a\u9f20\u6807\u653e\u5728\u56fe\u7247\u4e0a\uff0c\u4f1a\u6709\u4e00\u4e2a\u5341\u5b57\u578b\u7684\u6807\u8bc6\uff0c\u70b9\u51fb\u5c31\u53ef\u4ee5\u653e\u5927\u56fe\u7247\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510114024972.png\" alt=\"image-20240510114024972\" \/><\/p>\n<h2>\u5341\u56db\u3001\u4fa7\u8fb9\u680f\u83dc\u5355\u9009\u4e2d\u63d2\u4ef6<\/h2>\n<p>\u9875\u9762\u6eda\u52a8\u65f6\u81ea\u52a8\u6fc0\u6d3b\u4fa7\u8fb9\u680f\u94fe\u63a5\u7684\u63d2\u4ef6<\/p>\n<pre><code class=\"language-js\">yarn add -D @vuepress\/plugin-active-header-links\n\nmodule.exports = {\n  plugins: [&#039;@vuepress\/active-header-links&#039;]\n}<\/code><\/pre>\n<p>\u5728\u9605\u8bfb\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4fa7\u8fb9\u680f\u4f1a\u6839\u636e\u4f60\u7684\u9605\u8bfb\u901f\u5ea6\uff0c\u9009\u4e2d\u5f53\u524d\u7684\u9605\u8bfb\u76ee\u5f55\uff0c\u53d8\u6210\u7eff\u8272\u7684\uff0c\u6307\u793a\u4f60\u9605\u8bfb\u5230\u7684\u5f53\u524d\u4f4d\u7f6e\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510124537085.png\" alt=\"image-20240510124537085\" \/><\/p>\n<h2>\u5341\u4e94\u3001\u4e2d\u6587\u6807\u7b7e\u6216\u5176\u4ed6\u8def\u5f84\u5f15\u53d1\u7684404\u95ee\u9898<\/h2>\n<p>\u5982\u679cMarkdown\u6587\u4ef6\u540d\u6709\u4e2d\u6587\u5b57\u7b26\u6216\u8005\u7279\u6b8a\u5b57\u7b26\uff0c\u4f1a\u5f15\u53d1\u627e\u4e0d\u5230\u6587\u4ef6\u8def\u5f84\u7684\u95ee\u9898\uff0c\u6211\u4eec\u89e3\u51b3\u4e00\u4e0b\u3002\u4fee\u6539Layout.vue\u4e2d\u7684mounted()\u65b9\u6cd5\uff0c\u4fee\u6539\u6210\u4e0b\u9762\u7684\u3002<\/p>\n<pre><code class=\"language-js\">mounted() {\n        let routes = [this.$author._metaMap, this.$tag._metaMap],\n            routeList = []; \/\/ \u5c06\u6240\u6709\u5305\u542b\u4e2d\u6587\u9700\u8981\u91cd\u65b0\u5339\u914d\u7684 router path \u5199\u5165\u4e00\u4e2a\u6570\u7ec4\u4e2d\n        routes.forEach((route) =&gt; { \/\/ \u904d\u5386\u5c06\u5bf9\u8c61\u7cc5\u5408\u6210\u4e00\u4e2a\u6570\u7ec4\n            Object.keys(route).forEach((key) =&gt; {\n                routeList.push(route[key].path);\n            });\n        });\n        if(routeList.includes(this.$route.params.pathMatch)){ \/\/ \u5224\u65ad\u662f\u5426\u5b58\u5728\u5f53\u524d route \uff0c\u5b58\u5728\u5219\u8df3\u8f6c\n            this.$router.push(this.$route.params.pathMatch)\n        }\n},<\/code><\/pre>\n<p>\u628a\u6587\u6863\u8def\u5f84\u6539\u6210\u6709\u7279\u6b8a\u5b57\u7b26&amp;\u3001\u7a7a\u683c\u3001\u62ec\u53f7\u7b49\uff0c\u90fd\u53ef\u4ee5\u6b63\u786e\u5b9a\u4f4d\u5230md\u6587\u6863\u8def\u5f84\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510163019435.png\" alt=\"image-20240510163019435\" \/><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510163121073.png\" alt=\"image-20240510163121073\" \/><\/p>\n<blockquote>\n<p>\u53c2\u8003\u4e8ehttps:\/\/110501.com\/2021\/05\/06\/support-chinese-tags-on-vuepress\/<\/p>\n<\/blockquote>\n<h2>\u5341\u516d\u3001\u6dfb\u52a0\u7981\u6b62\u7f51\u9875\u5185\u5bb9\u590d\u5236<\/h2>\n<p>\u53ef\u4ee5\u8bbe\u7f6e\u522b\u4eba\u4e0d\u80fd\u590d\u5236\u4f60\u7684\u7f51\u9875\u5185\u5bb9\uff0c\u6216\u8005\u9650\u5236\u590d\u5236\u7684\u957f\u5ea6\u3002<\/p>\n<pre><code class=\"language-js\">yarn  add vuepress-plugin-copyright\n\nmodule.exports = {\n  plugins: [\n    [\n        &#039;copyright&#039;,\n        {\n            \/\/ \u66f4\u591a\u914d\u7f6e\u9879\u4ee5\u53ca\u914d\u7f6e\u9879\u8bf4\u660e\u4e0a https:\/\/github.com\/vuepress\/vuepress-plugin-copyright \u67e5\u770b\n            noCopy: false, \/\/ \u662f\u5426\u7981\u6b62\u590d\u5236\n            minLength: 150,  \/\/ \u89e6\u53d1\u526a\u8d34\u677f\u7ec4\u4ef6\u6216noCopy\u6548\u679c\u7684\u6700\u5c0f\u6587\u672c\u957f\u5ea6\n            disabled: true,  \/\/ \u662f\u5426\u9ed8\u8ba4\u7981\u7528\u8fd9\u4e2a\u63d2\u4ef6\u7684\u529f\u80fd\n            noSelect: true, \/\/ \u662f\u5426\u7981\u6b62\u9009\u62e9\n            authorName: {\n                &#039;zh-CN&#039;: &#039;\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66&#039;,\n                &#039;en-US&#039;: &#039;Kelsen&#039;,\n            },\n        },\n    ],\n  ],\n}<\/code><\/pre>\n<h2>\u5341\u4e03\u3001\u6dfb\u52a0\u4ee3\u7801\u62f7\u8d1d<\/h2>\n<p>\u505a\u4e3a\u7a0b\u5e8f\u5458\u7684\u7f51\u7ad9\uff0c\u4ee3\u7801\u62f7\u8d1d\u662f\u5fc5\u987b\u7684\u3002<\/p>\n<pre><code class=\"language-js\">yarn add -D  vuepress-plugin-code-copy\n\nmodule.exports = {\n    plugins: [[&#039;vuepress-plugin-code-copy&#039;, true]]\n}<\/code><\/pre>\n<p>\u4f1a\u6709\u4e00\u4e2a\u62f7\u8d1d\u7684\u5c0f\u56fe\u6807\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/10\/image-20240510172612461.png\" alt=\"image-20240510172612461\" \/><\/p>\n<h2>\u5341\u516b\u3001\u53f3\u4fa7\u8fb9\u680f\u8bbe\u7f6e\u60ac\u6d6e\u7a97<\/h2>\n<p>\u5728config\u6587\u4ef6\u5939\u4e0b\u589e\u52a0<code>extraSideBar.js<\/code><\/p>\n<pre><code class=\"language-vue\">module.exports = [\n    {\n        title: &quot;\u516c\u4f17\u53f7&quot;,\n        icon: &quot;\/icon\/gongzhonghao.png&quot;,\n        popoverTitle: &quot;\u6b22\u8fce\u5173\u6ce8\u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66\u5fae\u4fe1\u516c\u4f17\u53f7&quot;,\n        popoverUrl:\n            &quot;\/gongzhonghao.jpg&quot;,\n        popoverDesc: &quot;\u5173\u6ce8\u516c\u4f17\u53f7\u67e5\u770b\u66f4\u591a\u5185\u5bb9&quot;,\n    },\n    {\n        title: &quot;\u5fae\u535a&quot;,\n        icon: &quot;\/icon\/WeiBo.png&quot;,\n        popoverTitle:\n            &#039;&lt;span style=&quot;font-size:0.8rem;font-weight:bold;&quot;&gt;&lt;span style=&quot;color:red;&quot;&gt;\u626b\u7801\u5173\u6ce8&lt;\/span&gt;\u7cbe\u5f69\u751f\u6d3b\u5c3d\u5728\u6b64&lt;\/span&gt;&#039;,\n        popoverUrl:\n            &quot;\/WeiBo.jpg&quot;,\n        popoverDesc: &quot;\u5206\u4eab\u65e5\u5e38\uff0c\u4e0e\u4f60\u5171\u540c\u6210\u957f&quot;,\n    },\n    {\n        title: &quot;\u4ea4\u6d41\u7fa4&quot;,\n        icon: &quot;\/icon\/weixin.png&quot;,\n        popoverTitle:\n            &#039;&lt;span style=&quot;font-size:0.8rem;font-weight:bold;&quot;&gt;\u626b\u7801\u6dfb\u52a0 &lt;span style=&quot;color:red;&quot;&gt;\u51ef\u5c14\u68ee\u5c0f\u52a9\u624b\u5fae\u4fe1&lt;\/span&gt;\uff0c\u62c9\u4f60\u8fdb\u4ea4\u6d41\u7fa4&lt;\/span&gt;&#039;,\n        popoverUrl:\n            &quot;\/WeChat.jpg&quot;,\n    },\n    {\n        title: &quot;\u8bfb\u4e66\u4f1a&quot;,\n        icon: &quot;\/icon\/Reading.png&quot;,\n        popoverTitle:\n            &#039;&lt;span style=&quot;font-size:0.8rem;font-weight:bold;&quot;&gt;\u626b\u7801\u6dfb\u52a0\uff0c\u56de\u590d&lt;span style=&quot;color:red;&quot;&gt;\u9605\u8bfb&lt;\/span&gt;\u62c9\u4f60\u8fdb\u8bfb\u4e66\u7fa4&lt;\/span&gt;&#039;,\n        popoverUrl: &quot;\/WeChat.jpg&quot;,\n\n    },\n    {\n        title: &quot;\u652f\u6301\u6211&quot;,\n        icon: &quot;\/icon\/SupportMe.png&quot;,\n        popoverTitle:\n            &#039; &lt;span style=&quot;font-size:0.8rem;font-weight:bold;&quot;&gt;\u9f13\u52b1\u548c\u8d5e\u8d4f\u6211&lt;\/span&gt;&#039;,\n        popoverUrl:\n            &quot;\/SupportMe.jpg&quot;,\n        popoverDesc:\n            &quot;\u611f\u8c22\u60a8\u7684\u652f\u6301\uff0c\u4e07\u5206\u611f\u8c22&quot;,\n    },\n];<\/code><\/pre>\n<p>\u5728config.js\u4e2d\u914d\u7f6eextraSideBar<\/p>\n<pre><code class=\"language-js\">const extraSideBar = require(&#039;.\/config\/extraSideBar&#039;);\nthemeConfig: {\n        extraSideBar: extraSideBar,\n},<\/code><\/pre>\n<p>\u5728Layout.vue\u4e2d\u589e\u52a0\u914d\u7f6e<\/p>\n<pre><code class=\"language-vue\">&lt;Page\n            v-else\n            :sidebar-items=&quot;sidebarItems&quot;\n            :page-sidebar-items=&quot;pageSidebarItems&quot;\n        &gt;\n    &lt;template #top&gt;\n        &lt;slot name=&quot;page-top&quot; \/&gt;\n\n    &lt;\/template&gt;\n    &lt;template #bottom&gt;\n        &lt;slot name=&quot;page-bottom&quot; \/&gt;\n        &lt;Footer \/&gt;\n    &lt;\/template&gt;\n&lt;\/Page&gt;\n\n&lt;PageSidebar\n            v-if=&quot;shouldShowPageSidebar&quot;\n            :page-sidebar-items=&quot;pageSidebarItems&quot;\n            :sidebar-items=&quot;sidebarItems&quot;\n        &gt;\n&lt;\/PageSidebar&gt;\n&lt;script&gt;\nimport PageSidebar from &#039;@theme\/components\/ExtraSidebar.vue&#039;\nimport { resolveSidebarItems, resolveHeaders } from &#039;..\/util&#039;\ncomponents: { Home, Page, Sidebar, Navbar, PageSidebar },\nshouldShowPageSidebar (){\n    const { frontmatter } = this.$page\n\n    return (\/\/false&amp;&amp;\n        !frontmatter.home\n        &amp;&amp; frontmatter.sidebar !== false\n        &amp;&amp; this.pageSidebarItems.length\n    )\n},\npageSidebarItems () {\n        return resolveHeaders(this.$page)\n},\n&lt;\/script&gt;<\/code><\/pre>\n<p>\u5728theme\u4e0b\u7684index.js\u4fee\u6539\u4e00\u4e0b\u8fd9\u4e2a\u51fd\u6570\uff0c\u589e\u52a0\u4e00\u4e2a\u5173\u952e\u5b57export\u3002<\/p>\n<pre><code class=\"language-js\">export function resolveHeaders (page) {\n  const headers = groupHeaders(page.headers || [])\n  return [{\n    type: &#039;group&#039;,\n    collapsable: false,\n    title: page.title,\n    path: null,\n    children: headers.map(h =&gt; ({\n      type: &#039;auto&#039;,\n      title: h.title,\n      basePath: page.path,\n      path: page.path + &#039;#&#039; + h.slug,\n      children: h.children || []\n    }))\n  }]\n}<\/code><\/pre>\n<p>\u5728theme\u4e0b\u521b\u5efa\u6587\u4ef6\u5939<code>components<\/code>\uff0c\u5e76\u5728\u6b64\u6587\u4ef6\u5939\u4e0b\u521b\u5efa<code>Page.vue<\/code>\u548c<code>ExtraSidebar.vue<\/code>\u3002<\/p>\n<p><code>Page.vue<\/code><\/p>\n<pre><code class=\"language-vue\">&lt;template&gt;\n  &lt;main class=&quot;page&quot;&gt;\n    &lt;slot name=&quot;top&quot; \/&gt;\n      &lt;div class=&quot;content&quot;&gt;\n          &lt;div style=&quot;width:100%&quot;&gt;\n              &lt;Content class=&quot;theme-default-content custom-content&quot;  \/&gt;\n              &lt;PageEdit style=&quot;margin: 0&quot;\/&gt;\n\n              &lt;PageNav v-bind=&quot;{ sidebarItems }&quot; \/&gt;\n          &lt;\/div&gt;\n\n      &lt;\/div&gt;\n\n    &lt;slot name=&quot;bottom&quot; \/&gt;\n  &lt;\/main&gt;\n&lt;\/template&gt;\n\n&lt;script&gt;\nimport PageEdit from &#039;@theme\/components\/PageEdit.vue&#039;\nimport PageNav from &#039;@theme\/components\/PageNav.vue&#039;\n\nexport default {\n  components: { PageEdit, PageNav },\n  props: [&#039;sidebarItems&#039;, &#039;pageSidebarItems&#039;],\n  mounted() {\n    console.log(this.$site,this, &#039;this.$site&#039;)\n  }\n}\n&lt;\/script&gt;\n\n&lt;style lang=&quot;stylus&quot;&gt;\n@require &#039;..\/styles\/wrapper.styl&#039;\n\n@media (max-width: 1435px)\n  .toc-container-sidebar\n    display none !important\n\n@media (max-width: $MQMobile)\n  .toc-container-sidebar\n    display none\n.content-page\n  position relative\n.custom-content\n  padding-right 16px !important\n.content\n  display flex\n  justify-content space-around\n  margin 0 auto\n  li, a , p, span\n    word-wrap break-word\n.theme-default-content\n  margin 0 !important\n\n.page\n  display block\n  position relative\n  \/\/height 100vw\n  \/\/width 100vw\n  \/\/overflow scroll\n.toc-container-sidebar\n\n  order 2\n  width 100%\n  flex-grow 1\n  \/\/padding-left 32px\n  display: block;\n  position: relative;\n  color $textColor\n  \/\/: calc(100vw - 460px);\n  top: 80px;\n  max-width: 240px;\n  background transparent\n  margin-right: 10px;\n  margin-left: 0;\n  .on\n    display: block;\n  .pos-box\n    position: fixed;\n    padding: 16px;\n    top 80px;\n    height 100vh\n    overflow-x hidden\n    overflow-y auto\n\n    .icon-arrow\n      position: relative;\n      margin-left: -20px;\n    .scroll-box\n      overflow-x: hidden;\n      overflow-y: hidden;\n      &amp; &gt; div:first-child\n        overflow-x scroll\n        white-space: nowrap;\n        text-overflow ellipsis\n      hr\n        margin-top: 0.5rem\n      .toc-box\n        max-height:81vh;\n        verflow-y: auto;\n        overflow-x: hidden;\n        width: 238px;\n        padding-right: 16px;\n        -webkit-box-sizing: border-box;\n        box-sizing: border-box;\n      &amp; &gt; ol\n        margin-top: -8px;\n        li\n          margin-top: 8px;\n          line-height: 17px;\n          text-align: left;\n          overflow: auto;\n          text-overflow: ellipsis;\n          font-size: 12px;\n          white-space: nowrap;\n        .sub-box\n          margin-top: 0;\n        &amp; &gt; ol &gt; li\n          padding-left: 15px;\n\n&lt;\/style&gt;<\/code><\/pre>\n<p><code>ExtraSidebar.vue<\/code><\/p>\n<pre><code class=\"language-vue\">&lt;script src=&quot;..\/util\/index.js&quot;&gt;&lt;\/script&gt;\n&lt;template xmlns=&quot;http:\/\/www.w3.org\/1999\/html&quot;&gt;\n  &lt;aside class=&quot;page-sidebar&quot;&gt;\n    &lt;slot name=&quot;top&quot;\/&gt;\n      &lt;div class=&quot;page-side-toolbar&quot;&gt;\n          &lt;div v-for=&quot;(item, index) in list&quot; :key=&quot;index&quot; class=&quot;option-box&quot; @mouseover=&quot;showToc($event)&quot; @mouseout=&quot;hideToc($event)&quot;&gt;\n              &lt;img class=&quot;nozoom&quot; :src=&quot;item.icon&quot; width=&quot;24px&quot; \/&gt;\n              &lt;span class=&quot;show-txt&quot; v-html=&quot;item.title&quot; \/&gt;\n              &lt;div class=&quot;toc-container&quot;&gt;\n                  &lt;div class=&quot;pos-box&quot;&gt;\n                      &lt;div class=&quot;icon-arrow&quot;&gt;&lt;\/div&gt;\n                      &lt;div class=&quot;scroll-box&quot; style=&quot;text-align:center&quot;&gt;\n                          &lt;span v-html=&quot;item.popoverTitle&quot;&gt;&lt;\/span&gt;\n                          &lt;img :src=&quot;item.popoverUrl&quot; height=&quot;180px&quot; style=&quot;margin:10px;&quot; \/&gt;\n                          &lt;span v-html=&quot;item.popoverDesc&quot;&gt;&lt;\/span&gt;\n                      &lt;\/div&gt;\n                  &lt;\/div&gt;\n              &lt;\/div&gt;\n          &lt;\/div&gt;\n      &lt;\/div&gt;\n&lt;!--    &lt;slot name=&quot;middle&quot;\/&gt;\n\n    &lt;slot name=&quot;bottom&quot;\/&gt;--&gt;\n  &lt;\/aside&gt;\n&lt;\/template&gt;\n\n&lt;script&gt;\n\nimport NavLinks from &#039;@theme\/components\/NavLinks.vue&#039;\n\nexport default {\n  name: &#039;PageSidebar&#039;,\n  data(){\n\n    return {\n      list: []\n    }\n  },\n  components: { NavLinks },\n\n  props: [&#039;pageSidebarItems&#039;, &#039;sidebarItems&#039;],\n\n  computed: {\n  },\n  mounted() {\n    this.list = this.$site.themeConfig.extraSideBar\n  },\n  methods: {\n      showToc($event){\n          $event.currentTarget.className=&quot;option-box on&quot;;\n      },\n      hideToc($event){\n          $event.currentTarget.className=&quot;option-box&quot;;\n      },\n      showTocOver($event){\n          $event.currentTarget.className=&quot;option-box-toc-over on&quot;;\n      },\n      hideTocOver($event){\n          $event.currentTarget.className=&quot;option-box-toc-over&quot;;\n      },\n  }\n\n}\n\nfunction resolvePrev (page, items) {\n  return find(page, items, -1)\n}\n\nfunction resolveNext (page, items) {\n  return find(page, items, 1)\n}\n\nfunction find (page, items, offset) {\n  const res = []\n  flatten(items, res)\n  for (let i = 0; i &lt; res.length; i++) {\n    const cur = res[i]\n    if (cur.type === &#039;page&#039; &amp;&amp; cur.path === decodeURIComponent(page.path)) {\n      return res[i + offset]\n    }\n  }\n}\n\nfunction flatten (items, res) {\n  for (let i = 0, l = items.length; i &lt; l; i++) {\n    if (items[i].type === &#039;group&#039;) {\n      flatten(items[i].children || [], res)\n    } else {\n      res.push(items[i])\n    }\n  }\n}\n&lt;\/script&gt;\n\n&lt;style lang=&quot;stylus&quot;&gt;\n.page-sidebar\n  font-size 12px\n  width 3.8rem\n  position fixed\n  z-index 11\n  margin 0\n  top 3.6rem\n  right 0\n  bottom 0\n  box-sizing border-box\n  border-left 0px solid #eaecef\n  ul\n    margin 0\n  a\n    display inline-block\n  .nav-links\n    display none\n    border-bottom 1px solid $borderColor\n    padding 0.5rem 0 0.75rem 0\n    a\n      font-weight 600\n    .nav-item, .repo-link\n      display block\n      line-height 1.25rem\n      font-size 1.1em\n      padding 0.5rem 0 0.5rem 1.5rem\n  &amp; &gt; .sidebar-links\n    padding 1.5rem 0\n    &amp; &gt; li &gt; a.sidebar-link\n      font-size 1.1em\n      line-height 1.4\n      font-weight bold\n    &amp; &gt; li:not(:first-child)\n      margin-top .75rem\n\n.toc-container\n  display: none;\n  position: absolute;\n  color $textColor\n  left: 100%;\n  top: -1px;\n  margin-left: 16px;\n  width: 240px;\n  background: #fff;\n  border: 1px solid #eee;\n  \/\/ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n  \/\/ box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n  \/\/ border-radius: 4px;\n  left: unset;\n  right: 100%;\n  margin-right: 10px;\n  margin-left: 0;\n  .on\n    display: block;\n  .pos-box\n    position: relative;\n    padding: 16px;\n    .icon-arrow\n      position: relative;\n      margin-left: -20px;\n    .scroll-box\n      overflow-x: hidden;\n      overflow-y: hidden;\n      hr\n        margin-top: 0.5rem\n      .toc-box\n        max-height: 500px;\n        overflow-y: auto;\n        overflow-x: hidden;\n        width: 238px;\n        padding-right: 16px;\n        -webkit-box-sizing: border-box;\n        box-sizing: border-box;\n      &amp; &gt; ol\n        margin-top: -8px;\n        li\n          margin-top: 8px;\n          line-height: 17px;\n          text-align: left;\n          overflow: auto;\n          text-overflow: ellipsis;\n          font-size: 12px;\n          white-space: nowrap;\n        .sub-box\n          margin-top: 0;\n        &amp; &gt; ol &gt; li\n          padding-left: 15px;\n\n.page-side-toolbar\n  position fixed\n  right 10px\n  top 70px !important\n  width 44px\n  div.option-box:last-child\n    border-top 0px solid #eee\n  div.option-box.on\n    .toc-container\n      display block\n  div.option-box\n    font-size 12px\n    position relative\n    display -webkit-box\n    display -ms-flexbox\n    display flex\n    -webkit-box-orient vertical\n    -webkit-box-direction normal\n    -ms-flex-direction column\n    flex-direction column\n    -webkit-box-align center\n    -ms-flex-align center\n    align-items center\n    -webkit-box-pack center\n    -ms-flex-pack center\n    justify-content center\n    border-bottom 1px solid #eee\n    background-color #fff\n    height 60px\n    cursor pointer\n    .img\n      margin-top 2px\n    .show-txt\n      color gray\n      margin-top 3px\n      font-size 11px\n  div.option-box-toc-over\n    font-size 12px\n    position relative\n    display none\n    -webkit-box-orient vertical\n    -webkit-box-direction normal\n    -ms-flex-direction column\n    flex-direction column\n    -webkit-box-align center\n    -ms-flex-align center\n    align-items center\n    -webkit-box-pack center\n    -ms-flex-pack center\n    justify-content center\n    border-bottom 1px solid #eee\n    background-color #fff\n    height 60px\n    cursor pointer\n    .img\n      margin-top 2px\n    .show-txt\n      color gray\n      margin-top 3px\n      font-size 11px\n    .toc-container\n      margin-right 0\n  div.option-box-toc\n    font-size 12px\n    position relative\n    display -webkit-box\n    display -ms-flexbox\n    display flex\n    -webkit-box-orient vertical\n    -webkit-box-direction normal\n    -ms-flex-direction column\n    flex-direction column\n    -webkit-box-align center\n    -ms-flex-align center\n    align-items center\n    -webkit-box-pack center\n    -ms-flex-pack center\n    justify-content center\n    border-bottom 1px solid #eee\n    background-color #fff\n    height 60px\n    cursor pointer\n    .img\n      margin-top 2px\n    .show-txt\n      color gray\n      margin-top 3px\n      font-size 11px\n  div.option-box:hover\n    color white\n    background #eee\n  div.option-box-toc-over:hover\n    color white\n    background #eee\n  div.option-box-toc-over.on\n    .toc-container\n      display block\n  div.option-box-toc\n    display none\n\n.page-side-sitemap\n  position fixed\n  right 10px\n  bottom 50px !important\n  width 44px\n  div.option-box:last-child\n    border-bottom 0px solid #eee\n  div.option-box.on\n    .sitemap-container\n      display block\n  div.option-box\n    font-size 12px\n    position relative\n    display -webkit-box\n    display -ms-flexbox\n    display flex\n    -webkit-box-orient vertical\n    -webkit-box-direction normal\n    -ms-flex-direction column\n    flex-direction column\n    -webkit-box-align center\n    -ms-flex-align center\n    align-items center\n    -webkit-box-pack center\n    -ms-flex-pack center\n    justify-content center\n    border-bottom 1px solid #eee\n    background-color #fff\n    \/\/height 60px\n    cursor pointer\n    .show-txt\n      color gray\n      margin-top 2px\n      font-size 11px\n      padding 4px 0\n  div.option-box:hover\n    \/\/color white\n    \/\/background #eee\n\n.sitemap-container\n  display: none;\n  cursor auto\n  position: absolute;\n  color $textColor\n  left: 100%;\n  bottom: -30px;\n  height: 500px;\n  margin-left: 16px;\n  padding: 0 10px;\n  width: 850px;\n  background: #fff;\n  -webkit-box-shadow: 1px -2px 10px 7px rgba(0,0,0,0.08);\n  box-shadow: 1px -2px 10px 7px rgba(0,0,0,0.08);\n  border-radius: 4px;\n  left: unset;\n  right: 100%;\n  margin-right: 2px;\n  margin-left: 0;\n  h4\n    margin: 5px 0;\n    font-size: 13px;\n    text-align: center;\n    padding: 3px 2px;\n    border-bottom: 1px solid #eaecef;\n    background: #42b983;\n    color: white;\n    .sitemap-top-link\n      color: white;\n      font-size: 10px;\n      float:right;\n      padding:2px 5px;\n      text-decoration:underline;\n  .on\n    display: block;\n  .pos-box\n    position: relative;\n    padding: 10px;\n\n@media (max-width: $MQNarrow)\n  .option-box-toc\n    display none\n  .page-side-toolbar\n    right 6px\n    top 65px !important\n    div.option-box-toc-over\n      display flex\n  .page-side-sitemap\n    right 6px\n\n@media (max-width: $MQMobile)\n  .page-sidebar\n    display none\n  .sidebar\n    .nav-links\n      display block\n      .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active::after\n        top calc(1rem - 2px)\n    &amp; &gt; .sidebar-links\n      padding 1rem 0\n&lt;\/style&gt;<\/code><\/pre>\n<p>\u6548\u679c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514123836268.png\" alt=\"image-20240514123836268\" \/><\/p>\n<blockquote>\n<p>\u53c2\u8003\u9c7c\u76ae\u5927\u4f6cvuepress codefather\u9879\u76ee\uff1a<a href=\"https:\/\/github.com\/liyupi\/codefather\">https:\/\/github.com\/liyupi\/codefather<\/a><\/p>\n<\/blockquote>\n<h2>\u5341\u4e5d\u3001\u53f3\u4fa7\u5bfc\u822a\u680f\u8bbe\u7f6e<\/h2>\n<p>\u5728config\u4e0b\u589e\u52a0<code>PageSidebarToc.vue<\/code>\u548c<code>PageSidebarTocLink.vue<\/code><\/p>\n<p><code>PageSidebarToc.vue<\/code><\/p>\n<pre><code class=\"language-vue\">&lt;template&gt;\n &lt;DropdownTransition&gt;\n    &lt;ul class=&quot;toc-sidebar-links&quot; v-if=&quot;items[0].children.length&quot;&gt;\n\n        &lt;li v-for=&quot;(item, i) in items[0].children&quot; :key=&quot;i&quot;&gt;\n            &lt;PageSidebarTocLink  :sidebarDepth=&quot;sidebarDepth&quot; :item=&quot;item&quot;\/&gt;\n        &lt;\/li&gt;\n    &lt;\/ul&gt;\n  &lt;\/DropdownTransition&gt;\n&lt;\/template&gt;\n\n&lt;script&gt;\nimport PageSidebarTocLink from &#039;@theme\/components\/PageSidebarTocLink.vue&#039;\nimport DropdownTransition from &#039;@theme\/components\/DropdownTransition.vue&#039;\nimport { isActive } from &#039;..\/util&#039;\n\nexport default {\n  name: &#039;PageSidebarToc&#039;,\n\n  components: { PageSidebarTocLink, DropdownTransition },\n\n  props: [\n    &#039;items&#039;,\n    &#039;depth&#039;,  \/\/ depth of current sidebar links\n    &#039;sidebarDepth&#039; \/\/ depth of headers to be extracted\n  ],\n\n  data () {\n    return {\n      openGroupIndex: 0\n    }\n  },\n\n  created () {\n    this.refreshIndex()\n  },\n\n  watch: {\n    &#039;$route&#039; () {\n      this.refreshIndex()\n    }\n  },\n\n  methods: {\n    refreshIndex () {\n      const index = resolveOpenGroupIndex(\n        this.$route,\n        this.items[0].children\n      )\n      if (index &gt; -1) {\n        this.openGroupIndex = index\n      }\n    },\n\n    toggleGroup (index) {\n      this.openGroupIndex = index === this.openGroupIndex ? -1 : index\n    },\n\n    isActive (page) {\n      return isActive(this.$route, page.regularPath)\n    }\n  }\n}\n\nfunction resolveOpenGroupIndex (route, items) {\n  for (let i = 0; i &lt; items.length; i++) {\n    const item = items[i]\n    if (descendantIsActive(route, item)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction descendantIsActive (route, item) {\n  if (item.type === &#039;group&#039;) {\n    return item.children.some(child =&gt; {\n      if (child.type === &#039;group&#039;) {\n        return descendantIsActive(route, child)\n      } else {\n        return child.type === &#039;page&#039; &amp;&amp; isActive(route, child.path)\n      }\n    })\n  }\n  return false\n}\n&lt;\/script&gt;<\/code><\/pre>\n<p><code>PageSidebarTocLink.vue<\/code><\/p>\n<pre><code class=\"language-vue\">&lt;script&gt;\nimport { isActive, hashRE, groupHeaders } from &#039;..\/util&#039;\n\nexport default {\n  functional: true,\n\n  props: [&#039;item&#039;, &#039;sidebarDepth&#039;],\n\n  render (h,\n    {\n      parent: {\n        $page,\n        $site,\n        $route,\n        $themeConfig,\n        $themeLocaleConfig\n      },\n      props: {\n        item,\n        sidebarDepth\n      }\n    }) {\n    \/\/ use custom active class matching logic\n    \/\/ due to edge case of paths ending with \/ + hash\n    const selfActive = isActive($route, item.path)\n    \/\/ for sidebar: auto pages, a hash link should be active if one of its child\n    \/\/ matches\n    const active = item.type === &#039;auto&#039;\n      ? selfActive || item.children.some(c =&gt; isActive($route, item.basePath + &#039;#&#039; + c.slug))\n      : selfActive\n    const link = item.type === &#039;external&#039;\n      ? renderExternal(h, item.path, item.title || item.path)\n      : renderLink(h, item.path, item.title || item.path, active)\n\n    const maxDepth = [\n      $page.frontmatter.sidebarDepth,\n      sidebarDepth,\n      $themeLocaleConfig.sidebarDepth,\n      $themeConfig.sidebarDepth,\n      1\n    ].find(depth =&gt; depth !== undefined)\n\n    const displayAllHeaders = $themeLocaleConfig.displayAllHeaders\n      || $themeConfig.displayAllHeaders\n\n    if (item.type === &#039;auto&#039;) {\n      return [link, renderChildren(h, item.children, item.basePath, $route, maxDepth)]\n    } else if ((active || displayAllHeaders) &amp;&amp; item.headers &amp;&amp; !hashRE.test(item.path)) {\n      const children = groupHeaders(item.headers)\n      return [link, renderChildren(h, children, item.path, $route, maxDepth)]\n    } else {\n      return link\n    }\n  }\n}\n\nfunction renderLink (h, to, text, active) {\n  return h(&#039;router-link&#039;, {\n    props: {\n      to,\n      activeClass: &#039;&#039;,\n      exactActiveClass: &#039;&#039;\n    },\n    class: {\n      active,\n      &#039;toc-sidebar-link&#039;: true\n    }\n  }, text)\n}\n\nfunction renderChildren (h, children, path, route, maxDepth, depth = 1) {\n  if (!children || depth &gt; maxDepth) return null\n\n  return h(&#039;ul&#039;, { class: &#039;toc-sidebar-sub-headers&#039; }, children.map(c =&gt; {\n        const active = isActive(route, path + &#039;#&#039; + c.slug)\n        let itemClass = &#039;toc-sidebar-sub-header&#039;\n        if (c.level &lt;= 3) {\n          itemClass += active ? &#039; active&#039; : &#039;&#039;\n        } else if (c.level &gt; 3 &amp;&amp; c.level &lt;= 6) {\n          itemClass += ` toc-sidebar-depth-${c.level}`\n        }\n        return h(&#039;li&#039;, { class: itemClass }, [\n        renderLink(h, path + &#039;#&#039; + c.slug, c.title, active),\n        renderChildren(h, c.children, path, route, maxDepth, depth + 1)\n        ])\n  }))\n}\n\nfunction renderExternal (h, to, text) {\n  return h(&#039;a&#039;, {\n    attrs: {\n      href: to,\n      target: &#039;_blank&#039;,\n      rel: &#039;noopener noreferrer&#039;\n    },\n    class: {\n      &#039;toc-sidebar-link&#039;: true\n    }\n  }, [text, h(&#039;OutboundLink&#039;)])\n}\n&lt;\/script&gt;\n\n&lt;style lang=&quot;stylus&quot;&gt;\n.toc-sidebar .toc-sidebar-sub-headers\n  padding-left 1rem\n  font-size 0.95em\n\na.toc-sidebar-link\n  font-size 0.9rem\n  font-weight 400\n  display inline-block\n  color $textColor\n  \/\/border-left 0.25rem solid transparent\n  \/\/padding 0.35rem 1rem 0.35rem 1.25rem\n  line-height 1\n  width: 100%\n  box-sizing: border-box\n  &amp;:hover\n    color $accentColor\n  &amp;.active\n    font-weight 600\n    color $accentColor\n    border-left-color $accentColor\n  .toc-sidebar-sub-headers &amp;\n    padding-top 0.25rem\n    padding-bottom 0.25rem\n    border-left none\n    font-weight 300\n    &amp;.active\n      font-weight 500\n.toc-sidebar-depth-4\n  list-style-type: none;\n  margin-left 0.8rem\n.toc-sidebar-depth-5\n  list-style-type: none;\n  margin-left 1.6rem\n.toc-sidebar-depth-6\n  list-style-type: none;\n  margin-left 2.4rem\n&lt;\/style&gt;<\/code><\/pre>\n<p><code>Page.vue<\/code>\u505a\u76f8\u5e94\u7684\u4fee\u6539<\/p>\n<pre><code class=\"language-vue\">&lt;div class=&quot;toc-container-sidebar&quot; ref=&quot;tocc&quot;&gt;\n  &lt;div class=&quot;pos-box&quot;&gt;\n      &lt;div class=&quot;icon-arrow&quot;&gt;&lt;\/div&gt;\n      &lt;div class=&quot;scroll-box&quot; style=&quot;max-height:86vh&quot;&gt;\n          &lt;div style=&quot;font-weight:bold;&quot;&gt;{{pageSidebarItems[0].title}}&lt;\/div&gt;\n          &lt;hr\/&gt;\n          &lt;div class=&quot;toc-box&quot;&gt;\n              &lt;PageSidebarToc :depth=&quot;0&quot; :items=&quot;pageSidebarItems&quot; :sidebarDepth=&quot;6&quot;\/&gt;\n          &lt;\/div&gt;\n      &lt;\/div&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n&lt;script&gt;\nimport PageSidebarToc from &#039;@theme\/components\/PageSidebarToc.vue&#039;\nexport default {\n  components: { PageEdit, PageNav,PageSidebarToc },\n  props: [&#039;sidebarItems&#039;, &#039;pageSidebarItems&#039;],\n  mounted() {\n    console.log(this.$site,this, &#039;this.$site&#039;)\n  }\n}    \n&lt;\/script&gt;<\/code><\/pre>\n<p>\u6548\u679c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514140511252.png\" alt=\"image-20240514140511252\" \/><\/p>\n<h2>\u4e8c\u5341\u3001\u6dfb\u52a0\u7248\u6743\u4fe1\u606f<\/h2>\n<p>\u6211\u4eec\u7ee7\u7eed\u7814\u8bfb\u9c7c\u76ae\u5927\u4f6c\u7684\u4ee3\u7801\uff0c\u4ed6\u4e3a\u6bcf\u4e00\u4e2a\u7f51\u9875\u90fd\u589e\u52a0\u4e86footer\u7248\u6743\u4fe1\u606f\uff0c\u6211\u4eec\u4e5f\u6765\u5b9e\u73b0\u4e00\u4e0b\u3002<\/p>\n<p>\u5728config\u4e0b\u589e\u52a0<code>footerConfig.js<\/code><\/p>\n<pre><code class=\"language-js\">\/**\n * \u5e95\u90e8\u7248\u6743\u4fe1\u606f\n *\/\nmodule.exports = {\n    friendLinks: [\n        {\n            label: &quot;\u7ad9\u957f - \u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66&quot;,\n            \/\/ icon: &quot;\/icon\/user.svg&quot;,\n            href: &quot;http:\/\/www.huerpu.cc:7000&quot;,\n        },\n        {\n            label: &quot;PVE&quot;,\n            href: &quot;https:\/\/www.huerpu.cc:1660\/&quot;,\n        },\n        {\n            label: &quot;GitLab&quot;,\n            href: &quot;http:\/\/www.huerpu.cc:2080\/&quot;,\n        },\n        {\n            label: &quot;\u8d44\u6599\u4e0b\u8f7d&quot;,\n            href: &quot;http:\/\/www.huerpu.cc:4090\/index.php?dir=\/hepcloud&quot;,\n        },\n        {\n            label: &quot;Chevereto\u56fe\u5e8a&quot;,\n            href: &quot;http:\/\/www.huerpu.cc:6391\/&quot;,\n        },\n    ],\n    copyright: {\n        href: &quot;https:\/\/beian.miit.gov.cn\/&quot;,\n        name: &quot;\u9c81ICP\u590717054632\u53f7&quot;,\n    },\n};<\/code><\/pre>\n<p>\u5728config.js\u4e2d\u589e\u52a0footer\u914d\u7f6e<\/p>\n<pre><code class=\"language-js\">const footer = require(&#039;.\/config\/footerConfig&#039;);\nthemeConfig: {\n        footer: footer,\n},<\/code><\/pre>\n<p>\u5728<code>Layout.vue<\/code>\u4e2d\u505a\u76f8\u5e94\u4fee\u6539\uff0c\u548c\u4e0a\u9762\u6dfb\u52a0\u53f3\u8fb9\u680f\u7c7b\u4f3c\u3002<\/p>\n<pre><code class=\"language-vue\">&lt;Page\n    v-else\n    :sidebar-items=&quot;sidebarItems&quot;\n    :page-sidebar-items=&quot;pageSidebarItems&quot;\n>\n    &lt;template #top&gt;\n        &lt;slot name=&quot;page-top&quot; \/&gt;\n\n    &lt;\/template&gt;\n    &lt;template #bottom&gt;\n        &lt;slot name=&quot;page-bottom&quot; \/&gt;\n        &lt;Vssue class=&quot;theme-default-content content__default&quot; :options=&quot;{ locale: &#039;zh&#039; }&quot; \/&gt;\n        &lt;Footer \/&gt;\n    &lt;\/template&gt;\n&lt;\/Page&gt;\n&lt;script&gt;\nimport Footer from &quot;@theme\/components\/Footer.vue&quot;;\ncomponents: { Home, Page, Sidebar, Navbar, PageSidebar,Footer },    \n&lt;\/script&gt;<\/code><\/pre>\n<p>\u5728components\u4e0b\u589e\u52a0<code>footer.vue<\/code><\/p>\n<pre><code class=\"language-vue\">&lt;template&gt;\n    &lt;main class=&quot;footer&quot;&gt;\n        &lt;div v-for=&quot;(item, index) in footerList&quot; :key=&quot;index&quot; class=&quot;footer-item&quot;&gt;\n            &lt;a :href=&quot;item.href&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;\n                &lt;img v-if=&quot;item.icon&quot; :src=&quot;item.icon&quot; alt=&quot;icon&quot; class=&quot;item-icon&quot; \/&gt;\n                &lt;span class=&quot;item-text&quot;&gt;{{ item.label }}&lt;\/span&gt;\n            &lt;\/a&gt;\n        &lt;\/div&gt;\n        &lt;div class=&quot;copy-right&quot;&gt;\n           &lt;span class=&quot;name&quot;&gt;{{`${currentYear} \u52e4\u594b\u7684\u51ef\u5c14\u68ee\u540c\u5b66 &nbsp; |  &nbsp; `}} &lt;\/span&gt;\n            &lt;a :href=&quot;government.href&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot; &gt;\n              {{government.name}}\n            &lt;\/a&gt;\n        &lt;\/div&gt;\n    &lt;\/main&gt;\n&lt;\/template&gt;\n\n&lt;script&gt;\nexport default {\n    name: &#039;Footer&#039;,\n    data () {\n        return {\n            footerList: [],\n            government: {},\n            currentYear : &#039;&#039;\n        }\n    },\n\n  props: [&#039;sidebarItems&#039;],\n  mounted() {\n    this.footerList = this.$site.themeConfig.footer.friendLinks\n    this.government = this.$site.themeConfig.footer.copyright\n    this.currentYear =  new Date().getFullYear()\n  }\n}\n&lt;\/script&gt;\n\n&lt;style lang=&quot;stylus&quot;&gt;\n@require &#039;..\/styles\/wrapper.styl&#039;\n\/\/@media (max-width: $MQMobile)\n\/\/  .footer-item a\n\/\/    margin-right 0 !important\n.footer\n  padding 2rem 0\n  display flex\n  justify-content center\n  background-color #f0f2f5\n  flex-wrap wrap\n.footer-item\n  padding 0 1rem\n.footer-item a\n    display inline-flex\n    justify-content center\n    align-items center\n    color #85858a\n\n.item-icon\n  width 1.4rem\n  height 1.4rem\n  margin-right 0.4rem\n.copy-right\n    width 100vw\n    display flex\n    justify-content center\n    margin-top 1rem\n    color #85858a\n.copy-right .name\n    margin-right 0.4rem\n&lt;\/style&gt;<\/code><\/pre>\n<p>\u6548\u679c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514125933250.png\" alt=\"image-20240514125933250\" \/><\/p>\n<h2>\u4e8c\u5341\u4e00\u3001\u7f51\u7ad9\u6392\u540d\u4f18\u5316<\/h2>\n<p>Sitemap(\u7f51\u7ad9\u5730\u56fe)\u662f\u4e00\u79cd\u63d0\u4f9b\u7f51\u7ad9\u9875\u9762\u3001\u89c6\u9891\u3001PDF\u6587\u4ef6\u7b49\u6709\u5173\u4fe1\u606f\u7684\u6587\u4ef6\uff0c\u4e00\u822c\u540d\u79f0\u8bbe\u7f6e\u4e3a<code>sitemap.xml<\/code>\u3002\u5236\u4f5cSitemap\uff0c\u5e76\u63d0\u4ea4\u7ed9\u641c\u7d22\u5f15\u64ce\u53ef\u4ee5\u4f7f\u7f51\u7ad9\u7684\u5185\u5bb9\u5b8c\u5168\u88ab\u6536\u5f55\uff0c\u5305\u62ec\u90a3\u4e9b\u9690\u85cf\u6bd4\u8f83\u6df1\u7684\u9875\u9762\u3002\u8fd9\u662f\u4e00\u79cd\u7f51\u7ad9\u4e0e\u641c\u7d22\u5f15\u64ce\u5bf9\u8bdd\u7684\u597d\u65b9\u5f0f\u3002<\/p>\n<pre><code class=\"language-js\">\/\/ https:\/\/github.com\/ekoeryanto\/vuepress-plugin-sitemap\nyarn add vuepress-plugin-sitemap\n\n[\n    &quot;sitemap&quot;,\n    {\n        hostname: &quot;http:\/\/www.huerpu.cc&quot;,\n    },\n],<\/code><\/pre>\n<p>\u4fee\u6539build\u811a\u672c<\/p>\n<pre><code class=\"language-js\">scripts: {\n    build: &quot;vuepress build docs -d dist&quot;,\n    postbuild: &quot;vuepress-sitemap -H http:\/\/www.huerpu.cc -d dist&quot;\n}<\/code><\/pre>\n<p>\u8fd9\u65f6\u5019\u53bbbuild\u4f1a\u62a5\u9519<\/p>\n<pre><code class=\"language-powershell\"> SITEMAP  Generating sitemap...\nerror vuepress-plugin-sitemap apply generated failed.\nRangeError: Invalid time value\n    at Date.toISOString (&lt;anonymous&gt;)\n    at dateFormatter (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\vuepress-plugin-sitemap\\index.js:24:60)\n    at C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\vuepress-plugin-sitemap\\index.js:69:13\n    at Array.forEach (&lt;anonymous&gt;)\n    at generated (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\vuepress-plugin-sitemap\\index.js:56:13)\n    at AsyncOption.asyncApply (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\@vuepress\\core\\lib\\node\\plugin-api\\abstract\\AsyncOption.js:33:21)\n    at PluginAPI.applyAsyncOption (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\@vuepress\\core\\lib\\node\\plugin-api\\index.js:277:32)\n    at Build.render (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\@vuepress\\core\\lib\\node\\build\\index.js:111:34)\n    at async App.build (C:\\Users\\jason\\IdeaProjects\\KelsenJing\\node_modules\\@vuepress\\core\\lib\\node\\App.js:499:5)\n\nProcess finished with exit code 1<\/code><\/pre>\n<p>\u8fd9\u53ef\u80fd\u662f\u56e0\u4e3a\u4f60\u8bbe\u7f6e\u4e86 lastUpdated \u6216\u8005\u4f7f\u7528\u4e86 <code>@vuepress\/last-updated<\/code>\u63d2\u4ef6\uff0c\u5f53\u4e24\u4e2a\u4e00\u8d77\u7528\u7684\u65f6\u5019\uff0c\u56e0\u4e3a\u65f6\u95f4\u5bf9\u8c61\u7684\u7f18\u6545\uff0c\u4ea7\u751f\u4e86\u62a5\u9519\uff0c\u6211\u4eec\u641c\u7d22 <code>vuepress-plugin-sitemap<\/code> \u7684 issues\uff0c\u53ef\u4ee5\u627e\u5230\u4e00\u4e2a\u89e3\u51b3\u65b9\u6cd5\uff0c\u6211\u4eec\u4fee\u6539\u4e00\u4e0b  <code>pluginsConfig.js<\/code>\u3002<\/p>\n<pre><code class=\"language-js\">[\n    &#039;@vuepress\/last-updated&#039;,\n    {\n        transformer: (timestamp, lang) =&gt; {\n            return new Date(timestamp).toLocaleDateString();\n        }\n    }\n],<\/code><\/pre>\n<p>\u8fd9\u65f6\u5019\u5c31\u53ef\u4ee5build\u5566\u3002<\/p>\n<blockquote>\n<p>\u53c2\u8003\u4e8e\uff1a<a href=\"https:\/\/blog.csdn.net\/weixin_55475226\/article\/details\/123427925\">https:\/\/blog.csdn.net\/weixin_55475226\/article\/details\/123427925<\/a><\/p>\n<\/blockquote>\n<p>\u6e10\u8fdb\u5f0f\u589e\u5f3a\u7f51\u9875\u5e94\u7528\uff0c<code>PWA(Progressive Web App)<\/code>\u662fGoogle\u516c\u53f8\u63d0\u51fa\u7684\uff0c\u5728\u79fb\u52a8\u7aef\u5229\u7528\u6807\u51c6\u5316\u6846\u67b6\uff0c\u5728\u7f51\u9875\u5e94\u7528\u4e2d\u5b9e\u73b0\u548c\u539f\u751f\u5e94\u7528\u76f8\u8fd1\u7684\u7528\u6237\u4f53\u9a8c\u7684\u6e10\u8fdb\u5f0f\u7f51\u9875\u5e94\u7528\u3002<\/p>\n<pre><code class=\"language-js\">yarn add -D @vuepress\/plugin-pwa\n\n[&#039;@vuepress\/pwa&#039;]<\/code><\/pre>\n<p><code>SEO(Search Engine Optimization)<\/code>\uff1a\u6c49\u8bd1\u4e3a\u641c\u7d22\u5f15\u64ce\u4f18\u5316\u3002\u662f\u4e00\u79cd\u65b9\u5f0f\uff1a\u5229\u7528\u641c\u7d22\u5f15\u64ce\u7684\u89c4\u5219\u63d0\u9ad8\u7f51\u7ad9\u5728\u6709\u5173\u641c\u7d22\u5f15\u64ce\u5185\u7684\u81ea\u7136\u6392\u540d\u3002\u76ee\u7684\u662f\u8ba9\u5176\u5728\u884c\u4e1a\u5185\u5360\u636e\u9886\u5148\u5730\u4f4d\uff0c\u83b7\u5f97\u54c1\u724c\u6536\u76ca\u3002\u5f88\u5927\u7a0b\u5ea6\u4e0a\u662f\u7f51\u7ad9\u7ecf\u8425\u8005\u7684\u4e00\u79cd\u5546\u4e1a\u884c\u4e3a\uff0c\u5c06\u81ea\u5df1\u6216\u81ea\u5df1\u516c\u53f8\u7684\u6392\u540d\u524d\u79fb\u3002<\/p>\n<pre><code>\/\/ https:\/\/github.com\/lorisleiva\/vuepress-plugin-seo\nyarn add vuepress-plugin-seo -D\n\n[\n  &quot;seo&quot;,\n  {\n    siteTitle: (_, $site) =&gt; $site.title,\n    title: ($page) =&gt; $page.title,\n    description: ($page) =&gt;\n      $page.frontmatter.description || $page.description,\n    author: (_, $site) =&gt; $site.themeConfig.author || author,\n    tags: ($page) =&gt; $page.frontmatter.tags || tags,\n    type: ($page) =&gt; &quot;article&quot;,\n    url: (_, $site, path) =&gt;\n      ($site.themeConfig.domain || domain || &quot;&quot;) + path,\n    image: ($page, $site) =&gt;\n      $page.frontmatter.image &amp;&amp;\n      (($site.themeConfig.domain &amp;&amp;\n        !$page.frontmatter.image.startsWith(&quot;http&quot;)) ||\n        &quot;&quot;) + $page.frontmatter.image,\n    publishedAt: ($page) =&gt;\n      $page.frontmatter.date &amp;&amp; new Date($page.frontmatter.date),\n    modifiedAt: ($page) =&gt; $page.lastUpdated &amp;&amp; new Date($page.lastUpdated),\n  },\n],<\/code><\/pre>\n<h2>\u4e8c\u5341\u4e8c\u3001\u81ea\u52a8\u5316\u90e8\u7f72<\/h2>\n<p>\u6211\u60f3\u8981\u7684\u529f\u80fd\u662f\uff0c\u53ea\u8981\u4e00\u63d0\u4ea4\u4ee3\u7801\u5230github\u79c1\u6709\u4ed3\u5e93\uff0c\u5c31\u53ef\u4ee5\u89e6\u53d1\u90e8\u7f72\u52a8\u4f5c\uff0c\u5e76\u4e14\u90e8\u7f72\u5230\u6211\u7684\u5185\u7f51PVE\u673a\u5668\u4e0a\u7684\u4e00\u5929Ubuntu\u4e3b\u673a\u4e0a\uff0c\u8fd9\u53f0\u4e3b\u673a\u505a\u4e86\u5185\u5916\u7a7f\u900f\uff0c\u53ef\u4ee5\u5916\u7f51\u8bbf\u95ee\u5230\u3002github\u4e0a\u7684Actions\u662f\u5f88\u5f3a\u5927\u7684\uff0c\u54b1\u4eec\u5c31\u7528\u8fd9\u4e2a\u4e1c\u4e1c\u6765\u800d\u4e00\u800d\u3002<\/p>\n<h3>22.1 \u914d\u7f6e\u4ed3\u5e93\u5bc6\u94a5<\/h3>\n<p>\u70b9\u51fb <code>Settings<\/code>  \u2192 <code>Sectets and variables<\/code> \u2192 <code>Actions<\/code> \u2192 <code>New repository secret<\/code><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514145252617.png\" alt=\"image-20240514145252617\" \/><\/p>\n<p>\u4f9d\u6b21\u6dfb\u52a0\u4ee5\u4e0b\u53d8\u91cf<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: center;\">Name<\/th>\n<th style=\"text-align: center;\">Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: center;\">SERVER_HOST<\/td>\n<td style=\"text-align: center;\">\u670d\u52a1\u5668\u516c\u7f51IP\u6216\u57df\u540d<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\">SERVER_USERNAME<\/td>\n<td style=\"text-align: center;\">\u767b\u5f55\u670d\u52a1\u5668\u7528\u6237\u540d<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\">SERVER_PASSWORD<\/td>\n<td style=\"text-align: center;\">\u767b\u5f55\u670d\u52a1\u5668\u5bc6\u7801<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center;\">SERVER_PORT<\/td>\n<td style=\"text-align: center;\">ssh\u7aef\u53e3\u53f7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514150011660.png\" alt=\"image-20240514150011660\" \/><\/p>\n<h3>22.2 \u914d\u7f6e Actions \u5de5\u4f5c\u6d41<\/h3>\n<p>\u70b9\u51fb <code>Actions<\/code> \u2192  <code>set up a workflow yourself<\/code><\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514150244611.png\" alt=\"image-20240514150244611\" \/><\/p>\n<p>\u65b0\u5efa\u7684 <code>ci.yml<\/code>\u6587\u4ef6\u540d\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u628a\u4e0b\u9762\u4ee3\u7801\u8d34\u8fc7\u6765\uff0c\u70b9\u51fb\u63d0\u4ea4\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514170044270.png\" alt=\"image-20240514170044270\" \/><\/p>\n<p>\u76d1\u542c\u4e8b\u4ef6\uff0c\u53ea\u8981\u6709\u4ee3\u7801\u63d0\u4ea4\u5230main\u5206\u652f\uff0c\u5c31\u4f1a\u89e6\u53d1\u90e8\u7f72\u52a8\u4f5c\u3002<\/p>\n<ul>\n<li>\n<p>branches\uff1a\u6839\u636e\u81ea\u5df1\u4ed3\u5e93\u5206\u652f\u540d\u8fdb\u884c\u4fee\u6539\uff0c\u5982main\u3002<\/p>\n<\/li>\n<li>\n<p>node-version\uff1a\u6839\u636e\u9879\u76ee\u652f\u6301\u7684 node \u7248\u672c\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<\/li>\n<li>\n<p>source\uff1a\u6307\u5b9a\u4e0a\u4f20\u7684\u6587\u4ef6\u76ee\u5f55(\u9879\u76ee\u914d\u7f6e\u7684\u6253\u5305\u76ee\u5f55\u540d\u79f0)\u3002<\/p>\n<\/li>\n<li>\n<p>target\uff1a\u6307\u5b9a\u4e0a\u4f20\u670d\u52a1\u5668\u76ee\u5f55\u3002<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-yml\">name: Build and Deploy\n# \u76d1\u542c main \u5206\u652f\u4e0a\u7684 push \u4e8b\u4ef6\non:\n  push:\n    branches:\n      - main\njobs:\n  build-and-deploy:\n    # \u6784\u5efa\u73af\u5883\u4f7f\u7528 ubuntu\n    runs-on: ubuntu-latest\n    steps:\n      # \u5b98\u65b9action, \u5c06\u4ee3\u7801\u62c9\u53d6\u5230\u865a\u62df\u673a\n      - name: Checkout\n        uses: actions\/checkout@v3\n        with:\n          persist-credentials: false\n\n      - name: Setup Node.js\n        uses: actions\/setup-node@v3\n        with:\n          # \u9009\u62e9\u8981\u4f7f\u7528\u7684 node \u7248\u672c\n          node-version: &quot;16.20.2&quot;\n          # \u7f13\u5b58 pnpm \u4f9d\u8d56\n      - name: Install and Build\n        run: |\n          yarn install\n          yarn docs:build\n\n      # \u90e8\u7f72\u5230\u670d\u52a1\u5668\n      - name: Upload to Deploy Server\n        uses: appleboy\/scp-action@master\n        with:\n          # \u670d\u52a1\u5668\u57df\u540d\n          host: ${{ secrets.SERVER_HOST }}\n          # \u670d\u52a1\u5668\u7528\u6237\u540d\n          username: ${{ secrets.SERVER_USERNAME }}\n          # \u670d\u52a1\u5668\u5bc6\u7801\n          password: ${{ secrets.SERVER_PASSWORD }}\n          # \u670d\u52a1\u5668\u7aef\u53e3\n          port: ${{ secrets.SERVER_PORT }}\n          # \u6307\u5b9a\u4e0a\u4f20\u7684\u6587\u4ef6\u76ee\u5f55(\u9879\u76ee\u914d\u7f6e\u7684\u6253\u5305\u76ee\u5f55\u540d\u79f0)\n          source: &#039;.\/dist\/*&#039;\n          # \u6307\u5b9a\u4e0a\u4f20\u670d\u52a1\u5668\u76ee\u5f55\n          target: &#039;\/usr\/software\/kelsen&#039;\n          # \u89e3\u538b\u65f6\u8986\u76d6\u73b0\u6709\u6587\u4ef6\n          overwrite: true\n          # \u5220\u9664\u6307\u5b9a\u6570\u91cf\u7684\u524d\u5bfc\u8def\u5f84\u5143\u7d20\n          strip_components: 1<\/code><\/pre>\n<p>\u63d0\u4ea4\u4e00\u4e0b\u4ee3\u7801\uff0c\u89e6\u53d1\u4e00\u4e0b\u90e8\u7f72\u4efb\u52a1\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514172828674.png\" alt=\"image-20240514172828674\" \/><\/p>\n<p>\u51fa\u73b0\u7eff\u8272\u56fe\u6807\u5c31\u8bf4\u660e\u90e8\u7f72\u6210\u529f\u4e86\u3002<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514173106353.png\" alt=\"image-20240514173106353\" \/><\/p>\n<p>\u6211\u4eec\u628a\u4e3b\u9875\u663e\u793a\u7684\u540d\u79f0\u4fee\u6539\u4e00\u4e0b\uff0c\u7136\u540e\u63d0\u4ea4\u5230github\uff0c\u770b\u5b83\u81ea\u52a8\u90e8\u7f72\u5230Ubuntu\u5e76\u751f\u6548<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514182435609.png\" alt=\"image-20240514182435609\" \/><\/p>\n<p>\u770b\u4e00\u4e0b\u4e3b\u9875\uff1a<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/uploads\/2024\/05\/14\/image-20240514181341026.png\" alt=\"image-20240514181341026\" \/><\/p>\n<blockquote>\n<p>\u53c2\u8003\u6587\u6863\uff1a<a href=\"https:\/\/blog.csdn.net\/weixin_43233914\/article\/details\/134186796\">https:\/\/blog.csdn.net\/weixin_43233914\/article\/details\/134186796<\/a><\/p>\n<p>\u672c\u6587\u4e3b\u8981\u53c2\u8003\u6587\u6863<\/p>\n<p>vuepress\u5b98\u7f51\uff1a <a href=\"https:\/\/vuepress.vuejs.org\/zh\/theme\/default-theme-config.html\">https:\/\/vuepress.vuejs.org\/zh\/theme\/default-theme-config.html<\/a><\/p>\n<p>vuepress\u4e3b\u9898\uff1a<a href=\"https:\/\/vuepress.vuejs.org\/zh\/theme\/inheritance.html#%E4%BD%BF%E7%94%A8\">https:\/\/vuepress.vuejs.org\/zh\/theme\/inheritance.html#%E4%BD%BF%E7%94%A8<\/a><\/p>\n<p>\u98de\u8dc3\u9ad8\u5c71\u4e0e\u5927\u6d0b\u7684\u9c7c\uff1a<a href=\"https:\/\/www.bilibili.com\/video\/BV1vb411m7NY?p=4&vd_source=abf91b9d7b206ea0120ba1a448905f56\">https:\/\/www.bilibili.com\/video\/BV1vb411m7NY?p=4&#038;vd_source=abf91b9d7b206ea0120ba1a448905f56<\/a><\/p>\n<p>\u9c7c\u76ae\u5927\u4f6cvuepress codefather\u9879\u76ee\uff1a<a href=\"https:\/\/github.com\/liyupi\/codefather\">https:\/\/github.com\/liyupi\/codefather<\/a><\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>vuepress1.9.10\u8be6\u7ec6\u6559\u7a0b(\u8be6\u7ec6\u9760\u8c31\u7248) \u4e00\u3001\u786e\u4fddGit\u3001Node\u3001yarn\u5b89\u88c5\u5b8c\u6bd5 \u7248\u672c\u8bf4\u660e PS [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-748","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/posts\/748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=748"}],"version-history":[{"count":1,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/posts\/748\/revisions"}],"predecessor-version":[{"id":749,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=\/wp\/v2\/posts\/748\/revisions\/749"}],"wp:attachment":[{"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=748"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.huerpu.cc:7000\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}