feat: support export markdown package. (halo-dev/console#279)

pull/3445/head
Ryan Wang 2021-01-05 09:47:18 +08:00 committed by GitHub
parent cfa91c6541
commit b7914e07c4
13 changed files with 363 additions and 459 deletions

248
package-lock.json generated
View File

@ -6,21 +6,21 @@
"dependencies": {
"@ant-design/colors": {
"version": "3.2.2",
"resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-3.2.2.tgz?cache=0&sync_timestamp=1596611369344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Fcolors%2Fdownload%2F%40ant-design%2Fcolors-3.2.2.tgz",
"integrity": "sha1-WtQ9YZ6RHzSI66wwPWBuZqhCOQM=",
"resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz",
"integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==",
"requires": {
"tinycolor2": "^1.4.1"
}
},
"@ant-design/icons": {
"version": "2.1.1",
"resolved": "https://registry.npm.taobao.org/@ant-design/icons/download/@ant-design/icons-2.1.1.tgz?cache=0&sync_timestamp=1596529338545&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Ficons%2Fdownload%2F%40ant-design%2Ficons-2.1.1.tgz",
"integrity": "sha1-e5wI3/1PXUHbZn2dvl4BB9C9mko="
"resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-2.1.1.tgz",
"integrity": "sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w=="
},
"@ant-design/icons-vue": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/@ant-design/icons-vue/download/@ant-design/icons-vue-2.0.0.tgz?cache=0&sync_timestamp=1598869253063&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Ficons-vue%2Fdownload%2F%40ant-design%2Ficons-vue-2.0.0.tgz",
"integrity": "sha1-A1f1AQpATp80qHpLQbKgjfaR284=",
"resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-2.0.0.tgz",
"integrity": "sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg==",
"requires": {
"@ant-design/colors": "^3.1.0",
"babel-runtime": "^6.26.0"
@ -1343,17 +1343,17 @@
},
"@simonwep/pickr": {
"version": "1.7.4",
"resolved": "https://registry.npm.taobao.org/@simonwep/pickr/download/@simonwep/pickr-1.7.4.tgz",
"integrity": "sha1-sU/NlFiQOIuHDNbbTWx41THyUUE=",
"resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.7.4.tgz",
"integrity": "sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==",
"requires": {
"core-js": "^3.6.5",
"nanopop": "^2.1.0"
},
"dependencies": {
"core-js": {
"version": "3.6.5",
"resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.6.5.tgz?cache=0&sync_timestamp=1589682726446&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-3.6.5.tgz",
"integrity": "sha1-c5XcJzrzf7LlDpvT2f6EEoUjHRo="
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz",
"integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A=="
}
}
},
@ -2462,18 +2462,6 @@
"supports-color": "^7.0.0"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -2603,31 +2591,6 @@
"webpack-sources": "^1.4.3"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.1.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.1.tgz",
"integrity": "sha512-wz/+HFg/3SBayHWAlZXARcnDTl3VOChrfW9YnxvAweiuyKX/7IGx1ad/4yJHmwhgWlOVYMAbTiI7GV8G33PfGQ==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
}
}
},
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@ -3016,8 +2979,8 @@
},
"add-dom-event-listener": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/add-dom-event-listener/download/add-dom-event-listener-1.1.0.tgz",
"integrity": "sha1-apLbOg3Qq8JU4JXA8dwUrLuq4xA=",
"resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz",
"integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==",
"requires": {
"object-assign": "4.x"
}
@ -3113,9 +3076,9 @@
}
},
"ant-design-vue": {
"version": "1.7.1",
"resolved": "https://registry.npm.taobao.org/ant-design-vue/download/ant-design-vue-1.7.1.tgz",
"integrity": "sha1-55d/kjl+/rEXM71hMcFv2rz554Q=",
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.7.2.tgz",
"integrity": "sha512-iVskTSG62OSiptyGQkvyhoeLlLMiqKtAOTcWZ7MmsMrj38h0TCpGtqSYS4/fwq4yYgyzloYSteBo8U8TrV99RA==",
"requires": {
"@ant-design/icons": "^2.1.1",
"@ant-design/icons-vue": "^2.0.0",
@ -3229,8 +3192,8 @@
},
"array-tree-filter": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz",
"integrity": "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA="
"resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
"integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
},
"array-union": {
"version": "1.0.2",
@ -3358,9 +3321,9 @@
"dev": true
},
"async-validator": {
"version": "3.4.0",
"resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-3.4.0.tgz",
"integrity": "sha1-hxs+WUEkv0xOt7zRqeeLRPOwnK4="
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz",
"integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ=="
},
"asynckit": {
"version": "0.4.0",
@ -3498,8 +3461,8 @@
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY="
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-jest": {
"version": "26.3.0",
@ -4906,8 +4869,8 @@
},
"classnames": {
"version": "2.2.6",
"resolved": "https://registry.npm.taobao.org/classnames/download/classnames-2.2.6.tgz",
"integrity": "sha1-Q5Nb/90pHzJtrQogUwmzjQD2UM4="
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
"integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
},
"clean-css": {
"version": "4.2.3",
@ -5375,7 +5338,7 @@
},
"component-classes": {
"version": "1.2.6",
"resolved": "https://registry.npm.taobao.org/component-classes/download/component-classes-1.2.6.tgz",
"resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz",
"integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=",
"requires": {
"component-indexof": "0.0.3"
@ -5389,7 +5352,7 @@
},
"component-indexof": {
"version": "0.0.3",
"resolved": "https://registry.npm.taobao.org/component-indexof/download/component-indexof-0.0.3.tgz",
"resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz",
"integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ="
},
"compressible": {
@ -6507,12 +6470,12 @@
},
"dom-align": {
"version": "1.12.0",
"resolved": "https://registry.npm.taobao.org/dom-align/download/dom-align-1.12.0.tgz?cache=0&sync_timestamp=1589854754211&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-align%2Fdownload%2Fdom-align-1.12.0.tgz",
"integrity": "sha1-VvtxVt8LkQmYMDZNLUj4iWP1opw="
"resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz",
"integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA=="
},
"dom-closest": {
"version": "0.2.0",
"resolved": "https://registry.npm.taobao.org/dom-closest/download/dom-closest-0.2.0.tgz",
"resolved": "https://registry.npmjs.org/dom-closest/-/dom-closest-0.2.0.tgz",
"integrity": "sha1-69n5HRvyLo1vR3h2u80+yQIWwM8=",
"requires": {
"dom-matches": ">=1.0.1"
@ -6535,13 +6498,13 @@
},
"dom-matches": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/dom-matches/download/dom-matches-2.0.0.tgz",
"resolved": "https://registry.npmjs.org/dom-matches/-/dom-matches-2.0.0.tgz",
"integrity": "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw="
},
"dom-scroll-into-view": {
"version": "2.0.1",
"resolved": "https://registry.npm.taobao.org/dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz",
"integrity": "sha1-DezIUigB/Y0/HGujVadNOCxfmJs="
"resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz",
"integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
},
"dom-serializer": {
"version": "0.2.2",
@ -9118,7 +9081,7 @@
},
"intersperse": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/intersperse/download/intersperse-1.0.0.tgz",
"resolved": "https://registry.npmjs.org/intersperse/-/intersperse-1.0.0.tgz",
"integrity": "sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE="
},
"invariant": {
@ -9323,13 +9286,13 @@
},
"is-mobile": {
"version": "2.2.2",
"resolved": "https://registry.npm.taobao.org/is-mobile/download/is-mobile-2.2.2.tgz?cache=0&sync_timestamp=1592980494392&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-mobile%2Fdownload%2Fis-mobile-2.2.2.tgz",
"integrity": "sha1-9snF1Q7gElTOBec5vdg18e1OmVQ="
"resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz",
"integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg=="
},
"is-negative-zero": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.0.tgz",
"integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
},
"is-number": {
"version": "3.0.0",
@ -9485,8 +9448,8 @@
},
"ismobilejs": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/ismobilejs/download/ismobilejs-1.1.1.tgz",
"integrity": "sha1-xWygro5Sskyg8iul7zIVot27qg4="
"resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
"integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
},
"isobject": {
"version": "3.0.1",
@ -10427,7 +10390,7 @@
},
"json2mq": {
"version": "0.2.0",
"resolved": "https://registry.npm.taobao.org/json2mq/download/json2mq-0.2.0.tgz",
"resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
"integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=",
"requires": {
"string-convert": "^0.2.0"
@ -11619,8 +11582,8 @@
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz",
"integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M="
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"move-concurrently": {
"version": "1.0.1",
@ -11659,8 +11622,8 @@
},
"mutationobserver-shim": {
"version": "0.3.7",
"resolved": "https://registry.npm.taobao.org/mutationobserver-shim/download/mutationobserver-shim-0.3.7.tgz",
"integrity": "sha1-i/YzsMCwKRoRByVe0ywTCIqMW/M="
"resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz",
"integrity": "sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ=="
},
"mute-stream": {
"version": "0.0.8",
@ -11707,8 +11670,8 @@
},
"nanopop": {
"version": "2.1.0",
"resolved": "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz?cache=0&sync_timestamp=1598256090184&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnanopop%2Fdownload%2Fnanopop-2.1.0.tgz",
"integrity": "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA="
"resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.1.0.tgz",
"integrity": "sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw=="
},
"native-request": {
"version": "1.0.7",
@ -12079,8 +12042,8 @@
},
"omit.js": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/omit.js/download/omit.js-1.0.2.tgz",
"integrity": "sha1-kaFPDrqEBm36AVvzDkdMR/MLyFg=",
"resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz",
"integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
"requires": {
"babel-runtime": "^6.23.0"
}
@ -13502,8 +13465,8 @@
},
"raf": {
"version": "3.4.1",
"resolved": "https://registry.npm.taobao.org/raf/download/raf-3.4.1.tgz?cache=0&sync_timestamp=1586264003311&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fraf%2Fdownload%2Fraf-3.4.1.tgz",
"integrity": "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk=",
"resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
"requires": {
"performance-now": "^2.1.0"
}
@ -13929,8 +13892,8 @@
},
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"resolve": {
"version": "1.17.0",
@ -14344,13 +14307,13 @@
},
"shallow-equal": {
"version": "1.2.1",
"resolved": "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz",
"integrity": "sha1-TBar+lYEOqINBQMk76aJQLDaedo="
"resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
"integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
},
"shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/shallowequal/download/shallowequal-1.1.0.tgz",
"integrity": "sha1-GI1SHelbkIdAT9TctosT3wrk5/g="
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
},
"shebang-command": {
"version": "1.2.0",
@ -14918,7 +14881,7 @@
},
"string-convert": {
"version": "0.2.1",
"resolved": "https://registry.npm.taobao.org/string-convert/download/string-convert-0.2.1.tgz",
"resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
"integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c="
},
"string-length": {
@ -15450,8 +15413,8 @@
},
"tinycolor2": {
"version": "1.4.2",
"resolved": "https://registry.npm.taobao.org/tinycolor2/download/tinycolor2-1.4.2.tgz",
"integrity": "sha1-P2pNEHGtB2dtf6Ry4frECnGdiAM="
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
"integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
},
"tmp": {
"version": "0.0.33",
@ -16169,6 +16132,87 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.1.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
"integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-ls": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/vue-ls/-/vue-ls-3.2.1.tgz",
@ -16176,8 +16220,8 @@
},
"vue-ref": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/vue-ref/download/vue-ref-2.0.0.tgz",
"integrity": "sha1-SDCE1zKr7RHaeWd4qCZqOvDqGpw="
"resolved": "https://registry.npmjs.org/vue-ref/-/vue-ref-2.0.0.tgz",
"integrity": "sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ=="
},
"vue-router": {
"version": "3.4.3",
@ -16339,8 +16383,8 @@
},
"warning": {
"version": "4.0.3",
"resolved": "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz",
"integrity": "sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
"requires": {
"loose-envify": "^1.0.0"
}

View File

@ -20,7 +20,7 @@
"test:unit": "vue-cli-service test:unit"
},
"dependencies": {
"ant-design-vue": "^1.7.1",
"ant-design-vue": "^1.7.2",
"axios": "^0.19.2",
"dayjs": "^1.8.36",
"enquire.js": "^2.1.6",

View File

@ -65,4 +65,32 @@ backupApi.deleteExportedData = filename => {
})
}
backupApi.exportMarkdowns = needFrontMatter => {
return service({
url: `${baseUrl}/markdown/export`,
method: 'post',
data: {
needFrontMatter: needFrontMatter
},
timeout: 8640000 // 24 hours
})
}
backupApi.listExportedMarkdowns = () => {
return service({
url: `${baseUrl}/markdown/export`,
method: 'get'
})
}
backupApi.deleteExportedMarkdown = filename => {
return service({
url: `${baseUrl}/markdown/export`,
params: {
filename: filename
},
method: 'delete'
})
}
export default backupApi

View File

@ -1,39 +0,0 @@
import service from '@/utils/service'
const baseUrl = '/api/admin/static_page'
const staticPageApi = {}
staticPageApi.list = () => {
return service({
url: baseUrl,
method: 'get'
})
}
staticPageApi.generate = () => {
return service({
url: `${baseUrl}/generate`,
method: 'get'
})
}
staticPageApi.deploy = () => {
return service({
url: `${baseUrl}/deploy`,
method: 'get'
})
}
staticPageApi.deployType = {
GIT: {
type: 'GIT',
text: 'Git'
},
NETLIFY: {
type: 'NETLIFY',
text: 'Netlify'
}
}
export default staticPageApi

View File

@ -185,13 +185,6 @@ export const asyncRouterMap = [
component: () => import('@/views/system/ToolList'),
meta: { title: '小工具', hiddenHeaderContent: false }
},
// {
// path: '/system/tools/staticpages',
// name: 'StaticPagesManage',
// hidden: true,
// component: () => import('@/views/system/staticpages/StaticPagesManage'),
// meta: { title: '静态部署', hiddenHeaderContent: false }
// },
{
path: '/system/about',
name: 'About',

View File

@ -25,29 +25,6 @@
>进入</a-button>
</a-card>
</a-col>
<!-- <a-col
:xl="6"
:lg="6"
:md="12"
:sm="24"
:xs="24"
:style="{ marginBottom: '12px' }"
>
<a-card
:bordered="false"
:bodyStyle="{ padding: '16px' }"
>
<div slot="title">
<a-icon type="html5" /> 静态部署
</div>
<p style="min-height: 50px;">生成静态页面并部署到 Github Pages 之类的托管平台</p>
<a-button
type="primary"
style="float:right"
@click="handleToStaticPagesManage"
>管理</a-button>
</a-card>
</a-col> -->
<a-col
:xl="6"
:lg="6"
@ -79,6 +56,12 @@
>
数据导出
</a-menu-item>
<a-menu-item
key="3"
@click="exportMarkdownDrawerVisible = true"
>
导出文章为 Markdown 文档
</a-menu-item>
</a-menu>
<a-button class="ml-2"> 备份
<a-icon type="down" />
@ -127,22 +110,26 @@
</a-modal>
<BackupWorkDirDrawer v-model="backupWorkDirDrawerVisible"></BackupWorkDirDrawer>
<ExportDataDrawer v-model="exportDataDrawerVisible"></ExportDataDrawer>
<ExportMarkdownDrawer v-model="exportMarkdownDrawerVisible"></ExportMarkdownDrawer>
</page-view>
</template>
<script>
import { mapGetters } from 'vuex'
import backupApi from '@/api/backup'
import { PageView } from '@/layouts'
import BackupWorkDirDrawer from './components/BackupWorkDirDrawer'
import ExportDataDrawer from './components/ExportDataDrawer'
import ExportMarkdownDrawer from './components/ExportMarkdownDrawer'
import { mapGetters } from 'vuex'
import backupApi from '@/api/backup'
export default {
components: { PageView, BackupWorkDirDrawer, ExportDataDrawer },
components: { PageView, BackupWorkDirDrawer, ExportDataDrawer, ExportMarkdownDrawer },
data() {
return {
backupWorkDirDrawerVisible: false,
exportDataDrawerVisible: false,
exportMarkdownDrawerVisible: false,
markdownUpload: false,
uploadHandler: backupApi.importMarkdown,
}
@ -165,9 +152,6 @@ export default {
handleToDeveloperOptions() {
this.$router.push({ name: 'DeveloperOptions' })
},
// handleToStaticPagesManage() {
// this.$router.push({ name: 'StaticPagesManage' })
// },
onUploadClose() {
this.$refs.upload.handleClearFileList()
},

View File

@ -14,7 +14,7 @@
>
<a-col :span="24">
<a-alert
message="注意:备份后生成的压缩文件存储在临时文件中,重启服务器会造成备份文件的丢失,所以请尽快下载"
message="注意:备份后生成的压缩文件存储在临时文件中,重启服务器会造成备份文件的丢失,所以请尽快下载"
banner
closable
/>
@ -89,19 +89,19 @@ export default {
backuping: false,
loading: false,
backupErrored: false,
backups: []
backups: [],
}
},
model: {
prop: 'visible',
event: 'close'
event: 'close',
},
props: {
visible: {
type: Boolean,
required: false,
default: true
}
default: true,
},
},
methods: {
handleAfterVisibleChanged(visible) {
@ -113,7 +113,7 @@ export default {
this.loading = true
backupApi
.listWorkDirBackups()
.then(response => {
.then((response) => {
this.backups = response.data.data
})
.finally(() => {
@ -153,7 +153,7 @@ export default {
},
onClose() {
this.$emit('close', false)
}
}
},
},
}
</script>

View File

@ -14,7 +14,7 @@
>
<a-col :span="24">
<a-alert
message="注意:导出后的数据文件存储在临时文件中,重启服务器会造成备份文件的丢失,所以请尽快下载"
message="注意:导出后的数据文件存储在临时文件中,重启服务器会造成备份文件的丢失,所以请尽快下载"
banner
closable
/>

View File

@ -0,0 +1,166 @@
<template>
<a-drawer
title="导出文章为 Markdown 文档"
:width="isMobile()?'100%':'480'"
closable
:visible="visible"
destroyOnClose
@close="onClose"
:afterVisibleChange="handleAfterVisibleChanged"
>
<a-row
type="flex"
align="middle"
>
<a-col :span="24">
<a-alert
message="注意:导出后的数据文件存储在临时文件中,重启服务器会造成备份文件的丢失,所以请尽快下载。"
banner
closable
/>
<a-divider>历史文件</a-divider>
<a-list
itemLayout="vertical"
size="small"
:dataSource="files"
:loading="loading"
>
<a-list-item
slot="renderItem"
slot-scope="file"
>
<a-button
slot="extra"
type="link"
style="color: red"
icon="delete"
:loading="file.deleting"
@click="handleFileDeleteClick(file)"
>删除</a-button>
<a-list-item-meta>
<a
slot="title"
:href="file.downloadLink"
>
<a-icon
type="schedule"
style="color: #52c41a"
/>
{{ file.filename }}
</a>
<p slot="description">{{ file.updateTime | timeAgo }}/{{ file.fileSize | fileSizeFormat }}</p>
</a-list-item-meta>
</a-list-item>
</a-list>
</a-col>
</a-row>
<a-divider class="divider-transparent" />
<div class="bottom-control">
<a-space>
<a-popconfirm
title="是否同时为 Markdown 文档生成 Front Matter"
@confirm="handleExportClick(true)"
@cancel="handleExportClick(false)"
okText="是"
cancelText="否"
>
<ReactiveButton
type="primary"
icon="download"
@callback="handleBackupedCallback"
:loading="backuping"
:errored="backupErrored"
text="备份"
loadedText="备份成功"
erroredText="备份失败"
></ReactiveButton>
</a-popconfirm>
<a-button
type="dashed"
icon="reload"
:loading="loading"
@click="handleListBackups"
>刷新</a-button>
</a-space>
</div>
</a-drawer>
</template>
<script>
import { mixin, mixinDevice } from '@/utils/mixin.js'
import backupApi from '@/api/backup'
export default {
name: 'ExportDataDrawer',
mixins: [mixin, mixinDevice],
data() {
return {
backuping: false,
loading: false,
backupErrored: false,
files: [],
}
},
model: {
prop: 'visible',
event: 'close',
},
props: {
visible: {
type: Boolean,
required: false,
default: true,
},
},
methods: {
handleAfterVisibleChanged(visible) {
if (visible) {
this.handleListBackups()
}
},
handleListBackups() {
this.loading = true
backupApi
.listExportedMarkdowns()
.then((response) => {
this.files = response.data.data
})
.finally(() => {
setTimeout(() => {
this.loading = false
}, 200)
})
},
handleExportClick(needFrontMatter = false) {
this.backuping = true
backupApi
.exportMarkdowns(needFrontMatter)
.catch(() => {
this.backupErrored = true
})
.finally(() => {
setTimeout(() => {
this.backuping = false
}, 400)
})
},
handleBackupedCallback() {
if (this.backupErrored) {
this.backupErrored = false
} else {
this.handleListBackups()
}
},
handleFileDeleteClick(file) {
file.deleting = true
backupApi.deleteExportedMarkdown(file.filename).finally(() => {
setTimeout(() => {
file.deleting = false
}, 400)
this.handleListBackups()
})
},
onClose() {
this.$emit('close', false)
},
},
}
</script>

View File

@ -1,43 +0,0 @@
<template>
<div>
<a-row>
<a-col :span="24">
<div class="card-container">
<a-tabs type="card">
<a-tab-pane key="environment">
<span slot="tab">
<a-icon type="folder" />文件列表
</span>
<StaticPagesList />
</a-tab-pane>
<a-tab-pane key="runtimeLogs">
<span slot="tab">
<a-icon type="appstore" />部署平台
</span>
<DeploySettingsForm />
</a-tab-pane>
<a-tab-pane key="optionsList">
<span slot="tab">
<a-icon type="setting" />配置
</span>
<SettingsForm />
</a-tab-pane>
</a-tabs>
</div>
</a-col>
</a-row>
</div>
</template>
<script>
import StaticPagesList from './tabs/StaticPagesList'
import DeploySettingsForm from './tabs/DeploySettingsForm'
import SettingsForm from './tabs/SettingsForm'
export default {
name: 'StaticPagesManage',
components: {
StaticPagesList,
DeploySettingsForm,
SettingsForm
}
}
</script>

View File

@ -1,106 +0,0 @@
<template>
<a-form
layout="vertical"
:wrapperCol="wrapperCol"
>
<a-form-item label="部署平台:">
<a-select v-model="options.static_deploy_type">
<a-select-option
v-for="item in Object.keys(deployType)"
:key="item"
:value="item"
>{{ deployType[item].text }}</a-select-option>
</a-select>
</a-form-item>
<div
id="gitForm"
v-show="options.static_deploy_type === 'GIT'"
>
<a-form-item label="域名:">
<a-input v-model="options.git_static_deploy_domain" />
</a-form-item>
<a-form-item label="仓库:">
<a-input v-model="options.git_static_deploy_repository" />
</a-form-item>
<a-form-item label="分支:">
<a-input v-model="options.git_static_deploy_branch" />
</a-form-item>
<a-form-item label="仓库用户名:">
<a-input v-model="options.git_static_deploy_username" />
</a-form-item>
<a-form-item label="邮箱:">
<a-input v-model="options.git_static_deploy_email" />
</a-form-item>
<a-form-item label="Token">
<a-input-password
v-model="options.git_static_deploy_token"
autocomplete="new-password"
/>
</a-form-item>
<a-form-item label="CNAME">
<a-input v-model="options.git_static_deploy_cname" />
</a-form-item>
</div>
<div
id="netlifyForm"
v-show="options.static_deploy_type === 'NETLIFY'"
>
<a-form-item label="域名:">
<a-input v-model="options.netlify_static_deploy_domain" />
</a-form-item>
<a-form-item label="Site ID">
<a-input v-model="options.netlify_static_deploy_site_id" />
</a-form-item>
<a-form-item label="Token">
<a-input-password
v-model="options.netlify_static_deploy_token"
autocomplete="new-password"
/>
</a-form-item>
</div>
<a-form-item>
<a-button
type="primary"
@click="handleSaveOptions"
>保存</a-button>
</a-form-item>
</a-form>
</template>
<script>
import staticPageApi from '@/api/staticPage'
import optionApi from '@/api/option'
import { mapActions } from 'vuex'
export default {
name: 'DeploySettingsForm',
data() {
return {
deployType: staticPageApi.deployType,
wrapperCol: {
xl: { span: 8 },
lg: { span: 8 },
sm: { span: 12 },
xs: { span: 24 }
},
options: []
}
},
mounted() {
this.loadFormOptions()
},
methods: {
...mapActions(['refreshOptionsCache']),
loadFormOptions() {
optionApi.listAll().then(response => {
this.options = response.data.data
})
},
handleSaveOptions() {
optionApi.save(this.options).then(response => {
this.loadFormOptions()
this.refreshOptionsCache()
this.$message.success('保存成功!')
})
}
}
}
</script>

View File

@ -1,10 +0,0 @@
<template>
<div>
SettingsForm
</div>
</template>
<script>
export default {
name: 'SettingsForm'
}
</script>

View File

@ -1,113 +0,0 @@
<template>
<div class="option-tab-wrapper">
<a-card
:bordered="false"
:bodyStyle="{ padding: 0 }"
>
<div class="table-operator">
<a-button
type="primary"
icon="reload"
@click="handleGenerate"
>生成</a-button>
<a-button
icon="cloud-upload"
@click="handleDeploy"
:loading="deployLoading"
:disabled="deployLoading"
>
部署
</a-button>
<a-button
icon="sync"
@click="loadStaticPageList"
:loading="loading"
:disabled="loading"
>
刷新
</a-button>
</div>
<div class="mt-4">
<a-table
:rowKey="record => record.id"
:columns="columns"
:dataSource="staticPages"
:pagination="false"
size="middle"
:loading="loading"
>
<span
slot="name"
slot-scope="name"
>
<ellipsis
:length="64"
tooltip
>
{{ name }}
</ellipsis>
</span>
</a-table>
</div>
</a-card>
</div>
</template>
<script>
import staticPageApi from '@/api/staticPage'
const columns = [
{
title: '文件名',
dataIndex: 'name',
scopedSlots: { customRender: 'name' }
}
]
export default {
name: 'StaticPagesList',
data() {
return {
columns: columns,
staticPages: [],
loading: false,
deployLoading: false
}
},
created() {
this.loadStaticPageList()
},
methods: {
loadStaticPageList() {
this.loading = true
staticPageApi.list().then(response => {
this.staticPages = response.data.data
this.loading = false
})
},
handleGenerate() {
this.loading = true
const hide = this.$message.loading('生成中...', 0)
staticPageApi
.generate()
.then(response => {
this.$message.success('生成成功!')
})
.finally(response => {
this.loadStaticPageList()
hide()
})
},
handleDeploy() {
this.deployLoading = true
const hide = this.$message.loading('部署中...', 0)
staticPageApi
.deploy()
.then(response => {
this.$message.success('部署成功!')
})
.finally(response => {
this.deployLoading = false
hide()
})
}
}
}
</script>