├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── deploy.sh ├── docs ├── .vuepress │ ├── components │ │ └── Font.vue │ ├── config.js │ ├── enhanceApp.js │ ├── private │ │ └── private.js │ └── public │ │ ├── iconfont │ │ ├── iconfont.css │ │ ├── iconfont.eot │ │ ├── iconfont.js │ │ ├── iconfont.json │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ │ ├── images │ │ ├── avatar.jfif │ │ ├── avatar.svg │ │ ├── bg-logo.svg │ │ ├── bookbook.png │ │ ├── favicon.svg │ │ ├── gitee.svg │ │ ├── logo.png │ │ ├── qq.jpg │ │ ├── ruanyf.jpg │ │ └── wx.jpg │ │ └── utils │ │ └── js │ │ ├── click.js │ │ └── jq3.5.1.js ├── README.md └── views │ ├── About │ ├── author.md │ └── resume.md │ ├── JavaScript │ ├── ES6 │ │ └── readme.md │ └── images │ │ ├── 1.gif │ │ ├── 2.gif │ │ ├── 3.gif │ │ ├── 4.gif │ │ └── 5.gif │ └── Vue │ ├── Vue │ └── Vue.md │ ├── VuePress │ ├── VuePress.md │ └── aboutBlog.md │ ├── VueProject │ └── readme.md │ ├── VueRouter │ └── VueRouter.md │ ├── Vuex │ └── Vuex.md │ └── images │ ├── project │ └── file.png │ ├── public │ ├── qq.jpg │ └── wx.jpg │ └── vuepress │ ├── bookbook.png │ ├── cli.png │ ├── lookroot.png │ └── router.png └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Build and Release Folders 2 | bin-debug/ 3 | bin-release/ 4 | [Oo]bj/ 5 | [Bb]in/ 6 | 7 | # Other files and folders 8 | .settings/ 9 | 10 | # Executables 11 | *.swf 12 | *.air 13 | *.ipa 14 | *.apk 15 | 16 | # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` 17 | # should NOT be excluded as they contain compiler settings and other important 18 | # information for Eclipse / Flash Builder. 19 | 20 | node_modules 21 | # docs/.vuepress/private/ 22 | data 23 | docs/.vuepress/dist -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | bookbook.cc -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 木兰宽松许可证, 第2版 2 | 3 | 木兰宽松许可证, 第2版 4 | 2020年1月 http://license.coscl.org.cn/MulanPSL2 5 | 6 | 7 | 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 8 | 9 | 0. 定义 10 | 11 | “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 12 | 13 | “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 14 | 15 | “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 16 | 17 | “法人实体”是指提交贡献的机构及其“关联实体”。 18 | 19 | “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 20 | 21 | 1. 授予版权许可 22 | 23 | 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 24 | 25 | 2. 授予专利许可 26 | 27 | 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 28 | 29 | 3. 无商标许可 30 | 31 | “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 32 | 33 | 4. 分发限制 34 | 35 | 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 36 | 37 | 5. 免责声明与责任限制 38 | 39 | “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 40 | 41 | 6. 语言 42 | “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 43 | 44 | 条款结束 45 | 46 | 如何将木兰宽松许可证,第2版,应用到您的软件 47 | 48 | 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 49 | 50 | 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 51 | 52 | 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 53 | 54 | 3, 请将如下声明文本放入每个源文件的头部注释中。 55 | 56 | Copyright (c) [Year] [name of copyright holder] 57 | [Software Name] is licensed under Mulan PSL v2. 58 | You can use this software according to the terms and conditions of the Mulan PSL v2. 59 | You may obtain a copy of Mulan PSL v2 at: 60 | http://license.coscl.org.cn/MulanPSL2 61 | THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 62 | See the Mulan PSL v2 for more details. 63 | 64 | 65 | Mulan Permissive Software License,Version 2 66 | 67 | Mulan Permissive Software License,Version 2 (Mulan PSL v2) 68 | January 2020 http://license.coscl.org.cn/MulanPSL2 69 | 70 | Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 71 | 72 | 0. Definition 73 | 74 | Software means the program and related documents which are licensed under this License and comprise all Contribution(s). 75 | 76 | Contribution means the copyrightable work licensed by a particular Contributor under this License. 77 | 78 | Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. 79 | 80 | Legal Entity means the entity making a Contribution and all its Affiliates. 81 | 82 | Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 83 | 84 | 1. Grant of Copyright License 85 | 86 | Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 87 | 88 | 2. Grant of Patent License 89 | 90 | Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 91 | 92 | 3. No Trademark License 93 | 94 | No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 95 | 96 | 4. Distribution Restriction 97 | 98 | You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 99 | 100 | 5. Disclaimer of Warranty and Limitation of Liability 101 | 102 | THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 103 | 104 | 6. Language 105 | 106 | THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. 107 | 108 | END OF THE TERMS AND CONDITIONS 109 | 110 | How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software 111 | 112 | To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: 113 | 114 | i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; 115 | 116 | ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; 117 | 118 | iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. 119 | 120 | 121 | Copyright (c) [Year] [name of copyright holder] 122 | [Software Name] is licensed under Mulan PSL v2. 123 | You can use this software according to the terms and conditions of the Mulan PSL v2. 124 | You may obtain a copy of Mulan PSL v2 at: 125 | http://license.coscl.org.cn/MulanPSL2 126 | THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 127 | See the Mulan PSL v2 for more details. 128 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simple-blog 2 | 3 | #### 介绍 4 | 一个极简主义Blog网站 5 | 6 | #### 运行 7 | 如果你想运行该项目,你首先应该 Clone 项目, 8 | 然后进入项目目录 输入 npm install,安装项目依赖 9 | 之后再输入 npm run docs:dev 该项目将会在你本地开启一个服务器,并运行在 8080 端口 10 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 确保脚本抛出遇到的错误 4 | set -e 5 | 6 | # 生成静态文件 7 | npm run docs:build 8 | 9 | # 进入生成的文件夹 10 | cd docs/.vuepress/dist 11 | 12 | # 如果是发布到自定义域名 13 | echo 'www.bookbook.cc' > CNAME 14 | 15 | git init 16 | git add -A 17 | git commit -m 'deploy' 18 | 19 | # 如果发布到 https://.github.io 20 | git push -f https://github.com/penggang-home/penggang-home.gitub.io.git master:gh-pages 21 | 22 | # 如果发布到 https://.github.io/ 23 | # 请把 penggang-home/blog-two.git 换成你的项目地址 24 | # git push -f git@github.com:penggang-home/blog-two.git master:gh-pages 25 | 26 | cd - -------------------------------------------------------------------------------- /docs/.vuepress/components/Font.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | -------------------------------------------------------------------------------- /docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | const private = require('./private/private') 2 | // 把最后更改时间更改为 中国地区的样式 3 | const moment = require('moment'); 4 | moment.locale("zh-cn") //显示中国的时间格式 5 | 6 | module.exports = { 7 | title: "PengSir", 8 | description: "这个杀手不太冷", 9 | head: [ 10 | ['meta', { name: "baidu_union_verify", content: "a0036ccf0b657813fb236f80f376c429" }], 11 | ["link", { rel: "icon", href: "/images/favicon.svg" }], 12 | ['meta', { name: 'Keywords', content: '彭先生,彭先生的主页,bookbook,BookBook,bookbook.cc,BookBook.cc' }], 13 | // 作者 14 | ['meta', { name: 'author', content: '彭先生,彭先生的主页,bookbook,BookBook,bookbook.cc,BookBook.cc' }], 15 | // 百度统计 16 | ['script', {}, `var _hmt = _hmt || []; 17 | (function() { 18 | var hm = document.createElement("script"); 19 | hm.src = "https://hm.baidu.com/hm.js?668842dc21c1b8f215b000531ec8f69e"; 20 | var s = document.getElementsByTagName("script")[0]; 21 | s.parentNode.insertBefore(hm, s); 22 | })();`], 23 | // ['script', { src: "/utils/js/jq3.5.1.js" }, ``], 24 | // ['script', { src: "/utils/js/click.js" }, ``], 25 | ], 26 | theme: "reco", 27 | themeConfig: { 28 | // 博客配置 29 | type: "blog", 30 | fullscreen: true, 31 | logo: "/images/favicon.svg", 32 | blogConfig: { 33 | category: { 34 | location: 2, // 在导航栏菜单中所占的位置,默认2 35 | text: '分类' // 默认文案 “分类” 36 | }, 37 | tag: { 38 | location: 3, // 在导航栏菜单中所占的位置,默认3 39 | text: '标签' // 默认文案 “标签” 40 | } 41 | }, 42 | subSidebar: 'auto',//在所有页面中启用自动生成子侧边栏,原 sidebar 仍然兼容 43 | sidebar: "auto",//所有页面自动生成侧边栏 44 | author: "PrngSir", 45 | authorAvatar: "/images/avatar.svg", 46 | mode: "light", //默认显示模式 modePicker: false 关闭该按钮 47 | codeTheme: "tomorrow", // default 'tomorrow' okaidia 48 | record: "蜀ICP备20019955号", 49 | recordLink: "https://icp.chinaz.com/home/info?host=pengsir.top", 50 | smooth: "true", //平滑滚动 51 | // 评论设置 52 | valineConfig: { 53 | appId: private.appId, 54 | appKey: private.appKey, 55 | recordIP: true, 56 | placeholder: '填写邮箱地址可以及时收到回复噢...', 57 | visitor: true, 58 | }, 59 | lastUpdated: '最后更新于', friendLink: [ 60 | { 61 | title: '午后南杂', 62 | desc: 'Enjoy when you can, and endure when you must.', 63 | email: 'recoluan@qq.com', 64 | link: 'https://www.recoluan.com' 65 | }, 66 | { 67 | title: '唐子涵的博客', 68 | desc: '至于未来会怎么样 反正路还长 天总会亮', 69 | link: 'https://www.zihanzy.com/' 70 | }, 71 | { 72 | title: '李Sir的博客', 73 | desc: '活在当下', 74 | link: 'https://heroli.netlify.app/' 75 | }, 76 | 77 | 78 | // ... 79 | ], 80 | nav: [ 81 | // 导航栏 82 | { text: "主页", link: "/", icon: "reco-home" }, 83 | { 84 | text: "工具箱", 85 | icon: "iconfont icon-tools", 86 | items: [ 87 | { text: "在线PS", link: "https://www.uupoop.com/" }, 88 | { text: "奶牛快传", link: "https://cowtransfer.com/" }, 89 | { text: "编程语言排行榜", link: "https://www.tiobe.com/tiobe-index/" }, 90 | ] 91 | }, 92 | { 93 | text: "项目", 94 | icon: 'iconfont icon-tools', 95 | items: [ 96 | { text: 'CloudMusic\t|\t米奇妙妙屋', link: 'https://penggang-home.gitee.io/cloud-music/#/discovery', icon: "iconfont icon-wangyiyunyinle" }, 97 | { text: '电商后台管理系统 V:1.3.0', link: 'http://120.53.120.229:1921/#/login', icon: "iconfont icon-vue" }, 98 | { text: '电商后台管理系统 V:1.2.0', link: 'http://120.53.120.229:1920/#/login', icon: "iconfont icon-vue" }, 99 | { text: "电商平台实时监控系统(Echarts)", link: "http://120.53.120.229:9989/#/home", icon: "iconfont icon-vue" }, 100 | { text: "仿微信聊天", link: "http://120.53.120.229:8100", icon: "reco-wechat" }, 101 | ] 102 | }, 103 | { text: "时间线", link: "/timeline/", icon: "reco-date" }, 104 | { 105 | text: "关于", 106 | icon: "reco-message", 107 | items: [ 108 | { 109 | text: "关于我", 110 | link: "/views/About/author", 111 | icon: "reco-account" 112 | }, 113 | { 114 | text: "简历", 115 | link: "/views/About/resume", 116 | icon: "reco-document" 117 | }, 118 | 119 | { 120 | text: "CSDN", 121 | link: "https://blog.csdn.net/weixin_43742708", 122 | icon: "reco-csdn", 123 | }, 124 | { 125 | text: "GitHub", 126 | link: "https://github.com/penggang-home", 127 | icon: "reco-github", 128 | }, 129 | { 130 | text: "Gitee", 131 | link: "https://gitee.com/penggang-home", 132 | icon: "reco-mayun", 133 | }, 134 | ] 135 | } 136 | ], 137 | }, 138 | // 项目开始时间 139 | // startYear: '2017', 140 | editLinks: true, 141 | editLinkText: '在 GitHub 上编辑此页 !', 142 | markdown: { 143 | lineNumbers: true, //代码显示行号 144 | }, // 搜索设置 145 | plugins: { 146 | //一键复制代码插件: "vuepress-plugin-code-copy": "^1.0.6", 147 | "vuepress-plugin-code-copy": true, 148 | // 阅读进度条: "vuepress-plugin-reading-progress": "^1.0.10", 149 | "reading-progress": true, 150 | 151 | // 分享插件: "vuepress-plugin-social-share": "^1.0.0" 152 | // "social-share": { 153 | // networks: ["qq", "weibo", "email"], //分享类型 154 | // qq: "2845486124", 155 | // email: "2845486124@gmail.com", //email地址 156 | // }, 157 | 158 | // 最后更改时间插件(内置)+moment 格式化为中国地区的样式 159 | '@vuepress/last-updated': { 160 | transformer: (timestamp, lang) => { 161 | return moment(timestamp).format('LLLL') 162 | } 163 | }, 164 | // BGM播放器 "@vuepress-reco/vuepress-plugin-bgm-player": "^1.1.3", 165 | "@vuepress-reco/vuepress-plugin-bgm-player": { 166 | audios: [ 167 | { 168 | name: "Faster Than Light", 169 | artist: "Andreas Waldetoft / Mia Stegmar", 170 | url: 171 | "https://cdn-image.tsanfer.xyz/music/Andreas%20Waldetoft%2CMia%20Stegmar%20-%20Faster%20Than%20Light.mp3", 172 | cover: 173 | "https://p1.music.126.net/Gxv6d9W4Yd9q9WNHPpi8rw==/1379887104073348.jpg", 174 | }, 175 | { 176 | name: "Dawn", 177 | artist: "DDRKirby(ISQ)", 178 | url: 179 | "https://cdn-image.tsanfer.xyz/music/Dawn%20-%20DDRKirby%28ISQ%29.mp3", 180 | cover: 181 | "https://p2.music.126.net/IPnqMCk8YaN9inwYV2bdgQ==/18774161044446693.jpg", 182 | }, 183 | { 184 | name: "TRON Legacy (End Titles)", 185 | artist: "Daft Punk", 186 | url: 187 | "https://cdn-image.tsanfer.xyz/music/Daft%20Punk%20-%20TRON%20Legacy%20%28End%20Titles%29.mp3", 188 | cover: 189 | "https://p2.music.126.net/qOOTIykbSLw9RHB0vI83GA==/737772302281958.jpg", 190 | }, 191 | { 192 | name: "Reconfig", 193 | artist: "Shortwire", 194 | url: 195 | "https://cdn-image.tsanfer.xyz/music/Reconfig%20-%20Shortwire.mp3", 196 | cover: 197 | "https://p2.music.126.net/2oouVh_rHOv1nZXYapF41A==/109951163606358209.jpg", 198 | }, 199 | { 200 | name: "Broken Boy", 201 | artist: "Tonspender", 202 | url: 203 | "https://cdn-image.tsanfer.xyz/music/Tonspender%20-%20Broken%20Boy.flac", 204 | cover: 205 | "https://p2.music.126.net/4TnTRyHqa3-D2H1UnOa00w==/109951163666994621.jpg", 206 | }, 207 | { 208 | name: "Iron Princess", 209 | artist: "Xomu,HYP3RLAPS3", 210 | url: 211 | "https://cdn-image.tsanfer.xyz/music/Xomu%2CHYP3RLAPS3%20-%20Iron%20Princess.flac", 212 | cover: 213 | "https://p2.music.126.net/INOnlEePWnMVO3D4U95B9g==/109951165031046695.jpg", 214 | }, 215 | { 216 | name: "Rapid as Wildfires 疾如猛火", 217 | artist: "陈致逸,HOYO-MiX", 218 | url: 219 | "https://cdn-image.tsanfer.xyz/music/%E9%99%88%E8%87%B4%E9%80%B8%2CHOYO-MiX%20-%20Rapid%20as%20Wildfires%20%E7%96%BE%E5%A6%82%E7%8C%9B%E7%81%AB.flac", 220 | cover: 221 | "https://p2.music.126.net/yoRaxBY77koSqhjh52g-DA==/109951165434255510.jpg", 222 | }, 223 | { 224 | name: "清平乐", 225 | artist: "张紫宁", 226 | url: 227 | "https://cdn-image.tsanfer.xyz/music/%E7%81%AB%E7%AE%AD%E5%B0%91%E5%A5%B3101%E7%B4%AB%E5%AE%81%20-%20%E6%B8%85%E5%B9%B3%E4%B9%90.flac", 228 | cover: 229 | "https://p1.music.126.net/145FpHsLi2_RyjqCm9kEUQ==/109951164698991135.jpg", 230 | }, 231 | { 232 | name: "この世界の頂で", 233 | artist: "森下弘生,金﨑猛,近藤嶺", 234 | url: 235 | "https://cdn-image.tsanfer.xyz/music/%E6%A3%AE%E4%B8%8B%E5%BC%98%E7%94%9F%2C%E9%87%91%EF%A8%91%E7%8C%9B%2C%E8%BF%91%E8%97%A4%E5%B6%BA%20-%20%E3%81%93%E3%81%AE%E4%B8%96%E7%95%8C%E3%81%AE%E9%A0%82%E3%81%A7.mp3", 236 | cover: 237 | "https://p2.music.126.net/PFojr1j6pdEj3uWrhpdytA==/109951164925376075.jpg", 238 | }, 239 | { 240 | name: "終わりの世界から", 241 | artist: "やなぎなぎ,麻枝准", 242 | url: 243 | "https://cdn-image.tsanfer.xyz/music/%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AE%E4%B8%96%E7%95%8C%E3%81%8B%E3%82%89%20-%20%E3%82%84%E3%81%AA%E3%81%8E%E3%81%AA%E3%81%8E%2C%E9%BA%BB%E6%9E%9D%E5%87%86.mp3", 244 | cover: 245 | "https://p1.music.126.net/C7ruDdV5NhgfhhJ8_cQSzA==/2426622162519258.jpg", 246 | }, 247 | { 248 | name: "寂しい夜", 249 | artist: "三輪学", 250 | url: 251 | "https://cdn-image.tsanfer.xyz/music/%E4%B8%89%E8%BC%AA%E5%AD%A6%20-%20%E5%AF%82%E3%81%97%E3%81%84%E5%A4%9C.flac", 252 | cover: 253 | "https://p2.music.126.net/RIOvUtQejxeI5S2sP_nmiw==/3434874333355654.jpg", 254 | }, 255 | { 256 | name: "「軌跡」", 257 | artist: "小野友樹,KENN", 258 | url: 259 | "https://cdn-image.tsanfer.xyz/music/%E5%B0%8F%E9%87%8E%E5%8F%8B%E6%A8%B9%2CKENN%20-%20%E3%80%8C%E8%BB%8C%E8%B7%A1%E3%80%8D.flac", 260 | cover: 261 | "https://p2.music.126.net/xY8qFdscge6rmeaw9aCc6A==/109951163168710796.jpg", 262 | }, 263 | { 264 | name: "無人区-Vacuum Track#ADD8E6-", 265 | artist: "米缐p.", 266 | url: 267 | "https://cdn-image.tsanfer.xyz/music/%E7%B1%B3%E7%BC%90p.%20-%20%E7%84%A1%E4%BA%BA%E5%8C%BA-Vacuum%C2%A0Track%23ADD8E6-.mp3", 268 | cover: 269 | "https://p3.music.126.net/WXAAn_D-gfPB9iVcVZQwAw==/109951163037603327.jpg", 270 | }, 271 | { 272 | name: "DARK SOULS Ⅲ", 273 | artist: "Yuka Kitamura", 274 | url: 275 | "https://cdn-image.tsanfer.xyz/music/DARK%20SOULS%20%E2%85%A2%20-%20Yuka%20Kitamura.mp3", 276 | cover: 277 | "https://p1.music.126.net/XS-n1XX9g_OBLFudoQrc5w==/1396379770845098.jpg", 278 | }, 279 | { 280 | name: "Ezio's Family", 281 | artist: "Jesper Kyd", 282 | url: 283 | "https://cdn-image.tsanfer.xyz/music/Jesper%20Kyd%20-%20Ezio's%20Family.mp3", 284 | cover: 285 | "https://p1.music.126.net/BQ0oJHhx3bPdmYbg90WL1g==/2536573326661833.jpg", 286 | }, 287 | { 288 | name: "Sea Of Voices (RAC Mix)", 289 | artist: "Porter Robinson", 290 | url: 291 | "https://cdn-image.tsanfer.xyz/music/Porter%20Robinson%20-%20Sea%20Of%20Voices%20%28RAC%20Mix%29.mp3", 292 | cover: 293 | "https://p1.music.126.net/zjQROkEUokU7iS5eUvnVZQ==/3264450027161111.jpg", 294 | }, 295 | { 296 | name: "Superstar (feat. Linn)", 297 | artist: "Said The Sky & Dabin", 298 | url: 299 | "https://cdn-image.tsanfer.xyz/music/Said%20The%20Sky%20%26%20Dabin%20-%20Superstar%20(feat.%20Linn)%20-%20Said%20The%20Sky.mp3", 300 | cover: 301 | "https://p2.music.126.net/G105trvU6R2_vqgZWvncuQ==/109951163506191548.jpg", 302 | }, 303 | ], 304 | }, 305 | // 看板娘插件 https://github.com/vuepress-reco/vuepress-plugin-kan-ban-niang 306 | "@vuepress-reco/vuepress-plugin-kan-ban-niang": 307 | { 308 | theme: ['z16', 'blackCat', 'whiteCat', 'haru1', 'haru2', 'haruto', 'koharu', 'izumi', 'shizuku', 'wanko', 'miku'], 309 | clean: false, 310 | messages: { 311 | welcome: '我是bookbook,欢迎你的关注 ', 312 | home: '心里的花,我想要带你回家。', 313 | theme: '好吧,希望你能喜欢我的其他小伙伴。', 314 | close: '再见哦' 315 | }, 316 | width: 150, 317 | height: 219, 318 | }, 319 | // 点击爆炸的彩带效果 320 | "cursor-effects": { 321 | size: 3, // size of the particle, default: 2 322 | shape: ['circle'], // shape of the particle, default: 'star' 323 | zIndex: 999999999 // z-index property of the canvas, default: 999999999 324 | }, 325 | //vuepress公告插件 先安装在配置 npm install @vuepress-yard/vuepress-plugin-window --save 326 | // "@vuepress-yard/vuepress-plugin-window": { 327 | // title: "疯狂的地球人@公告", 328 | // contentInfo: { 329 | // title: "毕设、项目、相关咨询加微信哦~🎉🎉", 330 | // needImg: true, 331 | // imgUrl: "images/bookbook.png", 332 | // content: "", 333 | // contentStyle: "" 334 | // }, 335 | // bottomInfo: { 336 | // btnText: '关于', 337 | // linkTo: 'https://www.bookbook.cc/views/About/author.html' 338 | // }, 339 | // closeOnce: false, 340 | // hideRouteList 341 | // } 342 | } 343 | } 344 | -------------------------------------------------------------------------------- /docs/.vuepress/enhanceApp.js: -------------------------------------------------------------------------------- 1 | import iconfont from './public/iconfont/iconfont.css' 2 | export default{} -------------------------------------------------------------------------------- /docs/.vuepress/private/private.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | appId: "X3BngL3TJOaKhbqvMkYD9DkL-gzGzoHsz", 3 | appKey: "kaCkhB2ENIxkpA5l3NMEbvxy", 4 | } -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | @font-face {font-family: "iconfont"; 2 | src: url('iconfont.eot?t=1617609936268'); /* IE9 */ 3 | src: url('iconfont.eot?t=1617609936268#iefix') format('embedded-opentype'), /* IE6-IE8 */ 4 | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAegAAsAAAAADfAAAAdUAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDXgqONIs5ATYCJAMcCxAABCAFhG0HaRuaC1GUL1KR7AtsG/akiRWSDQOCqQgCDsfWKYAEKPA/sBsAABAP3+/Xzn1fd3FJopHu000ziQxVPEGiVVrzUGh7NZf3gCr61Y5/lq9KpNAH9o5zmc3mwRWdrjKtkK1wHcDTSjaXn4nIuiqbUw1m79UT2pknIDgB/Q/ALTgHCPiP38/liUjUm2mKa+X9qWPmbQnxEglJxNuPi0So0EiZ3iiFY3R2TQovaI8TaJo01dq8uHsUQzkSCRh2YVQqhqas3EcQ6kTpcmku3hTq9JK+AV7l748/XjEkKTLkSVvn54U4+vQMyl5aL86yJw/pleG6FxmWCPk1/uiaugbReIs6mrvn9gidakkJP/hY/rjvyfonr59BLZhnk82hkw4kyRUp/+GVRAlH24Fy1FnyCXAziU+5mZzPPjMFX+vNZHy9NhP8QN5RU0Elju3EMJE2cO4fYS+rSDJ636Ttts8mSxJMxpPolx0dXV3t0UC3OtzWHb7HAhWGih4d+YTOhF1Xl17XlPx+DeSDg4a44FzkIU8cHfHYiMXsxFiYkCCSLhPCMdJ6nAwnRfbTtorenhmdnZgLhgk24TycuoS0nz5z4IBxd7/+MGk2dNhpzm7KDhf0Gg5iDjNnfbYSlrceNhoCCdEGktNn1Ddu3O+8Rzxj0mPaO6urmNSfPmCceYGFW1vpS3DbU569OKAkxQw2cicwCm0xYXfaq48AlReQxluQaTJ7m6NCt9dAPqGnN2Unn9G1PIa7rsNNBk74YgFn0a1+24mwy4SIJEXTtpMG8h6dkxg64jmIB+6i7vDfccG923jcaiioyw6FBQW7jc/EdrvdZn3gmPv8BXuzIfd++2kYJZ4x6DHstZ1U0/PGJbrXRCsTxwUqGIYyCEKoSpLl2wLrXjah15W7fGLGUCCP3Idb2G3EuBh6lH2cQmBhEGCxvE10xinREmQH6d5vTAo3h001zoNGLQ1HMdbEcbvdXn1GQ6TzBtLfrF0q5+13FIDgmN1g/LyHYsn8grnFOnKpaFbqMLPYqQDrkN+CqBsXkYQ+iSdewtH8wlQKKqQwi0ooza2ti++iKvi9ZQ9EqsT95hEMJQgr8BK+hEwGQcBIwNOiLDU0Lk3EccsRTEKRzma50owI/xfsvVt3zzlXPquOcWnhpR/ydvZsTDy5+17VxjdTsqhYpUhb4ls2XRtWiwywWSEs29qXZanD0mBR2NRO2BuC25msZKWC8Vsh1et5SJaDf13YqT1hAfj75LCvgQn6O83EnZL8/TzbJEuY8mLGdYK6PWWX6XYwYXIl59/k4TI5FA1FeABaBlEl3DE1Ozb9/RbF+sP2SgLX6B2J/vTFQQPB126P02tWD+R01liEv9hx7MEWR6ouTddW/gLQfQCzeAijo5x4wkB4lz4M3jOifOg0jwsdeYJfB8KorFVf04Vkr1x6jJymetyzMb1iKfAiVuknO9ts/h4YLV4Dqx/Dn5o+DNjv0g8l/hWTW8815fDoupoHVz9NyNeA23jfAuC6r34bh0JWQCsiHzw47XpT84myvsSXGcB5VkuGSJ7LDB1eO6JP/55UWc1gFp5oNwA5Pr7ccIq3dgmkYW+Q/QTQfCA9CoNiERh5kqHTEhjEuCGixQYn95bX3juRl58uhRZZQhHvSyMSKKZF/q4vo7liBscF1ZTJdl8+Wx8P8T+iW6Cb1S5PtZ0d6O52/LA13ixfSk3WjDXi+nCSjC5EAQFedzihkq0CrUitCLVJ9xhH1tWvCI0jWYv1Db/xG2RCWrBLNezaPF9oMXkyEt3FH8yJruAjGWti5XmH1ChOFi0pgI8HfdYIpYWfbTUuFJxPPP8y8WVKKmI+ZHqTZb1Ii/X86JFMGM4+cngDC1pknbzfeMiUn5oK/JG9WVZ/rv6szMML8tI6Z6HcwFL1AO8tnaPnqZdkAZKSqDqKnusRcjVhDKRI7BXSFHXR+yMbGMUFwJCr8Q5u40Oae1VGuJ93vQtIynaaRpuVAKYOaLtnwYBM6Irmm157Ax2ASquzyjK5136HleE/ZG9pQCYFOOCQMh/CR82EkK5OB5UXHAEOM79zMpMZ8kmj7U+h+W+PLp6w+ITWCplMNuOY0L7tvTHXspPnQSqqnJufL2kxe0OqK+/a2hKadBFbeU2vv/TiA6F9h5T4gA5JZQIytSlCTlmCQptlKNVWoGnR5dVt+pCOyBtY8IkgdPuCpNMHZLr9IEBA+YXCoH8odUcHmg6i75ZtZsKMNwhTxgKyA5g8lpIV81gZfo+q8SkZA7LiGak2zbCaL63dl1gipXFGvVVrZgmSYoAL9DT0PkJF0WLOc81cbRYL6XbmPI9BjG0gKMWiYQFkDq5GLirJ7dnY9vX3kNLwUuQz79v1GSI1s3OwMrcMQbiMlqHmLcvY2payxrhMAj6VRAG4wGXI044IVO4HWSjH5nSMtsrGAueTYaPz/ONhOEcNvgXJKVWkyCKPIsqoAnbpvEpLdTCHphRaSo8jY3KsHrnqcYy+7lw2OOiAjBA=') format('woff2'), 5 | url('iconfont.woff?t=1617609936268') format('woff'), 6 | url('iconfont.ttf?t=1617609936268') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ 7 | url('iconfont.svg?t=1617609936268#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family: "iconfont" !important; 12 | font-size: 16px; 13 | font-style: normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-wangyiyunyinle:before { 19 | content: "\e7ee"; 20 | } 21 | 22 | .icon-wangyiyun:before { 23 | content: "\e600"; 24 | } 25 | 26 | .icon-wangyiyun1:before { 27 | content: "\e7ae"; 28 | } 29 | 30 | .icon-tools:before { 31 | content: "\e694"; 32 | } 33 | 34 | .icon-vue:before { 35 | content: "\e69a"; 36 | } 37 | 38 | .icon-project:before { 39 | content: "\e911"; 40 | } 41 | 42 | -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/iconfont/iconfont.eot -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.js: -------------------------------------------------------------------------------- 1 | !function(t){var e,a,l,n,i,o,c='',d=(d=document.getElementsByTagName("script"))[d.length-1].getAttribute("data-injectcss");if(d&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}function s(){i||(i=!0,l())}e=function(){var t,e,a,l;(l=document.createElement("div")).innerHTML=c,c=null,(a=l.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",t=a,(e=document.body).firstChild?(l=t,(a=e.firstChild).parentNode.insertBefore(l,a)):e.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(e,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),e()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(l=e,n=t.document,i=!1,(o=function(){try{n.documentElement.doScroll("left")}catch(t){return void setTimeout(o,50)}s()})(),n.onreadystatechange=function(){"complete"==n.readyState&&(n.onreadystatechange=null,s())})}(window); -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "2196211", 3 | "name": "simple-blog", 4 | "font_family": "iconfont", 5 | "css_prefix_text": "icon-", 6 | "description": "", 7 | "glyphs": [ 8 | { 9 | "icon_id": "3060566", 10 | "name": "网易云音乐", 11 | "font_class": "wangyiyunyinle", 12 | "unicode": "e7ee", 13 | "unicode_decimal": 59374 14 | }, 15 | { 16 | "icon_id": "8709281", 17 | "name": "网易云", 18 | "font_class": "wangyiyun", 19 | "unicode": "e600", 20 | "unicode_decimal": 58880 21 | }, 22 | { 23 | "icon_id": "15788441", 24 | "name": "网易云", 25 | "font_class": "wangyiyun1", 26 | "unicode": "e7ae", 27 | "unicode_decimal": 59310 28 | }, 29 | { 30 | "icon_id": "6229057", 31 | "name": "工具", 32 | "font_class": "tools", 33 | "unicode": "e694", 34 | "unicode_decimal": 59028 35 | }, 36 | { 37 | "icon_id": "13744032", 38 | "name": "vue", 39 | "font_class": "vue", 40 | "unicode": "e69a", 41 | "unicode_decimal": 59034 42 | }, 43 | { 44 | "icon_id": "12387169", 45 | "name": "项目", 46 | "font_class": "project", 47 | "unicode": "e911", 48 | "unicode_decimal": 59665 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/iconfont/iconfont.woff -------------------------------------------------------------------------------- /docs/.vuepress/public/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /docs/.vuepress/public/images/avatar.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/avatar.jfif -------------------------------------------------------------------------------- /docs/.vuepress/public/images/avatar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 12 | 29 | 32 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /docs/.vuepress/public/images/bg-logo.svg: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /docs/.vuepress/public/images/bookbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/bookbook.png -------------------------------------------------------------------------------- /docs/.vuepress/public/images/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /docs/.vuepress/public/images/gitee.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/.vuepress/public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/logo.png -------------------------------------------------------------------------------- /docs/.vuepress/public/images/qq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/qq.jpg -------------------------------------------------------------------------------- /docs/.vuepress/public/images/ruanyf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/ruanyf.jpg -------------------------------------------------------------------------------- /docs/.vuepress/public/images/wx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/.vuepress/public/images/wx.jpg -------------------------------------------------------------------------------- /docs/.vuepress/public/utils/js/click.js: -------------------------------------------------------------------------------- 1 | var a_idx = 0; 2 | 3 | function getRandomColor(max, min) { 4 | return Math.floor(Math.random() * (max - min + 1) + min); 5 | } 6 | jQuery(document).ready(function ($) { 7 | $("body").click(function (e) { 8 | var a = new Array("❤富强❤", "❤民主❤", "❤文明❤", "❤和谐❤", "❤自由❤", "❤平等❤", "❤公正❤", "❤法治❤", "❤爱国❤", "❤敬业❤", "❤诚信❤", "❤友善❤"); 9 | var $w = $("").text(a[a_idx]); 10 | a_idx = (a_idx + 1) % a.length; 11 | var x = e.pageX, 12 | y = e.pageY; 13 | $w.css({ 14 | "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, 15 | "top": y - 20, 16 | "left": x, 17 | "position": "absolute", 18 | "font-weight": "bold", 19 | "color": `rgba(${getRandomColor(255,0)},${getRandomColor(255,0)},${getRandomColor(255,0)})`, 20 | "user-select": 'none', 21 | "cursor": 'default' 22 | }); 23 | $("body").append($w); 24 | $w.animate({ 25 | "top": y - 180, 26 | "opacity": 0 27 | }, 28 | 1500, 29 | function () { 30 | $w.remove(); 31 | }); 32 | }); 33 | }); -------------------------------------------------------------------------------- /docs/.vuepress/public/utils/js/jq3.5.1.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 8 | 9 | ## 介绍 10 | :::tip 11 | 我是bookbook,热爱编程,乐于分享 12 | 13 | 目前大三(2020)即将离开校园踏入社会;大学就要结束了,以前的种种过往一一浮现于脑海中,仿佛在眨眼之间一样,有开心与不开心,有尴尬与不舍,每当回想起来还是会不自觉的傻笑,每当回想起那些尴尬的瞬间,想原地打个洞钻进去,不过这些都过去了,人往高处走水往低处流,不一样的年龄有不一样的收获,加油吧 打工人。 14 | 15 | ::: 16 | 17 | ## 我的经历 18 | 目前大三(2020)准备实习,就读于说不出名字的一个大专,非常后悔大一的时候把时间都花在打游戏身上,当然更后悔的是高中也把时间花在打游戏上了(初中也是 哈哈哈)。 19 | 20 | 大二开始我的脑海中逐渐出现了找工作的想法,并且一发不可收拾;于是开始认真学起了编程,放弃了游戏(到现在能不碰游戏了,以前是忠实LOL粉),当初还在前端与后端之间犹豫,后来考虑到后端好像要难一点前端要简单一点,由于自己是刚开始学的就选择了前端方向(踏上前端之路的原因),接下来就是 在 BiliBili 的大海里疯狂游荡,自学了 Js、Vue、Node、等等乱起八糟的东西。 21 | 22 | 闲来无事感觉学了这么久想要做出来点什么,于是就有了你现在看到的这个网站,花了不到三天的时间完成(哈哈哈,我也不知道怎么回事,就配置一个主题的事情,我居然都要搞那么就,我也是服我自己了) 23 | 24 | 以前的话,想也不敢想我居然能每天起来敲代码搞到大晚上的还在敲(我打游戏都没有这么有劲,并且完全没有打玩游戏过后那一阵子的空虚、自责,反而是在感叹怎么又黑了,一天过得好快啊,真的,当你认真做一件事情的时候,你会发现时间过得飞快。) 25 | 26 | 27 | 爱好: 28 | 29 | - 平时喜欢骑行(单车)、打羽毛球(很菜)、看书(刘慈欣忠实粉丝) 偶尔也会买两本编程类的书,打游戏(在后面学习编程的时间里也没碰过了,希望以后还有机会) 30 | 31 | ## 目标 32 | 33 | 很喜欢阮一峰老师的一句话,我把它放在这里,努力向大牛学习: 34 | 35 | ![ruanyf](/images/ruanyf.jpg) 36 | 37 | 阮一峰 38 | 39 | 2017年8月1日,写于杭州 40 | 41 | 42 | ## 联系我 43 | 最后,如果你有什么奇怪的想法或者疑惑你都可以联系我,希望我能帮助到你。 44 | 45 | - WX:P200048 46 | 47 | - QQ:2845486124 48 | 49 | - E-Mail:2845486124@qq.com 50 | 51 | |QQ|WeChat| 52 | |--|--| 53 | |![QQ](/images/qq.jpg)|![wx](/images/wx.jpg)| -------------------------------------------------------------------------------- /docs/views/About/resume.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "简历" 3 | date: 2020-11-11 13:56:00 4 | sidebar: "auto" 5 | keys: 6 | - "e10adc3949ba59abbe56e057f20f883e" 7 | publish: false 8 | --- 9 | :::tip 基本信息 10 | 姓名:彭刚 11 | 邮箱:2845486124@qq.com 12 | 手机:15884781477 17743272577 13 | ::: 14 | 15 | ## 这是我的个人简历 16 | 17 | 正在火热更新中 -------------------------------------------------------------------------------- /docs/views/JavaScript/ES6/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES6-JS进阶之面向对象-class 3 | date: 2020-11-10 15:16:00 4 | sidebar: "auto" 5 | categories: 6 | - JavaScript 7 | tags: 8 | - JavaScript 9 | - ES6 10 | --- 11 | :::tip 12 | **面向过程POP**就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 13 | **面向对象OOP**是把事务分解成为一个个对象,然后由对象之间分工与合作。 14 | ::: 15 | 16 | 17 | 18 | ## 一、面向对象导读 19 | - **面向过程POP**就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 20 | - **面向对象OOP**是把事务分解成为一个个对象,然后由对象之间分工与合作。 21 | 22 | 两者比较 23 | 24 | **面向过程** 25 | - 优点:**性能**比面向对象**高**,适合跟硬件联系很紧密的东西, 26 | - 缺点:**不易维护、不易复用、不易扩展**。 27 | 28 | **面向对象** 29 | - 优点:**易维护、易复用、易扩展**,由于面向对象有封装、继承、多态性的特性,可以设计出**低耦合**的系统,使系统 更加灵活、更加易于维护, 30 | - 缺点:**性能**比面向过程**低**。 31 | 32 | 33 | >面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作 34 | 35 | **举个栗子**:将大象装进冰箱,面向对象做法 36 | 37 | 先找出对象,并写出这些对象的功能 38 | 1. 大象对象 39 | 进去 40 | 2. 冰箱对象 41 | 打开 42 | 关闭 43 | 3. 使用大象和冰箱的功能 44 | 45 | 面向对象是**以对象**功能来**划分问题**,而不是步骤。 46 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201105135955665.png?) 47 | 48 | ## 二、ES6中的类和对象 49 | >在 JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。 50 | 51 | 现实生活中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如,一本书、一辆汽车、一个人可以是“对象”,—个数据库、一张网页、一个与远程服务器的连接也可以是“对象”. 52 | 53 | 对象是由**属性**和**方法**组成的 54 | - 属性:事物的**特征**,在对象中用**属性**来表示(常用名词) 55 | - 方法:事物的**行为**,在对象中用**方法**来表示(常用动词) 56 | 57 | ### 2.1 class 类 58 | 在ES6中新增加了类的概念,可以使用 class关键字声明一个类,之后以这个类来实例化对象。 59 | 60 | **类**抽象了对象的公共部分,它**泛指某大类**(class) 61 | **对象**特指某一个,通过类实例化**一个具体**的对象 62 | 63 | 面向对象的思维特点: 64 | 1. 抽取(抽象)对象共用的属性和行为组织(封装)成一个**类**(模板 65 | 2. 对类进行实例化获取类的**对象** 66 | 67 | ### 2.2 创建类 68 | 语法: 69 | ```javascript 70 | class name{ 71 | // class body 72 | } 73 | ``` 74 | 75 | 创建实例: 76 | 77 | ```javascript 78 | var foo = new name() 79 | ``` 80 | ### 2.3 constructor 构造函数 81 | 82 | **constructor**()方法是类的构造函数(默认方法),**用于传递参数返回实例对象** 83 | 过**new命令**生成对象实例时,自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个 **constructor**() 84 | 85 | 86 | ### 2.4 创建第一个类和对象 87 | 88 | ```javascript 89 | // 1.创建类 class 创建一个明显类 90 | class Star { 91 | constructor(uname, age) { 92 | this.uname = uname //this 指向创建的实例 this=>ldh 93 | this.age = age 94 | } 95 | } 96 | 97 | // 2.利用类创建对象 98 | let ldh = new Star('刘德华', 18) 99 | let zxy = new Star('张学友', 20) 100 | 101 | console.log(ldh); // {uname: "刘德华", age: 18} 102 | console.log(zxy); // {uname: "张学友", age: 20} 103 | ``` 104 | 注意事项: 105 | 1. 通过class 关键字创建类, 类名我们还是习惯性定义**首字母大写** 106 | 2. 类里面有个constructor 函数,可以**接受**传递过来的**参数**,同时**返回实例对象** 107 | 3. constructor 函数 只要 new 生成实例时,就会**自动调用**这个函数,如果我们不写这个函数,类也会**自动生成**这个**函数** 108 | 4. 生成实例 new 不能省略 109 | 5. 最后注意语法规范, 创建类 **类名**后面**不**要**加小括号**,生成实例 类名后面加小括号, 构造函数不需要加function 110 | 111 | 112 | ### 2.5 类中添加方法 113 | 注意事项: 114 | 1. 类里边**所有函数** **不需要写 function 关键字** 115 | 2. 多个函数或者方法之间**不需要加** **,(逗号)** 116 | ```javascript 117 | // 1.创建类 class 创建一个明显类 118 | class Star { 119 | constructor(uname, age) { 120 | this.uname = uname //this 指向创建的实例 this=>ldh 121 | this.age = age 122 | } 123 | sing(song) { 124 | console.log(this.uname + '唱' + song) 125 | } 126 | } 127 | // 2.利用类创建对象 128 | let ldh = new Star('刘德华', 18) 129 | let zxy = new Star('张学友', 20) 130 | 131 | console.log(ldh); // {uname: "刘德华", age: 18} 132 | console.log(zxy); // {uname: "张学友", age: 20} 133 | 134 | ldh.sing('冰雨') //刘德华唱冰雨 135 | zxy.sing('李香兰') //张学友唱李香兰 136 | ``` 137 | ### 2.6 注意事项 138 | 1. 在Es6中类**没有变量提升**,所以必须先**定义类**,**才能**通过类**实例化**对象 139 | 2. 类里面共有的属性和方法**一定要加this使用** 140 | 3. 类里边的this指向问题 141 | 142 | - **constructor里面的this指向实例对象** 143 | - **方法里面的this指向这个方法的调用者** 144 | 145 | **this指向问题案例**: 146 | ```javascript 147 | var that; 148 | var _that; 149 | class Star { 150 | constructor(uname, age) { 151 | // constructor 里面的this 指向的是 创建的实例对象 152 | that = this; 153 | console.log(this); 154 | 155 | this.uname = uname; 156 | this.age = age; 157 | // this.sing(); 158 | this.btn = document.querySelector('button'); 159 | this.btn.onclick = this.sing; 160 | } 161 | sing() { 162 | // 这个sing方法里面的this 指向的是 btn 这个按钮,因为这个按钮调用了这个函数 163 | console.log(this); 164 | 165 | console.log(that.uname); // that.uname刘德华 that里面存储的是constructor里面的this 166 | } 167 | dance() { 168 | // 这个dance里面的this 指向的是实例对象 ldh 因为ldh 调用了这个函数 169 | _that = this; 170 | console.log(this); //Star {uname: "刘德华", age: undefined, btn: button} 171 | 172 | } 173 | } 174 | 175 | var ldh = new Star('刘德华'); 176 | console.log(that === ldh); //true 177 | ldh.dance(); 178 | console.log(_that === ldh); // true 179 | ``` 180 | 181 | ## 三、继承 182 | 现实中的继承:子承父业,比如我们都继承了父亲的姓 183 | 184 | 程序中的继承:**子类**可以**继承父类**的一些**属性和方法**。 185 | 186 | >继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的方法,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原 187 | 则) 188 | 189 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201105195134165.png?) 190 | 191 | 192 | ### 3.1 语法 193 | 194 | ```javascript 195 | class Father{ 196 | //父类 197 | } 198 | class son extends father{ 199 | //子类继承父类 200 | } 201 | ``` 202 | 203 | 示例: 204 | 205 | ```javascript 206 | // 1.类的继承 207 | class Father{ 208 | constructor(){ 209 | } 210 | money(){ 211 | console.log(100); 212 | } 213 | } 214 | 215 | class Son extends Father{ 216 | } 217 | 218 | let son = new Son() 219 | son.money() //100 220 | ``` 221 | 222 | ### 3.2 super(超级的) 关键字 223 | **super**关键字用于访问和调用对象父类上的函数。可以**调用**父类的**构造函数**,**也可以调用**父类的**普通函数** 224 | 225 | 226 | 示例:调用**构造函数** 227 | 228 | ```javascript 229 | class Father{ 230 | constructor(x,y){ 231 | this.x = x 232 | this.y = y 233 | } 234 | sum(){ 235 | console.log(this.x + this.y) 236 | } 237 | } 238 | class Son extends Father{ 239 | constructor(x,y){ 240 | // 这里不能访问父类的 this,父类的sum函数中的this是父类的,子类值没有传递进去 241 | // this.x = x // 报错 242 | // this.y = y // 报错 243 | 244 | super(x,y);//调用父类中的构造函数 245 | } 246 | } 247 | 248 | let son = new Son(1,2) 249 | son.sum() // 3 250 | ``` 251 | 252 | 示例:调用**普通函数** 253 | 254 | ```javascript 255 | // super调用父类的普通函数 256 | class Father { 257 | say() { 258 | return '我是爸爸' 259 | } 260 | } 261 | class Son extends Father { 262 | say() { 263 | //调用父类的普通方法 264 | console.log(super.say()); //我是爸爸 265 | } 266 | } 267 | let son = new Son() 268 | ``` 269 | # ### 3.3 继承方法的同时扩展方法 270 | 需求:继承父类的加法方法的同时,自己扩展一个减法方法。 271 | 272 | 注意事项:**调用父类的函数时**,super必须在子类this之前调用(**父亲必须放在之前**) 273 | ```javascript 274 | // 父类加法操作 275 | class Father { 276 | constructor(x, y) { 277 | this.x = x 278 | this.y = y 279 | } 280 | sum() { 281 | console.log(this.x + this.y); 282 | } 283 | } 284 | // 子类继承父类加法方法的同时扩展减法操作 285 | class Son extends Father { 286 | constructor(x, y) { 287 | // 调用父类的构造函数 super必须在子类this之前调用(父亲必须放在之前) 288 | super(x, y) 289 | 290 | this.x = x 291 | this.y = y 292 | } 293 | subtract() { 294 | console.log(this.x - this.y); 295 | } 296 | } 297 | 298 | let son = new Son(5, 3) 299 | son.subtract() // 2 300 | son.sum() // 8 301 | ``` 302 | 303 | 304 | ## 四、Tab栏 案例 305 | 功能描述: 306 | 307 | 1. 点击Tab栏能实现**切换** 308 | 2. Tab栏和内容 点击右上角×号能**删除**当前**栏目和内容** 309 | 3. 点击加号能实现**增加Tab栏**功能 310 | 4. **双击Tab栏**,可以**编辑Tab栏名称** 311 | 5. **双击内容**,可**编辑内容** 312 | 313 | ### 获取: 314 | 1. [点此访问该Demo](http://120.53.120.229:8080/Project/) 315 | 2. 你可以去蓝奏云下载: [面向对象案例.zip](https://wws.lanzous.com/i2Lw6i35pta) 的Demo文件 316 | 3. 或观看**文档底部**的 **实例代码!** 317 | 318 | 319 | 是不是太棒了,在21世纪是不是 很久没有遇到博主这样贴心的人才了吧! 320 | 那还愣着干什么, **点赞关注** 走一波啊! 321 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201105194549612.png) 322 | 323 | ### 4.1 点击Tab栏能实现切换 Tab栏和内容 324 | ![An image](../images/1.gif) 325 | 326 | ### 4.2 点击右上角×号能删除当前栏目和内容 327 | ![An image](../images/2.gif) 328 | 329 | ### 4.3 点击加号能实现增加Tab栏效果 330 | ![An image](../images/3.gif) 331 | 332 | ### 4.4 双击Tab栏,可以编辑Tab栏名称 333 | ![An image](../images/4.gif) 334 | 335 | ### 4.5 双击内容,可编辑内容 336 | ![An image](../images/5.gif) 337 | 338 | 339 | 340 | ### 4.6 细节方面: 341 | 342 | 1. **删除**一个栏目**后默认选中前一个**栏目 343 | 2. 新增的栏目**也能实现基本功能** 344 | 3. 当默认选中的是第一个,并且删除的时候,选中删除后的第一个 345 | 4. 在编辑Tab名称的时候,**回车键**也能**确认**编辑 346 | 5. 新增的栏目**默认选中** 347 | 348 | 349 | 再说一遍: [点此访问该Demo](http://120.53.120.229:8080/Project/) 350 | 你可以去蓝奏云下载: [面向对象案例.zip](https://wws.lanzous.com/i2Lw6i35pta) 的Demo文件 351 | 或观看**文档底部**的 **实例代码!** 352 | 353 | 注意:该demo小图标用到了 **[阿里巴巴的 iconfont](https://www.iconfont.cn/)** ,复制我贴出的代码会**没有小图标**哦! 354 | 355 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201105195247188.png?) 356 | 357 | 358 |

JS部分:tab.js

359 | 360 | ```javascript 361 | let that = null 362 | class Tab { 363 | constructor(id) { 364 | // 1.获取元素 365 | this.main = document.querySelector(id) 366 | this.tabadd = this.main.querySelector('.tabadd') 367 | 368 | // li的父元素 369 | this.ul = this.main.querySelector('.fisrstnav ul:first-child') 370 | // section福元素 371 | this.fatherSection = this.main.querySelector('.tabscon') 372 | 373 | that = this 374 | this.init() 375 | } 376 | // 初始化 377 | init() { 378 | this.updateNode(); 379 | 380 | // inti 初始化操作 让相关的元素绑定事件 381 | for (let i = 0; i < this.lis.length; i++) { 382 | this.lis[i].setAttribute('data-index', i) 383 | this.lis[i].onclick = this.toggleTab; 384 | this.remove[i].onclick = this.removeTab; 385 | this.spans[i].ondblclick = this.editTab; 386 | this.sections[i].ondblclick = this.editTab; 387 | } 388 | 389 | this.tabadd.onclick = this.add 390 | } 391 | // 更新数据列表 392 | updateNode() { 393 | this.lis = this.main.querySelectorAll('li') 394 | this.sections = that.main.querySelectorAll('section') 395 | this.remove = this.main.querySelectorAll('.icon-guanbi') 396 | this.spans = this.main.querySelectorAll('.fisrstnav li span:nth-child(1)') 397 | console.log('this.spans: ', this.spans); 398 | } 399 | // 1.切换功能 400 | toggleTab() { 401 | that.clearClass() 402 | 403 | this.className = 'liactive' 404 | that.sections[this.getAttribute('data-index')].className = 'conactive' 405 | 406 | } 407 | clearClass() { 408 | for (let i = 0; i < this.lis.length; i++) { 409 | this.lis[i].className = '' 410 | this.sections[i].className = '' 411 | } 412 | } 413 | // 2.添加 414 | add() { 415 | // 清除所有选中 416 | that.clearClass() 417 | 418 | // 1.创建 li元素和section元素 419 | let random = Math.round(Math.random() * 100, 3) 420 | let li = '
  • Tab
  • ' 421 | let section = '
    新内容' + random + '
    ' 422 | 423 | // 2.追加元素 使用 insertAdjacentHTML 支持字符串形式 424 | that.ul.insertAdjacentHTML('beforeend', li) 425 | that.fatherSection.insertAdjacentHTML('beforeend', section) 426 | 427 | // 更新 428 | that.init() 429 | } 430 | 431 | // 3.删除 432 | removeTab(e) { 433 | // 阻止时间冒泡 防止触发li的点击切换事件 434 | e.stopPropagation(); 435 | 436 | let index = this.parentNode.getAttribute('data-index') 437 | 438 | // 根据索引号 删除对应li和section remove方法可以直接删除指定的元素 439 | that.lis[index].remove() 440 | that.sections[index].remove() 441 | 442 | that.init() 443 | 444 | // 当我们删除的不是选中状态的li的时候,原来的选定状态保持不变即可 445 | 446 | // 该句核心思想,如果删除的是当前选中项,删除过后页面上没有 .liactive 进入判断,直接return 否则跳过 447 | if (document.querySelector('.liactive')) return; 448 | 449 | // 当我们删除过后,设置默认选中其一个 450 | index == 0 ? index = 0 : index-- 451 | that.lis[index] && that.lis[index].click() 452 | } 453 | 454 | // 4.编辑 455 | editTab(e) { 456 | // 双击禁止选中文字 457 | window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); 458 | 459 | let str = this.innerHTML; 460 | console.log(this); 461 | this.innerHTML = '' 462 | let input = this.children[0] 463 | input.value = str 464 | input.select() //文本框内的文字处于选定状态 465 | 466 | // 按下回车 467 | input.addEventListener('keyup', function (e) { 468 | if (e.keyCode === 13) { 469 | // 手动调用表单失去焦点事件 470 | this.blur(); 471 | } 472 | }) 473 | input.onblur = function () { 474 | debugger 475 | this.parentNode.innerHTML = this.value 476 | } 477 | } 478 | } 479 | #let tab = new Tab('#tab'); 480 | ``` 481 | 482 |

    HTML部分:index.html

    483 | 484 | ```html 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 面向对象 Tab 493 | 494 | 495 | 496 | 497 | 498 | 499 |
    500 |

    501 | Js 面向对象 动态添加标签页 502 |

    503 |
    504 | 505 | 515 | 516 | 517 |
    518 |
    测试1
    519 |
    测试2
    520 |
    测试3
    521 |
    522 |
    523 |
    524 | 525 | 526 | 527 | 528 | 529 | ``` 530 | 531 |

    CSS部分:tab.css

    532 | 533 | ```css 534 | * { 535 | margin: 0; 536 | padding: 0; 537 | } 538 | 539 | ul li { 540 | list-style: none; 541 | } 542 | 543 | main { 544 | width: 960px; 545 | height: 500px; 546 | border-radius: 10px; 547 | margin: 50px auto; 548 | } 549 | 550 | main h4 { 551 | height: 100px; 552 | line-height: 100px; 553 | text-align: center; 554 | } 555 | 556 | .tabsbox { 557 | width: 900px; 558 | margin: 0 auto; 559 | height: 400px; 560 | border: 1px solid lightsalmon; 561 | position: relative; 562 | } 563 | 564 | nav ul { 565 | overflow: hidden; 566 | } 567 | nav ul li { 568 | float: left; 569 | width: 100px; 570 | height: 50px; 571 | line-height: 50px; 572 | text-align: center; 573 | #border-right: 1px solid #ccc; 574 | position: relative; 575 | cursor: pointer; 576 | user-select: none; 577 | } 578 | 579 | nav ul li.liactive { 580 | #border-bottom: 2px solid #fff; 581 | z-index: 9; 582 | } 583 | nav ul li.liactive span:first-child{ 584 | font-size: 18px; 585 | font-weight: bold; 586 | } 587 | ##tab input { 588 | width: 80%; 589 | height: 60%; 590 | } 591 | 592 | nav ul li span:last-child { 593 | position: absolute; 594 | user-select: none; 595 | font-size: 12px; 596 | top: -18px; 597 | right: 0; 598 | display: inline-block; 599 | height: 20px; 600 | } 601 | 602 | .tabadd { 603 | position: absolute; 604 | /* width: 100px; */ 605 | top: 0; 606 | right: 0; 607 | cursor: pointer; 608 | } 609 | 610 | .tabadd span { 611 | display: block; 612 | width: 20px; 613 | height: 20px; 614 | line-height: 20px; 615 | text-align: center; 616 | #border: 1px solid #ccc; 617 | float: right; 618 | margin: 10px; 619 | user-select: none; 620 | } 621 | 622 | .tabscon { 623 | width: 100%; 624 | height: 300px; 625 | position: absolute; 626 | padding: 30px; 627 | top: 50px; 628 | left: 0px; 629 | box-sizing: border-box; 630 | #border-top: 1px solid #ccc; 631 | } 632 | 633 | .tabscon section, 634 | .tabscon section.conactive { 635 | display: none; 636 | width: 100%; 637 | height: 100%; 638 | } 639 | 640 | .tabscon section.conactive { 641 | display: block; 642 | } 643 | ``` 644 | -------------------------------------------------------------------------------- /docs/views/JavaScript/images/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/JavaScript/images/1.gif -------------------------------------------------------------------------------- /docs/views/JavaScript/images/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/JavaScript/images/2.gif -------------------------------------------------------------------------------- /docs/views/JavaScript/images/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/JavaScript/images/3.gif -------------------------------------------------------------------------------- /docs/views/JavaScript/images/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/JavaScript/images/4.gif -------------------------------------------------------------------------------- /docs/views/JavaScript/images/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/JavaScript/images/5.gif -------------------------------------------------------------------------------- /docs/views/Vue/Vue/Vue.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vue从入门到入土 3 | date: 2020-11-5 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | publish: false 10 | 11 | --- 12 | 13 | ::: tip 14 | 在本地配置好 VuePress 环境和 TravisCI 配置文件,推送到 Github,触发 TravisCI 自动构建、生成在另一个分支的在线文档 15 | ::: 16 | 17 | 18 | 19 | - > [最新博客链接](https://tsanfer.xyz/views/frontEnd/vuepress_theme_reco-Github_Actions.html) 20 | - > [Github 链接](https://github.com/Tsanfer/vuepress_theme_reco-Github_Actions) 21 | 22 | -------------------------------------------------------------------------------- /docs/views/Vue/VuePress/VuePress.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: VuePress从入门到放弃 3 | date: 2020-11-6 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | - VuePress 10 | publish: false 11 | --- 12 | 13 | ::: tip 14 | 在本地配置好 VuePress 环境和 TravisCI 配置文件,推送到 Github,触发 TravisCI 自动构建、生成在另一个分支的在线文档 15 | ::: 16 | 17 | 18 | 19 | - > [最新博客链接](https://tsanfer.xyz/views/frontEnd/vuepress_theme_reco-Github_Actions.html) 20 | - > [Github 链接](https://github.com/Tsanfer/vuepress_theme_reco-Github_Actions) 21 | 22 | -------------------------------------------------------------------------------- /docs/views/Vue/VuePress/aboutBlog.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 关于本博客 3 | date: 2020-11-14 22:42:00 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | - VuePress 10 | sticky: 1 11 | --- 12 | 13 | :::tip 14 | 如何搭建一个和博主一样的博客网站?请看这里 15 | ::: 16 | 17 | 18 | 19 | ## 一、介绍 20 | 首先,我需要告诉你的是,其实搭建一个这样的博客网站,本身并不复杂,甚至可以说简单(当然,在你不自主开发主题的情况下),你只需要了解 Js+Vue+VuePress即可。 21 | 博主从看见别人的博客,到自己开始搭建,**总耗时三天**,并且还是拖拖拉拉的状态下完成的,如果你认真的话,我相信你甚至不需要**一天**就能搞好,是不是 so easy。那么 就让我们开始吧。 22 | 23 | ## 二、VuePress 24 | 本博客是基于尤大大(尤雨溪)开发的 一款免费开源的 极简网站生成器 [VuePress](https://vuepress.vuejs.org/zh/guide/) + [vuepress-theme-reco](https://vuepress-reco-doc.now.sh/) 主题 构建而成,如果你还不知道 VuePress 是什么东西,那么我推荐你去 Bilibili看一下这两个视频,我相信,你去看完这两个视频过后,就不会在这儿继续听我 瞎bb了。 25 | 26 | 1. bilibili [一步步搭建 VuePress 及优化](https://www.bilibili.com/video/BV1vb411m7NY?from=search&seid=12895446522739007147) 27 | 2. bilibili [1小时带你搭建vuepress高大上个人博客(极速上手版)](https://www.bilibili.com/video/BV17t41177cr?from=search&seid=12895446522739007147) 28 | 29 | 建议你两个视频都看,先看第一个。 30 | 如果你在学习过程中**遇到任何问题**都可以**直接找我**,你可以在本文下方留言,可以通过QQ:2845486124 联系我,也可以通过微信 P200048联系我,总之一切能联系到我的地方都行。 31 | 本人逛CSDN 比较多哦~(你可以CSDN私信) 32 | 33 | 34 | ## 三、VuePress-theme-reco 35 | 36 | 当你看完以上两个视频过后,你会发现你搭建的博客是类似 **Vue** 官网风格的,例如: 37 | ![cli](../images/vuepress/cli.png) 38 | ![router](../images/vuepress/router.png) 39 | 40 | 但是你看见的大多数个人博客并不是那些风格,例如: 41 | ![bookbook](../images/vuepress/bookbook.png) 42 | ![lookroot](../images/vuepress/lookroot.png) 43 | 44 | 此时 你需要了解 [VuePress-theme-reco](https://vuepress-reco-doc.now.sh/),这是一位大佬开源的一款 VuePress 主题。使用它你就能使用极少的配置搭建一款不错的个人博客。 45 | 46 | 47 | 好了,本文就到这里,如果你有什么奇怪的想法或者疑惑可以联系我,也许我能帮助到你。 48 | 49 | |QQ|WeChat| 50 | |--|--| 51 | |![QQ](/images/qq.jpg)|![wx](/images/wx.jpg)| -------------------------------------------------------------------------------- /docs/views/Vue/VueProject/readme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "如何将本地Vue项目部署到服务器" 3 | date: 2020-11-11 12:43:00 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | - VueProject 10 | --- 11 | 12 | :::tip 13 | 在本地项目已经搭建完成的情况下,如何将项目发布到服务器?并做适当优化 14 | ::: 15 | 16 | 17 | 18 | ## 一、 通过node创建web服务器 19 | :::tip 核心思路 20 | 创建node项目,并安装 express,通过 express 快速创建web服务器,将vue打包生成的dist文件夹 21 | 托管为静态资源即可,关键代码如下: 22 | ::: 23 | 24 | ```js 25 | 26 | //创建web服务器 27 | const app = require('express')(); 28 | 29 | //托管静态资源 30 | app.use(express.static('./dist')) 31 | 32 | //启动web服务器 33 | app.listen(8080, () => { 34 | console.log("server StartUp: http:127.0.0.1:8080"); 35 | }) 36 | ``` 37 | 38 | ### 1.1 新建一个文件夹,这里我命名为:`vue_shop_server`,以后该目录即是我们的根目录。 39 | ![文件夹](../images/project/file.png) 40 | 41 | 进入该目录,打开终端 使用 `npm init -y` 初始化项目 42 | 43 | 44 | ## 二、打包项目 45 | 46 | 找到需要部署到服务器的项目,输入 `npm run build`,打包项目 47 | 打包好之后,把生成的 `dist`文件夹,复制一份放到我们刚刚新建的`vue_shop_server`目录下。 48 | 49 | 首先使用 `npm i express -S` 安装一个第三方的包 50 | 然后在我们的根目录下新建一个`app.js`文件 ,该文件是我们的项目入口文件。 51 | 在该文件中输入下例代码: 52 | 53 | ```js 54 | //创建web服务器 55 | const app = express() 56 | 57 | //托管静态资源 58 | app.use(express.static('./dist')) 59 | 60 | //启动web服务器 61 | app.listen(8080, () => { 62 | console.log("server StartUp: http:127.0.0.1:8080"); 63 | }) 64 | ``` 65 | 66 | 接下来我们可以`node .\app.js` 运行一下看,能否打印出 server StartUp... 67 | 当终端中正常打印的话,则说明我们的服务启动成功,可以前往`http:127.0.0.1:8080`访问。 68 | 69 | 70 | ## 三、开启gzip文件压缩 71 | :::tip gzip概述 72 | HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来 73 | ::: 74 | 75 | ### 3.1 首先安装和导入扩展包 76 | 安装: 77 | 78 | `npm i compression -S` 79 | 80 | 81 | 安装完成后,我们需要导入这个包: 82 | 在我们的 `app.js`文件头部加入如下一句代码: 83 | ```js 84 | const compression = require("compression") 85 | ``` 86 | 87 | 接下来在托管静态资源之前,注册中间件 88 | ```js 89 | app.use(compression()) 90 | ``` 91 | 92 | 在浏览器当中,打开我们的项目,打开开发者选项,找到`Network`对比一下没有使用 gzip 和 使用gzip的效果,可以发现我们的数据大小确实有被压缩。 -------------------------------------------------------------------------------- /docs/views/Vue/VueRouter/VueRouter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: VueRoter 3 | date: 2020-11-7 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | - VueRouter 10 | publish: false 11 | --- 12 | 13 | ::: tip 14 | VueRoter即Vue路由 15 | ::: 16 | 17 | 18 | 19 | - > [最新博客链接](https://tsanfer.xyz/views/frontEnd/vuepress_theme_reco-Github_Actions.html) 20 | - > [Github 链接](https://github.com/Tsanfer/vuepress_theme_reco-Github_Actions) 21 | 22 | -------------------------------------------------------------------------------- /docs/views/Vue/Vuex/Vuex.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vuex 状态管理系统 3 | date: 2020-11-10 15:16:00 4 | sidebar: "auto" 5 | categories: 6 | - Vue 7 | tags: 8 | - Vue 9 | - Vuex 10 | publish: false 11 | --- 12 | 13 | ::: tip 14 | 在本地配置好 VuePress 环境和 TravisCI 配置文件,推送到 Github,触发 TravisCI 自动构建、生成在另一个分支的在线文档 15 | ::: 16 | 17 | 18 | 19 | - > [最新博客链接](https://tsanfer.xyz/views/frontEnd/vuepress_theme_reco-Github_Actions.html) 20 | - > [Github 链接](https://github.com/Tsanfer/vuepress_theme_reco-Github_Actions) 21 | 22 | -------------------------------------------------------------------------------- /docs/views/Vue/images/project/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/project/file.png -------------------------------------------------------------------------------- /docs/views/Vue/images/public/qq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/public/qq.jpg -------------------------------------------------------------------------------- /docs/views/Vue/images/public/wx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/public/wx.jpg -------------------------------------------------------------------------------- /docs/views/Vue/images/vuepress/bookbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/vuepress/bookbook.png -------------------------------------------------------------------------------- /docs/views/Vue/images/vuepress/cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/vuepress/cli.png -------------------------------------------------------------------------------- /docs/views/Vue/images/vuepress/lookroot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/vuepress/lookroot.png -------------------------------------------------------------------------------- /docs/views/Vue/images/vuepress/router.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/penggang-home/vuepress-blog/2bcef670c708ef2f15a2a5b70f087f64333b5f1d/docs/views/Vue/images/vuepress/router.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vuepress-blog", 3 | "version": "1.0.0", 4 | "description": "一个极简主义Blog网站", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "docs" 8 | }, 9 | "scripts": { 10 | "serve": "vuepress dev docs", 11 | "build": "vuepress build docs", 12 | "deploy": "bash deploy.sh" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://gitee.com/penggang-home/vuepress-blog" 17 | }, 18 | "keywords": [], 19 | "author": "", 20 | "license": "ISC", 21 | "dependencies": { 22 | "@vuepress-reco/vuepress-plugin-kan-ban-niang": "^1.0.5", 23 | "@vuepress-yard/vuepress-plugin-window": "^1.0.10", 24 | "jquery": "^3.6.0", 25 | "vuepress-plugin-cursor-effects": "^1.0.2" 26 | }, 27 | "devDependencies": { 28 | "moment": "^2.29.1", 29 | "@vuepress-reco/vuepress-plugin-bgm-player": "^1.1.3", 30 | "vuepress": "^1.7.1", 31 | "vuepress-plugin-code-copy": "^1.0.6", 32 | "vuepress-plugin-reading-progress": "^1.0.10", 33 | "vuepress-theme-reco": "^1.6.6" 34 | } 35 | } 36 | --------------------------------------------------------------------------------