docsify + Gitee Pages服务搭建开源项目网站
<h2> 前言</h2><p> base-admin从开源至今,已经收获了2k Stat,而我们一直都没有一份像样的在线文档,最近写了一个博客园随笔备份Java脚本,将博客随笔备份到本地,格式是md文档格式,就有意去找将md文档转成html的工具,最后选用了下面这个文档网站生成器,经过一段时间的学习、编写文档,配合Gitee Pages服务,重要有了一个像样的项目网站</p>
<p> https://huanzi-qch.gitee.io/base-admin</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020115523016-1687853085.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020115742774-294714999.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<h2> 文档网站生成器</h2>
<div id="LC2" class="line"><span class="c"> docsify 一个神奇的文档网站生成器,官网:https://docsify.js.org</span></div>
<div class="line"><span class="c"> docsify 可以快速帮你生成文档网站。不同于 GitBook、Hexo 的地方是它不会生成静态的 .html 文件,所有转换工作都是在运行时。如果你想要开始使用它,只需要创建一个 index.html 就可以开始编写文档并直接部署在 GitHub Pages。</span></div>
<div class="line"> 特性</div>
<div class="line">
<ul>
<li>无需构建,写完文档直接发布</li>
<li>容易使用并且轻量 (压缩后 ~21kB)</li>
<li>智能的全文搜索</li>
<li>提供多套主题</li>
<li>丰富的 API</li>
<li>支持 Emoji</li>
<li>兼容 IE11</li>
<li>支持服务端渲染 SSR </li>
</ul>
</div>
<div class="line"> </div>
<div class="line"><span class="c"> 可以选择使用脚手架来快速初始化文件</span></div>
<div class="line">
<div class="cnblogs_code">
<pre>npm i docsify-cli -g</pre>
</div>
<p> 也可以手动创建文件,一个index.html入口页面,一个README.md文档,还有一个.nojekyll的文件</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020120251941-1504851705.png" alt="" loading="lazy"></p>
<p> </p>
<p> 把这些文件丢到tomcat或者nginx中,把容器运行起来就可以访问!</p>
</div>
<div class="line"> </div>
<div class="line"><span class="c"> docsify可以高度定制化,同时也有着丰富的插件列表</span></div>
<div class="line"><span class="c"><span class="c"><span class="c"><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020120850697-2144052952.png" alt="" loading="lazy"></span></span></span>
<p> </p>
<p> </p>
</div>
<h2 class="ui header"> Gitee Pages服务</h2>
<p> 有人说你为什么不买个服务器、域名?搞开源嘛就是用爱发电,能白嫖就白嫖,不寒碜!</p>
<p> 同时,为了节省仓库空间,文档中部分图片是直接引用博客园博客里面的图片地址,因此要做反防盗链处理</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">img图片反防盗链,给所有img标签都加上referrerPolicy属性</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(let img of document.getElementsByTagName('img'<span style="color: rgba(0, 0, 0, 1)">)){
img.setAttribute(</span>'referrerPolicy','no-referrer'<span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<p> </p>
<p> 在gitee上创建一个与用户名同名的私有仓库,创建一个文件夹存放docsify相关文件</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020113541294-824272925.png" alt="" loading="lazy"></p>
<p> </p>
<p> 部署gitee pages服务</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020113447993-1623586112.png" alt="" loading="lazy"></p>
<p> </p>
<p> 这样我们的项目网站就部署成功了!</p>
<p> </p>
<h2> 封装</h2>
<p> 为了方便其他地方也使用同一份配置,我封装了自己的mydocsify.js、mydocsify.css脚本页面访问统计</p>
<p> 封装css</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 侧边栏 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
.sidebar{
padding: 25px </span>0 0 !<span style="color: rgba(0, 0, 0, 1)">important;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 自定义右侧目录 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
.catalogue{
display: block;
overflow: hidden;
position: fixed;
right: 15px;
top: 100px;
padding: 15px 30px;
background: white;
color: rgb(</span>102, 102, 102<span style="color: rgba(0, 0, 0, 1)">);
border: 1px solid rgb(</span>221, 221, 221<span style="color: rgba(0, 0, 0, 1)">);
border</span>-<span style="color: rgba(0, 0, 0, 1)">radius: 4px;
line</span>-<span style="color: rgba(0, 0, 0, 1)">height: 42px;
font</span>-<span style="color: rgba(0, 0, 0, 1)">size: 16px;
text</span>-<span style="color: rgba(0, 0, 0, 1)">align: center;
box</span>-shadow: rgb(238 238 238<span style="color: rgba(0, 0, 0, 1)">) 0px 0px 6px;
cursor: pointer;
}
.catalogue</span>-<span style="color: rgba(0, 0, 0, 1)">h2{
display: block;
text</span>-<span style="color: rgba(0, 0, 0, 1)">decoration: none;
color: #505d6b;
margin</span>-<span style="color: rgba(0, 0, 0, 1)">left: 0px;
font</span>-<span style="color: rgba(0, 0, 0, 1)">size: 14px;
line</span>-<span style="color: rgba(0, 0, 0, 1)">height: 25px;
text</span>-<span style="color: rgba(0, 0, 0, 1)">align: left;
}
.catalogue</span>-<span style="color: rgba(0, 0, 0, 1)">h3{
display: block;
text</span>-<span style="color: rgba(0, 0, 0, 1)">decoration: none;
color: #505d6b;
margin</span>-<span style="color: rgba(0, 0, 0, 1)">left: 20px;
font</span>-<span style="color: rgba(0, 0, 0, 1)">size: 14px;
line</span>-<span style="color: rgba(0, 0, 0, 1)">height: 25px;
text</span>-<span style="color: rgba(0, 0, 0, 1)">align: left;
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 首页按钮 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
section.cover .cover</span>-main > p:last-<span style="color: rgba(0, 0, 0, 1)">child a {
border</span>-radius: 0.5rem !<span style="color: rgba(0, 0, 0, 1)">important;
}</span></pre>
</div>
<p> </p>
<p> 封装js</p>
<div class="cnblogs_code">
<pre>let body =<span style="color: rgba(0, 0, 0, 1)"> document.body;
let head </span>=<span style="color: rgba(0, 0, 0, 1)"> document.head;
let logaPath </span>= 'https://huanzi-qch.gitee.io/file-server/images/logo.png'<span style="color: rgba(0, 0, 0, 1)">;
let nodeArray </span>=<span style="color: rgba(0, 0, 0, 1)"> [
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">logo</span>
{tagName:'link',rel:'shortcut icon',type:'image/x-icon'<span style="color: rgba(0, 0, 0, 1)">,href:logaPath},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docsify脚本</span>
{tagName:'link',rel:'stylesheet',href:'https://cdn.jsdelivr.net/npm/docsify/themes/vue.css'<span style="color: rgba(0, 0, 0, 1)">},
{tagName:</span>'script',src:'https://cdn.jsdelivr.net/npm/docsify/lib/docsify.js'<span style="color: rgba(0, 0, 0, 1)">},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">插件</span>
{tagName:'script',src:'https://cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js'<span style="color: rgba(0, 0, 0, 1)">},
{tagName:</span>'script',src:'https://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback'<span style="color: rgba(0, 0, 0, 1)">},
];
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通用配置</span>
window.$docsify =<span style="color: rgba(0, 0, 0, 1)"> {
name: </span>'huanzi-qch'<span style="color: rgba(0, 0, 0, 1)">,
loadNavbar: </span><span style="color: rgba(0, 0, 255, 1)">true</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导航栏</span>
loadSidebar: <span style="color: rgba(0, 0, 255, 1)">true</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">目录栏</span>
coverpage: <span style="color: rgba(0, 0, 255, 1)">true</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">封面</span>
onlyCover: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
auto2top: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
busuanzi_value:{
site_uv: </span>0<span style="color: rgba(0, 0, 0, 1)">,
page_pv: </span>0<span style="color: rgba(0, 0, 0, 1)">,
site_pv: </span>0<span style="color: rgba(0, 0, 0, 1)">
},
plugins: [
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">底部版权声明</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(hook, vm) {
hook.beforeEach(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(html) {
let newHtml </span>= html +
"\n" +
"<hr>" +
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">"<a target='_blank' href=''></a><br/>" +</span>
"<p>AD广告位(长期招租,如有需要请私信)</p>" +
"<a target='_blank' href='https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ckkryd9h&utm_source=ckkryd9h'>【阿里云】新老用户同享,上云优化聚集地!</a><br/>" +
"<a target='_blank' href='https://www.aliyun.com/activity?userCode=ckkryd9h'>【阿里云】最新活动页,上新必买抢先知,劲爆优惠不错过!</a><br/>" +
"<a target='_blank' href='https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=ckkryd9h'>【阿里云】轻量应用服务器2核2G 低至60元/年起!香港与海外服务器最低24元/月起!</a><br/>" +
"<a target='_blank' href='https://www.aliyun.com/daily-act/ecs/care?userCode=ckkryd9h'>【阿里云】ECS实例升级、续费,享低至 6.3折 限时折扣!</a><br/>" +
"<a target='_blank' href='https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=e1c9db729edccd479fc902634492bf53&from=console'>【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元!</a><br/>" +
"<a target='_blank' href='https://cloud.tencent.com/act/cps/redirect?redirect=1068&cps_key=e1c9db729edccd479fc902634492bf53&from=console'>【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!</a><br/>" +
"<a target='_blank' href='https://cloud.tencent.com/act/cps/redirect?redirect=1063&cps_key=e1c9db729edccd479fc902634492bf53&from=console'>【腾讯云】星星海SA2云服务器,1核2G首年99元起,高性价比首选!</a><br/>" +
"<a target='_blank' href='https://cloud.tencent.com/act/cps/redirect?redirect=1060&cps_key=e1c9db729edccd479fc902634492bf53&from=console'>【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求,云服务器2.5折起!</a><br/>" +
"<br/><br/>" +
"<span style='float: left;'>Copyright © 2021 - 至今 huanzi-qch</span>" +
"<span id='busuanzi_container_site_pv' style='float: right;'>本站总访问量 <span id='busuanzi_value_site_pv'>"+window.$docsify.busuanzi_value.site_pv+"</span> 次</span>"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> newHtml;
});
},
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">返回顶部</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(hook, vm) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> CONFIG =<span style="color: rgba(0, 0, 0, 1)"> {
auto: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
text: </span>'Top'<span style="color: rgba(0, 0, 0, 1)">,
right: </span>15<span style="color: rgba(0, 0, 0, 1)">,
bottom: </span>140<span style="color: rgba(0, 0, 0, 1)">,
offset: </span>500<span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> opts = vm.config.scrollToTop ||<span style="color: rgba(0, 0, 0, 1)"> CONFIG;
CONFIG.auto </span>= opts.auto && <span style="color: rgba(0, 0, 255, 1)">typeof</span> opts.auto === "boolean" ?<span style="color: rgba(0, 0, 0, 1)"> opts.auto : CONFIG.auto;
CONFIG.text </span>= opts.text && <span style="color: rgba(0, 0, 255, 1)">typeof</span> opts.text === "string" ?<span style="color: rgba(0, 0, 0, 1)"> opts.text : CONFIG.text;
CONFIG.right </span>= opts.right && <span style="color: rgba(0, 0, 255, 1)">typeof</span> opts.right === "number" ?<span style="color: rgba(0, 0, 0, 1)"> opts.right : CONFIG.right;
CONFIG.bottom </span>= opts.bottom && <span style="color: rgba(0, 0, 255, 1)">typeof</span> opts.bottom === "number" ?<span style="color: rgba(0, 0, 0, 1)"> opts.bottom : CONFIG.bottom;
CONFIG.offset </span>= opts.offset && <span style="color: rgba(0, 0, 255, 1)">typeof</span> opts.offset === "number" ?<span style="color: rgba(0, 0, 0, 1)"> opts.offset : CONFIG.offset;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> onScroll = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">CONFIG.auto) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> offset =<span style="color: rgba(0, 0, 0, 1)"> window.document.documentElement.scrollTop;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> $scrollBtn = Docsify.dom.find("span.scroll-to-top"<span style="color: rgba(0, 0, 0, 1)">);
$scrollBtn.style.display </span>= offset >= CONFIG.offset ? "block" : "none"<span style="color: rgba(0, 0, 0, 1)">
};
hook.mounted(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> scrollBtn = document.createElement("span"<span style="color: rgba(0, 0, 0, 1)">);
scrollBtn.className </span>= "scroll-to-top"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.display </span>= CONFIG.auto ? "none" : "block"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.overflow </span>= "hidden"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.position </span>= "fixed"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.right </span>= CONFIG.right + "px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.bottom </span>= CONFIG.bottom + "px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.width </span>= "50px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.height </span>= "50px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.background </span>= "white"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.color </span>= "#666"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.border </span>= "1px solid #ddd"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.borderRadius </span>= "4px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.lineHeight </span>= "42px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.fontSize </span>= "16px"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.textAlign </span>= "center"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.boxShadow </span>= "0px 0px 6px #eee"<span style="color: rgba(0, 0, 0, 1)">;
scrollBtn.style.cursor </span>= "pointer"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> textNode =<span style="color: rgba(0, 0, 0, 1)"> document.createTextNode(CONFIG.text);
scrollBtn.appendChild(textNode);
document.body.appendChild(scrollBtn);
window.addEventListener(</span>"scroll"<span style="color: rgba(0, 0, 0, 1)">, onScroll);
scrollBtn.onclick </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e) {
e.stopPropagation();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> step = window.scrollY / 15<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> scroll = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {
window.scrollTo(</span>0, window.scrollY -<span style="color: rgba(0, 0, 0, 1)"> step);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (window.scrollY > 0<span style="color: rgba(0, 0, 0, 1)">) {
setTimeout(scroll, </span>15<span style="color: rgba(0, 0, 0, 1)">)
}
};
scroll()
}
})
}
]
};
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更新自定义右侧目录,以及反防盗链</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> update(url){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自动目录</span>
let catalogue = document.getElementsByClassName('catalogue'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(catalogue.length <= 0<span style="color: rgba(0, 0, 0, 1)">){
catalogue </span>= document.createElement('div'<span style="color: rgba(0, 0, 0, 1)">);
catalogue.className </span>= 'catalogue'<span style="color: rgba(0, 0, 0, 1)">;
body.append(catalogue);
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
catalogue </span>= catalogue;
catalogue.innerHTML </span>= ""<span style="color: rgba(0, 0, 0, 1)">;
}
catalogue.style.display</span>='none'<span style="color: rgba(0, 0, 0, 1)">;
setTimeout(</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">img图片反防盗链</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(let img of document.getElementsByTagName('img'<span style="color: rgba(0, 0, 0, 1)">)){
img.setAttribute(</span>'referrerPolicy','no-referrer'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自动目录</span>
<span style="color: rgba(0, 0, 255, 1)">for</span>(let child of document.getElementById('main'<span style="color: rgba(0, 0, 0, 1)">).children){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(child.nodeName === 'H2' || child.nodeName === 'H3'<span style="color: rgba(0, 0, 0, 1)">){
let a </span>= document.createElement('a'<span style="color: rgba(0, 0, 0, 1)">);
a.href </span>= url + "?id=" +<span style="color: rgba(0, 0, 0, 1)"> child.id;
a.innerText </span>=<span style="color: rgba(0, 0, 0, 1)"> child.innerText;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(child.nodeName === 'H2'<span style="color: rgba(0, 0, 0, 1)">){
a.className </span>= 'catalogue-h2'<span style="color: rgba(0, 0, 0, 1)">;
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
a.className </span>= 'catalogue-h3'<span style="color: rgba(0, 0, 0, 1)">;
}
catalogue.append(a);
}
}
catalogue.style.display</span>='block'<span style="color: rgba(0, 0, 0, 1)">;
},</span>1000<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不蒜子 页面访问统计回调</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> BusuanziCallback(data){
window.$docsify.busuanzi_value </span>=<span style="color: rgba(0, 0, 0, 1)"> data;
document.getElementById(</span>'busuanzi_value_site_pv').innerText =<span style="color: rgba(0, 0, 0, 1)"> window.$docsify.busuanzi_value.site_pv;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">DOM加载完成执行</span>
(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (){
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">动态引入脚本</span>
<span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)">(let node of nodeArray){
let element </span>=<span style="color: rgba(0, 0, 0, 1)"> document.createElement(node.tagName);
</span><span style="color: rgba(0, 0, 255, 1)">for</span>(let key <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> node){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>('tagName' !=<span style="color: rgba(0, 0, 0, 1)"> key){
element </span>=<span style="color: rgba(0, 0, 0, 1)"> node;
}
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span>('link' ==<span style="color: rgba(0, 0, 0, 1)"> node.tagName){
head.append(element);
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
body.append(element);
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">离线模式</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span> navigator.serviceWorker !== 'undefined'<span style="color: rgba(0, 0, 0, 1)">) {
navigator.serviceWorker.register(</span>'https://huanzi-qch.gitee.io/file-server/files/docsify-sw.js'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监听URL发生变化,是否生成自定义右侧目录</span>
let url =<span style="color: rgba(0, 0, 0, 1)"> window.location.href;
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(url.indexOf('docs') !== -1<span style="color: rgba(0, 0, 0, 1)">){
url </span>= window.location.hash.split("?");
update(url);
}
window.onhashchange </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
let hash </span>= window.location.hash.split("?");
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(hash != '#/' && url.indexOf(hash) === -1<span style="color: rgba(0, 0, 0, 1)">){
url </span>=<span style="color: rgba(0, 0, 0, 1)"> hash;
update(url);
}</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
let catalogue </span>= document.getElementsByClassName('catalogue'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(window.location.href.indexOf("docs") === -1 && catalogue.length > 0<span style="color: rgba(0, 0, 0, 1)">){
catalogue[</span>0<span style="color: rgba(0, 0, 0, 1)">].remove();
}
}
};
})();</span></pre>
</div>
<p> 用的是快速统计插件不蒜子</p>
<p> </p>
<p> 封面的项目Star数,直接引用这两个图片链接即可(把项目地址 <span style="color: rgba(255, 0, 0, 1)">huanzi-qch/base-admin</span> 换成自己的项目) </p>
<div class="cnblogs_code">
<pre>https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">img.shields.io/github/stars/huanzi-qch/base-admin.svg?style=social</span>
<span style="color: rgba(0, 0, 0, 1)">
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">gitee.com/huanzi-qch/base-admin/badge/star.svg</span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020162531789-1492539039.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<h2> 巧了</h2>
<p> 巧了嘛这不是,把从博客园备份下来的《SpringBoot系列》、《SpringCloud系列》也直接丢到Gitee Pages服务,直接用我们封装好的docsify脚本,不就正好可以做成在线文档了!</p>
<p> 《SpringBoot系列》,https://huanzi-qch.gitee.io/spring-boot</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020160032874-244006859.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> 《SpringCloud系列》,https://huanzi-qch.gitee.io/spring-cloud</p>
<p><img src="https://img2020.cnblogs.com/blog/1353055/202110/1353055-20211020160115643-314113316.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<h2> 后记</h2>
<p> base-admin的文档,已经提交到项目中,欢迎大家一起参与编辑</p>
<p> </p>
<p> 后续有空再分享更多骚操作!</p>
</div>
<div id="MySignature" role="contentinfo">
<div>
<h3>版权声明</h3>
<div>作者:huanzi-qch</div>
<div>出处:https://www.cnblogs.com/huanzi-qch</div>
<div>若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.</div>
</div><br/>
<div>
<h3><span style="color: #4f84b3;cursor: pointer;" onclick="window.open('https://huanzi-qch.github.io/file-server/ad/adservice.html', '_blank')" title="AD广告位服务说明">AD广告位</span>(长期招租,如有需要请私信)</h3>
【阿里云】阿里云最全的优惠活动聚集地!<br/>
【腾讯云】腾讯云当前最新优惠活动专区!<br/>
<br/>
</div>
<div>
<h3>捐献、打赏</h3>
<div><span style="color: red">请注意:</span>相应的资金支持能更好的持续开源和创作,如果喜欢这篇文章,请随意打赏!</div>
<div style="text-align: center;">
<div style="
float: left;
margin-left: 200px;
">
<img style="width: 100px;" src="https://huanzi-qch.github.io/file-server/images/zhifubao.png"/>
<p>支付宝</p>
</div>
<div>
<img style="width: 100px;" src="https://huanzi-qch.github.io/file-server/images/weixin.png"/>
<p>微信</p>
</div>
</div>
</div><br/>
<div>
<h3>交流群</h3>
<div style="text-align: center;">
有事请加群,有问题进群大家一起交流!<br/>
<img style="width: 300px;" src="https://huanzi-qch.github.io/file-server/images/qq.png"/>
</div>
</div><br/><br><br>
来源:https://www.cnblogs.com/huanzi-qch/p/15428362.html
頁:
[1]