Browse Source

first commit

liuhairui 5 months ago
parent
commit
9cc01a3cf2
100 changed files with 8148 additions and 0 deletions
  1. 7 0
      public/.htaccess
  2. 2469 0
      public/assets/addons/cms/css/common.css
  3. 39 0
      public/assets/addons/cms/css/iconfont.css
  4. 39 0
      public/assets/addons/cms/css/jquery.autocomplete.min.css
  5. 78 0
      public/assets/addons/cms/css/jquery.tagsinput.min.css
  6. 0 0
      public/assets/addons/cms/css/share.min.css
  7. 136 0
      public/assets/addons/cms/css/simtree.css
  8. 11 0
      public/assets/addons/cms/css/swiper.min.css
  9. 260 0
      public/assets/addons/cms/css/tinycss.css
  10. 31 0
      public/assets/addons/cms/fonts/iconfont/iconfont.svg
  11. BIN
      public/assets/addons/cms/fonts/iconfont/iconfont.ttf
  12. BIN
      public/assets/addons/cms/fonts/iconfont/iconfont.woff
  13. BIN
      public/assets/addons/cms/fonts/iconfont/iconfont.woff2
  14. BIN
      public/assets/addons/cms/fonts/share/share.eot
  15. 88 0
      public/assets/addons/cms/fonts/share/share.svg
  16. BIN
      public/assets/addons/cms/fonts/share/share.ttf
  17. BIN
      public/assets/addons/cms/fonts/share/share.woff
  18. 56 0
      public/assets/addons/cms/hybrid/html/index.html
  19. 93 0
      public/assets/addons/cms/hybrid/html/js/h5-uploader.js
  20. BIN
      public/assets/addons/cms/img/1110x300.png
  21. BIN
      public/assets/addons/cms/img/140x50.png
  22. BIN
      public/assets/addons/cms/img/150x50.png
  23. BIN
      public/assets/addons/cms/img/650x270.png
  24. BIN
      public/assets/addons/cms/img/720x300.png
  25. BIN
      public/assets/addons/cms/img/720x600.png
  26. BIN
      public/assets/addons/cms/img/750x340.png
  27. BIN
      public/assets/addons/cms/img/800x600-1.png
  28. BIN
      public/assets/addons/cms/img/800x600-2.png
  29. BIN
      public/assets/addons/cms/img/800x600-3.png
  30. BIN
      public/assets/addons/cms/img/800x600-4.png
  31. BIN
      public/assets/addons/cms/img/800x600.png
  32. BIN
      public/assets/addons/cms/img/author-head.jpeg
  33. BIN
      public/assets/addons/cms/img/border.png
  34. BIN
      public/assets/addons/cms/img/colorful.png
  35. BIN
      public/assets/addons/cms/img/icons.png
  36. 1 0
      public/assets/addons/cms/img/icons.svg
  37. BIN
      public/assets/addons/cms/img/loader.gif
  38. BIN
      public/assets/addons/cms/img/loading.gif
  39. BIN
      public/assets/addons/cms/img/logo.png
  40. BIN
      public/assets/addons/cms/img/new.png
  41. BIN
      public/assets/addons/cms/img/noimage.jpg
  42. BIN
      public/assets/addons/cms/img/noimage.png
  43. BIN
      public/assets/addons/cms/img/overlay.png
  44. BIN
      public/assets/addons/cms/img/plus.png
  45. BIN
      public/assets/addons/cms/img/qrcode.png
  46. BIN
      public/assets/addons/cms/img/search.png
  47. 8 0
      public/assets/addons/cms/img/search.svg
  48. BIN
      public/assets/addons/cms/img/statusbar.png
  49. BIN
      public/assets/addons/cms/img/tabbar/article-hl.png
  50. BIN
      public/assets/addons/cms/img/tabbar/article.png
  51. BIN
      public/assets/addons/cms/img/tabbar/download-hl.png
  52. BIN
      public/assets/addons/cms/img/tabbar/download.png
  53. BIN
      public/assets/addons/cms/img/tabbar/home-hl.png
  54. BIN
      public/assets/addons/cms/img/tabbar/home.png
  55. BIN
      public/assets/addons/cms/img/tabbar/image-hl.png
  56. BIN
      public/assets/addons/cms/img/tabbar/image.png
  57. BIN
      public/assets/addons/cms/img/tabbar/my-hl.png
  58. BIN
      public/assets/addons/cms/img/tabbar/my.png
  59. BIN
      public/assets/addons/cms/img/tabbar/special-hl.png
  60. BIN
      public/assets/addons/cms/img/tabbar/special.png
  61. BIN
      public/assets/addons/cms/img/wave-bot.png
  62. BIN
      public/assets/addons/cms/img/wave-mid.png
  63. BIN
      public/assets/addons/cms/img/wave-top.png
  64. 31 0
      public/assets/addons/cms/js/base.js
  65. 9 0
      public/assets/addons/cms/js/bootstrap-typeahead.min.js
  66. 6 0
      public/assets/addons/cms/js/clipboard.min.js
  67. 171 0
      public/assets/addons/cms/js/cms.js
  68. 467 0
      public/assets/addons/cms/js/common.js
  69. 215 0
      public/assets/addons/cms/js/jquery.autocomplete.js
  70. 24 0
      public/assets/addons/cms/js/jquery.colorpicker.min.js
  71. 429 0
      public/assets/addons/cms/js/jquery.tagsinput.js
  72. 0 0
      public/assets/addons/cms/js/share.min.js
  73. 534 0
      public/assets/addons/cms/js/simtree.js
  74. 11 0
      public/assets/addons/cms/js/swiper.min.js
  75. 2714 0
      public/assets/addons/cms/less/common.less
  76. 161 0
      public/assets/addons/cms/less/simtree.less
  77. 34 0
      public/assets/addons/cms/less/tinycss.less
  78. 25 0
      public/assets/addons/cms/preview.html
  79. 1 0
      public/assets/addons/cms/static/config.js
  80. BIN
      public/assets/addons/cms/static/favicon.ico
  81. BIN
      public/assets/addons/cms/static/home.png
  82. BIN
      public/assets/addons/cms/static/image/0.png
  83. BIN
      public/assets/addons/cms/static/image/1.png
  84. BIN
      public/assets/addons/cms/static/image/2.png
  85. BIN
      public/assets/addons/cms/static/image/select.png
  86. BIN
      public/assets/addons/cms/static/img/select.bd08ec9a.png
  87. 0 0
      public/assets/addons/cms/static/index.css
  88. 0 0
      public/assets/addons/cms/static/js/chunk-vendors.348cced0.js
  89. 0 0
      public/assets/addons/cms/static/js/image-resize.min.js
  90. 0 0
      public/assets/addons/cms/static/js/index.5f4c8553.js
  91. 0 0
      public/assets/addons/cms/static/js/pages-article-article.be29efec.js
  92. 0 0
      public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-detail~pages-diyform-lists~pages-index-inde~3bf1a1f5.bf0098f4.js
  93. 0 0
      public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-detail~pages-diyform-lists~pages-index-inde~90f14013.6e595e46.js
  94. 0 0
      public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-lists~pages-index-index~pages-my-article~pa~ea72029b.8b72d01e.js
  95. 0 0
      public/assets/addons/cms/static/js/pages-article-article~pages-diyform-lists~pages-index-index~pages-my-article~pages-my-collection~pag~cb0ec229.2fd64e27.js
  96. 0 0
      public/assets/addons/cms/static/js/pages-article-detail.7f999adb.js
  97. 0 0
      public/assets/addons/cms/static/js/pages-article-detail~pages-login-forgetpwd~pages-login-login~pages-login-mobilelogin~pages-login-reg~e4702bbc.61cfa617.js
  98. 0 0
      public/assets/addons/cms/static/js/pages-diyform-detail.cc15c740.js
  99. 0 0
      public/assets/addons/cms/static/js/pages-diyform-detail~pages-my-aboutus~pages-my-agreement~pages-page-detail.7231a318.js
  100. 0 0
      public/assets/addons/cms/static/js/pages-diyform-lists.3683a181.js

+ 7 - 0
public/.htaccess

@@ -0,0 +1,7 @@
+<IfModule mod_rewrite.c>
+Options +FollowSymlinks -Multiviews
+RewriteEngine on
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteRule ^(.*)$ KJxPluQiNC.php?/$1 [QSA,PT,L]
+</IfModule>

+ 2469 - 0
public/assets/addons/cms/css/common.css

@@ -0,0 +1,2469 @@
+.m-0 {
+  margin-top: 0px !important;
+  margin-right: 0px !important;
+  margin-bottom: 0px !important;
+  margin-left: 0px !important;
+}
+.mt-0 {
+  margin-top: 0px !important;
+}
+.mr-0 {
+  margin-right: 0px !important;
+}
+.mb-0 {
+  margin-bottom: 0px !important;
+}
+.ml-0 {
+  margin-left: 0px !important;
+}
+.mx-0 {
+  margin-left: 0px !important;
+  margin-right: 0px !important;
+}
+.my-0 {
+  margin-top: 0px !important;
+  margin-bottom: 0px !important;
+}
+.m-1 {
+  margin-top: 5px !important;
+  margin-right: 5px !important;
+  margin-bottom: 5px !important;
+  margin-left: 5px !important;
+}
+.mt-1 {
+  margin-top: 5px !important;
+}
+.mr-1 {
+  margin-right: 5px !important;
+}
+.mb-1 {
+  margin-bottom: 5px !important;
+}
+.ml-1 {
+  margin-left: 5px !important;
+}
+.mx-1 {
+  margin-left: 5px !important;
+  margin-right: 5px !important;
+}
+.my-1 {
+  margin-top: 5px !important;
+  margin-bottom: 5px !important;
+}
+.m-2 {
+  margin-top: 10px !important;
+  margin-right: 10px !important;
+  margin-bottom: 10px !important;
+  margin-left: 10px !important;
+}
+.mt-2 {
+  margin-top: 10px !important;
+}
+.mr-2 {
+  margin-right: 10px !important;
+}
+.mb-2 {
+  margin-bottom: 10px !important;
+}
+.ml-2 {
+  margin-left: 10px !important;
+}
+.mx-2 {
+  margin-left: 10px !important;
+  margin-right: 10px !important;
+}
+.my-2 {
+  margin-top: 10px !important;
+  margin-bottom: 10px !important;
+}
+.m-3 {
+  margin-top: 15px !important;
+  margin-right: 15px !important;
+  margin-bottom: 15px !important;
+  margin-left: 15px !important;
+}
+.mt-3 {
+  margin-top: 15px !important;
+}
+.mr-3 {
+  margin-right: 15px !important;
+}
+.mb-3 {
+  margin-bottom: 15px !important;
+}
+.ml-3 {
+  margin-left: 15px !important;
+}
+.mx-3 {
+  margin-left: 15px !important;
+  margin-right: 15px !important;
+}
+.my-3 {
+  margin-top: 15px !important;
+  margin-bottom: 15px !important;
+}
+.m-4 {
+  margin-top: 20px !important;
+  margin-right: 20px !important;
+  margin-bottom: 20px !important;
+  margin-left: 20px !important;
+}
+.mt-4 {
+  margin-top: 20px !important;
+}
+.mr-4 {
+  margin-right: 20px !important;
+}
+.mb-4 {
+  margin-bottom: 20px !important;
+}
+.ml-4 {
+  margin-left: 20px !important;
+}
+.mx-4 {
+  margin-left: 20px !important;
+  margin-right: 20px !important;
+}
+.my-4 {
+  margin-top: 20px !important;
+  margin-bottom: 20px !important;
+}
+.p-0 {
+  padding-top: 0px !important;
+  padding-right: 0px !important;
+  padding-bottom: 0px !important;
+  padding-left: 0px !important;
+}
+.pt-0 {
+  padding-top: 0px !important;
+}
+.pr-0 {
+  padding-right: 0px !important;
+}
+.pb-0 {
+  padding-bottom: 0px !important;
+}
+.pl-0 {
+  padding-left: 0px !important;
+}
+.px-0 {
+  padding-left: 0px !important;
+  padding-right: 0px !important;
+}
+.py-0 {
+  padding-top: 0px !important;
+  padding-bottom: 0px !important;
+}
+.p-1 {
+  padding-top: 5px !important;
+  padding-right: 5px !important;
+  padding-bottom: 5px !important;
+  padding-left: 5px !important;
+}
+.pt-1 {
+  padding-top: 5px !important;
+}
+.pr-1 {
+  padding-right: 5px !important;
+}
+.pb-1 {
+  padding-bottom: 5px !important;
+}
+.pl-1 {
+  padding-left: 5px !important;
+}
+.px-1 {
+  padding-left: 5px !important;
+  padding-right: 5px !important;
+}
+.py-1 {
+  padding-top: 5px !important;
+  padding-bottom: 5px !important;
+}
+.p-2 {
+  padding-top: 10px !important;
+  padding-right: 10px !important;
+  padding-bottom: 10px !important;
+  padding-left: 10px !important;
+}
+.pt-2 {
+  padding-top: 10px !important;
+}
+.pr-2 {
+  padding-right: 10px !important;
+}
+.pb-2 {
+  padding-bottom: 10px !important;
+}
+.pl-2 {
+  padding-left: 10px !important;
+}
+.px-2 {
+  padding-left: 10px !important;
+  padding-right: 10px !important;
+}
+.py-2 {
+  padding-top: 10px !important;
+  padding-bottom: 10px !important;
+}
+.p-3 {
+  padding-top: 15px !important;
+  padding-right: 15px !important;
+  padding-bottom: 15px !important;
+  padding-left: 15px !important;
+}
+.pt-3 {
+  padding-top: 15px !important;
+}
+.pr-3 {
+  padding-right: 15px !important;
+}
+.pb-3 {
+  padding-bottom: 15px !important;
+}
+.pl-3 {
+  padding-left: 15px !important;
+}
+.px-3 {
+  padding-left: 15px !important;
+  padding-right: 15px !important;
+}
+.py-3 {
+  padding-top: 15px !important;
+  padding-bottom: 15px !important;
+}
+.p-4 {
+  padding-top: 20px !important;
+  padding-right: 20px !important;
+  padding-bottom: 20px !important;
+  padding-left: 20px !important;
+}
+.pt-4 {
+  padding-top: 20px !important;
+}
+.pr-4 {
+  padding-right: 20px !important;
+}
+.pb-4 {
+  padding-bottom: 20px !important;
+}
+.pl-4 {
+  padding-left: 20px !important;
+}
+.px-4 {
+  padding-left: 20px !important;
+  padding-right: 20px !important;
+}
+.py-4 {
+  padding-top: 20px !important;
+  padding-bottom: 20px !important;
+}
+html,
+body {
+  height: 100%;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  -moz-osx-font-smoothing: grayscale;
+  font-feature-settings: 'liga';
+  -webkit-text-size-adjust: 100%;
+  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Ubuntu, Helvetica Neue, Helvetica, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei UI, Microsoft YaHei, Source Han Sans CN, sans-serif;
+  font-weight: 400;
+  background: #f4f6f8;
+  font-size: 14px;
+  color: #555;
+}
+body {
+  padding-top: 70px;
+}
+a {
+  color: #555;
+}
+a:hover,
+a:focus {
+  color: #007bff;
+}
+a.primary-link {
+  color: #007bff;
+}
+.btn {
+  font-size: 13px;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary:active:focus {
+  color: #fff;
+  background-color: #0062cc;
+  border-color: #0062cc;
+}
+.btn-gray {
+  color: #212529;
+  background-color: #f8f9fa;
+  border-color: #f8f9fa;
+}
+.btn-gray:hover {
+  color: #212529;
+  background-color: #e2e6ea;
+  border-color: #dae0e5;
+}
+.btn-light {
+  color: #007bff;
+  background: #b3d7ff;
+  border-color: transparent;
+}
+.btn-light:hover {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+.label-primary {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+.btn-outline-primary {
+  color: #007bff;
+  background-color: transparent;
+  background-image: none;
+  border-color: #007bff;
+}
+.btn-outline-primary:hover {
+  color: #fff;
+  background-color: #007bff;
+  border-color: #007bff;
+}
+.btn-lg {
+  -webkit-border-radius: 3px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 3px;
+  -moz-background-clip: padding;
+  border-radius: 3px;
+  background-clip: padding-box;
+}
+.form-control {
+  font-size: 13px;
+}
+.wow {
+  visibility: hidden;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #caced2;
+}
+.skin-white {
+  padding-top: 80px;
+}
+.navbar-white {
+  background-color: #fff;
+  border-color: #fff;
+  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.05);
+}
+.navbar-white .dropdown-menu {
+  border-radius: 5px;
+  -webkit-box-shadow: 0px 20px 30px rgba(83, 88, 93, 0.05), 0px 0px 30px rgba(83, 88, 93, 0.1);
+  -moz-box-shadow: 0px 20px 30px rgba(83, 88, 93, 0.05), 0px 0px 30px rgba(83, 88, 93, 0.1);
+  box-shadow: 0px 20px 30px rgba(83, 88, 93, 0.05), 0px 0px 30px rgba(83, 88, 93, 0.1);
+}
+@media (min-width: 768px) {
+  .navbar-default .navbar-brand {
+    height: 60px;
+    line-height: 27px;
+  }
+  .navbar-default .navbar-nav > li > a {
+    height: 60px;
+    line-height: 27px;
+  }
+  .navbar-white .navbar-nav > li > a {
+    height: 60px;
+    line-height: 27px;
+    color: #555;
+  }
+  .navbar-white .navbar-nav > li > a:hover,
+  .navbar-white .navbar-nav > li > a:focus {
+    color: #007bff;
+  }
+  .navbar-white .navbar-nav > .active > a,
+  .navbar-white .navbar-nav > .active > a:hover,
+  .navbar-white .navbar-nav > .active > a:focus {
+    background-color: inherit;
+    color: #007bff;
+  }
+}
+@media (hover: hover) {
+  .dropdown a:hover + .dropdown-menu {
+    display: block;
+    margin-top: 0;
+  }
+}
+.alert-paid {
+  margin: 10px 0;
+  text-align: center;
+}
+.alert-paid a {
+  color: #f39c12;
+}
+.navbar-inverse .navbar-nav .dropdown:hover > a {
+  color: #fff;
+  background-color: transparent;
+}
+.dropdown-menu > li > a {
+  font-size: 14px;
+  padding: 5px 20px;
+}
+.dropdown-menu {
+  border-radius: 2px;
+  border: 0px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+  padding: 5px 0px;
+}
+.dropdown-menu li a {
+  padding-top: 10px !important;
+  padding-bottom: 10px;
+}
+.dropdown-menu > li > a {
+  font-weight: 400;
+  color: #444;
+  padding: 5px 15px;
+  padding-bottom: 10px;
+  font-size: 14px;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  text-decoration: none;
+  color: #777;
+  background: rgba(0, 0, 0, 0.05);
+}
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: 0;
+  margin-left: -1px;
+  -webkit-border-radius: 3px 0 3px 3px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 3px 0 3px 3px;
+  -moz-background-clip: padding;
+  border-radius: 3px 0 3px 3px;
+  background-clip: padding-box;
+}
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+.dropdown-submenu > a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #ccc;
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu.pull-left {
+  float: none;
+}
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 3px 0 3px 3px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 3px 0 3px 3px;
+  -moz-background-clip: padding;
+  border-radius: 3px 0 3px 3px;
+  background-clip: padding-box;
+}
+.navbar-collapse.collapse.active .navbar-nav .dropdown-submenu .dropdown-menu > li > a {
+  padding-left: 45px;
+}
+.navbar {
+  border: none;
+}
+.navbar-nav li > a {
+  font-size: 14px;
+}
+.navbar-nav li > a h5 {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.navbar-nav > li > a {
+  font-size: 14px;
+}
+.navbar-nav ul.dropdown-menu {
+  border: none;
+  border-radius: 4px;
+}
+.navbar-nav ul.dropdown-menu > li.active > a {
+  color: #007bff;
+  background-color: #f5f5f5;
+}
+.navbar-nav ul.dropdown-menu > li > a {
+  padding: 8px 20px;
+}
+.navbar-brand {
+  padding: 5px 15px;
+}
+.toast-top-center {
+  top: 50px;
+}
+.toast-top-center > div {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+/*修复nice-validator新版下的一处BUG*/
+.nice-validator input,
+.nice-validator select,
+.nice-validator textarea,
+.nice-validator [contenteditable] {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+/*修复nice-validator和summernote的编辑框冲突*/
+.nice-validator .note-editor .note-editing-area .note-editable {
+  display: inherit;
+}
+/*预览区域*/
+.plupload-preview,
+.faupload-preview {
+  padding: 0 10px;
+  margin-bottom: 0;
+}
+.plupload-preview li,
+.faupload-preview li {
+  margin-top: 5px;
+  margin-bottom: 10px;
+}
+.plupload-preview .thumbnail,
+.faupload-preview .thumbnail {
+  margin-bottom: 10px;
+}
+.plupload-preview a,
+.faupload-preview a {
+  display: block;
+}
+.plupload-preview a:first-child,
+.faupload-preview a:first-child {
+  height: 90px;
+}
+.plupload-preview a img,
+.faupload-preview a img {
+  height: 80px;
+  object-fit: cover;
+}
+#floatbtn {
+  width: 50px;
+  height: auto;
+  position: fixed;
+  top: auto;
+  right: 50%;
+  bottom: 10px;
+  left: auto;
+  z-index: 80;
+  margin-right: -640px;
+}
+#floatbtn.fixed {
+  position: absolute;
+  bottom: 279px;
+  right: 50%;
+}
+#floatbtn > a,
+#floatbtn .floatbtn-item {
+  cursor: pointer;
+  position: relative;
+  z-index: 90;
+  display: block;
+  margin-top: 4px;
+  width: 50px;
+  height: 50px;
+  line-height: 50px;
+  text-align: center;
+  font-size: 20px;
+  color: #d5d5d5;
+  background-color: #fff;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+#floatbtn > a.hover:hover,
+#floatbtn .floatbtn-item.hover:hover {
+  -webkit-transition: background-color 400ms ease-out;
+  -moz-transition: background-color 400ms ease-out;
+  -o-transition: background-color 400ms ease-out;
+  transition: background-color 400ms ease-out;
+  background: #007bff;
+  text-decoration: none;
+  text-align: center;
+  line-height: 20px;
+  padding: 5px;
+}
+#floatbtn > a.hover:hover i,
+#floatbtn .floatbtn-item.hover:hover i {
+  display: none;
+}
+#floatbtn > a.hover:hover em,
+#floatbtn .floatbtn-item.hover:hover em {
+  display: block;
+  color: #fff;
+  font-size: 14px;
+  font-style: normal;
+  text-decoration: none;
+}
+#floatbtn > a em,
+#floatbtn .floatbtn-item em {
+  display: none;
+}
+#floatbtn > a:hover,
+#floatbtn .floatbtn-item:hover {
+  background: #007bff;
+}
+#floatbtn > a:hover i,
+#floatbtn .floatbtn-item:hover i {
+  color: #fff;
+}
+#floatbtn > a:hover .floatbtn-wrapper,
+#floatbtn .floatbtn-item:hover .floatbtn-wrapper {
+  display: block;
+}
+#floatbtn .iconfont {
+  display: inline-block;
+  font: normal normal normal 14px/1 iconfont;
+  font-size: inherit;
+}
+.floatbtn-wrapper {
+  position: absolute;
+  right: 59px;
+  top: -55px;
+  z-index: 120;
+  display: none;
+  width: 190px;
+  height: 212px;
+  background-color: #fff;
+  border: 1px solid #eee;
+}
+.floatbtn-wrapper:before {
+  content: "";
+  position: absolute;
+  right: -12px;
+  top: 0;
+  height: 200px;
+  width: 12px;
+  background: transparent;
+}
+.floatbtn-wrapper:after {
+  content: "";
+  position: absolute;
+  right: -6px;
+  top: 73px;
+  display: block;
+  width: 0;
+  height: 0;
+  border-left: 6px solid #d5d5d5;
+  border-top: 6px solid transparent;
+  border-bottom: 6px solid transparent;
+}
+.floatbtn-wrapper > .qrcode {
+  margin-top: 20px;
+  line-height: 1;
+}
+.floatbtn-wrapper > .qrcode > img {
+  width: 128px;
+  height: 128px;
+}
+.floatbtn-wrapper p {
+  font-size: 14px;
+  line-height: 20px;
+  color: #999;
+}
+.floatbtn-wrapper p em {
+  color: #dd3067;
+}
+.floatbtn-share .floatbtn-wrapper:after {
+  top: 18px;
+}
+.floatbtn-share .floatbtn-wrapper .social-share .icon-wechat .wechat-qrcode p {
+  font-size: 12px;
+}
+.text-primary,
+.text-primary:hover {
+  color: #444c69;
+}
+.text-success,
+.text-success:hover {
+  color: #18bc9c;
+}
+.text-danger,
+.text-danger:hover {
+  color: #f75444;
+}
+.text-warning,
+.text-warning:hover {
+  color: #f39c12;
+}
+.text-info,
+.text-info:hover {
+  color: #1688f1;
+}
+.well {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.responsive-container {
+  position: relative;
+  width: 100%;
+  border: 1px solid #f8f8f8;
+}
+footer {
+  padding: 0;
+  background: #1f2730;
+  color: #fff;
+}
+footer a {
+  color: #fff;
+}
+footer a:hover {
+  color: #007bff;
+}
+.nav-sidebar li.active a {
+  text-decoration: none;
+  background-color: #ecf0f1;
+}
+.navbar-toggle .icon-bar {
+  width: 18px;
+}
+.footer-inner {
+  padding: 2em 0;
+}
+.footer-inner .copyright {
+  margin-bottom: 20px !important;
+  line-height: 1.5;
+}
+.footer-inner .footer-logo a {
+  padding: 15px 15px;
+  background: rgba(0, 0, 0, 0.1);
+  font-size: 40px;
+  font-weight: 700;
+}
+.footer-inner .footer-logo a:hover,
+.footer-inner .footer-logo a:focus {
+  text-decoration: none;
+}
+.footer-inner h3 {
+  font-weight: 400;
+  margin-bottom: 20px;
+}
+.footer-inner p {
+  font-weight: 400;
+}
+.footer-inner p:last-child {
+  margin-bottom: 0;
+}
+.footer-inner .links {
+  padding: 0;
+  margin: 0 0 20px 0;
+}
+.footer-inner .links li {
+  list-style: none;
+  padding: 5px 0;
+}
+.footer-inner .links li a:hover {
+  text-decoration: underline;
+}
+.footer-inner .footer-social {
+  text-align: right;
+  margin-top: 0;
+}
+.footer-inner .footer-social a {
+  margin-right: 15px;
+  margin-bottom: 10px;
+  font-size: 20px;
+}
+.footer-inner .footer-social a:hover {
+  text-decoration: none;
+}
+.article-list {
+  padding: 0;
+  background: #fff;
+}
+.article-list .embed-responsive-4by3,
+.article-list .embed-responsive-square {
+  border-radius: 5px;
+}
+.article-list .article-item {
+  padding: 20px 0;
+  border-bottom: 1px solid #efefef;
+}
+.article-list .article-item .content {
+  margin-top: 15px;
+  color: #919191;
+}
+.article-list .gallery-article {
+  margin-top: 0;
+}
+.article-list .gallery-article .row {
+  margin: 0 -10px;
+}
+.article-list .gallery-article .article-title {
+  margin-bottom: 10px;
+}
+.article-list .gallery-article .article-title span.highlight {
+  color: red;
+}
+.article-list .gallery-article .media .media-body {
+  padding-left: 0;
+}
+.article-list .gallery-article .media .media-body .article-tag {
+  position: relative;
+  margin-top: 10px;
+}
+.article-list .article-title {
+  margin: 0;
+  font-size: 1.25em;
+  line-height: 1.45;
+  color: #000;
+}
+.article-list .article-title a {
+  color: #444;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.article-list .article-title a span.highlight {
+  color: red;
+}
+.article-list .article-title a:hover {
+  color: #007bff;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.article-list .article-title a .img-new {
+  margin-left: 2px;
+  margin-bottom: 2px;
+  height: 16px;
+}
+.article-list .article-intro {
+  height: 44px;
+  line-height: 22px;
+  color: #828a92;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-box-orient: vertical;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+}
+.article-list .media {
+  color: #919191;
+}
+.article-list .media .media-body {
+  padding-left: 20px;
+  line-height: 25px;
+}
+.article-list .media .media-left {
+  overflow: hidden;
+  padding: 0;
+}
+.article-list .media .media-left a {
+  display: block;
+  width: 160px;
+}
+.article-list .media-body {
+  position: relative;
+}
+.article-list .media-body .article-tag {
+  display: block;
+  clear: both;
+  position: absolute;
+  bottom: 0;
+  color: #aaa;
+  font-size: 13px;
+}
+.article-list .media-body .article-tag span {
+  margin: 0 8px;
+}
+.article-list .media-body .article-tag span a {
+  color: #aaa;
+}
+.article-list .media-body .article-tag .pull-left {
+  height: 34px;
+  line-height: 34px;
+  color: #919191;
+}
+.article-list .media-body .article-tag .pull-left a {
+  color: #919191;
+}
+.article-list .pager {
+  margin: 40px 0 20px 0;
+}
+.article-metas {
+  overflow: hidden;
+}
+.article-metas .metas-title {
+  margin: 0;
+  font-size: 1.65em;
+  line-height: 1.45;
+  margin-bottom: 5px;
+  color: #444;
+}
+.article-metas .metas-title a {
+  color: #444;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.article-metas .metas-title a:hover {
+  color: #007bff;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.article-metas .metas-body {
+  color: #999;
+  margin: 0px auto;
+}
+.article-metas .metas-body span {
+  margin-right: 10px;
+}
+.article-metas .metas-body span i {
+  margin-right: 5px;
+}
+.article-metas .metas-body p {
+  margin-bottom: 0;
+  margin-top: 0px;
+  font-size: 12px;
+}
+.article-text {
+  line-height: 30px;
+  margin-bottom: 15px;
+}
+.article-text img {
+  margin: 10px auto;
+  display: block;
+  max-width: 100%;
+  height: auto;
+  cursor: zoom-in;
+  -webkit-border-radius: 2px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 2px;
+  -moz-background-clip: padding;
+  border-radius: 2px;
+  background-clip: padding-box;
+}
+.article-text ul li {
+  line-height: 30px;
+}
+.article-text a {
+  text-decoration: none;
+  color: #007bff;
+  border-bottom: 1px solid #b3d7ff;
+}
+.article-text a img {
+  cursor: pointer;
+}
+.article-action-btn {
+  color: #999;
+}
+.article-action-btn a {
+  color: #999;
+}
+.article-action-btn .bdshare-button-style0-16 .bds_more {
+  float: none;
+  padding: 0;
+  height: inherit;
+  line-height: inherit;
+  font-size: inherit;
+  background: none;
+  color: #999;
+}
+.article-prevnext {
+  color: #666;
+}
+.entry-meta ul {
+  overflow: hidden;
+  margin: 0 0 10px 0;
+  padding: 0 0 10px 0;
+  border-bottom: 1px solid #eeeeee;
+}
+.entry-meta ul li {
+  line-height: 26px;
+}
+.related-article,
+.gallery-article {
+  margin-top: 10px;
+}
+.related-article .row,
+.gallery-article .row {
+  margin: 0 -5px;
+}
+.related-article .col-sm-3,
+.gallery-article .col-sm-3 {
+  padding: 0 10px;
+}
+.related-article .col-sm-3 a,
+.gallery-article .col-sm-3 a {
+  display: block;
+}
+.related-article .embed-responsive-4by3,
+.gallery-article .embed-responsive-4by3 {
+  border-radius: 5px;
+}
+@media (max-width: 480px) {
+  .related-article .row,
+  .gallery-article .row {
+    margin: 0 -5px !important;
+  }
+  .related-article .col-sm-3,
+  .gallery-article .col-sm-3 {
+    padding: 0 5px 10px 5px;
+  }
+}
+@media (max-width: 767px) {
+  .article-list .row,
+  .gallery-article .row {
+    margin: 0 -5px !important;
+  }
+  .article-list .col-sm-3,
+  .gallery-article .col-sm-3 {
+    padding: 0 5px 10px 5px;
+  }
+}
+@media (max-width: 1200px) {
+  .article-list .media-body .article-tag {
+    position: relative;
+    bottom: inherit;
+    margin-top: 5px;
+  }
+}
+.related-page ul li.active a {
+  color: #007bff;
+}
+.author-card {
+  background: #fff none repeat scroll 0 0;
+  /*border: 1px solid #e1e8ed;*/
+  border-radius: 4px;
+  padding-bottom: 15px;
+}
+.author-card .author-head {
+  background-image: url("../img/author-head.jpeg");
+  background-position: 0 50%;
+  background-size: 100% auto;
+  border-bottom: 1px solid #e1e8ed;
+  border-radius: 4px 4px 0 0;
+  height: 100px;
+  width: 100%;
+}
+.author-card .author-avatar {
+  text-align: center;
+}
+.author-card .author-avatar > a {
+  background-color: #fff;
+  border-radius: 50%;
+  display: inline-block;
+  margin: -40px 5px 0 0;
+  max-width: 100%;
+  padding: 1px;
+  vertical-align: bottom;
+}
+.author-card .author-avatar > a > img {
+  border: 2px solid #fff;
+  border-radius: 50%;
+  color: #fff;
+  height: 80px;
+  width: 80px;
+}
+.author-card .author-basic {
+  clear: both;
+  text-align: center;
+  width: 100%;
+  margin: 10px 0 10px 0;
+}
+.author-card .author-basic .author-nickname {
+  margin-bottom: 5px;
+}
+.author-card .author-basic .author-nickname > a {
+  font-size: 18px;
+  font-weight: 700;
+  line-height: 21px;
+}
+.author-card .author-statistics {
+  padding: 5px 0;
+  text-align: center;
+  margin: 0;
+}
+.author-card .author-statistics .statistics-text {
+  color: #777;
+  margin-bottom: 5px;
+}
+.author-card .author-statistics .statistics-nums {
+  font-size: 16px;
+  font-weight: 600;
+}
+.panel-default {
+  border: none;
+  padding: 0 15px;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  -webkit-border-radius: 2px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 2px;
+  -moz-background-clip: padding;
+  border-radius: 2px;
+  background-clip: padding-box;
+}
+.panel-default > .panel-heading {
+  position: relative;
+  padding: 15px 0;
+  background: #fff;
+  border-bottom: 1px solid #f5f5f5;
+}
+.panel-default > .panel-heading .panel-title {
+  font-size: 16px;
+  /*color: @gray-dark;*/
+}
+.panel-default > .panel-heading .panel-title > i {
+  display: none;
+}
+.panel-default > .panel-heading small {
+  font-weight: normal;
+  color: #999;
+  font-size: 13px;
+}
+.panel-default > .panel-heading .more {
+  position: absolute;
+  top: 13px;
+  right: 0;
+  display: block;
+  color: #919191;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+  font-weight: 400;
+  font-size: 13px;
+}
+.panel-default > .panel-heading .more:hover {
+  color: #616161;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.panel-default > .panel-heading div.more {
+  top: 17px;
+}
+.panel-default > .panel-heading .panel-bar {
+  position: absolute;
+  top: 7px;
+  right: 0;
+  display: block;
+}
+.panel-default > .panel-footer {
+  padding: 15px 0;
+  background: none;
+}
+.panel-default > .panel-body {
+  position: relative;
+  padding: 15px 0;
+}
+.panel-primary > .panel-heading {
+  background-color: #46c37b;
+  color: #fff;
+}
+.panel-primary > .panel-body {
+  background: #fafafa;
+  border-bottom-left-radius: 2px;
+  border-bottom-right-radius: 2px;
+}
+.panel-gray {
+  -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
+  -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);
+}
+.panel-gray > .panel-heading {
+  background-color: #f5f5f5;
+  color: #919191;
+}
+.panel-gray > .panel-body {
+  color: #919191;
+  background: #fff;
+  border-bottom-left-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.panel-page {
+  padding: 45px 50px 50px;
+  min-height: 500px;
+}
+.panel-page .panel-heading {
+  background: transparent;
+  border-bottom: none;
+  margin: 0 0 30px 0;
+  padding: 0;
+}
+.panel-page .panel-heading h2 {
+  font-size: 25px;
+  margin-top: 0;
+}
+.tabs-wrapper {
+  -webkit-border-radius: 4px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 4px;
+  -moz-background-clip: padding;
+  border-radius: 4px;
+  background-clip: padding-box;
+  background-color: #fff;
+}
+.tabs-wrapper .tabs-mark-group .title {
+  width: 90px;
+  margin-top: 3px;
+  float: left;
+}
+.tabs-wrapper .tabs-mark-group .classify {
+  margin-top: 3px;
+}
+.tabs-wrapper .tabs-mark-group .classify a,
+.tabs-wrapper .tabs-mark-group .classify i {
+  color: #919191;
+}
+.tabs-wrapper .tabs-mark-group .classify a:focus,
+.tabs-wrapper .tabs-mark-group .classify a:hover {
+  color: #43bc60;
+}
+.tabs-wrapper .tabs-mark-group .content {
+  margin-left: 100px;
+}
+.tabs-wrapper .tabs-mark {
+  margin: 0 4px;
+}
+.tabs-wrapper .tabs-mark a {
+  border: 1px solid #e4ecf3;
+  padding: 2px 5px;
+  color: #919191;
+}
+.tabs-wrapper .tabs-mark i {
+  font-size: 10px;
+  margin-left: 5px;
+}
+.tabs-wrapper .tabs-mark.active a,
+.tabs-wrapper .tabs-mark:focus a,
+.tabs-wrapper .tabs-mark:hover a {
+  color: #43bc60;
+  border: 1px solid #43bc60;
+}
+.tabs-wrapper .tabs-group {
+  position: relative;
+  overflow-y: hidden;
+}
+.tabs-wrapper .tabs-group .title {
+  float: left;
+  padding: 10px 0;
+  width: 80px;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  word-wrap: normal;
+}
+.tabs-wrapper .tabs-group .content {
+  list-style: none;
+  padding: 0;
+  margin: 0 0 0 60px;
+}
+.tabs-wrapper .tabs-group .content > li {
+  float: left;
+  padding: 5px 12px;
+}
+.tabs-wrapper .tabs-group .content > li > a {
+  display: block;
+  padding: 5px 10px;
+  border: none;
+  -webkit-border-radius: 4px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 4px;
+  -moz-background-clip: padding;
+  border-radius: 4px;
+  background-clip: padding-box;
+  color: #828a92;
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.tabs-wrapper .tabs-group .content > li.active > a,
+.tabs-wrapper .tabs-group .content > li:focus > a,
+.tabs-wrapper .tabs-group .content > li:hover > a {
+  color: #007bff;
+}
+.tabs-wrapper .tabs-group .tabs-toggle {
+  position: absolute;
+  right: 20px;
+  top: 18px;
+  font-size: 12px;
+  line-height: 1;
+  cursor: pointer;
+}
+.tabs-multiple .tabs-group .content > li > a {
+  margin: 2px 0;
+  display: block;
+  padding: 3px 10px;
+  -webkit-border-radius: 3px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 3px;
+  -moz-background-clip: padding;
+  border-radius: 3px;
+  background-clip: padding-box;
+}
+.tabs-multiple .tabs-group .content > li.active > a {
+  color: #007bff;
+  background: #b3d7ff;
+}
+@media (max-width: 767px) {
+  .tabs-wrapper .tabs-group .title {
+    width: 100%;
+    float: none;
+  }
+  .tabs-wrapper .tabs-group .content {
+    margin: 0;
+  }
+  .tabs-wrapper .tabs-group .content > li {
+    padding: 5px;
+  }
+  .tabs-wrapper .tabs-group + .tabs-group {
+    border-top: none;
+  }
+}
+h1 .breadcrumb {
+  padding: 0 5px;
+  margin-bottom: 5px;
+  background: none;
+}
+h1 .breadcrumb li {
+  font-size: 12px;
+  font-weight: 400;
+}
+.carousel-focus .item .carousel-img {
+  background-size: cover;
+  width: 100%;
+  height: 180px;
+  background-position: center center;
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  transition: all 0.3s;
+}
+.carousel-focus:hover .carousel-img {
+  -webkit-transform: scale(1.02);
+  -moz-transform: scale(1.02);
+  -o-transform: scale(1.02);
+  -ms-transform: scale(1.02);
+  transform: scale(1.02);
+}
+.carousel-focus .carousel-control.left,
+.carousel-focus .carousel-control.right {
+  background-image: none;
+}
+.carousel-focus .carousel-control.left span,
+.carousel-focus .carousel-control.right span {
+  display: none;
+}
+.carousel-focus .carousel-control.left:hover,
+.carousel-focus .carousel-control.right:hover {
+  -webkit-transition: all 1s ease;
+  -moz-transition: all 1s ease;
+  -o-transition: all 1s ease;
+  transition: all 1s ease;
+}
+.carousel-focus .carousel-control.left:hover span,
+.carousel-focus .carousel-control.right:hover span {
+  display: block;
+}
+.panel-blockimg {
+  border: none;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.panel-blockimg img {
+  width: 100%;
+}
+.hot-tags .panel-body a span {
+  margin-bottom: 10px;
+}
+.tags {
+  margin: 0;
+  display: inline-block;
+}
+.tags .tag {
+  margin-bottom: 8px;
+}
+.tag {
+  display: inline-block;
+  padding: 0 8px;
+  height: 24px;
+  line-height: 24px;
+  font-weight: 400;
+  font-size: 13px;
+  text-align: center;
+  color: #007bff;
+  background: #e5f2ff;
+  margin-right: 3px;
+  border-radius: 2px;
+}
+.tag img {
+  width: 16px;
+  height: 16px;
+  margin-top: -1px;
+  margin-right: 3px;
+}
+.tag[href]:focus,
+.tag[href]:hover {
+  background-color: #007bff;
+  color: #fff;
+  text-decoration: none;
+}
+.tag-xs {
+  padding: 0 6px;
+  height: 20px;
+  line-height: 20px;
+  font-size: 12px;
+}
+.tag-sm {
+  padding: 0 6px;
+  height: 22px;
+  line-height: 22px;
+  font-size: 13px;
+}
+.tag-lg {
+  font-size: 16px;
+  font-weight: 700;
+  height: 30px;
+  line-height: 28px;
+}
+.tag-link {
+  background-color: transparent;
+}
+.tag-logo {
+  padding-left: 25px;
+  background-repeat: no-repeat;
+  background-position: 4px 2px;
+  background-size: 16px 16px;
+}
+.tag-success {
+  background-color: #dff0d8;
+  color: #18bc9c;
+}
+.tag-info {
+  background-color: #d9edf7;
+  color: #3498db;
+}
+.tag-warning {
+  background-color: #fcf8e3;
+  color: #f39c12;
+}
+.tag-danger {
+  background-color: #f2dede;
+  color: #e74c3c;
+}
+.product-item .card {
+  border-radius: 3px;
+  position: relative;
+  padding: 12px;
+  margin: 0 auto 20px;
+  -webkit-transition: all 200ms cubic-bezier(0.55, 0.055, 0.675, 0.19);
+  -moz-transition: all 200ms cubic-bezier(0.55, 0.055, 0.675, 0.19);
+  -o-transition: all 200ms cubic-bezier(0.55, 0.055, 0.675, 0.19);
+  transition: all 200ms cubic-bezier(0.55, 0.055, 0.675, 0.19);
+  border: 1px solid #eee;
+  min-height: 250px;
+  overflow: hidden;
+  background-color: #fff;
+}
+.product-item .card .thumb {
+  position: relative;
+  -webkit-transition: all 0.5s ease-out 0s;
+  -moz-transition: all 0.5s ease-out 0s;
+  -o-transition: all 0.5s ease-out 0s;
+  transition: all 0.5s ease-out 0s;
+  margin: -12px;
+}
+.product-item .card .thumb > .preview-link::before {
+  background: rgba(0, 0, 0, 0.2);
+  opacity: 0;
+  z-index: 1;
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  content: "";
+  -webkit-transition: all 0.5s ease-out 0s;
+  -moz-transition: all 0.5s ease-out 0s;
+  -o-transition: all 0.5s ease-out 0s;
+  transition: all 0.5s ease-out 0s;
+}
+.product-item .card .thumb > .quickview-link {
+  display: block;
+  width: 40px;
+  height: 40px;
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  margin: auto;
+  line-height: 40px;
+  text-align: center;
+  z-index: 10;
+  background: #000;
+  border-radius: 50%;
+  opacity: 0;
+  visibility: hidden;
+  color: #fff;
+  transform: scale(0);
+  -webkit-transform: scale(0);
+  transition: all 0.3s ease-out 0s;
+  -webkit-transition: all 0.3s ease-out 0s;
+}
+.product-item .card .thumb:hover .preview-link::before {
+  opacity: 1;
+}
+.product-item .card .thumb:hover .quickview-link {
+  opacity: 1;
+  visibility: visible;
+  transform: scale(1);
+  -webkit-transform: scale(1);
+}
+.product-item .card:hover {
+  -webkit-transform: translateY(-6px);
+  -moz-transform: translateY(-6px);
+  -o-transform: translateY(-6px);
+  -ms-transform: translateY(-6px);
+  transform: translateY(-6px);
+  -webkit-box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);
+  -moz-box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);
+  box-shadow: 0 26px 40px -24px rgba(0, 36, 100, 0.3);
+  -webkit-transition: all 0.3s ease;
+  -moz-transition: all 0.3s ease;
+  -o-transition: all 0.3s ease;
+  transition: all 0.3s ease;
+}
+.product-item .card:hover .operate .pull-right {
+  display: block;
+}
+.product-item .card .image {
+  position: relative;
+  width: 100%;
+  height: 1px;
+  overflow: hidden;
+  padding-bottom: 75%;
+  background-repeat: no-repeat;
+  background-size: cover;
+  background-position: center center;
+}
+.product-item .card .title {
+  padding-top: 10px;
+}
+.product-item .card h2 {
+  color: #000;
+  padding: 0;
+  margin-bottom: 5px;
+  height: 24px;
+  margin-top: 15px;
+  font-size: 14px;
+  font-weight: 400;
+  line-height: 24px;
+  text-align: left;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-box-orient: vertical;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+}
+.product-item .card .operate {
+  height: 31px;
+  overflow: hidden;
+}
+.product-item .card .operate .pull-right {
+  display: none;
+}
+#content-container > h1 {
+  margin-top: 0;
+}
+body {
+  display: flex;
+  flex-direction: column;
+}
+.main-content {
+  padding-bottom: 15px;
+  flex-grow: 1;
+}
+footer {
+  flex-grow: 0;
+  flex-shrink: 0;
+}
+@media (max-width: 768px) {
+  .main-content > .container {
+    padding-left: 0;
+    padding-right: 0;
+    overflow-x: hidden;
+  }
+  .main-content > .container > .category-title {
+    padding: 0 15px;
+    font-size: 20px;
+  }
+  .navbar-inverse {
+    height: 100vh;
+    max-height: 100vh;
+    padding-bottom: 50px;
+  }
+  .navbar-inverse ul.dropdown-menu {
+    background: #333333;
+  }
+  .navbar-inverse ul.navbar-nav > li {
+    margin-bottom: 1px;
+  }
+  .navbar-inverse ul.navbar-nav > li.open > a {
+    background-color: #080808;
+  }
+  .navbar-white .navbar-nav .open .dropdown-menu {
+    background: #eee;
+  }
+  .footer-logo {
+    margin-bottom: 20px;
+  }
+  .product-item .card .operate .pull-right {
+    display: inherit;
+  }
+}
+.lasest-update .panel-body {
+  padding: 8px 0;
+}
+.lasest-update .panel-body ul {
+  margin-bottom: 0;
+}
+.lasest-update .panel-body ul li {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  position: relative;
+  height: 35px;
+  line-height: 35px;
+}
+.channel-list .row .col-xs-12 {
+  min-height: 315px;
+}
+.channel-list .row .col-xs-12 h3 {
+  border-bottom: 1px solid #eee;
+  padding-bottom: 10px;
+  position: relative;
+}
+.channel-list .row .col-xs-12 h3 > a {
+  font-size: 16px;
+  position: relative;
+  padding-left: 6px;
+}
+.channel-list .row .col-xs-12 h3 > a:before {
+  position: absolute;
+  top: 2px;
+  left: 0px;
+  content: ' ';
+  width: 2px;
+  height: 15px;
+  background: #007bff;
+  display: inline-block;
+}
+.channel-list .row .col-xs-12 h3 em {
+  position: absolute;
+  right: 5px;
+  top: 2px;
+  font-style: normal;
+  font-weight: 400;
+}
+.channel-list .row .col-xs-12 h3 em a {
+  font-size: 12px;
+}
+.channel-list .row .media {
+  margin-bottom: 10px;
+}
+.channel-list .row .media .media-left a {
+  width: 120px;
+  display: block;
+}
+.channel-list .row .media .media-left a .embed-responsive-4by3 {
+  border-radius: 5px;
+}
+.channel-list .row .media .media-body {
+  font-size: 12px;
+}
+.channel-list .row .media .media-body p {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-box-orient: vertical;
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  font-size: 14px;
+  padding-right: 15px;
+}
+.channel-list .row ul.inner-list li {
+  margin-bottom: 5px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  position: relative;
+  padding-right: 40px;
+  height: 30px;
+  line-height: 30px;
+}
+.channel-list .row ul.inner-list li a {
+  color: #616161;
+}
+.channel-list .row ul.inner-list li span {
+  position: absolute;
+  right: 0;
+}
+#comment-container #commentlist dl {
+  position: relative;
+  border-bottom: 1px solid #eee;
+  clear: both;
+  padding: 10px 0;
+  margin-bottom: 5px;
+}
+#comment-container #commentlist dl dt {
+  float: left;
+  margin-right: 10px;
+  width: 44px;
+  height: 44px;
+  display: block;
+  position: absolute;
+}
+#comment-container #commentlist dl dt img {
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+}
+#comment-container #commentlist dl dd {
+  padding-left: 55px;
+  float: left;
+  width: 100%;
+}
+#comment-container #commentlist dl dd cite a {
+  color: #007bff;
+}
+#comment-container #commentlist dl dd small {
+  color: #999;
+  margin: 0 0 0 3px;
+  height: 20px;
+  line-height: 20px;
+  font-size: 10px;
+}
+#comment-container #commentlist dl dd small a {
+  display: none;
+}
+#comment-container #commentlist dl dd dl {
+  margin: 0px;
+  border-top: 1px solid #eee;
+  border-bottom: none;
+  padding-top: 15px;
+  padding-bottom: 0;
+}
+#comment-container #commentlist dl dd dl dd {
+  width: 550px;
+}
+#comment-container #commentlist dl dd p {
+  margin-top: 5px;
+  margin-bottom: 10px;
+  line-height: 24px;
+}
+#comment-container #commentlist dl dd p em {
+  font-style: normal;
+  display: inline-block;
+  padding: 0 5px;
+  height: 22px;
+  line-height: 22px;
+  font-weight: 400;
+  font-size: 13px;
+  text-align: center;
+  color: #007bff;
+  background: #e5f2ff;
+  border-radius: 2px;
+}
+#comment-container #commentlist cite {
+  font-style: normal;
+}
+#comment-container h3 {
+  position: relative;
+  font-size: 16px;
+  padding: 15px 0;
+  background: #fff;
+}
+#comment-container h3 a {
+  display: none;
+}
+#comment-container #postcomment .form-group {
+  margin-bottom: 10px;
+}
+#comment-container #postcomment label {
+  font-weight: normal;
+}
+#comment-container #postcomment a small {
+  display: inline !important;
+}
+#comment-container #postcomment textarea.form-control {
+  border-radius: 2px;
+  box-shadow: none;
+  border-color: #eeeeee;
+}
+.fieldlist dd {
+  display: block;
+  margin: 5px 0;
+}
+.fieldlist dd input {
+  display: inline-block;
+  width: 300px;
+}
+.fieldlist dd input:first-child {
+  width: 110px;
+}
+.fieldlist dd ins {
+  width: 110px;
+  display: inline-block;
+  text-decoration: none;
+  font-weight: bold;
+}
+.text-gray {
+  color: #d2d6de !important;
+}
+.no-padding {
+  padding: 0 !important;
+}
+.no-border {
+  border: none !important;
+}
+.pager .pagination {
+  margin: 0;
+}
+.pager .pager {
+  margin: 0;
+}
+.pager li {
+  margin: 0 0.4em;
+  display: inline-block;
+}
+.pager li:first-child > a,
+.pager li:last-child > a,
+.pager li:first-child > span,
+.pager li:last-child > span {
+  padding: 0.5em 1.2em;
+}
+.pager li > a,
+.pager li > span {
+  background: none;
+  border: 1px solid #e6e6e6;
+  border-radius: 0.25em;
+  padding: 0.5em 0.93em;
+  font-size: 14px;
+}
+.list-partner li {
+  display: inline-block;
+  margin: 0 12px 12px 0;
+  width: 140px;
+  text-align: center;
+  border: 1px solid #efefef;
+}
+.list-partner li img {
+  height: 50px;
+}
+.index-gallary h5,
+.related-article h5 {
+  font-size: 14px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-box-orient: vertical;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  font-weight: normal;
+  height: 15px;
+}
+.index-focus {
+  margin-bottom: 19px;
+}
+.article-content > .panel-heading {
+  padding: 0;
+  margin: 0 -15px;
+}
+.article-content > .panel-heading > .breadcrumb {
+  background: #fff;
+  font-size: 13px;
+  margin-bottom: 0;
+  padding: 15px;
+}
+.article-donate {
+  padding: 10px 0;
+  text-align: center;
+}
+.article-donate a {
+  min-width: 120px;
+  -webkit-border-radius: 3px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 3px;
+  -moz-background-clip: padding;
+  border-radius: 3px;
+  background-clip: padding-box;
+}
+.category-title {
+  margin-bottom: 20px;
+  font-size: 24px;
+  color: #444;
+}
+.category-title .breadcrumb li {
+  font-size: 14px;
+}
+.category-order li > a.active {
+  color: #007bff;
+}
+.img-zoom {
+  overflow: hidden;
+  display: inline-block;
+}
+.img-zoom img {
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  transition: all 0.3s;
+}
+.img-zoom:hover img {
+  -webkit-transform: scale(1.1);
+  -moz-transform: scale(1.1);
+  -o-transform: scale(1.1);
+  -ms-transform: scale(1.1);
+  transform: scale(1.1);
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive img {
+  position: absolute;
+  object-fit: cover;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.embed-responsive-square {
+  padding-bottom: 100%;
+}
+.list-links a {
+  margin-right: 5px;
+}
+.navbar-form {
+  padding-top: 5px;
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .navbar-header {
+    width: 44px;
+    overflow: hidden;
+  }
+}
+@media (max-width: 767px) {
+  .skin-white {
+    padding-top: 70px;
+  }
+  ul.dropdown-menu {
+    position: relative;
+    width: 100%;
+    background: #222;
+  }
+  ul.dropdown-menu .open > a,
+  ul.dropdown-menu .open > a:hover,
+  ul.dropdown-menu .open > a:focus {
+    background: none;
+    color: #9d9d9d;
+  }
+  ul.dropdown-menu > .dropdown-menu {
+    position: relative;
+    width: 100%;
+    margin: 0;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 22px;
+  }
+  .navbar-nav .open .dropdown-menu {
+    position: relative;
+    width: 100%;
+    margin: 0;
+    left: 0;
+    background: #404950;
+  }
+  .dropdown-submenu > a:after {
+    display: none;
+  }
+  .panel-page {
+    padding: 15px;
+    min-height: 300px;
+  }
+  .article-list .media .media-left a {
+    width: 110px;
+  }
+  .article-list .media .media-body .article-title {
+    font-size: 1em;
+  }
+  .article-list .media-body .article-tag {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    -webkit-box-orient: vertical;
+    display: -webkit-box;
+    -webkit-line-clamp: 1;
+  }
+  .navbar-nav {
+    margin: 8.25px 0;
+  }
+  .dropdown:not(.open):hover > .dropdown-menu {
+    display: none;
+  }
+  .article-list .media-body .article-tag span {
+    margin: 0 2px;
+  }
+  .article-pay a.btn {
+    display: block;
+    margin-top: 5px;
+  }
+  .navbar-form {
+    margin: 0;
+    border-top: none;
+    border-bottom: none;
+  }
+  .navbar-userinfo {
+    padding: 0;
+  }
+  .navbar-userinfo > a {
+    height: 50px;
+  }
+  .focus-img {
+    margin-top: 15px;
+    padding: 0 15px;
+  }
+  .focus-img > .row {
+    margin-left: 0;
+  }
+}
+@media (min-width: 768px) {
+  #index-focus .item .carousel-img {
+    height: 340px;
+    width: 100%;
+  }
+  #channel-focus .item .carousel-img {
+    height: 272px;
+    width: 100%;
+  }
+}
+@media (min-width: 979px) {
+  ul.nav li.dropdown:hover > ul.dropdown-menu {
+    display: block;
+  }
+}
+@media screen and (min-width: 768px) {
+  .carousel-caption {
+    left: 0;
+    right: 0;
+    background: rgba(0, 0, 0, 0.3);
+    padding: 0;
+    bottom: 0;
+    text-shadow: none;
+  }
+  .carousel-caption h3 {
+    margin: 0;
+    font-size: 14px;
+    padding: 15px;
+    text-align: left;
+  }
+  .carousel-caption p {
+    display: none;
+  }
+  .carousel-indicators {
+    bottom: 3px;
+    right: 15px;
+    width: auto;
+    left: inherit;
+    opacity: 0.6;
+  }
+}
+.carousel-control {
+  text-shadow: none;
+}
+.carousel-control .fa {
+  font: normal normal normal 30px/1 FontAwesome;
+}
+.carousel-control .icon-prev {
+  left: 20px;
+}
+.carousel-control .icon-next {
+  right: 20px;
+}
+.carousel-control .fa-chevron-left:before {
+  content: "\f053";
+}
+.carousel-control .fa-chevron-right:before {
+  content: "\f054";
+}
+.loadmore {
+  width: 80%;
+  margin: 1.5em auto;
+  line-height: 1.6em;
+  font-size: 14px;
+  text-align: center;
+  clear: both;
+}
+.loadmore-tips {
+  display: inline-block;
+  vertical-align: middle;
+}
+.loadmore-line {
+  border-top: 1px solid #eeeeee;
+  margin-top: 2.4em;
+}
+.loadmore-line .loadmore-tips {
+  position: relative;
+  top: -0.9em;
+  padding: 0 0.55em;
+  background-color: #FFFFFF;
+  color: #808080;
+}
+.btn-loadmore {
+  clear: both;
+}
+.download-list {
+  margin: 0 -15px;
+}
+.download-list li {
+  width: 95px;
+  float: left;
+  display: inline-block;
+  margin: 0 15px;
+  padding: 15px 0;
+  text-align: center;
+  position: relative;
+  height: 170px;
+}
+.download-list li a {
+  display: block;
+}
+.download-list li a p {
+  word-break: keep-all;
+  text-overflow: ellipsis;
+  line-height: 25px;
+  height: 25px;
+  overflow: hidden;
+}
+.download-list li a img + span {
+  display: block;
+  overflow: hidden;
+  height: 20px;
+}
+.download-list li:hover em {
+  display: none;
+}
+.download-list li:hover a.btn {
+  display: block;
+  width: 80px;
+  margin: 0 auto;
+}
+.download-list li a:hover {
+  text-decoration: none;
+}
+.download-list img {
+  width: 90px;
+  height: 90px;
+  margin-bottom: 8px;
+}
+.download-list em {
+  display: block;
+  color: #999;
+  font-style: normal;
+}
+.download-list li > a.link {
+  display: block;
+  height: 120px;
+  overflow: hidden;
+  border-radius: 5px;
+}
+.download-list li > a.link img {
+  border-radius: 5px;
+}
+.download-list a.btn {
+  display: none;
+}
+.screenshots-box > h2,
+.download-box > h2,
+.intro-box > h2,
+.history-box > h2 {
+  font-size: 18px;
+  color: #444;
+}
+@media (max-width: 991px) {
+  .download-list li {
+    margin: 0 10px;
+  }
+}
+.focus-img > .row > div {
+  padding: 0;
+  padding-right: 15px;
+  margin-bottom: 15px;
+  height: 100%;
+  display: block;
+}
+.focus-img > .row > div a > span {
+  border-radius: 3px;
+  overflow: hidden;
+}
+.focus-img .intro {
+  position: absolute;
+  bottom: 0;
+  background: #000;
+  padding: 0 5px 0 5px;
+  width: 100%;
+  opacity: 0.5;
+  color: #fff;
+  height: 30px;
+  line-height: 30px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  text-align: center;
+}
+.focus-img a {
+  display: block;
+}
+.focus-img img {
+  width: 100%;
+}
+@media (min-width: 768px) and (max-width: 992px) {
+  .focus-img {
+    margin-top: 15px;
+  }
+  .focus-img > .row {
+    margin: 0 -10px;
+  }
+  .focus-img > .row > div {
+    padding: 0 10px;
+  }
+}
+@media (min-width: 992px) and (max-width: 1200px) {
+  .focus-img > .row > div .embed-responsive-16by9 {
+    padding-bottom: 68.25%;
+  }
+}
+.navbar .form-search input[type=search] {
+  -webkit-appearance: textfield;
+  font-family: inherit;
+  font-size: 100%;
+}
+.navbar .form-search input::-webkit-search-decoration,
+.navbar .form-search input::-webkit-search-cancel-button {
+  display: none;
+}
+.navbar .form-search input[type=search] {
+  background: url('../img/search.svg') no-repeat 10px center;
+  background-size: 18px 18px;
+  border-color: transparent;
+  padding: 6px 10px;
+  width: 35px;
+  -webkit-border-radius: 10em;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 10em;
+  -moz-background-clip: padding;
+  border-radius: 10em;
+  background-clip: padding-box;
+  -webkit-transition: all 0.5s;
+  -moz-transition: all 0.5s;
+  -o-transition: all 0.5s;
+  transition: all 0.5s;
+  height: inherit;
+  cursor: pointer;
+  box-shadow: none;
+  color: transparent;
+}
+.navbar .form-search input[type=search]:hover {
+  background-color: #fff;
+}
+.navbar .form-search input[type=search]:focus {
+  border-color: #007bff;
+  width: 200px;
+  padding-left: 32px;
+  color: #000;
+  background-color: #fff;
+  cursor: auto;
+  -webkit-box-shadow: 0 0 5px #99caff;
+  -moz-box-shadow: 0 0 5px #99caff;
+  box-shadow: 0 0 5px #99caff;
+}
+.navbar .form-search input[type=search]:focus::-moz-placeholder {
+  color: #999;
+}
+.navbar .form-search input[type=search]:focus::-webkit-input-placeholder {
+  color: #999;
+}
+.navbar .form-search input::-moz-placeholder {
+  color: transparent;
+}
+.navbar .form-search input::-webkit-input-placeholder {
+  color: transparent;
+}
+@media (min-width: 768px) {
+  .navbar .navbar-header {
+    position: relative;
+    z-index: 9999;
+  }
+  .navbar .navbar-collapse {
+    position: relative;
+    z-index: 9998;
+  }
+  .navbar .navbar-collapse .navbar-nav {
+    display: flex;
+    justify-content: space-around;
+    flex-direction: row;
+    white-space: nowrap;
+  }
+  .navbar .navbar-collapse .navbar-right {
+    position: absolute;
+    right: 0;
+    background: #fff;
+  }
+}
+@media (max-width: 767px) {
+  .navbar .form-search input[type=search] {
+    position: relative;
+    width: 100%;
+    border: 1px solid #ddd;
+  }
+  .navbar .form-search input[type=search]:focus {
+    width: 100%;
+  }
+  .navbar .navbar-collapse {
+    position: fixed;
+    top: 0;
+    overflow: auto;
+    z-index: 9999;
+    background: #fff;
+    box-shadow: 10px 0 10px rgba(0, 0, 0, 0.06);
+    max-height: inherit;
+    height: 100vh;
+    transition: 0.5s;
+    width: 250px;
+    margin-left: -280px;
+    margin-right: 0;
+    display: flex;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav {
+    margin: 15px 0;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav > li {
+    margin-bottom: 5px;
+    border-radius: 3px;
+    overflow: hidden;
+    background: #fbfbfb;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav li > a b.caret {
+    position: absolute;
+    right: 15px;
+    top: 50%;
+    margin-top: -2px;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav li ul.dropdown-menu {
+    border-radius: 0;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav:first-child {
+    width: 100%;
+  }
+  .navbar .navbar-collapse > ul.navbar-nav.navbar-right {
+    width: 100%;
+    margin-bottom: 0;
+  }
+  .navbar .navbar-collapse.active {
+    margin-left: -15px;
+    flex-direction: column;
+    flex: auto;
+  }
+  .navbar .navbar-collapse.active > ul {
+    width: 100%;
+  }
+  .navbar .navbar-collapse.active .dropdown-submenu ul.dropdown-menu {
+    display: block;
+  }
+  .navbar .navbar-collapse-bg {
+    position: fixed;
+    top: 0;
+    overflow: hidden;
+    z-index: 9998;
+    background: transparent;
+    height: 100vh;
+    width: 100%;
+    display: block;
+  }
+}
+/* 搜索建议 */
+.autocomplete-suggestions {
+  text-align: left;
+  cursor: default;
+  background: #fff;
+  border-radius: 2px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  background-clip: padding-box;
+  position: absolute;
+  display: none;
+  z-index: 1036;
+  max-height: 254px;
+  overflow: hidden;
+  overflow-y: auto;
+  box-sizing: border-box;
+}
+.autocomplete-suggestions .autocomplete-suggestion {
+  padding: 6px 12px;
+}
+.autocomplete-suggestions .autocomplete-suggestion b {
+  color: red;
+}
+.autocomplete-suggestions .autocomplete-suggestion:hover {
+  background: #f0f0f0;
+}
+.layui-layer .layui-layer-confirm {
+  width: 100%;
+  height: 100%;
+}
+.layui-layer .layui-layer-confirm:focus {
+  border: 1px solid #444c69;
+  -webkit-border-radius: 2px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 2px;
+  -moz-background-clip: padding;
+  border-radius: 2px;
+  background-clip: padding-box;
+}
+.layui-layer .layui-layer-confirm:focus-visible {
+  outline: 0;
+}

+ 39 - 0
public/assets/addons/cms/css/iconfont.css

@@ -0,0 +1,39 @@
+@font-face {
+    font-family: "iconfont";
+    src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAWIAAsAAAAAC0QAAAU5AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACDNgqJLId6ATYCJAMcCxAABCAFhGcHXxu/CcgekiQnu1qDA3cQAQAEQUT7/WbPv3pDvRKaejIJCa946iRCh9BJF9rPb/j3tDeyGJQd0hFK05esU3JpBqcHZfvame0JKA7AH0yArOk96ipfCewrTFNJJNuxZGMIhZsR3eQ0sDD0P2uuTrSJRv1t1uOJ/80R98S7tos0lmliIYlpgpTEQyNnFvEsLlScc/MxCEibksSwnlVQAWyHGNsFXBlj0wVxpAzlJAbMhzmmxSpC0kEPjdvyJYHaDn8BPu3by7uwIIBiI9iVVtqZMnDqKf5NihH3v4l+NH17k/DmCligwdiRFUurvXKHkRfHLKbrEsZUMnhCLP//J+Y0fdwUHqhohp3/8ySFYRbrdzLOtWJkCIKYD0EhFkLQiMUQDGKpHOtqMzjOVdX6rfOgAcgB8o30c+2WobjKChlWZ5NrF2jf1ozIttyxxkQQ8uL3bvmtINw8s8y+XBjo50uri1y2TXfIDPJsEgqkTvfKbyzYtGmZWGyQfrlwNfDwA3fnbwGelm7kNy83kOcLq7TwVl5N2wb5Sq1WeLgKjcYzv0qn8yir9fq7VR7QXNMA8LRt3wHVqtVHebVSZfnyoOG0Wl6vX2vN24P7t65ccWj+Fm6rVWmsXnenXc37woXDB2zZd0BMyLac8xOrlP6D/HHumGXx5cgO5c6jp+X1dMvSkhykM6I6m/jbAJyLR/IuQw7K0y/L46+8t4IZZrttfbP44NaVQtmCfapVTvUAvLhOL9JqOY1mvk6n1Ovp5E/wxZs3LuWWCFs2HNixWlKx/OBUbOPKbftQ6aZVGGRpl/Wc6LGIlFMRYYVCsevC+wmXZvQb5OUk9SA9y41FQPaz6Q5s5OrvWpss7hVcmmy6zPyvVesW2uhH7sMXbQpFjz+m9Gqys10BEj11myT16Pg4Wi9puiUIQ4TZ69Emya2a2/7+GJVlP+KVOvWdWEotftz/DfVVo2pBYK6/f16tfy6x1Ob5KwS23MEvCw1MMyv1yrsLviZkKnlP/+XQlidL539Zw06VsW4aJFOJpAl/7yepj713izIy/MTqIhBdfixUCe6gBLrYjpeohIvvCFSu61Lze0Gn4P1Y1pgTx4piljznbbFAjaoEWYIj6FGBxfcdfi/yBP/OtN+IeyE4WoFH9Kog9JALKQsOLsOCS0kMVhocUoqFlFUYLoRGQSoILGJthKfwE1yacWDX0Ft3/YH0s67zype4OixdN8+v4pLr3PR+58rLrkt+NW9HVaory5Zh6/YBIwAJ22gzRm+RLI3PrIWLhazzHcbrRrWOEb3RFP2xf4nNqC975c12CV3zzM+k5X/u7E3J9eLr2xlCoACm/wDlzZhoUf3IzceCjwED5+L2pBzTiDo0HeqtMsG3KkOat0ACWG3Zk+0lKmDkP5aoRFC8DmhBj9roR8DKmAEnmIe0UZlHZ1TQjEicAgbMQCCKtoKS9wNa0UW10evBqnsLTtFfSNsKbE6XMRAcpTMQY6EMkfYjcpzqIkSStSstg2R3B8ZUtVVBRiHHLUhoUEixJxt2QWYTeyh6yDCWJRCCoTqRrP7VYEcHhdAM1QZxNqiVZem44GCi7lmCcKoTpGNAGBYkg5Dqh5DDUboQWpnNP14ZiNStA4YBqqvKGQpKkZUjQgUJAaizsQskeyTjFXqQwrCknYAgBsMpnRBZ65VDHbyTgqDrN2oD4VhBWtdop8UJJkoEFIP2n+h8kGcAaezMPlCixYgVJ14CbsbglAyaXb3dO2EXa9Lbh9G0hRTD21mK70ub0rALl3eYKFoxBgIAAAAA') format('woff2'),
+    url('../fonts/iconfont/iconfont.woff?t=1683186873612') format('woff'),
+    url('../fonts/iconfont/iconfont.ttf?t=1683186873612') format('truetype'),
+    url('../fonts/iconfont/iconfont.svg?t=1683186873612#iconfont') format('svg');
+}
+
+.iconfont {
+    font-family: "iconfont" !important;
+    font-size: 16px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-qrcode:before {
+    content: "\e63b";
+}
+
+.icon-comment:before, .icon-feedback:before {
+    content: "\e63c";
+}
+
+.icon-wxapp:before {
+    content: "\e63d";
+}
+
+.icon-backtotop:before {
+    content: "\e63e";
+}
+
+.icon-pencil:before {
+    content: "\e63f";
+}
+
+.icon-share:before {
+    content: "\e640";
+}

+ 39 - 0
public/assets/addons/cms/css/jquery.autocomplete.min.css

@@ -0,0 +1,39 @@
+/**
+ * @fileOverview CSS for jquery-autocomplete, the jQuery Autocompleter
+ * @author <a href="mailto:dylan@dyve.net">Dylan Verheul</a>
+ * @license MIT | GPL | Apache 2.0, see LICENSE.txt
+ * @see https://github.com/dyve/jquery-autocomplete
+ */
+.acResults {
+    padding: 0px;
+    border: 1px solid WindowFrame;
+    background-color: Window;
+    overflow: hidden;
+}
+
+.acResults ul {
+    margin: 0px;
+    padding: 0px;
+    list-style-position: outside;
+    list-style: none;
+}
+
+.acResults ul li {
+    margin: 0px;
+    padding: 2px 5px;
+    cursor: pointer;
+    display: block;
+    font: menu;
+    font-size: 12px;
+    overflow: hidden;
+}
+
+.acLoading {
+    background : url('indicator.gif') right center no-repeat;
+}
+
+.acSelect {
+    background-color: Highlight;
+    color: HighlightText;
+}
+

+ 78 - 0
public/assets/addons/cms/css/jquery.tagsinput.min.css

@@ -0,0 +1,78 @@
+div.tagsinput{border:1px solid #CCC;background:#FFF;padding:5px;width:300px;height:100px;overflow-y:auto}div.tagsinput span.tag{border:1px solid #a5d24a;-moz-border-radius:2px;-webkit-border-radius:2px;display:block;float:left;padding:5px;text-decoration:none;background:#cde69c;color:#638421;margin-right:5px;margin-bottom:5px;font-family:helvetica;font-size:13px}div.tagsinput span.tag a{font-weight:700;color:#82ad2b;text-decoration:none;font-size:11px}div.tagsinput input{height:24px;width:80px;margin:0 5px 5px 0;font-family:helvetica;font-size:13px;border:1px solid transparent;padding:5px;background:0 0;color:#000;outline:0}div.tagsinput div{display:block;float:left}.tags_clear{clear:both;width:100%;height:0}.not_valid{background:#FBD8DB!important;color:#90111A!important}
+
+div.tagsinput {
+    border: 1px solid #e3e7f1;
+    border-radius: 3px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+    -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+    -moz-transition: border-color ease-in-out .15s, -moz-box-shadow ease-in-out .15s;
+    -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+    transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s
+}
+
+div.tagsinput span.tag {
+    height: 24px;
+    padding: 2px 5px;
+    margin-bottom: 0;
+    color: #0084ff;
+    background: rgba(0, 132, 255, .1);
+    border-color: transparent
+}
+
+div.tagsinput span.tag a {
+    font-family: Verdana;
+    color: #0084ff;
+    margin-left: 5px
+}
+
+div.tagsinput input {
+    margin-bottom: 0;
+    margin-right: 0;
+    padding: 2px 5px;
+}
+
+.autocomplete-suggestions {
+    text-align: left;
+    cursor: default;
+    background: #fff;
+    border: 1px solid rgba(0,0,0,.15);
+    border-radius: 2px;
+    -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175);
+    -moz-box-shadow: 0 6px 12px rgba(0,0,0,.175);
+    box-shadow: 0 6px 12px rgba(0,0,0,.175);
+    background-clip: padding-box;
+    position: absolute;
+    /* display: none; */
+    z-index: 1029;
+    max-height: 254px;
+    overflow: hidden;
+    overflow-y: auto;
+    box-sizing: border-box;
+}
+
+.autocomplete-search .autocomplete-questions.selected,.autocomplete-search .autocomplete-questions:hover,.autocomplete-search .autocomplete-searchtags.selected,.autocomplete-search .autocomplete-searchtags:hover,.autocomplete-tags .autocomplete-suggestion.selected,.autocomplete-tags .autocomplete-suggestion:hover {
+    background: #f0f0f0
+}
+
+.autocomplete-tags {
+    min-width: 160px
+}
+
+.autocomplete-tags .autocomplete-suggestion {
+    position: relative;
+    line-height: 20px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    font-size: 1em;
+    color: #333;
+    padding: 5px 10px;
+    cursor: pointer;
+    white-space: inherit
+}
+
+.autocomplete-tags .autocomplete-suggestion b {
+    font-weight: 400;
+    color: #f71752
+}

File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/css/share.min.css


+ 136 - 0
public/assets/addons/cms/css/simtree.css

@@ -0,0 +1,136 @@
+.sim-tree {
+  list-style: none;
+  font-size: 14px;
+  color: #333;
+  padding: 5px;
+}
+.sim-tree ul,
+.sim-tree li {
+  margin: 0;
+  padding: 0;
+}
+.sim-tree li {
+  font-size: 0;
+  display: flex;
+  flex-wrap: wrap;
+  align-items: flex-start;
+}
+.sim-tree li ul {
+  flex: 1;
+  flex-basis: 100%;
+  width: 100%;
+  display: none;
+  margin-left: 15px;
+}
+.sim-tree ul.show,
+.sim-tree li.show {
+  display: block;
+}
+.sim-tree ul.none,
+.sim-tree li.none {
+  display: none;
+}
+.sim-tree li.disabled > a {
+  color: #aaa;
+  cursor: not-allowed;
+}
+.sim-tree li.disabled > a .sim-tree-checkbox {
+  border-color: #eee;
+}
+.sim-tree a {
+  flex: 1;
+  font-size: 14px;
+  color: #333;
+  text-decoration: none;
+  vertical-align: top;
+  line-height: 26px;
+  position: relative;
+  padding-left: 20px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-box-orient: vertical;
+  display: -webkit-box;
+  -webkit-line-clamp: 1;
+  height: 26px;
+}
+.sim-tree .sim-tree-spread {
+  width: 20px;
+  padding-left: 5px;
+  box-sizing: border-box;
+}
+.sim-tree .sim-tree-spread.sim-hidden {
+  visibility: hidden;
+}
+.sim-tree .sim-tree-spread,
+.sim-tree a {
+  cursor: pointer;
+}
+.sim-tree .sim-tree-spread {
+  height: 26px;
+}
+.sim-tree .sim-loading {
+  background: url('data:image/gif;base64,R0lGODlhEAAQAMQQAObm5uLi4unp6dHR0cnJydfX1+jo6O/v7/Dw8NPT0/39/crKyvr6+uDg4MfHx////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAQACwAAAAAEAAQAAAFXeAjPkiTjGgaLI6Tvs9BtPAIMPH8KgK5DDhZSlFYlFrAGIrYMrUcyRGzdapZr6jE02FAyZ6JxrOrEAVnjgaCRS6IkjLjo9F2PaDBwLJAu+NfAix2LQsAMCVVYQgoIQAh+QQFAAAQACwJAAAABwAHAAAFFGDSIE/5OM7SmKhjsK55vjIt32UIACH5BAUAABAALAoAAwAGAAoAAAUaICQqgggpxYKcheM0qOskZm0/eA7luMibvRAAIfkEBQAAEAAsCQAJAAcABwAABRXgcxBOmTwi6TRouiAoIwbtI9d4/oQAIfkEBQAAEAAsAwAKAAoABgAABRsgJI7MKD6POJQnKjpD60IODKFzvQD3nDQISAgAIfkEBQAAEAAsAAAJAAcABwAABRPgI45kSSrFWTgj6rCisLwk0iQhACH5BAUAABAALAAAAwAHAAoAAAUcIPRAJPmco4mm61m+cJk4tGNATX0ryGK/jVspBAAh+QQFAAAQACwAAAAABwAHAAAFFOAjjmRpPgBDIsugio3juGIiz2oIADs=') center center no-repeat;
+}
+.sim-tree .sim-loading.sim-icon-d:before,
+.sim-tree .sim-loading.sim-icon-r:before {
+  display: none;
+}
+.sim-tree .sim-icon-d:before,
+.sim-tree .sim-icon-r:before {
+  content: '';
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border: 6px solid transparent;
+  vertical-align: top;
+  position: relative;
+}
+.sim-tree .sim-icon-r:before {
+  border-left-width: 8px;
+  border-left-color: #333;
+  top: 7px;
+}
+.sim-tree .sim-icon-d:before {
+  margin-left: -4px;
+  border-top-color: #333;
+  top: 10px;
+}
+.sim-tree .sim-tree-checkbox {
+  display: inline-block;
+  border: 1px solid #ccc;
+  height: 16px;
+  width: 16px;
+  border-radius: 3px;
+  box-sizing: border-box;
+  text-align: center;
+  line-height: 16px;
+  background: #fff;
+  color: #fff;
+  vertical-align: middle;
+  position: absolute;
+  left: 0;
+  top: 4px;
+}
+.sim-tree .sim-tree-checkbox.sim-hide {
+  display: none;
+}
+.sim-tree .sim-tree-checkbox.sim-tree-semi,
+.sim-tree .sim-tree-checkbox.checked {
+  border-color: #2b85e4;
+  background-color: #2b85e4;
+}
+.sim-tree .sim-tree-checkbox.sim-tree-semi:after {
+  content: '';
+  display: block;
+  position: absolute;
+  width: 8px;
+  height: 2px;
+  background: #fff;
+  top: 6px;
+  left: 3px;
+}
+.sim-tree .sim-tree-checkbox.checked {
+  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAPFBMVEUAAAD///////////////////////////////////////////////////////////////////////8AAADY904BAAAAE3RSTlMAOiE8877cHQkXr9cZQvUc20NAbrhSVAAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA7SURBVAjXY2DADhiZEGxmFlYkNhs7KpuDE0mci5sHoYaXj5sHyOaHqOblE4CzGRgE+RBsBgYhfmxuAABcBQF5T7U3IwAAAABJRU5ErkJggg==');
+  background-repeat: no-repeat;
+  background-position: center center;
+}

File diff suppressed because it is too large
+ 11 - 0
public/assets/addons/cms/css/swiper.min.css


+ 260 - 0
public/assets/addons/cms/css/tinycss.css

@@ -0,0 +1,260 @@
+.m-0 {
+  margin-top: 0px !important;
+  margin-right: 0px !important;
+  margin-bottom: 0px !important;
+  margin-left: 0px !important;
+}
+.mt-0 {
+  margin-top: 0px !important;
+}
+.mr-0 {
+  margin-right: 0px !important;
+}
+.mb-0 {
+  margin-bottom: 0px !important;
+}
+.ml-0 {
+  margin-left: 0px !important;
+}
+.mx-0 {
+  margin-left: 0px !important;
+  margin-right: 0px !important;
+}
+.my-0 {
+  margin-top: 0px !important;
+  margin-bottom: 0px !important;
+}
+.m-1 {
+  margin-top: 5px !important;
+  margin-right: 5px !important;
+  margin-bottom: 5px !important;
+  margin-left: 5px !important;
+}
+.mt-1 {
+  margin-top: 5px !important;
+}
+.mr-1 {
+  margin-right: 5px !important;
+}
+.mb-1 {
+  margin-bottom: 5px !important;
+}
+.ml-1 {
+  margin-left: 5px !important;
+}
+.mx-1 {
+  margin-left: 5px !important;
+  margin-right: 5px !important;
+}
+.my-1 {
+  margin-top: 5px !important;
+  margin-bottom: 5px !important;
+}
+.m-2 {
+  margin-top: 10px !important;
+  margin-right: 10px !important;
+  margin-bottom: 10px !important;
+  margin-left: 10px !important;
+}
+.mt-2 {
+  margin-top: 10px !important;
+}
+.mr-2 {
+  margin-right: 10px !important;
+}
+.mb-2 {
+  margin-bottom: 10px !important;
+}
+.ml-2 {
+  margin-left: 10px !important;
+}
+.mx-2 {
+  margin-left: 10px !important;
+  margin-right: 10px !important;
+}
+.my-2 {
+  margin-top: 10px !important;
+  margin-bottom: 10px !important;
+}
+.m-3 {
+  margin-top: 15px !important;
+  margin-right: 15px !important;
+  margin-bottom: 15px !important;
+  margin-left: 15px !important;
+}
+.mt-3 {
+  margin-top: 15px !important;
+}
+.mr-3 {
+  margin-right: 15px !important;
+}
+.mb-3 {
+  margin-bottom: 15px !important;
+}
+.ml-3 {
+  margin-left: 15px !important;
+}
+.mx-3 {
+  margin-left: 15px !important;
+  margin-right: 15px !important;
+}
+.my-3 {
+  margin-top: 15px !important;
+  margin-bottom: 15px !important;
+}
+.m-4 {
+  margin-top: 20px !important;
+  margin-right: 20px !important;
+  margin-bottom: 20px !important;
+  margin-left: 20px !important;
+}
+.mt-4 {
+  margin-top: 20px !important;
+}
+.mr-4 {
+  margin-right: 20px !important;
+}
+.mb-4 {
+  margin-bottom: 20px !important;
+}
+.ml-4 {
+  margin-left: 20px !important;
+}
+.mx-4 {
+  margin-left: 20px !important;
+  margin-right: 20px !important;
+}
+.my-4 {
+  margin-top: 20px !important;
+  margin-bottom: 20px !important;
+}
+.p-0 {
+  padding-top: 0px !important;
+  padding-right: 0px !important;
+  padding-bottom: 0px !important;
+  padding-left: 0px !important;
+}
+.pt-0 {
+  padding-top: 0px !important;
+}
+.pr-0 {
+  padding-right: 0px !important;
+}
+.pb-0 {
+  padding-bottom: 0px !important;
+}
+.pl-0 {
+  padding-left: 0px !important;
+}
+.px-0 {
+  padding-left: 0px !important;
+  padding-right: 0px !important;
+}
+.py-0 {
+  padding-top: 0px !important;
+  padding-bottom: 0px !important;
+}
+.p-1 {
+  padding-top: 5px !important;
+  padding-right: 5px !important;
+  padding-bottom: 5px !important;
+  padding-left: 5px !important;
+}
+.pt-1 {
+  padding-top: 5px !important;
+}
+.pr-1 {
+  padding-right: 5px !important;
+}
+.pb-1 {
+  padding-bottom: 5px !important;
+}
+.pl-1 {
+  padding-left: 5px !important;
+}
+.px-1 {
+  padding-left: 5px !important;
+  padding-right: 5px !important;
+}
+.py-1 {
+  padding-top: 5px !important;
+  padding-bottom: 5px !important;
+}
+.p-2 {
+  padding-top: 10px !important;
+  padding-right: 10px !important;
+  padding-bottom: 10px !important;
+  padding-left: 10px !important;
+}
+.pt-2 {
+  padding-top: 10px !important;
+}
+.pr-2 {
+  padding-right: 10px !important;
+}
+.pb-2 {
+  padding-bottom: 10px !important;
+}
+.pl-2 {
+  padding-left: 10px !important;
+}
+.px-2 {
+  padding-left: 10px !important;
+  padding-right: 10px !important;
+}
+.py-2 {
+  padding-top: 10px !important;
+  padding-bottom: 10px !important;
+}
+.p-3 {
+  padding-top: 15px !important;
+  padding-right: 15px !important;
+  padding-bottom: 15px !important;
+  padding-left: 15px !important;
+}
+.pt-3 {
+  padding-top: 15px !important;
+}
+.pr-3 {
+  padding-right: 15px !important;
+}
+.pb-3 {
+  padding-bottom: 15px !important;
+}
+.pl-3 {
+  padding-left: 15px !important;
+}
+.px-3 {
+  padding-left: 15px !important;
+  padding-right: 15px !important;
+}
+.py-3 {
+  padding-top: 15px !important;
+  padding-bottom: 15px !important;
+}
+.p-4 {
+  padding-top: 20px !important;
+  padding-right: 20px !important;
+  padding-bottom: 20px !important;
+  padding-left: 20px !important;
+}
+.pt-4 {
+  padding-top: 20px !important;
+}
+.pr-4 {
+  padding-right: 20px !important;
+}
+.pb-4 {
+  padding-bottom: 20px !important;
+}
+.pl-4 {
+  padding-left: 20px !important;
+}
+.px-4 {
+  padding-left: 20px !important;
+  padding-right: 20px !important;
+}
+.py-4 {
+  padding-top: 20px !important;
+  padding-bottom: 20px !important;
+}

+ 31 - 0
public/assets/addons/cms/fonts/iconfont/iconfont.svg

@@ -0,0 +1,31 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+  <metadata>Created by iconfont</metadata>
+  <defs>
+  <font id="iconfont" horiz-adv-x="1024">
+    <font-face
+      font-family="iconfont"
+      font-weight="400"
+      font-stretch="normal"
+      units-per-em="1024"
+      ascent="896"
+      descent="-128"
+    />
+      <missing-glyph />
+      
+      <glyph glyph-name="qrcode" unicode="&#58939;" d="M409.6 896a51.2 51.2 0 0 0 51.2-51.2v-358.4a51.2 51.2 0 0 0-51.2-51.2H51.2a51.2 51.2 0 0 0-51.2 51.2V844.8a51.2 51.2 0 0 0 51.2 51.2h358.4zM409.6 332.8a51.2 51.2 0 0 0 51.2-51.2v-358.4a51.2 51.2 0 0 0-51.2-51.2H51.2a51.2 51.2 0 0 0-51.2 51.2v358.4a51.2 51.2 0 0 0 51.2 51.2h358.4zM972.8 896a51.2 51.2 0 0 0 51.2-51.2v-358.4a51.2 51.2 0 0 0-51.2-51.2h-358.4a51.2 51.2 0 0 0-51.2 51.2V844.8a51.2 51.2 0 0 0 51.2 51.2h358.4zM640 332.8a51.2 51.2 0 0 0 51.2-51.2v-358.4a51.2 51.2 0 0 0-102.4 0v358.4a51.2 51.2 0 0 0 51.2 51.2zM947.2 332.8a51.2 51.2 0 0 0 51.2-51.2v-358.4a51.2 51.2 0 0 0-102.4 0v358.4a51.2 51.2 0 0 0 51.2 51.2z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="comment" unicode="&#58940;" d="M1075.2 896a51.2 51.2 0 0 0 51.2-51.2v-768a51.2 51.2 0 0 0-51.2-51.2H549.632l-245.1456-122.5728a51.2 51.2 0 0 0-73.728 39.8848L230.4-51.200000000000045V25.600000000000023H51.2a51.2 51.2 0 0 0-50.8416 45.2096L0 76.79999999999995V844.8a51.2 51.2 0 0 0 51.2 51.2h1024zM307.2 550.4a51.2 51.2 0 0 1-51.2-51.2v-76.8a51.2 51.2 0 1 1 102.4 0v76.8a51.2 51.2 0 0 1-51.2 51.2z m256 0a51.2 51.2 0 0 1-51.2-51.2v-76.8a51.2 51.2 0 0 1 102.4 0v76.8a51.2 51.2 0 0 1-51.2 51.2z m256 0a51.2 51.2 0 0 1-51.2-51.2v-76.8a51.2 51.2 0 0 1 102.4 0v76.8a51.2 51.2 0 0 1-51.2 51.2z"  horiz-adv-x="1126" />
+      
+      <glyph glyph-name="wxapp" unicode="&#58941;" d="M512 896c282.763636 0 512-229.236364 512-512s-229.236364-512-512-512S0 101.23636399999998 0 384 229.236364 896 512 896z m148.154182-235.845818A162.909091 162.909091 0 0 1 465.454545 500.363636v-232.727272A69.818182 69.818182 0 1 0 395.636364 337.45454500000005a46.545455 46.545455 0 1 1 0 93.09091 162.909091 162.909091 0 1 1 162.909091-162.909091v232.727272a69.818182 69.818182 0 1 0 69.818181-69.818181 46.545455 46.545455 0 0 1 0-93.09091 162.909091 162.909091 0 0 1 31.790546 322.699637z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="backtotop" unicode="&#58942;" d="M495.694769 518.459077a78.769231 78.769231 0 0 0 111.379693 0l472.615384-472.615385a78.769231 78.769231 0 1 0-111.379692-111.379692L551.384615 351.310769l-416.925538-416.846769a78.769231 78.769231 0 0 0-103.975385-6.537846l-7.404307 6.537846a78.769231 78.769231 0 0 0 0 111.379692l472.615384 472.615385zM1024 856.615385a78.769231 78.769231 0 0 0 0-157.538462H78.769231a78.769231 78.769231 0 1 0 0 157.538462h945.230769z"  horiz-adv-x="1103" />
+      
+      <glyph glyph-name="pencil" unicode="&#58943;" d="M884.342903 221.101646a46.544714 46.544714 0 0 0 46.544714-46.544714V-34.894281a93.089428 93.089428 0 0 0-93.089428-93.089428h-151.270321a46.544714 46.544714 0 0 0 0 93.089428H837.798189v209.451213a46.544714 46.544714 0 0 0 46.544714 46.544714zM837.798189 896a93.089428 93.089428 0 0 0 93.089428-93.089428v-232.72357a46.544714 46.544714 0 0 0-93.089428 0V802.910572H186.172192v-837.804853h139.634142a46.544714 46.544714 0 0 0 0-93.089428H186.172192a93.089428 93.089428 0 0 0-93.089428 93.089428V802.910572a93.089428 93.089428 0 0 0 93.089428 93.089428h651.625997zM651.619332 616.731716a46.544714 46.544714 0 0 0 0-93.089428H325.806334a46.544714 46.544714 0 1 0 0 93.089428h325.812998zM848.17766 436.603672a46.544714 46.544714 0 0 0 72.330486-58.64634l-395.63007-488.719497a46.544714 46.544714 0 1 0-72.330486 58.64634l395.63007 488.719497zM511.98519 430.552859a46.544714 46.544714 0 1 0 0-93.089428H325.806334a46.544714 46.544714 0 0 0 0 93.089428h186.178856z"  horiz-adv-x="1024" />
+      
+      <glyph glyph-name="share" unicode="&#58944;" d="M793.6 896a179.2 179.2 0 1 0 0-358.4 179.2 179.2 0 0 0 0 358.4zM230.4 563.2a179.2 179.2 0 1 0 0-358.4 179.2 179.2 0 0 0 0 358.4zM639.0784 694.6816a51.2 51.2 0 1 0 53.0432-87.552l-324.096-196.4032a51.2 51.2 0 0 0-53.0944 87.552l324.1472 196.4032zM297.3696 344.4224a51.2 51.2 0 0 0 70.144 18.0224l341.504-201.8304a51.2 51.2 0 0 0-52.0704-88.1152l-341.504 201.7792a51.2 51.2 0 0 0-18.0736 70.144zM793.6 230.4a179.2 179.2 0 1 0 0-358.4 179.2 179.2 0 0 0 0 358.4z"  horiz-adv-x="1024" />
+      
+    </font>
+  </defs>
+</svg>

BIN
public/assets/addons/cms/fonts/iconfont/iconfont.ttf


BIN
public/assets/addons/cms/fonts/iconfont/iconfont.woff


BIN
public/assets/addons/cms/fonts/iconfont/iconfont.woff2


BIN
public/assets/addons/cms/fonts/share/share.eot


+ 88 - 0
public/assets/addons/cms/fonts/share/share.svg

@@ -0,0 +1,88 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+Created by FontForge 20120731 at Sat Nov 28 22:48:50 2015
+ By Ads
+</metadata>
+<defs>
+<font id="iconfont" horiz-adv-x="1024" >
+  <font-face 
+    font-family="iconfont"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    panose-1="2 0 6 3 0 0 0 0 0 0"
+    ascent="896"
+    descent="-128"
+    x-height="792"
+    bbox="-0.097561 -77 1024.92 839"
+    underline-thickness="50"
+    underline-position="-100"
+    unicode-range="U+0078-F20A"
+  />
+<missing-glyph horiz-adv-x="374" 
+d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
+    <glyph glyph-name=".notdef" horiz-adv-x="374" 
+d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
+    <glyph glyph-name=".null" horiz-adv-x="0" 
+ />
+    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" 
+ />
+    <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" 
+d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
+t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
+t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
+    <glyph glyph-name="uniF00A" unicode="&#xf00a;" 
+d="M911 512l-334 1q19 79 23 116q4 45 -3 76q-11 47 -34 90q-6 12 -17 18.5t-24 6.5h-65q-13 0 -23.5 -6.5t-17 -17t-6.5 -23.5v-35v-32v-26q0 -10 -1 -11q-12 -26 -26.5 -52t-29.5 -51.5t-32 -49.5q-6 -9 -11.5 -17t-11.5 -16t-12.5 -16t-13.5 -15q-13 -14 -13 -32v-411
+q0 -19 13 -33q28 -28 73 -28q323 1 440 1q13 0 24 6t17 17l119 203q6 11 9 22.5t3 23.5l1 244q0 13 -6.5 24t-17 17t-23.5 6zM155 445h-42q-13 0 -24 -6t-17 -17t-6 -24v-403q0 -19 13.5 -33t33.5 -14h42q13 0 23.5 6.5t17 17t6.5 23.5v403q0 20 -14 33.5t-33 13.5z" />
+    <glyph glyph-name="uniF01A" unicode="&#xf01a;" 
+d="M260 740q0 -41 -29.5 -69.5t-76.5 -28.5q-45 0 -74 28.5t-29 69.5q0 43 29 71t76 28t74.5 -28t29.5 -71zM57 -69v633h197v-633h-197zM371 361q0 89 -4 203h170l10 -88h4q61 103 194 103q103 0 165.5 -69t62.5 -204v-375h-197v351q0 137 -100 137q-72 0 -101 -74
+q-6 -12 -6 -49v-365h-198v430z" />
+    <glyph glyph-name="uniF03A" unicode="&#xf03a;" 
+d="M751 815v-142h-84q-46 0 -62 -19t-16 -58v-101h157l-21 -158h-136v-407h-164v407h-136v158h136v117q0 100 56 154.5t148 54.5q79 0 122 -6z" />
+    <glyph glyph-name="uniF04A" unicode="&#xf04a;" 
+d="M629 830h-245q-37 0 -69 -4t-71.5 -19t-71.5 -41q-37 -31 -56.5 -72.5t-19.5 -82.5q0 -46 22.5 -87t68.5 -68t106 -27h7h8q2 0 7.5 0.5t7.5 1t8 0.5q-1 -1 -2 -4t-1.5 -4t-1.5 -4l-2 -5q0 -1 -1 -3.5t-1.5 -4.5t-1 -4.5t-0.5 -5t-0.5 -5t-0.5 -5.5q0 -17 6.5 -33
+t11.5 -23t18 -23q-18 -1 -26.5 -1.5t-29 -2.5t-33.5 -4.5t-34 -6.5t-36.5 -9t-34 -12.5t-33.5 -16.5q-48 -28 -69.5 -66.5t-21.5 -75.5q0 -69 66.5 -117.5t188.5 -48.5q74 0 134.5 19t98.5 50.5t58.5 70t20.5 80.5q0 19 -3.5 36t-11.5 32t-15 26.5t-21 24.5t-23 21t-26 22
+l-43 32q-9 8 -14 12.5t-10.5 15.5t-5.5 22.5t6 23t11 17t16 16.5q24 18 37.5 30.5t30 33t24 45.5t7.5 56t-8.5 57.5t-24 46.5t-25.5 30t-26 22h74zM524 120q0 -36 -19.5 -64t-59.5 -44.5t-95 -16.5q-94 0 -151.5 39.5t-57.5 102.5q0 83 102 119q57 19 125 19h6h4
+q3 0 4.5 -0.5t3.5 -0.5h5q2 0 4 -1q75 -51 102 -81t27 -72zM429 494q-33 -33 -80 -33q-36 0 -66 21t-47 53.5t-26 67t-9 65.5q0 54 26 86q14 17 36.5 27.5t46.5 10.5q46 0 81.5 -37t51.5 -84.5t16 -92.5v-10q0 -4 -1 -10.5t-2 -12.5t-3.5 -13t-5.5 -13.5t-7.5 -13
+t-10.5 -11.5zM865 653v118h-59v-118h-119v-58h119v-118h59v118h118v58h-118z" />
+    <glyph glyph-name="uniF05A" unicode="&#xf05a;" 
+d="M540 185h370v370h-369l-1 85h285v114h-285v85h-142v-284h-256v-370h199v-258zM284 279v175h484v-175h-484zM853 100q-17 0 -33 -6.5t-27.5 -18t-18 -27.5t-6.5 -33.5t6.5 -33.5t18 -27.5t27.5 -18.5t33 -7q35 0 60 25.5t25 61t-25 60.5t-60 25zM597.5 100
+q-35.5 0 -60.5 -25t-25 -60.5t25 -61t60.5 -25.5t60 25.5t24.5 61t-24.5 60.5t-60 25zM171 100q-14 0 -27 -4t-23.5 -12t-18.5 -18.5t-12 -24t-4 -27.5q0 -35 24.5 -60.5t60 -25.5t60.5 25.5t25 60.5q0 18 -7 34t-18 27.5t-27 18t-33 6.5z" />
+    <glyph glyph-name="uniF06A" unicode="&#xf06a;" horiz-adv-x="1025" 
+d="M1024 702q-58 -26 -121 -34q33 20 57 50t36 67q-63 -37 -134 -51q-62 66 -153 66q-57 0 -105.5 -28t-76.5 -76.5t-28 -105.5q0 -8 0.5 -16t2 -16t2.5 -16q-129 7 -241.5 65t-191.5 155q-13 -24 -20.5 -51t-7.5 -55q0 -36 11.5 -69t32.5 -60t49 -46q-50 2 -95 26v-2
+q0 -76 48 -134t121 -72q-27 -8 -56 -8q-5 0 -10 1h-10q-5 1 -9.5 1.5t-9.5 1.5q20 -63 74 -103.5t122 -42.5q-36 -28 -77.5 -48t-88 -31t-95.5 -11q-25 0 -50 3q147 -94 322 -94q112 0 210 35.5t168 95t120.5 136.5t75 161.5t24.5 169.5q0 14 -1 27q8 5 15.5 11t14.5 12
+l14 14q7 6 13.5 12.5t13 14t12 14.5t11.5 15t11 16z" />
+    <glyph glyph-name="uniF07A" unicode="&#xf07a;" 
+d="M435 826q-94 -21 -163.5 -85.5t-98.5 -155.5t-8 -186q7 -34 21 -66q4 -9 12.5 -15t18 -7t18.5 3q15 6 20.5 20.5t-0.5 28.5q-11 25 -17 53q-17 74 6 146t78 123t129.5 67.5t145.5 -6.5t121.5 -78.5t67 -130t-6 -146.5t-77.5 -123t-130 -67q-44 -10 -89 -5q-15 1 -27 -9
+t-13.5 -25t8.5 -27.5t25 -13.5q56 -6 112 7q94 20 164 85t98.5 155.5t8 185t-84.5 164.5t-154.5 99t-184.5 9zM542 339q57 13 88 62t18 106q-8 37 -33 64.5t-60.5 39t-72.5 3.5q-57 -13 -88 -62t-19 -106q5 -21 16 -41q-70 -81 -105 -197t-16 -239q2 -16 14.5 -25t28.5 -7
+q1 1 2 1q14 3 22.5 15.5t6.5 26.5q-17 105 12.5 204.5t88.5 168.5q46 -25 97 -14z" />
+    <glyph glyph-name="uniF08A" unicode="&#xf08a;" 
+d="M767 277q-9 -8 -11 -13.5t0 -16.5l4 -24q-183 2 -297 18q-6 2 0 5l289 201q11 7 -1 9q-7 1 -19 3t-21 3l-9 1q-90 11 -190 11q-170 0 -303 -30h8q225 0 374 -23q7 -2 0 -6l-289 -206l-5 -4q-2 -4 5 -5q45 -6 94 -9q59 -4 116 -4q176 0 312 32l5 1q-19 -15 -63 -30
+l42 -226q2 -12 -1.5 -19t-11 -7.5t-18.5 4.5l-241 140q-24 15 -49 -1l-240 -139q-16 -9 -25 -2.5t-5 24.5l53 284q3 9 1.5 14t-8.5 12l-210 193q-9 8 -10.5 16t4.5 13t18 6l268 30q15 2 21 5.5t12 14.5l126 262q9 17 20.5 17t19.5 -17l118 -262q5 -13 11 -17t21 -6l277 -27
+q18 -2 21.5 -12t-9.5 -23z" />
+    <glyph glyph-name="uniF09A" unicode="&#xf09a;" 
+d="M704 547q-87 0 -163 -38t-120 -103q-22 -32 -33.5 -67t-11.5 -73q0 -41 14 -78h-18q-64 0 -124 18l-124 -56l30 102q-64 43 -101 105t-37 134q0 124 104.5 213t251.5 89q128 0 227 -70t122 -176h-17zM218 557q8 -7 17 -10.5t19 -3.5q22 0 36.5 14.5t14.5 35.5q0 11 -4 20
+t-11 16q-2 2 -4 3l-4 4l-4 2l-4 2l-4 2h-6l-4 2h-6q-21 0 -36 -15q-7 -7 -10.5 -16t-3.5 -20q0 -7 1.5 -13.5t5 -12t7.5 -10.5zM1008 266q0 -126 -116 -204l23 -87l-105 49q-50 -16 -106 -16q-124 0 -213 75.5t-89 182.5q0 70 40.5 129t110.5 93q23 11 47.5 18.5t50.5 11.5
+t53 4q126 0 215 -75t89 -181zM526.5 629.5q-14.5 14.5 -35 14.5t-34.5 -15q-7 -7 -11 -16t-4 -19q0 -20 14.5 -34.5t35 -14.5t35.5 14q7 8 10.5 16.5t3.5 18.5q0 21 -14.5 35.5zM603 312q9 0 16.5 3.5t13.5 9.5q13 13 13 29q0 8 -3.5 15.5t-9.5 13.5q-12 13 -30 13
+q-6 0 -11 -1.5t-10 -4.5t-9 -7q-13 -13 -13 -28q0 -12 6 -21.5t16 -15.5q5 -3 10 -4.5t11 -1.5zM775 323q12 -13 30.5 -13t31.5 13q3 3 5 6.5t4 7.5t2.5 8t0.5 8q0 6 -1.5 11t-4 10t-6.5 9q-13 13 -31.5 13t-30.5 -13q-5 -4 -7.5 -9t-4 -10t-1.5 -11q0 -9 3 -16.5t10 -13.5z
+" />
+    <glyph glyph-name="uniF10A" unicode="&#xf10a;" 
+d="M138 773h746v-84h-746v84zM820 273v328h-617v-328h617zM292 517h439v-160h-439v160zM686 83q41 63 76 143l-90 33q-35 -97 -81 -176h-156q-39 103 -88 176l-83 -33q51 -77 83 -143h-230v-83h789v83h-220z" />
+    <glyph glyph-name="uniF11A" unicode="&#xf11a;" 
+d="M911 223q-5 31 -17 61t-25.5 50.5t-26.5 37t-21 24.5l-8 9q5 44 -2.5 73t-17.5 36l-10 8q-2 62 -18.5 112.5t-39.5 81.5t-54 53.5t-57 32.5t-54 15.5t-38.5 6t-17.5 0.5q-6 0 -16.5 -0.5t-39 -6t-54 -15.5t-57 -32.5t-54.5 -53.5t-39.5 -81.5t-17.5 -112.5q-2 -1 -4.5 -3
+t-9.5 -10t-10.5 -20.5t-7 -34t0.5 -49.5l-9 -9q-5 -5 -19.5 -23.5t-26.5 -38t-24.5 -50t-17.5 -61.5q-1 -4 -1 -10t1 -22t3.5 -28t9 -21t15.5 -8t25 17t37 50q23 -62 64 -117q-3 -1 -8 -3.5t-17.5 -10t-21.5 -17t-16 -26t-5 -34.5q0 -2 0.5 -4.5t3 -10t8 -14t17.5 -14.5
+t28 -13.5t42.5 -9t58.5 -2.5q13 1 32.5 4t59.5 17t55 36h30q31 -44 141 -56l6 -1q45 -1 78 5.5t47.5 15.5t23 21.5t9 17.5t0.5 8q2 18 -4.5 34t-16.5 26t-20.5 17.5t-18.5 10.5l-8 3q9 11 17 23.5t14 23.5l12 22q6 11 9.5 19.5t6.5 15t4 9.5l1 4q21 -34 37 -50t25.5 -17
+t15.5 8t8.5 21t3.5 28t1 23v9v0z" />
+    <glyph glyph-name="uniF12A" unicode="&#xf12a;" horiz-adv-x="1026" 
+d="M0 242q0 65 40 140t113 147q96 97 195.5 134.5t140.5 -3.5q36 -36 11 -119q-2 -9 0 -12t5 -4t8 0t8 2l3 1q80 34 141.5 34t87.5 -35q25 -35 0 -101q-1 -8 -3 -11t3 -7.5t7 -5.5t9 -3q33 -10 59.5 -26.5t45 -47t19.5 -66.5q0 -39 -20.5 -79t-62.5 -79t-96 -66.5t-129 -48
+t-155 -17.5t-157.5 19.5t-137 52.5t-98.5 87t-37 114zM104 201q5 -55 51 -97t118.5 -62t156.5 -12q128 13 211 80.5t76 151.5q-5 54 -50 96t-120 62.5t-157 12.5q-127 -13 -211 -80.5t-75 -151.5zM237 151q-24 52 3 106q27 53 86.5 80t120.5 10q63 -16 90.5 -67.5
+t1.5 -109.5t-90.5 -85t-127.5 -7q-62 19 -84 73zM283 166q5 -21 24.5 -30t43 -1t35.5 28q11 18 6 38.5t-25 28.5q-20 9 -42.5 0.5t-33.5 -25.5q-13 -20 -8 -39zM403 247q-10 -19 8 -27q8 -2 16 1t12 10q6 8 2.5 16t-10.5 10q-7 3 -16 0t-12 -10zM666 746q-3 16 5 30.5
+t25 16.5q70 14 139.5 -6.5t118.5 -76.5q50 -56 65 -128.5t-8 -137.5q-5 -16 -19.5 -23t-30 -2t-22.5 19.5t-3 29.5q16 47 6 98t-46 90q-36 40 -85 54.5t-98 5.5q-17 -3 -30 6t-17 24zM699 616q-3 15 5.5 26t20.5 14q35 8 68.5 -2.5t57.5 -37t31 -62.5t-3 -68
+q-5 -12 -17.5 -19t-25.5 -2t-20 17.5t-2 25.5q11 36 -13.5 62.5t-61.5 20.5q-13 -3 -25 4t-15 21z" />
+    <glyph glyph-name="uniF20A" unicode="&#xf20a;" 
+d="M945 677q-23 37 -54.5 64t-68.5 42.5t-79 18.5q-148 7 -228 -101l-1 2q-1 1 -2 1q0 -3 -3 -3q-80 108 -228 101q-60 -3 -113 -36t-89 -89q-26 -41 -36 -89.5t-5 -99t25 -102.5t54 -98q53 -69 89 -110q122 -134 282 -240l21 -15h6l21 15q78 52 150 113t132 127
+q11 13 24 28.5t22.5 28t22 28t20.5 25.5q69 94 79.5 200.5t-41.5 188.5z" />
+  </font>
+</defs></svg>

BIN
public/assets/addons/cms/fonts/share/share.ttf


BIN
public/assets/addons/cms/fonts/share/share.woff


+ 56 - 0
public/assets/addons/cms/hybrid/html/index.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+
+	<head>
+		<meta charset="UTF-8">
+		<title class="title">[文件管理器]</title>
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<style type="text/css">
+			.content {background: transparent;}
+			.fixed {position: fixed;bottom: 0;left: 0;right: 0;width: 100%;}
+			.content .mask {top: 0;background: rgba(0,0,0,.4);z-index: 90;}
+			.content .file-content {z-index: 91;height: 60px;background: #fff;text-align: center;}
+			.btn {position: relative;}
+			.btn .file {position: absolute;z-index: 93;left: 0;right: 0;top: 0;bottom: 0;height: 60px;width: 100%;opacity: 0;}
+			.btn-bg {margin-top: 10px;background: #0066CC;color: #fff;width: 80%;height: 40px;border: 0;border-radius: 5px;}
+			.tis {top: 0;z-index: 95;display: none;justify-content: center;align-items: center;}
+			.tis .tis-content {background: #fff;width: 60%;border-radius: 10px;padding: 20px 0;}
+			.tis .tis-content img {width: 50px;height: 50px;}
+			.tis-progress {margin: 10px 0;color: #999;}
+			.cancel-btn {margin-top: 30px;height: 30px;line-height: 1;padding: 0 2em;background: #e3e3e3;color: #898989;border: 0;border-radius: 5px;}
+		</style>
+	</head>
+
+	<body>
+		
+		<div class="content">
+			
+			<div class="fixed mask"></div>
+			
+			<div align="center" class="fixed tis">
+				<div class="tis-content">
+					<div>
+						<img src="../../static/home.png" >
+					</div>
+					<div class="tis-progress">
+						努力上传中..
+					</div>
+					<div class="cancel">
+						<button type="button" class="cancel-btn">取消上传</button>
+					</div>
+				</div>
+			</div>
+			
+			<div class="fixed file-content">
+				<div class="btn">
+					<button type="button" class="btn-bg">打开文件管理器</button>
+					<input class="file" type="file" />
+				</div>
+			</div>
+		</div>
+		
+		<script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
+		<script src="js/h5-uploader.js" type="text/javascript" charset="utf-8"></script>
+	</body>
+
+</html>

+ 93 - 0
public/assets/addons/cms/hybrid/html/js/h5-uploader.js

@@ -0,0 +1,93 @@
+let mask = document.querySelector(".mask");
+let fileDom = document.querySelector(".file");
+let tis = document.querySelector(".tis");
+let progress = document.querySelector(".tis-progress");
+let cancel = document.querySelector(".cancel-btn");
+
+
+let createUpload = (file, url, key = 'file', header = {}, data = {}) => {
+	console.log(`
+	上传地址:${url}\n
+	请求头:${JSON.stringify(header)}\n
+	参数:${JSON.stringify(data)}
+	`);
+	if (!url) {
+		return;
+	}
+	tis.style.display = 'flex';
+
+	let formData = new FormData();
+	formData.append(key, file);
+
+	for (let keys in data) {
+		formData.append(keys, data[keys]);
+	}
+
+	let xhr = new XMLHttpRequest();
+	xhr.open("POST", url, true);
+
+	for (let keys in header) {
+		xhr.setRequestHeader(keys, header[keys]);
+	}
+	xhr.upload.addEventListener("progress", function(event) {
+		if (event.lengthComputable) {
+			let percent = Math.ceil(event.loaded * 100 / event.total) + "%";
+			progress.innerText = `努力上传中..${percent}`;
+		}
+	}, false);
+
+	xhr.ontimeout = function() {
+		// xhr请求超时事件处理
+		progress.innerText = '请求超时';
+		setTimeout(() => {
+			tis.style.display = 'none';
+			plus.webview.currentWebview().close();
+		}, 1000);
+	};
+
+	xhr.onreadystatechange = (ev) => {
+
+		if (xhr.readyState == 4) {
+			console.log('status:' + xhr.status);
+			if (xhr.status == 200) {
+				progress.innerText = '上传成功';
+				location.href = `callback?fileName=${escape(file.name)}&id=${escape(xhr.responseText)}`;
+			} else {
+				progress.innerText = '上传失败了';
+			}
+			setTimeout(() => {
+				tis.style.display = 'none';
+				plus.webview.currentWebview().close();
+			}, 1000);
+
+		}
+	};
+	xhr.send(formData);
+
+	cancel.addEventListener("click", () => {
+		xhr.abort();
+		plus.webview.currentWebview().close();
+	});
+}
+
+
+mask.addEventListener("click", () => {
+	plus.webview.currentWebview().close();
+});
+
+document.addEventListener('UniAppJSBridgeReady', () => {
+	let {
+		url,
+		key,
+		header,
+		formData
+	} = plus.webview.currentWebview();
+	fileDom.addEventListener('change', (event) => {
+		let file = fileDom.files[0];
+		if (file.size > (1024 * 1024 * 10)) {
+			plus.nativeUI.toast('单个文件请勿超过10M,请重新上传');
+			return;
+		}
+		createUpload(file, url, key, header, formData);
+	}, false);
+});

BIN
public/assets/addons/cms/img/1110x300.png


BIN
public/assets/addons/cms/img/140x50.png


BIN
public/assets/addons/cms/img/150x50.png


BIN
public/assets/addons/cms/img/650x270.png


BIN
public/assets/addons/cms/img/720x300.png


BIN
public/assets/addons/cms/img/720x600.png


BIN
public/assets/addons/cms/img/750x340.png


BIN
public/assets/addons/cms/img/800x600-1.png


BIN
public/assets/addons/cms/img/800x600-2.png


BIN
public/assets/addons/cms/img/800x600-3.png


BIN
public/assets/addons/cms/img/800x600-4.png


BIN
public/assets/addons/cms/img/800x600.png


BIN
public/assets/addons/cms/img/author-head.jpeg


BIN
public/assets/addons/cms/img/border.png


BIN
public/assets/addons/cms/img/colorful.png


BIN
public/assets/addons/cms/img/icons.png


+ 1 - 0
public/assets/addons/cms/img/icons.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?> <!-- Generator: IcoMoon.io --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="120" height="24" viewBox="0 0 120 24" fill="#ffffff" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M 17.384,17.705q0.00,0.536 -0.375,0.911l-1.821,1.821q-0.375,0.375 -0.911,0.375t-0.911-0.375l-3.938-3.938l-3.938,3.938q-0.375,0.375 -0.911,0.375t-0.911-0.375l-1.821-1.821q-0.375-0.375 -0.375-0.911t 0.375-0.911l 3.938-3.938l-3.938-3.938q-0.375-0.375 -0.375-0.911t 0.375-0.911l 1.821-1.821q 0.375-0.375 0.911-0.375t 0.911,0.375l 3.938,3.938l 3.938-3.938q 0.375-0.375 0.911-0.375t 0.911,0.375l 1.821,1.821q 0.375,0.375 0.375,0.911 t-0.375,0.911l-3.938,3.938l 3.938,3.938q 0.375,0.375 0.375,0.911zM 57.938,21.067l-8.732-8.719q-0.496-0.496 -0.496-1.212t 0.496-1.212l 8.732-8.719q 0.496-0.496 1.212-0.496t 1.212,0.496l 1.004,1.004q 0.496,0.496 0.496,1.212t-0.496,1.212l-6.509,6.509l 6.509,6.496q 0.496,0.509 0.496,1.219t-0.496,1.205l-1.004,1.004q-0.496,0.496 -1.212,0.496t-1.212-0.496zM 110.719,11.143q0.00,0.696 -0.496,1.219l-8.732,8.719q-0.496,0.496 -1.205,0.496t-1.205-0.496l-1.018-1.004q-0.496-0.522 -0.496-1.219q0.00-0.71 0.496-1.205l 6.509-6.509l-6.509-6.496q-0.496-0.522 -0.496-1.219q0.00-0.71 0.496-1.205l 1.018-1.004q 0.482-0.509 1.205-0.509t 1.205,0.509l 8.732,8.719q 0.496,0.496 0.496,1.205z"></path></svg>

BIN
public/assets/addons/cms/img/loader.gif


BIN
public/assets/addons/cms/img/loading.gif


BIN
public/assets/addons/cms/img/logo.png


BIN
public/assets/addons/cms/img/new.png


BIN
public/assets/addons/cms/img/noimage.jpg


BIN
public/assets/addons/cms/img/noimage.png


BIN
public/assets/addons/cms/img/overlay.png


BIN
public/assets/addons/cms/img/plus.png


BIN
public/assets/addons/cms/img/qrcode.png


BIN
public/assets/addons/cms/img/search.png


+ 8 - 0
public/assets/addons/cms/img/search.svg

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="search" transform="translate(8.000000, 8.000000) scale(-1, 1) translate(-8.000000, -8.000000) " fill="#666666" fill-rule="nonzero">
+            <path d="M15.7,14.3 L11.5,10.1 C11.3,9.9 11,9.8 10.7,9.8 C11.5,8.8 12,7.4 12,6 C12,2.7 9.3,8.8817842e-16 6,8.8817842e-16 C2.7,8.8817842e-16 0,2.7 0,6 C0,9.3 2.7,12 6,12 C7.4,12 8.8,11.5 9.8,10.6 C9.8,10.9 9.8,11.2 10.1,11.4 L14.3,15.6 C14.5,15.8 14.8,15.9 15,15.9 C15.2,15.9 15.5,15.8 15.7,15.6 C16.1,15.3 16.1,14.7 15.7,14.3 Z M6,10.5 C3.5,10.5 1.5,8.5 1.5,6 C1.5,3.5 3.5,1.5 6,1.5 C8.5,1.5 10.5,3.5 10.5,6 C10.5,8.5 8.5,10.5 6,10.5 Z" id="Shape"></path>
+        </g>
+    </g>
+</svg>

BIN
public/assets/addons/cms/img/statusbar.png


BIN
public/assets/addons/cms/img/tabbar/article-hl.png


BIN
public/assets/addons/cms/img/tabbar/article.png


BIN
public/assets/addons/cms/img/tabbar/download-hl.png


BIN
public/assets/addons/cms/img/tabbar/download.png


BIN
public/assets/addons/cms/img/tabbar/home-hl.png


BIN
public/assets/addons/cms/img/tabbar/home.png


BIN
public/assets/addons/cms/img/tabbar/image-hl.png


BIN
public/assets/addons/cms/img/tabbar/image.png


BIN
public/assets/addons/cms/img/tabbar/my-hl.png


BIN
public/assets/addons/cms/img/tabbar/my.png


BIN
public/assets/addons/cms/img/tabbar/special-hl.png


BIN
public/assets/addons/cms/img/tabbar/special.png


BIN
public/assets/addons/cms/img/wave-bot.png


BIN
public/assets/addons/cms/img/wave-mid.png


BIN
public/assets/addons/cms/img/wave-top.png


+ 31 - 0
public/assets/addons/cms/js/base.js

@@ -0,0 +1,31 @@
+define(['table'], function (Table) {
+    return {
+        api: {
+            getCustomFields: function (fields, table) {
+                var result = [];
+                $.each(fields, function (i, j) {
+                    if (j.type === 'editor') {
+                        return true;
+                    }
+                    var param = {field: j.field, title: j.title, table: table, operate: (j.type === 'number' ? '=' : 'like'), formatter: Table.api.formatter.content, class: 'autocontent'};
+                    //如果是图片,加上formatter
+                    if (j.type === 'image' || j.type === 'images') {
+                        param.events = Table.api.events.image;
+                        param.formatter = Table.api.formatter.images;
+                    } else if (j.type === 'file' || j.type === 'files') {
+                        param.formatter = Table.api.formatter.files;
+                    } else if (j.type === 'radio' || j.type === 'checkbox' || j.type === 'select' || j.type === 'selects') {
+                        param.formatter = Table.api.formatter.label;
+                        param.extend = j.content;
+                        param.searchList = j.content;
+                    } else {
+                        param.formatter = Table.api.formatter.content;
+                        param.classname = 'autocontent';
+                    }
+                    result.push(param);
+                });
+                return result;
+            }
+        }
+    }
+});

File diff suppressed because it is too large
+ 9 - 0
public/assets/addons/cms/js/bootstrap-typeahead.min.js


File diff suppressed because it is too large
+ 6 - 0
public/assets/addons/cms/js/clipboard.min.js


+ 171 - 0
public/assets/addons/cms/js/cms.js

@@ -0,0 +1,171 @@
+var CMS = {
+
+    events: {
+        //请求成功的回调
+        onAjaxSuccess: function (ret, onAjaxSuccess) {
+            var data = typeof ret.data !== 'undefined' ? ret.data : null;
+            var msg = typeof ret.msg !== 'undefined' && ret.msg ? ret.msg : '操作成功';
+
+            if (typeof onAjaxSuccess === 'function') {
+                var result = onAjaxSuccess.call(this, data, ret);
+                if (result === false)
+                    return;
+            }
+            layer.msg(msg, {icon: 1});
+        },
+        //请求错误的回调
+        onAjaxError: function (ret, onAjaxError) {
+            var data = typeof ret.data !== 'undefined' ? ret.data : null;
+            var msg = typeof ret.msg !== 'undefined' && ret.msg ? ret.msg : '操作失败';
+            if (typeof onAjaxError === 'function') {
+                var result = onAjaxError.call(this, data, ret);
+                if (result === false) {
+                    return;
+                }
+            }
+            layer.msg(msg, {icon: 2});
+        },
+        //服务器响应数据后
+        onAjaxResponse: function (response) {
+            try {
+                var ret = typeof response === 'object' ? response : JSON.parse(response);
+                if (!ret.hasOwnProperty('code')) {
+                    $.extend(ret, {code: -2, msg: response, data: null});
+                }
+            } catch (e) {
+                var ret = {code: -1, msg: e.message, data: null};
+            }
+            return ret;
+        }
+    },
+    api: {
+        //获取修复后可访问的cdn链接
+        cdnurl: function (url) {
+            return /^(?:[a-z]+:)?\/\//i.test(url) ? url : Config.upload.cdnurl + url;
+        },
+        //发送Ajax请求
+        ajax: function (options, success, error) {
+            options = typeof options === 'string' ? {url: options} : options;
+            var st, index = 0;
+            st = setTimeout(function () {
+                index = layer.load();
+            }, 150);
+            options = $.extend({
+                type: "POST",
+                dataType: "json",
+                xhrFields: {
+                    withCredentials: true
+                },
+                success: function (ret) {
+                    clearTimeout(st);
+                    index && layer.close(index);
+                    ret = CMS.events.onAjaxResponse(ret);
+                    if (ret.code === 1) {
+                        CMS.events.onAjaxSuccess(ret, success);
+                    } else {
+                        CMS.events.onAjaxError(ret, error);
+                    }
+                },
+                error: function (xhr) {
+                    clearTimeout(st);
+                    index && layer.close(index);
+                    var ret = {code: xhr.status, msg: xhr.statusText, data: null};
+                    CMS.events.onAjaxError(ret, error);
+                }
+            }, options);
+            return $.ajax(options);
+        },
+        //提示并跳转
+        msg: function (message, url) {
+            var callback = typeof url === 'function' ? url : function () {
+                if (typeof url !== 'undefined' && url) {
+                    location.href = url;
+                }
+            };
+            layer.msg(message, {
+                icon: 1,
+                time: 2000
+            }, callback);
+        },
+        //表单提交事件
+        form: function (elem, success, error, submit) {
+            var delegation = typeof elem === 'object' && typeof elem.prevObject !== 'undefined' ? elem.prevObject : document;
+            $(delegation).on("submit", elem, function (e) {
+                var form = $(e.target);
+                if (typeof submit === 'function') {
+                    if (false === submit.call(form, success, error)) {
+                        return false;
+                    }
+                }
+                $("[type=submit]", form).prop("disabled", true);
+                CMS.api.ajax({
+                    url: form.attr("action"),
+                    data: form.serialize(),
+                    complete: function (xhr) {
+                        var token = xhr.getResponseHeader('__token__');
+                        if (token) {
+                            $("input[name='__token__']").val(token);
+                        }
+                        $("[type=submit]", form).prop("disabled", false);
+                    }
+                }, function (data, ret) {
+                    //刷新客户端token
+                    if (data && typeof data.token !== 'undefined') {
+                        $("input[name='__token__']").val(data.token);
+                    }
+                    //自动保存草稿设置
+                    var autosaveKey = $("textarea[data-autosave-key]", form).data("autosave-key");
+                    if (autosaveKey && localStorage) {
+                        localStorage.removeItem("autosave-" + autosaveKey);
+                        $(".md-autosave", form).addClass("hidden");
+                    }
+                    if (typeof success === 'function') {
+                        if (false === success.call(form, data, ret)) {
+                            return false;
+                        }
+                    }
+                }, function (data, ret) {
+                    //刷新客户端token
+                    if (data && typeof data.token !== 'undefined') {
+                        $("input[name='__token__']").val(data.token);
+                    }
+                    if (typeof error === 'function') {
+                        if (false === error.call(form, data, ret)) {
+                            return false;
+                        }
+                    }
+                });
+                return false;
+            });
+        },
+        //localStorage存储
+        storage: function (key, value) {
+            key = key.split('.');
+
+            var _key = key[0];
+            var o = JSON.parse(localStorage.getItem(_key));
+
+            if (typeof value === 'undefined') {
+                if (o == null)
+                    return null;
+                if (key.length === 1) {
+                    return o;
+                }
+                _key = key[1];
+                return typeof o[_key] !== 'undefined' ? o[_key] : null;
+            } else {
+                if (key.length === 1) {
+                    o = value;
+                } else {
+                    if (o && typeof o === 'object') {
+                        o[key[1]] = value;
+                    } else {
+                        o = {};
+                        o[key[1]] = value;
+                    }
+                }
+                localStorage.setItem(_key, JSON.stringify(o));
+            }
+        }
+    }
+}

+ 467 - 0
public/assets/addons/cms/js/common.js

@@ -0,0 +1,467 @@
+$(function () {
+    window.isMobile = !!("ontouchstart" in window);
+
+    function AddFavorite(sURL, sTitle) {
+        if (/firefox/i.test(navigator.userAgent)) {
+            return false;
+        } else if (window.external && window.external.addFavorite) {
+            window.external.addFavorite(sURL, sTitle);
+            return true;
+        } else if (window.sidebar && window.sidebar.addPanel) {
+            window.sidebar.addPanel(sTitle, sURL, "");
+            return true;
+        } else {
+            var touch = (navigator.userAgent.toLowerCase().indexOf('mac') != -1 ? 'Command' : 'CTRL');
+            layer.msg('请使用 ' + touch + ' + D 添加到收藏夹.');
+            return false;
+        }
+    }
+
+    var len = function (str) {
+        if (!str)
+            return 0;
+        var length = 0;
+        for (var i = 0; i < str.length; i++) {
+            if (str.charCodeAt(i) >= 0x4e00 && str.charCodeAt(i) <= 0x9fa5) {
+                length += 2;
+            } else {
+                length++;
+            }
+        }
+        return length;
+    };
+
+    //new LazyLoad({elements_selector: ".lazy"});
+
+    layer.config({focusBtn: false});
+
+    //栏目高亮
+    var nav = $("header.header .navbar-nav");
+    if ($("li.active", nav).length === 0) {
+        var current = nav.data("current");
+        var currentNav = $("a[href='" + location.href + "']", nav)[0] || $("a[href='" + location.pathname + "']", nav)[0] || $("li[value='" + current + "'] > a", nav)[0];
+        currentNav && $(currentNav, nav).parents("li").addClass("active");
+    }
+
+    $(".collapse.navbar-collapse.active").on("mousedown click", ".dropdown-menu .dropdown-submenu a[data-toggle='dropdown']", function (e) {
+        e.stopPropagation();
+    });
+
+    $("header.header .navbar-right").insertBefore($("header.header .navbar-right").prev());
+
+    //移动浏览器左右滑动
+    $(document).on('touchstart', '.carousel', function (event) {
+        const xClick = event.originalEvent.touches[0].pageX;
+        $(this).one('touchmove', function (event) {
+            const xMove = event.originalEvent.touches[0].pageX;
+            const sensitivityInPx = 5;
+
+            if (Math.floor(xClick - xMove) > sensitivityInPx) {
+                $(this).carousel('next');
+            } else if (Math.floor(xClick - xMove) < -sensitivityInPx) {
+                $(this).carousel('prev');
+            }
+        });
+        $(this).on('touchend', function () {
+            $(this).off('touchmove');
+        });
+    });
+
+    // 点击收藏
+    $(".addbookbark").attr("rel", "sidebar").click(function () {
+        //使用数据库收藏
+        CMS.api.ajax({
+            url: $(this).data("action"),
+            data: {type: $(this).data("type"), aid: $(this).data("aid")}
+        });
+        //使用浏览器收藏
+        //return !AddFavorite(window.location.href, $(this).attr("title"));
+    });
+
+    // 点赞
+    $(document).on("click", ".btn-like", function () {
+        var that = this;
+        var id = $(this).data("id");
+        var type = $(this).data("type");
+        if (CMS.api.storage(type + "vote." + id)) {
+            layer.msg("你已经点过赞了");
+            return false;
+        }
+        CMS.api.ajax({
+            data: $(this).data()
+        }, function (data, ret) {
+            $("span", that).text(type === 'like' ? ret.data.likes : ret.data.dislikes);
+            CMS.api.storage(type + "vote." + id, true);
+            return false;
+        }, function () {
+            return false;
+        });
+    });
+
+    // 加载更多
+    $(document).on("click", ".btn-loadmore", function () {
+        var that = this;
+        var page = parseInt($(this).data("page"));
+        var container = $(this).data("container");
+        container = container ? $(container) : $(".article-list,.product-list");
+        var loadmoreText = $(this).text();
+        $(that).text("正在加载").prop("disabled", true);
+        CMS.api.ajax({
+            url: $(that).attr("href"),
+        }, function (data, ret) {
+            if (data) {
+                $(data).appendTo(container);
+                page++;
+                $(that).attr("href", $(that).data("url").replace("__page__", page)).data("page", page);
+                $(that).text(loadmoreText).prop("disabled", false);
+            } else {
+                $(that).replaceWith('<div class="loadmore loadmore-line loadmore-nodata"><span class="loadmore-tips">暂无更多数据</span></div>');
+            }
+            return false;
+        }, function (data) {
+            $(that).text(loadmoreText).prop("disabled", false);
+        });
+        return false;
+    });
+
+    //滚动加载更多
+    $(window).scroll(function () {
+        var loadmore = $(".btn-loadmore");
+        if (loadmore.length > 0 && !loadmore.prop("disabled") && (loadmore.data("autoload") === undefined || loadmore.data("autoload"))) {
+            if ($(window).scrollTop() - loadmore.height() > loadmore.offset().top - $(window).height()) {
+                loadmore.trigger("click");
+            }
+        }
+    });
+    setTimeout(function () {
+        if ($(window).scrollTop() > 0) {
+            $(window).trigger("scroll");
+        }
+    }, 500);
+
+    //评论列表
+    if ($("#comment-container").length > 0) {
+        var ci, si;
+        $("#commentlist dl dd div,#commentlist dl dd dl dd").on({
+            mouseenter: function () {
+                clearTimeout(ci);
+                var _this = this;
+                ci = setTimeout(function () {
+                    $(_this).find("small:first").find("a").stop(true, true).css('display', 'inline-block');
+                }, 100);
+            },
+            mouseleave: function () {
+                clearTimeout(ci);
+                $(this).find("small:first").find("a").stop(true, true).fadeOut();
+            }
+        });
+        $(".reply").on("click", function () {
+            $("#pid").val($(this).data("id"));
+            $(this).parent().parent().append($("div#postcomment").detach());
+            $("#postcomment h3 a").show();
+            $("#commentcontent").focus().val($(this).attr("title"));
+        });
+        $("#postcomment h3 a").bind("click", function () {
+            $("#comment-container").append($("div#postcomment").detach());
+            $(this).hide();
+        });
+        $(".expandall a").on("click", function () {
+            $(this).parent().parent().find("dl.hide").fadeIn();
+            $(this).fadeOut();
+        });
+
+        $(document).on("click", "#submit", function () {
+            var btn = $(this);
+            var tips = $("#actiontips");
+            tips.removeClass();
+            var content = $("#commentcontent").val();
+            if (len(content) < 3) {
+                tips.addClass("text-danger").html("评论内容长度不正确!最少3个字符").fadeIn().change();
+                return false;
+            }
+            if (btn.prop("disabled")) {
+                return false;
+            }
+            var form = $("#postform");
+            btn.attr("disabled", "disabled");
+            tips.html('正在提交...');
+            $.ajax({
+                url: form.prop("action"),
+                type: 'POST',
+                data: form.serialize(),
+                dataType: 'json',
+                success: function (json) {
+                    btn.removeAttr("disabled");
+                    if (json.code == 1) {
+                        $("#pid").val(0);
+                        tips.addClass("text-success").html(json.msg || "评论成功!").fadeIn(300).change();
+                        $("#commentcontent").val('');
+                        $("#commentcount").text(parseInt($("#commentcount").text()) + 1);
+                        setTimeout(function () {
+                            location.reload();
+                        }, 1500);
+                    } else {
+                        tips.addClass("text-danger").html(json.msg).fadeIn();
+                    }
+                    if (json.data && json.data.token) {
+                        $("#postform input[name='__token__']").val(json.data.token);
+                    }
+                },
+                error: function () {
+                    btn.removeAttr("disabled");
+                    tips.addClass("text-danger").html("评论失败!请刷新页面重试!").fadeIn();
+                }
+            });
+            return false;
+        });
+        $("#commentcontent").on("keydown", function (e) {
+            if ((e.metaKey || e.ctrlKey) && (e.keyCode == 13 || e.keyCode == 10)) {
+                $("#submit").trigger('click');
+                return false;
+            }
+        });
+        $("#actiontips").on("change", function () {
+            clearTimeout(si);
+            si = setTimeout(function () {
+                $("#actiontips").fadeOut();
+            }, 8000);
+        });
+        $(document).on("keyup change", "#commentcontent", function (e) {
+            if (e.metaKey || e.ctrlKey || [13, 10, 18, 91].indexOf(e.keyCode) > -1) {
+                return false;
+            }
+            var max = 1000;
+            var c = $(this).val();
+            var length = len(c);
+            var t = $("#actiontips");
+            if (max >= length) {
+                t.removeClass().show().addClass("loading").html("你还可以输入 <font color=green>" + (Math.floor((max - length) / 2)) + "</font> 字");
+                $("#submit").removeAttr("disabled");
+            } else {
+                t.removeClass().show().addClass("loading").html("你已经超出 <font color=red>" + (Math.ceil((length - max) / 2)) + "</font> 字");
+                $("#submit").attr("disabled", "disabled");
+            }
+        });
+    }
+    // 余额支付提示
+    $(document).on('click', '.btn-balance', function (e) {
+        var that = this;
+        layer.confirm("确认支付¥" + $(this).data("price") + "元用于购买?", function () {
+            CMS.api.ajax({
+                url: $(that).attr("href")
+            }, function (data, ret) {
+                CMS.api.msg(ret.msg, ret.url);
+            }, function (data, ret) {
+                if (ret.msg && ret.msg.indexOf("登录") > -1) {
+                    layer.alert(ret.msg, {btn: ["去登录", "暂不登录"]}, function () {
+                        location.href = ret.url;
+                    });
+                    return false;
+                }
+            });
+        });
+        return false;
+    });
+    // 回到顶部
+    $('#back-to-top').on('click', function (e) {
+        e.preventDefault();
+        $('html,body').animate({
+            scrollTop: 0
+        }, 700);
+    });
+
+    //如果是PC则移除navbar的dropdown点击事件
+    if (!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobi/i.test(navigator.userAgent)) {
+        $("#navbar-collapse [data-toggle='dropdown']").removeAttr("data-toggle");
+    } else {
+        $(".navbar-nav ul li:not(.dropdown-submenu):not(.dropdown) a").removeAttr("data-toggle");
+    }
+
+    if (!isMobile) {
+        var search = $("#searchinput");
+        var form = search.closest("form");
+        search.autoComplete({
+            minChars: 1,
+            cache: false,
+            menuClass: 'autocomplete-searchmenu',
+            header: '',
+            footer: '',
+            source: function (term, response) {
+                try {
+                    xhr.abort();
+                } catch (e) {
+                }
+                xhr = $.getJSON(search.data("suggestion-url"), {q: term}, function (data) {
+                    response(data);
+                });
+            },
+            onSelect: function (e, term, item) {
+                if (typeof callback === 'function') {
+                    callback.call(elem, term, item);
+                } else {
+                    form.trigger("submit");
+                }
+            }
+        });
+    }
+
+    // 手机端左右滑动切换菜单栏
+    if (isMobile && 'ontouchstart' in document.documentElement) {
+        var startX, startY, moveEndX, moveEndY, relativeX, relativeY, element;
+        element = $('#navbar-collapse');
+        $("body").on("touchstart", function (e) {
+            startX = e.originalEvent.changedTouches[0].pageX;
+            startY = e.originalEvent.changedTouches[0].pageY;
+        });
+        $("body").on("touchend", function (e) {
+            moveEndX = e.originalEvent.changedTouches[0].pageX;
+            moveEndY = e.originalEvent.changedTouches[0].pageY;
+            relativeX = moveEndX - startX;
+            relativeY = moveEndY - startY;
+
+            //右滑
+            if (relativeX > 45) {
+                if ((Math.abs(relativeX) - Math.abs(relativeY)) > 50 && !element.hasClass("active") && startX < ($(window).width() / 4)) {
+                    $(".sidebar-toggle").trigger("click");
+                }
+            }
+            //左滑
+            else if (relativeX < -45) {
+                if ((Math.abs(relativeX) - Math.abs(relativeY)) > 50 && element.hasClass("active")) {
+                    $(".sidebar-toggle").trigger("click");
+                }
+            }
+        });
+    }
+
+    // 打赏
+    $(".btn-donate").popover({
+        trigger: 'hover',
+        placement: 'top',
+        html: true,
+        content: function () {
+            return "<img src='" + $(this).data("image") + "' width='250' height='250'/>";
+        }
+    });
+    $(document).on("click", ".btn-paynow", function () {
+        var paytype = $(this).data("paytype");
+        var price = $(this).data("price");
+        var nameArr = {wechat: "微信", alipay: "支付宝", balance: "余额"};
+        var that = this;
+        var tips = function () {
+            layer.confirm("请根据支付状态选择下面的操作按钮", {title: "温馨提示", icon: 0, btn: ["支付成功", "支付失败"]}, function () {
+                location.reload();
+            });
+        };
+        if (paytype) {
+            layer.confirm("确认使用" + (typeof nameArr[paytype] !== 'undefined' ? nameArr[paytype] : "未知") + "进行支付?<br>支付金额:¥" + price + "元", {title: "温馨提示", icon: 3, focusBtn: false, btn: ["立即支付", "取消支付"]}, function (index, layero) {
+                $(".layui-layer-btn0", layero).attr("href", $(that).attr("href")).attr("target", "_blank");
+                tips();
+            });
+            return false;
+        } else {
+            tips();
+        }
+    });
+
+    //点击切换
+    $(document).on("click", ".sidebar-toggle", function () {
+        var collapse = $("#navbar-collapse");
+        if (collapse.hasClass("active")) {
+            $(".navbar-collapse-bg").remove();
+        } else {
+            $("<div />").addClass("navbar-collapse-bg").insertAfter(collapse).on("click", function () {
+                $(".sidebar-toggle").trigger("click");
+            });
+        }
+        collapse.toggleClass("active");
+        $(this).toggleClass("active");
+    });
+
+    //内容中的图片点击事件
+    $(document).on("click", ".article-text img", function () {
+        if ($(this).closest("a").length > 0) {
+            return;
+        }
+        var that = this;
+        var data = [];
+        var index = 0;
+        $(".article-text img").each(function (i, j) {
+            if (that == this) {
+                index = i;
+            }
+            data.push({
+                "src": $(this).attr("src") //原图地址
+            });
+        });
+        layer.photos({
+            photos: {
+                "start": index, "data": data
+            },
+            // scrollbar: true,
+            // full: true,
+            // closeBtn: 1
+        });
+        return false;
+    });
+
+    //分享参数配置
+    var shareConfig = {
+        title: $("meta[property='og:title']").attr("content") || document.title,
+        description: $("meta[property='og:description']").attr("content") || $("meta[name='description']").attr("content") || "",
+        url: $("meta[property='og:url']").attr("content") || location.href,
+        image: $("meta[property='og:image']").attr("content") || ""
+    };
+
+    //微信公众号内分享
+    if (typeof wx != 'undefined') {
+        shareConfig.url = location.href;
+        CMS.api.ajax({
+                url: "/addons/cms/ajax/share",
+                data: {url: shareConfig.url},
+                loading: false
+            }, function (data, ret) {
+                try {
+                    wx.config({
+                        appId: data.appId,
+                        timestamp: data.timestamp,
+                        nonceStr: data.nonceStr,
+                        signature: data.signature,
+                        jsApiList: [
+                            'checkJsApi',
+                            'updateAppMessageShareData',
+                            'updateTimelineShareData',
+                        ]
+                    });
+                    var shareData = {
+                        title: shareConfig.title,
+                        desc: shareConfig.description,
+                        link: shareConfig.url,
+                        imgUrl: shareConfig.image,
+                        success: function () {
+                            layer.closeAll();
+                        },
+                        cancel: function () {
+                            layer.closeAll();
+                        }
+                    };
+                    wx.ready(function () {
+                        wx.updateAppMessageShareData(shareData);
+                        wx.updateTimelineShareData(shareData);
+                    });
+
+                } catch (e) {
+                    console.log(e);
+                }
+                return false;
+            }, function () {
+                return false;
+            }
+        );
+
+        $(".social-share").on("click", ".icon-wechat", function () {
+            layer.msg("请点击右上角的●●●进行分享");
+            return false;
+        }).find(".wechat-qrcode").remove();
+    }
+});

+ 215 - 0
public/assets/addons/cms/js/jquery.autocomplete.js

@@ -0,0 +1,215 @@
+/*
+	jQuery autoComplete v1.0.7
+    Copyright (c) 2014 Simon Steinberger / Pixabay
+    GitHub: https://github.com/Pixabay/jQuery-autoComplete
+	License: http://www.opensource.org/licenses/mit-license.php
+*/
+
+(function ($) {
+    $.fn.autoComplete = function (options) {
+        var o = $.extend({}, $.fn.autoComplete.defaults, options);
+
+        // public methods
+        if (typeof options == 'string') {
+            this.each(function () {
+                var that = $(this);
+                if (options == 'destroy') {
+                    $(window).off('resize.autocomplete', that.updateSC);
+                    that.off('blur.autocomplete focus.autocomplete keydown.autocomplete keyup.autocomplete');
+                    if (that.data('autocomplete'))
+                        that.attr('autocomplete', that.data('autocomplete'));
+                    else
+                        that.removeAttr('autocomplete');
+                    $(that.data('sc')).remove();
+                    that.removeData('sc').removeData('autocomplete');
+                }
+            });
+            return this;
+        }
+
+        return this.each(function () {
+            var that = $(this);
+            // sc = 'suggestions container'
+            that.sc = $('<div class="autocomplete-suggestions ' + o.menuClass + '"></div>');
+            that.data('sc', that.sc).data('autocomplete', that.attr('autocomplete'));
+            that.attr('autocomplete', 'off');
+            that.cache = {};
+            that.last_val = '';
+
+            that.updateSC = function (resize, next) {
+                that.sc.css({
+                    top: that.offset().top + that.outerHeight() - (that.sc.css("position") == "fixed" ? $(window).scrollTop() : 0),
+                    left: that.offset().left,
+                    width: that.outerWidth()
+                });
+                if (!resize) {
+                    that.sc.show();
+                    if (!that.sc.maxHeight) that.sc.maxHeight = parseInt(that.sc.css('max-height'));
+                    if (!that.sc.suggestionHeight) that.sc.suggestionHeight = $('.autocomplete-suggestion', that.sc).first().outerHeight();
+                    if (that.sc.suggestionHeight)
+                        if (!next) that.sc.scrollTop(0);
+                        else {
+                            var scrTop = that.sc.scrollTop(), selTop = next.offset().top - that.sc.offset().top;
+                            if (selTop + that.sc.suggestionHeight - that.sc.maxHeight > 0)
+                                that.sc.scrollTop(selTop + that.sc.suggestionHeight + scrTop - that.sc.maxHeight);
+                            else if (selTop < 0)
+                                that.sc.scrollTop(selTop + scrTop);
+                        }
+                }
+            }
+            $(window).on('resize.autocomplete', that.updateSC);
+
+            that.sc.appendTo('body');
+
+            that.on('click', function () {
+                if ($(this).val().length > 0 && that.sc.is(":hidden")) {
+                    setTimeout(function () {
+                        that.sc.show();
+                    }, 100);
+                }
+            });
+
+            that.sc.on('mouseleave', '.autocomplete-suggestion', function () {
+                $('.autocomplete-suggestion.selected').removeClass('selected');
+            });
+
+            that.sc.on('mouseenter', '.autocomplete-suggestion', function () {
+                $('.autocomplete-suggestion.selected').removeClass('selected');
+                $(this).addClass('selected');
+            });
+
+            that.sc.on('mousedown click', '.autocomplete-suggestion', function (e) {
+                var item = $(this), v = item.data('val');
+                if (v || item.hasClass('autocomplete-suggestion')) { // else outside click
+                    that.val(v);
+                    o.onSelect(e, v, item);
+                    that.sc.hide();
+                }
+                return false;
+            });
+
+            that.on('blur.autocomplete', function () {
+                try {
+                    over_sb = $('.autocomplete-suggestions:hover').length;
+                } catch (e) {
+                    over_sb = 0;
+                } // IE7 fix :hover
+                if (!over_sb) {
+                    that.last_val = that.val();
+                    that.sc.hide();
+                    setTimeout(function () {
+                        that.sc.hide();
+                    }, 350); // hide suggestions on fast input
+                } else if (!that.is(':focus')) setTimeout(function () {
+                    that.focus();
+                }, 20);
+            });
+
+            if (!o.minChars) that.on('focus.autocomplete', function () {
+                that.last_val = '\n';
+                that.trigger('keyup.autocomplete');
+            });
+
+            function suggest(data) {
+                var val = that.val();
+                that.cache[val] = data;
+                if (data.length && val.length >= o.minChars) {
+                    var s = '';
+                    if (data.length > 0) {
+                        s += typeof o.header === 'function' ? o.header.call(data, o, that) : o.header;
+                        for (var i = 0; i < data.length; i++) s += o.renderItem(data[i], val);
+                        s += typeof o.footer === 'function' ? o.footer.call(data, o, that) : o.footer;
+                    }
+                    that.sc.html(s);
+                    that.updateSC(0);
+                } else
+                    that.sc.hide();
+            }
+
+            that.on('keydown.autocomplete', function (e) {
+                // down (40), up (38)
+                if ((e.which == 40 || e.which == 38) && that.sc.html()) {
+                    var next, sel = $('.autocomplete-suggestion.selected', that.sc);
+                    if (!sel.length) {
+                        next = (e.which == 40) ? $('.autocomplete-suggestion', that.sc).first() : $('.autocomplete-suggestion', that.sc).last();
+                        that.val(next.addClass('selected').data('val'));
+                    } else {
+                        next = (e.which == 40) ? sel.next('.autocomplete-suggestion') : sel.prev('.autocomplete-suggestion');
+                        if (next.length) {
+                            sel.removeClass('selected');
+                            that.val(next.addClass('selected').data('val'));
+                        } else {
+                            sel.removeClass('selected');
+                            that.val(that.last_val);
+                            next = 0;
+                        }
+                    }
+                    that.updateSC(0, next);
+                    return false;
+                }
+                // esc
+                else if (e.which == 27) that.val(that.last_val).sc.hide();
+                // enter or tab
+                else if (e.which == 13 || e.which == 9) {
+                    var sel = $('.autocomplete-suggestion.selected', that.sc);
+                    if (sel.length && that.sc.is(':visible')) {
+                        o.onSelect(e, sel.data('val'), sel);
+                        setTimeout(function () {
+                            that.sc.hide();
+                        }, 20);
+                    }
+                }
+            });
+
+            that.on('keyup.autocomplete', function (e) {
+                if (!~$.inArray(e.which, [13, 27, 35, 36, 37, 38, 39, 40])) {
+                    var val = that.val();
+                    if (val.length >= o.minChars) {
+                        if (val != that.last_val) {
+                            that.last_val = val;
+                            clearTimeout(that.timer);
+                            if (o.cache) {
+                                if (val in that.cache) {
+                                    suggest(that.cache[val]);
+                                    return;
+                                }
+                                // no requests if previous suggestions were empty
+                                for (var i = 1; i < val.length - o.minChars; i++) {
+                                    var part = val.slice(0, val.length - i);
+                                    if (part in that.cache && !that.cache[part].length) {
+                                        suggest([]);
+                                        return;
+                                    }
+                                }
+                            }
+                            that.timer = setTimeout(function () {
+                                o.source(val, suggest)
+                            }, o.delay);
+                        }
+                    } else {
+                        that.last_val = val;
+                        that.sc.hide();
+                    }
+                }
+            });
+        });
+    }
+
+    $.fn.autoComplete.defaults = {
+        source: 0,
+        minChars: 3,
+        delay: 150,
+        cache: 1,
+        menuClass: '',
+        header: '',
+        footer: '',
+        renderItem: function (item, search) {
+            // escape special characters
+            search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+            var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi");
+            return '<div class="autocomplete-suggestion" data-val="' + item + '">' + item.replace(re, "<b>$1</b>") + '</div>';
+        },
+        onSelect: function (e, term, item) {
+        }
+    };
+}(jQuery));

File diff suppressed because it is too large
+ 24 - 0
public/assets/addons/cms/js/jquery.colorpicker.min.js


+ 429 - 0
public/assets/addons/cms/js/jquery.tagsinput.js

@@ -0,0 +1,429 @@
+/*
+
+	jQuery Tags Input Plugin 1.3.3
+
+	Copyright (c) 2011 XOXCO, Inc
+
+	Documentation for this plugin lives here:
+	http://xoxco.com/clickable/jquery-tags-input
+
+	Licensed under the MIT license:
+	http://www.opensource.org/licenses/mit-license.php
+
+	ben@xoxco.com
+
+*/
+
+(function ($) {
+
+    var delimiter = [];
+    var tags_callbacks = [];
+    $.fn.doAutosize = function (o) {
+        var minWidth = $(this).data('minwidth'),
+            maxWidth = $(this).data('maxwidth'),
+            val = '',
+            input = $(this),
+            testSubject = $('#' + $(this).data('tester_id'));
+
+        if (val === (val = input.val())) {
+            return;
+        }
+
+        // Enter new content into testSubject
+        var escaped = val.replace(/&/g, '&amp;').replace(/\s/g, ' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+        testSubject.html(escaped);
+        // Calculate new width + whether to change
+        var testerWidth = testSubject.width(),
+            newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth,
+            currentWidth = input.width(),
+            isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth)
+                || (newWidth > minWidth && newWidth < maxWidth);
+
+        // Animate width
+        if (isValidWidthChange) {
+            input.width(newWidth);
+        }
+
+
+    };
+    $.fn.resetAutosize = function (options) {
+        // alert(JSON.stringify(options));
+        var minWidth = $(this).data('minwidth') || options.minInputWidth || $(this).width(),
+            maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding),
+            val = '',
+            input = $(this),
+            testSubject = $('<tester/>').css({
+                position: 'absolute',
+                top: -9999,
+                left: -9999,
+                width: 'auto',
+                fontSize: input.css('fontSize'),
+                fontFamily: input.css('fontFamily'),
+                fontWeight: input.css('fontWeight'),
+                letterSpacing: input.css('letterSpacing'),
+                whiteSpace: 'nowrap'
+            }),
+            testerId = $(this).attr('id') + '_autosize_tester';
+        if (!$('#' + testerId).length > 0) {
+            testSubject.attr('id', testerId);
+            testSubject.appendTo('body');
+        }
+
+        input.data('minwidth', minWidth);
+        input.data('maxwidth', maxWidth);
+        input.data('tester_id', testerId);
+        input.css('width', minWidth);
+    };
+
+    $.fn.addTag = function (value, options) {
+        options = jQuery.extend({focus: false, callback: true}, options);
+        this.each(function () {
+            var id = $(this).attr('id');
+
+            var tagslist = $(this).val().split(delimiter[id]);
+            if (tagslist[0] == '') {
+                tagslist = [];
+            }
+
+            value = jQuery.trim(value);
+
+            if (options.unique) {
+                var skipTag = $(this).tagExist(value);
+                if (skipTag == true) {
+                    //Marks fake input as not_valid to let styling it
+                    $('#' + id + '_tag').addClass('not_valid');
+                }
+            } else {
+                var skipTag = false;
+            }
+
+            if (value != '' && skipTag != true) {
+                $('<span>').addClass('tag').append(
+                    $('<span>').text(value),
+                    $('<a>', {
+                        href: '#',
+                        title: '移除标签',
+                        html: '&times;'
+                    }).click(function () {
+                        return $('#' + id).removeTag(escape(value));
+                    })
+                ).insertBefore('#' + id + '_addTag');
+
+                tagslist.push(value);
+
+                $('#' + id + '_tag').val('');
+                if (options.focus) {
+                    $('#' + id + '_tag').focus();
+                } else {
+                    $('#' + id + '_tag').blur();
+                }
+
+                $.fn.tagsInput.updateTagsField(this, tagslist);
+
+                if (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) {
+                    var f = tags_callbacks[id]['onAddTag'];
+                    f.call(this, value);
+                }
+                if (tags_callbacks[id] && tags_callbacks[id]['onChange']) {
+                    var i = tagslist.length;
+                    var f = tags_callbacks[id]['onChange'];
+                    f.call(this, $(this), tagslist[i - 1]);
+                }
+            }
+
+        });
+
+        return false;
+    };
+
+    $.fn.removeTag = function (value) {
+        value = unescape(value);
+        this.each(function () {
+            var id = $(this).attr('id');
+
+            var old = $(this).val().split(delimiter[id]);
+
+            $('#' + id + '_tagsinput .tag').remove();
+            str = '';
+            for (i = 0; i < old.length; i++) {
+                if (old[i] != value) {
+                    str = str + delimiter[id] + old[i];
+                }
+            }
+
+            $.fn.tagsInput.importTags(this, str);
+
+            if (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) {
+                var f = tags_callbacks[id]['onRemoveTag'];
+                f.call(this, value);
+            }
+        });
+
+        return false;
+    };
+
+    $.fn.tagExist = function (val) {
+        var id = $(this).attr('id');
+        var tagslist = $(this).val().split(delimiter[id]);
+        return (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not
+    };
+
+    // clear all existing tags and import new ones from a string
+    $.fn.importTags = function (str) {
+        var id = $(this).attr('id');
+        $('#' + id + '_tagsinput .tag').remove();
+        $.fn.tagsInput.importTags(this, str);
+    }
+
+    $.fn.tagsInput = function (options) {
+        var settings = jQuery.extend({
+            interactive: true,
+            defaultText: 'add a tag',
+            minChars: 0,
+            width: '300px',
+            height: '100px',
+            autocomplete: {selectFirst: false},
+            addOnBlur: true,
+            hide: true,
+            delimiter: ',',
+            delimiterSpace: true,
+            unique: true,
+            removeWithBackspace: true,
+            placeholderColor: '#666666',
+            autosize: true,
+            comfortZone: 20,
+            inputPadding: 6 * 2
+        }, options);
+
+        var uniqueIdCounter = 0;
+
+        this.each(function () {
+            // If we have already initialized the field, do not do it again
+            if (typeof $(this).attr('data-tagsinput-init') !== 'undefined') {
+                return;
+            }
+
+            // Mark the field as having been initialized
+            $(this).attr('data-tagsinput-init', true);
+
+            if (settings.hide) {
+                $(this).hide();
+            }
+            var id = $(this).attr('id');
+            if (!id || delimiter[$(this).attr('id')]) {
+                id = $(this).attr('id', 'tags' + new Date().getTime() + (uniqueIdCounter++)).attr('id');
+            }
+
+            var data = jQuery.extend({
+                pid: id,
+                real_input: '#' + id,
+                holder: '#' + id + '_tagsinput',
+                input_wrapper: '#' + id + '_addTag',
+                fake_input: '#' + id + '_tag'
+            }, settings);
+
+            delimiter[id] = data.delimiter;
+
+            if (settings.onAddTag || settings.onRemoveTag || settings.onChange || settings.onKeyDown) {
+                tags_callbacks[id] = [];
+                tags_callbacks[id]['onAddTag'] = settings.onAddTag;
+                tags_callbacks[id]['onRemoveTag'] = settings.onRemoveTag;
+                tags_callbacks[id]['onChange'] = settings.onChange;
+                tags_callbacks[id]['onKeyDown'] = settings.onKeyDown;
+            }
+
+            var markup = '<div id="' + id + '_tagsinput" class="tagsinput"><div id="' + id + '_addTag">';
+
+            if (settings.interactive) {
+                markup = markup + '<input id="' + id + '_tag" value="" data-default="' + settings.defaultText + '" />';
+            }
+
+            markup = markup + '</div><div class="tags_clear"></div></div>';
+
+            $(markup).insertAfter(this);
+
+            $(data.holder).css('width', settings.width);
+            $(data.holder).css('min-height', settings.height);
+            $(data.holder).css('height', settings.height);
+
+            if ($(data.real_input).val() != '') {
+                $.fn.tagsInput.importTags($(data.real_input), $(data.real_input).val());
+            }
+            if (settings.interactive) {
+                $(data.fake_input).val($(data.fake_input).attr('data-default'));
+                $(data.fake_input).css('color', settings.placeholderColor);
+                $(data.fake_input).resetAutosize(settings);
+
+                $(data.holder).bind('click', data, function (event) {
+                    $(event.data.fake_input).focus();
+                });
+
+                $(data.fake_input).bind('focus', data, function (event) {
+                    if ($(event.data.fake_input).val() == $(event.data.fake_input).attr('data-default')) {
+                        $(event.data.fake_input).val('');
+                    }
+                    $(event.data.fake_input).css('color', '#000000');
+                });
+
+                if (typeof settings.autocomplete != 'undefined') {
+                    if (jQuery.fn.autoComplete !== undefined) {
+                        var xhr;
+                        $(data.fake_input).autoComplete($.extend({
+                            source: function (term, response) {
+                                try {
+                                    xhr.abort();
+                                } catch (e) {
+                                }
+                                xhr = $.getJSON(settings.autocomplete.url, {q: term}, function (data) {
+                                    response(data);
+                                });
+                            },
+                            renderItem: function (item, search) {
+                                search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+                                var re = new RegExp("(" + search.split(' ').join('|') + ")", "gi");
+                                return '<div class="autocomplete-suggestion" data-val="' + item + '">' + item.replace(re, "<b>$1</b>") + '</div>';
+                            },
+                            onSelect: function (e, term, item) {
+                                if (item) {
+                                    $('#' + id).addTag($(item).data("val") + "", {focus: true, unique: (settings.unique)});
+                                }
+                            }
+                        }, settings.autocomplete));
+                    } else if (jQuery.Autocompleter !== undefined) {
+                        $(data.fake_input).autocomplete(settings.autocomplete.url, settings.autocomplete);
+                        $(data.fake_input).bind('result', data, function (event, data, formatted) {
+                            if (data) {
+                                $('#' + id).addTag(data[0] + "", {focus: true, unique: (settings.unique)});
+                            }
+                        });
+                    } else if (jQuery.ui.autocomplete !== undefined) {
+                        $(data.fake_input).autocomplete(settings.autocomplete);
+                        $(data.fake_input).bind('autocompleteselect', data, function (event, ui) {
+                            $(event.data.real_input).addTag(ui.item.value, {focus: true, unique: (settings.unique)});
+                            return false;
+                        });
+                    }
+
+                }
+
+                if (settings.addOnBlur) {
+                    // if a user tabs out of the field, create a new tag
+                    $(data.fake_input).bind('blur', data, function (event) {
+                        var d = $(this).attr('data-default');
+                        if ($(event.data.fake_input).val() != '' && $(event.data.fake_input).val() != d) {
+                            if ((event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)))
+                                $(event.data.real_input).addTag($(event.data.fake_input).val(), {focus: true, unique: (settings.unique)});
+                        } else {
+                            $(event.data.fake_input).val($(event.data.fake_input).attr('data-default'));
+                            $(event.data.fake_input).css('color', settings.placeholderColor);
+                        }
+                        return false;
+                    });
+                }
+
+                // if user types a default delimiter like comma,semicolon and then create a new tag
+                $(data.fake_input).bind('keypress textInput', data, function (event) {
+                    if (_checkDelimiter.call(this, event)) {
+                        var value = $(event.data.fake_input).val();
+                        if (value.indexOf(event.data.delimiter) > -1 || (event.data.delimiterSpace && value.indexOf(" ") > -1)) {
+                            $(event.data.fake_input).addClass('not_valid');
+                            return false;
+                        }
+                        event.preventDefault();
+                        if ((event.data.minChars <= value.length) && (!event.data.maxChars || (event.data.maxChars >= value.length)))
+                            $(event.data.real_input).addTag(value, {focus: true, unique: (settings.unique)});
+                        $(event.data.fake_input).resetAutosize(settings);
+                        return false;
+                    } else if (event.data.autosize) {
+                        $(event.data.fake_input).doAutosize(settings);
+
+                    }
+                });
+                //Delete last tag on backspace
+                data.removeWithBackspace && $(data.fake_input).bind('keydown', function (event) {
+                    if (event.keyCode == 8 && $(this).val() == '') {
+                        event.preventDefault();
+                        var last_tag = $(this).closest('.tagsinput').find('.tag:last').find("span").text();
+                        var id = $(this).attr('id').replace(/_tag$/, '');
+                        last_tag = last_tag.replace(/[\s]+x$/, '');
+                        $('#' + id).removeTag(escape(last_tag));
+                        $(this).trigger('focus');
+                    }
+                });
+                $(data.fake_input).bind('keydown', function (event) {
+                    var id = $(this).attr('id').replace(/_tag$/, '');
+                    if (tags_callbacks[id] && tags_callbacks[id]['onKeyDown']) {
+                        var f = tags_callbacks[id]['onKeyDown'];
+                        f.call(this, event);
+                    }
+                });
+                $(data.fake_input).blur();
+
+                //Removes the not_valid class when user changes the value of the fake input
+                if (data.unique) {
+                    $(data.fake_input).keydown(function (event) {
+                        if (event.keyCode == 8 || String.fromCharCode(event.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) {
+                            $(this).removeClass('not_valid');
+                        }
+                    });
+                }
+            } // if settings.interactive
+        });
+
+        return this;
+
+    };
+
+    $.fn.tagsInput.updateTagsField = function (obj, tagslist) {
+        var id = $(obj).attr('id');
+        $(obj).val(tagslist.join(delimiter[id]));
+    };
+
+    $.fn.tagsInput.importTags = function (obj, val) {
+        $(obj).val('');
+        var id = $(obj).attr('id');
+        var tags = val.split(delimiter[id]);
+        for (i = 0; i < tags.length; i++) {
+            $(obj).addTag(tags[i], {focus: false, callback: false});
+        }
+        if (tags_callbacks[id] && tags_callbacks[id]['onChange']) {
+            var f = tags_callbacks[id]['onChange'];
+            f.call(obj, obj, tags[i]);
+        }
+    };
+
+    /**
+     * check delimiter Array
+     * @param event
+     * @returns {boolean}
+     * @private
+     */
+    var _checkDelimiter = function (event) {
+        var found = false;
+        var key = event.keyCode || event.which || event.charCode;
+        key = key || event.originalEvent.data.charCodeAt(0);
+
+        if (key == 0 || key == 229) {
+            var value = $(this).val();
+            key = value.charCodeAt(value.length - 1);
+        }
+
+        if (key == 13 || (event.data.delimiterSpace && key == 32)) {
+            return true;
+        }
+
+        if (typeof event.data.delimiter === 'string') {
+            if (key == event.data.delimiter.charCodeAt(0)) {
+                found = true;
+            }
+        } else {
+            $.each(event.data.delimiter, function (index, delimiter) {
+                if (key == delimiter.charCodeAt(0)) {
+                    found = true;
+                }
+            });
+        }
+
+        return found;
+    }
+})(jQuery);

File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/js/share.min.js


+ 534 - 0
public/assets/addons/cms/js/simtree.js

@@ -0,0 +1,534 @@
+/**
+ * License: MIT
+ * Url: https://github.com/linjingming/sim-tree
+ */
+;(function (window, factroy) {
+    if (!window || !window.document) {
+        throw new Error('simTree need window')
+    }
+    factroy(window);
+})(typeof window !== 'undefined' ? window : this, function (window) {
+    "use strict";
+    var name = 'simTree';
+    var version = '0.0.2';
+    var document = window.document;
+    var defaultConfig = {
+        linkParent: false,
+        response: {
+            name: 'name',
+            id: 'id',
+            pid: 'pid',
+            checked: 'checked',
+            open: 'open',
+            expand: 'expand',
+            disabled: 'disabled'
+        }
+    };
+    var err = function (msg) {
+        throw new Error(msg);
+    };
+    var simTpl = function (tpl, data) {
+        return tpl.replace(/\{\{(.+?)\}\}/g, function ($1, $2) {
+            return data[$2] ? data[$2] : '';
+        });
+    };
+
+    var Class = function (options) {
+        if (typeof $ === 'undefined') {
+            err(name + 'need jquery');
+        }
+        if (!$.isPlainObject(options)) return;
+        if (!options.el) {
+            err('你没有传el');
+        }
+        if (!(this instanceof Class)) {
+            return new Class(options);
+        }
+        this.options = $.extend(true, {}, defaultConfig, options);
+        this.init();
+    };
+    //初始化时候 用 checkId 存储选中的Id, 用openId 存储要展开的节点Id,
+    var $prevA, checkId = [], openId = [];
+    Class.prototype = {
+        version: version,
+        constructor: Class,
+        /**
+         * 绑定自定义事件
+         *
+         * @param type {string} 自定义事件名称
+         * @param cb {function} 回调函数
+         * @param isCover {boolean} 是否覆盖之前的回调
+         * @return this {object} 实列对象
+         */
+        on: function (type, cb, isCover) {
+            var isTriggered, args;
+            this.handles[type] = this.handles[type] || [];
+            isTriggered = this.handles[type].isTriggered;
+            args = this.handles[type].args;
+            if ($.isFunction(cb)) {
+                if (isCover === true) {
+                    this.handles[type] = [cb];
+                } else {
+                    this.handles[type].push(cb);
+                }
+                if (isTriggered) {
+                    cb.call(this, args);
+                }
+            }
+            return this;
+        },
+        // 解除绑定的自定义事件
+        off: function (type) {
+            this.handles[type] = [];
+            return this;
+        },
+        // 触发自定义事件
+        trigger: function (type, args) {
+            var i, len;
+            this.handles[type] = this.handles[type] || [];
+            i = 0;
+            len = this.handles[type].length;
+            // isTriggered 表示已经触发过
+            this.handles[type].isTriggered = true;
+            // args 参数
+            this.handles[type].args = args;
+            for (; i < len; i++) {
+                this.handles[type][i].call(this, args);
+            }
+        },
+        init: function () {
+            var options = this.options;
+            var data = options.data;
+            this.handles = {};
+            this.$el = $(options.el);
+            this.data = data;
+            this.event();
+            this.render();
+        },
+        /**
+         *
+         */
+        dataCallback: function () {
+            var args = arguments;
+            if (args.length === 1) {
+                this.render(args[0]);
+            } else {
+                this.doRender(args[0], args[1]);
+            }
+        },
+        /**
+         *  把data解析成树型数据
+         */
+        parse: function (data) {
+            var options = this.options;
+            var response = options.response;
+            var res = [];
+            var map = {};
+            var i = 0;
+            var len = data.length;
+            var id = response.id;
+            var pid = response.pid;
+            // 如果子节点异步加载 直接返回
+            if (options.childNodeAsy) {
+                return data;
+            }
+            for (; i < len; i++) {
+                var item = data[i];
+                var tempId = item[id];
+                // 如果节点有children这个字段则判断数据本就是树型结构 直接返回原始数据
+                if (item.children) {
+                    return data;
+                }
+                if (tempId) {
+                    map[tempId] = item
+                }
+            }
+            for (i = 0; i < len; i++) {
+                var item = data[i];
+                var tempPid = item[pid];
+                var parent = map[tempPid];
+                if (tempPid && parent) {
+                    (parent.children || (parent.children = [])).push(item);
+                } else {
+                    res.push(item);
+                }
+            }
+            return res;
+        },
+        render: function (data) {
+            var data = data || this.data;
+            if ($.isFunction(data)) {
+                data({}, this.dataCallback.bind(this))
+            }
+            if ($.isArray(data)) {
+                data = this.parse(data);
+                this.doRender(this.$el, data);
+            }
+        },
+        doRender: function ($el, data, level) {
+            var self = this;
+            var options = this.options;
+            var response = options.response;
+            var len = data.length;
+            var i = 0;
+            var item;
+            var id = response.id;
+            var text = response.name;
+            var level = level || 1;
+            var tpl = '<i data-type="{{asy}}" class="sim-tree-spread {{spreadIcon}}"></i><a href="javascript:;"><i class="sim-tree-checkbox"></i>{{text}}</a>';
+            var isRootEle = ($el === this.$el);
+            var $outEl = $(document.createElement('ul'));
+            var oLi, $li, hasChild, disabled, expand;
+            var asy = options.childNodeAsy ? 'asy' : '';
+            if (false && !options.check) { // 单选
+                tpl = tpl.replace('<i class="sim-tree-checkbox"></i>', '');
+            }
+            for (; i < len; i++) {
+                item = data[i];
+                oLi = document.createElement('li');
+                hasChild = !!item.children;
+                disabled = item[response.disabled];
+                expand = item[response.expand] || false;
+
+                oLi.innerHTML = simTpl(tpl, {
+                    asy: asy,
+                    text: item[text],
+                    spreadIcon: hasChild ? (expand ? 'sim-icon-d' : 'sim-icon-r') : 'sim-hidden'
+                });
+                oLi.setAttribute('data-level', level);
+                oLi.setAttribute('data-id', item[id]);
+                disabled && oLi.setAttribute('class', 'disabled');
+                $li = $(oLi);
+                $li.data('data', item);
+                if (expand) {
+                    $outEl.addClass("show");
+                }
+                $outEl.append($li);
+                if (hasChild) {
+                    this.doRender($li, item.children, level + 1);
+                }
+                item[response.checked] && checkId.push(item[id]);
+                item[response.open] && openId.push(item[id]);
+            }
+            len && $el.append($outEl);
+            if (isRootEle) {
+                $outEl.addClass('sim-tree');
+                this.trigger('done', data);
+                $.each(openId, function (index, id) {
+                    self.expandNode(id);
+                });
+                this.setSelected(checkId);
+            } else {
+                // 异步加载移除loading
+                if (options.childNodeAsy) {
+                    this.hideLoading($el.find('.sim-tree-spread'));
+                    $outEl.addClass('show');
+                }
+            }
+        },
+        /**
+         *
+         */
+        event: function () {
+            var self = this;
+            this.$el.off('click').on('click', function (e) {
+                var $tar = $(e.target);
+                if ($tar.hasClass('sim-tree-spread')) {
+                    self.spread.call(self, $tar);
+                }
+                if ($tar.hasClass('sim-tree-checkbox')) {
+                    $tar = $tar.parent();
+                }
+
+                if ($tar[0].tagName.toLowerCase() === 'a') {
+                    self.clickNode.call(self, $tar);
+                }
+                return false;
+            });
+            this.$el.on('selectstart', function () {
+                return false;
+            });
+
+            if (this.options.done) {
+                this.on('done', this.options.done);
+            }
+
+            if (this.options.onClick) {
+                this.on('click', this.options.onClick);
+            }
+
+            if (this.options.onChange) {
+                this.on('change', this.options.onChange);
+            }
+
+            if (this.options.onSearch) {
+                this.on('search', this.options.onSearch);
+            }
+        },
+        // 展开或收起
+        spread: function ($el) {
+            if ($el.hasClass('sim-icon-r')) {
+                this.doSpread($el, true);
+            } else {
+                this.doSpread($el, false);
+            }
+
+        },
+        // 添加loading
+        showLoading: function ($el) {
+            $el.addClass('sim-loading');
+        },
+        // 移除loading
+        hideLoading: function ($el) {
+            $el.removeClass('sim-loading');
+        },
+        /**
+         *  展开或者收起
+         *  @param $el {jquery object} jquery对象
+         *  @param status {boolean} true 展开 false收起
+         */
+        doSpread: function ($el, status) {
+            var $pli = $el.parent();
+            var $ul = $pli.children('ul');
+            var item = $pli.data('data');
+            if (!item.children) return;
+            if (status) {
+                $el.removeClass('sim-icon-r').addClass('sim-icon-d');
+                // 异步加载子节点
+                if ($el.data('type') === 'asy' && $.isFunction(this.data)) {
+                    this.showLoading($el);
+                    this.data($pli.data('data'), this.dataCallback.bind(this, $pli));
+                    $el.data('type', '');
+                }
+                $ul.addClass('show');
+            } else {
+                $el.removeClass('sim-icon-d').addClass('sim-icon-r');
+                $ul.removeClass('show');
+            }
+        },
+        // 点击节点
+        clickNode: function ($tar) {
+            var self = this;
+            var $pli = $tar.parent();
+            var $li = this.$el.find('li');
+            var len = $li.length;
+            var i = 0;
+            var list = [];
+            var data, $childUl, $childCheck;
+            var isChange = false;
+            if ($pli.hasClass('disabled')) return;
+            if (this.options.check) {
+                isChange = true;
+                this.doCheck($tar.find('.sim-tree-checkbox'));
+                if (this.options.linkParent) {
+                    $childUl = $pli.children('ul');
+                    $childCheck = $childUl.find('.sim-tree-checkbox');
+                    $.each($childCheck, function () {
+                        self.doCheck($(this), $pli.data('checked'), true);
+                    });
+                }
+                for (; i < len; i++) {
+                    data = $li.eq(i).data();
+                    if (data['checked'] === true) {
+                        list.push(data.data);
+                    }
+                }
+            } else {
+                //单选模式下仅保留当前选择
+                $(".sim-tree-checkbox", this.$el).removeClass("checked");
+                $(".sim-tree-checkbox", $tar).addClass("checked");
+
+                if ($prevA) {
+                    $prevA.css('font-weight', 'normal');
+                }
+                $tar.css('font-weight', 'bold');
+                $prevA = $tar;
+                data = $pli.data('data');
+                list = [data];
+                if (this.sels) {
+                    isChange = !(this.sels[0] === data);
+                } else {
+                    isChange = true;
+                }
+            }
+            this.sels = list;
+            this.trigger('click', list);
+            isChange && this.trigger('change', list);
+        },
+        // 多选设置选中状态
+        doCheck: function ($check, status, flag) {
+            var self = this;
+            var $li = $check.closest('li');
+            var $childUl, $childUlCheck;
+            var data = $li.data();
+            if (typeof status === 'undefined') {
+                status = !data.checked;
+            }
+            if (status === true) {
+                $check.removeClass('sim-tree-semi').addClass('checked');
+            } else if (status === false) {
+                $check.removeClass('checked sim-tree-semi');
+            } else if (status === 'semi') {
+                $check.removeClass('checked').addClass('sim-tree-semi');
+            }
+            $li.data('checked', status);
+            if (this.options.linkParent === true) {
+                !flag && this.setParentCheck($li);
+            }
+        },
+
+        setParentCheck: function ($li) {
+            var $pul = $li.parent('ul');
+            var $pli = $pul.parent('li');
+            var $lis = $pul.children('li');
+            var $plicheck = $pli.find('>a .sim-tree-checkbox');
+            var checked = [];
+            var maxLen = $lis.length;
+            var isChecked, checkedLen;
+            if (!$pli.length) return;
+            if ($li.find('>a .sim-tree-checkbox').hasClass('sim-tree-semi')) {
+                this.doCheck($plicheck, 'semi');
+                return;
+            }
+            // 获取同级的选中状态
+            $.each($lis, function () {
+                isChecked = $(this).data('checked');
+                isChecked === true && checked.push($(this));
+            });
+            checkedLen = checked.length;
+            // 如果选中长度跟li长度一样 则父级选中
+            if (maxLen === checkedLen) {
+                this.doCheck($plicheck, true);
+            }
+            // 如果选中长度为0 则父级没选中
+            if (!checkedLen) {
+                this.doCheck($plicheck, false);
+            }
+            // 如果没有全选中 则父级设置成半选状态
+            if (checkedLen >= 1 && checkedLen < maxLen) {
+                this.doCheck($plicheck, 'semi');
+            }
+        },
+        // 树搜索
+        search: function (val) {
+            if (!this.$el) return;
+            var val = $.trim(val);
+            var $li = this.$el.find('li');
+            var i = 0;
+            var len = $li.length;
+            var text, $mLi, data;
+            var res = [];
+            var reg = new RegExp(val, 'i');
+            $li.hide().children('.sim-tree-spread').addClass('sim-hidden');
+            for (; i < len; i++) {
+                $mLi = $li.eq(i);
+                text = $mLi.children('a').text();
+                data = $mLi.data('data');
+                if (!val) {
+                    $mLi.show();
+                    if (data.children) {
+                        $mLi.children('.sim-tree-spread').removeClass('sim-hidden');
+                    }
+                } else if (text.search(reg) !== -1) {
+                    if (parseInt($mLi.data('level')) !== 1) { // 不是顶级的需要展开父节点
+                        this.expandNode(data[this.options.response.pid]);
+                    }
+                    $mLi.parents('li').add($mLi).show();
+                    res.push($mLi);
+                }
+            }
+            this.trigger('search', val);
+
+        },
+        // 展开某节点
+        expandNode: function (id) {
+            var $li = id.addClass ? id : this.$el.find('[data-id=' + id + ']');
+            var data = $li.data('data');
+            var pid = data[this.options.response.pid];
+            var $spread = $li.children('.sim-tree-spread');
+            var level = parseInt($li.data('level'));
+            if (data.children && $spread.length) {
+                $spread.removeClass('sim-hidden');
+                this.doSpread($spread, true);
+            }
+            if (level !== 1) {
+                this.expandNode(pid);
+            }
+        },
+        // 设置选中
+        setSelected: function (id) {
+            var self = this;
+            var aId = id;
+            var aData = [];
+            var res = [];
+            if (typeof (aId) === 'string' || typeof (aId) === 'number') {
+                aId = [aId];
+            }
+            if (!$.isArray(aId)) {
+                return;
+            }
+            if (!this.options.check) { // 单选
+                aId = [aId[0]];
+            }
+            $.each(aId, function (index, id) {
+                var $li = self.$el.find('[data-id=' + id + ']');
+                var $a = $li.children('a');
+                var $check = $a.children('.sim-tree-checkbox');
+                var data = $li.data('data');
+                if (!$li.length) {
+                    return true;
+                }
+                if (!$check.length) { // 单选
+                    $a.css('font-weight', 'bold');
+                } else { // 多选
+                    self.doCheck($check, true);
+                }
+                if (parseInt($li.data('level')) !== 1) { // 不是顶级的需要展开父节点
+                    self.expandNode(data[self.options.response.pid]);
+                }
+                aData.push(data);
+                res.push($li[0]);
+            });
+            self.sels = aData;
+            self.trigger('click', aData);
+        },
+        // 获取选中值
+        getSelected: function () {
+            return this.sels;
+        },
+        // 设置禁止选中
+        disableNode: function (id) {
+            var self = this;
+            var aId = id;
+            if (typeof (aId) === 'string' || typeof (aId) === 'number') {
+                aId = [aId];
+            }
+            if (!$.isArray(aId)) {
+                return;
+            }
+            $.each(aId, function (index, id) {
+                var $li = self.$el.find('[data-id=' + id + ']');
+                $li.addClass('disabled');
+            });
+        },
+        // 树销毁
+        destroy: function () {
+            this.$el.html('');
+            for (var key in this) {
+                delete this[key]
+            }
+            delete this;
+        },
+        // 树刷新
+        refresh: function (data) {
+            this.$el.html('');
+            this.render(data);
+        }
+    }
+    window[name] = Class;
+    $.fn[name] = function (opt) {
+        opt = $.extend(true, {el: this}, opt);
+        return Class(opt);
+    };
+    return Class;
+});

File diff suppressed because it is too large
+ 11 - 0
public/assets/addons/cms/js/swiper.min.js


+ 2714 - 0
public/assets/addons/cms/less/common.less

@@ -0,0 +1,2714 @@
+@import (reference) "../../../../public/assets/less/bootstrap-less/mixins.less";
+@import (reference) "../../../../public/assets/less/bootstrap-less/variables.less";
+@import (reference) "../../../../public/assets/less/fastadmin/mixins.less";
+@import (reference) "../../../../public/assets/less/fastadmin/variables.less";
+@import "../../../../public/assets/less/lesshat.less";
+@import "tinycss.less";
+
+@primary-color: #007bff;
+//@primary-color: #f28044;
+//@primary-color: #ff464e;
+//@primary-color: #574bc4;
+//@primary-color: #ec3185;
+//@primary-color: #1abc9c;
+
+@tag-color: lighten(@primary-color, 45%);
+
+html,
+body {
+    height: 100%;
+    -webkit-font-smoothing: antialiased;
+    text-rendering: optimizeLegibility;
+    -moz-osx-font-smoothing: grayscale;
+    font-feature-settings: 'liga';
+    -webkit-text-size-adjust: 100%;
+    font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Ubuntu, Helvetica Neue, Helvetica, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei UI, Microsoft YaHei, Source Han Sans CN, sans-serif;
+    font-weight: 400;
+    background: #f4f6f8;
+    font-size: 14px;
+    color: #555;
+}
+
+body {
+    padding-top: 70px;
+}
+
+a {
+    color: #555;
+
+    &:hover, &:focus {
+        color: @primary-color;
+    }
+}
+
+a.primary-link {
+    color: @primary-color;
+}
+
+.btn {
+    font-size: 13px;
+}
+
+.btn-primary {
+    color: #fff;
+    background-color: @primary-color;
+    border-color: @primary-color;
+
+    &:hover, &:focus, &:active, &:active:focus {
+        color: #fff;
+        background-color: darken(@primary-color, 10%);
+        border-color: darken(@primary-color, 10%);
+    }
+}
+
+.btn-gray {
+    color: #212529;
+    background-color: #f8f9fa;
+    border-color: #f8f9fa;
+
+    &:hover {
+        color: #212529;
+        background-color: #e2e6ea;
+        border-color: #dae0e5;
+    }
+}
+
+.btn-light {
+    color: @primary-color;
+    background: lighten(@primary-color, 35%);
+    border-color: transparent;
+
+    &:hover {
+        color: #fff;
+        background-color: @primary-color;
+        border-color: @primary-color;
+    }
+
+}
+
+.label-primary {
+    color: #fff;
+    background-color: @primary-color;
+    border-color: @primary-color;
+}
+
+.btn-outline-primary {
+    color: @primary-color;
+    background-color: transparent;
+    background-image: none;
+    border-color: @primary-color;
+
+    &:hover {
+        color: #fff;
+        background-color: @primary-color;
+        border-color: @primary-color;
+    }
+}
+
+.btn-lg {
+    .border-radius(3px);
+}
+
+.form-control {
+    font-size: 13px;
+}
+
+.wow {
+    visibility: hidden;
+}
+
+.navbar-inverse {
+    //background-color: #363f48;
+    //border-color: #363f48;
+
+    .navbar-nav > li > a {
+        color: #caced2;
+    }
+
+}
+
+.skin-white {
+    padding-top: 80px;
+}
+
+.navbar-white {
+    background-color: #fff;
+    border-color: #fff;
+    box-shadow: 0 1px 8px rgba(0, 0, 0, .05);
+
+    .dropdown-menu {
+        border-radius: 5px;
+        //box-shadow: 0 1px 8px rgba(0, 0, 0, .08);
+        .box-shadow(0px 20px 30px rgba(83, 88, 93, 0.05), 0px 0px 30px rgba(83, 88, 93, 0.1));
+    }
+}
+
+@media (min-width: 768px) {
+    .navbar-default {
+        .navbar-brand {
+            height: 60px;
+            line-height: 27px;
+        }
+
+        .navbar-nav {
+            > li > a {
+                height: 60px;
+                line-height: 27px;
+            }
+        }
+    }
+
+    .navbar-white .navbar-nav {
+        > li > a {
+            height: 60px;
+            line-height: 27px;
+            color: #555;
+
+            &:hover, &:focus {
+                color: @primary-color;
+            }
+        }
+
+        > .active > a {
+            &, &:hover, &:focus {
+                background-color: inherit;
+                color: @primary-color;
+            }
+        }
+    }
+}
+
+@media (hover: hover) {
+    .dropdown a:hover + .dropdown-menu {
+        display: block;
+        margin-top: 0;
+    }
+}
+
+.alert-paid {
+    margin: 10px 0;
+    text-align: center;
+
+    a {
+        color: #f39c12;
+    }
+}
+
+.navbar-inverse .navbar-nav .dropdown {
+    &:hover > a {
+        color: #fff;
+        background-color: transparent;
+    }
+}
+
+.dropdown-menu {
+    > li > a {
+        font-size: 14px;
+        padding: 5px 20px;
+    }
+}
+
+.dropdown-menu {
+    border-radius: 2px;
+    border: 0px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
+    padding: 5px 0px;
+
+    li a {
+        padding-top: 10px !important;
+        padding-bottom: 10px;
+    }
+}
+
+.dropdown-menu > li > a {
+    font-weight: 400;
+    color: #444;
+    padding: 5px 15px;
+    padding-bottom: 10px;
+    font-size: 14px;
+
+    &:hover, &:focus {
+        text-decoration: none;
+        color: #777;
+        background: rgba(0, 0, 0, 0.05);
+    }
+}
+
+.dropdown-submenu {
+    position: relative;
+
+    > .dropdown-menu {
+        top: 0;
+        left: 100%;
+        margin-top: 0;
+        margin-left: -1px;
+        .border-radius(3px 0 3px 3px);
+    }
+
+    &:hover {
+        > .dropdown-menu {
+            display: block;
+        }
+
+        > a {
+            //text-decoration: none;
+            //color: #262626;
+            //background-color: #f5f5f5;
+        }
+
+        > a:after {
+            //border-left-color: #fff;
+        }
+    }
+
+
+    > a:after {
+        display: block;
+        content: " ";
+        float: right;
+        width: 0;
+        height: 0;
+        border-color: transparent;
+        border-style: solid;
+        border-width: 5px 0 5px 5px;
+        border-left-color: #ccc;
+        margin-top: 5px;
+        margin-right: -10px;
+    }
+
+    &.pull-left {
+        float: none;
+
+        > .dropdown-menu {
+            left: -100%;
+            margin-left: 10px;
+            .border-radius(3px 0 3px 3px);
+        }
+    }
+
+}
+
+.navbar-collapse.collapse.active .navbar-nav {
+    .dropdown-menu {
+        //padding: 0;
+    }
+
+    .dropdown-submenu {
+        .dropdown-menu > li > a {
+            padding-left: 45px;
+        }
+    }
+}
+
+.navbar {
+    border: none;
+}
+
+.navbar-nav {
+
+    li > a {
+        font-size: 14px;
+
+        h5 {
+            overflow: hidden;
+            text-overflow: ellipsis;
+        }
+    }
+
+    > li > a {
+        font-size: 14px;
+    }
+
+    ul.dropdown-menu {
+        border: none;
+        border-radius: 4px;
+
+        > li.active > a {
+            color: @primary-color;
+            background-color: #f5f5f5;
+        }
+    }
+
+    ul.dropdown-menu > li > a {
+        padding: 8px 20px;
+    }
+}
+
+.navbar-brand {
+    padding: 5px 15px;
+}
+
+.toast-top-center {
+    top: 50px;
+
+    > div {
+        .box-shadow(none);
+    }
+}
+
+/*修复nice-validator新版下的一处BUG*/
+.nice-validator {
+    input, select, textarea, [contenteditable] {
+        display: inline-block;
+        *display: inline;
+        *zoom: 1;
+    }
+}
+
+/*修复nice-validator和summernote的编辑框冲突*/
+.nice-validator .note-editor .note-editing-area .note-editable {
+    display: inherit;
+}
+
+/*预览区域*/
+.plupload-preview, .faupload-preview {
+    padding: 0 10px;
+    margin-bottom: 0;
+
+    li {
+        margin-top: 5px;
+        margin-bottom: 10px;
+    }
+
+    .thumbnail {
+        margin-bottom: 10px;
+    }
+
+    a {
+        display: block;
+
+        &:first-child {
+            height: 90px;
+        }
+
+        img {
+            height: 80px;
+            object-fit: cover;
+        }
+    }
+}
+
+//浮动按钮
+#floatbtn {
+    width: 50px;
+    height: auto;
+    position: fixed;
+    top: auto;
+    right: 50%;
+    bottom: 10px;
+    left: auto;
+    z-index: 80;
+    margin-right: -640px;
+
+    &.fixed {
+        position: absolute;
+        bottom: 279px;
+        right: 50%;
+    }
+
+    > a, .floatbtn-item {
+        cursor: pointer;
+        position: relative;
+        z-index: 90;
+        display: block;
+        margin-top: 4px;
+        width: 50px;
+        height: 50px;
+        line-height: 50px;
+        text-align: center;
+        font-size: 20px;
+        color: #d5d5d5;
+        background-color: #fff;
+        //border: 1px solid #eee;
+        .user-select(none);
+
+        &.hover:hover {
+            .transition(background-color 400ms ease-out);
+            background: @primary-color;
+            text-decoration: none;
+            text-align: center;
+            line-height: 20px;
+            padding: 5px;
+
+            i {
+                display: none;
+            }
+
+            em {
+                display: block;
+                color: #fff;
+                font-size: 14px;
+                font-style: normal;
+                text-decoration: none;
+            }
+        }
+
+        em {
+            display: none;
+        }
+
+        &:hover {
+            background: @primary-color;
+
+            i {
+                color: #fff;
+            }
+
+            .floatbtn-wrapper {
+                display: block;
+            }
+
+        }
+    }
+
+    .iconfont {
+        display: inline-block;
+        font: normal normal normal 14px/1 iconfont;
+        font-size: inherit;
+    }
+}
+
+.floatbtn-wrapper {
+    position: absolute;
+    right: 59px;
+    top: -55px;
+    z-index: 120;
+    display: none;
+    width: 190px;
+    height: 212px;
+    background-color: #fff;
+    border: 1px solid #eee;
+
+    &:before {
+        content: "";
+        position: absolute;
+        right: -12px;
+        top: 0;
+        height: 200px;
+        width: 12px;
+        background: transparent;
+    }
+
+    &:after {
+        content: "";
+        position: absolute;
+        right: -6px;
+        top: 73px;
+        display: block;
+        width: 0;
+        height: 0;
+        border-left: 6px solid #d5d5d5;
+        border-top: 6px solid transparent;
+        border-bottom: 6px solid transparent;
+    }
+
+    > .qrcode {
+        margin-top: 20px;
+        line-height: 1;
+
+        > img {
+            width: 128px;
+            height: 128px;
+        }
+    }
+
+    p {
+
+        font-size: 14px;
+        line-height: 20px;
+        color: #999;
+
+        em {
+            color: #dd3067;
+        }
+    }
+}
+
+.floatbtn-share .floatbtn-wrapper {
+    &:after {
+        top: 18px;
+    }
+
+    .social-share .icon-wechat .wechat-qrcode {
+        p {
+            font-size: 12px;
+        }
+    }
+}
+
+.text-primary,
+.text-primary:hover {
+    color: @brand-primary;
+}
+
+.text-success,
+.text-success:hover {
+    color: @brand-success;
+}
+
+.text-danger,
+.text-danger:hover {
+    color: @brand-danger;
+}
+
+.text-warning,
+.text-warning:hover {
+    color: @brand-warning;
+}
+
+.text-info,
+.text-info:hover {
+    color: @brand-info;
+}
+
+.well {
+    .box-shadow(none);
+}
+
+.clearfix() {
+    &:before,
+    &:after {
+        content: " "; // 1
+        display: table; // 2
+    }
+    &:after {
+        clear: both;
+    }
+}
+
+.responsive-container {
+    position: relative;
+    width: 100%;
+    border: 1px solid #f8f8f8;
+}
+
+footer {
+    padding: 0;
+    background: #1f2730;
+    //background: #555;
+    color: #fff;
+    //margin-top: 25px;
+
+    a {
+        color: #fff;
+
+        &:hover {
+            color: @primary-color;
+        }
+    }
+}
+
+.nav-sidebar {
+    li.active a {
+        text-decoration: none;
+        background-color: #ecf0f1;
+    }
+}
+
+.navbar-toggle .icon-bar {
+    width: 18px;
+}
+
+.footer-inner {
+    padding: 2em 0;
+
+    .copyright {
+        margin-bottom: 20px !important;
+        line-height: 1.5;
+    }
+
+    .footer-logo {
+        //margin-bottom: 20px;
+
+        a {
+            padding: 15px 15px;
+            background: rgba(0, 0, 0, .1);
+            font-size: 40px;
+            font-weight: 700;
+
+            &:hover, &:focus {
+                text-decoration: none;
+            }
+        }
+    }
+
+    h3 {
+        font-weight: 400;
+        margin-bottom: 20px;
+    }
+
+    p {
+        font-weight: 400;
+
+        &:last-child {
+            margin-bottom: 0;
+        }
+    }
+
+    .links {
+        padding: 0;
+        margin: 0 0 20px 0;
+
+        li {
+            list-style: none;
+            padding: 5px 0;
+
+            a {
+                &:hover {
+                    text-decoration: underline;
+
+                }
+            }
+        }
+    }
+
+    .footer-social {
+        text-align: right;
+        margin-top: 0;
+
+        a {
+            margin-right: 15px;
+            margin-bottom: 10px;
+            font-size: 20px;
+
+            &:hover {
+                text-decoration: none;
+            }
+        }
+    }
+
+}
+
+.article-list {
+    padding: 0;
+    background: #fff;
+
+    .embed-responsive-4by3, .embed-responsive-square {
+        border-radius: 5px;
+    }
+
+    .article-item {
+        padding: 20px 0;
+        border-bottom: 1px solid #efefef;
+    }
+
+    .article-item .content {
+        margin-top: 15px;
+        color: #919191;
+    }
+
+    .gallery-article {
+        margin-top: 0;
+
+        .row {
+            margin: 0 -10px;
+        }
+
+        .article-title {
+            margin-bottom: 10px;
+
+            span.highlight {
+                color: red;
+            }
+        }
+
+        .media .media-body {
+            padding-left: 0;
+
+            .article-tag {
+                position: relative;
+                margin-top: 10px;
+            }
+        }
+    }
+
+    .article-title {
+        margin: 0;
+        font-size: 1.25em;
+        line-height: 1.45;
+
+        color: #000;
+
+        a {
+            color: #444;
+            .transition(all 0.3s ease);
+
+            span.highlight {
+                color: red;
+            }
+
+            &:hover {
+                color: @primary-color;
+                .transition(all 0.3s ease);
+            }
+
+            .img-new {
+                margin-left: 2px;
+                margin-bottom: 2px;
+                height: 16px;
+            }
+        }
+    }
+
+    .article-intro {
+        height: 44px;
+        line-height: 22px;
+        color: #828a92;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-box-orient: vertical;
+        display: -webkit-box;
+        -webkit-line-clamp: 2;
+    }
+
+    .media {
+        color: #919191;
+
+        .media-body {
+            padding-left: 20px;
+            line-height: 25px;
+        }
+
+        .media-left {
+            overflow: hidden;
+            padding: 0;
+
+            a {
+                display: block;
+                width: 160px;
+
+            }
+        }
+    }
+
+    .media-body {
+        position: relative;
+
+        .article-tag {
+            display: block;
+            clear: both;
+            position: absolute;
+            bottom: 0;
+            color: #aaa;
+            font-size: 13px;
+
+            span {
+                margin: 0 8px;
+            }
+
+            span a {
+                color: #aaa;
+            }
+
+            .pull-left {
+                height: 34px;
+                line-height: 34px;
+                color: #919191;
+
+                a {
+                    color: #919191;
+                }
+            }
+        }
+
+    }
+
+    .pager {
+        margin: 40px 0 20px 0;
+    }
+}
+
+.article-metas {
+    overflow: hidden;
+
+    .metas-title {
+        margin: 0;
+        font-size: 1.65em;
+        line-height: 1.45;
+        margin-bottom: 5px;
+        color: #444;
+
+        a {
+            color: #444;
+            .transition(all 0.3s ease);
+
+            &:hover {
+                color: @primary-color;
+                .transition(all 0.3s ease);
+            }
+        }
+    }
+
+    .metas-body {
+        color: #999;
+        margin: 0px auto;
+
+        span {
+            margin-right: 10px;
+
+            i {
+                margin-right: 5px;
+            }
+        }
+
+        p {
+            margin-bottom: 0;
+            margin-top: 0px;
+            font-size: 12px;
+        }
+
+    }
+}
+
+.article-text {
+
+    line-height: 30px;
+    margin-bottom: 15px;
+
+    img {
+        margin: 10px auto;
+        display: block;
+        max-width: 100%;
+        height: auto;
+        cursor: zoom-in;
+        .border-radius(2px);
+    }
+
+    ul li {
+        line-height: 30px;
+    }
+
+    a {
+        text-decoration: none;
+        color: @primary-color;
+        border-bottom: 1px solid lighten(@primary-color, 35%);
+
+        img {
+            cursor: pointer;
+        }
+    }
+}
+
+.article-action-btn {
+    color: #999;
+
+    a {
+        color: #999;
+    }
+
+    .bdshare-button-style0-16 .bds_more {
+        float: none;
+        padding: 0;
+        height: inherit;
+        line-height: inherit;
+        font-size: inherit;
+        background: none;
+        color: #999;
+    }
+}
+
+.article-prevnext {
+    color: #666;
+}
+
+.entry-meta ul {
+    overflow: hidden;
+    margin: 0 0 10px 0;
+    padding: 0 0 10px 0;
+    border-bottom: 1px solid #eeeeee;
+
+    li {
+        line-height: 26px;
+    }
+}
+
+.related-article, .gallery-article {
+    margin-top: 10px;
+
+    .row {
+        margin: 0 -5px;
+    }
+
+    .col-sm-3 {
+        padding: 0 10px;
+
+        a {
+            display: block;
+        }
+    }
+
+    .embed-responsive-4by3 {
+        border-radius: 5px;
+    }
+}
+
+@media (max-width: 480px) {
+    .related-article, .gallery-article {
+        .row {
+            margin: 0 -5px !important;
+        }
+
+        .col-sm-3 {
+            padding: 0 5px 10px 5px;
+        }
+    }
+}
+
+@media (max-width: 767px) {
+    .article-list, .gallery-article {
+        .row {
+            margin: 0 -5px !important;
+        }
+
+        .col-sm-3 {
+            padding: 0 5px 10px 5px;
+        }
+    }
+}
+
+@media (max-width: 1200px) {
+    .article-list .media-body .article-tag {
+        position: relative;
+        bottom: inherit;
+        margin-top: 5px;
+    }
+}
+
+.related-page {
+    ul {
+        li {
+            &.active {
+                a {
+                    color: @primary-color;
+                }
+            }
+        }
+    }
+}
+
+.author-card {
+    background: #fff none repeat scroll 0 0;
+    /*border: 1px solid #e1e8ed;*/
+    border-radius: 4px;
+    padding-bottom: 15px;
+
+    .author-head {
+        background-image: url("../img/author-head.jpeg");
+        background-position: 0 50%;
+        background-size: 100% auto;
+        border-bottom: 1px solid #e1e8ed;
+        border-radius: 4px 4px 0 0;
+        height: 100px;
+        width: 100%;
+    }
+
+    .author-avatar {
+        text-align: center;
+
+        > a {
+            background-color: #fff;
+            border-radius: 50%;
+            display: inline-block;
+            margin: -40px 5px 0 0;
+            max-width: 100%;
+            padding: 1px;
+            vertical-align: bottom;
+
+            > img {
+                border: 2px solid #fff;
+                border-radius: 50%;
+                color: #fff;
+                height: 80px;
+                width: 80px;
+            }
+        }
+    }
+
+    .author-basic {
+        clear: both;
+        text-align: center;
+        width: 100%;
+        margin: 10px 0 10px 0;
+
+        .author-nickname {
+            margin-bottom: 5px;
+
+            > a {
+                font-size: 18px;
+                font-weight: 700;
+                line-height: 21px;
+            }
+        }
+    }
+
+    .author-statistics {
+        padding: 5px 0;
+        text-align: center;
+        margin: 0;
+
+        .statistics-text {
+            color: #777;
+            margin-bottom: 5px;
+        }
+
+        .statistics-nums {
+            font-size: 16px;
+            font-weight: 600;
+        }
+    }
+
+}
+
+.panel-default {
+    border: none;
+    padding: 0 15px;
+    .box-shadow(none);
+    .border-radius(2px);
+    //.box-shadow(0 1px 2px 0 rgba(0, 0, 0, 0.1));
+}
+
+.panel-default {
+    > .panel-heading {
+        position: relative;
+        padding: 15px 0;
+        background: #fff;
+        border-bottom: 1px solid #f5f5f5;
+
+        .panel-title {
+            font-size: 16px;
+
+            /*color: @gray-dark;*/
+
+            > i {
+                display: none;
+            }
+        }
+
+        small {
+            font-weight: normal;
+            color: #999;
+            font-size: 13px;
+        }
+
+        .more {
+            position: absolute;
+            top: 13px;
+            right: 0;
+            display: block;
+            color: #919191;
+            .transition(all 0.3s ease);
+
+            &:hover {
+                color: #616161;
+                .transition(all 0.3s ease);
+            }
+
+            font-weight: 400;
+            font-size: 13px;
+
+        }
+
+        div.more {
+            top: 17px;
+
+        }
+
+        .panel-bar {
+            position: absolute;
+            top: 7px;
+            right: 0;
+            display: block;
+        }
+    }
+
+    > .panel-footer {
+        padding: 15px 0;
+        background: none;
+    }
+
+    > .panel-body {
+        position: relative;
+        padding: 15px 0;
+    }
+}
+
+.panel-primary {
+    > .panel-heading {
+        background-color: #46c37b;
+        color: #fff;
+    }
+
+    > .panel-body {
+        background: #fafafa;
+        border-bottom-left-radius: 2px;
+        border-bottom-right-radius: 2px;
+    }
+}
+
+.panel-gray {
+    .box-shadow(0 2px 4px rgba(0, 0, 0, 0.08));
+
+    > .panel-heading {
+        background-color: #f5f5f5;
+        color: #919191;
+    }
+
+    > .panel-body {
+        color: #919191;
+        background: #fff;
+        border-bottom-left-radius: 4px;
+        border-bottom-right-radius: 4px;
+    }
+}
+
+.panel-page {
+    padding: 45px 50px 50px;
+    min-height: 500px;
+
+    .panel-heading {
+        background: transparent;
+        border-bottom: none;
+        margin: 0 0 30px 0;
+        padding: 0;
+
+        h2 {
+            font-size: 25px;
+            margin-top: 0;
+        }
+    }
+}
+
+.tabs-wrapper {
+    .border-radius(4px);
+    background-color: #fff;
+
+    .tabs-mark-group {
+        //border-bottom: 1px solid #f7f7f7;
+
+        .title {
+            width: 90px;
+            margin-top: 3px;
+            float: left
+        }
+
+        .classify {
+            margin-top: 3px;
+
+            a, i {
+                color: #919191
+            }
+
+            a:focus, a:hover {
+                color: #43bc60
+            }
+        }
+
+        .content {
+            margin-left: 100px
+        }
+
+    }
+
+    .tabs-mark {
+        margin: 0 4px;
+
+        a {
+            border: 1px solid #e4ecf3;
+            padding: 2px 5px;
+            color: #919191
+        }
+
+        i {
+            font-size: 10px;
+            margin-left: 5px
+        }
+
+        &.active a, &:focus a, &:hover a {
+            color: #43bc60;
+            border: 1px solid #43bc60
+        }
+    }
+
+    .tabs-group {
+
+        position: relative;
+        overflow-y: hidden;
+
+        .title {
+            float: left;
+            padding: 10px 0;
+            width: 80px;
+            display: block;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            word-wrap: normal;
+        }
+
+        .content {
+            list-style: none;
+            padding: 0;
+            margin: 0 0 0 60px;
+
+            > li {
+                float: left;
+                padding: 5px 12px;
+
+                > a {
+                    display: block;
+                    padding: 5px 10px;
+                    border: none;
+                    .border-radius(4px);
+                    color: #828a92;
+                    .transition(all .3s ease);
+                }
+
+                &.active > a, &:focus > a, &:hover > a {
+                    color: @primary-color
+                }
+            }
+        }
+
+        .tabs-toggle {
+            position: absolute;
+            right: 20px;
+            top: 18px;
+            font-size: 12px;
+            line-height: 1;
+            cursor: pointer
+        }
+
+        + .tabs-group {
+            //border-top: 1px solid #f7f7f7
+        }
+    }
+}
+
+.tabs-multiple {
+    .tabs-group {
+        .content {
+            > li {
+
+                > a {
+                    margin: 2px 0;
+                    display: block;
+                    padding: 3px 10px;
+                    .border-radius(3px);
+                }
+
+                &.active > a {
+                    color: @primary-color;
+                    background: lighten(@primary-color, 35%);
+                }
+            }
+        }
+    }
+}
+
+@media (max-width: 767px) {
+    .tabs-wrapper .tabs-group .title {
+        width: 100%;
+        float: none;
+    }
+
+    .tabs-wrapper .tabs-group .content {
+        margin: 0;
+
+        > li {
+            padding: 5px;
+        }
+    }
+
+    .tabs-wrapper .tabs-group + .tabs-group {
+        border-top: none;
+    }
+}
+
+h1 .breadcrumb {
+    padding: 0 5px;
+    margin-bottom: 5px;
+    background: none;
+
+    li {
+        font-size: 12px;
+        font-weight: 400;
+    }
+}
+
+.carousel-focus {
+    .item {
+        .carousel-img {
+            background-size: cover;
+            width: 100%;
+            height: 180px;
+            background-position: center center;
+            .transition(all 0.3s);
+        }
+    }
+
+    &:hover {
+        .carousel-img {
+            .transform(scale(1.02));
+
+        }
+    }
+
+    .carousel-control {
+        &.left, &.right {
+            background-image: none;
+
+            span {
+                display: none;
+            }
+
+            &:hover {
+                .transition(all 1s ease);
+
+                span {
+                    display: block;
+                }
+            }
+        }
+    }
+}
+
+.panel-blockimg {
+
+    border: none;
+    .box-shadow(none);
+
+    img {
+        width: 100%;
+    }
+
+}
+
+.hot-tags {
+    .panel-body a {
+        span {
+            margin-bottom: 10px;
+        }
+    }
+}
+
+.tags {
+    margin: 0;
+    display: inline-block;
+
+    .tag {
+        margin-bottom: 8px;
+    }
+}
+
+.tag {
+    display: inline-block;
+    padding: 0 8px;
+    height: 24px;
+    line-height: 24px;
+    font-weight: 400;
+    font-size: 13px;
+    text-align: center;
+    color: @primary-color;
+    background: @tag-color;
+    margin-right: 3px;
+    border-radius: 2px;
+
+    img {
+        width: 16px;
+        height: 16px;
+        margin-top: -1px;
+        margin-right: 3px;
+    }
+}
+
+.tag[href]:focus, .tag[href]:hover {
+    background-color: @primary-color;
+    color: #fff;
+    text-decoration: none;
+}
+
+.tag-xs {
+    padding: 0 6px;
+    height: 20px;
+    line-height: 20px;
+    font-size: 12px
+}
+
+.tag-sm {
+    padding: 0 6px;
+    height: 22px;
+    line-height: 22px;
+    font-size: 13px
+}
+
+.tag-lg {
+    font-size: 16px;
+    font-weight: 700;
+    height: 30px;
+    line-height: 28px
+}
+
+.tag-link {
+    background-color: transparent
+}
+
+.tag-logo {
+    padding-left: 25px;
+    background-repeat: no-repeat;
+    background-position: 4px 2px;
+    background-size: 16px 16px;
+}
+
+.tag-success {
+    background-color: #dff0d8;
+    color: #18bc9c;
+}
+
+.tag-info {
+    background-color: #d9edf7;
+    color: #3498db;
+}
+
+.tag-warning {
+    background-color: #fcf8e3;
+    color: #f39c12;
+}
+
+.tag-danger {
+    background-color: #f2dede;
+    color: #e74c3c;
+}
+
+.product-item {
+    .card {
+        border-radius: 3px;
+        position: relative;
+        padding: 12px;
+        margin: 0 auto 20px;
+        .transition(all 200ms cubic-bezier(0.55, 0.055, 0.675, 0.19));
+        border: 1px solid #eee;
+        min-height: 250px;
+        overflow: hidden;
+        background-color: #fff;
+
+        .thumb {
+            position: relative;
+            .transition(all 0.5s ease-out 0s);
+            margin: -12px;
+
+            > .preview-link::before {
+                background: rgba(0, 0, 0, 0.2);
+                opacity: 0;
+                z-index: 1;
+                position: absolute;
+                top: 0;
+                left: 0;
+                bottom: 0;
+                right: 0;
+                content: "";
+                .transition(all 0.5s ease-out 0s);
+            }
+
+            > .quickview-link {
+                display: block;
+                width: 40px;
+                height: 40px;
+                position: absolute;
+                top: 0;
+                right: 0;
+                left: 0;
+                bottom: 0;
+                margin: auto;
+                line-height: 40px;
+                text-align: center;
+                z-index: 10;
+                background: #000;
+                border-radius: 50%;
+                opacity: 0;
+                visibility: hidden;
+                color: #fff;
+                transform: scale(0);
+                -webkit-transform: scale(0);
+                transition: all 0.3s ease-out 0s;
+                -webkit-transition: all 0.3s ease-out 0s;
+            }
+
+            &:hover {
+                .preview-link::before {
+                    opacity: 1;
+                }
+
+                .quickview-link {
+                    opacity: 1;
+                    visibility: visible;
+                    transform: scale(1);
+                    -webkit-transform: scale(1);
+                }
+            }
+        }
+
+        &:hover {
+            .transform(translateY(-6px));
+            .box-shadow(0 26px 40px -24px rgba(0, 36, 100, 0.3));
+            .transition(all 0.3s ease);
+
+            .operate {
+                .pull-right {
+                    display: block;
+
+                }
+            }
+        }
+
+        .image {
+            position: relative;
+            width: 100%;
+            height: 1px;
+            overflow: hidden;
+            padding-bottom: 75%;
+            background-repeat: no-repeat;
+            background-size: cover;
+            background-position: center center;
+        }
+
+        .title {
+            padding-top: 10px;
+
+        }
+
+        h2 {
+            color: #000;
+            padding: 0;
+            margin-bottom: 5px;
+            height: 24px;
+            margin-top: 15px;
+            font-size: 14px;
+            font-weight: 400;
+            line-height: 24px;
+
+            text-align: left;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            -webkit-box-orient: vertical;
+            display: -webkit-box;
+            -webkit-line-clamp: 1;
+        }
+
+        .operate {
+            height: 31px;
+            overflow: hidden;
+
+            .pull-right {
+                display: none;
+            }
+        }
+    }
+}
+
+#content-container {
+    > h1 {
+        margin-top: 0;
+    }
+}
+
+body {
+    display: flex;
+    flex-direction: column;
+}
+
+.main-content {
+    //margin: 0 auto;
+    padding-bottom: 15px;
+
+    flex-grow: 1;
+    //flex: 1 0 auto;
+}
+
+footer {
+    flex-grow: 0;
+    flex-shrink: 0;
+}
+
+@media (max-width: 768px) {
+
+    .main-content {
+
+        > .container {
+            padding-left: 0;
+            padding-right: 0;
+            overflow-x: hidden;
+
+            > .category-title {
+                padding: 0 15px;
+                font-size: 20px;
+            }
+        }
+    }
+
+    .navbar-inverse {
+        height: 100vh;
+        max-height: 100vh;
+        padding-bottom: 50px;
+
+        ul.dropdown-menu {
+            background: #333333;
+        }
+
+        ul.navbar-nav {
+            > li {
+                margin-bottom: 1px;
+            }
+
+            > li.open {
+                > a {
+                    background-color: #080808;
+                }
+            }
+        }
+    }
+
+    .navbar-white {
+        .navbar-nav .open .dropdown-menu {
+            background: #eee;
+        }
+    }
+
+    .footer-logo {
+        margin-bottom: 20px;
+    }
+
+    .product-item .card .operate .pull-right {
+        display: inherit;
+    }
+}
+
+.lasest-update {
+    .panel-body {
+        padding: 8px 0;
+
+        ul {
+            margin-bottom: 0;
+        }
+
+        ul li {
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            position: relative;
+            height: 35px;
+            line-height: 35px;
+        }
+    }
+}
+
+.channel-list {
+    .row {
+        .col-xs-12 {
+            min-height: 315px;
+
+            h3 {
+                border-bottom: 1px solid #eee;
+                padding-bottom: 10px;
+                position: relative;
+
+                > a {
+                    font-size: 16px;
+                    //border-left: 2px solid @primary-color;
+                    position: relative;
+                    padding-left: 6px;
+
+                    &:before {
+                        position: absolute;
+                        top: 2px;
+                        left: 0px;
+
+                        content: ' ';
+                        width: 2px;
+                        height: 15px;
+
+                        background: @primary-color;
+                        display: inline-block;
+                    }
+                }
+
+                em {
+                    position: absolute;
+                    right: 5px;
+                    top: 2px;
+
+                    font-style: normal;
+                    font-weight: 400;
+
+                    a {
+                        font-size: 12px;
+                    }
+                }
+            }
+        }
+
+        .media {
+            margin-bottom: 10px;
+
+            .media-left {
+                a {
+                    width: 120px;
+                    display: block;
+
+                    .embed-responsive-4by3 {
+                        border-radius: 5px;
+                    }
+                }
+            }
+
+            .media-body {
+                font-size: 12px;
+
+                p {
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    -webkit-box-orient: vertical;
+                    display: -webkit-box;
+                    -webkit-line-clamp: 2;
+                    font-size: 14px;
+                    padding-right: 15px;
+
+                }
+            }
+        }
+
+        ul.inner-list li {
+            margin-bottom: 5px;
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            position: relative;
+            padding-right: 40px;
+            height: 30px;
+            line-height: 30px;
+
+            a {
+                color: #616161;
+            }
+
+            span {
+                position: absolute;
+                right: 0;
+            }
+        }
+    }
+}
+
+#comment-container {
+    #commentlist {
+        dl {
+            position: relative;
+            border-bottom: 1px solid #eee;
+            clear: both;
+            padding: 10px 0;
+            margin-bottom: 5px;
+
+            dt {
+                float: left;
+                margin-right: 10px;
+                width: 44px;
+                height: 44px;
+                display: block;
+                position: absolute;
+
+                img {
+                    width: 40px;
+                    height: 40px;
+                    border-radius: 50%;
+                }
+            }
+
+            dd {
+                padding-left: 55px;
+                float: left;
+                width: 100%;
+
+                cite {
+                    a {
+                        color: @primary-color;
+                    }
+                }
+
+                small {
+                    color: #999;
+                    margin: 0 0 0 3px;
+
+                    height: 20px;
+                    line-height: 20px;
+                    font-size: 10px;
+
+                    a {
+                        display: none;
+                    }
+                }
+
+                dl {
+                    margin: 0px;
+                    border-top: 1px solid #eee;
+                    border-bottom: none;
+                    padding-top: 15px;
+                    padding-bottom: 0;
+
+                    dd {
+                        width: 550px;
+                    }
+                }
+
+                p {
+                    margin-top: 5px;
+                    margin-bottom: 10px;
+                    line-height: 24px;
+
+                    em {
+                        font-style: normal;
+                        display: inline-block;
+                        padding: 0 5px;
+                        height: 22px;
+                        line-height: 22px;
+                        font-weight: 400;
+                        font-size: 13px;
+                        text-align: center;
+                        color: @primary-color;
+                        background: @tag-color;
+                        border-radius: 2px;
+
+                    }
+                }
+            }
+        }
+
+        cite {
+            font-style: normal;
+        }
+    }
+
+    h3 {
+        position: relative;
+        font-size: 16px;
+        padding: 15px 0;
+        background: #fff;
+
+        a {
+            display: none;
+        }
+    }
+
+    #postcomment {
+        .form-group {
+            margin-bottom: 10px;
+        }
+
+        label {
+            font-weight: normal;
+        }
+
+        a {
+            small {
+                display: inline !important;
+            }
+        }
+
+        textarea.form-control {
+            border-radius: 2px;
+            box-shadow: none;
+            border-color: #eeeeee;
+        }
+    }
+
+}
+
+.fieldlist dd {
+    display: block;
+    margin: 5px 0;
+
+    input {
+        display: inline-block;
+        width: 300px;
+    }
+
+    input:first-child {
+        width: 110px;
+    }
+
+    ins {
+        width: 110px;
+        display: inline-block;
+        text-decoration: none;
+        font-weight: bold;
+    }
+}
+
+.text-gray {
+    color: #d2d6de !important;
+}
+
+.no-padding {
+    padding: 0 !important;
+}
+
+.no-border {
+    border: none !important;
+}
+
+.pager {
+    .pagination {
+        margin: 0;
+    }
+
+    .pager {
+        margin: 0;
+    }
+
+    li {
+        margin: 0 .4em;
+        display: inline-block;
+
+        &:first-child, &:last-child {
+            > a, > span {
+                padding: .5em 1.2em;
+            }
+        }
+    }
+}
+
+.pager li > a, .pager li > span {
+    background: none;
+    border: 1px solid #e6e6e6;
+    border-radius: 0.25em;
+    padding: .5em .93em;
+    font-size: 14px;
+}
+
+.list-partner li {
+    display: inline-block;
+    margin: 0 12px 12px 0;
+    width: 140px;
+    text-align: center;
+
+    border: 1px solid #efefef;
+
+    img {
+        height: 50px;
+    }
+}
+
+.index-gallary, .related-article {
+    h5 {
+        font-size: 14px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-box-orient: vertical;
+        display: -webkit-box;
+        -webkit-line-clamp: 1;
+        font-weight: normal;
+        height: 15px;
+    }
+}
+
+.index-focus {
+    margin-bottom: 19px;
+}
+
+.article-content {
+    > .panel-heading {
+        padding: 0;
+        margin: 0 -15px;
+
+        > .breadcrumb {
+            background: #fff;
+            font-size: 13px;
+            margin-bottom: 0;
+            padding: 15px;
+        }
+    }
+}
+
+.article-donate {
+    padding: 10px 0;
+    text-align: center;
+
+    a {
+        min-width: 120px;
+        .border-radius(3px);
+    }
+}
+
+.category-title {
+    margin-bottom: 20px;
+    font-size: 24px;
+    color: #444;
+
+    .breadcrumb li {
+        font-size: 14px;
+
+    }
+}
+
+.category-order {
+    li > a.active {
+        color: @primary-color;
+    }
+}
+
+.img-zoom {
+    overflow: hidden;
+    display: inline-block;
+
+    img {
+        .transition(all 0.3s);
+    }
+
+    &:hover img {
+        .transform(scale(1.1));
+    }
+}
+
+.embed-responsive {
+    position: relative;
+    display: block;
+    height: 0;
+    padding: 0;
+    overflow: hidden;
+
+    img {
+        position: absolute;
+        object-fit: cover;
+        width: 100%;
+        height: 100%;
+        border: 0;
+    }
+}
+
+.embed-responsive-16by9 {
+    padding-bottom: 56.25%;
+}
+
+.embed-responsive-4by3 {
+    padding-bottom: 75%;
+}
+
+.embed-responsive-square {
+    padding-bottom: 100%;
+}
+
+.list-links {
+    a {
+        margin-right: 5px;
+    }
+}
+
+.navbar-form {
+    padding-top: 5px;
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+
+    .navbar-header {
+        width: 44px;
+        overflow: hidden;
+    }
+
+}
+
+@media (max-width: 767px) {
+    .skin-white {
+        padding-top: 70px;
+    }
+
+    ul.dropdown-menu {
+        position: relative;
+        width: 100%;
+        background: #222;
+
+        .open > a, .open > a:hover, .open > a:focus {
+            background: none;
+            color: #9d9d9d;
+        }
+
+        > .dropdown-menu {
+            position: relative;
+            width: 100%;
+            margin: 0;
+        }
+    }
+
+    .navbar-nav {
+        .open .dropdown-menu > li > a {
+            line-height: 22px;
+        }
+
+        .open .dropdown-menu {
+            position: relative;
+            width: 100%;
+            margin: 0;
+            left: 0;
+            background: #404950;
+
+        }
+    }
+
+    .dropdown-submenu > a:after {
+        display: none;
+    }
+
+    .panel-page {
+        padding: 15px;
+        min-height: 300px;
+    }
+
+    .article-list .media .media-left a {
+        width: 110px;
+    }
+
+    .article-list .media .media-body .article-title {
+        font-size: 1em;
+    }
+
+    .article-list .media-body .article-tag {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-box-orient: vertical;
+        display: -webkit-box;
+        -webkit-line-clamp: 1;
+    }
+
+    .navbar-nav {
+        margin: 8.25px 0;
+    }
+
+    .dropdown:not(.open):hover > .dropdown-menu {
+        display: none;
+    }
+
+    .article-list .media-body .article-tag span {
+        margin: 0 2px;
+
+    }
+
+    .article-pay a.btn {
+        display: block;
+        margin-top: 5px;
+
+    }
+
+    .navbar-form {
+        margin: 0;
+        border-top: none;
+        border-bottom: none;
+    }
+
+    .navbar-userinfo {
+        padding: 0;
+
+        > a {
+            height: 50px;
+        }
+    }
+
+    .focus-img {
+        margin-top: 15px;
+        padding: 0 15px;
+
+        > .row {
+            margin-left: 0;
+        }
+    }
+
+}
+
+@media (min-width: 768px) {
+    #index-focus .item {
+        .carousel-img {
+            height: 340px;
+            width: 100%;
+        }
+    }
+
+    #channel-focus .item {
+        .carousel-img {
+            height: 272px;
+            width: 100%;
+        }
+    }
+
+}
+
+@media (min-width: 979px) {
+    ul.nav li.dropdown:hover > ul.dropdown-menu {
+        display: block;
+    }
+}
+
+@media screen and (min-width: 768px) {
+    .carousel-caption {
+        left: 0;
+        right: 0;
+        background: rgba(0, 0, 0, .3);
+        padding: 0;
+        bottom: 0;
+        text-shadow: none;
+
+        h3 {
+            margin: 0;
+            font-size: 14px;
+            padding: 15px;
+            text-align: left;
+
+        }
+
+        p {
+            display: none;
+        }
+    }
+
+    .carousel-indicators {
+        bottom: 3px;
+        right: 15px;
+        width: auto;
+        left: inherit;
+        opacity: .6;
+
+    }
+}
+
+.carousel-control {
+    text-shadow: none;
+
+    .fa {
+        font: normal normal normal 30px/1 FontAwesome;
+    }
+
+    .icon-prev {
+        left: 20px;
+    }
+
+    .icon-next {
+        right: 20px;
+    }
+
+    .fa-chevron-left:before {
+        content: "\f053";
+    }
+
+    .fa-chevron-right:before {
+        content: "\f054";
+    }
+}
+
+.loadmore {
+    width: 80%;
+    margin: 1.5em auto;
+    line-height: 1.6em;
+    font-size: 14px;
+    text-align: center;
+    clear: both;
+}
+
+.loadmore-tips {
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.loadmore-line {
+    border-top: 1px solid #eeeeee;
+    margin-top: 2.4em;
+
+    .loadmore-tips {
+        position: relative;
+        top: -0.9em;
+        padding: 0 .55em;
+        background-color: #FFFFFF;
+        color: #808080;
+    }
+}
+
+.btn-loadmore {
+    clear: both;
+}
+
+.download-list {
+    margin: 0 -15px;
+
+    li {
+        width: 95px;
+        float: left;
+        display: inline-block;
+        margin: 0 15px;
+        padding: 15px 0;
+        text-align: center;
+        position: relative;
+        height: 170px;
+
+        a {
+            display: block;
+
+            p {
+                word-break: keep-all;
+                text-overflow: ellipsis;
+                line-height: 25px;
+                height: 25px;
+                overflow: hidden;
+            }
+
+            img + span {
+                display: block;
+                overflow: hidden;
+                height: 20px;
+            }
+        }
+
+        &:hover {
+            em {
+                display: none;
+            }
+
+            a.btn {
+                display: block;
+                width: 80px;
+                margin: 0 auto;
+
+            }
+        }
+
+        a:hover {
+            text-decoration: none;
+        }
+    }
+
+    img {
+        width: 90px;
+        height: 90px;
+        margin-bottom: 8px;
+    }
+
+    em {
+        display: block;
+        color: #999;
+        font-style: normal;
+    }
+
+    li > a.link {
+        display: block;
+        height: 120px;
+        overflow: hidden;
+        border-radius: 5px;
+
+        img {
+            border-radius: 5px;
+        }
+    }
+
+    a.btn {
+        display: none;
+
+    }
+}
+
+.screenshots-box > h2, .download-box > h2, .intro-box > h2, .history-box > h2 {
+    font-size: 18px;
+    color: #444;
+}
+
+@media (max-width: 991px) {
+    .download-list {
+        li {
+            margin: 0 10px;
+        }
+    }
+}
+
+.focus-img {
+    > .row > div {
+        padding: 0;
+        padding-right: 15px;
+        margin-bottom: 15px;
+        height: 100%;
+        display: block;
+
+        a > span {
+            border-radius: 3px;
+            overflow: hidden;
+        }
+
+    }
+
+    .intro {
+        position: absolute;
+        bottom: 0;
+        background: #000;
+        padding: 0 5px 0 5px;
+        width: 100%;
+        opacity: .5;
+        color: #fff;
+        height: 30px;
+        line-height: 30px;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        text-align: center;
+    }
+
+    a {
+        display: block;
+    }
+
+    img {
+        width: 100%;
+    }
+}
+
+@media (min-width: 768px) and (max-width: 992px) {
+    .focus-img {
+        margin-top: 15px;
+
+        > .row {
+            margin: 0 -10px;
+
+            > div {
+                padding: 0 10px;
+            }
+        }
+    }
+}
+
+@media (min-width: 992px) and (max-width: 1200px) {
+    .focus-img {
+        > .row {
+            > div .embed-responsive-16by9 {
+                padding-bottom: 68.25%;
+            }
+        }
+    }
+}
+
+.navbar .form-search {
+    input[type=search] {
+        -webkit-appearance: textfield;
+        font-family: inherit;
+        font-size: 100%;
+    }
+
+    input::-webkit-search-decoration,
+    input::-webkit-search-cancel-button {
+        display: none;
+    }
+
+    input[type=search] {
+        background: url('../img/search.svg') no-repeat 10px center;
+        background-size: 18px 18px;
+        //border: solid 1px #ccc;
+        border-color: transparent;
+        padding: 6px 10px;
+        width: 35px;
+
+        .border-radius(10em);
+        .transition(all .5s);
+        height: inherit;
+        cursor: pointer;
+        box-shadow: none;
+        color: transparent;
+    }
+
+    input[type=search]:hover {
+        background-color: #fff;
+    }
+
+    input[type=search]:focus {
+        border-color: @primary-color;
+        width: 200px;
+        padding-left: 32px;
+        color: #000;
+        background-color: #fff;
+        cursor: auto;
+        .box-shadow(0 0 5px lighten(@primary-color, 30%));
+
+        &::-moz-placeholder {
+            color: #999;
+        }
+
+        &::-webkit-input-placeholder {
+            color: #999;
+        }
+    }
+
+    input::-moz-placeholder {
+        color: transparent;
+    }
+
+    input::-webkit-input-placeholder {
+        color: transparent;
+    }
+
+}
+
+
+@media (min-width: 768px) {
+
+    .navbar .navbar-header {
+        position: relative;
+        z-index: 9999;
+    }
+
+    .navbar .navbar-collapse {
+
+        position: relative;
+        z-index: 9998;
+
+        .navbar-nav {
+            display: flex;
+            justify-content: space-around;
+            flex-direction: row;
+            white-space: nowrap; //不换行
+        }
+
+        .navbar-right {
+            position: absolute;
+            right: 0;
+            background: #fff;
+        }
+    }
+}
+
+@media (max-width: 767px) {
+    .navbar {
+        .form-search input[type=search] {
+            position: relative;
+            width: 100%;
+            border: 1px solid #ddd;
+
+            &:focus {
+                width: 100%;
+            }
+        }
+
+        .navbar-collapse {
+            position: fixed;
+            top: 0;
+            overflow: auto;
+            z-index: 9999;
+            background: #fff;
+            box-shadow: 10px 0 10px rgba(0, 0, 0, 0.06);
+            max-height: inherit;
+            height: 100vh;
+            transition: .5s;
+            width: 250px;
+            margin-left: -280px;
+            margin-right: 0;
+            display: flex;
+
+            > ul.navbar-nav {
+                margin: 15px 0;
+
+                > li {
+                    margin-bottom: 5px;
+                    border-radius: 3px;
+                    overflow: hidden;
+                    background: #fbfbfb;
+                }
+
+                li {
+                    > a b.caret {
+                        position: absolute;
+                        right: 15px;
+                        top: 50%;
+                        margin-top: -2px;
+                    }
+
+                    ul.dropdown-menu {
+                        border-radius: 0;
+                    }
+                }
+
+                &:first-child {
+                    width: 100%;
+                    //flex-grow: 1;
+                }
+
+                &.navbar-right {
+                    width: 100%;
+                    margin-bottom: 0;
+                }
+            }
+
+            &.active {
+                //display: block;
+                margin-left: -15px;
+                //flex-wrap: wrap;
+                //flex-direction: column-reverse;
+                flex-direction: column;
+                flex: auto;
+                //width: 250px;
+                //transition: .5s;
+
+                > ul {
+                    width: 100%;
+                }
+
+                .dropdown-submenu ul.dropdown-menu {
+                    display: block;
+                }
+            }
+        }
+
+        .navbar-collapse-bg {
+            position: fixed;
+            top: 0;
+            overflow: hidden;
+            z-index: 9998;
+            background: transparent;
+            height: 100vh;
+            width: 100%;
+            display: block;
+        }
+    }
+}
+
+/* 搜索建议 */
+.autocomplete-suggestions {
+    text-align: left;
+    cursor: default;
+    background: #fff;
+    //border: 1px solid rgba(0, 0, 0, 0.15);
+    border-radius: 2px;
+    .box-shadow(0 6px 12px rgba(0, 0, 0, 0.175));
+    background-clip: padding-box;
+    position: absolute;
+    display: none;
+    z-index: 1036;
+    max-height: 254px;
+    overflow: hidden;
+    overflow-y: auto;
+    box-sizing: border-box;
+
+    .autocomplete-suggestion {
+        padding: 6px 12px;
+
+        b {
+            color: red;
+        }
+
+        &:hover {
+            background: #f0f0f0;
+        }
+    }
+}
+
+.layui-layer {
+    .layui-layer-confirm {
+        width: 100%;
+        height: 100%;
+
+        &:focus {
+            border: 1px solid #444c69;
+            .border-radius(2px);
+        }
+
+        &:focus-visible {
+            outline: 0;
+        }
+    }
+}

+ 161 - 0
public/assets/addons/cms/less/simtree.less

@@ -0,0 +1,161 @@
+@color: #333;
+
+.sim-tree {
+    list-style: none;
+    font-size: 14px;
+    color: @color;
+    padding: 5px;
+
+    ul,
+    li {
+        margin: 0;
+        padding: 0;
+    }
+
+    li {
+        font-size: 0;
+        display: flex;
+        flex-wrap: wrap;
+        align-items: flex-start;
+
+        ul {
+            flex: 1;
+            flex-basis: 100%;
+            width: 100%;
+            display: none;
+            margin-left: 15px;
+        }
+    }
+
+    ul.show, li.show {
+        display: block;
+    }
+
+    ul.none, li.none {
+        display: none;
+    }
+
+    li.disabled {
+        > a {
+            color: #aaa;
+            cursor: not-allowed;
+
+            .sim-tree-checkbox {
+                border-color: #eee;
+            }
+        }
+    }
+
+    a {
+        flex: 1;
+        font-size: 14px;
+        color: @color;
+        text-decoration: none;
+        vertical-align: top;
+        line-height: 26px;
+        position: relative;
+        padding-left: 20px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-box-orient: vertical;
+        display: -webkit-box;
+        -webkit-line-clamp: 1;
+        height: 26px;
+    }
+
+    .sim-tree-spread {
+        width: 20px;
+        padding-left: 5px;
+        box-sizing: border-box;
+
+        &.sim-hidden {
+            visibility: hidden;
+        }
+    }
+
+    .sim-tree-spread, a {
+        cursor: pointer;
+    }
+
+    .sim-tree-spread {
+        height: 26px;
+    }
+
+    .sim-loading {
+        background: url('data:image/gif;base64,R0lGODlhEAAQAMQQAObm5uLi4unp6dHR0cnJydfX1+jo6O/v7/Dw8NPT0/39/crKyvr6+uDg4MfHx////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAQACwAAAAAEAAQAAAFXeAjPkiTjGgaLI6Tvs9BtPAIMPH8KgK5DDhZSlFYlFrAGIrYMrUcyRGzdapZr6jE02FAyZ6JxrOrEAVnjgaCRS6IkjLjo9F2PaDBwLJAu+NfAix2LQsAMCVVYQgoIQAh+QQFAAAQACwJAAAABwAHAAAFFGDSIE/5OM7SmKhjsK55vjIt32UIACH5BAUAABAALAoAAwAGAAoAAAUaICQqgggpxYKcheM0qOskZm0/eA7luMibvRAAIfkEBQAAEAAsCQAJAAcABwAABRXgcxBOmTwi6TRouiAoIwbtI9d4/oQAIfkEBQAAEAAsAwAKAAoABgAABRsgJI7MKD6POJQnKjpD60IODKFzvQD3nDQISAgAIfkEBQAAEAAsAAAJAAcABwAABRPgI45kSSrFWTgj6rCisLwk0iQhACH5BAUAABAALAAAAwAHAAoAAAUcIPRAJPmco4mm61m+cJk4tGNATX0ryGK/jVspBAAh+QQFAAAQACwAAAAABwAHAAAFFOAjjmRpPgBDIsugio3juGIiz2oIADs=') center center no-repeat;
+
+        &.sim-icon-d:before,
+        &.sim-icon-r:before {
+            display: none;
+        }
+    }
+
+    .sim-icon-d:before,
+    .sim-icon-r:before {
+        content: '';
+        display: inline-block;
+        width: 0;
+        height: 0;
+        border: 6px solid transparent;
+        vertical-align: top;
+        position: relative;
+    }
+
+    .sim-icon-r:before {
+        border-left-width: 8px;
+        border-left-color: @color;
+        top: ((26px - 6 * 2px) / 2);
+    }
+
+    .sim-icon-d:before {
+        margin-left: -4px;
+        border-top-color: @color;
+        top: ((26px - 6 * 2px) / 2 + 6px / 2);
+    }
+
+    .sim-tree-checkbox {
+        display: inline-block;
+        border: 1px solid #ccc;
+        height: 16px;
+        width: 16px;
+        border-radius: 3px;
+        box-sizing: border-box;
+        text-align: center;
+        line-height: 16px;
+        background: #fff;
+        color: #fff;
+        vertical-align: middle;
+        position: absolute;
+        left: 0;
+        top: 4px;
+
+        &.sim-hide {
+            display: none;
+        }
+
+        &.sim-tree-semi, &.checked {
+            border-color: #2b85e4;
+            background-color: #2b85e4;
+        }
+
+        &.sim-tree-semi {
+
+            &:after {
+                content: '';
+                display: block;
+                position: absolute;
+                width: 8px;
+                height: 2px;
+                background: #fff;
+                top: 6px;
+                left: 3px;
+            }
+        }
+
+        &.checked {
+            background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAPFBMVEUAAAD///////////////////////////////////////////////////////////////////////8AAADY904BAAAAE3RSTlMAOiE8877cHQkXr9cZQvUc20NAbrhSVAAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAA7SURBVAjXY2DADhiZEGxmFlYkNhs7KpuDE0mci5sHoYaXj5sHyOaHqOblE4CzGRgE+RBsBgYhfmxuAABcBQF5T7U3IwAAAABJRU5ErkJggg==');
+            background-repeat: no-repeat;
+            background-position: center center;
+        }
+    }
+}

+ 34 - 0
public/assets/addons/cms/less/tinycss.less

@@ -0,0 +1,34 @@
+
+.make-margin-padding(margin, m, 5px, 4);
+.make-margin-padding(padding, p, 5px, 4);
+
+.make-margin-padding(@type, @prefix, @space, @i) when (@i >= 0) {
+  .make-margin-padding(@type, @prefix, @space, @i - 1);
+  @pixel: @space * @i;
+  .@{prefix}-@{i} {
+      @{type}-top: @pixel !important;
+      @{type}-right: @pixel !important;
+      @{type}-bottom: @pixel !important;
+      @{type}-left: @pixel !important;
+  }
+  .@{prefix}t-@{i} {
+      @{type}-top: @pixel !important;
+  }
+  .@{prefix}r-@{i} {
+      @{type}-right: @pixel !important;
+  }
+  .@{prefix}b-@{i} {
+      @{type}-bottom: @pixel !important;
+  }
+  .@{prefix}l-@{i} {
+      @{type}-left: @pixel !important;
+  }
+  .@{prefix}x-@{i} {
+      @{type}-left: @pixel !important;
+      @{type}-right: @pixel !important;
+  }
+  .@{prefix}y-@{i} {
+      @{type}-top: @pixel !important;
+      @{type}-bottom: @pixel !important;
+  }
+}

+ 25 - 0
public/assets/addons/cms/preview.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang=zh-CN>
+<head>
+    <meta charset=utf-8>
+    <meta http-equiv=X-UA-Compatible content="IE=edge">
+    <link rel="shortcut icon" type=image/x-icon href=static/favicon.ico>
+    <meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1">
+    <title>cms</title>
+    <script>document.addEventListener('DOMContentLoaded', function () {
+        document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
+    })</script>
+    <link rel=stylesheet href=./static/index.css>
+    <script src=./static/js/quill.min.js></script>
+    <script src=./static/js/image-resize.min.js></script>
+</head>
+<body>
+<noscript><strong>本站点必须要开启JavaScript才能运行</strong></noscript>
+<script type="text/javascript">
+    var fastUrl = window.location.origin;
+</script>
+<div id=app></div>
+<script src=./static/js/chunk-vendors.348cced0.js></script>
+<script src=./static/js/index.5f4c8553.js></script>
+</body>
+</html>

+ 1 - 0
public/assets/addons/cms/static/config.js

@@ -0,0 +1 @@
+var fastUrl = 'http://www.fastask.com';

BIN
public/assets/addons/cms/static/favicon.ico


BIN
public/assets/addons/cms/static/home.png


BIN
public/assets/addons/cms/static/image/0.png


BIN
public/assets/addons/cms/static/image/1.png


BIN
public/assets/addons/cms/static/image/2.png


BIN
public/assets/addons/cms/static/image/select.png


BIN
public/assets/addons/cms/static/img/select.bd08ec9a.png


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/index.css


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/chunk-vendors.348cced0.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/image-resize.min.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/index.5f4c8553.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-article.be29efec.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-detail~pages-diyform-lists~pages-index-inde~3bf1a1f5.bf0098f4.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-detail~pages-diyform-lists~pages-index-inde~90f14013.6e595e46.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-article~pages-article-detail~pages-diyform-lists~pages-index-index~pages-my-article~pa~ea72029b.8b72d01e.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-article~pages-diyform-lists~pages-index-index~pages-my-article~pages-my-collection~pag~cb0ec229.2fd64e27.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-detail.7f999adb.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-article-detail~pages-login-forgetpwd~pages-login-login~pages-login-mobilelogin~pages-login-reg~e4702bbc.61cfa617.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-diyform-detail.cc15c740.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-diyform-detail~pages-my-aboutus~pages-my-agreement~pages-page-detail.7231a318.js


File diff suppressed because it is too large
+ 0 - 0
public/assets/addons/cms/static/js/pages-diyform-lists.3683a181.js


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