Browse Source

add doc resource

Gogs 1 year ago
parent
commit
d246912cbb
77 changed files with 2435 additions and 2217 deletions
  1. 0 0
      .nojekyll
  2. 1 1
      404.md
  3. 24 24
      _coverpage.md
  4. 1 1
      _footer.md
  5. 8 8
      _navbar.md
  6. 21 21
      _sidebar.md
  7. 228 228
      assets/css/font.css
  8. 1041 1041
      assets/css/style@1.1.2.css
  9. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2
  10. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2
  11. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2
  12. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2
  13. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2
  14. BIN
      assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2
  15. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2
  16. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2
  17. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2
  18. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2
  19. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2
  20. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2
  21. BIN
      assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2
  22. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2
  23. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2
  24. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2
  25. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2
  26. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2
  27. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2
  28. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2
  29. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2
  30. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2
  31. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2
  32. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2
  33. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2
  34. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2
  35. BIN
      assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2
  36. BIN
      assets/imgs/1.png
  37. BIN
      assets/imgs/2.png
  38. BIN
      assets/imgs/WX20240102-170635.png
  39. BIN
      assets/imgs/contactqrcode.jpg
  40. BIN
      assets/imgs/createtop.png
  41. BIN
      assets/imgs/email.png
  42. BIN
      assets/imgs/export.png
  43. BIN
      assets/imgs/icon.png
  44. BIN
      assets/imgs/logo0.png
  45. BIN
      assets/imgs/logo1.png
  46. BIN
      assets/imgs/nginxinstallerror.png
  47. BIN
      assets/imgs/phone.png
  48. BIN
      assets/imgs/preview.png
  49. BIN
      assets/imgs/redisinstallerror.png
  50. BIN
      assets/imgs/scripttype.png
  51. BIN
      assets/imgs/wechat.png
  52. BIN
      assets/imgs/zookeepercheck.png
  53. 91 0
      assets/plugins/autotrack@2.2.js
  54. 60 0
      assets/plugins/countable.js
  55. 6 0
      assets/plugins/docsify-autoHeaders.min.js
  56. 7 0
      assets/plugins/docsify-copy-code.js
  57. 4 0
      assets/plugins/docsify-footer.min.js
  58. 0 0
      assets/plugins/docsify-pagination.min.js
  59. 0 0
      assets/plugins/docsify@4.js
  60. 0 0
      assets/plugins/exposure/index.closure.js
  61. 0 0
      assets/plugins/exposure/index.es6.js
  62. 0 0
      assets/plugins/exposure/index.js
  63. 13 0
      assets/plugins/exposure/readme.md
  64. 0 0
      assets/plugins/index.min.0.1.3.js
  65. 5 0
      assets/plugins/palettify.min.js
  66. 1 0
      assets/plugins/prismjs@1.22.0/components/prism-java.min.js
  67. 0 0
      assets/plugins/search.min.js
  68. 0 0
      assets/plugins/sensorsdata.js
  69. 0 0
      assets/plugins/session-event/index.closure.js
  70. 0 0
      assets/plugins/zoom-image.min.js
  71. 18 18
      changelog.md
  72. 31 0
      contributor/agreement.md
  73. 21 21
      introduce.md
  74. 17 17
      license.md
  75. 501 501
      quickstart/deployment.md
  76. 260 260
      quickstart/preparation.md
  77. 76 76
      quickstart/question.md

+ 0 - 0
.nojekyll


+ 1 - 1
404.md

@@ -1 +1 @@
-# 该页面不存在或已被删除
+# 该页面不存在或已被删除

+ 24 - 24
_coverpage.md

@@ -1,24 +1,24 @@
-<!-- _coverpage.md -->
-# <div class="logo"><img title="" src="assets/imgs/logo1.png" alt="" data-align="center" width="229"></div>
->
-> ### 记录点击,洞悉用户
->
-
->
->
->
-> ## **轻量级的用户访问分析系统**
-
-- [快速上手](/introduce.md)
-- [快速上手](/introduce.md)
-
-<div class="features"><div class="feature"><h2>面向二次开发</h2> <p>社区版代码开源,提供开放API、脚本、文档和示例、社区和技术支持、易于二次开发和业务系统集成。</p></div><div class="feature"><h2>业务功能完善</h2> <p>覆盖用户需求和常见功能、即开即用。 采用轻量级架构,提供SaaS服务和私有化部署,支持商业化合作。</p></div></div>
-
-<!-- background image -->
-
-<!-- ![](_media/bg.png) -->
-
-<!-- background color -->
-<div class="copyright"> Copyright © 景行数科 . 2023 All rights reserved.</div>
-
-![color](#fff)
+<!-- _coverpage.md -->
+# <div class="logo"><img title="" src="assets/imgs/logo1.png" alt="" data-align="center" width="229"></div>
+>
+> ### 记录点击,洞悉用户
+>
+
+>
+>
+>
+> ## **轻量级的用户访问分析系统**
+
+- [快速上手](/introduce.md)
+- [快速上手](/introduce.md)
+
+<div class="features"><div class="feature"><h2>面向二次开发</h2> <p>社区版代码开源,提供开放API、脚本、文档和示例、社区和技术支持、易于二次开发和业务系统集成。</p></div><div class="feature"><h2>业务功能完善</h2> <p>覆盖用户需求和常见功能、即开即用。 采用轻量级架构,提供SaaS服务和私有化部署,支持商业化合作。</p></div></div>
+
+<!-- background image -->
+
+<!-- ![](_media/bg.png) -->
+
+<!-- background color -->
+<div class="copyright"> Copyright © 景行数科 . 2023 All rights reserved.</div>
+
+![color](#fff)

+ 1 - 1
_footer.md

@@ -1 +1 @@
-<div class="copyright">Copyright © 景行数科 . 2023 All rights reserved.</div>
+<div class="copyright">Copyright © 景行数科 . 2023 All rights reserved.</div>

+ 8 - 8
_navbar.md

@@ -1,8 +1,8 @@
-<!-- _navbar.md -->
-
-* [主页](/#/)
-* [演示环境](https://demo.clklog.com)
-* [API文档](https://demo.clklog.com/api/doc.html#/home)
-* 源码下载
-  * [<img src="assets/imgs/export.png" height="10"/> GitHub](https://github.com/clklog)
-  * [<img src="assets/imgs/export.png" height="10"/> Gitee](https://gitee.com/clklog)
+<!-- _navbar.md -->
+
+* [主页](/#/)
+* [演示环境](https://demo.clklog.com)
+* [API文档](https://demo.clklog.com/api/doc.html#/home)
+* 源码下载
+  * [<img src="assets/imgs/export.png" height="10"/> GitHub](https://github.com/clklog)
+  * [<img src="assets/imgs/export.png" height="10"/> Gitee](https://gitee.com/clklog)

+ 21 - 21
_sidebar.md

@@ -1,21 +1,21 @@
-<!-- _sidebar.md -->
-
-- 项目架构
-  - [项目介绍](/introduce.md)
-  - [视频架构](/video_arch_notes.md)
-  - [前后端架构](/project_arch_notes.md)
-  
-- 视频监控
-  - [版本说明](/changelog.md)
-  - [演示环境](https://demo.clklog.com)
-
-- 告警规则
-  - [版本说明](/changelog.md)
-
-- 一张图
-  - [版本说明](/changelog.md)
-
-- 安装和部署
-  - [环境配置](/quickstart/preparation.md)
-  - [应用部署](/quickstart/deployment.md)
-  - [常见问题](/quickstart/question.md)
+<!-- _sidebar.md -->
+
+- 项目架构
+  - [项目介绍](/introduce.md)
+  - [视频架构](/video_arch_notes.md)
+  - [前后端架构](/project_arch_notes.md)
+  
+- 视频监控
+  - [版本说明](/changelog.md)
+  - [演示环境](https://demo.clklog.com)
+
+- 告警规则
+  - [版本说明](/changelog.md)
+
+- 一张图
+  - [版本说明](/changelog.md)
+
+- 安装和部署
+  - [环境配置](/quickstart/preparation.md)
+  - [应用部署](/quickstart/deployment.md)
+  - [常见问题](/quickstart/question.md)

+ 228 - 228
assets/css/font.css

@@ -1,228 +1,228 @@
-/* cyrillic-ext */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2) format('woff2');
-  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
-}
-/* cyrillic */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2) format('woff2');
-  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
-}
-/* greek */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2) format('woff2');
-  unicode-range: U+0370-03FF;
-}
-/* vietnamese */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2) format('woff2');
-  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
-    U+0329, U+1EA0-1EF9, U+20AB;
-}
-/* latin-ext */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2) format('woff2');
-  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
-    U+A720-A7FF;
-}
-/* latin */
-@font-face {
-  font-family: 'Roboto Mono';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2) format('woff2');
-  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
-    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
-}
-/* cyrillic-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2) format('woff2');
-  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
-}
-/* cyrillic */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2) format('woff2');
-  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
-}
-/* greek-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2) format('woff2');
-  unicode-range: U+1F00-1FFF;
-}
-/* greek */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2) format('woff2');
-  unicode-range: U+0370-03FF;
-}
-/* vietnamese */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2) format('woff2');
-  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
-    U+0329, U+1EA0-1EF9, U+20AB;
-}
-/* latin-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2) format('woff2');
-  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
-    U+A720-A7FF;
-}
-/* latin */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 300;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2) format('woff2');
-  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
-    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
-}
-/* cyrillic-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2');
-  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
-}
-/* cyrillic */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2');
-  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
-}
-/* greek-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2');
-  unicode-range: U+1F00-1FFF;
-}
-/* greek */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2');
-  unicode-range: U+0370-03FF;
-}
-/* vietnamese */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2');
-  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
-    U+0329, U+1EA0-1EF9, U+20AB;
-}
-/* latin-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2');
-  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
-    U+A720-A7FF;
-}
-/* latin */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 400;
-  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2');
-  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
-    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
-}
-/* cyrillic-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2) format('woff2');
-  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
-}
-/* cyrillic */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2) format('woff2');
-  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
-}
-/* greek-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2) format('woff2');
-  unicode-range: U+1F00-1FFF;
-}
-/* greek */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2) format('woff2');
-  unicode-range: U+0370-03FF;
-}
-/* vietnamese */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2) format('woff2');
-  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
-    U+0329, U+1EA0-1EF9, U+20AB;
-}
-/* latin-ext */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2) format('woff2');
-  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
-    U+A720-A7FF;
-}
-/* latin */
-@font-face {
-  font-family: 'Source Sans Pro';
-  font-style: normal;
-  font-weight: 600;
-  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2) format('woff2');
-  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
-    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
-}
+/* cyrillic-ext */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2) format('woff2');
+  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2) format('woff2');
+  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2) format('woff2');
+  unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2) format('woff2');
+  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
+    U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2) format('woff2');
+  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
+    U+A720-A7FF;
+}
+/* latin */
+@font-face {
+  font-family: 'Roboto Mono';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
+    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2) format('woff2');
+  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2) format('woff2');
+  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2) format('woff2');
+  unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2) format('woff2');
+  unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2) format('woff2');
+  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
+    U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2) format('woff2');
+  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
+    U+A720-A7FF;
+}
+/* latin */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 300;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
+    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2');
+  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2');
+  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2');
+  unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2');
+  unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2');
+  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
+    U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2');
+  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
+    U+A720-A7FF;
+}
+/* latin */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 400;
+  src: url(../fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
+    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+/* cyrillic-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2) format('woff2');
+  unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
+}
+/* cyrillic */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2) format('woff2');
+  unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+/* greek-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2) format('woff2');
+  unicode-range: U+1F00-1FFF;
+}
+/* greek */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2) format('woff2');
+  unicode-range: U+0370-03FF;
+}
+/* vietnamese */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2) format('woff2');
+  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
+    U+0329, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2) format('woff2');
+  unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F,
+    U+A720-A7FF;
+}
+/* latin */
+@font-face {
+  font-family: 'Source Sans Pro';
+  font-style: normal;
+  font-weight: 600;
+  src: url(../fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC,
+    U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}

+ 1041 - 1041
assets/css/style@1.1.2.css

@@ -1,1041 +1,1041 @@
-@import url('font.css');
-* {
-  -webkit-font-smoothing: antialiased;
-  -webkit-overflow-scrolling: touch;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-  -webkit-text-size-adjust: none;
-  -webkit-touch-callout: none;
-  box-sizing: border-box;
-}
-body:not(.ready) {
-  overflow: hidden;
-}
-body:not(.ready) [data-cloak],
-body:not(.ready) .app-nav,
-body:not(.ready) > nav {
-  display: none;
-}
-div#app {
-  font-size: 30px;
-  font-weight: lighter;
-  margin: 40vh auto;
-  text-align: center;
-}
-div#app:empty::before {
-  content: 'Loading...';
-}
-img.emoji {
-  height: 1.2em;
-  vertical-align: middle;
-}
-span.emoji {
-  font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
-  font-size: 1.2em;
-  vertical-align: middle;
-}
-.progress {
-  background-color: #0074d9;
-  background-color: var(--theme-color, #0074d9);
-  height: 2px;
-  left: 0px;
-  position: fixed;
-  right: 0px;
-  top: 0px;
-  transition: width 0.2s, opacity 0.4s;
-  width: 0%;
-  z-index: 999999;
-}
-.search a:hover {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-}
-.search .search-keyword {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-  font-style: normal;
-  font-weight: bold;
-}
-html,
-body {
-  height: 100%;
-}
-body {
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-font-smoothing: antialiased;
-  color: #34495e;
-  font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
-  font-size: 15px;
-  letter-spacing: 0;
-  margin: 0;
-  overflow-x: hidden;
-}
-img {
-  max-width: 100%;
-}
-a[disabled] {
-  cursor: not-allowed;
-  opacity: 0.6;
-}
-kbd {
-  border: solid 1px #ccc;
-  border-radius: 3px;
-  display: inline-block;
-  font-size: 12px !important;
-  line-height: 12px;
-  margin-bottom: 3px;
-  padding: 3px 5px;
-  vertical-align: middle;
-}
-li input[type='checkbox'] {
-  margin: 0 0.2em 0.25em 0;
-  vertical-align: middle;
-}
-.app-nav {
-  padding: 10px 0px;
-  position: fixed;
-  right: 0;
-  text-align: right;
-  z-index: 10;
-  background: transparent;
-  height: 50px;
-  left: 284px;
-  top: 0;
-  right: 0;
-}
-.app-nav.no-badge {
-  margin: 0px 0px;
-}
-.app-nav p {
-  margin: 0;
-}
-.app-nav > a {
-  margin: 0 1rem;
-  padding: 5px 0;
-}
-.app-nav ul,
-.app-nav li {
-  display: inline-block;
-  list-style: none;
-  margin: 0;
-}
-.app-nav a {
-  color: inherit;
-  font-size: 16px;
-  text-decoration: none;
-  transition: color 0.3s;
-}
-.app-nav a:hover {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-}
-.app-nav a.active {
-  border-bottom: 2px solid #0074d9;
-  border-bottom: 2px solid var(--theme-color, #0074d9);
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-}
-.app-nav li {
-  display: inline-block;
-  margin: 0 1rem;
-  padding: 5px 0;
-  position: relative;
-  cursor: pointer;
-}
-.app-nav li ul {
-  background-color: #fff;
-  border: 1px solid #ddd;
-  border-bottom-color: #ccc;
-  border-radius: 4px;
-  box-sizing: border-box;
-  display: none;
-  max-height: calc(100vh - 61px);
-  overflow-y: auto;
-  padding: 10px 0;
-  position: absolute;
-  right: -15px;
-  text-align: left;
-  top: 100%;
-  white-space: nowrap;
-}
-.app-nav li ul li {
-  display: block;
-  font-size: 14px;
-  line-height: 1rem;
-  margin: 0;
-  margin: 8px 14px;
-  white-space: nowrap;
-}
-.app-nav li ul a {
-  display: block;
-  font-size: inherit;
-  margin: 0;
-  padding: 0;
-}
-.app-nav li ul a.active {
-  border-bottom: 0;
-}
-.app-nav li:hover ul {
-  display: block;
-}
-.github-corner {
-  border-bottom: 0;
-  position: fixed;
-  right: 0;
-  text-decoration: none;
-  top: 0;
-  z-index: 100;
-}
-.github-corner:hover .octo-arm {
-  animation: octocat-wave 560ms ease-in-out;
-}
-.github-corner svg {
-  color: #fff;
-  fill: #0074d9;
-  fill: var(--theme-color, #0074d9);
-  height: 80px;
-  width: 80px;
-}
-main {
-  display: block;
-  position: relative;
-  width: 100vw;
-  height: 100%;
-  z-index: 0;
-}
-main.hidden {
-  display: none;
-}
-.anchor {
-  display: inline-block;
-  text-decoration: none;
-  transition: all 0.3s;
-}
-.anchor span {
-  color: #34495e;
-}
-.anchor:hover {
-  text-decoration: underline;
-}
-.sidebar {
-  border-right: 1px solid rgba(0, 0, 0, 0.07);
-  overflow-y: auto;
-  padding: 40px 0 0;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  transition: transform 250ms ease-out;
-  width: 300px;
-  z-index: 20;
-}
-.sidebar > h1 {
-  margin: 0 auto 1rem 15px;
-  font-size: 1.5rem;
-  font-weight: 300;
-  text-align: left;
-}
-.sidebar > h1 a {
-  color: inherit;
-  text-decoration: none;
-}
-.sidebar > h1 .app-nav {
-  display: block;
-  position: static;
-}
-.sidebar > h1 img {
-  width: 150px;
-}
-.sidebar .sidebar-nav {
-  line-height: 2em;
-  padding-bottom: 40px;
-}
-.sidebar li.collapse .app-sub-sidebar {
-  display: none;
-}
-.sidebar ul {
-  margin: 0 0 0 15px;
-  padding: 0;
-}
-.sidebar li > p {
-  font-weight: 600;
-  margin: 0;
-}
-.sidebar ul,
-.sidebar ul li {
-  list-style: none;
-}
-.sidebar ul li a {
-  border-bottom: none;
-  display: block;
-}
-.sidebar ul li ul {
-  padding-left: 20px;
-}
-.sidebar::-webkit-scrollbar {
-  width: 4px;
-}
-.sidebar::-webkit-scrollbar-thumb {
-  background: transparent;
-  border-radius: 4px;
-}
-.sidebar:hover::-webkit-scrollbar-thumb {
-  background: rgba(136, 136, 136, 0.4);
-}
-.sidebar:hover::-webkit-scrollbar-track {
-  background: rgba(136, 136, 136, 0.1);
-}
-.sidebar-toggle {
-  background-color: transparent;
-  background-color: rgba(255, 255, 255, 0.8);
-  border: 0;
-  outline: none;
-  padding: 10px;
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  text-align: center;
-  transition: opacity 0.3s;
-  width: 284px;
-  z-index: 30;
-  cursor: pointer;
-}
-.sidebar-toggle:hover .sidebar-toggle-button {
-  opacity: 0.4;
-}
-.sidebar-toggle span {
-  background-color: #0074d9;
-  background-color: var(--theme-color, #0074d9);
-  display: block;
-  margin-bottom: 4px;
-  width: 16px;
-  height: 2px;
-}
-body.sticky .sidebar,
-body.sticky .sidebar-toggle {
-  position: fixed;
-}
-.content {
-  padding-top: 60px;
-  position: absolute;
-  top: 0;
-  right: 0;
-  bottom: 0;
-  left: 300px;
-  transition: left 250ms ease;
-}
-.markdown-section {
-  margin: 0 auto;
-  max-width: 80%;
-  padding: 30px 15px 40px 15px;
-  position: relative;
-}
-.markdown-section > * {
-  box-sizing: border-box;
-  font-size: inherit;
-}
-.markdown-section > :first-child {
-  margin-top: 0 !important;
-}
-.markdown-section hr {
-  border: none;
-  border-bottom: 1px solid #eee;
-  margin: 2em 0;
-}
-.markdown-section iframe {
-  border: 1px solid #eee;
-  /* fix horizontal overflow on iOS Safari */
-  width: 1px;
-  min-width: 100%;
-}
-.markdown-section table {
-  border-collapse: collapse;
-  border-spacing: 0;
-  display: block;
-  margin-bottom: 1rem;
-  overflow: auto;
-  width: 100%;
-}
-.markdown-section th {
-  border: 1px solid #ddd;
-  font-weight: bold;
-  padding: 6px 13px;
-}
-.markdown-section td {
-  border: 1px solid #ddd;
-  padding: 6px 13px;
-}
-.markdown-section tr {
-  border-top: 1px solid #ccc;
-}
-.markdown-section tr:nth-child(2n) {
-  background-color: #f8f8f8;
-}
-.markdown-section p.tip {
-  background-color: #f8f8f8;
-  border-bottom-right-radius: 2px;
-  border-left: 4px solid #f66;
-  border-top-right-radius: 2px;
-  margin: 2em 0;
-  padding: 12px 24px 12px 30px;
-  position: relative;
-}
-.markdown-section p.tip:before {
-  background-color: #f66;
-  border-radius: 100%;
-  color: #fff;
-  content: '!';
-  font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
-  font-size: 14px;
-  font-weight: bold;
-  left: -12px;
-  line-height: 20px;
-  position: absolute;
-  height: 20px;
-  width: 20px;
-  text-align: center;
-  top: 14px;
-}
-.markdown-section p.tip code {
-  background-color: #efefef;
-}
-.markdown-section p.tip em {
-  color: #34495e;
-}
-.markdown-section p.warn {
-  background: rgba(66, 185, 131, 0.1);
-  border-radius: 2px;
-  padding: 1rem;
-}
-.markdown-section ul.task-list > li {
-  list-style-type: none;
-}
-body.close .sidebar {
-  transform: translateX(-300px);
-}
-body.close .sidebar-toggle {
-  width: auto;
-}
-body.close .content {
-  left: 0;
-}
-@media print {
-  .github-corner,
-  .sidebar-toggle,
-  .sidebar,
-  .app-nav {
-    display: none;
-  }
-}
-@media screen and (max-width: 768px) {
-  .cover-main .features {
-    flex-direction: column;
-  }
-
-  .cover-main .feature {
-    max-width: 100% !important;
-    padding: 0 2.5rem;
-  }
-  .github-corner,
-  .sidebar-toggle,
-  .sidebar {
-    position: fixed;
-  }
-  .app-nav {
-    margin-top: 16px;
-  }
-  .app-nav li ul {
-    top: 30px;
-  }
-  main {
-    height: auto;
-    min-height: 100vh;
-    overflow-x: hidden;
-  }
-  .sidebar {
-    left: -300px;
-    transition: transform 250ms ease-out;
-  }
-  .content {
-    left: 0;
-    max-width: 100vw;
-    position: static;
-    padding-top: 20px;
-    transition: transform 250ms ease;
-  }
-  .app-nav,
-  .github-corner {
-    transition: transform 250ms ease-out;
-  }
-  .sidebar-toggle {
-    background-color: transparent;
-    width: auto;
-    padding: 30px 30px 10px 10px;
-  }
-  body.close .sidebar {
-    transform: translateX(300px);
-  }
-  body.close .sidebar-toggle {
-    background-color: rgba(255, 255, 255, 0.8);
-    transition: 1s background-color;
-    width: 284px;
-    padding: 10px;
-  }
-  body.close .content {
-    transform: translateX(300px);
-  }
-  body.close .app-nav,
-  body.close .github-corner {
-    display: none;
-  }
-  .github-corner:hover .octo-arm {
-    animation: none;
-  }
-  .github-corner .octo-arm {
-    animation: octocat-wave 560ms ease-in-out;
-  }
-}
-@keyframes octocat-wave {
-  0%,
-  100% {
-    transform: rotate(0);
-  }
-  20%,
-  60% {
-    transform: rotate(-25deg);
-  }
-  40%,
-  80% {
-    transform: rotate(10deg);
-  }
-}
-section.cover {
-  position: relative;
-  align-items: center;
-  background-position: center center;
-  background-repeat: no-repeat;
-  background-size: cover;
-  min-height: 100vh;
-  width: 100%;
-  display: none;
-}
-section.cover.show {
-  display: flex;
-}
-section.cover.has-mask .mask {
-  background-color: #fff;
-  opacity: 0.8;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  width: 100%;
-}
-section.cover .cover-main {
-  flex: 1;
-  margin: 100px auto 0px;
-  text-align: center;
-  position: relative;
-  max-width: 960px;
-}
-section.cover a {
-  color: inherit;
-  text-decoration: none;
-}
-section.cover a:hover {
-  text-decoration: none;
-}
-section.cover p {
-  line-height: 1.5rem;
-  margin: 1em 0;
-}
-section.cover h1 {
-  color: inherit;
-  font-size: 2.5rem;
-  font-weight: 300;
-  margin: 0.625rem 0 2.5rem;
-  position: relative;
-  text-align: center;
-}
-section.cover h1 a {
-  display: block;
-}
-section.cover h1 small {
-  bottom: -0.4375rem;
-  font-size: 1rem;
-  position: absolute;
-}
-section.cover blockquote {
-  font-size: 1.5rem;
-  text-align: center;
-}
-section.cover ul {
-  line-height: 1.8;
-  list-style-type: none;
-  margin: 1em auto;
-  max-width: 500px;
-  padding: 0;
-}
-section.cover .cover-main > p:last-child a {
-  border-color: #0074d9;
-  border-color: var(--theme-color, #0074d9);
-  border-radius: 2rem;
-  border-style: solid;
-  border-width: 1px;
-  box-sizing: border-box;
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-  display: inline-block;
-  font-size: 1.05rem;
-  letter-spacing: 0.1rem;
-  margin: 0.5rem 1rem;
-  padding: 0.75em 2rem;
-  text-decoration: none;
-  transition: all 0.15s ease;
-}
-section.cover .cover-main > p:last-child a:last-child {
-  background-color: #0074d9;
-  background-color: var(--theme-color, #0074d9);
-  color: #fff;
-}
-section.cover .cover-main > p:last-child a:last-child:hover {
-  color: inherit;
-  opacity: 0.8;
-}
-
-section.cover .cover-main a[href='#/introduce']:last-child {
-  border-color: #0074d9;
-  border-radius: 2rem;
-  border-style: solid;
-  border-width: 1px;
-  box-sizing: border-box;
-  color: #fff;
-  background: #0074d9;
-  display: inline-block;
-  font-size: 1.05rem;
-  letter-spacing: 0.1rem;
-  margin: 0.5rem 1rem;
-  padding: 0.75em 2rem;
-  text-decoration: none;
-  transition: all 0.15s ease;
-}
-section.cover .cover-main a[href='#/introduce']:hover {
-  color: inherit;
-  opacity: 0.8;
-  color: #fff;
-}
-section.cover .cover-main > p:last-child a:hover {
-  color: inherit;
-}
-section.cover .cover-main .features {
-  border-top: 1px solid #eaecef;
-  padding: 1.2rem 0;
-  margin-top: 2.5rem;
-  display: flex;
-  flex-wrap: wrap;
-  align-items: flex-start;
-  align-content: stretch;
-  justify-content: space-between;
-}
-section.cover .cover-main .feature {
-  flex-grow: 1;
-  flex-basis: 30%;
-  max-width: 30%;
-  text-align: left;
-}
-
-section.cover blockquote > p > a {
-  border-bottom: 2px solid #0074d9;
-  border-bottom: 2px solid #0074d9;
-  transition: color 0.3s;
-  background: #0074d9;
-}
-section.cover blockquote > p > a:hover {
-  color: #fff;
-}
-body {
-  background-color: #fff;
-}
-/* sidebar */
-.sidebar {
-  background-color: #fff;
-  color: #364149;
-}
-.sidebar li {
-  margin: 6px 0 6px 0;
-}
-.sidebar ul li a {
-  color: #364149;
-  font-size: 14px;
-  font-weight: normal;
-  overflow: hidden;
-  text-decoration: none;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.sidebar ul li a:hover {
-  text-decoration: underline;
-}
-.sidebar ul li ul {
-  padding: 0;
-}
-.sidebar ul li.active > a {
-  border-right: 2px solid;
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-  font-weight: 600;
-}
-.app-sub-sidebar li::before {
-  content: '-';
-  padding-right: 4px;
-  float: left;
-}
-/* markdown content found on pages */
-.markdown-section h1,
-.markdown-section h2,
-.markdown-section h3,
-.markdown-section h4,
-.markdown-section strong {
-  color: #2c3e50;
-  font-weight: 600;
-}
-.markdown-section a {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-  font-weight: 600;
-}
-.markdown-section h1 {
-  font-size: 2rem;
-  margin: 0 0 1rem;
-}
-.markdown-section h2 {
-  font-size: 1.75rem;
-  margin: 45px 0 0.8rem;
-}
-.markdown-section h3 {
-  font-size: 1.5rem;
-  margin: 40px 0 0.6rem;
-}
-.markdown-section h4 {
-  font-size: 1.25rem;
-}
-.markdown-section h5 {
-  font-size: 1rem;
-}
-.markdown-section h6 {
-  color: #777;
-  font-size: 1rem;
-}
-.markdown-section figure,
-.markdown-section p {
-  margin: 1.2em 0;
-}
-.markdown-section p,
-.markdown-section ul,
-.markdown-section ol {
-  line-height: 1.6rem;
-  word-spacing: 0.05rem;
-}
-.markdown-section ul,
-.markdown-section ol {
-  padding-left: 1.5rem;
-}
-.markdown-section blockquote {
-  border-left: 4px solid #0074d9;
-  border-left: 4px solid var(--theme-color, #0074d9);
-  color: #858585;
-  margin: 2em 0;
-  padding-left: 20px;
-}
-.markdown-section blockquote p {
-  font-weight: 600;
-  margin-left: 0;
-}
-.markdown-section iframe {
-  margin: 1em 0;
-}
-.markdown-section em {
-  color: #7f8c8d;
-}
-.markdown-section code,
-.markdown-section pre,
-.markdown-section output::after {
-  font-family: 'Roboto Mono', Monaco, courier, monospace;
-}
-.markdown-section code,
-.markdown-section pre {
-  background-color: #f8f8f8;
-}
-.markdown-section pre,
-.markdown-section output {
-  margin: 1.2em 0;
-  position: relative;
-}
-.markdown-section pre > code,
-.markdown-section output {
-  border-radius: 2px;
-  display: block;
-}
-.markdown-section pre > code,
-.markdown-section output::after {
-  -moz-osx-font-smoothing: initial;
-  -webkit-font-smoothing: initial;
-}
-.markdown-section code {
-  border-radius: 2px;
-  color: #e96900;
-  margin: 0 2px;
-  padding: 3px 5px;
-  white-space: pre-wrap;
-}
-.markdown-section > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code {
-  font-size: 0.8rem;
-}
-.markdown-section pre {
-  padding: 0 1.4rem;
-  line-height: 1.5rem;
-  overflow: auto;
-  word-wrap: normal;
-}
-.markdown-section pre > code {
-  color: #525252;
-  font-size: 0.8rem;
-  padding: 2.2em 5px;
-  line-height: inherit;
-  margin: 0 2px;
-  max-width: inherit;
-  overflow: inherit;
-  white-space: inherit;
-}
-.markdown-section output {
-  padding: 1.7rem 1.4rem;
-  border: 1px dotted #ccc;
-}
-.markdown-section output > :first-child {
-  margin-top: 0;
-}
-.markdown-section output > :last-child {
-  margin-bottom: 0;
-}
-.markdown-section code::after,
-.markdown-section code::before,
-.markdown-section output::after,
-.markdown-section output::before {
-  letter-spacing: 0.05rem;
-}
-.markdown-section pre::after,
-.markdown-section output::after {
-  color: #ccc;
-  font-size: 0.6rem;
-  font-weight: 600;
-  height: 15px;
-  line-height: 15px;
-  padding: 5px 10px 0;
-  position: absolute;
-  right: 0;
-  text-align: right;
-  top: 0;
-}
-.markdown-section pre::after,
-.markdown-section output::after {
-  content: attr(data-lang);
-}
-/* code highlight */
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
-  color: #8e908c;
-}
-.token.namespace {
-  opacity: 0.7;
-}
-.token.boolean,
-.token.number {
-  color: #c76b29;
-}
-.token.punctuation {
-  color: #525252;
-}
-.token.property {
-  color: #c08b30;
-}
-.token.tag {
-  color: #2973b7;
-}
-.token.string {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-}
-.token.selector {
-  color: #6679cc;
-}
-.token.attr-name {
-  color: #2973b7;
-}
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
-  color: #22a2c9;
-}
-.token.attr-value,
-.token.control,
-.token.directive,
-.token.unit {
-  color: #0074d9;
-  color: var(--theme-color, #0074d9);
-}
-.token.keyword,
-.token.function {
-  color: #e96900;
-}
-.token.statement,
-.token.regex,
-.token.atrule {
-  color: #22a2c9;
-}
-.token.placeholder,
-.token.variable {
-  color: #3d8fd1;
-}
-.token.deleted {
-  text-decoration: line-through;
-}
-.token.inserted {
-  border-bottom: 1px dotted #202746;
-  text-decoration: none;
-}
-.token.italic {
-  font-style: italic;
-}
-.token.important,
-.token.bold {
-  font-weight: bold;
-}
-.token.important {
-  color: #c94922;
-}
-.token.entity {
-  cursor: help;
-}
-code .token {
-  -moz-osx-font-smoothing: initial;
-  -webkit-font-smoothing: initial;
-  min-height: 1.5rem;
-  position: relative;
-  left: auto;
-}
-section.cover .copyright {
-  bottom: 5px;
-  position: fixed;
-  left: 0;
-  right: 0;
-  text-align: center;
-}
-
-main .content .copyright {
-  bottom: 5px;
-  position: absolute;
-  left: 10px;
-  right: 0;
-  text-align: left;
-}
-
-.markdown-section .clklog-contact-items {
-  position: fixed;
-  right: 5px;
-  top: calc((100vh - 168px) / 2);
-  z-index: 9999;
-  /* background-color: #eaf2fc; */
-  /* border-radius: 56px; */
-  width: 55px;
-  padding-left: 0px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item {
-  width: 55px;
-  height: 55px;
-  position: relative;
-  margin: 5px 0;
-  list-style: none;
-  background-color: #eaf2fc;
-  border-radius: 36px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content {
-  display: block;
-  position: absolute;
-  left: -150px;
-  top: 5px;
-  z-index: 9999;
-  background-color: #eaf2fc;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.phone:hover .clklog-contact-item-content {
-  left: -138px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.wechat:hover .clklog-contact-item-content {
-  left: -150px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.email:hover .clklog-contact-item-content {
-  left: -140px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item .clklog-contact-item-content .triangle {
-  display: inline-block;
-  width: 0;
-  height: 0;
-  border-top: 8px solid transparent;
-  border-bottom: 8px solid transparent;
-  border-left: 8px solid #eaf2fc;
-  position: absolute;
-  right: -8px;
-  top: 15px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item {
-  background-position: center;
-  background-repeat: no-repeat;
-  cursor: pointer;
-}
-
-.markdown-section .clklog-contact-items .clklog-contact-item.phone .info {
-  font-size: 20px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.email .info {
-  font-size: 16px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.wechat .info {
-  text-align: center;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.phone {
-  background-image: url(../imgs/phone.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.phone:hover {
-  background-image: url(../imgs/phone.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.wechat {
-  background-image: url(../imgs/wechat.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.wechat:hover {
-  background-image: url(../imgs/wechat.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.email {
-  background-image: url(../imgs/email.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item.email:hover {
-  background-image: url(../imgs/email.png);
-}
-.markdown-section .clklog-contact-items .clklog-contact-item .clklog-contact-item-content {
-  display: none;
-}
-
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content {
-  border-radius: 5px;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content.wechat p {
-  text-align: center;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content p {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content.wechat p {
-}
-.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content .contentwrap {
-  padding: 10px;
-}
+@import url('font.css');
+* {
+  -webkit-font-smoothing: antialiased;
+  -webkit-overflow-scrolling: touch;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  -webkit-text-size-adjust: none;
+  -webkit-touch-callout: none;
+  box-sizing: border-box;
+}
+body:not(.ready) {
+  overflow: hidden;
+}
+body:not(.ready) [data-cloak],
+body:not(.ready) .app-nav,
+body:not(.ready) > nav {
+  display: none;
+}
+div#app {
+  font-size: 30px;
+  font-weight: lighter;
+  margin: 40vh auto;
+  text-align: center;
+}
+div#app:empty::before {
+  content: 'Loading...';
+}
+img.emoji {
+  height: 1.2em;
+  vertical-align: middle;
+}
+span.emoji {
+  font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+  font-size: 1.2em;
+  vertical-align: middle;
+}
+.progress {
+  background-color: #0074d9;
+  background-color: var(--theme-color, #0074d9);
+  height: 2px;
+  left: 0px;
+  position: fixed;
+  right: 0px;
+  top: 0px;
+  transition: width 0.2s, opacity 0.4s;
+  width: 0%;
+  z-index: 999999;
+}
+.search a:hover {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+}
+.search .search-keyword {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+  font-style: normal;
+  font-weight: bold;
+}
+html,
+body {
+  height: 100%;
+}
+body {
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  color: #34495e;
+  font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
+  font-size: 15px;
+  letter-spacing: 0;
+  margin: 0;
+  overflow-x: hidden;
+}
+img {
+  max-width: 100%;
+}
+a[disabled] {
+  cursor: not-allowed;
+  opacity: 0.6;
+}
+kbd {
+  border: solid 1px #ccc;
+  border-radius: 3px;
+  display: inline-block;
+  font-size: 12px !important;
+  line-height: 12px;
+  margin-bottom: 3px;
+  padding: 3px 5px;
+  vertical-align: middle;
+}
+li input[type='checkbox'] {
+  margin: 0 0.2em 0.25em 0;
+  vertical-align: middle;
+}
+.app-nav {
+  padding: 10px 0px;
+  position: fixed;
+  right: 0;
+  text-align: right;
+  z-index: 10;
+  background: transparent;
+  height: 50px;
+  left: 284px;
+  top: 0;
+  right: 0;
+}
+.app-nav.no-badge {
+  margin: 0px 0px;
+}
+.app-nav p {
+  margin: 0;
+}
+.app-nav > a {
+  margin: 0 1rem;
+  padding: 5px 0;
+}
+.app-nav ul,
+.app-nav li {
+  display: inline-block;
+  list-style: none;
+  margin: 0;
+}
+.app-nav a {
+  color: inherit;
+  font-size: 16px;
+  text-decoration: none;
+  transition: color 0.3s;
+}
+.app-nav a:hover {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+}
+.app-nav a.active {
+  border-bottom: 2px solid #0074d9;
+  border-bottom: 2px solid var(--theme-color, #0074d9);
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+}
+.app-nav li {
+  display: inline-block;
+  margin: 0 1rem;
+  padding: 5px 0;
+  position: relative;
+  cursor: pointer;
+}
+.app-nav li ul {
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: #ccc;
+  border-radius: 4px;
+  box-sizing: border-box;
+  display: none;
+  max-height: calc(100vh - 61px);
+  overflow-y: auto;
+  padding: 10px 0;
+  position: absolute;
+  right: -15px;
+  text-align: left;
+  top: 100%;
+  white-space: nowrap;
+}
+.app-nav li ul li {
+  display: block;
+  font-size: 14px;
+  line-height: 1rem;
+  margin: 0;
+  margin: 8px 14px;
+  white-space: nowrap;
+}
+.app-nav li ul a {
+  display: block;
+  font-size: inherit;
+  margin: 0;
+  padding: 0;
+}
+.app-nav li ul a.active {
+  border-bottom: 0;
+}
+.app-nav li:hover ul {
+  display: block;
+}
+.github-corner {
+  border-bottom: 0;
+  position: fixed;
+  right: 0;
+  text-decoration: none;
+  top: 0;
+  z-index: 100;
+}
+.github-corner:hover .octo-arm {
+  animation: octocat-wave 560ms ease-in-out;
+}
+.github-corner svg {
+  color: #fff;
+  fill: #0074d9;
+  fill: var(--theme-color, #0074d9);
+  height: 80px;
+  width: 80px;
+}
+main {
+  display: block;
+  position: relative;
+  width: 100vw;
+  height: 100%;
+  z-index: 0;
+}
+main.hidden {
+  display: none;
+}
+.anchor {
+  display: inline-block;
+  text-decoration: none;
+  transition: all 0.3s;
+}
+.anchor span {
+  color: #34495e;
+}
+.anchor:hover {
+  text-decoration: underline;
+}
+.sidebar {
+  border-right: 1px solid rgba(0, 0, 0, 0.07);
+  overflow-y: auto;
+  padding: 40px 0 0;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  transition: transform 250ms ease-out;
+  width: 300px;
+  z-index: 20;
+}
+.sidebar > h1 {
+  margin: 0 auto 1rem 15px;
+  font-size: 1.5rem;
+  font-weight: 300;
+  text-align: left;
+}
+.sidebar > h1 a {
+  color: inherit;
+  text-decoration: none;
+}
+.sidebar > h1 .app-nav {
+  display: block;
+  position: static;
+}
+.sidebar > h1 img {
+  width: 150px;
+}
+.sidebar .sidebar-nav {
+  line-height: 2em;
+  padding-bottom: 40px;
+}
+.sidebar li.collapse .app-sub-sidebar {
+  display: none;
+}
+.sidebar ul {
+  margin: 0 0 0 15px;
+  padding: 0;
+}
+.sidebar li > p {
+  font-weight: 600;
+  margin: 0;
+}
+.sidebar ul,
+.sidebar ul li {
+  list-style: none;
+}
+.sidebar ul li a {
+  border-bottom: none;
+  display: block;
+}
+.sidebar ul li ul {
+  padding-left: 20px;
+}
+.sidebar::-webkit-scrollbar {
+  width: 4px;
+}
+.sidebar::-webkit-scrollbar-thumb {
+  background: transparent;
+  border-radius: 4px;
+}
+.sidebar:hover::-webkit-scrollbar-thumb {
+  background: rgba(136, 136, 136, 0.4);
+}
+.sidebar:hover::-webkit-scrollbar-track {
+  background: rgba(136, 136, 136, 0.1);
+}
+.sidebar-toggle {
+  background-color: transparent;
+  background-color: rgba(255, 255, 255, 0.8);
+  border: 0;
+  outline: none;
+  padding: 10px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  text-align: center;
+  transition: opacity 0.3s;
+  width: 284px;
+  z-index: 30;
+  cursor: pointer;
+}
+.sidebar-toggle:hover .sidebar-toggle-button {
+  opacity: 0.4;
+}
+.sidebar-toggle span {
+  background-color: #0074d9;
+  background-color: var(--theme-color, #0074d9);
+  display: block;
+  margin-bottom: 4px;
+  width: 16px;
+  height: 2px;
+}
+body.sticky .sidebar,
+body.sticky .sidebar-toggle {
+  position: fixed;
+}
+.content {
+  padding-top: 60px;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 300px;
+  transition: left 250ms ease;
+}
+.markdown-section {
+  margin: 0 auto;
+  max-width: 80%;
+  padding: 30px 15px 40px 15px;
+  position: relative;
+}
+.markdown-section > * {
+  box-sizing: border-box;
+  font-size: inherit;
+}
+.markdown-section > :first-child {
+  margin-top: 0 !important;
+}
+.markdown-section hr {
+  border: none;
+  border-bottom: 1px solid #eee;
+  margin: 2em 0;
+}
+.markdown-section iframe {
+  border: 1px solid #eee;
+  /* fix horizontal overflow on iOS Safari */
+  width: 1px;
+  min-width: 100%;
+}
+.markdown-section table {
+  border-collapse: collapse;
+  border-spacing: 0;
+  display: block;
+  margin-bottom: 1rem;
+  overflow: auto;
+  width: 100%;
+}
+.markdown-section th {
+  border: 1px solid #ddd;
+  font-weight: bold;
+  padding: 6px 13px;
+}
+.markdown-section td {
+  border: 1px solid #ddd;
+  padding: 6px 13px;
+}
+.markdown-section tr {
+  border-top: 1px solid #ccc;
+}
+.markdown-section tr:nth-child(2n) {
+  background-color: #f8f8f8;
+}
+.markdown-section p.tip {
+  background-color: #f8f8f8;
+  border-bottom-right-radius: 2px;
+  border-left: 4px solid #f66;
+  border-top-right-radius: 2px;
+  margin: 2em 0;
+  padding: 12px 24px 12px 30px;
+  position: relative;
+}
+.markdown-section p.tip:before {
+  background-color: #f66;
+  border-radius: 100%;
+  color: #fff;
+  content: '!';
+  font-family: 'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
+  font-size: 14px;
+  font-weight: bold;
+  left: -12px;
+  line-height: 20px;
+  position: absolute;
+  height: 20px;
+  width: 20px;
+  text-align: center;
+  top: 14px;
+}
+.markdown-section p.tip code {
+  background-color: #efefef;
+}
+.markdown-section p.tip em {
+  color: #34495e;
+}
+.markdown-section p.warn {
+  background: rgba(66, 185, 131, 0.1);
+  border-radius: 2px;
+  padding: 1rem;
+}
+.markdown-section ul.task-list > li {
+  list-style-type: none;
+}
+body.close .sidebar {
+  transform: translateX(-300px);
+}
+body.close .sidebar-toggle {
+  width: auto;
+}
+body.close .content {
+  left: 0;
+}
+@media print {
+  .github-corner,
+  .sidebar-toggle,
+  .sidebar,
+  .app-nav {
+    display: none;
+  }
+}
+@media screen and (max-width: 768px) {
+  .cover-main .features {
+    flex-direction: column;
+  }
+
+  .cover-main .feature {
+    max-width: 100% !important;
+    padding: 0 2.5rem;
+  }
+  .github-corner,
+  .sidebar-toggle,
+  .sidebar {
+    position: fixed;
+  }
+  .app-nav {
+    margin-top: 16px;
+  }
+  .app-nav li ul {
+    top: 30px;
+  }
+  main {
+    height: auto;
+    min-height: 100vh;
+    overflow-x: hidden;
+  }
+  .sidebar {
+    left: -300px;
+    transition: transform 250ms ease-out;
+  }
+  .content {
+    left: 0;
+    max-width: 100vw;
+    position: static;
+    padding-top: 20px;
+    transition: transform 250ms ease;
+  }
+  .app-nav,
+  .github-corner {
+    transition: transform 250ms ease-out;
+  }
+  .sidebar-toggle {
+    background-color: transparent;
+    width: auto;
+    padding: 30px 30px 10px 10px;
+  }
+  body.close .sidebar {
+    transform: translateX(300px);
+  }
+  body.close .sidebar-toggle {
+    background-color: rgba(255, 255, 255, 0.8);
+    transition: 1s background-color;
+    width: 284px;
+    padding: 10px;
+  }
+  body.close .content {
+    transform: translateX(300px);
+  }
+  body.close .app-nav,
+  body.close .github-corner {
+    display: none;
+  }
+  .github-corner:hover .octo-arm {
+    animation: none;
+  }
+  .github-corner .octo-arm {
+    animation: octocat-wave 560ms ease-in-out;
+  }
+}
+@keyframes octocat-wave {
+  0%,
+  100% {
+    transform: rotate(0);
+  }
+  20%,
+  60% {
+    transform: rotate(-25deg);
+  }
+  40%,
+  80% {
+    transform: rotate(10deg);
+  }
+}
+section.cover {
+  position: relative;
+  align-items: center;
+  background-position: center center;
+  background-repeat: no-repeat;
+  background-size: cover;
+  min-height: 100vh;
+  width: 100%;
+  display: none;
+}
+section.cover.show {
+  display: flex;
+}
+section.cover.has-mask .mask {
+  background-color: #fff;
+  opacity: 0.8;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 100%;
+}
+section.cover .cover-main {
+  flex: 1;
+  margin: 100px auto 0px;
+  text-align: center;
+  position: relative;
+  max-width: 960px;
+}
+section.cover a {
+  color: inherit;
+  text-decoration: none;
+}
+section.cover a:hover {
+  text-decoration: none;
+}
+section.cover p {
+  line-height: 1.5rem;
+  margin: 1em 0;
+}
+section.cover h1 {
+  color: inherit;
+  font-size: 2.5rem;
+  font-weight: 300;
+  margin: 0.625rem 0 2.5rem;
+  position: relative;
+  text-align: center;
+}
+section.cover h1 a {
+  display: block;
+}
+section.cover h1 small {
+  bottom: -0.4375rem;
+  font-size: 1rem;
+  position: absolute;
+}
+section.cover blockquote {
+  font-size: 1.5rem;
+  text-align: center;
+}
+section.cover ul {
+  line-height: 1.8;
+  list-style-type: none;
+  margin: 1em auto;
+  max-width: 500px;
+  padding: 0;
+}
+section.cover .cover-main > p:last-child a {
+  border-color: #0074d9;
+  border-color: var(--theme-color, #0074d9);
+  border-radius: 2rem;
+  border-style: solid;
+  border-width: 1px;
+  box-sizing: border-box;
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+  display: inline-block;
+  font-size: 1.05rem;
+  letter-spacing: 0.1rem;
+  margin: 0.5rem 1rem;
+  padding: 0.75em 2rem;
+  text-decoration: none;
+  transition: all 0.15s ease;
+}
+section.cover .cover-main > p:last-child a:last-child {
+  background-color: #0074d9;
+  background-color: var(--theme-color, #0074d9);
+  color: #fff;
+}
+section.cover .cover-main > p:last-child a:last-child:hover {
+  color: inherit;
+  opacity: 0.8;
+}
+
+section.cover .cover-main a[href='#/introduce']:last-child {
+  border-color: #0074d9;
+  border-radius: 2rem;
+  border-style: solid;
+  border-width: 1px;
+  box-sizing: border-box;
+  color: #fff;
+  background: #0074d9;
+  display: inline-block;
+  font-size: 1.05rem;
+  letter-spacing: 0.1rem;
+  margin: 0.5rem 1rem;
+  padding: 0.75em 2rem;
+  text-decoration: none;
+  transition: all 0.15s ease;
+}
+section.cover .cover-main a[href='#/introduce']:hover {
+  color: inherit;
+  opacity: 0.8;
+  color: #fff;
+}
+section.cover .cover-main > p:last-child a:hover {
+  color: inherit;
+}
+section.cover .cover-main .features {
+  border-top: 1px solid #eaecef;
+  padding: 1.2rem 0;
+  margin-top: 2.5rem;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: flex-start;
+  align-content: stretch;
+  justify-content: space-between;
+}
+section.cover .cover-main .feature {
+  flex-grow: 1;
+  flex-basis: 30%;
+  max-width: 30%;
+  text-align: left;
+}
+
+section.cover blockquote > p > a {
+  border-bottom: 2px solid #0074d9;
+  border-bottom: 2px solid #0074d9;
+  transition: color 0.3s;
+  background: #0074d9;
+}
+section.cover blockquote > p > a:hover {
+  color: #fff;
+}
+body {
+  background-color: #fff;
+}
+/* sidebar */
+.sidebar {
+  background-color: #fff;
+  color: #364149;
+}
+.sidebar li {
+  margin: 6px 0 6px 0;
+}
+.sidebar ul li a {
+  color: #364149;
+  font-size: 14px;
+  font-weight: normal;
+  overflow: hidden;
+  text-decoration: none;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.sidebar ul li a:hover {
+  text-decoration: underline;
+}
+.sidebar ul li ul {
+  padding: 0;
+}
+.sidebar ul li.active > a {
+  border-right: 2px solid;
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+  font-weight: 600;
+}
+.app-sub-sidebar li::before {
+  content: '-';
+  padding-right: 4px;
+  float: left;
+}
+/* markdown content found on pages */
+.markdown-section h1,
+.markdown-section h2,
+.markdown-section h3,
+.markdown-section h4,
+.markdown-section strong {
+  color: #2c3e50;
+  font-weight: 600;
+}
+.markdown-section a {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+  font-weight: 600;
+}
+.markdown-section h1 {
+  font-size: 2rem;
+  margin: 0 0 1rem;
+}
+.markdown-section h2 {
+  font-size: 1.75rem;
+  margin: 45px 0 0.8rem;
+}
+.markdown-section h3 {
+  font-size: 1.5rem;
+  margin: 40px 0 0.6rem;
+}
+.markdown-section h4 {
+  font-size: 1.25rem;
+}
+.markdown-section h5 {
+  font-size: 1rem;
+}
+.markdown-section h6 {
+  color: #777;
+  font-size: 1rem;
+}
+.markdown-section figure,
+.markdown-section p {
+  margin: 1.2em 0;
+}
+.markdown-section p,
+.markdown-section ul,
+.markdown-section ol {
+  line-height: 1.6rem;
+  word-spacing: 0.05rem;
+}
+.markdown-section ul,
+.markdown-section ol {
+  padding-left: 1.5rem;
+}
+.markdown-section blockquote {
+  border-left: 4px solid #0074d9;
+  border-left: 4px solid var(--theme-color, #0074d9);
+  color: #858585;
+  margin: 2em 0;
+  padding-left: 20px;
+}
+.markdown-section blockquote p {
+  font-weight: 600;
+  margin-left: 0;
+}
+.markdown-section iframe {
+  margin: 1em 0;
+}
+.markdown-section em {
+  color: #7f8c8d;
+}
+.markdown-section code,
+.markdown-section pre,
+.markdown-section output::after {
+  font-family: 'Roboto Mono', Monaco, courier, monospace;
+}
+.markdown-section code,
+.markdown-section pre {
+  background-color: #f8f8f8;
+}
+.markdown-section pre,
+.markdown-section output {
+  margin: 1.2em 0;
+  position: relative;
+}
+.markdown-section pre > code,
+.markdown-section output {
+  border-radius: 2px;
+  display: block;
+}
+.markdown-section pre > code,
+.markdown-section output::after {
+  -moz-osx-font-smoothing: initial;
+  -webkit-font-smoothing: initial;
+}
+.markdown-section code {
+  border-radius: 2px;
+  color: #e96900;
+  margin: 0 2px;
+  padding: 3px 5px;
+  white-space: pre-wrap;
+}
+.markdown-section > :not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code {
+  font-size: 0.8rem;
+}
+.markdown-section pre {
+  padding: 0 1.4rem;
+  line-height: 1.5rem;
+  overflow: auto;
+  word-wrap: normal;
+}
+.markdown-section pre > code {
+  color: #525252;
+  font-size: 0.8rem;
+  padding: 2.2em 5px;
+  line-height: inherit;
+  margin: 0 2px;
+  max-width: inherit;
+  overflow: inherit;
+  white-space: inherit;
+}
+.markdown-section output {
+  padding: 1.7rem 1.4rem;
+  border: 1px dotted #ccc;
+}
+.markdown-section output > :first-child {
+  margin-top: 0;
+}
+.markdown-section output > :last-child {
+  margin-bottom: 0;
+}
+.markdown-section code::after,
+.markdown-section code::before,
+.markdown-section output::after,
+.markdown-section output::before {
+  letter-spacing: 0.05rem;
+}
+.markdown-section pre::after,
+.markdown-section output::after {
+  color: #ccc;
+  font-size: 0.6rem;
+  font-weight: 600;
+  height: 15px;
+  line-height: 15px;
+  padding: 5px 10px 0;
+  position: absolute;
+  right: 0;
+  text-align: right;
+  top: 0;
+}
+.markdown-section pre::after,
+.markdown-section output::after {
+  content: attr(data-lang);
+}
+/* code highlight */
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: #8e908c;
+}
+.token.namespace {
+  opacity: 0.7;
+}
+.token.boolean,
+.token.number {
+  color: #c76b29;
+}
+.token.punctuation {
+  color: #525252;
+}
+.token.property {
+  color: #c08b30;
+}
+.token.tag {
+  color: #2973b7;
+}
+.token.string {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+}
+.token.selector {
+  color: #6679cc;
+}
+.token.attr-name {
+  color: #2973b7;
+}
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #22a2c9;
+}
+.token.attr-value,
+.token.control,
+.token.directive,
+.token.unit {
+  color: #0074d9;
+  color: var(--theme-color, #0074d9);
+}
+.token.keyword,
+.token.function {
+  color: #e96900;
+}
+.token.statement,
+.token.regex,
+.token.atrule {
+  color: #22a2c9;
+}
+.token.placeholder,
+.token.variable {
+  color: #3d8fd1;
+}
+.token.deleted {
+  text-decoration: line-through;
+}
+.token.inserted {
+  border-bottom: 1px dotted #202746;
+  text-decoration: none;
+}
+.token.italic {
+  font-style: italic;
+}
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+.token.important {
+  color: #c94922;
+}
+.token.entity {
+  cursor: help;
+}
+code .token {
+  -moz-osx-font-smoothing: initial;
+  -webkit-font-smoothing: initial;
+  min-height: 1.5rem;
+  position: relative;
+  left: auto;
+}
+section.cover .copyright {
+  bottom: 5px;
+  position: fixed;
+  left: 0;
+  right: 0;
+  text-align: center;
+}
+
+main .content .copyright {
+  bottom: 5px;
+  position: absolute;
+  left: 10px;
+  right: 0;
+  text-align: left;
+}
+
+.markdown-section .clklog-contact-items {
+  position: fixed;
+  right: 5px;
+  top: calc((100vh - 168px) / 2);
+  z-index: 9999;
+  /* background-color: #eaf2fc; */
+  /* border-radius: 56px; */
+  width: 55px;
+  padding-left: 0px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item {
+  width: 55px;
+  height: 55px;
+  position: relative;
+  margin: 5px 0;
+  list-style: none;
+  background-color: #eaf2fc;
+  border-radius: 36px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content {
+  display: block;
+  position: absolute;
+  left: -150px;
+  top: 5px;
+  z-index: 9999;
+  background-color: #eaf2fc;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.phone:hover .clklog-contact-item-content {
+  left: -138px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.wechat:hover .clklog-contact-item-content {
+  left: -150px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.email:hover .clklog-contact-item-content {
+  left: -140px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item .clklog-contact-item-content .triangle {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-top: 8px solid transparent;
+  border-bottom: 8px solid transparent;
+  border-left: 8px solid #eaf2fc;
+  position: absolute;
+  right: -8px;
+  top: 15px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item {
+  background-position: center;
+  background-repeat: no-repeat;
+  cursor: pointer;
+}
+
+.markdown-section .clklog-contact-items .clklog-contact-item.phone .info {
+  font-size: 20px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.email .info {
+  font-size: 16px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.wechat .info {
+  text-align: center;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.phone {
+  background-image: url(../imgs/phone.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.phone:hover {
+  background-image: url(../imgs/phone.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.wechat {
+  background-image: url(../imgs/wechat.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.wechat:hover {
+  background-image: url(../imgs/wechat.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.email {
+  background-image: url(../imgs/email.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item.email:hover {
+  background-image: url(../imgs/email.png);
+}
+.markdown-section .clklog-contact-items .clklog-contact-item .clklog-contact-item-content {
+  display: none;
+}
+
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content {
+  border-radius: 5px;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content.wechat p {
+  text-align: center;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content p {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content.wechat p {
+}
+.markdown-section .clklog-contact-items .clklog-contact-item:hover .clklog-contact-item-content .contentwrap {
+  padding: 10px;
+}

BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_QOW4Ep0.woff2


BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_R-W4Ep0.woff2


BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_ROW4.woff2


BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_S-W4Ep0.woff2


BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SeW4Ep0.woff2


BIN
assets/fontface/robotomono/L0xuDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vq_SuW4Ep0.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2


BIN
assets/fontface/sourcesanspro/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2


BIN
assets/fontface/sourcesanspro/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2


BIN
assets/imgs/1.png


BIN
assets/imgs/2.png


BIN
assets/imgs/WX20240102-170635.png


BIN
assets/imgs/contactqrcode.jpg


BIN
assets/imgs/createtop.png


BIN
assets/imgs/email.png


BIN
assets/imgs/export.png


BIN
assets/imgs/icon.png


BIN
assets/imgs/logo0.png


BIN
assets/imgs/logo1.png


BIN
assets/imgs/nginxinstallerror.png


BIN
assets/imgs/phone.png


BIN
assets/imgs/preview.png


BIN
assets/imgs/redisinstallerror.png


BIN
assets/imgs/scripttype.png


BIN
assets/imgs/wechat.png


BIN
assets/imgs/zookeepercheck.png


+ 91 - 0
assets/plugins/autotrack@2.2.js

@@ -0,0 +1,91 @@
+;(function (para) {
+  var p = para.sdk_url,
+    n = para.name,
+    w = window,
+    d = document,
+    s = 'script',
+    x = null,
+    y = null
+  if (typeof w['sensorsDataAnalytic201505'] !== 'undefined') {
+    return false
+  }
+  w['sensorsDataAnalytic201505'] = n
+  w[n] =
+    w[n] ||
+    function (a) {
+      return function () {
+        ;(w[n]._q = w[n]._q || []).push([a, arguments])
+      }
+    }
+  var ifs = [
+    'track',
+    'quick',
+    'register',
+    'registerPage',
+    'registerOnce',
+    'trackSignup',
+    'trackAbtest',
+    'setProfile',
+    'setOnceProfile',
+    'appendProfile',
+    'incrementProfile',
+    'deleteProfile',
+    'unsetProfile',
+    'identify',
+    'login',
+    'logout',
+    'trackLink',
+    'clearAllRegister',
+    'getAppStatus'
+  ]
+  for (var i = 0; i < ifs.length; i++) {
+    w[n][ifs[i]] = w[n].call(null, ifs[i])
+  }
+  if (!w[n]._t) {
+    ;(x = d.createElement(s)), (y = d.getElementsByTagName(s)[0])
+    x.async = 1
+    x.src = 'assets/plugins/session-event/index.js' //引用的session-event插件路径
+    x.setAttribute('charset', 'UTF-8')
+    w[n].para = para
+    y.parentNode.insertBefore(x, y)
+    ;(x = d.createElement(s)), (y = d.getElementsByTagName(s)[0])
+    x.async = 1
+    x.src = 'assets/plugins/exposure/index.js' //引用的exposure插件路径
+    x.setAttribute('charset', 'UTF-8')
+    w[n].para = para
+    y.parentNode.insertBefore(x, y)
+    ;(x = d.createElement(s)), (y = d.getElementsByTagName(s)[0])
+    x.async = 1
+    x.src = p
+    x.setAttribute('charset', 'UTF-8')
+    w[n].para = para
+    y.parentNode.insertBefore(x, y)
+  }
+  sensors.quick('isReady', function () {
+    sensors.use('Exposure', {
+      area_rate: 1,
+      stay_duration: 2,
+      repeated: false
+    })
+    sensors.use('PageLeave', { heartbeat_interval_time: 5 })
+    sensors.use('PageLoad')
+    sensors.use('SessionEvent')
+  })
+  //sensors.quick('autoTrackSinglePage')
+})({
+  sdk_url: 'assets/plugins/sensorsdata.js',
+  name: 'sensors',
+  show_log: true,
+  is_track_single_page: false,
+  // send_type:'beacon',
+  server_url: 'https://receiver.tracking.zcunsoft.com/api/gp?project=clklog&token=4a793ea028fc327f4f1763b7630e1438', //clklog_receiver 的接收服务地址
+  heatmap: {
+    clickmap: 'default',
+    scroll_notice_map: 'default',
+    collect_tags: {
+      div: true,
+      img: true
+    }
+  },
+  preset_properties: { latest_referrer_host: true }
+})

+ 60 - 0
assets/plugins/countable.js

@@ -0,0 +1,60 @@
+//default values
+var defaultOptions = {
+    countable: true,
+    position: "top",
+    margin: "10px",
+    float: "right",
+    fontsize: "0.9em",
+    color: "rgb(90,90,90)",
+    language: "english",
+    isExpected: true,
+}
+
+// Docsify plugin functions
+function plugin(hook, vm) {
+    if (!defaultOptions.countable) {
+        return
+    }
+    let wordsCount
+    hook.beforeEach(function (content) {
+        // Match regex every time you start parsing .md
+        wordsCount = content.match(/([\u4e00-\u9fa5]+?|[a-zA-Z0-9]+)/g).length
+        return content
+    })
+    hook.afterEach(function (html, next) {
+        let str = wordsCount + " words"
+        let readTime = Math.ceil(wordsCount / 400) + " min"
+        //Determine whether to use the Chinese style according to the attribute "language"
+        if (defaultOptions.language === "chinese") {
+            str = wordsCount + " 字"
+            readTime = Math.ceil(wordsCount / 400) + " 分钟"
+        }
+
+        //add html string
+        next(
+            `
+        ${defaultOptions.position === "bottom" ? html : ""}
+        <div style="margin-${defaultOptions.position ? "bottom" : "top"}: ${
+                defaultOptions.margin
+            };">
+            <span style="
+                  float: ${defaultOptions.float === "right" ? "right" : "left"};
+                  font-size: ${defaultOptions.fontsize};
+                  color:${defaultOptions.color};">
+            ${str}
+            ${defaultOptions.isExpected ? `&nbsp; | &nbsp;${readTime}` : ""}
+            </span>
+            <div style="clear: both"></div>
+        </div>
+        ${defaultOptions.position !== "bottom" ? html : ""}
+        `
+        )
+    })
+}
+
+// Docsify plugin options
+window.$docsify["count"] = Object.assign(
+    defaultOptions,
+    window.$docsify["count"]
+)
+window.$docsify.plugins = [].concat(plugin, window.$docsify.plugins)

File diff suppressed because it is too large
+ 6 - 0
assets/plugins/docsify-autoHeaders.min.js


File diff suppressed because it is too large
+ 7 - 0
assets/plugins/docsify-copy-code.js


+ 4 - 0
assets/plugins/docsify-footer.min.js

@@ -0,0 +1,4 @@
+parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"WDEB":[function(require,module,exports) {
+!function(e,o,t){o.plugins=[].concat(function(o,t){var n=t.config,c=n.loadFooter,r=n.ext,i=n.requestHeaders;if(c){var f=!0===c?"_footer"+r:c;o.mounted(function(o){var n=t.router.getFile(f),c=e.dom.getNode("article");e.get(n,!1,i).then(function(o){var n=t.compiler.compile(o),r=e.dom.create("footer",n);e.dom.appendTo(c,r),t._lifecycle.afterEach(function(e){return e+n})})})}},o.plugins)}(Docsify,$docsify);
+},{}]},{},["WDEB"], null)
+//# sourceMappingURL=/docsify-footer.min.js.map

File diff suppressed because it is too large
+ 0 - 0
assets/plugins/docsify-pagination.min.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/docsify@4.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/exposure/index.closure.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/exposure/index.es6.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/exposure/index.js


+ 13 - 0
assets/plugins/exposure/readme.md

@@ -0,0 +1,13 @@
+# 元素曝光事件采集
+
+## 功能
+某视图元素,由不可见到可见,满足一定的限制条件(可见比例、有效停留时长),该插件上报该视图元素曝光事件。
+
+具体使用方法请参考:[曝光采集(Web)](https://manual.sensorsdata.cn/sa/latest/tech_sdk_client_web_expose-123962352.html)
+
+## 变动
+- 新增事件:通过 HTML 或 API 自定义曝光事件名。
+- 新增属性: 通过 HTML 或 API 自定义事件属性。
+
+## ⚠️ 注意
+- 插件和 SDK 必须在同一个版本中,请勿混合不同版本的 SDK 和插件进行使用。

File diff suppressed because it is too large
+ 0 - 0
assets/plugins/index.min.0.1.3.js


File diff suppressed because it is too large
+ 5 - 0
assets/plugins/palettify.min.js


+ 1 - 0
assets/plugins/prismjs@1.22.0/components/prism-java.min.js

@@ -0,0 +1 @@
+!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|record|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!<keyword>)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(/<keyword>/g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);

File diff suppressed because it is too large
+ 0 - 0
assets/plugins/search.min.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/sensorsdata.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/session-event/index.closure.js


File diff suppressed because it is too large
+ 0 - 0
assets/plugins/zoom-image.min.js


+ 18 - 18
changelog.md

@@ -1,18 +1,18 @@
-# 版本说明
-
-## ClickLog 版本 2023-9-5 v0.5.0
-
-### 功能
-
-- 从不同维度,展示、统计、查看、下载用户访问的流量趋势数据
-- 按地域,从不同维度统计、查看、下载各地域下的用户访问流量指标数据
-- 按受访页面,从不同维度统计、查看、下载各个页面的用户访问流量指标数据
-- 按来源网站,从不同维度统计、查看、下载各个来源网站的用户访问流量指标数据
-- 按新老访客,从不同维度统计、查看、下载新老访客的用户访问流量指标数据
-- 按用户忠诚度,从不同维度统计、查看、下载用户访问忠诚度相关指标数据
-- 按设备,从不同维度统计、查看、下载各类型设备的用户访问流量指标数据
-- 按渠道,从不同维度统计、查看、下载各渠道下的用户访问流量指标数据
-- 从不同维度,展示、统计、查看、下载站外搜索关键词的访问流量指标数据
-
-<!-- ### 优化&修复 -->
-<!-- ### 新贡献者 -->
+# 版本说明
+
+## ClickLog 版本 2023-9-5 v0.5.0
+
+### 功能
+
+- 从不同维度,展示、统计、查看、下载用户访问的流量趋势数据
+- 按地域,从不同维度统计、查看、下载各地域下的用户访问流量指标数据
+- 按受访页面,从不同维度统计、查看、下载各个页面的用户访问流量指标数据
+- 按来源网站,从不同维度统计、查看、下载各个来源网站的用户访问流量指标数据
+- 按新老访客,从不同维度统计、查看、下载新老访客的用户访问流量指标数据
+- 按用户忠诚度,从不同维度统计、查看、下载用户访问忠诚度相关指标数据
+- 按设备,从不同维度统计、查看、下载各类型设备的用户访问流量指标数据
+- 按渠道,从不同维度统计、查看、下载各渠道下的用户访问流量指标数据
+- 从不同维度,展示、统计、查看、下载站外搜索关键词的访问流量指标数据
+
+<!-- ### 优化&修复 -->
+<!-- ### 新贡献者 -->

+ 31 - 0
contributor/agreement.md

@@ -0,0 +1,31 @@
+# 贡献者协议
+
+感谢您有兴趣为 Clklog 或其任何关联公司(“Clklog”)托管或管理的项目贡献软件代码。为了阐明任何个人或实体的贡献授予的知识产权许可,Clklog 必须有一份由每个贡献者签署的贡献者许可协议(“CLA”)存档,表明同意以下许可条款。此版本的贡献者许可协议允许个人向适用项目提交贡献。请在签署前仔细阅读本文件,在对协议项下条款均无异议的前提下,签署本协议。
+
+对于您现在和未来提交给 Clklog 的贡献,您接受并同意以下条款和条件。除此处授予 Clklog 和 Clklog 分发的软件的接收者的许可外,您保留对您的贡献的所有权利、所有权和利益。
+
+1. 定义。
+
+    i. “您”(或“您的”)是指与 Clklog 签订本协议的著作权人或著作权人授权的法人。对于法人实体,做出贡献的实体以及控制该实体、受该实体控制或与该实体共同控制的所有其他实体均被视为单一贡献者。就本定义而言,“控制”是指 (i) 通过合同或其他方式直接或间接导致该实体的指示或管理的权力,或 (ii) 百分之五十 (50%) 的所有权或更多已发行股份,或 (iii) 该实体的实益所有权。
+
+    ii. “贡献”是指您有意提交给 Clklog 以纳入 Clklog 拥有或管理的任何产品或项目(即“作品”),包括但不限于任何程序、代码、文字、图片、图形、文档或者其他作品。就本定义而言,“提交”是指发送给 Clklog 或其代表的任何形式的电子或书面通讯,包括但不限于电子邮件列表中的通讯、源代码控制系统和由 Clklog 管理或代表 Clklog 管理的问题跟踪系统,用于讨论和改进作品。
+
+2. 授予版权许可。在遵守本协议的条款和条件的前提下,您特此授予 Clklog 和 Clklog 分发的软件的接收者永久的、全球范围内的、非排他性的、免费的、免版税的、不可撤销的版权许可,以复制、准备衍生作品、公开展示、公开表演、再许可和分发您的贡献和此类衍生作品。
+
+3. 授予专利许可。在遵守本协议的条款和条件的前提下,您特此授予 Clklog 和 Clklog 分发的软件的接收者一项永久的、全球范围内的、非独占的、免费的、免版税的、不可撤销的(除非本节另有规定)专利制作、制作、使用、提议出售、销售、进口和以其他方式转让作品的许可,其中此类许可仅适用于您可许可的那些专利权利要求,但您的贡献单独或由您对提交此类贡献的作品的贡献。如果任何实体对您或任何其他实体提起专利诉讼(包括诉讼中的交叉索赔或反诉),声称您的贡献或您贡献的作品。
+
+4. 您声明您在法律上有权授予上述许可。
+
+5. 您声明您的每一项贡献都是您的原创作品(参见第 7 节代表他人提交的内容)。您声明您提交的投稿包括您个人知晓且与您投稿的任何部分相关的任何第三方许可或其他限制(包括但不限于相关专利和商标)的完整详细信息。
+
+6. 您不应为您的贡献提供支持,除非您希望提供支持。您可以免费、收费或根本不提供支持。除非适用法律要求或书面同意,否则您按“原样”提供您的贡献,不提供任何明示或暗示的保证或条件,包括但不限于标题、非侵权、适销性或特定用途的适用性。
+
+7. 如果您希望提交非您原创的作品,您可以将其与任何投稿分开提交给 Clklog,注明其来源和任何许可或其他限制(包括但不限于相关专利、商标)的完整详细信息和许可协议),并在显着位置将作品标记为“代表第三方提交:[此处命名]”。
+
+8. 您同意将您知悉的任何会使这些陈述在任何方面不准确的事实或情况通知 Clklog。
+
+9. 本协议将受中华人民共和国法律管辖并按其解释,但不包括被称为法律冲突的法律体系。双方明确同意不适用《联合国国际货物销售合同公约》。根据本协议产生的任何法律诉讼或程序将由 Clklog 所在地的法院提起,双方在此不可撤销地同意其中的属人管辖权和地点。
+
+我已充分阅读此协议,并同意签署贡献者许可协议。
+
+<a href="contributor/clklogagreement.doc" target="_blank" download="">[协议下载]</a>

+ 21 - 21
introduce.md

@@ -1,21 +1,21 @@
-
-
-## 项目组成
-
-- **接收服务 【clklog-receiver】**:接收客服端采集的日志,存入kafka。
-
-- **处理脚本 【clickhouse-script】**:基于Clickhouse集群中的log_analysis表进行多维计算,获得各个维度上的统计报表。使用Cron来进行任务的定时调度。
-
-- **处理服务  【clklog-processing】**: 依托flink,消费kafka数据,存入clickhouse。
-
-- **统计接口 【clklog-api】**: 提供多维度数据统计接口。
-
-- **统计展示 【clklog-ui】**:基于 vue-element-admin 实现的统计分析数据界面展示。
-
-## 示意图
-
-| ![](assets/imgs/1.png) | ![](assets/imgs/2.png) |
-| ------------------------- | ------------------------- |
-| ![](assets/imgs/3.png) | ![](assets/imgs/4.png) |
-| ![](assets/imgs/5.png) | ![](assets/imgs/6.png) |
-| ![](assets/imgs/7.png) | ![](assets/imgs/8.png) |
+
+
+## 项目组成
+
+- **接收服务 【clklog-receiver】**:接收客服端采集的日志,存入kafka。
+
+- **处理脚本 【clickhouse-script】**:基于Clickhouse集群中的log_analysis表进行多维计算,获得各个维度上的统计报表。使用Cron来进行任务的定时调度。
+
+- **处理服务  【clklog-processing】**: 依托flink,消费kafka数据,存入clickhouse。
+
+- **统计接口 【clklog-api】**: 提供多维度数据统计接口。
+
+- **统计展示 【clklog-ui】**:基于 vue-element-admin 实现的统计分析数据界面展示。
+
+## 示意图
+
+| ![](assets/imgs/1.png) | ![](assets/imgs/2.png) |
+| ------------------------- | ------------------------- |
+| ![](assets/imgs/3.png) | ![](assets/imgs/4.png) |
+| ![](assets/imgs/5.png) | ![](assets/imgs/6.png) |
+| ![](assets/imgs/7.png) | ![](assets/imgs/8.png) |

+ 17 - 17
license.md

@@ -1,17 +1,17 @@
-## 协议许可
-
-- 开源协议:[AGPL V3.0](https://www.gnu.org/licenses/agpl-3.0.en.html)
-
-- 免费使用:使用 Clklog 的组织或个人在复制、分发、转发或修改时请遵守[AGPL V3.0](https://www.gnu.org/licenses/agpl-3.0.en.html)相关条款,不得移除ClkLog相关版权标识进行。如有违反,开发者保留对侵权者追究责任的权利。
-
-- 商业使用:请联系邮箱`info@clklog.com`进行细节咨询
-
-## 联系我们
-
-- 客服邮箱:<info@clklog.com>
-
-- 客服手机:16621363853
-
-- 客服微信:opensoft66
-
-- 客服二维码:<img title="" src="/assets/imgs/contactqrcode.jpg" alt="" data-align="center" width="120" style="vertical-align:top">
+## 协议许可
+
+- 开源协议:[AGPL V3.0](https://www.gnu.org/licenses/agpl-3.0.en.html)
+
+- 免费使用:使用 Clklog 的组织或个人在复制、分发、转发或修改时请遵守[AGPL V3.0](https://www.gnu.org/licenses/agpl-3.0.en.html)相关条款,不得移除ClkLog相关版权标识进行。如有违反,开发者保留对侵权者追究责任的权利。
+
+- 商业使用:请联系邮箱`info@clklog.com`进行细节咨询
+
+## 联系我们
+
+- 客服邮箱:<info@clklog.com>
+
+- 客服手机:16621363853
+
+- 客服微信:opensoft66
+
+- 客服二维码:<img title="" src="/assets/imgs/contactqrcode.jpg" alt="" data-align="center" width="120" style="vertical-align:top">

+ 501 - 501
quickstart/deployment.md

@@ -1,501 +1,501 @@
-
-# 应用部署
-
-## 1.准备 linux 服务器
-
-假设IP 为 `10.10.222.21`
-
-## 2.数据库初始化
-
-<!-- > 下载源码:
-<a href="https://github.com/clklog/clklog-scripts" target="_blank">[GitHub 下载]</a> -->
-
-1. 在clickhouse里创建数据库`clklog`
-
-    ```
-    CREATE DATABASE clklog ENGINE = Atomic
-    ```
-
-2. 根据 `scripts` 下的`sql脚本.txt`文件创建表
-
-## 3.部署接收服务 clklog-receiver
-
-<!-- > 下载源码:
-<a href="https://github.com/clklog/clklog-receiver" target="_blank">[GitHub 下载]</a> -->
-
-1. 编译应用程序
-
-2. 上传程序文件
-
-    将`clklog_receiver.jar`包和 `application.yml`文件拷贝至`/usr/local/services/`目录:
-
-    ```
-    cd /usr/local/services/
-    mkdir clklogreceiver
-    chmod 500 clklog_receiver.jar
-    ```
-
-3. 修改配置文件
-
-    根据前面安装的组件配置,修改`application.yml`中`redis`、`kafka`相关配置,代码如下:
-
-    ```
-    server: 
-      tomcat: 
-        #日志配配置
-        accesslog: 
-          #目录
-          directory: /usr/local/services/receiverlogs      
-    logging:
-      file:
-        path: log
-    spring:
-      kafka:
-        bootstrap-servers: localhost:9092
-      redis:
-        # 单机配置
-        host: localhost
-        port: 6379
-        # password: nW2zFwS41tdf
-        # 哨兵配置
-        # sentinel:
-        # master: gct
-        # nodes: 10.100.2.1:26379,10.100.2.2:26379,10.100.2.3:26379
-    receiver: 
-      app-list: clklogapp
-    ```
-
-4. 创建服务
-
-    ```
-    vim /etc/systemd/system/clklogreceiver.service
-    ```
-
-    内容如下:
-
-    ```
-    [Unit]
-    Description=clklogreceiver
-    After=syslog.target
-
-    [Service]
-    ExecStart=/usr/local/services/clklogreceiver/clklog_receiver-1.0.0.jar
-    SuccessExitStatus=143
-
-    [Install]
-    WantedBy=multi-user.target
-    ```
-
-    更新服务配置
-
-    ```
-    systemctl daemon-reload
-    ```
-
-5. 启动应用程序
-
-    ```
-    systemctl start clklogreceiver
-    ```
-
-## 4.部署处理服务 clklog-processing
-
-<!-- > 下载源码:
-<a href="https://github.com/clklog/clklog-processing" target="_blank">[GitHub 下载]</a> -->
-
-1. 编译应用程序
-
-2. 上传程序文件
-
-   拷贝`clklog-processing-1.0.0-jar-with-dependencies.jar`包和 `config.properties`文件至`/usr/local/services/clklogprocessing`目录
-
-    ```
-    cd /usr/local/services/
-    mkdir /usr/local/services/clklogprocessing
-    chmod 500  clklog-processing-1.0.0-jar-with-dependencies.jar
-    ```
-
-3. 修改配置项
-
-   ```
-    vim config.properties
-
-    # clickhouse 数据库连接配置
-    clickhouse.host=localhost:8123
-    clickhouse.database=clklog
-    clickhouse.username=default
-    clickhouse.password=123456
-
-    # kafka 连接配置
-    kafka.bootstrap.server=localhost:9092
-    kafka.topic=clklog
-    kafka.group-id=clklog-group
-    
-    # flink 配置
-    flink.data-source-name=KafkaSource
-    flink.checkpoint=file:///usr/local/services/clklogprocessing/checkpoints
-    flink.parallelism=1
-    ```
-
-4. 启动应用程序
-
-    ```
-    cd /usr/local/services/clklogprocessing
-
-    /usr/local/services/flink-1.14.6/bin/flink run -s file: /usr/local/services/clklogprocessing/checkpoints/41f3b324752da77ed7821033d45d1d2f/chk-2737882  -c com.zcunsoft.clklog.analysis.entry.JieXiJson /usr/local/services/clklogprocessing/clklog-processing-1.0.0-jar-with-dependencies.jar
-    ```
-
-    其中 `-s` 参数为`checkpoint`位置。对于中断后再执行的任务,需要指定该参数,如不指定则从头开始消费`kafka`消息。
-
-## 5. 部署计算脚本clklog-script
-
-<!-- > 下载脚本: <a href="https://github.com/clklog/clklog-scripts" target="_blank">[GitHub 下载]</a> -->
-
-- 计算脚本是基于Clickhouse集群中的`log_analysis`表进行多维计算,获得各个维度上的统计报表。
-    使用Cron来进行任务的定时调度。
-
-1. 创建脚本及日志存放目录
-
-    ```
-    mkdir /usr/local/services/scripts
-    mkdir /usr/local/services/scripts/sh
-    mkdir /usr/local/services/scripts/flock
-    mkdir /usr/local/services/scripts/crontab_log
-    mkdir /usr/local/services/scripts/cklog
-    ```
-
-2. 上传sh计算脚本
-
-   - **注意:上传脚本时,需设置迁移类型为ASCII(I)**
-  
-    脚本上传于`/usr/local/services/scripts/sh`目录,  为防止出现权限问题导致脚本不能执行,建议上传完脚本以后执行以下代码:
-
-    ```
-    chmod 500 *.sh
-    ```
-
-1. 修改脚本中的数据库链接配置
-
-    根据clickhouse配置,修改脚本中连接clickhouse的`用户名、密码`配置信息:
-
-    ````
-    ck_login="clickhouse-client -u default --password 123456"
-    ck_log_db="clklog."
-    ck_stat_db="clklog."
-    ````
-
-2. 设置调度任务
-
-    ```
-    crontab -e
-    ```
-
-    将 `scripts`目录下的 `定时脚本.txt`文件,内容复制过去`.wq`保存。
-
-    备注:脚本的日志在`/usr/local/services/scripts/cklog/`
-<br>
-
-## 6. 部署统计接口 clklog-api
-
-<!-- > 下载源码:
-<a href="https://github.com/clklog/clklog-api" target="_blank">[GitHub 下载]</a> -->
-
-1. 编译应用程序
-
-2. 上传程序文件
-
-   拷贝`clklog-api-1.0.0.jar`包和`application.yml`文件至`/usr/local/services/clklogapi`目录:
-
-    ```
-    cd /usr/local/services
-    mkdir /usr/local/services/clklogapi
-    chmod 500 clklog-api-1.0.0.jar
-    ```
-
-3. 修改配置文件
-
-    根据前面安装的组件配置,修改`application.yml`中的相关配置,代码如下:
-
-    ```
-    springdoc:
-      swagger-ui:
-        enabled: true
-        tagsSorter: alpha
-      api-docs:
-        path: /api/v3/api-docs
-        enabled: true
-      group-configs:
-        - group: 'default'
-          paths-to-match: '/**'
-          packages-to-scan: com.zcunsoft.tracking.api.controllers
-    server:
-      port: 8087
-    spring:
-      application.name: clklog-api
-      datasource:
-        clickhouse:
-          jdbc-url: jdbc:clickhouse://localhost:8123/clklog
-          username: default
-          password: 123456
-          driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
-          connection-timeout: 20000
-          maximum-pool-size: 5
-    logging:
-      file:
-        path: log
-    trackingapi:
-      access-control-allow-origin: "*"
-      project-name: clklogapp
-    ```
-
-4. 创建服务
-
-    ```
-    vim /etc/systemd/system/clklogapi.service
-    ```
-
-    内容如下:
-
-    ```
-    [Unit]
-    Description=clklog-api
-    After=syslog.target
-
-    [Service]
-    ExecStart=/usr/local/services/clklogapi/clklog-api-1.0.0.jar
-    SuccessExitStatus=143
-
-    [Install]
-    WantedBy=multi-user.target
-    ```
-
-    更新服务
-
-    ```
-    systemctl daemon-reload
-    ```
-
-5. 启动应用程序
-
-    ```
-    systemctl start clklogapi
-    ```
-
-## 7. nginx 路由设置参考
-
-1. 创建配置文件,设置路由
-
-    ```
-    vim /etc/nginx/conf.d/clklog.conf
-    ```
-
-    内容如下:
-
-    ```
-    upstream clklog_api_server {
-            server localhost:8087; 
-        }
-
-    upstream clklog_receiver_server {
-            server localhost:8002; 
-        }
-
-    upstream clklog_flink_server{
-            server localhost:8081; 
-        }
-
-    server {
-        listen 80;
-        listen [::]:80;
-        server_name localhost;
-
-    location / {
-                root   /usr/share/nginx/html;
-                index  index.html index.htm;
-                proxy_set_header Host $host;
-                proxy_set_header X-Real-IP $remote_addr;
-                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-            }
-
-    location /clklog_receiver/ {
-                proxy_pass http://clklog_receiver_server/; 
-                proxy_set_header Host $host:$server_port; 
-                proxy_set_header X-Real-IP $remote_addr;
-                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-            }
-
-    location /api/ {
-                proxy_pass http://clklog_api_server/; 
-                proxy_set_header Host $host:$server_port; 
-            }
-
-    location /api/v3/ {
-                proxy_pass http://clklog_api_server/api/v3/; 
-                proxy_set_header Host $host:$server_port; 
-                proxy_set_header X-Real-IP $remote_addr;
-                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-            }
-
-    location /clklog_flink/ {
-                proxy_pass http://clklog_flink_server/;
-                proxy_set_header Host $host:$server_port;
-            } 
-    }
-    ```
-
-2. 重启nginx
-
-    ```
-    systemctl restart nginx
-    ```
-
-## 8. 部署环境验证
-
-1. Flink后台地址
-
-    ```
-    http://10.10.222.21/clklog_flink/#/overview
-    ```
-
-2. 日志接收地址
-
-    ```
-    http://10.10.222.21/clklog_receiver/api/gp
-    ```
-
-3. 接口地址
-
-    ```
-    http://10.10.222.21/api/doc.html#/home
-    ```
-
-## 9. sdk 埋点集成
-
-#### 1. Web JS 埋点集成参考
-
-1. 下载神策 WEB JS SDK
-
-    [下载 sensorsdata.js](https://github.com/sensorsdata/sa-sdk-javascript/blob/v1.25.15/dist/web/sensorsdata.js)
-
-    [下载插件 session-event](https://github.com/sensorsdata/sa-sdk-javascript/blob/v1.25.15/dist/web/plugin/session-event/index.js)
-
-2. 引用插件
-
-    插件引用按目录结构参考如下:
-
-    ```
-      dist
-    ├── web
-        ├── plugin
-        │   ├── session-event
-        │   │   ├── index.js
-        |── sensorsdata.js
-    ```
-
-3. 接入代码
-
-    创建文件`autotrack.js`,然后在web网站引用即可.
-
-    请注意下方`autotrack.js`代码中关于`server_url` 接收服务地址配置信息的修改,clklog数据采集地址和神策埋点略有不同,clklog数据采集必须传入`project`和`token`参数,详细代码如下:
-
-    ```
-    (function (para) {
-      var p = para.sdk_url, n = para.name, w = window, d = document, s = 'script', x = null, y = null;
-      if (typeof (w['sensorsDataAnalytic201505']) !== 'undefined') {
-        return false;
-      }
-      w['sensorsDataAnalytic201505'] = n;
-      w[n] = w[n] || function (a) { return function () { (w[n]._q = w[n]._q || []).push([a, arguments]); } };
-      var ifs = ['track', 'quick', 'register', 'registerPage', 'registerOnce', 'trackSignup', 'trackAbtest', 'setProfile', 'setOnceProfile', 'appendProfile', 'incrementProfile', 'deleteProfile', 'unsetProfile', 'identify', 'login', 'logout', 'trackLink', 'clearAllRegister', 'getAppStatus'];
-      for (var i = 0; i < ifs.length; i++) {
-        w[n][ifs[i]] = w[n].call(null, ifs[i]);
-      }
-      if (!w[n]._t) {
-        x = d.createElement(s), y = d.getElementsByTagName(s)[0];
-        x.async = 1;
-        x.src = 'plugin/session-event/index.js';//引用的session-event插件路径
-        x.setAttribute('charset', 'UTF-8');
-        w[n].para = para;
-        y.parentNode.insertBefore(x, y);
-        x = d.createElement(s), y = d.getElementsByTagName(s)[0];
-        x.async = 1;
-        x.src = p;
-        x.setAttribute('charset', 'UTF-8');
-        w[n].para = para;
-        y.parentNode.insertBefore(x, y);
-      }
-      sensors.quick("isReady", function () {
-        sensors.use('PageLeave', { heartbeat_interval_time: 5 });
-        sensors.use('PageLoad');
-        sensors.use('SessionEvent');
-      });
-      sensors.quick("autoTrackSinglePage")
-    })({
-      sdk_url: 'sensorsdata.js',
-      name: 'sensors',
-      show_log: true,
-      is_track_single_page: true, 
-      // send_type:'beacon',
-      server_url: 'http://10.10.222.21/clklog_receiver/api/gp?project=clklogapp&token=gfdsg325432gfsgfds', //接收地址为clklog_receiver 的接收服务地址,必须传入project和token参数
-      heatmap: {
-        clickmap: 'default', scroll_notice_map: 'default', collect_tags: {
-          div: true,
-          img: true
-        }
-      },
-      preset_properties: { latest_referrer_host: true }
-    });
-    ```
-
-- **单页面应用数据采集说明**
-
-  1)如果是单页面应用,标题不变但需要自动采集页面浏览事件,需要将`autotrack.js`中的`is_track_single_page`值设置为`ture`。
-
-  2)如果是单页面应用,标题会随着页面变化,同时也需要采集页面浏览事件,需要将`autotrack.js` 中的`is_track_single_page` 值设置为`false`,同时在页面标题改变结束后执行代码:  `sensors.quick('autoTrackSinglePage');`
-
-1. 发布WEB站点到服务器
-2. 访问站点
-
-#### 2. Android SDK埋点集成
-
-  集成方式参考 [神策Android SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/android-7541696.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
-
-#### 3. IOS SDK埋点集成
-
-  集成方式参考 [神策IOS SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/ios-7538614.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
-
-#### 4. 小程序 SDK埋点集成
-
-  集成方式参考 [神策微信小程序 SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%EF%BC%89-1573892.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
-
-## 10. 统计后台前端展示 clklog-ui
-
-1. 开发环境编译前端应用程序
-
-    本地前端代码运行步骤参考:
-
-    1)安装依赖
-
-    ```
-    npm install
-    ```
-  
-    2)启动服务
-
-    ```
-    npm run dev
-    ```
-
-    3)浏览器访问
-
-    接入埋点代码后,当统计后台前端展示页面能够正常显示统计相关数据,说明整个流程正常运行。
-
-2. 打包
-
-    ```
-    npm run build
-    ```
-
-3. 部署
-
-   将`dist`目录文件拷贝至web服务器(nginx或者apache或iis)。
+
+# 应用部署
+
+## 1.准备 linux 服务器
+
+假设IP 为 `10.10.222.21`
+
+## 2.数据库初始化
+
+<!-- > 下载源码:
+<a href="https://github.com/clklog/clklog-scripts" target="_blank">[GitHub 下载]</a> -->
+
+1. 在clickhouse里创建数据库`clklog`
+
+    ```
+    CREATE DATABASE clklog ENGINE = Atomic
+    ```
+
+2. 根据 `scripts` 下的`sql脚本.txt`文件创建表
+
+## 3.部署接收服务 clklog-receiver
+
+<!-- > 下载源码:
+<a href="https://github.com/clklog/clklog-receiver" target="_blank">[GitHub 下载]</a> -->
+
+1. 编译应用程序
+
+2. 上传程序文件
+
+    将`clklog_receiver.jar`包和 `application.yml`文件拷贝至`/usr/local/services/`目录:
+
+    ```
+    cd /usr/local/services/
+    mkdir clklogreceiver
+    chmod 500 clklog_receiver.jar
+    ```
+
+3. 修改配置文件
+
+    根据前面安装的组件配置,修改`application.yml`中`redis`、`kafka`相关配置,代码如下:
+
+    ```
+    server: 
+      tomcat: 
+        #日志配配置
+        accesslog: 
+          #目录
+          directory: /usr/local/services/receiverlogs      
+    logging:
+      file:
+        path: log
+    spring:
+      kafka:
+        bootstrap-servers: localhost:9092
+      redis:
+        # 单机配置
+        host: localhost
+        port: 6379
+        # password: nW2zFwS41tdf
+        # 哨兵配置
+        # sentinel:
+        # master: gct
+        # nodes: 10.100.2.1:26379,10.100.2.2:26379,10.100.2.3:26379
+    receiver: 
+      app-list: clklogapp
+    ```
+
+4. 创建服务
+
+    ```
+    vim /etc/systemd/system/clklogreceiver.service
+    ```
+
+    内容如下:
+
+    ```
+    [Unit]
+    Description=clklogreceiver
+    After=syslog.target
+
+    [Service]
+    ExecStart=/usr/local/services/clklogreceiver/clklog_receiver-1.0.0.jar
+    SuccessExitStatus=143
+
+    [Install]
+    WantedBy=multi-user.target
+    ```
+
+    更新服务配置
+
+    ```
+    systemctl daemon-reload
+    ```
+
+5. 启动应用程序
+
+    ```
+    systemctl start clklogreceiver
+    ```
+
+## 4.部署处理服务 clklog-processing
+
+<!-- > 下载源码:
+<a href="https://github.com/clklog/clklog-processing" target="_blank">[GitHub 下载]</a> -->
+
+1. 编译应用程序
+
+2. 上传程序文件
+
+   拷贝`clklog-processing-1.0.0-jar-with-dependencies.jar`包和 `config.properties`文件至`/usr/local/services/clklogprocessing`目录
+
+    ```
+    cd /usr/local/services/
+    mkdir /usr/local/services/clklogprocessing
+    chmod 500  clklog-processing-1.0.0-jar-with-dependencies.jar
+    ```
+
+3. 修改配置项
+
+   ```
+    vim config.properties
+
+    # clickhouse 数据库连接配置
+    clickhouse.host=localhost:8123
+    clickhouse.database=clklog
+    clickhouse.username=default
+    clickhouse.password=123456
+
+    # kafka 连接配置
+    kafka.bootstrap.server=localhost:9092
+    kafka.topic=clklog
+    kafka.group-id=clklog-group
+    
+    # flink 配置
+    flink.data-source-name=KafkaSource
+    flink.checkpoint=file:///usr/local/services/clklogprocessing/checkpoints
+    flink.parallelism=1
+    ```
+
+4. 启动应用程序
+
+    ```
+    cd /usr/local/services/clklogprocessing
+
+    /usr/local/services/flink-1.14.6/bin/flink run -s file: /usr/local/services/clklogprocessing/checkpoints/41f3b324752da77ed7821033d45d1d2f/chk-2737882  -c com.zcunsoft.clklog.analysis.entry.JieXiJson /usr/local/services/clklogprocessing/clklog-processing-1.0.0-jar-with-dependencies.jar
+    ```
+
+    其中 `-s` 参数为`checkpoint`位置。对于中断后再执行的任务,需要指定该参数,如不指定则从头开始消费`kafka`消息。
+
+## 5. 部署计算脚本clklog-script
+
+<!-- > 下载脚本: <a href="https://github.com/clklog/clklog-scripts" target="_blank">[GitHub 下载]</a> -->
+
+- 计算脚本是基于Clickhouse集群中的`log_analysis`表进行多维计算,获得各个维度上的统计报表。
+    使用Cron来进行任务的定时调度。
+
+1. 创建脚本及日志存放目录
+
+    ```
+    mkdir /usr/local/services/scripts
+    mkdir /usr/local/services/scripts/sh
+    mkdir /usr/local/services/scripts/flock
+    mkdir /usr/local/services/scripts/crontab_log
+    mkdir /usr/local/services/scripts/cklog
+    ```
+
+2. 上传sh计算脚本
+
+   - **注意:上传脚本时,需设置迁移类型为ASCII(I)**
+  
+    脚本上传于`/usr/local/services/scripts/sh`目录,  为防止出现权限问题导致脚本不能执行,建议上传完脚本以后执行以下代码:
+
+    ```
+    chmod 500 *.sh
+    ```
+
+1. 修改脚本中的数据库链接配置
+
+    根据clickhouse配置,修改脚本中连接clickhouse的`用户名、密码`配置信息:
+
+    ````
+    ck_login="clickhouse-client -u default --password 123456"
+    ck_log_db="clklog."
+    ck_stat_db="clklog."
+    ````
+
+2. 设置调度任务
+
+    ```
+    crontab -e
+    ```
+
+    将 `scripts`目录下的 `定时脚本.txt`文件,内容复制过去`.wq`保存。
+
+    备注:脚本的日志在`/usr/local/services/scripts/cklog/`
+<br>
+
+## 6. 部署统计接口 clklog-api
+
+<!-- > 下载源码:
+<a href="https://github.com/clklog/clklog-api" target="_blank">[GitHub 下载]</a> -->
+
+1. 编译应用程序
+
+2. 上传程序文件
+
+   拷贝`clklog-api-1.0.0.jar`包和`application.yml`文件至`/usr/local/services/clklogapi`目录:
+
+    ```
+    cd /usr/local/services
+    mkdir /usr/local/services/clklogapi
+    chmod 500 clklog-api-1.0.0.jar
+    ```
+
+3. 修改配置文件
+
+    根据前面安装的组件配置,修改`application.yml`中的相关配置,代码如下:
+
+    ```
+    springdoc:
+      swagger-ui:
+        enabled: true
+        tagsSorter: alpha
+      api-docs:
+        path: /api/v3/api-docs
+        enabled: true
+      group-configs:
+        - group: 'default'
+          paths-to-match: '/**'
+          packages-to-scan: com.zcunsoft.tracking.api.controllers
+    server:
+      port: 8087
+    spring:
+      application.name: clklog-api
+      datasource:
+        clickhouse:
+          jdbc-url: jdbc:clickhouse://localhost:8123/clklog
+          username: default
+          password: 123456
+          driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
+          connection-timeout: 20000
+          maximum-pool-size: 5
+    logging:
+      file:
+        path: log
+    trackingapi:
+      access-control-allow-origin: "*"
+      project-name: clklogapp
+    ```
+
+4. 创建服务
+
+    ```
+    vim /etc/systemd/system/clklogapi.service
+    ```
+
+    内容如下:
+
+    ```
+    [Unit]
+    Description=clklog-api
+    After=syslog.target
+
+    [Service]
+    ExecStart=/usr/local/services/clklogapi/clklog-api-1.0.0.jar
+    SuccessExitStatus=143
+
+    [Install]
+    WantedBy=multi-user.target
+    ```
+
+    更新服务
+
+    ```
+    systemctl daemon-reload
+    ```
+
+5. 启动应用程序
+
+    ```
+    systemctl start clklogapi
+    ```
+
+## 7. nginx 路由设置参考
+
+1. 创建配置文件,设置路由
+
+    ```
+    vim /etc/nginx/conf.d/clklog.conf
+    ```
+
+    内容如下:
+
+    ```
+    upstream clklog_api_server {
+            server localhost:8087; 
+        }
+
+    upstream clklog_receiver_server {
+            server localhost:8002; 
+        }
+
+    upstream clklog_flink_server{
+            server localhost:8081; 
+        }
+
+    server {
+        listen 80;
+        listen [::]:80;
+        server_name localhost;
+
+    location / {
+                root   /usr/share/nginx/html;
+                index  index.html index.htm;
+                proxy_set_header Host $host;
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            }
+
+    location /clklog_receiver/ {
+                proxy_pass http://clklog_receiver_server/; 
+                proxy_set_header Host $host:$server_port; 
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            }
+
+    location /api/ {
+                proxy_pass http://clklog_api_server/; 
+                proxy_set_header Host $host:$server_port; 
+            }
+
+    location /api/v3/ {
+                proxy_pass http://clklog_api_server/api/v3/; 
+                proxy_set_header Host $host:$server_port; 
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            }
+
+    location /clklog_flink/ {
+                proxy_pass http://clklog_flink_server/;
+                proxy_set_header Host $host:$server_port;
+            } 
+    }
+    ```
+
+2. 重启nginx
+
+    ```
+    systemctl restart nginx
+    ```
+
+## 8. 部署环境验证
+
+1. Flink后台地址
+
+    ```
+    http://10.10.222.21/clklog_flink/#/overview
+    ```
+
+2. 日志接收地址
+
+    ```
+    http://10.10.222.21/clklog_receiver/api/gp
+    ```
+
+3. 接口地址
+
+    ```
+    http://10.10.222.21/api/doc.html#/home
+    ```
+
+## 9. sdk 埋点集成
+
+#### 1. Web JS 埋点集成参考
+
+1. 下载神策 WEB JS SDK
+
+    [下载 sensorsdata.js](https://github.com/sensorsdata/sa-sdk-javascript/blob/v1.25.15/dist/web/sensorsdata.js)
+
+    [下载插件 session-event](https://github.com/sensorsdata/sa-sdk-javascript/blob/v1.25.15/dist/web/plugin/session-event/index.js)
+
+2. 引用插件
+
+    插件引用按目录结构参考如下:
+
+    ```
+      dist
+    ├── web
+        ├── plugin
+        │   ├── session-event
+        │   │   ├── index.js
+        |── sensorsdata.js
+    ```
+
+3. 接入代码
+
+    创建文件`autotrack.js`,然后在web网站引用即可.
+
+    请注意下方`autotrack.js`代码中关于`server_url` 接收服务地址配置信息的修改,clklog数据采集地址和神策埋点略有不同,clklog数据采集必须传入`project`和`token`参数,详细代码如下:
+
+    ```
+    (function (para) {
+      var p = para.sdk_url, n = para.name, w = window, d = document, s = 'script', x = null, y = null;
+      if (typeof (w['sensorsDataAnalytic201505']) !== 'undefined') {
+        return false;
+      }
+      w['sensorsDataAnalytic201505'] = n;
+      w[n] = w[n] || function (a) { return function () { (w[n]._q = w[n]._q || []).push([a, arguments]); } };
+      var ifs = ['track', 'quick', 'register', 'registerPage', 'registerOnce', 'trackSignup', 'trackAbtest', 'setProfile', 'setOnceProfile', 'appendProfile', 'incrementProfile', 'deleteProfile', 'unsetProfile', 'identify', 'login', 'logout', 'trackLink', 'clearAllRegister', 'getAppStatus'];
+      for (var i = 0; i < ifs.length; i++) {
+        w[n][ifs[i]] = w[n].call(null, ifs[i]);
+      }
+      if (!w[n]._t) {
+        x = d.createElement(s), y = d.getElementsByTagName(s)[0];
+        x.async = 1;
+        x.src = 'plugin/session-event/index.js';//引用的session-event插件路径
+        x.setAttribute('charset', 'UTF-8');
+        w[n].para = para;
+        y.parentNode.insertBefore(x, y);
+        x = d.createElement(s), y = d.getElementsByTagName(s)[0];
+        x.async = 1;
+        x.src = p;
+        x.setAttribute('charset', 'UTF-8');
+        w[n].para = para;
+        y.parentNode.insertBefore(x, y);
+      }
+      sensors.quick("isReady", function () {
+        sensors.use('PageLeave', { heartbeat_interval_time: 5 });
+        sensors.use('PageLoad');
+        sensors.use('SessionEvent');
+      });
+      sensors.quick("autoTrackSinglePage")
+    })({
+      sdk_url: 'sensorsdata.js',
+      name: 'sensors',
+      show_log: true,
+      is_track_single_page: true, 
+      // send_type:'beacon',
+      server_url: 'http://10.10.222.21/clklog_receiver/api/gp?project=clklogapp&token=gfdsg325432gfsgfds', //接收地址为clklog_receiver 的接收服务地址,必须传入project和token参数
+      heatmap: {
+        clickmap: 'default', scroll_notice_map: 'default', collect_tags: {
+          div: true,
+          img: true
+        }
+      },
+      preset_properties: { latest_referrer_host: true }
+    });
+    ```
+
+- **单页面应用数据采集说明**
+
+  1)如果是单页面应用,标题不变但需要自动采集页面浏览事件,需要将`autotrack.js`中的`is_track_single_page`值设置为`ture`。
+
+  2)如果是单页面应用,标题会随着页面变化,同时也需要采集页面浏览事件,需要将`autotrack.js` 中的`is_track_single_page` 值设置为`false`,同时在页面标题改变结束后执行代码:  `sensors.quick('autoTrackSinglePage');`
+
+1. 发布WEB站点到服务器
+2. 访问站点
+
+#### 2. Android SDK埋点集成
+
+  集成方式参考 [神策Android SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/android-7541696.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
+
+#### 3. IOS SDK埋点集成
+
+  集成方式参考 [神策IOS SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/ios-7538614.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
+
+#### 4. 小程序 SDK埋点集成
+
+  集成方式参考 [神策微信小程序 SDK集成文档](https://manual.sensorsdata.cn/sa/latest/zh_cn/%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3%EF%BC%88%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%EF%BC%89-1573892.html) , 集成时将数据接收地址更换成clklog_receiver的接收服务地址。
+
+## 10. 统计后台前端展示 clklog-ui
+
+1. 开发环境编译前端应用程序
+
+    本地前端代码运行步骤参考:
+
+    1)安装依赖
+
+    ```
+    npm install
+    ```
+  
+    2)启动服务
+
+    ```
+    npm run dev
+    ```
+
+    3)浏览器访问
+
+    接入埋点代码后,当统计后台前端展示页面能够正常显示统计相关数据,说明整个流程正常运行。
+
+2. 打包
+
+    ```
+    npm run build
+    ```
+
+3. 部署
+
+   将`dist`目录文件拷贝至web服务器(nginx或者apache或iis)。

+ 260 - 260
quickstart/preparation.md

@@ -1,260 +1,260 @@
-
-# 环境配置
-
-## 环境准备
-<!-- - Ubuntu SMP -->
-- CentOS 7
-- JDK 1.8
-- Nginx 1.18
-- Redis 3.2.4
-- Zookeeper 3.7.1
-- Kafka 2.12-3.3.1
-- Flink 1.14.6
-- Clickhouse 23.2.1
-- nodejs >= 8.9
-- npm >=3.0.0
-
-# 初始化步骤参考
-
-创建安装目录
-
-```
-mkdir /usr/local/services
-```
-
-## Java 1.8 安装参考
-
-下载 jdk-8u211-linux-x64.rpm
-
-```
-rpm -ivh jdk-8u211-linux-x64.rpm
-```
-
-## nginx 安装参考
-
-```
-yum install nginx
-systemctl start nginx
-```
-
-- ###### [nginx安装注意事项](question.md#nginx安装注意事项)
-
-## Redis 3.2.4 安装参考
-
-1. 从 Redis 官网下载安装包
-
-    ```
-    wget https://download.redis.io/releases/redis-3.2.4.tar.gz
-    ```
-
-2. 解压
-
-    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`redis`安装目录:
-
-    ```
-    cd /usr/local/services/
-    tar xzf redis-3.2.4.tar.gz
-    cd redis-3.2.4
-    ```
-
-3. 编译
-
-    ```
-    make
-    ```
-
-4. 安装
-
-    ```
-    make install
-    ```
-
-    默认情况下,Redis 会被安装在`/usr/local/bin`目录下
-
-- ###### [redis安装注意事项](question.md#redis安装注意事项)
-
-5. 修改配置
-
-    拷贝`redis.conf` 至`/etc/redis/redis.conf`
-
-    ```
-    mkdir /etc/redis
-    cp redis.conf /etc/redis/redis.conf
-    ```
-
-    修改配置文件:`/etc/redis/redis.conf`
-
-    ```
-    vim /etc/redis/redis.conf
-
-    protected-mode no
-    daemonize yes
-    appendonly yes
-    ```  
-
-6. 启动服务
-
-    ```
-    /usr/local/bin/redis-server /etc/redis/redis.conf
-    ```
-
-7. 检查安装是否成功
-
-    ```
-    cd /usr/local/bin
-    ./redis-cli
-    ```
-
-<br>
-
-## Zookeeper 3.7.1 安装参考
-
-1. 从  Zookeeper  官网下载安装包
-
-    ```
-    wget --no-check-certificate https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
-    ```
-
-2. 解压
-
-    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`Zookeeper`安装目录:
-
-    ```
-    cd /usr/local/services/
-    tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
-    cd apache-zookeeper-3.7.1-bin
-    ```
-
-3. 修改配置
-
-    拷贝配置文件,并增加配置项
-
-    ```
-    cp ./conf/zoo_sample.cfg ./conf/zoo.cfg
-
-    admin.serverPort=8887
-    ```
-
-4. 启动zk
-
-    ```
-    ./bin/zkServer.sh start
-    ```
-
-5. 检查
-
-    ```
-    ./bin/zkServer.sh status
-    ```
-
-    ![](/assets/imgs/zookeepercheck.png)
-
-    未启动成功,从`./logs`里查看启动日志
-
-<br>
-
-## Kafka 2.12-3.3.1 安装参考
-
-1. 从 Kafka 官网下载安装包
-
-    ```
-    wget --no-check-certificate https://archive.apache.org/dist/kafka/3.3.1/kafka_2.12-3.3.1.tgz
-    ```
-
-2. 解压
-
-    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`Kafka`安装目录:
-
-    ```
-    cd /usr/local/services/
-    tar -xzf kafka_2.12-3.3.1.tgz
-    cd kafka_2.12-3.3.1
-    ```
-
-3. 启动
-
-    ```
-    ./bin/kafka-server-start.sh  -daemon config/server.properties
-    ```
-
-4. 检查
-
-    创建名为`test`的`topic`
-
-    ```
-    ./bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --replication-factor 1 --partitions 1 --topic test
-    ```
-
-    ![](/assets/imgs/createtop.png)
-
-    查看`topic`
-
-    ```
-    ./bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --describe --topic test
-    ```
-
-    ![](/assets/imgs/checktopic.png)
-
-    不报错正常,如果未启动成功,从`./logs`里查看启动日志
-
-## Flink 1.14.6 安装参考
-
-1. 从 Flink官网下载安装包
-
-    ```
-    wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz
-    ```
-
-2. 解压
-
-    将安装包拷贝至`/usr/local/services/`目录,重命名为`flink-1.14.6.tgz`后解压, 解压后进入`Flink`安装目录:
-
-    ```
-    cd /usr/local/services/
-    mv flink-1.14.6-bin-scala_2.12.tgz flink-1.14.6.tgz
-    tar -xzf flink-1.14.6.tgz
-    cd flink-1.14.6
-    ```
-
-3. 启动
-
-    ```
-    ./bin/start-cluster.sh
-    ```
-
-4. 检查
-
-    <http://localhost:8081/>
-
-    ![](/assets/imgs/preview.png)
-
-## Clickhouse 23.2.1 安装参考
-
-1. 安装clickhouse
-
-    ```
-    yum install -y yum-utils
-    rpm --import https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
-    yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
-    yum install clickhouse-server clickhouse-client
-    ```
-
-2. 修改用户验证信息
-
-    修改`/etc/clickhouse-server/users.xml`文件,在<users>标签下设置用户验证信息。比如,我们设定一个用户名为`default`,密码为`123456`。
-
-    更多设置请参考ClickHouse官方文档。
-
-3. 启动数据库
-
-    ```
-    sudo systemctl enable clickhouse-server  
-    sudo systemctl start clickhouse-server  
-    sudo systemctl status clickhouse-server  
-    ```
-
-4. 登录数据库
-
-    ```
-    clickhouse-client -u default --password 123456
-    ```
+
+# 环境配置
+
+## 环境准备
+<!-- - Ubuntu SMP -->
+- CentOS 7
+- JDK 1.8
+- Nginx 1.18
+- Redis 3.2.4
+- Zookeeper 3.7.1
+- Kafka 2.12-3.3.1
+- Flink 1.14.6
+- Clickhouse 23.2.1
+- nodejs >= 8.9
+- npm >=3.0.0
+
+# 初始化步骤参考
+
+创建安装目录
+
+```
+mkdir /usr/local/services
+```
+
+## Java 1.8 安装参考
+
+下载 jdk-8u211-linux-x64.rpm
+
+```
+rpm -ivh jdk-8u211-linux-x64.rpm
+```
+
+## nginx 安装参考
+
+```
+yum install nginx
+systemctl start nginx
+```
+
+- ###### [nginx安装注意事项](question.md#nginx安装注意事项)
+
+## Redis 3.2.4 安装参考
+
+1. 从 Redis 官网下载安装包
+
+    ```
+    wget https://download.redis.io/releases/redis-3.2.4.tar.gz
+    ```
+
+2. 解压
+
+    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`redis`安装目录:
+
+    ```
+    cd /usr/local/services/
+    tar xzf redis-3.2.4.tar.gz
+    cd redis-3.2.4
+    ```
+
+3. 编译
+
+    ```
+    make
+    ```
+
+4. 安装
+
+    ```
+    make install
+    ```
+
+    默认情况下,Redis 会被安装在`/usr/local/bin`目录下
+
+- ###### [redis安装注意事项](question.md#redis安装注意事项)
+
+5. 修改配置
+
+    拷贝`redis.conf` 至`/etc/redis/redis.conf`
+
+    ```
+    mkdir /etc/redis
+    cp redis.conf /etc/redis/redis.conf
+    ```
+
+    修改配置文件:`/etc/redis/redis.conf`
+
+    ```
+    vim /etc/redis/redis.conf
+
+    protected-mode no
+    daemonize yes
+    appendonly yes
+    ```  
+
+6. 启动服务
+
+    ```
+    /usr/local/bin/redis-server /etc/redis/redis.conf
+    ```
+
+7. 检查安装是否成功
+
+    ```
+    cd /usr/local/bin
+    ./redis-cli
+    ```
+
+<br>
+
+## Zookeeper 3.7.1 安装参考
+
+1. 从  Zookeeper  官网下载安装包
+
+    ```
+    wget --no-check-certificate https://dlcdn.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
+    ```
+
+2. 解压
+
+    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`Zookeeper`安装目录:
+
+    ```
+    cd /usr/local/services/
+    tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
+    cd apache-zookeeper-3.7.1-bin
+    ```
+
+3. 修改配置
+
+    拷贝配置文件,并增加配置项
+
+    ```
+    cp ./conf/zoo_sample.cfg ./conf/zoo.cfg
+
+    admin.serverPort=8887
+    ```
+
+4. 启动zk
+
+    ```
+    ./bin/zkServer.sh start
+    ```
+
+5. 检查
+
+    ```
+    ./bin/zkServer.sh status
+    ```
+
+    ![](/assets/imgs/zookeepercheck.png)
+
+    未启动成功,从`./logs`里查看启动日志
+
+<br>
+
+## Kafka 2.12-3.3.1 安装参考
+
+1. 从 Kafka 官网下载安装包
+
+    ```
+    wget --no-check-certificate https://archive.apache.org/dist/kafka/3.3.1/kafka_2.12-3.3.1.tgz
+    ```
+
+2. 解压
+
+    将安装包拷贝至`/usr/local/services/`目录并解压, 解压后进入`Kafka`安装目录:
+
+    ```
+    cd /usr/local/services/
+    tar -xzf kafka_2.12-3.3.1.tgz
+    cd kafka_2.12-3.3.1
+    ```
+
+3. 启动
+
+    ```
+    ./bin/kafka-server-start.sh  -daemon config/server.properties
+    ```
+
+4. 检查
+
+    创建名为`test`的`topic`
+
+    ```
+    ./bin/kafka-topics.sh --create --bootstrap-server 127.0.0.1:9092 --replication-factor 1 --partitions 1 --topic test
+    ```
+
+    ![](/assets/imgs/createtop.png)
+
+    查看`topic`
+
+    ```
+    ./bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --describe --topic test
+    ```
+
+    ![](/assets/imgs/checktopic.png)
+
+    不报错正常,如果未启动成功,从`./logs`里查看启动日志
+
+## Flink 1.14.6 安装参考
+
+1. 从 Flink官网下载安装包
+
+    ```
+    wget https://archive.apache.org/dist/flink/flink-1.14.6/flink-1.14.6-bin-scala_2.12.tgz
+    ```
+
+2. 解压
+
+    将安装包拷贝至`/usr/local/services/`目录,重命名为`flink-1.14.6.tgz`后解压, 解压后进入`Flink`安装目录:
+
+    ```
+    cd /usr/local/services/
+    mv flink-1.14.6-bin-scala_2.12.tgz flink-1.14.6.tgz
+    tar -xzf flink-1.14.6.tgz
+    cd flink-1.14.6
+    ```
+
+3. 启动
+
+    ```
+    ./bin/start-cluster.sh
+    ```
+
+4. 检查
+
+    <http://localhost:8081/>
+
+    ![](/assets/imgs/preview.png)
+
+## Clickhouse 23.2.1 安装参考
+
+1. 安装clickhouse
+
+    ```
+    yum install -y yum-utils
+    rpm --import https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
+    yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
+    yum install clickhouse-server clickhouse-client
+    ```
+
+2. 修改用户验证信息
+
+    修改`/etc/clickhouse-server/users.xml`文件,在<users>标签下设置用户验证信息。比如,我们设定一个用户名为`default`,密码为`123456`。
+
+    更多设置请参考ClickHouse官方文档。
+
+3. 启动数据库
+
+    ```
+    sudo systemctl enable clickhouse-server  
+    sudo systemctl start clickhouse-server  
+    sudo systemctl status clickhouse-server  
+    ```
+
+4. 登录数据库
+
+    ```
+    clickhouse-client -u default --password 123456
+    ```

+ 76 - 76
quickstart/question.md

@@ -1,76 +1,76 @@
-# 常见问题
-
-- ## nginx安装注意事项
-
-    如下图所示,yum install nginx 安装nginx可能会出现没有本地yum源中没有nginx的情况
-
-    ![](assets/imgs/nginxinstallerror.png)
-
-    出现这个的原因是因为本地yum源中没有我们想要的nginx,那么我们就需要创建一个/etc/yum.repos.d/nginx.repo的文件,新增一个yum源。
-
-1. 创建nginx.repo的文件
-
-    ```
-    vi /etc/yum.repos.d/nginx.repo
-    ```
-
-2. 在文件中写入以下内容
-
-    ```
-    [nginx]
-    name=nginx repo
-    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
-    gpgcheck=0
-    enabled=1
-    ```
-
-3. 退出保存后,重新执行安装
-
-    [查看nginx安装步骤](preparation.md#nginx安装注意事项)
-
-- ## redis安装注意事项
-
-    如下图所示,make install 安装redis可能会出现系统无gcc环境的情况
-
-    ![](assets/imgs/redisinstallerror.png)
-
-    解决方案如下:
-
-1. 安装gcc
-
-    ```
-    yum install gcc-c++
-    ```
-
-2. 清空上次编译失败残留文件
-
-    ```
-    yum make distclean
-    ```
-
-3. 执行编译及安装
-
-    ```
-    yum make install
-    ```
-
-    [查看Redis安装步骤](preparation.md#redis安装注意事项)
-
-- ## nginx 出现权限问题(13:Permission denied)
-
-    解决方案如下:
-
-1. 将SELINUX=enforcing 修改为 SELINUX=disabled 状态
-
-    ```
-    vi /etc/selinux/config
-    
-    #SELINUX=enforcing
-    SELINUX=disabled
-    ```
-
-2. 重启生效
-
-    ```
-    reboot
-    ```
+# 常见问题
+
+- ## nginx安装注意事项
+
+    如下图所示,yum install nginx 安装nginx可能会出现没有本地yum源中没有nginx的情况
+
+    ![](assets/imgs/nginxinstallerror.png)
+
+    出现这个的原因是因为本地yum源中没有我们想要的nginx,那么我们就需要创建一个/etc/yum.repos.d/nginx.repo的文件,新增一个yum源。
+
+1. 创建nginx.repo的文件
+
+    ```
+    vi /etc/yum.repos.d/nginx.repo
+    ```
+
+2. 在文件中写入以下内容
+
+    ```
+    [nginx]
+    name=nginx repo
+    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
+    gpgcheck=0
+    enabled=1
+    ```
+
+3. 退出保存后,重新执行安装
+
+    [查看nginx安装步骤](preparation.md#nginx安装注意事项)
+
+- ## redis安装注意事项
+
+    如下图所示,make install 安装redis可能会出现系统无gcc环境的情况
+
+    ![](assets/imgs/redisinstallerror.png)
+
+    解决方案如下:
+
+1. 安装gcc
+
+    ```
+    yum install gcc-c++
+    ```
+
+2. 清空上次编译失败残留文件
+
+    ```
+    yum make distclean
+    ```
+
+3. 执行编译及安装
+
+    ```
+    yum make install
+    ```
+
+    [查看Redis安装步骤](preparation.md#redis安装注意事项)
+
+- ## nginx 出现权限问题(13:Permission denied)
+
+    解决方案如下:
+
+1. 将SELINUX=enforcing 修改为 SELINUX=disabled 状态
+
+    ```
+    vi /etc/selinux/config
+    
+    #SELINUX=enforcing
+    SELINUX=disabled
+    ```
+
+2. 重启生效
+
+    ```
+    reboot
+    ```

Some files were not shown because too many files changed in this diff