diff --git a/Dockerfile b/Dockerfile index 42d5004..5731814 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ ## 注意:vite构建需要支持node14以上,安装node16较为稳妥 FROM registry.cn-hangzhou.aliyuncs.com/142vip/node:16.12.0-alpine AS build_base - LABEL version="Beta1.0" description="408CSFamily合集" LABEL author="【Github&公众号】:Rong姐姐好可爱" email="fairy@2925.com" RUN mkdir -p /apps diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 38b1410..0000000 --- a/deploy.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env sh - -### - # @Description: 静态资源网站部署脚本 - # @Version: Beta1.0 - # @Author: 【B站&公众号】Rong姐姐好可爱 - # @Date: 2021-02-19 22:34:57 - # @LastEditors: 【B站&公众号】Rong姐姐好可爱 - # @LastEditTime: 2022-04-08 00:03:30 -### - -# abort on errors -set -e - -# build -npm run build - -# navigate into the build output directory -cd docs/.vuepress/dist - -# if you are deploying to a custom domain -# echo 'www.example.com' > CNAME - -git init -git add -A -git commit -m '408init' - - -## 配置个人信息 -git config user.name "mmdapl" -git config user.email "fairy@2925.com" - -# if you are deploying to https://.github.io -# git push -f git@github.com:/.github.io.git master - -# if you are deploying to https://.github.io/ -git push -f https://github.com/fairyfan1998/408CSFamily.git master:gh-pages - -cd - \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..43df01a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,26 @@ +version: '2' +services: + ### 408CSFamily服务,ip范围 172.30.0.200 + 408CSFamily: + image: registry.cn-hangzhou.aliyuncs.com/142vip/doc_book:408CSFamily_0.0.1 + container_name: 408CSFamily + restart: on-failure + hostname: 408CSFamily + ports: + - "7000:80" + networks: + net: + ipv4_address: 172.30.0.200 + +## 创建桥接网络 +networks: + ## 桥接网络名称,配合文件前缀,最后为dev_test_env_net 参考:https://www.jianshu.com/p/d70c61d45364 + net: + driver: bridge + # external: true + ipam: + driver: default + config: + - subnet: 172.30.0.0/24 + ## 网关 + gateway: 172.30.0.1 \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000..d456005 --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,112 @@ +/* + * @Description: + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-19 08:04:19 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 22:47:58 + */ + +// const { path } = require('@vuepress/utils') +module.exports = { + // 自定义主题 + // theme: path.resolve(__dirname, './theme'), + title: "计算机应试全家桶", + description: "磨刀不误砍柴工,读完硕士再打工", + base: "/408CSFamily/", + port: 4200, + head: [ + ["link", { rel: "icon", href: "/408_favicon.ico" }] + ], + themeConfig: { + logo: "/assets/408_logo.png", + darkMode: false, // 禁用夜色 + navbar: require("./config/navbar/index"), // 注意这个关键字有所改变 + sidebar: require("./config/sidebar/index"), + smoothScroll: true, + lastUpdated: true, + lastUpdatedText: "最近更新", + contributorsText: '贡献者', + notFound: ['宝贝不要急,我努力更新就会慢慢有的哟...想要什么,也欢迎微信后台私信哟!'],// 自定义404页面提示语,数组 + backToHome: '返回首页', // 返回首页 + repo: "https://github.com/mmdapl/408CSFamily", + sidebarDepth: 1, + editLink: false, + // 默认为 "Edit this page" + // editLinkText: '帮助我们改善此页面!', + displayAllHeaders: true,// 默认值:false 显示所有页面的标题链接 + search: true, + searchMaxSuggestions: 10, + }, + // plugins: [ + // // 全文搜索 参考配置:https://github.com/vuepress/vuepress-next/blob/main/docs/.vuepress/config.ts + // ['@vuepress/docsearch', + // { + // apiKey: '', + // indexName: '', + // locales: { + // '/': { + // placeholder: '搜索一下', + // translations: { + // button: { + // buttonText: '搜索一下', + // buttonAriaLabel: '搜索一下', + // }, + // modal: { + // searchBox: { + // resetButtonTitle: '清除查询条件', + // resetButtonAriaLabel: '清除查询条件', + // cancelButtonText: '取消', + // cancelButtonAriaLabel: '取消' + // }, + // startScreen: { + // recentSearchesTitle: '搜索历史', + // noRecentSearchesText: '没有搜索历史', + // saveRecentSearchButtonTitle: '保存至搜索历史', + // removeRecentSearchButtonTitle: '从搜索历史中移除', + // favoriteSearchesTitle: '收藏', + // removeFavoriteSearchButtonTitle: '从收藏中移除', + // }, + // errorScreen: { + // titleText: '无法获取结果', + // helpText: '你可能需要检查你的网络连接', + // }, + // footer: { + // selectText: '查询', + // selectKeyAriaLabel: 'Enter key', + // navigateText: '切换', + // navigateUpKeyAriaLabel: 'Arrow up', + // navigateDownKeyAriaLabel: 'Arrow down', + // closeText: '关闭', + // closeKeyAriaLabel: 'Escape key', + // searchByText: '技术支持', + // }, + // noResultsScreen: { + // noResultsText: '无法找到相关结果', + // suggestedQueryText: '你可以尝试查询', + // openIssueText: '你认为该查询应该有结果?', + // openIssueLinkText: '点击反馈', + // }, + // }, + // } + // } + // } + // }], + // // other plugins + // // [ + // // // 本地全文搜索 + // // '@vuepress/plugin-search', + // // { + // // locales: { + // // '/': { + // // placeholder: '搜索', + // // }, + // // '/zh/': { + // // placeholder: '搜索', + // // }, + // // }, + // // maxSuggestions: 10 // 显示最大搜索 + // // }, + // // ], + // ] +}; \ No newline at end of file diff --git a/docs/.vuepress/config/navbar.js b/docs/.vuepress/config/navbar.js new file mode 100644 index 0000000..641f1ad --- /dev/null +++ b/docs/.vuepress/config/navbar.js @@ -0,0 +1,86 @@ +/* + * @Description: + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-19 08:04:19 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-23 23:51:07 + */ + +module.exports = [ + // { + // text: "考研规划", + // link: "/DS1/" + // }, + { + text: '首页', + link: '/' + }, + { + text: "恶补算法", + // link: "/DS/coding/algorithm" + children: [{ + text: '课本习题', + link: '/' + }, { + text: '刷题笔记', + link: '/todo' + }, { + text: '在线刷题', + children: [{ + text: '杭电OJ', link: 'http://acm.hdu.edu.cn/' + }, + { + text: '牛客网', link: 'https://www.nowcoder.com/' + }, { + text: 'LeetCode', link: 'https://leetcode-cn.com/' + }] + }] + }, + { + text: "数据结构", + link: "/DS/basic_introduction" + }, + { + text: "操作系统", + link: "/OS/" + }, + { + text: "计算机组成原理", + link: "/CCP/" + }, + + { + text: "计算机网络", + link: "/CN/" + }, { + text: '其他资料', + children: [{ + text: '考研相关', + children: [{ + text: '111', + link: '/333' + }] + }, { + text: "思维导图", + children: [{ + text: '数据结构', + link: '/NoteMap/DS_Map' + }, { + text: '操作系统', + link: '/NoteMap/OS_Map' + }, { + text: '计算机组成原理', + link: '/NoteMap/CCP_Map' + }, { + text: '计算机网络', + link: '/NoteMap/CN_Map' + }] + }] + }, + { + text: "大事记", + link: "/Big_Event_History/" + }, + +]; diff --git a/docs/.vuepress/config/navbar/index.js b/docs/.vuepress/config/navbar/index.js new file mode 100644 index 0000000..0c04ab9 --- /dev/null +++ b/docs/.vuepress/config/navbar/index.js @@ -0,0 +1,85 @@ +/* + * @Description: + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-19 08:04:19 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 08:25:28 + */ + +module.exports = [ + // { + // text: "考研规划", + // link: "/DS1/" + // }, + { + text: '首页', + link: '/' + }, + { + text: "恶补算法", + children: [{ + text: '习题练手', + link: '/Algorithm/topic_practice' + }, { + text: '刷题笔记', + link: '/Algorithm/algorithm_note' + }, { + text: '在线刷题', + children: [{ + text: '杭电OJ', link: 'http://acm.hdu.edu.cn/' + }, + { + text: '牛客网', link: 'https://www.nowcoder.com/' + }, { + text: 'LeetCode', link: 'https://leetcode-cn.com/' + }] + }] + }, + { + text: "数据结构", + link: "/DS/basic_introduction" + }, + { + text: "操作系统", + link: "/OS/" + }, + { + text: "计算机组成原理", + link: "/CCP/" + }, + + { + text: "计算机网络", + link: "/CN/" + }, { + text: '其他资料', + children: [{ + text: '考研相关', + children: [{ + text: '111', + link: '/333' + }] + }, { + text: "思维导图", + children: [{ + text: '数据结构', + link: '/NoteMap/DS_Map' + }, { + text: '操作系统', + link: '/NoteMap/OS_Map' + }, { + text: '计算机组成原理', + link: '/NoteMap/CCP_Map' + }, { + text: '计算机网络', + link: '/NoteMap/CN_Map' + }] + }] + }, + { + text: "大事记", + link: "/Big_Event_History/" + }, + +]; diff --git a/docs/.vuepress/config/sidebar.js b/docs/.vuepress/config/sidebar.js new file mode 100644 index 0000000..6198a0b --- /dev/null +++ b/docs/.vuepress/config/sidebar.js @@ -0,0 +1,26 @@ +/* + * @Description: 测试 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-19 08:04:19 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-23 23:58:24 + */ +module.exports = { + // "/category/": require("../../category/sidebar_contents"), + // "/DataStructure/": require("../../category/sidebar_contents"), + "/DS": require("../../DS/sidebar_contents"), + "/OS": [ + { + text: 'VuePress Reference', + collapsible: true, + children: ['/reference/cli.md', '/reference/config.md'], + }, + { + text: 'Bundlers Reference', + collapsible: true, + children: ['/reference/bundler/vite.md', '/reference/bundler/webpack.md'], + }, + ], + +}; diff --git a/docs/.vuepress/config/sidebar/algorithm_content.js b/docs/.vuepress/config/sidebar/algorithm_content.js new file mode 100644 index 0000000..fc2026c --- /dev/null +++ b/docs/.vuepress/config/sidebar/algorithm_content.js @@ -0,0 +1,37 @@ +/* + * @Description: + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2022-04-24 08:15:07 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 08:17:32 + */ + +/* + * @Description: 配置左侧菜单栏 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-12 07:37:28 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 08:08:47 + */ + + +module.exports = [ + // 'basic_introduction', + // 'linear_table', + { + text: '基础入门', + link: "/DS/basic_introduction", + collapsible: false, + children: [{ + text: '1.1 基本概念', + link: '/DS/basic_introduction/1.basic_concepts.md' + }, { + text: '1.2 数据结构三要素', + link: '/DS/basic_introduction/2.three_elements_of_data_structure.md' + }, { + text: '1.3 算法和算法评价', + link: '/DS/basic_introduction/3.algorithm_and_algorithm_evaluation.md' + }], + }] \ No newline at end of file diff --git a/docs/.vuepress/config/sidebar/ds_content.js b/docs/.vuepress/config/sidebar/ds_content.js new file mode 100644 index 0000000..98c269a --- /dev/null +++ b/docs/.vuepress/config/sidebar/ds_content.js @@ -0,0 +1,91 @@ +/* + * @Description: 配置左侧菜单栏 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-12 07:37:28 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 09:04:46 + */ + + +module.exports = [ + // 'basic_introduction', + // 'linear_table', + { + text: '基础入门', + link: "/DS/basic_introduction", + collapsible: false, + children: [{ + text: '1.1 基本概念', + link: '/DS/basic_introduction/1.basic_concepts.md' + }, { + text: '1.2 数据结构三要素', + link: '/DS/basic_introduction/2.three_elements_of_data_structure.md' + }, { + text: '1.3 算法和算法评价', + link: '/DS/basic_introduction/3.algorithm_and_algorithm_evaluation.md' + }], + }, + { + text: '线性表', + collapsible: true, + link: "/DS/linear_table", + children: [{ + text: '2.1 基础概念和操作', + link: '/DS/linear_table/1.basic_concept_and_operation.md' + }, { + text: '2.2 线性表的顺序表示', + link: '/DS/linear_table/2.sequential_representation.md' + }, { + text: '2.3 基础概念和操作', + link: '/DS/linear_table/3.chain_representation.md' + }, { + text: '2.4 基础概念和操作', + link: '/DS/linear_table/4.double_linked_list.md' + }, { + text: '2.5 基础概念和操作', + link: '/DS/linear_table/5.circular_list.md' + }, { + text: '2.6 基础概念和操作', + link: '/DS/linear_table/6.static_linked_list.md' + }, { + text: '2.7 基础概念和操作', + link: '/DS/linear_table/7.comparison_of_sequential_list_and_linked_list.md' + }, { + text: '2.8 存储结构的选取', + link: '/DS/linear_table/8.selection_of_storage_structure.md' + }, { + text: '2.9 零碎知识补充', + link: '/DS/linear_table/9.piecemeal_knowledge_supplement.md' + }], + }, { + text: "栈和队列", + link: "/DS/栈和队列/", + collapsible: true, + children: [{ + text: '3.1 栈的基本概念和基本操作', + link: '/DS/栈和队列/1.栈的基本概念和基本操作.md' + }, { + text: '3.2 栈的顺序存储结构', + link: '/DS/栈和队列/2.栈的顺序存储结构.md' + }, { + text: '3.3 栈的基本概念和基本操作', + link: '/DS/栈和队列/1.栈的基本概念和基本操作.md' + }, { + text: '3.4 栈的基本概念和基本操作', + link: '/DS/栈和队列/1.栈的基本概念和基本操作.md' + }, { + text: '3.5 栈的基本概念和基本操作', + link: '/DS/栈和队列/1.栈的基本概念和基本操作.md' + }, { + text: '3.6 栈的基本概念和基本操作', + link: '/DS/栈和队列/1.栈的基本概念和基本操作.md' + }, { + text: '3.7 栈和队列的应用', + link: '/DS/栈和队列/7.栈和队列的应用.md' + }, { + text: '3.8 特殊矩阵的压缩存储', + link: '/DS/栈和队列/8.特殊矩阵的压缩存储.md' + }] + } +] \ No newline at end of file diff --git a/docs/.vuepress/config/sidebar/index.js b/docs/.vuepress/config/sidebar/index.js new file mode 100644 index 0000000..3a04174 --- /dev/null +++ b/docs/.vuepress/config/sidebar/index.js @@ -0,0 +1,16 @@ +/* + * @Description: 测试 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2021-01-19 08:04:19 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 08:18:19 + */ +module.exports = { + // "/category/": require("../../category/sidebar_contents"), + // "/DataStructure/": require("../../category/sidebar_contents"), + "/DS": require("./ds_content.js"), + "/DS/coding": require("./algorithm_content") + + +}; diff --git a/docs/.vuepress/public/408_favicon.ico b/docs/.vuepress/public/408_favicon.ico new file mode 100644 index 0000000..6a03d0c Binary files /dev/null and b/docs/.vuepress/public/408_favicon.ico differ diff --git a/docs/.vuepress/public/assets/408_favicon.ico b/docs/.vuepress/public/assets/408_favicon.ico new file mode 100644 index 0000000..839b6d7 Binary files /dev/null and b/docs/.vuepress/public/assets/408_favicon.ico differ diff --git a/docs/.vuepress/public/assets/408_logo.png b/docs/.vuepress/public/assets/408_logo.png new file mode 100644 index 0000000..cc480a3 Binary files /dev/null and b/docs/.vuepress/public/assets/408_logo.png differ diff --git a/docs/.vuepress/public/assets/fight_favicon.ico b/docs/.vuepress/public/assets/fight_favicon.ico new file mode 100644 index 0000000..b59f641 Binary files /dev/null and b/docs/.vuepress/public/assets/fight_favicon.ico differ diff --git a/docs/.vuepress/public/assets/image_code/official_wechat_code.png b/docs/.vuepress/public/assets/image_code/official_wechat_code.png new file mode 100644 index 0000000..ea68a5b Binary files /dev/null and b/docs/.vuepress/public/assets/image_code/official_wechat_code.png differ diff --git a/docs/.vuepress/public/assets/image_code/wechat_donate_code.jpeg b/docs/.vuepress/public/assets/image_code/wechat_donate_code.jpeg new file mode 100644 index 0000000..3d1a312 Binary files /dev/null and b/docs/.vuepress/public/assets/image_code/wechat_donate_code.jpeg differ diff --git a/docs/.vuepress/public/assets/image_code/基础入门.png b/docs/.vuepress/public/assets/image_code/基础入门.png new file mode 100644 index 0000000..d1c2919 Binary files /dev/null and b/docs/.vuepress/public/assets/image_code/基础入门.png differ diff --git a/docs/.vuepress/public/assets/image_code/线性表.png b/docs/.vuepress/public/assets/image_code/线性表.png new file mode 100644 index 0000000..f6fdcdf Binary files /dev/null and b/docs/.vuepress/public/assets/image_code/线性表.png differ diff --git a/docs/.vuepress/public/assets/logo.png b/docs/.vuepress/public/assets/logo.png new file mode 100644 index 0000000..ac6beaf Binary files /dev/null and b/docs/.vuepress/public/assets/logo.png differ diff --git a/docs/.vuepress/public/test.png b/docs/.vuepress/public/test.png new file mode 100644 index 0000000..183af70 Binary files /dev/null and b/docs/.vuepress/public/test.png differ diff --git a/docs/.vuepress/styles/index.scss b/docs/.vuepress/styles/index.scss new file mode 100644 index 0000000..aca10a4 --- /dev/null +++ b/docs/.vuepress/styles/index.scss @@ -0,0 +1,177 @@ + +/* 此处自定义样式,对主题进行覆盖 */ + + +// 首页导航按钮 +.actions>a{ + margin-left: 5px; + margin-right: 5px; +} +// 隐藏 全文搜索 +.DocSearch-Logo{ + // display:none;不占位隐藏 + visibility:hidden; // 占位隐藏 +} +.DocSearch-Button-Keys{ + visibility:hidden +} +// 首页title描述 +.home .hero .description{ + max-width: fit-content; +} + +// 搜索框 +#docsearch-container>button{ + border-radius: 5px; +} + +.code-group__nav-tab-active{ + color:var(--c-brand) +} + +.open-info-div{ + text-align: center; + align-content: center; + a{ + margin: 5px; + } +} + + +// 全站主题色 +:root { + // brand colors + // --c-brand: #3eaf7c; + // --c-brand-light: #4abf8a; + + --c-brand: #4ce9ad; + --c-brand-light: #42b983; + + // background colors + --c-bg: #ffffff; + --c-bg-light: #f3f4f5; + --c-bg-lighter: #eeeeee; + --c-bg-navbar: var(--c-bg); + --c-bg-sidebar: var(--c-bg); + --c-bg-arrow: #cccccc; + + // text colors + --c-text: #2c3e50; + --c-text-accent: var(--c-brand); + --c-text-light: #3a5169; + --c-text-lighter: #4e6e8e; + --c-text-lightest: #6a8bad; + --c-text-quote: #999999; + + // border colors + --c-border: #eaecef; + --c-border-dark: #dfe2e5; + + // custom container colors + --c-tip: #42b983; + --c-tip-bg: var(--c-bg-light); + --c-tip-title: var(--c-text); + --c-tip-text: var(--c-text); + --c-tip-text-accent: var(--c-text-accent); + --c-warning: #e7c000; + --c-warning-bg: #fffae3; +--c-warning-title: #ad9000; +--c-warning-text: #746000; +--c-warning-text-accent: var(--c-text); +--c-danger: #cc0000; +--c-danger-bg: #ffe0e0; +--c-danger-title: #990000; +--c-danger-text: #660000; +--c-danger-text-accent: var(--c-text); +--c-details-bg: #eeeeee; + +// badge component colors +--c-badge-tip: var(--c-tip); +--c-badge-warning: var(--c-warning); +--c-badge-danger: var(--c-danger); + +// transition vars +--t-color: 0.3s ease; +--t-transform: 0.3s ease; + +// code blocks vars +--code-bg-color: #282c34; +--code-hl-bg-color: rgba(0, 0, 0, 0.66); +--code-ln-color: #9e9e9e; +--code-ln-wrapper-width: 3.5rem; + +// font vars +--font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; +--font-family-code: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + +// layout vars +--navbar-height: 3.6rem; +--navbar-padding-v: 0.7rem; +--navbar-padding-h: 1.5rem; +--sidebar-width: 20rem; +--sidebar-width-mobile: calc(var(--sidebar-width) * 0.82); +--content-width: 740px; +--homepage-width: 960px; +} + +// plugin-back-to-top +.back-to-top { +--back-to-top-color: var(--c-brand); +--back-to-top-color-hover: var(--c-brand-light); +} + +// plugin-docsearch +.DocSearch { +--docsearch-primary-color: var(--c-brand); +--docsearch-text-color: var(--c-text); +--docsearch-highlight-color: var(--c-brand); +--docsearch-muted-color: var(--c-text-quote); +--docsearch-container-background: rgba(9, 10, 17, 0.8); +--docsearch-modal-background: var(--c-bg-light); +--docsearch-searchbox-background: var(--c-bg-lighter); +--docsearch-searchbox-focus-background: var(--c-bg); +--docsearch-searchbox-shadow: inset 0 0 0 2px var(--c-brand); +--docsearch-hit-color: var(--c-text-light); +--docsearch-hit-active-color: var(--c-bg); +--docsearch-hit-background: var(--c-bg); +--docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark); +--docsearch-footer-background: var(--c-bg); +} + +// plugin-external-link-icon +.external-link-icon { +--external-link-icon-color: var(--c-text-quote); +} + +// plugin-medium-zoom +.medium-zoom-overlay { +--medium-zoom-bg-color: var(--c-bg); +} + +// plugin-nprogress +#nprogress { +--nprogress-color: var(--c-brand); +} + +// plugin-pwa-popup +.pwa-popup { +--pwa-popup-text-color: var(--c-text); +--pwa-popup-bg-color: var(--c-bg); +--pwa-popup-border-color: var(--c-brand); +--pwa-popup-shadow: 0 4px 16px var(--c-brand); +--pwa-popup-btn-text-color: var(--c-bg); +--pwa-popup-btn-bg-color: var(--c-brand); +--pwa-popup-btn-hover-bg-color: var(--c-brand-light); +} + +// plugin-search +.search-box { +--search-bg-color: var(--c-bg); +--search-accent-color: var(--c-brand); +--search-text-color: var(--c-text); +--search-border-color: var(--c-border); + +--search-item-text-color: var(--c-text-lighter); +--search-item-focus-bg-color: var(--c-bg-light); +} diff --git a/docs/.vuepress/styles/palette.less b/docs/.vuepress/styles/palette.less new file mode 100644 index 0000000..e69de29 diff --git a/docs/.vuepress/theme/index.js b/docs/.vuepress/theme/index.js new file mode 100644 index 0000000..3047f90 --- /dev/null +++ b/docs/.vuepress/theme/index.js @@ -0,0 +1,17 @@ +/* + * @Description: + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2022-04-24 08:37:12 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-24 08:37:13 + */ +const { path } = require('@vuepress/utils') + +module.exports = { + name: 'vuepress-theme-local', + extends: '@vuepress/theme-default', + layouts: { + Layout: path.resolve(__dirname, 'layouts/Layout.vue'), + }, +} \ No newline at end of file diff --git a/docs/.vuepress/theme/layouts/Layout.vue b/docs/.vuepress/theme/layouts/Layout.vue new file mode 100644 index 0000000..3c8804f --- /dev/null +++ b/docs/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/docs/Algorithm/Readme.md b/docs/Algorithm/Readme.md new file mode 100644 index 0000000..4b7d5ae --- /dev/null +++ b/docs/Algorithm/Readme.md @@ -0,0 +1,13 @@ + + + +## 算法 + +doing \ No newline at end of file diff --git a/docs/Algorithm/algorithm_note/Readme.md b/docs/Algorithm/algorithm_note/Readme.md new file mode 100644 index 0000000..a353562 --- /dev/null +++ b/docs/Algorithm/algorithm_note/Readme.md @@ -0,0 +1,12 @@ + + +## 刷题笔记 + +doing \ No newline at end of file diff --git a/docs/Algorithm/topic_practice/Readme.md b/docs/Algorithm/topic_practice/Readme.md new file mode 100644 index 0000000..efee78b --- /dev/null +++ b/docs/Algorithm/topic_practice/Readme.md @@ -0,0 +1,20 @@ + + + +## 习题练手 + +doing \ No newline at end of file diff --git a/docs/Big_Event_History.md b/docs/Big_Event_History.md new file mode 100644 index 0000000..2447f63 --- /dev/null +++ b/docs/Big_Event_History.md @@ -0,0 +1,18 @@ + + +## 网站大事记 + + +> 有时间再梳理梳理吧.... + +#### 2020.4.8 + +- 武汉解封,仓库正式立项 +- 项目成立 \ No newline at end of file diff --git a/docs/CCP/Readme.md b/docs/CCP/Readme.md new file mode 100644 index 0000000..be23235 --- /dev/null +++ b/docs/CCP/Readme.md @@ -0,0 +1,13 @@ + + +## 计算机组成原理 + + +doing \ No newline at end of file diff --git a/docs/CCP/sidebar_content.js b/docs/CCP/sidebar_content.js new file mode 100644 index 0000000..7e13ccd --- /dev/null +++ b/docs/CCP/sidebar_content.js @@ -0,0 +1,12 @@ +/* + * @Description: 计算机组成原理 导航栏 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2022-04-21 23:19:09 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2022-04-21 23:19:10 + */ + +module.exports=[ + +] \ No newline at end of file diff --git a/docs/CN/Readme.md b/docs/CN/Readme.md new file mode 100644 index 0000000..211a250 --- /dev/null +++ b/docs/CN/Readme.md @@ -0,0 +1,12 @@ + + + +## 计算机网络 +doing \ No newline at end of file diff --git a/docs/DS/README11.md b/docs/DS/README11.md new file mode 100644 index 0000000..ddff984 --- /dev/null +++ b/docs/DS/README11.md @@ -0,0 +1,973 @@ +--- +title: null +date: 2021-03-07 23:04:24 +permalink: /pages/c1bec1/ +categories: + - DataStructure +tags: + - +--- + + +# + + +

+ +

+

+ + + + + + + + + +

+ + +
+ 码云版 + +
+ + +## 写最前面 + +> 这里是日常工作、学习、生活中总结的各类文章笔记,主要涉及开发技术总结记录,偶尔也会感慨万千,水一些无关技术的文章;若发现博客外链不能访问则可能博客设置修改过,请直接访问博客;所有内容会选择性的发表于**微信公众号、个人博客、掘金、CSDN ,实际内容以本仓库排版、校对为主。** 也会不定时同步到 **码云** 。 +> **以下内容没有链接的代表尚未完成,大家善用快捷键Ctrl+F** +> +> 创建时间:2020年2月14日 + + + +## 关于作者 + + +- [个人项目整理](http://blog.142vip.cn/s/projects) +- [自我介绍]() + + +## 思维导图 + + +> 内容同步与文档,可以结合思维导图对文档进行有效学习.相关目录的xmind文件为思维导图原文件 + + +## 日常推荐 + + +- [云服务器推荐](docs/recommend/云服务器推荐.md) +- [学习网站、使用工具](docs/recommend/学习网站、效率工具.md) +- [值得细读的技术文章推荐](docs/recommend/值得细读的技术文章推荐.md) + + +# 文章笔记 + + +**注:无高亮有效访问链接的待完成/同步** + + +## 前端 + + +> 前端技术百花齐放、层出不穷,个人认为要注重广度,学会看官方文档熟练操作即可; + + +#### CSS + + +> 依赖W3CSchool文档和日常整理,主要是对CSS常用操作和基础属性进行整理总结。不会过多深入 + + +- [CSS开发规范](docs/css/CSS开发规范.md) + +- 样式属性 + +- 页面布局 + +- 移动端适配 + + + + +##### [基础教程](docs/css/基础教程) + + +## + + +#### JavaScript + + +> **本级目录下的JavaScript内容没有发表到[博客](http://blog.142vip.cn)上,建议对照[脑图](docs/javascript/README.md)在[JavaScript主目录](javascript)下学习**,依赖官方文档及自身对JavaScript语言的初步了解,进行的关于JavaScript知识整理,主要目的是复习基础概念、了解新特性、熟练ES6/7操作;整体相对来说由易到难,方便后续查阅学习~ + + +##### 快速入门 + + +- [简单介绍](docs/javascript/快速入门/javascript简单介绍.md) +- [快速了解](docs/javascript/快速入门/javascript快速入门.md) +- [JavasScript开发规范](docs/javascript/JavaScript开发规范.md) + + +##### 基础教程 + + +- [语法与数据结构](docs/javascript/基础教程/javascript语法与数据结构.md) +- [循环与迭代](docs/javascript/基础教程/javascript循环与迭代.md) +- [流程控制与错误处理](docs/javascript/基础教程/javascript流程控制与错误处理.md) +- [表达式和运算符](docs/javascript/基础教程/javascript表达式和运算符.md) +- [函数和方法](docs/javascript/基础教程/javascript函数.md) +- [数字和日期](docs/javascript/基础教程/javascript数字和日期.md) +- [对象的使用](docs/javascript/基础教程/javascript对象的使用.md) +- [正则表达式](docs/javascript/基础教程/javascript正则表达式.md) +- [promise对象的使用](docs/javascript/基础教程/promise对象的使用.md) +- [modules模块](docs/javascript/基础教程/modules模块.md) + + +##### 中级教程 + + +- [Promise对象](docs/javascript/中级教程/promise对象.md) +- [async函数](docs/javascript/中级教程/async函数.md) +- [class类](docs/javascript/中级教程/class类.md) + + +##### 高级教程 + + +- [不一样的ajax](docs/javascript/高级教程/不一样的ajax.md) +- [什么是事件循环](docs/javascript/高级教程/什么是事件循环.md) + +- [JSON.stringify()的三个参数]() + + +##### 最后稻草 + + +- [ES6、ES7、ES8、ES9、ES10的新特性](docs/javascript/最后稻草/ES6、ES7、ES8、ES9、ES10的新特性.md) +- [ES2020新特性](docs/javascript/最后稻草/ES2020新特性.md) +- [JavaScript 工具函数大全](docs/javascript/最后稻草/JavaScript工具函数大全.md) +- [常用函数方法整理](docs/javascript/最后稻草/常用函数方法整理.md) + + +#### JQuery + + +- [安装使用](docs/jquery/安装使用.md) +- [基本属性](docs/jquery/基本属性.md) + + +- Css样式 + + +- 选择器 + + +- 文档处理 + + +- 筛选 + + +- 事件 + + +- 效果 + + +- 事件对象 + + +- 延迟对象 + + +- 回调函数 + + +- 其他整理 + + +#### Vuejs + + +> 介绍基础、常用的vue功能,不会很深入的涉及到vue源码及原理 + + +#### React + + +#### Nuxtjs + + +> Nuxtjs是在vue框架上进行封装的,主要是用来解决单体页面的服务端渲染问题,提供网站进行SEO优化的可能 + + +[前端读写cookie]() + + +#### UI框架 + + +> 市面上前端框架层出不穷,不同的技术栈依赖的UI框架也不尽相同,这里将会依据笔者使用的UI框架,以线上项目展示的方式,介绍用过的框架; + + +- Bootstrap +- LayerUI +- Ant-design-vue +- iView-UI +- VantUI +- Element-UI + + +## 后端【Node】 + + +> 相比前端,作为偏后端的开发者, 后端技术的学习则需要稳扎稳打、不断积累整理,在会用、能用、熟练的基础上,更应该学习其中的原理;所以若你为后端开发者,不论Java、Nodejs、Go等技术栈,对待下面将提及的微服务架构、容器技术、服务治理、高可用等都需要努力学习,抓住重点; +> +> 在面试面前,能力是不会说谎的,打铁还需自身硬,加油~ + + +#### Express框架 + + +- [框架概念简介](docs/express/框架介绍.md) +- [brew和tree的安装](docs/express/brew和tree的安装.md) +- 搭建express基础项目 +- 安装 +- 路由 +- 静态文件 +- 中间件 +- 统一错误处理 +- [express()函数](docs/express/express()函数.md) +- [application对象详解](docs/express/application对象详解.md) +- [request对象](docs/express/request对象.md) +- [respon对象]() +- [router对象]() +- 数据库集成 +- MVC分层 +- [pm2进程管理](docs/express/pm2进程管理.md) +- 分环境部署上线 + + +#### Koa框架 + + +- koa介绍 +- 手把手搭建第一个koa项目 +- 应用(Application) +- 中间件(Middleware) +- 上下文(Context) +- 请求(Request) +- 响应(Response) + + +#### Eggjs框架 + + +##### 基础篇 + + +- [第一部分:Git概述](docs/eggjs/git-README.md) + + +* [1.1 下载和安装](docs/eggjs/git-download.md) + * [1.2 基本配置](docs/eggjs/git-config.md) + * [1.3 常用命令](docs/eggjs/git-dns.md) + * [1.4 GitHub简单使用](docs/eggjs/git-github.md) + * [1.5 GitBook简单使用](https://mp.weixin.qq.com/s/Wn_IZ6K4eqh1PtomRtqdqg) + * [1.5.1 Typora简介](docs/eggjs/git-typora.md) + * [1.5.2 MarkDown语法](docs/eggjs/git-markdown.md) + * [1.6 码云和GitHub的选择](docs/eggjs/git-choice.md) + + +- [第二部分:数据库概述](docs/eggjs/mysql-README.md) + + + - [2.1 下载和安装](docs/eggjs/mysql-download.md) + - [2.2 连接数据库](docs/eggjs/git-connect.md) + - [2.3 CURD操作](docs/eggjs/mysql-curd.md) + - [2.4 Redis缓存](docs/eggjs/mysql-redis.md) + - [2.4.1 redis安装](docs/eggjs/mysql-redis-install.md) + - [2.4.2 redis常用指令](docs/eggjs/mysql-redis-dns.md) + - [2.5 可视化管理](docs/eggjs/mysql-redis-view.md) + + +##### 入门篇 + + +- [第一部分:Egg框架快速入门](docs/eggjs/egg-README.md) + + +- [1.1 基础功能](docs/eggjs/egg-base.md) + - [1.1.1 接口参数获取](docs/eggjs/egg-request-params.md) + - [1.1.2 Egg内置对象 ](docs/eggjs/egg-object.md) + - [1.1.3 Config配置](docs/eggjs/egg-config.md) + - [1.1.4 Egg生命周期](docs/eggjs/egg-life.md) + - [1.1.5 中间件理解](docs/eggjs/egg-middleware.md) + - [1.1.6 Router路由分发](docs/eggjs/egg-router.md) + - [1.1.7 Controller控制器](docs/eggjs/egg-controller.md) + - [1.1.8 Service服务](docs/eggjs/egg-service.md) + - [1.1.9 常用插件](docs/eggjs/egg-plugin.md) +- [1.2 核心功能](docs/eggjs/egg-core.md) + - [1.2.1 日志输出](docs/eggjs/egg-logger.md) + - [1.2.2 定时任务](docs/eggjs/egg-schedule.md) + - [1.2.2 HttpClient网络请求](docs/eggjs/egg-httpclient.md) + - [1.2.3 Cookie的基本使用](docs/eggjs/egg-cookies.md) + - [1.2.4 Session的基本使用](docs/eggjs/egg-session.md) + - [1.2.5 统一异常-错误处理](docs/eggjs/egg-try-catch.md) + - [1.2.6 CSRF防范和XSS攻击](docs/eggjs/egg-csrf-xss.md) + - [1.2.7 RESTful API接口风格](docs/eggjs/egg-restful.md) + + +- [第二部分:插件开发](docs/eggjs/plugin-README.md) + + + - [2.1 egg-validate参数校验](docs/eggjs/plugin-egg-validate.md) + - [2.2 egg-view-ejs页面渲染](docs/eggjs/plugin-egg-view.ejs.md) + - [2.3 egg-redis缓存](docs/eggjs/plugin-egg-redis.md) + - [2.4 egg-mysql](docs/eggjs/plugin-egg-mysql.md) + - [2.5 egg-sequelize](docs/eggjs/plugin-egg-sequelize.md) + - [2.6 egg-socket.io即时通讯](docs/eggjs/plugin-egg-socket.io.md) + + +##### 代码实战篇 + + +- [第一部分:常用代码](docs/eggjs/project-README-CODE.md) + + + - [1.1 图片前端在线剪辑](docs/eggjs/project-images-cropper.md) + - [1.2 文件上传后台处理](docs/eggjs/project-upload.md) + - [1.3 MD5加密-解密算法](docs/eggjs/project-md5.md) + - [1.4 Egg Jwt加密和校验](docs/eggjs/project-token.md) +- [第二部分:项目简介](docs/eggjs/project-README-INTRODUCE.md) + + + - [2.1 基于OAuth2的统一认证中心系统](docs/eggjs/project-ssoCenterSystem.md) + - [2.2 常用前后端分页比较与实现](docs/eggjs/project-pagenation.md) + - [2.3基于Spring Boot实现的个人博客](docs/eggjs/project-spring-boot-blog.md) + - [2.4 基于Yapi搭建的接口管理系统](docs/eggjs/project-webapi.md) + - [2.5 GitBook开源笔记总结站点搭建](docs/eggjs/project-gitbook.md) + - [2.6 个人网站及接口服务搭建搭建](docs/eggjs/project-142vip.cn.md) +- [第三部分:手把手搭建基础Egg开发框架](docs/eggjs/egg-egg-example.md) + + +#### Nestjs框架 + + +> Nestjs框架推崇typescript语法,并且友好的兼容express框架,因此在学习Nestjs框架之前,请务必先熟悉express框架相关操作并进行typescript入门;在一定程度上typescript和面向对象语言Java、Net等很相似,如果你之前有JavaScript和Java的基础,那么应该恭喜你,你的学习速度将会倍速提高 + + +- [核心基础概念](nestjs/nestjs核心基础概念.md) +- [项目创建初始化入门](nestjs/nestjs项目创建初始化入门.md) +- [整合swagger快速生成api文档](nestjs/nestjs整合swagger快速生成api文档.md) +- [接口路由请求传参](nestjs/nestjs接口路由请求传参.md) + + +## 算法 + + +- 算法分析 + + +#### 查找 + + +- 顺序查找 +- 折半查找 +- 分块查找 +- B树和B+树 +- 散列(Hash)表 +- 字符串模式匹配(KPM) + + +#### 排序 + + +- 插入排序 +- 交换排序 +- 选择排序 +- 归并排序 +- 基数排序 +- 内部排序比较 +- 外部排序比较 + + +#### LeetCode刷题 + + +## 数据库 + + +> 主讲数据库基础知识,结合node的简单使用,相关的部署方案参照下方的文档 + + +#### MySQL + + +- [【服务器版】MySQL的安装部署](https://mp.weixin.qq.com/s/U1OUZYHEChFDx03FvgbMHA) +- [MySQL优化之Explain参数说明](docs/mysql/MySQL优化之Explain参数说明.md) +- 索引 +- sql优化 +- [基于GTID主从复制的原理和基础配置](docs/mysql/基于GTID主从复制的原理和基础配置.md) +- [MySQL日志类型把我难哭了,你学废了吗?](docs/mysql/mysql日志比较.md) + + +#### Redis + + +> 将围绕redis基础概念、使用场景、使用方式、简单部署等方面 展开介绍,[主目录](redis)下有自己觉得还不错PDF文档~ + + +- [key命名规范与建议](docs/redis/key命名规范与建议.md) +- [redis开发使用规范](docs/redis/redis开发使用规范.md) +- [redis基础介绍](docs/redis/redis基础介绍.md) +- [redis的简单安装和部署](https://mp.weixin.qq.com/s/Xe-ZDf2kgUWfYSkuULAdlw) +- [官方默认配置模板](code/docs/redis/redis-default.conf) +- 数据类型 +- [redis简单主从集群部署-docker方式](docs/docs/redis/redis集群部署.md) +- [memCache与Redis比较](docs/redis/memCache与Redis.md) + + +#### Mongo + + +- 基本介绍 +- 安装部署 +- 简单使用 +- Node下的CURD操作 + + +## 服务部署 + + +#### nginx + + +- [nginx安装,普通安装 Or Docker搞定?](docs/nginx/nginx基础部署.md) +- [手把手nginx基础入门]() +- [反向代理、负载均衡真有那么难吗?]() +- [Nginx SSL证书,从此踏上Https之路](docs/nginx/nginx服务器ssl证书配置.md) + + +#### docker + + +- 我与docker的第一次硬碰硬 +- docker操作入门真有那么难吗? +- 这些基础操作指令,你会吗? +- 那些年,我常用的docker指令操作汇总 + + +#### docker-compose + + +- 听说你装了N次都没搞定? +- 集群启动失败,yaml规范不清楚? +- [我了解的docker-compose都在这里了](https://mp.weixin.qq.com/s/nC4nF51xn61TZlenuUxDog) + + +#### linux下shell编程 + +- [shell基础整理](https://mp.weixin.qq.com/s/gctrWdB1JEK59_a9tJQSkg) +- [操作mysql数据库](shell/shell连接mysql.md) +- shell操作docker +- 环境变量env + + +## 服务网关 + + +#### kong + + +- [kong的的基本介绍](/api-gateway/kong/kong的基本介绍.md) +- [docker下kong的部署](/api-gateway/kong/基于docker部署kong网关服务.md) +- docker-compose搭建kong集群 +- 可视化管理界面介绍 + + +#### konga + + +- 基本介绍与docker部署 +- 简单使用 +- 路由管理 + + +#### kong-dashboard + + +- docker简单部署 +- 路由管理 +- 插件介绍 + + +## 服务注册 + + +#### Apollo + + +> 携程开发的配置中心经典项目,可集成多语言客户端,实现灰度部署,在分布式微服务的场景下抽离出服务配置,方便统一管理、发布 + + +#### Consul + + +> 服务注册、发现,key-value键值对管理 + + +#### Nacos + + +> 背靠国内一线互联网大厂——阿里巴巴,也是可适用于微服务下的配置管理,支持Java、Nodejs等主流语言,目前生态良好,技术支持表现一般,属于Apollo替代产品 + + +## 消息中间件 + + +> 消息队列已经逐渐成为企业IT系统内部通信的核心手段。具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。 +> +> 目前个人了解的有:RabbitMQ、Kafka、RocketMQ + + +#### RabbitMQ + + +#### kafka + + +#### RocketMQ + + +## RPC框架 + + +#### gRPC + + +> gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统,tensorflow分布式与tensorflow serving底层通信都是是用的grpc。我自己基于JavaScript技术栈上较多的接触到gRPC,传送门:[基于js下各框架grpc的使用]() + + +- nodejs下grpc的简单实用 + + +- grpc集成express框架 + + +- grpc集成koa框架 + + +- eggjs框架下grpc的线上部署 + + +- grpc插件开发示例 + + + + + +#### Dubbo + + +> Alibaba开发的一个RPC框架,远程接口基于Java Interface, 依托于Spring框架(**Java技术栈重点研究**) + + +#### Thrift + + +> Apache的一个项目(http://thrift.apache.org),前身是Facebook开发的一个RPC框架,采用thrift作为IDL (Interface description language)。 + + +## Elk日志管理平台 + + +> 全链路日志 + +- [ELK基础概念与常用架构整理](docs/elk/基础概念与常用架构整理.md) + + +#### ElasticSearch + + +> 数据存储 + + +#### Logstash + + +> 数据收集 + + +#### Kibana + + +> 数据展示 + + +## 监控工具 + + +> 参考笔者线上平台:http://view.142vip.cn/grafana 账号/密码:test/123456 基于docker部署,由于是个人学生服务器,站点访问延迟较高 +> +> 常用工具:promethus 、grafana、zabbix、lepus等 + + +#### Prometheus + + +#### Grafana + + +#### Zabbix + + +#### lepus(天兔) + + +## 高可用架构 + + +#### MySQL集群 + + +##### 主从同步 + + +> 实现功能:主从服务器数据一致,低延迟、高并发 + + +- Binlog主从复制 +- GTID主从复制 +- 主主复制 + + +##### 代理中间件 + + +> 实现功能:读写分离、分库分表、负载均衡、故障切换 + + +- Mycat +- 360Atlas + + +#### 集群监控 + + +> 实现功能:实时监控、可视化数据显示、故障报警 + + +##### Prometheus + + +- 监控MySQL集群 +- 监控Mongo数据库 +- 监控Node服务 +- 监控linux服务器 +- 监控redis集群 + + +##### Grafana + + +- 基本安装部署 +- 功能介绍和简单操作 +- 可视化数据图形显示界面 +- 常用模板 + + +##### alter-manager + + +- 推送到邮箱 +- 推送到钉钉、微信机器人 +- 推送到自定义消息接口(webhook钩子) + + +#### 压力测试 + + +- jmeter + + +#### Redis集群 + + +> 持续整理中... + + +##### 简单主从模式 + + +#### 哨兵模式 + + +##### cluster模式 + + +## 网站搭建 + + +> 从大二开始搭建个人网站:http://www.142vip.cn 起初非常简陋,工作之后计划进行第三版迭代,一直抽空佛系谢谢, 目前在重构中.. + + +- 最初的梦想 +- 舍弃Java,我的重构之路 +- 网站正规化,Nginx配置SSL证书 +- 小小网站却耗费三台学生服务器? + + + + + + +## 书籍整理 + +### 技术类 +> 待整理 + +#### [狼书 - 了不起的Node.js](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/Readme.md) + +- [第一章 Node.js初识](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第一章%20Node.js初识.md) +- [第二章 Nodejs安装与入门](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第二章%20Nodejs安装与入门.md) +- [第三章 更了不起的Node.js](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第三章%20更了不起的Node.js.md) +- [第四章 更好的Node.js](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第四章%20更好的Node.js.md) +- [第五章 Node.js是如何执行的](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第五章%20Node.js是如何执行的.md) +- [第六章 模块与核心](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第六章%20模块与核心.md) +- [第七章 异步写法与流程控制](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/第七章%20异步写法与流程控制.md) + +- [全部笔记](./docs/读书笔记/../article-records/读书笔记/狼书-了不起的Node.js/全部笔记.md) + + +#### [ES6标准入门——阮一峰]() + +> 本书内容较多,很多基础细节都有说明,难度中等、适合入门,书中很多例子我也摘抄了很多,主要是我认为重要的,笔记按照自己学习逻辑整理的,请君慢用 +- [1.ECMAScript 6 简介](./docs/article-records/读书笔记/ES6标准入门/1.ECMAScript%206%20简介.md) +- [2.let和const命令](./docs/article-records/读书笔记/ES6标准入门/2.let和const的命令.md) +- [3.变量的解构赋值](./docs/article-records/读书笔记/ES6标准入门/3.变量的解构赋值.md) +- [4.字符串详解]() +### 非技术类 + +> 主要是跟计算机无关的一些书,在看完之后,会选择性的进行思维导图、经典词句整理,也可能添加个人思考 + + +#### [你好孤独 - 陈果](docs/article-records/读书笔记/好的孤独-陈果/Readme.md) + +## 公众号汇总 + +### 2020年 + +#### 7月 + +- [【2020-07-26】微信公众号我来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483659&idx=1&sn=ac7b633a45ac06d388e0698163a2543e&chksm=fcdfb887cba8319151aedfa80c5b59d130838af81fe51c76e5c4926f82f4937b51c8c0c1470e&token=1304241434&lang=zh_CN#rd) + +- [【2020-07-27】介绍一下,我在B站](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483760&idx=1&sn=30a9fa2a051079c5330039615950c34d&chksm=fcdfb8fccba831ea64644be501ecca3cea5846f16367faed9c84b44a30d9b6dc30456dae6548&token=1304241434&lang=zh_CN#rd) + + +- [【2020-07-28】五年了,我终于换了人生中的第一台MacBookPro](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483762&idx=1&sn=e9ea759f1c1589881cc3bd9cabddb70a&chksm=fcdfb8fecba831e8c4635a4cefd302977071ed11a4dda6161cf9ad8458865297194f87cb013a&token=1304241434&lang=zh_CN#rd) + + +- [【2020-07-29】工作中第一次被喷,我到底是如何应对的?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483770&idx=1&sn=6b760873a814f4e18baab415bee3d863&chksm=fcdfb8f6cba831e00802de653ff6723a0bb169a93fe3a6a9762ee62d75d8cd88409268db9047&token=1304241434&lang=zh_CN#rd) + + +- [【2020-07-31】CSDN关注100了,就这????](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483778&idx=1&sn=3d9f623c58d595f75d7092783a6c5abe&chksm=fcdfb80ecba83118e76de1ed88a5be51229e4145182aee6e0bcc13e4697707cf9f4609d8799d&token=1304241434&lang=zh_CN#rd) + + + +#### 8月 +- [【2020-08-01】旧友相见,甚是怀念](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483790&idx=1&sn=76e13ac79ad498309542c9f41878bb1c&chksm=fcdfb802cba8311456ea9ff3309c4354055022cd0056b13c11fac44252231550e17a03f26f29&token=639111151&lang=zh_CN#rd) + +- [【2020-08-03】JavaScript基础介绍和快速入门](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247483805&idx=1&sn=4da4e0d3a2912aee146248c1d8f7f96f&chksm=fcdfb811cba83107fd8f08d3e35af7c72bf7d908d577ad83e45d80b0e9d1bbdbf16b1f169d64&token=639111151&lang=zh_CN#rd) + + +#### 9月 + +- [【2020-09-01】Redis的简单安装和部署 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=1&sn=489aa1bd12487b0bf8f2a7694f4ca1aa&chksm=fcdfbd34cba83422f0afee027747d9e95773e093fa3a24225c2729029c4392bf42043964782f&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-01】就很像?? ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484600&idx=2&sn=a9962c6ca3a5eddd085bcd15617f64d9&chksm=fcdfbd34cba83422b987020a858b7cf31bfde6033642d697d5a00ad9ed618f3cf14deb207d67&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-03】shell编程基础整理 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=1&sn=6e3e862153755d9e61f5f4ebf220381d&chksm=fcdfbc92cba835844e8b6fd37d86a34ccf83342895f448c88ba5b62db974eb536a8e74a121aa&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-03】大学四年建站用过的云服务器都在这里了 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484702&idx=2&sn=c7589eecbe58ff8939f72c0ff0bf567d&chksm=fcdfbc92cba83584b03dfeea7290606ce8249b0c3105b0b3b95a9087c77e3b1c7f863d8e30f9&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-04】面试复盘和思考 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484711&idx=1&sn=bf362439ccfad04da53ce65c824a988d&chksm=fcdfbcabcba835bddc43c40fd3a454793adf7849a5d5bb356825d481b82ae3e58a749859502c&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-06】朋友是“无用”的,不是你瞧不起我,就是我瞧不起你 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=1&sn=e0f8a7a70ddede75d94b202ddc6106d6&chksm=fcdfbcdbcba835cd2138658d750f7e09a820b34daf4624f253a21a11b5de56635d35e4c0df19&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-06】GitHub简单使用 ](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484759&idx=2&sn=ade86739c94f99f944a3d387bc7e13ef&chksm=fcdfbcdbcba835cd192c3b7b7eeea8f5dbb16b2b2fa58b6e2094184f5aa3341927a6d1fad6f8&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-07】MySQL日志类型把我难哭了,你学废了吗?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484771&idx=1&sn=6ae4c6e8d333b0e1aa5cd1aee161d9b8&chksm=fcdfbcefcba835f94e3c0abc189477f241f675f38a63eb03bd320447e89da39cb08b72038ba3&token=1613702159&lang=zh_CN#rd) + +- [【2020-09-11】向各位汇报这周状态,再也不敢鸽了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484783&idx=1&sn=b9e82a2c2b04b7050d0659085af537ef&chksm=fcdfbce3cba835f5e692f5ffbb16505dbf3b5ccc9bb0bdf4b3f467629b293d0e0ce3086ec8dc&token=639111151&lang=zh_CN#rd) + + +- [【2020-09-11】向各位汇报这周状态,再也不敢鸽了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484783&idx=1&sn=b9e82a2c2b04b7050d0659085af537ef&chksm=fcdfbce3cba835f5e692f5ffbb16505dbf3b5ccc9bb0bdf4b3f467629b293d0e0ce3086ec8dc&token=639111151&lang=zh_CN#rd) + +- [【2020-09-12】向各位汇报,再也不敢鸽了,人生处处有惊喜](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484784&idx=1&sn=ae73f1f4e53b622039a75ec41cabe378&chksm=fcdfbcfccba835eafefe304913e4078cf8dfac22f62fd9d686b307bbdf46d147016f5e876e05&token=639111151&lang=zh_CN#rd) + + +- [【2020-09-13】来来来,无厘头技术(水)文,各种尬。简简单单评价一下](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=1&sn=10d26a600112ec4f95b3b3f470955744&chksm=fcdfbc03cba83515b07f0ae6cee791d1fb5fd619364cff3a17a4deab91333f0a6277b09a66a9&token=639111151&lang=zh_CN#rd) + +- [【2020-09-13】基础Brew和Tree的安装实录](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=2&sn=94a6455ed6b17fa5b27e96358e935803&chksm=fcdfbc03cba83515d13dcfc2dea2445085a34ff4360e0a367fd914bb04bc6ba18a780a0cd2d2&token=639111151&lang=zh_CN#rd) + +- [【2020-09-13】PM2进程管理,给我学!](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484815&idx=3&sn=38a289efffda9510b5ff04c5bed0663e&chksm=fcdfbc03cba835154c888b9d7f86eac85c250eefb9d053687173274373f2f8d7b19fc307e76a&token=639111151&lang=zh_CN#rd) + +- [【2020-09-14】数据结构,一定要学废了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484823&idx=1&sn=d41bb8da02585cf9ea8d0b3ef27e3dbb&chksm=fcdfbc1bcba8350d84ba2f01eaf187cbaa2d4cf5a9078beb1f2fafe94edb0126c82595ed8191&token=368257571&lang=zh_CN#rd) + +- [【2020-09-16】ELK基础概念与常用架构整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484837&idx=1&sn=7f0de3eeea3fc6ee299587704f5c44cd&chksm=fcdfbc29cba8353fd894582da7ae2c93b5920c4dbb1e197b011a817dc0962e317842a32d5560&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-17】分享书上一段话,问一个问题](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=1&sn=7af55ef3a7d843d9c43de6d6c7911da3&chksm=fcdfbc3ecba835287b2c644cda606454a713d370fbd7d14714b22a04277f7a7784b96b8b277e&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-17】看源码遇到的三个知识点,一个也没懂](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484850&idx=2&sn=c59839c677d7c9652a09d1f8c70ef8d6&chksm=fcdfbc3ecba83528cf8271a2615129340a6f11954b6d9396160d0fb2c41593253d5e3510a031&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-20】express()函数整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=2&sn=63e6b669341217135013816464dd5bd9&chksm=fcdfbc4dcba8355b4de0f712047709425a35fa3b122378b31f0e4db3afb82dfd38872862aab4&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-22】入秋了,安好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484865&idx=1&sn=e39e3547da49f40e1b64deadf9a9cfef&chksm=fcdfbc4dcba8355bfa9c8b9531a463fc652b764064528dd6c243f47a157b20e017bad3f410f4&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-22】Nginx安装详解,我服务器上也是这样的](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=1&sn=b1073522cfd3ce6ebbe85e85ad4e35e0&chksm=fcdfbc6dcba8357bdb212c9db1378a045d0dcfd95b79ed05688180f05d2b391f9b724d0d752f&token=368257571&lang=zh_CN#rd) + +- [【2020-09-22】被攻击的一天](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484897&idx=2&sn=34c61ed01c6522d2861be3342ec12ad5&chksm=fcdfbc6dcba8357b76eb0fe6c502d932def6cd232297b010f9b2f9a1fca35c38df77dacce7f2&token=368257571&lang=zh_CN#rd) + + +- [【2020-09-26】跟父亲视频的一个半小时,聊到了我,也聊到了Ta](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484929&idx=1&sn=394783dd2bfd65da24ae6dcb89d69ec6&chksm=fcdfbf8dcba8369b926b7083bbe3515aa5857f7589acc3f9d6d4987c67539a76dbd6e3cb70a1&token=368257571&lang=zh_CN#rd) + + +#### 10月 +- [【2020-10-07】时间太快,溜了溜了,杭州见](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484943&idx=1&sn=ad37db87dc40f381fd18cc828e492384&chksm=fcdfbf83cba8369598fc2773b63df235a9719b43749e7daab753c621fef5af4fba054dbb46ea&token=368257571&lang=zh_CN#rd) + +- [【2020-10-14】写不了代码就不写嘛](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484951&idx=1&sn=edddf3d6c8f3fc6dd1d14063b536c732&chksm=fcdfbf9bcba8368d81ddffcbd258f7e4b7fb573d2a8963859e1b156e8a5f5d81f5629c49be6e&token=368257571&lang=zh_CN#rd) + +- [【2020-10-18】我不行了,这号关注量男女7:3 还怎么相亲嘛?](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484968&idx=1&sn=d37960ed81044fbf314440af85049d65&chksm=fcdfbfa4cba836b25082535910f7137d1513d834d54fbfadf48a433b29511ccf4d532f19b88a&token=368257571&lang=zh_CN#rd) + +- [【2020-10-26】悄悄接你下班,陪你回家](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247484988&idx=1&sn=947c487946fa3574d33e9c6861a1ee28&chksm=fcdfbfb0cba836a626d2efa904a5177c2e0916c381b26c89b6dcfc610a380b906d4480f7cc9b&token=368257571&lang=zh_CN#rd) + + +#### 11月 + +- [【2020-11-01】11月,你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485002&idx=1&sn=3760eba58f7ded433b71bec48b89a681&chksm=fcdfbfc6cba836d0b7db1f2aa5a4a884f68f8ce20a59aa44b4ac46c59eb4dd1c233079241a4a&token=368257571&lang=zh_CN#rd) + +- [【2020-11-15】她来了她来了,她带着剪了三遍的视频来了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485042&idx=1&sn=181ae5062c31ee7931390607b6f10358&chksm=fcdfbffecba836e8275c849007470db6964f7cd675af59fe73c94369334d17d4840e8c0413d5&token=898438314&lang=zh_CN#rd) + + +- [【2020-11-18】陪我一路的小姐姐,谢谢啦~ 我大意了呀,没有闪](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485053&idx=1&sn=ed2fe0de87b70781cdb7755ef4726340&chksm=fcdfbff1cba836e7165dc53722aaf96ef38d8f43cfadadcb4695d8ff430ea64619caada81cfa&token=1939941957&lang=zh_CN#rd) + +- [【2020-11-30】11月的尾巴,12月你好](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485066&idx=1&sn=1d357917f548a6d977af96c6582db527&chksm=fcdfbf06cba836103152f7a3fdfbf97c1be2472a84f824cbddd532c15aefe14c71b3b076233f&token=831506871&lang=zh_CN#rd) + +#### 12月 + +- [【2020-12-06】周末小记——忆旧友、吃火锅,也会感慨](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485080&idx=2&sn=bdc551f2e9bf54dc01881979339af8ad&chksm=fcdfbf14cba836022a05854547cbca03b5a08b912a0e0f195d4856d6b53ecd78aee2f167b515&token=1581389686&lang=zh_CN#rd) + + +- [【2020-12-10】上火、牙疼,也要砍程序媛一刀](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485100&idx=1&sn=e7c0c41229d51ebfab2939deb1751672&chksm=fcdfbf20cba836364da35ab5acfed076876aae486126bc1c41cdd2502cc89a41cbde7c645610&token=1054397108&lang=zh_CN#rd) + + +- [【2020-12-17】今晚不蹦迪,来聊一聊个人项目的接口返回](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485136&idx=1&sn=4619fb835e6d57e106ab01116012662a&chksm=fcdfbf5ccba8364aecddf14d11ed8ba36f38050b83b30b8d46e10f86b164aab05322b8455b36&token=755050934&lang=zh_CN#rd) + +- [【2020-12-20】事情,从英吉利海岸的那杯卡布奇诺美式咖啡说起](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485180&idx=1&sn=15ab9be3e15130103f26c919cbe0b605&chksm=fcdfbf70cba83666d287acc35485d02ddf67bacad6ea46d9ef04521f9f429fcb015d371c918e&token=1356818265&lang=zh_CN#rd) + + +### 2021年 + + +#### 1月 + + +- [【2021-01-06】谁在看小王子呀~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485228&idx=1&sn=1c30866a209af2a5eb927fd7bd63cc8b&chksm=fcdfbea0cba837b6d4cf9865b72a6a1553c4d9b6a6cce369bb09f66730ab37ec649071e7ab7c&token=1356818265&lang=zh_CN#rd) + + +- [【2021-01-15】2020小结,没事就点点看看呗,反正小目标都没完成](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485249&idx=1&sn=dadf2a6dbed1879bbd98c62491436a9c&chksm=fcdfbecdcba837db5c11b8023ffa7ad6cf5a47c03027a0029604a50d0a77c75908efc05af39a&token=1356818265&lang=zh_CN#rd) + +- [【2021-01-17】搞波大的,浅谈深拷贝——文末有彩蛋](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485258&idx=1&sn=fb71007a5feed8e18674be27b1c749ab&chksm=fcdfbec6cba837d099e90a5f45781ee8cac474388e25ad9383a4fbc05fdb16a8e1377265c018&token=1356818265&lang=zh_CN#rd) + + +- [【2021-01-18】到底该如何发布Npm插件,常用指令在这里](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485277&idx=1&sn=9eb7c3cef21ace2cc5853e382f2bb03f&chksm=fcdfbed1cba837c7839f3b57836f43b3425c8b5a7888f543bf4a1dd8b39cd82ed7d51a24a685&token=1356818265&lang=zh_CN#rd) + + +- [【2021-01-20】好用的AntDocs,也来学着用一下,基本过程整理](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485291&idx=1&sn=19f13df8131a9f662973f2d9240c1eab&chksm=fcdfbee7cba837f180d8ad30735cd61e6c73fe195e63d46046bb24f80e1536aa0a585c3e1015&token=1356818265&lang=zh_CN#rd) + + +- [【2021-01-27】【持续更新】从查找算法开始数据结构入门,大家都在掘金等你](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485318&idx=1&sn=6ae5fc9f1cf994818ff89d53a926761e&chksm=fcdfbe0acba8371c9d0025008084857cf14c52b01dfb1b9460d3388ba543c36da2abcbf90216&token=1356818265&lang=zh_CN#rd) + + +- [【2021-01-30】ORM框架入门之Sequelize,我快翻译不动了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485341&idx=1&sn=fc493c28ab138056567e916b769ddbf2&chksm=fcdfbe11cba8370793e8e0d71e7766f4e1e7f3e8672921d6b98757f7d7b271b290f3edc65d6f&token=1356818265&lang=zh_CN#rd) + +#### 2月 + +- [【2021-02-07】被妹妹支配的一周,晚上差点连家都回不去..](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485376&idx=1&sn=049a5df5cb97786e80aded38a1bf3732&chksm=fcdfbe4ccba8375a52cb8d7077836216e5f5f41ee9453aebf524eb0a5d8a5db48cbabc11f3e4&token=1356818265&lang=zh_CN#rd) + + +- [【2021-02-11】【新年快乐】程序员的2020,就这样悄咪咪地溜走了](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485404&idx=1&sn=276100858df23daf987dbc68997477df&chksm=fcdfbe50cba837460079fc9ab414754a49668f82dc0f6a5a41ec320d3e5dd77c1a8c271e061b&token=1356818265&lang=zh_CN#rd) + + +- [【2021-02-13】抢红包、拼手气来啦,之前答应的抽奖变成新年红包啦~](https://mp.weixin.qq.com/s?__biz=MzU3MTUxOTIwMw==&mid=2247485420&idx=1&sn=26c0e3690363af5dddd805ae417eeee9&chksm=fcdfbe60cba8377645e44333ccbe35147b9844578008e5699aba62b82c12fc03634e2d68781c&token=1356818265&lang=zh_CN#rd) + +## 赞赏支持 + + +> 相逢不用忙归去,明日黄花蝶也愁;若系列文章对你有帮助,不如请作者喝一杯伏见桃山... +> +> **赞赏过的一定要扫下方右侧微信跟我说呀!!!!!!** + + +
+ + + +
+ + +## 联系我 + + +> 对仓库有任何问题或建议,欢迎微信“骚扰”,商务合作请备注! +
+ +
+ + +## 鸣谢 + + +以下排名不分先后!([详细统计]()) + + + + + +## 赞助列表 + +以下排名不分先后! + + + + + + +## 公众号 + + +如果大家想要实时关注我更新的文章以及我的日常的话,可以关注我的公众号,基本每天都会更新技术和各种吹水文章,就当做是记录心情、成长的地方吧 + + + +
+ +
\ No newline at end of file diff --git a/docs/DS/Readme.md b/docs/DS/Readme.md new file mode 100644 index 0000000..f781219 --- /dev/null +++ b/docs/DS/Readme.md @@ -0,0 +1,109 @@ + + +## 写在最前面 + + + + + +这份《薛定谔的Egg.js》文档,是我考虑很久之后,才决定要整理出来的,在这上面倾注了很多时间 + + +- 也不知道有没有用 +- 也不知道能不能整理完 +- 更不知道对你会不会有所帮助 + + +但愿我们都能在此有所收获,放手开始吧!! + + +最后,仅以“**祷以恒切, 盼以喜乐,苦以坚忍,必有所得**”,共勉~ + + +--- + + +## 阅读须知 + + +- 该部分为框架基础,是基于[Egg.js官网](https://eggjs.org/zh-cn/)和自己使用体验进行整理汇总,难免会存在重复部分。 +- 若在阅读、学习过程中发现与官网描述有所差异,可以立即与我联系进行确认与更改。 +- **文档用于个人整理和技术学习,禁止无授权转载、商用。** + + + + + +## 技术支持 + +- [Egg.js官网](https://eggjs.org/zh-cn/) +- [VuePress](https://www.vuepress.cn/guide) +- [AntDocs](https://antdocs.seeyoz.cn/guide/) + + + +## 适用群体 + + +- 默认已了解过[ES6](https://es6.ruanyifeng.com/)语法和部分Node后端框架([Express](https://www.expressjs.com.cn/)、[Koa](https://koa.bootcss.com/))。 +- 具有一定JavaScript开发基础,对JavaScript开发有浓烈兴趣。 +- **已有Egg.js开发经验,但细节用法不胜了解的,非常适合用来查缺补漏。** + + +## 资料共享 + +> 链接失效可以关注公众号或私信获取"链接" + +## 参考资料 + +- 大话数据结构 - 程杰 +- 数据结构复习全书 - 王道论坛 +- 视频教程 - 王道论坛 + +--- + +### 联系我 + +- 有任何问题或建议,欢迎微信“骚扰”,商务合作请备注! + +
+ +
+ + + +# + +### 公众号 + + +- 相逢不用忙归去,明日黄花蝶也愁.... + +- **若系列文章对你有所帮助,不如来公众号交个朋友吧.** + + + + +

+ +

+ +交流/加群/互看朋友圈 +当然:**聊天 /提问 /建议 /提需求** 可以在本公众号直接**私信**,后台可以看到,有时间即会回复,偶尔的延迟和疏漏还请小伙伴们谅解,蟹蟹。 + + + + + + + + + + diff --git a/docs/DS/basic_introduction.md b/docs/DS/basic_introduction.md new file mode 100644 index 0000000..514947f --- /dev/null +++ b/docs/DS/basic_introduction.md @@ -0,0 +1,328 @@ +--- +title: 基础入门 +--- + + + + + +## 基础概念 + +### 数据 + +**信息的载体**,是客观事物属性的数、字符以及所有能够输入到计算机包中并且被计算机程序识别和处理的**集合** + +### 数据元素 + +**数据的基本单位**,通常按照一个整数来进行考虑和处理。 + + +特别注意:一个数据元素由若干个**数据项**组成,数据项是构成数组元素的最小单位,且不可分割。 + + + +### 数据对象 + +具有**相同性质**的数据元素的**集合**,**是数据的子集** + + +### 数据类型 + +值的集合和定义在此集合上一组操作的总称 + +- 原子类型:不可再分的数据类型; +- 结构类型:可以分解成若干分量(成分)的数据类型; +- **抽象数据类型**:抽象出具组织和其相关的操作; + + + +### 抽象数据类型(ADT) + +> Tips: 可以结合高级语言中类对象封装来理解; + +```bash +ADT抽象数据类型名{ + 数据对象:<数据对象的定义> + 数据关系:<数据关系的定义> + 基本操作:<基本操作的定义> +} ADT抽象数据类型名 +``` + + + +一个数学模型以及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑操作。与计算机内部如何表示和实现是没有关系; + +**不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用,实现了数据封装和信息隐藏** + + +通常由(数据对象、数据关系、数据操作集)三元组来表示抽象数据类型; + +抽象数据类型的主要作用是**数据封装和信息隐藏,让实现与使用相分离**。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响。 + +抽象数据类型独立于运算的具体实现,使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,实现了信息隐藏。 + + +### 数据结构 + + +首先明确:数据元素都不是孤立存在的。元素与元素之间存在着某种关系,这种相互之间的关系就是**结构**。 + +**数据结构是相互之间存在一种或者多种特定关系的数据元素的集合** + +- 逻辑结构 +- 存储结构(物理结构) +- 数据运算 + +数据的逻辑结构和存储结构是密不可分的。 + +**算法的设计取决于所选定的逻辑结构;算法的实现依赖于所采用的存储结构;** + + +--- + +## 数据结构三要素 + +- 数据的逻辑结构 +- 数据的存储结构 +- 数据的运算 + + +### 数据的逻辑结构 + +数据元素之间的逻辑关系,从逻辑关系上描述数据,叫做数据的逻辑结构。 + +与数据的存储(物理)结构无关,是独立于计算机的。 + +可以分为: + +- 线性结构 +- 非线性结构 + + +线性表是典型的线性结构,衍生出的栈、队列、串、数组、广义表也都是线性结构; + +非线性结构主要有:集合、树(一般树、二叉树)、图(有向图、无向图) + + +特别注意: + +- `集合`:结构中的数据元素之间**除了“同属于一个集合”的关系外,别无其他关系。** +- `线性结构`:结构中的数据元素之间**只存在一对一的关系**。 +- `树形结构`:结构中的数据元素之间**存在一对多的关系。** +- `图状结构和网状结构`:结构中的数据元素之间**存在多对多的关系。** + + + +### 数据的存储(物理)结构 + +数据结构在计算机中的表示(映像)。包括数据`元素的表示`和`关系的表示`。 + +存储结构是逻辑结构用计算机语言实现的,依赖于计算机语言。 + + +可以分为: + +- 顺序存储 +- 链式存储 +- 索引存储 +- 散列(Hash)存储 + +**注意:存储和存取的概念不一样** + +#### 顺序存储 + +**逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现。** + +优点: + +- 可以实现随机存取 +- 元素占用最少的存储空间 + +缺点: + +- 只能使用相邻的一整块存储单元,依赖于物理结构相邻; +- 容易产生`外部碎片` + +什么是内外部碎片? + +> 参考资料:https://blog.csdn.net/qq_22238021/article/details/80209062 + +- 外部碎片:`还没有分配出去`(不属于任何进程),但是**由于大小而无法分配给申请内存空间的新进程的内存空闲块。** +- 内部碎片:`已经被分配出去`(能明确指出属于哪个进程)的**内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。** + + +#### 链式存储 + +与顺序存储不同,**链式存储不要求逻辑上相邻的元素在物理位置上也相邻。** + +借助指示元素存储地址的`指针`表示元素之间的逻辑关系。 + + +优点: + +- 不会出现碎片现象 +- 充分利用所有存储单元 + +缺点: + +- 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习)。 +- 链式存储,**只能实现`顺序存取`,不能实现`随机存取`(指针的遍历)** + + +#### 索引存储 + +存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的`索引表`。 + +**索引表的每一项称为索引项,索引项的一般形式是:<关键字,地址>** + +优点: + +- 检索快(就好比字典有了目录,查询就很快了) + + +缺点: + +- 增加了索引表,占用较多的存储空间(典型的空间换时间策略) +- 增加、删除数据时,需要对应修改索引表,花费更多时间。 + +#### 散列(Hash)存储 + +根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。 + + +优点: + +- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) + + +缺点: + +- 非常依赖于`散列函数` +- 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突) +- 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销 + + +### 数据的运算 + +数据上的运算包括:`运算的定义` 、`运算的实现` + +- `运算的定义`:针对逻辑结构,指出运算的功能 +- `原酸的实现`:针对存储结构,指出运算的具体操作步骤 + + + + +线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。 + + +--- + +## 算法和算法评价 + + +### 算法 + +`算法` : 对特定问题求解步骤的一种描述,**是指令的有序集合**,每一条指令表示一个或多个操作。 + + +#### 重要特性 + +- `有穷性`:必须总是(对任何合法的输入值)在**执行有穷步后结束**,并且每一步都可**在有穷时间内完成** +- `确定性`:每条指令的含义明确,不会产生二义性(歧义),**对相同的输入只能得出相同的结果** +- `可行性`:算法是可行的。**算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的** +- `输入`:有零个或者多个输入,**输入取决于某个特定的对象的集合。** +- `输出`:有一个或者多个输出,**输出是和输入有着某种特定关系的量(强调输出与输入的关系)** + + +> **算法是有穷的,但是程序不一定满足有穷性**,程序只是算法在计算机上的特定的实现, 例如:死循环 + +#### 算法的目标 + +由于设计思路、解决问题方案等方面不同,不同算法之间也是有好坏的,就像人与人之间存在着差异。为设计出更好的算算法,往往需要追求更高的目标,而好的算法需要考虑到的目标就有: + +- 正确性:首先算法肯定是**需要正确的解决求解问题** +- 可读性:**算法应该具有良好的可读性**,就像项目代码一样,好的业务代码、逻辑清楚,**便于理解**。 +- 健壮性:**在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果**(在高级语言编程中,类似于强调封装方法的参数校验) +- 效率与低存储量需求:**效率即算法执行的时间**,**存储量需求即算法那执行过程中所有要的最大存储空间**,这些与算法所解决问题的规模有关; + + +> Tips: 效率可以结合时间复杂度来理解,存储量需求可以结合空间复杂度理解; + + +### 效率的度量 + +算法效率的度量是通过`时间复杂度`和`空间复杂度`来描述的; + +#### 时间复杂度 + +语句的频度:语句在算法中被重复执行的次数 + +算法中所有语句的`频度之和`记作T(n),即:对应算法问题规模n的函数,时间复杂度主要是来分析T(n)的数量级; + +**算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)** + +上面这句话是不是不能理解??? 哈哈哈,我第一次看,也是!! + +```c + +int test(n) { + if(n< 1){ + return 0; + } + // 循环叠加 输出 + ..... +} + + + +``` +在这个简单的函数里 + +- 当n<1的时候,例如:-2,就不需要循环,此时时间复杂度可以理解为T(1) +- 当n>1的时候,例如:5 此时时间复杂度可以理解为T(n) + +当然,这里只是简单举例子便于理解: + +> **算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)** + + + +- `最坏时间复杂度`:**最坏情况下**,算法的时间复杂度 +- `平均时间复杂度`:**所有可能输入实例在同等概率出现的情况下**,算法的期望运行时间 +- `最好时间复杂度`:**最好的情况下**,算法的时间复杂度 + + +一般情况下,考虑最坏情况的时间复杂度(即:最坏时间复杂度),保证算法的运行时间不会更长(最糟糕我都能预料,难道还有更糟糕?????噗呲) + +#### 空间复杂度 + +算法的空间复杂度可以用函数记作:S(n),**用来定义算法运行过程中需要耗费的存储空间**,是问题规模n的函数; + +> 渐进空间复杂度也被称为空间复杂度,记作:S(n)=O(g(n)) + + +**一个程序除了需要存储空间来存放本身所用的指令、常数、变量和输入数据外,也需要对数据进行操作的工作单元和存储一些实现计算所需要信息的辅助空间。** + +当输入数据所占用的空间只取决于问题本身,和算法无关时,只需要去分析除了输入和程序之外的额外空间 + + + +算法原地工作:算法所需要辅助空间是常量,记作S(1),例如: + +```c +int switchValue(a,b){ + // 定义临时变量 + int temp=a; + b=temp; + a=b; +} +``` + +在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1) diff --git a/docs/DS/basic_introduction/1.basic_concepts.md b/docs/DS/basic_introduction/1.basic_concepts.md new file mode 100644 index 0000000..b5abea3 --- /dev/null +++ b/docs/DS/basic_introduction/1.basic_concepts.md @@ -0,0 +1,83 @@ + + + + + +## 基础概念 + +### 数据 + +**信息的载体**,是客观事物属性的数、字符以及所有能够输入到计算机包中并且被计算机程序识别和处理的**集合** + +### 数据元素 + +**数据的基本单位**,通常按照一个整数来进行考虑和处理。 + + +特别注意:一个数据元素由若干个**数据项**组成,数据项是构成数组元素的最小单位,且不可分割。 + + + +### 数据对象 + +具有**相同性质**的数据元素的**集合**,**是数据的子集** + + +### 数据类型 + +值的集合和定义在此集合上一组操作的总称 + +- 原子类型:不可再分的数据类型; +- 结构类型:可以分解成若干分量(成分)的数据类型; +- **抽象数据类型**:抽象出具组织和其相关的操作; + + + +### 抽象数据类型(ADT) + +> Tips: 可以结合高级语言中类对象封装来理解; + +```bash +ADT抽象数据类型名{ + 数据对象:<数据对象的定义> + 数据关系:<数据关系的定义> + 基本操作:<基本操作的定义> +} ADT抽象数据类型名 +``` + + + +一个数学模型以及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑操作。与计算机内部如何表示和实现是没有关系; + +**不论内部结构如何变化,只要其数学特性不变,就不会影响到外部的使用,实现了数据封装和信息隐藏** + + +通常由(数据对象、数据关系、数据操作集)三元组来表示抽象数据类型; + +抽象数据类型的主要作用是**数据封装和信息隐藏,让实现与使用相分离**。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响。 + +抽象数据类型独立于运算的具体实现,使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,实现了信息隐藏。 + + +### 数据结构 + + +首先明确:数据元素都不是孤立存在的。元素与元素之间存在着某种关系,这种相互之间的关系就是**结构**。 + +**数据结构是相互之间存在一种或者多种特定关系的数据元素的集合** + +- 逻辑结构 +- 存储结构(物理结构) +- 数据运算 + +数据的逻辑结构和存储结构是密不可分的。 + +**算法的设计取决于所选定的逻辑结构;算法的实现依赖于所采用的存储结构;** + diff --git a/docs/DS/basic_introduction/2.three_elements_of_data_structure.md b/docs/DS/basic_introduction/2.three_elements_of_data_structure.md new file mode 100644 index 0000000..b13a260 --- /dev/null +++ b/docs/DS/basic_introduction/2.three_elements_of_data_structure.md @@ -0,0 +1,146 @@ + + + + + + +## 数据结构三要素 + +- 数据的逻辑结构 +- 数据的存储结构 +- 数据的运算 + + +### 数据的逻辑结构 + +数据元素之间的逻辑关系,从逻辑关系上描述数据,叫做数据的逻辑结构。 + +与数据的存储(物理)结构无关,是独立于计算机的。 + +可以分为: + +- 线性结构 +- 非线性结构 + + +线性表是典型的线性结构,衍生出的栈、队列、串、数组、广义表也都是线性结构; + +非线性结构主要有:集合、树(一般树、二叉树)、图(有向图、无向图) + + +特别注意: + +- `集合`:结构中的数据元素之间**除了“同属于一个集合”的关系外,别无其他关系。** +- `线性结构`:结构中的数据元素之间**只存在一对一的关系**。 +- `树形结构`:结构中的数据元素之间**存在一对多的关系。** +- `图状结构和网状结构`:结构中的数据元素之间**存在多对多的关系。** + + + +### 数据的存储(物理)结构 + +数据结构在计算机中的表示(映像)。包括数据`元素的表示`和`关系的表示`。 + +存储结构是逻辑结构用计算机语言实现的,依赖于计算机语言。 + + +可以分为: + +- 顺序存储 +- 链式存储 +- 索引存储 +- 散列(Hash)存储 + +**注意:存储和存取的概念不一样** + +#### 顺序存储 + +**逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现。** + +优点: + +- 可以实现随机存取 +- 元素占用最少的存储空间 + +缺点: + +- 只能使用相邻的一整块存储单元,依赖于物理结构相邻; +- 容易产生`外部碎片` + +什么是内外部碎片? + +> 参考资料:https://blog.csdn.net/qq_22238021/article/details/80209062 + +- 外部碎片:`还没有分配出去`(不属于任何进程),但是**由于大小而无法分配给申请内存空间的新进程的内存空闲块。** +- 内部碎片:`已经被分配出去`(能明确指出属于哪个进程)的**内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。** + + +#### 链式存储 + +与顺序存储不同,**链式存储不要求逻辑上相邻的元素在物理位置上也相邻。** + +借助指示元素存储地址的`指针`表示元素之间的逻辑关系。 + + +优点: + +- 不会出现碎片现象 +- 充分利用所有存储单元 + +缺点: + +- 除了存储元素外,还需要额外存储指针,会占用额外的存储空间(结合数据库索引学习)。 +- 链式存储,**只能实现`顺序存取`,不能实现`随机存取`(指针的遍历)** + + +#### 索引存储 + +存放数据元素和元素间关系的存储方式,在存储元素信息的同时,还需要建立附加的`索引表`。 + +**索引表的每一项称为索引项,索引项的一般形式是:<关键字,地址>** + +优点: + +- 检索快(就好比字典有了目录,查询就很快了) + + +缺点: + +- 增加了索引表,占用较多的存储空间(典型的空间换时间策略) +- 增加、删除数据时,需要对应修改索引表,花费更多时间。 + +#### 散列(Hash)存储 + +根据元素的关键字直接通过散列(Hash)函数计算出元素的存储地址。 + + +优点: + +- 检索快,添加、删除元素结点操作快(获取元素地址直接,整体时间就少了) + + +缺点: + +- 非常依赖于`散列函数` +- 会出现`散列冲突`(主要依赖与散列函数,散列函数不好就很容易出现散列冲突) +- 出现`散列冲突`时,解决冲突就会增加时间和空间上的开销 + + +### 数据的运算 + +数据上的运算包括:`运算的定义` 、`运算的实现` + +- `运算的定义`:针对逻辑结构,指出运算的功能 +- `原酸的实现`:针对存储结构,指出运算的具体操作步骤 + + + + +线性表既可以用顺序存储方式实现,也可以用链式存储方式实现。 \ No newline at end of file diff --git a/docs/DS/basic_introduction/3.algorithm_and_algorithm_evaluation.md b/docs/DS/basic_introduction/3.algorithm_and_algorithm_evaluation.md new file mode 100644 index 0000000..8070d6a --- /dev/null +++ b/docs/DS/basic_introduction/3.algorithm_and_algorithm_evaluation.md @@ -0,0 +1,114 @@ + + + + + +## 算法和算法评价 + + +### 算法 + +`算法` : 对特定问题求解步骤的一种描述,**是指令的有序集合**,每一条指令表示一个或多个操作。 + + +#### 重要特性 + +- `有穷性`:必须总是(对任何合法的输入值)在**执行有穷步后结束**,并且每一步都可**在有穷时间内完成** +- `确定性`:每条指令的含义明确,不会产生二义性(歧义),**对相同的输入只能得出相同的结果** +- `可行性`:算法是可行的。**算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的** +- `输入`:有零个或者多个输入,**输入取决于某个特定的对象的集合。** +- `输出`:有一个或者多个输出,**输出是和输入有着某种特定关系的量(强调输出与输入的关系)** + + +> **算法是有穷的,但是程序不一定满足有穷性**,程序只是算法在计算机上的特定的实现, 例如:死循环 + +#### 算法的目标 + +由于设计思路、解决问题方案等方面不同,不同算法之间也是有好坏的,就像人与人之间存在着差异。为设计出更好的算算法,往往需要追求更高的目标,而好的算法需要考虑到的目标就有: + +- 正确性:首先算法肯定是**需要正确的解决求解问题** +- 可读性:**算法应该具有良好的可读性**,就像项目代码一样,好的业务代码、逻辑清楚,**便于理解**。 +- 健壮性:**在输入非法数据时,算法也能适当地做出反应或进行处理,而不会产生莫名奇妙的输出结果**(在高级语言编程中,类似于强调封装方法的参数校验) +- 效率与低存储量需求:**效率即算法执行的时间**,**存储量需求即算法那执行过程中所有要的最大存储空间**,这些与算法所解决问题的规模有关; + + +> Tips: 效率可以结合时间复杂度来理解,存储量需求可以结合空间复杂度理解; + + +### 效率的度量 + +算法效率的度量是通过`时间复杂度`和`空间复杂度`来描述的; + +#### 时间复杂度 + +语句的频度:语句在算法中被重复执行的次数 + +算法中所有语句的`频度之和`记作T(n),即:对应算法问题规模n的函数,时间复杂度主要是来分析T(n)的数量级; + +**算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)** + +上面这句话是不是不能理解??? 哈哈哈,我第一次看,也是!! + +```c + +int test(n) { + if(n< 1){ + return 0; + } + // 循环叠加 输出 + ..... +} + + + +``` +在这个简单的函数里 + +- 当n<1的时候,例如:-2,就不需要循环,此时时间复杂度可以理解为T(1) +- 当n>1的时候,例如:5 此时时间复杂度可以理解为T(n) + +当然,这里只是简单举例子便于理解: + +> **算法的时间复杂度不仅依赖于问题的规模n,也取决于待输入的数据的性质(例如:输入元素的初始状态)** + + + +- `最坏时间复杂度`:**最坏情况下**,算法的时间复杂度 +- `平均时间复杂度`:**所有可能输入实例在同等概率出现的情况下**,算法的期望运行时间 +- `最好时间复杂度`:**最好的情况下**,算法的时间复杂度 + + +一般情况下,考虑最坏情况的时间复杂度(即:最坏时间复杂度),保证算法的运行时间不会更长(最糟糕我都能预料,难道还有更糟糕?????噗呲) + +#### 空间复杂度 + +算法的空间复杂度可以用函数记作:S(n),**用来定义算法运行过程中需要耗费的存储空间**,是问题规模n的函数; + +> 渐进空间复杂度也被称为空间复杂度,记作:S(n)=O(g(n)) + + +**一个程序除了需要存储空间来存放本身所用的指令、常数、变量和输入数据外,也需要对数据进行操作的工作单元和存储一些实现计算所需要信息的辅助空间。** + +当输入数据所占用的空间只取决于问题本身,和算法无关时,只需要去分析除了输入和程序之外的额外空间 + + + +算法原地工作:算法所需要辅助空间是常量,记作S(1),例如: + +```c +int switchValue(a,b){ + // 定义临时变量 + int temp=a; + b=temp; + a=b; +} +``` + +在上面的函数中,只是通过临时变量temp来实现a和b的值交换,没有需要更多变量,因此可以简单理解函数的在`原地工作`,辅助空间是常量,记作S(1) \ No newline at end of file diff --git a/docs/DS/basic_introduction/Readme.md b/docs/DS/basic_introduction/Readme.md new file mode 100644 index 0000000..eb812f8 --- /dev/null +++ b/docs/DS/basic_introduction/Readme.md @@ -0,0 +1,12 @@ + + + + +![](./basic_introduction.png) \ No newline at end of file diff --git a/docs/DS/basic_introduction/basic_introduction.png b/docs/DS/basic_introduction/basic_introduction.png new file mode 100644 index 0000000..d1c2919 Binary files /dev/null and b/docs/DS/basic_introduction/basic_introduction.png differ diff --git a/docs/DS/basic_introduction/basic_introduction.xmind b/docs/DS/basic_introduction/basic_introduction.xmind new file mode 100644 index 0000000..8676310 Binary files /dev/null and b/docs/DS/basic_introduction/basic_introduction.xmind differ diff --git a/docs/DS/coding/algorithm.md b/docs/DS/coding/algorithm.md new file mode 100644 index 0000000..3ec8d7e --- /dev/null +++ b/docs/DS/coding/algorithm.md @@ -0,0 +1,13 @@ + + + +## 恶补算法 + +>todo \ No newline at end of file diff --git a/docs/DS/linear_table.md b/docs/DS/linear_table.md new file mode 100644 index 0000000..d1d0ffc --- /dev/null +++ b/docs/DS/linear_table.md @@ -0,0 +1,330 @@ +--- +title: 线性表 +--- + + + + + + +## 基础概念和基本操作 + +> 强调线性表是一种逻辑结构,不是存储结构 + + +### 定义 + +线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。一般表示: + +L=(a1,a2,a3......an) 其中n可以理解为表长(线性表的长度),n=0时候,即表空 + + +- `表头元素`:线性表中唯一的“第一个”数据元素,例如a1 +- `表尾元素`:线性表中唯一的“最后一个”数据元素,例如an + + +重要逻辑特性: + +- 除表头元素外,线性表中每个元素有且仅有一个`直接前驱` +- 除表尾元素外,线性表中每个元素有且仅有一个`直接后继` + +基于此,这种**线性有序的逻辑结构**,使得线性表的特点如下: + +- 元素的**个数有限**(强调有限序列) +- 元素在逻辑上具有**顺序性**,在序列中每个元素都是都有先后次序的 +- 元素都数据元素,**每个元素都是单个元素** +- 元素的**数据类型都相同**(强调相同数据类型),每个数据元素占用相同大小的存储空间 +- 元素具有**抽象性**,仅仅讨论元素之间的逻辑关系,不需要去考虑元素究竟表示的什么内容 + + +> Tips: **线性表是一种逻辑结构**,表示元素之间一对一的相邻关系。**顺序表和链表则指的是存储结构** + + + +### 基本操作 + +- `InitList(&L)`: **初始化表**。构造空的线性表 +- `Length(L)`:**获取表的长度**。返回线性表L的长度,即表中的数据元素个数 +- `LocateElem(L,e)`:**按值查找操作**。在表L中国查找具有给定关键字的元素 +- `GetElem(L,i)`:**按位查找操作**。获取表中第i个位置的元素的值 +- `ListInsert(&L,i,e)`:**插入操作**。在表的第i个位置上插入指定元素e +- `ListDelete(&L,i,&e)`:**删除操作**。删除表中第i个位置的元素,并用e返回删除元素的值 +- `PrintList(L)`:**输出操作**。按照前后顺序(如:1、2....n)输出线性表的所有元素值 +- `Empty(L)`:**判空操作**。当表L为空,则返回true,否则返回false +- `DestoryList(&L)`:**销毁操作**。将线性表销毁,释放线性表L所占用的内存空间(类似:释放内存) + + +线性表是具有相同的数据类型的有限个数据元素组成的,**数据元素是由数据项组成的** + + +## 线性表的顺序表示 + + +### 定义 + +`顺序表`:顺序存储的线性表,**是用一组地址连续的存储单元,依次存储线性表中的数据元素,使得在逻辑上相邻的两个元素在物理位置上也相邻。** + + + + + + +顺序表中的元素的逻辑顺序与实际的物理位置相同 + + + +注意: + +- 线性表中的元素的位序是从1开始的,例如1、2、3... +- 数组中的元素的下标是从0开始的,例如0、1、2... + +```c +# define MaxSize 20 // 定义常量MaxSize 用来声明顺序表的最大长度 + +// 线性表结构体定义【ElemType用来代指顺序表中元素的类型,例如高级语言中的int、string....】 +typedef struct{ + ElemType data[MaxSize]; // 顺序表的元素 + int length; // 顺序表的长度 +}SqList + +``` + +#### 存储分配 + +`静态分配`:数组的大小和空间都是实现确定好的,一旦存储空间占满就会产生溢出,直接导致程序崩溃。(有点内存不够,宕机重启的意思....) + +`动态分配`:存储数据的空间在程序执行过程中通过`动态存储分配语句`分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间,满足扩充数据空间的目的。(有点动态规划的意思....)最重要的是:**不需要像静态分配那样,一次性地固定线性表的空间和大小** + + + +```c +#define InitSize 100 // 表长度初始化 + + +// 动态分配数组顺序表的结构体定义 +typedef struct{ + ElemType *data; // 动态分配数组的指针 + int MaxSize,length; // 数组的最大容量和当前元素个数 +}SqList; + +``` + +动态分配语句 + +```cpp +// C语言中 + +L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize); + + +// C++ 中 + +L.data=new ElemType[InitSize]; + +``` + +`malloc()函数`: 指针型函数,返回的指针指向该分配域的开头的位置。作用是在内存的动态存储区中分配一个长度为size的连续空间。[百度百科](https://baike.baidu.com/item/malloc%E5%87%BD%E6%95%B0/8582146?fr=aladdin) + +**动态分配不是链式存储,而是属于顺序存储结构**,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定; + + +#### 顺序表的特点 + + +- 随机访问【这是最主要的特点】,通过存储起始地址和元素序号O(1)时间内访问指定元素。 +- 存储密度高,没有结点只存储数据元素,不像索引存储那样,还需要索引表什么的.. +- 逻辑上相邻的元素物理上也相邻,插入和删除需要移动大量元素 + + + + + +### 基本操作 + + +#### 插入 + +在顺序表L的第i(1≤i≤L.length+1)个位置插入新的元素e + +- 第一步:如果i非法,则直接返回false,插入失败,结束插入过程 +- 第二步:i正常,将表的第i个元素以及后面的所有元素都像有移动一个位置,在腾出来的空位置插入元素e +- 第三步:顺序表插入成功,返回true + +注意:先判空和临界值,提高算法健壮性 + +```cpp + +/* + * @Description: 顺序表的插入操作 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +bool ListInsert(SqList &L, int i, ElemType e){ + + // i非法 i=1 表头 i=L.length+1 表尾巴 + if(i<1||i>L.length+1){ + return false; + } + + // 存储空间满,无法插入 + if(L.length >= MaxSize){ + return false; + } + + // 遍历,将位置元素往后移动,注意从后往前循环,避免值被覆盖 + for(int j=L.length; j>=i;j--){ + L.data[j]=L.data[j-1]; + } + + // 此时,表L中的第i个元素和第i+1元素素值一样,将新元素存入i位置即可 + + // 第i个元素,对应的位置角标为i-1 + L.data[i-1]=e; + + // 表长度加1 + L.length++; + + // 返回插入成功 + return true; +} + +``` + +注意:区别顺序表中的位序和角标; + +**时间复杂度** + +- 最好情况:在表尾插入,元素向后移动循环没有执行,时间复杂度O(1); +- 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n); +- 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n); + + +**线性表插入算法的平均时间复杂度为:O(n)** + +> Tips: 需要根据实现代码理解循环为什么是从后往前来实现元素后移,通过for循环可以很明显的看出表尾插入快,表头插入慢 + +#### 删除 + +删除顺序表L中第i(1≤i≤L.length+1)个位置的元素 + +- 成功,返回true,将被删除的元素用引用变量返回; +- 失败,返回false + +```C++ + +/* + * @Description: 顺序表的删除操作 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +bool ListDelete(SqList &L, int i, ElemType &e){ + + // i非法 i=1 表头 i=L.length+1 表尾巴 + if(i<1||i>L.length+1){ + return false; + } + + // 存储空间满,无法插入 + if(L.length >= MaxSize){ + return false; + } + + // 引用变量e赋值 + e=L.data[i-1] + + // 遍历,第i个元素后面的往前移动 + for(int j=i; j<=L.length;j++){ + // 从第i个元素开始,角标从i-1开始 + L.data[j-1]=L.data[j]; + } + + // 此时,表L中的表尾元素和倒数第二个元素值一样,将表的长度-1 + + // 表长度减1 + L.length--; + + // 返回删除成功 + return true; +} + +``` + +从这里来看,删除、插入元素都会涉及到大量的元素的移动(最好情况例外),总结而言: +- 元素从后往前移,循环从前往后遍历 +- 元素从前往后移,循环从后往前遍历 + + +**时间复杂度:** + + +- 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1); +- 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n); +- 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n); + + + +**线性表删除算法的平均时间复杂度为O(n);** + + +#### 按值查找(顺序查找) + +在顺序表L中查找第一个元素值等于e的元素,并返回位序 + + +```cpp +/* + * @Description: 顺序表的按值查找(顺序查找) + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +int LocateElem(SqList L,ElemType e){ + int i; + // 循环判断 + for(i=0;i + + + +## 线性表的基础概念和基本操作 + +> 强调线性表是一种逻辑结构,不是存储结构 + + +### 定义 + +线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列。一般表示: + +L=(a1,a2,a3......an) 其中n可以理解为表长(线性表的长度),n=0时候,即表空 + + +- `表头元素`:线性表中唯一的“第一个”数据元素,例如a1 +- `表尾元素`:线性表中唯一的“最后一个”数据元素,例如an + + +重要逻辑特性: + +- 除表头元素外,线性表中每个元素有且仅有一个`直接前驱` +- 除表尾元素外,线性表中每个元素有且仅有一个`直接后继` + +基于此,这种**线性有序的逻辑结构**,使得线性表的特点如下: + +- 元素的**个数有限**(强调有限序列) +- 元素在逻辑上具有**顺序性**,在序列中每个元素都是都有先后次序的 +- 元素都数据元素,**每个元素都是单个元素** +- 元素的**数据类型都相同**(强调相同数据类型),每个数据元素占用相同大小的存储空间 +- 元素具有**抽象性**,仅仅讨论元素之间的逻辑关系,不需要去考虑元素究竟表示的什么内容 + + +> Tips: **线性表是一种逻辑结构**,表示元素之间一对一的相邻关系。**顺序表和链表则指的是存储结构** + + + +### 基本操作 + +- `InitList(&L)`: **初始化表**。构造空的线性表 +- `Length(L)`:**获取表的长度**。返回线性表L的长度,即表中的数据元素个数 +- `LocateElem(L,e)`:**按值查找操作**。在表L中国查找具有给定关键字的元素 +- `GetElem(L,i)`:**按位查找操作**。获取表中第i个位置的元素的值 +- `ListInsert(&L,i,e)`:**插入操作**。在表的第i个位置上插入指定元素e +- `ListDelete(&L,i,&e)`:**删除操作**。删除表中第i个位置的元素,并用e返回删除元素的值 +- `PrintList(L)`:**输出操作**。按照前后顺序(如:1、2....n)输出线性表的所有元素值 +- `Empty(L)`:**判空操作**。当表L为空,则返回true,否则返回false +- `DestoryList(&L)`:**销毁操作**。将线性表销毁,释放线性表L所占用的内存空间(类似:释放内存) + + +线性表是具有相同的数据类型的有限个数据元素组成的,**数据元素是由数据项组成的** + + diff --git a/docs/DS/linear_table/2.sequential_representation.md b/docs/DS/linear_table/2.sequential_representation.md new file mode 100644 index 0000000..9c12999 --- /dev/null +++ b/docs/DS/linear_table/2.sequential_representation.md @@ -0,0 +1,275 @@ + + + + +## 线性表的顺序表示 + + +### 定义 + +`顺序表`:顺序存储的线性表,**是用一组地址连续的存储单元,依次存储线性表中的数据元素,使得在逻辑上相邻的两个元素在物理位置上也相邻。** + + + + + + +顺序表中的元素的逻辑顺序与实际的物理位置相同 + + + +注意: + +- 线性表中的元素的位序是从1开始的,例如1、2、3... +- 数组中的元素的下标是从0开始的,例如0、1、2... + +```c +# define MaxSize 20 // 定义常量MaxSize 用来声明顺序表的最大长度 + +// 线性表结构体定义【ElemType用来代指顺序表中元素的类型,例如高级语言中的int、string....】 +typedef struct{ + ElemType data[MaxSize]; // 顺序表的元素 + int length; // 顺序表的长度 +}SqList + +``` + +#### 存储分配 + +`静态分配`:数组的大小和空间都是实现确定好的,一旦存储空间占满就会产生溢出,直接导致程序崩溃。(有点内存不够,宕机重启的意思....) + +`动态分配`:存储数据的空间在程序执行过程中通过`动态存储分配语句`分配的,即便是数据空间占满,也可以另外开辟一块更大的空间,来替换原来的存储空间,满足扩充数据空间的目的。(有点动态规划的意思....)最重要的是:**不需要像静态分配那样,一次性地固定线性表的空间和大小** + + + +```c +#define InitSize 100 // 表长度初始化 + + +// 动态分配数组顺序表的结构体定义 +typedef struct{ + ElemType *data; // 动态分配数组的指针 + int MaxSize,length; // 数组的最大容量和当前元素个数 +}SqList; + +``` + +动态分配语句 + +```C +// C语言中 + +L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize); + + +// C++ 中 + +L.data=new ElemType[InitSize]; + +``` + +`malloc()函数`: 指针型函数,返回的指针指向该分配域的开头的位置。作用是在内存的动态存储区中分配一个长度为size的连续空间。[百度百科](https://baike.baidu.com/item/malloc%E5%87%BD%E6%95%B0/8582146?fr=aladdin) + +**动态分配不是链式存储,而是属于顺序存储结构**,动态分配的物理结构没有改变,依然是随机存取的方式。只是分配的空间大小可以在运行时决定; + + +#### 顺序表的特点 + + +- 随机访问【这是最主要的特点】,通过存储起始地址和元素序号O(1)时间内访问指定元素。 +- 存储密度高,没有结点只存储数据元素,不像索引存储那样,还需要索引表什么的.. +- 逻辑上相邻的元素物理上也相邻,插入和删除需要移动大量元素 + + + + + +### 基本操作 + + +#### 插入 + +在顺序表L的第i(1≤i≤L.length+1)个位置插入新的元素e + +- 第一步:如果i非法,则直接返回false,插入失败,结束插入过程 +- 第二步:i正常,将表的第i个元素以及后面的所有元素都像有移动一个位置,在腾出来的空位置插入元素e +- 第三步:顺序表插入成功,返回true + +注意:先判空和临界值,提高算法健壮性 + +```C++ + +/* + * @Description: 顺序表的插入操作 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +bool ListInsert(SqList &L, int i, ElemType e){ + + // i非法 i=1 表头 i=L.length+1 表尾巴 + if(i<1||i>L.length+1){ + return false; + } + + // 存储空间满,无法插入 + if(L.length >= MaxSize){ + return false; + } + + // 遍历,将位置元素往后移动,注意从后往前循环,避免值被覆盖 + for(int j=L.length; j>=i;j--){ + L.data[j]=L.data[j-1]; + } + + // 此时,表L中的第i个元素和第i+1元素素值一样,将新元素存入i位置即可 + + // 第i个元素,对应的位置角标为i-1 + L.data[i-1]=e; + + // 表长度加1 + L.length++; + + // 返回插入成功 + return true; +} + +``` + +注意:区别顺序表中的位序和角标; + +**时间复杂度** + +- 最好情况:在表尾插入,元素向后移动循环没有执行,时间复杂度O(1); +- 最坏情况:在表头插入,元素后移循环执行n次,时间复杂度为O(n); +- 平均情况:随机插入,平均次数为:n/2,对应的平均复杂度为O(n); + + +**线性表插入算法的平均时间复杂度为:O(n)** + +> Tips: 需要根据实现代码理解循环为什么是从后往前来实现元素后移,通过for循环可以很明显的看出表尾插入快,表头插入慢 + +#### 删除 + +删除顺序表L中第i(1≤i≤L.length+1)个位置的元素 + +- 成功,返回true,将被删除的元素用引用变量返回; +- 失败,返回false + +```C++ + +/* + * @Description: 顺序表的删除操作 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +bool ListDelete(SqList &L, int i, ElemType &e){ + + // i非法 i=1 表头 i=L.length+1 表尾巴 + if(i<1||i>L.length+1){ + return false; + } + + // 存储空间满,无法插入 + if(L.length >= MaxSize){ + return false; + } + + // 引用变量e赋值 + e=L.data[i-1] + + // 遍历,第i个元素后面的往前移动 + for(int j=i; j<=L.length;j++){ + // 从第i个元素开始,角标从i-1开始 + L.data[j-1]=L.data[j]; + } + + // 此时,表L中的表尾元素和倒数第二个元素值一样,将表的长度-1 + + // 表长度减1 + L.length--; + + // 返回删除成功 + return true; +} + +``` + +从这里来看,删除、插入元素都会涉及到大量的元素的移动(最好情况例外),总结而言: +- 元素从后往前移,循环从前往后遍历 +- 元素从前往后移,循环从后往前遍历 + + +**时间复杂度:** + + +- 最好情况:删除表尾元素,不需要移动任何元素,时间复杂度为O(1); +- 最坏情况:删除表头元素,需要移动除第一个元素外的所有元素,时间复杂度为O(n); +- 平均情况:随机删除,平均需要(n-1)/2,对应的时间复杂度为O(n); + + + +**线性表删除算法的平均时间复杂度为O(n);** + + +#### 按值查找(顺序查找) + +在顺序表L中查找第一个元素值等于e的元素,并返回位序 + + +```C++ +/* + * @Description: 顺序表的按值查找(顺序查找) + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-02-23 07:48:26 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-02-23 07:48:26 + */ +int LocateElem(SqList L,ElemType e){ + int i; + // 循环判断 + for(i=0;i + + + + +## 线性表的链式表示 + +顺序表的插入、删除操作需要移动大量元素,影响了运行效率(虽然时间复杂度为O(1)的情况也存在)。 + + +**链式存储线性表时,不需要使用连续的存储单元,不要求逻辑上相邻的两个元素在物理位置上也相邻** + + +理解“链”的含义,链条--->捆绑、指向------>指针 + + +**链式存储线性表时,对线性表的插入、删除元素是不需要移动元素的,只是需要修改指针** + + +- 单链表 +- 双链表 +- 循环链表 +- 静态链表 + + + +### 单链表 + +线性表的链式存储称作`单链表`,通过**一组任意的存储单元**来存储线性表中的数据元素。 + + +每个链表结点(node)除了存放元素自身的信息外,还需要存放一个指向其后继结点的指针。目的是:**通过指针建立起链表元素之间的线性关系** + + +单链表中结点类型的描述: +```C++ + +// 单链表结点类型定义 +typeof struct LNode{ + ElemType data; // 数据域 + struct LNode *next; // 指针域 +}LNode , *LinkList; + +``` + + +单链表可以解决顺序表需要大量连续存储空间的缺点,但是单链表在数据域的基础上附加了指针域,存在浪费存储空间的缺点; + + +单链表的元素是**离散地分布**在存储空间中的,因此**单链表是非随机存取的存储结构**,不能直接找到表中特定的结点,需要从头开始遍历、一次查找; + + +通常,**头指针用来标识一个单链表**。头指针指向`NULL`时,标识单链表为空。 + + + +#### 头结点 + +为了操作上的方便,在单链表第一个结点之前附加一个结点,叫做**头结点**。 + +- 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 +- 头结点的指针域指向线性表的第一个元素结点; + + + + +**不论单链表是否带头结点(可选),头指针始终指向链表的第一个结点。** + +头结点是带头结点的链表中的第一个结点【重要】 + +- 头结点的数据域可以不存任何信息、也可以记录表长等基础信息 +- 头结点的指针域指向线性表的第一个元素结点; + + +头结点的优点: + +- 因为开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其他位置上的操作一致,不需要进行特殊处理; +- 无论链表是否为空,头指针始终是指向头结点的头结点的非空指针【空表中,往往就只有头结点,此时头结点的指针域为空,可以有效避免头指针空指针异常问题】-----> **头结点的引入,很好的统一了空表和非空表的操作;** + + + +#### 头插法 + +> 从空表开始,生成新的结点,将读取的数据存放在新结点的数据域中,将新结点插入到当前链表的表头【头结点之后】 + + +```C++ +/* + * @Description: 单链表头插法创建 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-03-04 23:38:04 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-03-04 23:39:16 + */ +LinkList CreateListWithStartNode(LinkList &L){ + + LNode *s; + int x; + L=(LinkList)malloc(sizeof(LNode)); // 创建头结点L + L->next=NULL; // 初始化空链表 + + // 控制台输入值 + scanf("%d",&x); + + // 输入9999 表示结束 + while(x!==9999){ + // 开辟新结点存储空间 + s=(LNode*)malloc(sizeof(LNode)); + // 结点数据域赋值 + s->data=x; + // 修改指针,新结点插入表中【注意:L->next为头结点的指针域】 + s->next=L->next; + L->next=s; + scanf("%d",&x); + } + + // 返回单链表 + return L; +} + + +``` + +特点: + +- 读入数据的顺序与生成的链表中的元素顺序是相反的【结合队列先进先出思考】 +- 每个结点插入的时间复杂度为O(1),单链表长度为n时,头插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】 + + +#### 尾插法 + +头插法建立的单链表,链表中结点的次序和输入数据的顺序不一致【相反】,尾插法则很好的避免了这个问题; + +>新结点插入到当前链表的表尾上,必须增加一个尾指针r,始终指向当前链表的尾结点; + + +```C++ + +/* + * @Description: 单链表尾插法创建 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-03-04 23:38:04 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-03-04 23:39:16 + */ +LinkList CreateListWithEndNode(LinkList &L){ + + + int x; // 输入结点值 + L=(LinkList)malloc(sizeof(LNode)); + LNode *s; // 新结点s + LNode *r=L; // r为尾指针 + + // 控制台输入值 + scanf("%d",&x); + + while(x!==9999){ + // 开辟新结点存储空间 + s=(LNode *)malloc(sizeof(LNode)); + + // 新结点s的数据域赋值为x + s->data=x; + // 单链表L的尾指针指向新的结点s + r->next=s; + + // 指针r指向新的表尾结点 + r=s; + + scanf("%d",&x); + } + + // 表尾指针置空【重要】 + r->next=NULL; + + // 返回单链表 + return L; + +} + +``` + +特点: + +- 读入数据的顺序与生成的链表中的元素顺序完全一致 +- 每个结点插入的时间复杂度为O(1),单链表长度为n时,尾巴插法的时间复杂度为O(n)【结合算法中的while循环,可以很明确看出时间复杂度】 +- 相比头插法附设了一个指向表尾结点的指针,但时间复杂度与头插法相同 + + + +#### 按序号查找 + +> 在单链表中从第一个结点出发,顺指针next域逐个往下搜索、遍历,直到找出第i个结点为止,否则返回最后一个结点指针域NULL + + +```C++ + +/* + * @Description: 单链表按序号查找 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-03-04 23:38:04 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-03-04 23:39:16 + */ +LNode *GetElem(LinkList L,int i){ + int j=1; // 查询计数,初始为1 + LNode *p=L->next; // 单链表头结点指针赋值给指针p + + + // 第0个元素,则指向头结点,返回头结点 + if(i==0){ + // 头结点包含数据域和指针域 + return L; + } + + // 不等于0,却小于1,则i为负数无效,直接返回NULL,查询结果空; + if(i<1){ + return NULL; + } + + // p存在且计数没有走到初始i的位置 + while(p&&jnext; + + // 计数标记+1 + j++; + } + + // 注意: 当p不存在时, 跳出循环,p=NULL; 当p存在但是j大于等于i,跳出循环,返回查找的结果,返回p + // 从跳出循环上来分析,p要么存在即:找到的结点元素,要么为空即NULL + + // 跳出循环,返回第i个结点的指针 + return p; + +} +``` + +需要遍历(扫描)单链表,时间复杂度为:O(n) + + + +#### 按值查找 + +> 从单链表的第一个结点开始,从前往后依次比较表中个结点数据域的值,等于给定值e,则返回该结点的指针;若整个单链表【遍历完】中没有数据域值为e的结点,则返回NULL; + + +```C++ + +/* + * @Description: 单链表按值查找 + * @Version: Beta1.0 + * @Author: 【B站&公众号】Rong姐姐好可爱 + * @Date: 2020-03-04 23:38:04 + * @LastEditors: 【B站&公众号】Rong姐姐好可爱 + * @LastEditTime: 2020-03-04 23:39:16 + */ +LNode *LocateElem(LinkList L,ElemType e){ + + // 指针【哨兵】 + LNode *p=L->next; + // 从第1个结点开始查找数据域(data)为e的结点 + while(p!=NULL&&p->data!=e){ + // 无法匹配,指针后移 + p=p->next; + } + + // 注意:p为NULL的时候,说明单链表已经遍历的尾结点了,跳出循环,没有找到目标结点; + + // 查找到第1个匹配的结点,跳出循环,返回结点指针 + return p; + // +} + +``` +链表遍历无法匹配,会返回NULL,因为在尾结点无法匹配的时候,直接返回尾结点指针域 + +需要遍历(扫描)单链表,时间复杂度为:O(n) + + +#### 结点插入 + +> 单链表中,将值为x的新结点插入到单链表的第i个位置上 + +- 第一步: 检查插入位置的合法性; +- 第二步: 找到待插入位置的前驱结点,即第(i-1)个结点; +- 第三部: 在前驱结点后插入新结点; + +```C++ + // 循环遍历,时间复杂度O(n) + p=GetElem(L,i-1); + + // 移动指针,时间复杂度O(1) + s->next=p->next; + p->next=s; +``` + +结合上面的代码可以看出,将元素x插入到单链表L的第i个元素上,必须先找到单链表L的i个结点的前驱结点,即(i-1)的位置,需要采用`GetElem()`函数,按照序号查找; + +如果返回的前驱结点不为空,则说明插入的位置i合法,否则位置非法,插入失败; + +找到前驱结点p后,最重要的是移动指针,将新的结点s的指针域指向结点p的指针域,也就是s的指针域指向元素p的后继结点,第i个结点元素 + +原来的(i-1)位置上的元素,也就是前驱结点p的指针域则必须指向新的结点元素; + +**上面的过程不能更换,避免后继指针不存在的问题** + + +最后的最后,一定要注意将s的数据域赋值x + + +插入结点的时间复杂度集中在查找第(i-1)个元素,时间复杂度为O(n);如果在给定结点的后面插入新结点,只需要执行`p->next=s`操作,时间复杂度为O(1) + + + +##### 前插操作 + +> 在某结点的前面插入一个新的结点 + +**对结点的前插操作都可以转化为后插操作,前提:需要从单链表的头结点开始顺序查找到其前驱结点;时间复杂度为O(n)。** + +##### 后插操作 + +> 在某结点的后面插入一个新的结点,单链表插入算法中,通常采用后插操作的 + + +```C++ + +// 结点s插入到结点p的前面,修改指针域,顺序不能改变 +s->next=p->next; +p->next=s; + + +// 经典的借助变量,进行值交换 +temp=p->data; +p->data=s->data; +s->data=temp; + +``` + +上述借助临时变量`temp`来将结点s和结点p的数据域进行交换,需要开辟O(1)的空间复杂度,但是时间复杂度却从O(n)改变为O(1),典型的空间换时间策略 + + +#### 删除结点 + +> 将单链表L的第i个结点元素删除; + + +- 第一步: 先检查删除位置的合法性; +- 第二步: 查找表中的第(i-1)个结点,即被删结点的前驱结点; +- 第三步: 移动指针,删除结点元素; + + +```C++ + +// 获取删除位置结点元素的前驱结点 +p=GetElem(L,i-1); + +// 删除位置结点元素指针 +q=p->next; + +// 修改指针,将删除位置结点元素前驱结点的指针域指向其后继结点 +p->next=q->next; + +// 释放结点元素的内存控件 +free(q) + +``` + +和插入算法一样,时间都消耗在查询前驱结点上,时间复杂度为:O(n) + + + + +> 删除单链表L中给点结点元素*p,通常是按值查找获取到p结点的前驱元素,再执行删除操作,这样很明显会导致时间复杂度为:O(n),主要都消耗在`按值查找`上 + +这里可以利用p结点的后继结点将p结点删除 + +- 第一步:申请结点q,使其只想p结点的后继结点; +- 第二步:将p结点的数据域值换成其后继结点的数据域;【注意,交换没什么意义,最终p的后继结点会删除、释放】 +- 第三步:p的指针域指向q的指针域,q结点从链中“断开” +- 第四步:释放q的内存空间 + + +```C++ + // 存放p的后继结点指针 + q=p->next; + + // 结点p的后继结点元素赋值给结点p,避免后继结点的数据域丢失 + p->data=p->next->data; + p->next=q->next; + + // 此时q指向更换数据域后的p,即原来p的后继结点 + free(q) + +``` + +相比按值查找前驱结点来删除给定的结点p,利用后继结点来删除的时间复杂度更小,为:O(1) + + + +#### 计算表长 + +> 计算单链表中数据结点(不含头结点)的个数 + + +算法思路:从第一个结点开始顺序依次访问表中的每一个结点,为此需要设置一个`计数器变量`,每访问一个结点,计算器加1,直到访问到空结点为止。 + +算法时间复杂度:O(n) + + +**单链表的长度是不包括头结点的,不带头结点和带头结点的单链表在求表长操作上会略有不同。** + +不带头结点的单链表,当表为空时候,需要单独处理; + +```C++ +// 不带头结点的单链表L为空,判定条件是L=NULL。 +if(L===NULL){ +// 链表为空,表长为0 + return 0; +} + +// 带头结点的单链表L为空,判空条件:L->next=NULL; + +if(L->next===NULL){ + // 链表为空,不包含头结点,表长为0 + return 0; +} + +``` \ No newline at end of file diff --git a/docs/DS/linear_table/4.double_linked_list.md b/docs/DS/linear_table/4.double_linked_list.md new file mode 100644 index 0000000..d9e3149 --- /dev/null +++ b/docs/DS/linear_table/4.double_linked_list.md @@ -0,0 +1,93 @@ + + + + + + +## 双链表 + + +从单链表的结构上来看 +- 访问特定结点的前驱结点需要遍历整个单链表,移动指针,时间复杂度为:O(n) +- 访问特定结点的后继结点只需要移动一次指针,时间复杂度为:O(1) + + +双链表的引入,很好的解决单链表访问前驱结点时间消耗大的问题。 + + +双链表结点由三部分组成: + +- `数据域` 存放数据信息 +- `prior指针域` 指向结点的前驱结点 +- `next指针域` 指向结点的后继结点 + + +```C++ + +// 双链表结点类型 +typedef struct DNode{ + ElemType data; // 结点的数据域 + struct DNode *prior; // 结点的前驱指针 + struct DNode *next; // 结点的后继指针 +}DNode, *DlinkList; + +``` + + +### 基本特点 + +- 双链表仅仅在单链表的结点中增加了一个指向结点前驱的`prior`指针; +- `按值查找`、`按序号查找`在单链表和双链表上的操作是相同的。 +- 和单链表不同,`插入`、`删除`操作除了修改`next`指针域,双链表还需要修改`prior`指针域,确保不断`链`,时间复杂度都为:O(1) + + + + +### 插入结点 + +> 在双链表中p所指的结点之后插入结点s + + +```C++ + +// 第一步 +s->next=p->next; + +// 第二步 +p->next->prior=s; + +// 第三步 +s->prior=p; + +// 第四步 +p->next=s + +``` + +**第一步和第二步必须再第四步之前**,整体时间复杂度为:O(1) + +### 删除结点 + +> 删除双链表中结点p的后继结点q + +```C++ + +// 第一步 +p->next=q->next; + +// 第二步 +q->next->prior=p; + +// 第三步 +free(q); + +``` + +**第一步和第二步顺序可换**,整体时间复杂度为:O(1) \ No newline at end of file diff --git a/docs/DS/linear_table/5.circular_list.md b/docs/DS/linear_table/5.circular_list.md new file mode 100644 index 0000000..1306f32 --- /dev/null +++ b/docs/DS/linear_table/5.circular_list.md @@ -0,0 +1,77 @@ + + + + + + +## 循环链表 + +- 循环单链表 +- 循环双链表 + + +### 循环单链表 + +`循环单链表`是在单链表的基础上,将最后一个结点(尾结点)的指针由`NULL`改为指向`头结点`,形成`环`。【单链表----->循环单链表】 + + +```C++ +// 双链表结点类型 +typedef struct DNode{ + ElemType data; // 结点的数据域 + struct DNode *prior; // 结点的前驱指针 + struct DNode *next; // 结点的后继指针 +}DNode, *DlinkList; + +``` + +#### 判空条件 + +**不是判断头结点的指针是否为空,而是需要判断是否等于头指针**,表为空时,头结点的next指针域其实是指向自己; + + + +#### 特点 + +- 在循环单链表中,尾结点*p的next指针域指向链表L(即:头结点),形成了`闭环`,不存在指针域为`NULL`的结点。 +- **由于循环单链表是个`环`,在任何位置上的插入、删除操作都是等价的,不需要去判断是否是表尾**。当其中的结点的next指针指向自己,也就能判断表为空 +- 单链表只能从头结点(表头结点)开始往后顺序遍历整个表,循环单链表可以从表中任意位置开始遍历整个链表,结点是等价的; +- **循环单链表可以抽象为时钟,形成的`环`是有顺序的;** +- 频繁的`表头`和`表尾`操作,可以对循环单链表设置`尾指针`,而不设置`头指针`,明确尾指针r后,头指针即为:`r->next` ,减少头指针到尾指针间的遍历,时间复杂度:O(n)---->O(1) + + + + +### 循环双链表 + +`循环双链表`是在双链表的基础上,将`尾结点`的`next`指针指向`头结点`,将`头结点`的`prior`指针指向`尾结点`。【双链表----->循环双链表】 + + +```C++ +// 双链表结点类型 +typedef struct DNode{ + ElemType data; // 结点的数据域 + struct DNode *prior; // 结点的前驱指针 + struct DNode *next; // 结点的后继指针 +}DNode, *DlinkList; + +``` + +#### 判空条件 + +循环双链表为空时,头结点*p的prior指针和next指针都指向L,即同时满足: + +- p->next=L +- p->prior=L + + +#### 基本特点 + +- 从双向链表中的任意一个结点开始,都可以很方便地访问它的`前驱结点`和`后继结点`。 \ No newline at end of file diff --git a/docs/DS/linear_table/6.static_linked_list.md b/docs/DS/linear_table/6.static_linked_list.md new file mode 100644 index 0000000..c9d2539 --- /dev/null +++ b/docs/DS/linear_table/6.static_linked_list.md @@ -0,0 +1,45 @@ + + + + + + +## 静态链表 + +> 借助数组来描述线性表的链式存储结构,结点元素同样存在数据域`data`和指针域`next` + + +注意: 和普通的链表的指针域不同的是,静态链表的指针是结点元素的相对地址(数组下标),也称为`游标`,建议结合高级语言中数组的概念来理解; + + +**与顺序表一样,虽然静态链表属于链表,但是存储时需要预先分配一块连续的内存空间** + + +静态链表结构类型: + + +```C++ + +// 定义静态链表的最大长度 +# define MaxSize 50 + +typedef struct{ + ElemType data; // 存储数据元素,数据域 + int next; // 下个元素的相对地址,数组下标 +}SLinkList[MaxSize]; + +``` + +很显然,静态链表是通过`数组游标`来访问下一个结点元素,可以和`指针域`的相关概念结合理解; + + +- 静态链表以`next=-1`作为结束的标志【尾结点】 +- 和动态链表相同,**插入、删除操作不需要移动元素,只需要修改指针**; +- 总体来说,静态链表没有单链表使用方便,需要将整个链表存储在一块连续的内存空间中,内部的存储可以分散,通过指针构成`链`的关系 \ No newline at end of file diff --git a/docs/DS/linear_table/7.comparison_of_sequential_list_and_linked_list.md b/docs/DS/linear_table/7.comparison_of_sequential_list_and_linked_list.md new file mode 100644 index 0000000..85aed33 --- /dev/null +++ b/docs/DS/linear_table/7.comparison_of_sequential_list_and_linked_list.md @@ -0,0 +1,73 @@ + + + + + +## 顺序表和链表的比较 + + +### 存取方式 + +- 顺序表支持顺序存取和随机存取; +- 链表只能从表头顺序存取元素,支持顺序存取; + + +### 逻辑结构与物理结构 + + +- 顺序存储时,逻辑上相邻的元素,对应的物理存储位置也相邻【一定性】。 +- 链式存储时,逻辑上相邻的元素,对应的物理存储位置不一定相邻【可以相邻,也可以不相邻】。 +- 链式存储的逻辑关系通过指针链接表示; + + + +### 时间复杂度 + +#### 按值查找 + +- 顺序表无序的情况下,顺序表和链表的时间复杂度均为O(n) +- 顺序表有序的情况下,顺序表的时间复杂度为O(log2n),链表的时间复杂度为O(n); + + +**注意:O(log2n) < O(n)** + +#### 按序号查找 + +- 顺序表支持随机访问,时间复杂度为O(1); +- 顺序表不支持随机访问,时间复杂度为O(n); + +#### 插入、删除 + +- 顺序表平均需要移动半个表长的元素; +- 链表只需要修改相应结点的指针域,不需要移动元素; +- 链表结点除了数据域,还有指针域,在存储空间上比顺序存储需要更大的存储空间,付出更大的存储代价,存储密度不够大 + +### 空间分配 + +#### 顺序存储 + + +##### 静态分配 + +- 需要预先分配足够大的存储空间; +- 空间装满后不能扩充,存储新元素将出现`内存溢出`; +- 存储空间过大,顺序表后部闲置空间过多,造成`内部碎片` +- 存储空间过小,会造成`内存溢出` + +##### 动态分配 + +- 动态分配能够扩充存储空间,但需要移动大量元素,操作效率降低 +- 内存中没有更大块的连续存储空间,将会导致空间分配失败; + + +#### 链式存储 + +- 链式存储的结点空间只在需要的时候申请分配 +- 只要内存由空间就可以分配,操作灵活、高效 \ No newline at end of file diff --git a/docs/DS/linear_table/8.selection_of_storage_structure.md b/docs/DS/linear_table/8.selection_of_storage_structure.md new file mode 100644 index 0000000..d41e0ed --- /dev/null +++ b/docs/DS/linear_table/8.selection_of_storage_structure.md @@ -0,0 +1,46 @@ + + + + + + +## 存储结构的选取 + + + +### 基于存储的考虑 + +- 对线性表的长度和存储规模难以估计时,不宜采用顺序表存储 +- 链表不用事先估计存储规模,但存储密度较低 +- 链式存储结构的存储密度小于1,不要求连续的存储空间 + + + +### 基于运算的考虑 + +- 顺序表支持随机存取,按序号查找顺序表的时间复杂度为O(1); +- 链表不支持随机存取,按序号查找链表的时间复杂度为O(n); +- 顺序表的插入、删除操作,平均需要移动表中一半的元素,当表的数据量较大时,这种情况需要重点考虑的。 +- 链表的插入、删除操作,也是需要找插入位置(前驱结点、后继结点),主要的操作还是比较操作,相对较好; + + + + +### 基于环境的考虑 + +- 顺序表容易实现,任何高级语言中都有数组类型; +- 链表操作是基于指针的,指针移动,相对复杂; + + + +综上比较 + +- 通常比较稳定的线性表选择顺序存储; +- 频繁进行插入、删除操作的线性表,应该选择链式存储,动态性较强 \ No newline at end of file diff --git a/docs/DS/linear_table/9.piecemeal_knowledge_supplement.md b/docs/DS/linear_table/9.piecemeal_knowledge_supplement.md new file mode 100644 index 0000000..45d1a68 --- /dev/null +++ b/docs/DS/linear_table/9.piecemeal_knowledge_supplement.md @@ -0,0 +1,34 @@ + + + + + +## 零碎知识补充 + +- 无论是链表的插入还是删除操作,必须保证不断链【重要】 +- 顺序存储结构可以随机存取也能顺序存取,链式结构只能进行顺序存取 +- 顺序存储方式同样适合图和树的存储,例如:满二叉树的顺序存储 +- 队列需要在表头删除元素,在表尾插入元素【先进先出】,采用带尾指针的循环单链表比较方便 +- 数组排序最少时间复杂度为O(nlog2n)【重要】 +- 静态链表中的指针称为`游标`,指示下一个元素在数组中的`下标` +- 静态链表用数组表示,需要预先分配较大的连续空间,同时具有一般链表的特点(插入、删除元素不需要移动元素) + + +### 单链表设置头结点 + + +目的 + +> 主要是方便运算。 + +好处 + +- 有头结点后,插入、删除数据元素的算法统一起来了,不需要判断是否在第一个元素之前插入或者删除第一个元素了。 +- 不论链表是否为空,头指针是指向头结点的`非空指针`,链表的头指针不变,因此空链表和非空链表的处理也就统一起来了。 diff --git a/docs/DS/linear_table/Readme.md b/docs/DS/linear_table/Readme.md new file mode 100644 index 0000000..099592c --- /dev/null +++ b/docs/DS/linear_table/Readme.md @@ -0,0 +1,11 @@ + + + +![](./线性表_水印.png) \ No newline at end of file diff --git a/docs/DS/linear_table/线性表_水印.png b/docs/DS/linear_table/线性表_水印.png new file mode 100644 index 0000000..9ded303 Binary files /dev/null and b/docs/DS/linear_table/线性表_水印.png differ diff --git a/docs/NoteMap/CN_Map.md b/docs/NoteMap/CN_Map.md new file mode 100644 index 0000000..b5e5064 --- /dev/null +++ b/docs/NoteMap/CN_Map.md @@ -0,0 +1,10 @@ + + +## 计算机网络思维导图 \ No newline at end of file diff --git a/docs/NoteMap/DS_Map.md b/docs/NoteMap/DS_Map.md new file mode 100644 index 0000000..001ba27 --- /dev/null +++ b/docs/NoteMap/DS_Map.md @@ -0,0 +1,10 @@ + + +## 数据结构思维导图 \ No newline at end of file diff --git a/docs/OS/Readme.md b/docs/OS/Readme.md new file mode 100644 index 0000000..1f3ede1 --- /dev/null +++ b/docs/OS/Readme.md @@ -0,0 +1,15 @@ +--- +title: Readme +--- + + + +## 操作系统 +doing diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..b4c8841 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,235 @@ +--- +home: true +heroImage: https://static01.imgkr.com/temp/f0108d7c178b4ce196e43ebec14fbf23.png +heroText: 计算机应试全家桶 +externalLinkIcon: false +tagline: 磨刀不误砍柴工、读完硕士再打工,笔记内容持续更新... +actions: + - text: 快速开始→ + link: /guide/ + type: primary + - text: 工作机会 + link: /gangg + type: secondary +features: +- title: 基础概览 + details: 与官网同步的Egg.js框架基础知识整理,有效地降低日常开发和复习巩固的查询、学习时间。 +- title: 整理强化 + details: 官方插件的基础上,抽象、封装出适合自己功能的plus插件,能够快速集成、使用在新的项目中。 +- title: 反复反复 + details: 通过以项目Demo示例的方式,对框架常用的功能进行Code编写和整理,提供有效且易用的代码封装。 + +footerColumn: 3 +footerWrap: +- headline: 相关资料 + items: + - title: 王道论坛 + link: https://github.com/zpfz/vuepress-theme-antdocs + details: 全平台都可以关注 + - title: 研招网 + link: https://github.com/zpfz/vuepress-theme-antdocs + details: 考研最新消息 +- headline: 开源共享 + items: + - title: 408Family + link: https://github.com/zpfz/vuepress-theme-antdocs + details: egg-axios-plus + - title: 408CSFamily + link: https://github.com/zpfz/vuepress-theme-antdocs + details: egg-grpc-plus + - title: mysql + link: https://github.com/zpfz/vuepress-theme-antdocs + details: egg-mysql-plus + - title: sequelize + link: https://github.com/zpfz/vuepress-theme-antdocs + details: egg-sequleize-plus + - title: MQ + link: https://github.com/zpfz/vuepress-theme-antdocs + details: egg-rabbit-plus +- headline: 线上平台 + items: + - title: Oauth2 + link: http://oauth2.142vip.cn + details: 授权管理 + - title: Yapi + link: https://yapi.142vip.cn + details: 高效、易用的api平台 +- headline: 联系方式 + items: + - title: 掘金 + link: https://juejin.cn/user/448256476724807 + details: 不定期更新 + - title: CSDN + link: https://blog.csdn.net/Mmdapls + details: 不定期更新 + - title: Github + link: https://github.com/mmdapl + details: 日常更新 + - title: 哔哩哔哩 + link: https://space.bilibili.com/350937042 + details: 不定期更新 +# 百度统计 +footer: Copyrights © 2019-2022 妍荣姑娘网络工作室 | Rong姐姐好可爱 +# footer: Copyrights © 2019-2022 妍荣姑娘网络工作室 Rong姐姐好可爱 +footerHtml: true +--- + + +--- + +### 本地浏览【推荐】 + +由于平台、网络等原因,在线浏览容易出现加载面、加载不出来等常见问题,因此非常建议在本地进行浏览、学习;**下面指令默认你已经安装[Git](https://git-scm.com/download)、[NPM](https://www.npmjs.com/)、[PNPM](https://www.pnpm.cn/)、[Yarn](https://yarn.bootcss.com/)、[Node](http://nodejs.cn)等环境,并对此有一定了解!** + + + + + +```bash:no-line-numbers +## 进入cmd命令行,直接克隆仓库 +git clone https://github.com/mmdapl/408CSFamily.git + +## 进入408CSFamily文件夹中 +cd 408CSFamily/ + +## tips: 如果本地已经clone过仓库,建议执行pull指令,获取最新 +git pull + +## 下载依赖包 +pnpm install + +## 执行dev指令,本地启动项目,打开http://localhost:4200即可访问文档 +pnpm dev + +``` + + + + +```bash:no-line-numbers +## 进入cmd命令行,直接克隆仓库 +git clone https://github.com/mmdapl/408CSFamily.git + +## 进入408CSFamily文件夹中 +cd 408CSFamily/ + +## tips: 如果本地已经clone过仓库,建议执行pull指令,获取最新 +git pull + +## 下载依赖包 +npm install + +## 执行dev指令,本地启动项目,打开http://localhost:4200即可访问文档 +npm run dev + +``` + + + + + + + + +```bash:no-line-numbers +## 进入cmd命令行,直接克隆仓库 +git clone https://github.com/mmdapl/408CSFamily.git + +## 进入408CSFamily文件夹中 +cd 408CSFamily/ + +## tips: 如果本地已经clone过仓库,建议执行pull指令,获取最新 +git pull + +## 下载依赖包 +yarn install + +## 执行dev指令,本地启动项目,打开http://localhost:4200即可访问文档 +yarn run dev + +``` + + + + + +查看项目启动日志并访问:[http://127.0.0.1:4200](http://localhost:4200),开启学习之旅吧~ + + +### 在线浏览 + +- 个人网站 +- 静态托管 + + +### 提交记录 + + + + +--- + + +### 赞赏列表 + + +以下排名不分先后! [详细统计]() + + + + + + +### 赞助商 + +以下排名不分先后! 哈哈哈,还木有收到赞助,先留坑 + + + + +--- +### 联系作者 + +
+ + + + + + + + +
+ +若系列文章对你有所帮助,欢迎订阅公众号,获取更多内容。也可微信”骚扰“,商务合作请备注来意 + + + + + + + +

+ +

+ +交流/加群/互看朋友圈 +当然:**聊天 /提问 /建议 /提需求** 可以在本公众号直接**私信**,后台可以看到,有时间即会回复,偶尔的延迟和疏漏还请小伙伴们谅解,蟹蟹。 + + + + +### 外链 + + diff --git a/package.json b/package.json index 3a66ab3..e6721c3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "dev": "vuepress dev docs", - "build": "vuepress build docs" + "build": "vuepress build docs", + "ali": "bash scripts/deploy.bash ali $npm_package_version", + "github": "bash scripts/deploy.bash github" }, "author": "Rong姐姐好可爱", "license": "MIT", diff --git a/scripts/build_image.sh b/scripts/build_image.sh index 5a8cfaa..b042d7a 100644 --- a/scripts/build_image.sh +++ b/scripts/build_image.sh @@ -38,7 +38,7 @@ run(){ - +## 推送镜像 push_docker_image(){ if [[ "$(docker images -q "${repoAddress}${projectName}_${version}" 2> /dev/null)" != "" ]]; then diff --git a/scripts/deploy.bash b/scripts/deploy.bash new file mode 100644 index 0000000..e3f1371 --- /dev/null +++ b/scripts/deploy.bash @@ -0,0 +1,145 @@ +#!/bin/bash + +## 功能:清除容器,删除旧镜像,创建新的容器 +## 参考:https://blog.csdn.net/Dontla/article/details/125210694 +## 作者:Rong姐姐好可爱 +## 使用示例:bash xxx.sh 容器名称 镜像地址 +## + +## 日志颜色定义 +readonly successLogger="\033[36m" +readonly errorLogger="\033[1;31m" +readonly warnLogger="\033[1;33m" +## 定义时间 +readonly currentTime=$(date "+%Y-%m-%d %H:%M:%S") +readonly repoAddress="registry.cn-hangzhou.aliyuncs.com/142vip/doc_book" +readonly containerName="408CSFamily" +readonly networkName="service_env_net" +## 定义参数 +operationName=${1} +version=${2} + + + + +## 参数检查 +prepare_check(){ + if test -z "${containerName}" + then + echo -e "${errorLogger}${currentTime}:参数错误 部署平台不能为空." + exit 0 + fi + +} + +## 判断容器存在即删除 +## - 一个参数,容器名称 +delete_container(){ + docker inspect "${1}" -f '{{.Name}}' > /dev/null + if [ $? -eq 0 ] ;then + echo -e "${warnLogger}${currentTime}容器:${1} 存在,现进行删除" + docker rm -f "${1}" + fi +} + +## 判断镜像存在,即删除 +## - 一个参数,镜像地址 +delete_image(){ + ## 判断版本号 + if test -z "${version}";then + echo -e "${errorLogger}${currentTime}:参数错误 镜像版本号不能为空." + exit 0 + fi + + if [[ "$(docker images -q "${1}" 2> /dev/null)" != "" ]]; + then + echo -e "${warnLogger}${currentTime}镜像:${1}存在,现进行删除" + docker rmi "${1}" + fi +} + + +## 环境初始成功 +run(){ + if [ "${operationName}" == "gitee" ];then + ## 查看所有 + deploy_to_gitee + exit 0; + elif [ "${operationName}" == "github" ]; then + deploy_to_github + exit 0; + elif [ "${operationName}" == "ali" ]; then + ## 删除容器 + delete_container "${containerName}" + ## 删除镜像 + delete_image "${repoAddress}:${containerName}_${version}" + ## 部署 + deploy_to_ali + exit 0; + else + echo -e "${errorLogger}${currentTime}当前操作不支持,目前只支持:ali/gitee/github" + exit 0 + fi +} + + +## 部署到阿里服务器 +deploy_to_ali(){ + echo -e "${successLogger}---------------- deploy ${containerName} ali start ---------------- " + + docker run -d --name "${containerName}" \ + -p 7000:7000 \ + --network="${networkName}" \ + --restart=unless-stopped \ + --ip=172.30.0.200 \ + "${repoAddress}:${containerName}_${version}" + + echo -e "${successLogger}---------------- deploy ${containerName} ali end ------------------ " + docker ps +} + +## 部署到github静态资源托管 +deploy_to_github(){ + echo -e "${successLogger}---------------- deploy ${containerName} github start ---------------- " + + # 当命令以非零状态退出时,则退出shell + set -e + + # 进入上级目录,并编译 + npm run build && cd docs/.vuepress/dist + git init && git add --all + ## 如果没有输入commit信息,则采用默认 + if [ "${commitInfo}" -eq "" ]; then + commitInfo="408CSFamily Init" + fi + git commit -m "refactor:${commitInfo}" + + ## 配置个人信息 + git config user.name "晚上吃芝士+葡萄的妹妹" + git config user.email "fairy0115@2925.com" + + git config --list + + + # if you are deploying to https://.github.io + # git push -f git@github.com:/.github.io.git master + # if you are deploying to https://.github.io/ + git push -f https://github.com/mmdapl/408CSFamily.git master:pages/github + cd - + echo -e "${successLogger}---------------- deploy ${containerName} github end ------------------ " +} + + +## 部署到gitee静态资源托管 +deploy_to_gitee(){ + exit 0 +} + + + + +prepare_check + +run + + diff --git a/scripts/docker_network.sh b/scripts/docker_network.sh index c079053..f0a31b1 100644 --- a/scripts/docker_network.sh +++ b/scripts/docker_network.sh @@ -54,7 +54,7 @@ run(){ echo -e "${successLogger}---------------- shell rm start ---------------- " exit 0; else - echo -e "${errorLogger}当前操作不支持,目前只支持:ls/init/rm" + echo -e "${errorLogger}当前操作不支持,目前只支持:ls/init/rm" exit 0 fi } @@ -78,7 +78,8 @@ init_network(){ "${defaultNetworkName}" echo -e "${successLogger}---------------- 创建后 ---------------------" docker network ls - docker netwrok inspect "${networkName}" + echo -e "${successLogger}---------------- 网络信息 ---------------------" + docker netwrok inspect "${defaultNetworkName}" fi } @@ -96,7 +97,7 @@ remove_network(){ fi echo -e "${successLogger}----------------删除前---------------------" - docker network ls + docker network ls docker network rm "${networkName}" echo -e "${successLogger}----------------删除后---------------------" docker network ls diff --git a/scripts/page_deploy.sh b/scripts/page_deploy.sh index 5dd95b3..1af839c 100644 --- a/scripts/page_deploy.sh +++ b/scripts/page_deploy.sh @@ -31,7 +31,7 @@ git commit -m "refactor:${commitInfo}" ## 配置个人信息 -git config user.name "喜欢吃芝士葡萄的妹妹" +git config user.name "晚上吃芝士+葡萄的妹妹" git config user.email "fairy0115@2925.com" # if you are deploying to https://.github.io diff --git a/scripts/quick_deploy.bash b/scripts/quick_deploy.bash deleted file mode 100644 index 6e5bcd2..0000000 --- a/scripts/quick_deploy.bash +++ /dev/null @@ -1,125 +0,0 @@ -#!/bin/bash - -## 功能:清除容器,删除旧镜像,创建新的容器 -## 参考:https://blog.csdn.net/Dontla/article/details/125210694 -## 作者:Rong姐姐好可爱 -## 使用示例:bash xxx.sh 容器名称 镜像地址 -## - -## 日志颜色定义 -readonly successLogger="\033[36m" -readonly errorLogger="\033[1;31m" -readonly warnLogger="\033[1;33m" -## 定义时间 -readonly currentTime=$(date "+%Y-%m-%d %H:%M:%S") -## 定义参数 -containerName=${1} -imageName=${2} - - - - -## 参数检查 -prepare_check(){ - if test -z "${containerName}" - then - echo -e "${errorLogger}${currentTime}参数错误 容器名称不能为空。脚本执行eg: bash xxx.sh 容器名称 镜像地址" - exit 0 - fi - if test -z "${imageName}";then - echo -e "${errorLogger}${currentTime}参数错误 镜像地址不能为空。脚本执行eg: bash xxx.sh 容器名称 镜像地址" - exit 0 - fi -} - -## 判断容器存在即删除 -delete_container(){ - docker inspect "${containerName}" -f '{{.Name}}' > /dev/null - if [ $? -eq 0 ] ;then - echo -e "${warnLogger}${currentTime}容器:${containerName} 存在,现进行删除" - docker rm -f "${containerName}" - fi -} - -## 判断镜像存在,即删除 -delete_image(){ - if [[ "$(docker images -q "${imageName}" 2> /dev/null)" != "" ]]; - then - echo -e "${warnLogger}${currentTime}镜像:${imageName}存在,现进行删除" - docker rmi "${imageName}" - fi -} - - -## 环境初始成功 -run(){ - if [ "$operationName" == "client_web" ];then - ## 查看所有 - deploy_client_web - exit 0; - elif [ "$operationName" == "oauth_login" ]; then - deploy_oauth_login - exit 0; - elif [ "$operationName" == "server_api" ]; then - deploy_server_api - exit 0; - else - echo -e "${errorLogger}当前操作不支持,目前只支持:ls/init/rm" - exit 0 - fi -} - -## 创建容器,进行部署 -deploy(){ - ## 执行docker容器创建 - docker run -d --name="${containerName}" \ - -p 4000:4000 \ - --restart=always \ - "${imageName}" -} - -deploy_client_web(){ - echo -e "${successLogger}---------------- deploy client_web start ---------------- " - - docker run -d --name oauth2-client \ - -p 8080:80 --network=tencent-net \ - --ip=172.22.0.10 \ - --restart=unless-stopped - - echo -e "${successLogger}---------------- deploy client_web end ------------------ " -} - -deploy_oauth_login(){ - echo -e "${successLogger}---------------- deploy oauth_login start ---------------- " - - docker run -d --name="${containerName}" \ - -p 4000:4000 \ - --restart=always \ - "${imageName}" - - echo -e "${successLogger}---------------- deploy oauth_login end ------------------ " -} - - -deploy_server_api(){ - echo -e "${successLogger}---------------- deploy server_api start ---------------- " - - docker run -d --name="${containerName}" \ - -p 4000:4000 \ - --restart=always \ - "${imageName}" - - echo -e "${successLogger}---------------- deploy server_api end ------------------ " -} - - - - -prepare_check -### 处理容器和镜像,更新初始化 -delete_container -delete_image -### 运行,镜像更新 -run - -