commit c98d2d7eb204da11c2ff470d69c68c2ebb9e56ec
Author: npmrun <62639956+npmrun@users.noreply.github.com>
Date: Fri Mar 19 17:23:55 2021 +0800
init
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4f2b732
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+.idea
+.vscode
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..030a6ff
--- /dev/null
+++ b/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..5eeeb6f
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,670 @@
+{
+ "name": "vite-project",
+ "version": "0.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
+ },
+ "@babel/parser": {
+ "version": "7.13.11",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz",
+ "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q=="
+ },
+ "@babel/types": {
+ "version": "7.13.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz",
+ "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==",
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@vitejs/plugin-vue": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.1.5.tgz",
+ "integrity": "sha512-4DV8VPYo8/OR1YsnK39QN16xhKENt2XvcmJxqfRtyz75kvbjBYh1zTSHLp7XsXqv4R2I+fOZlbEBvxosMYLcPA==",
+ "dev": true
+ },
+ "@vue/compiler-core": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.0.7.tgz",
+ "integrity": "sha512-JFohgBXoyUc3mdeI2WxlhjQZ5fakfemJkZHX8Gu/nFbEg3+lKVUZmNKWmmnp9aOzJQZKoj77LjmFxiP+P+7lMQ==",
+ "requires": {
+ "@babel/parser": "^7.12.0",
+ "@babel/types": "^7.12.0",
+ "@vue/shared": "3.0.7",
+ "estree-walker": "^2.0.1",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.0.7.tgz",
+ "integrity": "sha512-VnIH9EbWQm/Tkcp+8dCaNVsVvhm/vxCrIKWRkXY9215hTqOqQOvejT8IMjd2kc++nIsYMsdQk6H9qqBvoLe/Cw==",
+ "requires": {
+ "@vue/compiler-core": "3.0.7",
+ "@vue/shared": "3.0.7"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.0.7.tgz",
+ "integrity": "sha512-37/QILpGE+J3V+bP9Slg9e6xGqfk+MmS2Yj8ChR4fS0/qWUU/YoYHE0GPIzjmBdH0JVOOmJqunxowIXmqNiHng==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.12.0",
+ "@babel/types": "^7.12.0",
+ "@vue/compiler-core": "3.0.7",
+ "@vue/compiler-dom": "3.0.7",
+ "@vue/compiler-ssr": "3.0.7",
+ "@vue/shared": "3.0.7",
+ "consolidate": "^0.16.0",
+ "estree-walker": "^2.0.1",
+ "hash-sum": "^2.0.0",
+ "lru-cache": "^5.1.1",
+ "magic-string": "^0.25.7",
+ "merge-source-map": "^1.1.0",
+ "postcss": "^8.1.10",
+ "postcss-modules": "^4.0.0",
+ "postcss-selector-parser": "^6.0.4",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.0.7.tgz",
+ "integrity": "sha512-nHRbHeSpfXwjypettjrA16TjgfDcPEwq3m/zHnGyLC1QqdLtklXmpSM43/CPwwTCRa/qdt0pldJf22MiCEuTSQ==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-dom": "3.0.7",
+ "@vue/shared": "3.0.7"
+ }
+ },
+ "@vue/reactivity": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.0.7.tgz",
+ "integrity": "sha512-FotWcNNaKhqpFZrdgsUOZ1enlJ5lhTt01CNTtLSyK7jYFgZBTuw8vKsEutZKDYZ1XKotOfoeO8N3pZQqmM6Etw==",
+ "requires": {
+ "@vue/shared": "3.0.7"
+ }
+ },
+ "@vue/runtime-core": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.0.7.tgz",
+ "integrity": "sha512-DBAZAwVvdmMXuyd6/9qqj/kYr/GaLTmn1L2/QLxLwP+UfhIboiTSBc/tUUb8MRk7Bb98GzNeAWkkT6AfooS3dQ==",
+ "requires": {
+ "@vue/reactivity": "3.0.7",
+ "@vue/shared": "3.0.7"
+ }
+ },
+ "@vue/runtime-dom": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.0.7.tgz",
+ "integrity": "sha512-Oij4ruOtnpQpCj+/Q3JPzgpTJ1Q7+N67pA53A8KVITEtxfvKL46NN6dhAZ5NGqwX6RWZpYqWQNewITeF0pHr8g==",
+ "requires": {
+ "@vue/runtime-core": "3.0.7",
+ "@vue/shared": "3.0.7",
+ "csstype": "^2.6.8"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.0.7.tgz",
+ "integrity": "sha512-dn5FyfSc4ky424jH4FntiHno7Ss5yLkqKNmM/NXwANRnlkmqu74pnGetexDFVG5phMk9/FhwovUZCWGxsotVKg=="
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "axios": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+ "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "requires": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.1",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ }
+ },
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "consolidate": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.16.0.tgz",
+ "integrity": "sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.7.2"
+ }
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "csstype": {
+ "version": "2.6.16",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.16.tgz",
+ "integrity": "sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q=="
+ },
+ "dom7": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dom7/-/dom7-3.0.0.tgz",
+ "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+ "requires": {
+ "ssr-window": "^3.0.0-alpha.1"
+ }
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
+ },
+ "esbuild": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.2.tgz",
+ "integrity": "sha512-xE3oOILjnmN8PSjkG3lT9NBbd1DbxNqolJ5qNyrLhDWsFef3yTp/KTQz1C/x7BYFKbtrr9foYtKA6KA1zuNAUQ==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "follow-redirects": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz",
+ "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA=="
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "generic-names": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
+ "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.1.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "dev": true
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+ "dev": true
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+ "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "linkify-it": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz",
+ "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==",
+ "requires": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
+ "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
+ "dev": true,
+ "requires": {
+ "sourcemap-codec": "^1.4.4"
+ }
+ },
+ "markdown-it": {
+ "version": "12.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz",
+ "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==",
+ "requires": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ }
+ },
+ "mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+ },
+ "merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.22",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz",
+ "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+ },
+ "postcss": {
+ "version": "8.2.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz",
+ "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.20",
+ "source-map": "^0.6.1"
+ }
+ },
+ "postcss-modules": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.0.0.tgz",
+ "integrity": "sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw==",
+ "dev": true,
+ "requires": {
+ "generic-names": "^2.0.1",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "rollup": {
+ "version": "2.41.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.41.2.tgz",
+ "integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.1"
+ }
+ },
+ "sass": {
+ "version": "1.32.8",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
+ "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
+ "requires": {
+ "chokidar": ">=2.0.0 <4.0.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "dev": true
+ },
+ "ssr-window": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-3.0.0.tgz",
+ "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
+ },
+ "string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
+ "dev": true
+ },
+ "swiper": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-6.5.0.tgz",
+ "integrity": "sha512-cSx1SpfgrHlgwku++3Ce3cjPBpXgB7P+bGik5S3+F+j6ID0NUeV6qtmedFdr3C8jXR/W+TJPVNIT9fH/cwVAiA==",
+ "requires": {
+ "dom7": "^3.0.0",
+ "ssr-window": "^3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "vite": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-2.1.0.tgz",
+ "integrity": "sha512-qWYmX8slkv91C3hWA2iu0o0ZvFbO2dSfWIN4dbMfSeMdNn+XeirkGWU3dy5/W1Nv13cQZvVoMTl8zyC13VFRZQ==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.9.2",
+ "fsevents": "~2.3.1",
+ "postcss": "^8.2.1",
+ "resolve": "^1.19.0",
+ "rollup": "^2.38.5"
+ }
+ },
+ "vue": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.0.7.tgz",
+ "integrity": "sha512-8h4TikD+JabbMK9aRlBO4laG0AtNHRPHynxYgWZ9sq1YUPfzynd9Jeeb27XNyZytC7aCQRX9xe1+TQJuc181Tw==",
+ "requires": {
+ "@vue/compiler-dom": "3.0.7",
+ "@vue/runtime-dom": "3.0.7",
+ "@vue/shared": "3.0.7"
+ }
+ },
+ "vue-router": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.5.tgz",
+ "integrity": "sha512-AQq+pllb6FCc7rS6vh4PPcce3XA1jgK3hKNkQ4hXHwoVN7jOeAOMKCnX7XAX3etV9rmN7iNW8iIwgPk95ckBjw=="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..5c8b4ab
--- /dev/null
+++ b/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "vite-project",
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "serve": "vite preview"
+ },
+ "dependencies": {
+ "axios": "^0.21.1",
+ "markdown-it": "^12.0.4",
+ "sass": "^1.32.8",
+ "swiper": "^6.5.0",
+ "vue": "^3.0.5",
+ "vue-router": "^4.0.5"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^1.1.5",
+ "@vue/compiler-sfc": "^3.0.5",
+ "vite": "^2.1.0"
+ }
+}
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..df36fcf
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000..f3d2503
Binary files /dev/null and b/public/logo.png differ
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..71ed959
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..4d96c95
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,8 @@
+import {onMounted,ref} from "vue"
+import {request_} from "./request";
+
+export default {
+ bannerData: (data)=>request_("GET",'https://gank.io/api/v2/banners',data),
+ articleData: (data)=>request_("GET",'https://gank.io/api/v2/data/category/GanHuo/type/frontend/page/1/count/10',data),
+ articleDetail: (data)=>request_("GET",'https://gank.io/api/v2/post/'+data)
+}
diff --git a/src/api/request/index.js b/src/api/request/index.js
new file mode 100644
index 0000000..46ef8c8
--- /dev/null
+++ b/src/api/request/index.js
@@ -0,0 +1,50 @@
+import axios from "axios"
+
+const checkERR = (err, type) => {
+ console.log(err);
+ switch (type) {
+ case 0:
+ // 来自执行的错误
+ break;
+ case 1:
+ //来自于接口的错误
+ break;
+ }
+}
+
+// 静默执行
+export function request_(type = 'GET', url, data = {}, ContentType="application/json") {
+ var __data = {}
+ if (type.toUpperCase() == 'GET') {
+ __data.params = data
+ }
+ if (type.toUpperCase() == 'POST') {
+ __data.data = data
+ }
+ return new Promise((resolve, reject) => {
+ var reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)/;
+ var realUrl = url;
+ if (!reg.test(url)) {
+ realUrl = config.BASEURL + url;
+ }
+ axios({
+ url: realUrl,
+ method: type,
+ headers: {
+ contentType: ContentType
+ },
+ ...__data,
+ responseType: 'json'
+ }).then((res) => {
+ if (res.status == 200&&res.data&&res.data.status==100) {
+ resolve(res)
+ } else {
+ checkERR(res, 1)
+ reject(res)
+ }
+ }).catch((err) => {
+ checkERR(err, 0)
+ reject(err)
+ });
+ })
+}
diff --git a/src/assets/image/logo.png b/src/assets/image/logo.png
new file mode 100644
index 0000000..f3d2503
Binary files /dev/null and b/src/assets/image/logo.png differ
diff --git a/src/assets/script/util.js b/src/assets/script/util.js
new file mode 100644
index 0000000..457ff39
--- /dev/null
+++ b/src/assets/script/util.js
@@ -0,0 +1,15 @@
+export function useExportData() {
+ let result = {};
+ result = new Proxy(result,{
+ get(target, key) {
+ return target[key];
+ },
+ set(target, key, value, receiver) {
+ if (target[key]){
+ console.warn(target.toString()+"已存在字段"+key);
+ }
+ return Reflect.set(target, key, value);
+ }
+ })
+ return result
+}
diff --git a/src/assets/style/_global.scss b/src/assets/style/_global.scss
new file mode 100644
index 0000000..8defaef
--- /dev/null
+++ b/src/assets/style/_global.scss
@@ -0,0 +1,2 @@
+@import "./reactive.scss";
+$red: green;
diff --git a/src/assets/style/common.scss b/src/assets/style/common.scss
new file mode 100644
index 0000000..6b15b9c
--- /dev/null
+++ b/src/assets/style/common.scss
@@ -0,0 +1,45 @@
+@import "./github-markdown.scss";
+html,body{
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ font: 12px/1 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;
+}
+#app{
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.a-ov{
+ @include ellipsis()
+}
+.a-ov2{
+ @include ellipsis(2)
+}
+.a-image{
+ position: relative;
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+ img{
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ &.center{
+ width: 100%;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ }
+ &.hcenter{
+ height: 100%;
+ left: 50%;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ }
+ }
+}
+
diff --git a/src/assets/style/github-markdown.scss b/src/assets/style/github-markdown.scss
new file mode 100644
index 0000000..6362aff
--- /dev/null
+++ b/src/assets/style/github-markdown.scss
@@ -0,0 +1,985 @@
+.markdown-body .octicon {
+ display: inline-block;
+ fill: currentColor;
+ vertical-align: text-bottom;
+}
+
+.markdown-body .anchor {
+ float: left;
+ line-height: 1;
+ margin-left: -20px;
+ padding-right: 4px;
+}
+
+.markdown-body .anchor:focus {
+ outline: none;
+}
+
+.markdown-body h1 .octicon-link,
+.markdown-body h2 .octicon-link,
+.markdown-body h3 .octicon-link,
+.markdown-body h4 .octicon-link,
+.markdown-body h5 .octicon-link,
+.markdown-body h6 .octicon-link {
+ color: #1b1f23;
+ vertical-align: middle;
+ visibility: hidden;
+}
+
+.markdown-body h1:hover .anchor,
+.markdown-body h2:hover .anchor,
+.markdown-body h3:hover .anchor,
+.markdown-body h4:hover .anchor,
+.markdown-body h5:hover .anchor,
+.markdown-body h6:hover .anchor {
+ text-decoration: none;
+}
+
+.markdown-body h1:hover .anchor .octicon-link,
+.markdown-body h2:hover .anchor .octicon-link,
+.markdown-body h3:hover .anchor .octicon-link,
+.markdown-body h4:hover .anchor .octicon-link,
+.markdown-body h5:hover .anchor .octicon-link,
+.markdown-body h6:hover .anchor .octicon-link {
+ visibility: visible;
+}
+
+.markdown-body h1:hover .anchor .octicon-link:before,
+.markdown-body h2:hover .anchor .octicon-link:before,
+.markdown-body h3:hover .anchor .octicon-link:before,
+.markdown-body h4:hover .anchor .octicon-link:before,
+.markdown-body h5:hover .anchor .octicon-link:before,
+.markdown-body h6:hover .anchor .octicon-link:before {
+ width: 16px;
+ height: 16px;
+ content: ' ';
+ display: inline-block;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'%3E%3C/path%3E%3C/svg%3E");
+}.markdown-body {
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+ line-height: 1.5;
+ color: #24292e;
+ font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;
+ font-size: 16px;
+ line-height: 1.5;
+ word-wrap: break-word;
+ }
+
+.markdown-body details {
+ display: block;
+}
+
+.markdown-body summary {
+ display: list-item;
+}
+
+.markdown-body a {
+ background-color: initial;
+}
+
+.markdown-body a:active,
+.markdown-body a:hover {
+ outline-width: 0;
+}
+
+.markdown-body strong {
+ font-weight: inherit;
+ font-weight: bolder;
+}
+
+.markdown-body h1 {
+ font-size: 2em;
+ margin: .67em 0;
+}
+
+.markdown-body img {
+ border-style: none;
+}
+
+.markdown-body code,
+.markdown-body kbd,
+.markdown-body pre {
+ font-family: monospace,monospace;
+ font-size: 1em;
+}
+
+.markdown-body hr {
+ box-sizing: initial;
+ height: 0;
+ overflow: visible;
+}
+
+.markdown-body input {
+ font: inherit;
+ margin: 0;
+}
+
+.markdown-body input {
+ overflow: visible;
+}
+
+.markdown-body [type=checkbox] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+.markdown-body * {
+ box-sizing: border-box;
+}
+
+.markdown-body input {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.markdown-body a {
+ color: #0366d6;
+ text-decoration: none;
+}
+
+.markdown-body a:hover {
+ text-decoration: underline;
+}
+
+.markdown-body strong {
+ font-weight: 600;
+}
+
+.markdown-body hr {
+ height: 0;
+ margin: 15px 0;
+ overflow: hidden;
+ background: transparent;
+ border: 0;
+ border-bottom: 1px solid #dfe2e5;
+}
+
+.markdown-body hr:after,
+.markdown-body hr:before {
+ display: table;
+ content: "";
+}
+
+.markdown-body hr:after {
+ clear: both;
+}
+
+.markdown-body table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+.markdown-body td,
+.markdown-body th {
+ padding: 0;
+}
+
+.markdown-body details summary {
+ cursor: pointer;
+}
+
+.markdown-body kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ line-height: 10px;
+ color: #444d56;
+ vertical-align: middle;
+ background-color: #fafbfc;
+ border: 1px solid #d1d5da;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #d1d5da;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body h1 {
+ font-size: 32px;
+}
+
+.markdown-body h1,
+.markdown-body h2 {
+ font-weight: 600;
+}
+
+.markdown-body h2 {
+ font-size: 24px;
+}
+
+.markdown-body h3 {
+ font-size: 20px;
+}
+
+.markdown-body h3,
+.markdown-body h4 {
+ font-weight: 600;
+}
+
+.markdown-body h4 {
+ font-size: 16px;
+}
+
+.markdown-body h5 {
+ font-size: 14px;
+}
+
+.markdown-body h5,
+.markdown-body h6 {
+ font-weight: 600;
+}
+
+.markdown-body h6 {
+ font-size: 12px;
+}
+
+.markdown-body p {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+ margin: 0;
+}
+
+.markdown-body ol,
+.markdown-body ul {
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body ol ol,
+.markdown-body ul ol {
+ list-style-type: lower-roman;
+}
+
+.markdown-body ol ol ol,
+.markdown-body ol ul ol,
+.markdown-body ul ol ol,
+.markdown-body ul ul ol {
+ list-style-type: lower-alpha;
+}
+
+.markdown-body dd {
+ margin-left: 0;
+}
+
+.markdown-body code,
+.markdown-body pre {
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ font-size: 12px;
+}
+
+.markdown-body pre {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body input::-webkit-inner-spin-button,
+.markdown-body input::-webkit-outer-spin-button {
+ margin: 0;
+ -webkit-appearance: none;
+ appearance: none;
+}
+
+.markdown-body :checked+.radio-label {
+ position: relative;
+ z-index: 1;
+ border-color: #0366d6;
+}
+
+.markdown-body .border {
+ border: 1px solid #e1e4e8!important;
+}
+
+.markdown-body .border-0 {
+ border: 0!important;
+}
+
+.markdown-body .border-bottom {
+ border-bottom: 1px solid #e1e4e8!important;
+}
+
+.markdown-body .rounded-1 {
+ border-radius: 3px!important;
+}
+
+.markdown-body .bg-white {
+ background-color: #fff!important;
+}
+
+.markdown-body .bg-gray-light {
+ background-color: #fafbfc!important;
+}
+
+.markdown-body .text-gray-light {
+ color: #6a737d!important;
+}
+
+.markdown-body .mb-0 {
+ margin-bottom: 0!important;
+}
+
+.markdown-body .my-2 {
+ margin-top: 8px!important;
+ margin-bottom: 8px!important;
+}
+
+.markdown-body .pl-0 {
+ padding-left: 0!important;
+}
+
+.markdown-body .py-0 {
+ padding-top: 0!important;
+ padding-bottom: 0!important;
+}
+
+.markdown-body .pl-1 {
+ padding-left: 4px!important;
+}
+
+.markdown-body .pl-2 {
+ padding-left: 8px!important;
+}
+
+.markdown-body .py-2 {
+ padding-top: 8px!important;
+ padding-bottom: 8px!important;
+}
+
+.markdown-body .pl-3,
+.markdown-body .px-3 {
+ padding-left: 16px!important;
+}
+
+.markdown-body .px-3 {
+ padding-right: 16px!important;
+}
+
+.markdown-body .pl-4 {
+ padding-left: 24px!important;
+}
+
+.markdown-body .pl-5 {
+ padding-left: 32px!important;
+}
+
+.markdown-body .pl-6 {
+ padding-left: 40px!important;
+}
+
+.markdown-body .f6 {
+ font-size: 12px!important;
+}
+
+.markdown-body .lh-condensed {
+ line-height: 1.25!important;
+}
+
+.markdown-body .text-bold {
+ font-weight: 600!important;
+}
+
+.markdown-body .pl-c {
+ color: #6a737d;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+ color: #005cc5;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+ color: #6f42c1;
+}
+
+.markdown-body .pl-s .pl-s1,
+.markdown-body .pl-smi {
+ color: #24292e;
+}
+
+.markdown-body .pl-ent {
+ color: #22863a;
+}
+
+.markdown-body .pl-k {
+ color: #d73a49;
+}
+
+.markdown-body .pl-pds,
+.markdown-body .pl-s,
+.markdown-body .pl-s .pl-pse .pl-s1,
+.markdown-body .pl-sr,
+.markdown-body .pl-sr .pl-cce,
+.markdown-body .pl-sr .pl-sra,
+.markdown-body .pl-sr .pl-sre {
+ color: #032f62;
+}
+
+.markdown-body .pl-smw,
+.markdown-body .pl-v {
+ color: #e36209;
+}
+
+.markdown-body .pl-bu {
+ color: #b31d28;
+}
+
+.markdown-body .pl-ii {
+ color: #fafbfc;
+ background-color: #b31d28;
+}
+
+.markdown-body .pl-c2 {
+ color: #fafbfc;
+ background-color: #d73a49;
+}
+
+.markdown-body .pl-c2:before {
+ content: "^M";
+}
+
+.markdown-body .pl-sr .pl-cce {
+ font-weight: 700;
+ color: #22863a;
+}
+
+.markdown-body .pl-ml {
+ color: #735c0f;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+ font-weight: 700;
+ color: #005cc5;
+}
+
+.markdown-body .pl-mi {
+ font-style: italic;
+ color: #24292e;
+}
+
+.markdown-body .pl-mb {
+ font-weight: 700;
+ color: #24292e;
+}
+
+.markdown-body .pl-md {
+ color: #b31d28;
+ background-color: #ffeef0;
+}
+
+.markdown-body .pl-mi1 {
+ color: #22863a;
+ background-color: #f0fff4;
+}
+
+.markdown-body .pl-mc {
+ color: #e36209;
+ background-color: #ffebda;
+}
+
+.markdown-body .pl-mi2 {
+ color: #f6f8fa;
+ background-color: #005cc5;
+}
+
+.markdown-body .pl-mdr {
+ font-weight: 700;
+ color: #6f42c1;
+}
+
+.markdown-body .pl-ba {
+ color: #586069;
+}
+
+.markdown-body .pl-sg {
+ color: #959da5;
+}
+
+.markdown-body .pl-corl {
+ text-decoration: underline;
+ color: #032f62;
+}
+
+.markdown-body .mb-0 {
+ margin-bottom: 0!important;
+}
+
+.markdown-body .my-2 {
+ margin-bottom: 8px!important;
+}
+
+.markdown-body .my-2 {
+ margin-top: 8px!important;
+}
+
+.markdown-body .pl-0 {
+ padding-left: 0!important;
+}
+
+.markdown-body .py-0 {
+ padding-top: 0!important;
+ padding-bottom: 0!important;
+}
+
+.markdown-body .pl-1 {
+ padding-left: 4px!important;
+}
+
+.markdown-body .pl-2 {
+ padding-left: 8px!important;
+}
+
+.markdown-body .py-2 {
+ padding-top: 8px!important;
+ padding-bottom: 8px!important;
+}
+
+.markdown-body .pl-3 {
+ padding-left: 16px!important;
+}
+
+.markdown-body .pl-4 {
+ padding-left: 24px!important;
+}
+
+.markdown-body .pl-5 {
+ padding-left: 32px!important;
+}
+
+.markdown-body .pl-6 {
+ padding-left: 40px!important;
+}
+
+.markdown-body .pl-7 {
+ padding-left: 48px!important;
+}
+
+.markdown-body .pl-8 {
+ padding-left: 64px!important;
+}
+
+.markdown-body .pl-9 {
+ padding-left: 80px!important;
+}
+
+.markdown-body .pl-10 {
+ padding-left: 96px!important;
+}
+
+.markdown-body .pl-11 {
+ padding-left: 112px!important;
+}
+
+.markdown-body .pl-12 {
+ padding-left: 128px!important;
+}
+
+.markdown-body hr {
+ border-bottom-color: #eee;
+}
+
+.markdown-body kbd {
+ display: inline-block;
+ padding: 3px 5px;
+ font: 11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ line-height: 10px;
+ color: #444d56;
+ vertical-align: middle;
+ background-color: #fafbfc;
+ border: 1px solid #d1d5da;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 #d1d5da;
+}
+
+.markdown-body:after,
+.markdown-body:before {
+ display: table;
+ content: "";
+}
+
+.markdown-body:after {
+ clear: both;
+}
+
+.markdown-body>:first-child {
+ margin-top: 0!important;
+}
+
+.markdown-body>:last-child {
+ margin-bottom: 0!important;
+}
+
+.markdown-body a:not([href]) {
+ color: inherit;
+ text-decoration: none;
+}
+
+.markdown-body blockquote,
+.markdown-body details,
+.markdown-body dl,
+.markdown-body ol,
+.markdown-body p,
+.markdown-body pre,
+.markdown-body table,
+.markdown-body ul {
+ margin-top: 0;
+ margin-bottom: 16px;
+}
+
+.markdown-body hr {
+ height: .25em;
+ padding: 0;
+ margin: 24px 0;
+ background-color: #e1e4e8;
+ border: 0;
+}
+
+.markdown-body blockquote {
+ padding: 0 1em;
+ color: #6a737d;
+ border-left: .25em solid #dfe2e5;
+}
+
+.markdown-body blockquote>:first-child {
+ margin-top: 0;
+}
+
+.markdown-body blockquote>:last-child {
+ margin-bottom: 0;
+}
+
+.markdown-body h1,
+.markdown-body h2,
+.markdown-body h3,
+.markdown-body h4,
+.markdown-body h5,
+.markdown-body h6 {
+ margin-top: 24px;
+ margin-bottom: 16px;
+ font-weight: 600;
+ line-height: 1.25;
+}
+
+.markdown-body h1 {
+ font-size: 2em;
+}
+
+.markdown-body h1,
+.markdown-body h2 {
+ padding-bottom: .3em;
+ border-bottom: 1px solid #eaecef;
+}
+
+.markdown-body h2 {
+ font-size: 1.5em;
+}
+
+.markdown-body h3 {
+ font-size: 1.25em;
+}
+
+.markdown-body h4 {
+ font-size: 1em;
+}
+
+.markdown-body h5 {
+ font-size: .875em;
+}
+
+.markdown-body h6 {
+ font-size: .85em;
+ color: #6a737d;
+}
+
+.markdown-body ol,
+.markdown-body ul {
+ padding-left: 2em;
+}
+
+.markdown-body ol ol,
+.markdown-body ol ul,
+.markdown-body ul ol,
+.markdown-body ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.markdown-body li {
+ word-wrap: break-all;
+}
+
+.markdown-body li>p {
+ margin-top: 16px;
+}
+
+.markdown-body li+li {
+ margin-top: .25em;
+}
+
+.markdown-body dl {
+ padding: 0;
+}
+
+.markdown-body dl dt {
+ padding: 0;
+ margin-top: 16px;
+ font-size: 1em;
+ font-style: italic;
+ font-weight: 600;
+}
+
+.markdown-body dl dd {
+ padding: 0 16px;
+ margin-bottom: 16px;
+}
+
+.markdown-body table {
+ display: block;
+ width: 100%;
+ overflow: auto;
+}
+
+.markdown-body table th {
+ font-weight: 600;
+}
+
+.markdown-body table td,
+.markdown-body table th {
+ padding: 6px 13px;
+ border: 1px solid #dfe2e5;
+}
+
+.markdown-body table tr {
+ background-color: #fff;
+ border-top: 1px solid #c6cbd1;
+}
+
+.markdown-body table tr:nth-child(2n) {
+ background-color: #f6f8fa;
+}
+
+.markdown-body img {
+ max-width: 100%;
+ box-sizing: initial;
+ background-color: #fff;
+}
+
+.markdown-body img[align=right] {
+ padding-left: 20px;
+}
+
+.markdown-body img[align=left] {
+ padding-right: 20px;
+}
+
+.markdown-body code {
+ padding: .2em .4em;
+ margin: 0;
+ font-size: 85%;
+ background-color: rgba(27,31,35,.05);
+ border-radius: 3px;
+}
+
+.markdown-body pre {
+ word-wrap: normal;
+}
+
+.markdown-body pre>code {
+ padding: 0;
+ margin: 0;
+ font-size: 100%;
+ word-break: normal;
+ white-space: pre;
+ background: transparent;
+ border: 0;
+}
+
+.markdown-body .highlight {
+ margin-bottom: 16px;
+}
+
+.markdown-body .highlight pre {
+ margin-bottom: 0;
+ word-break: normal;
+}
+
+.markdown-body .highlight pre,
+.markdown-body pre {
+ padding: 16px;
+ overflow: auto;
+ font-size: 85%;
+ line-height: 1.45;
+ background-color: #f6f8fa;
+ border-radius: 3px;
+}
+
+.markdown-body pre code {
+ display: inline;
+ max-width: auto;
+ padding: 0;
+ margin: 0;
+ overflow: visible;
+ line-height: inherit;
+ word-wrap: normal;
+ background-color: initial;
+ border: 0;
+}
+
+.markdown-body .commit-tease-sha {
+ display: inline-block;
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ font-size: 90%;
+ color: #444d56;
+}
+
+.markdown-body .full-commit .btn-outline:not(:disabled):hover {
+ color: #005cc5;
+ border-color: #005cc5;
+}
+
+.markdown-body .blob-wrapper {
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.markdown-body .blob-wrapper-embedded {
+ max-height: 240px;
+ overflow-y: auto;
+}
+
+.markdown-body .blob-num {
+ width: 1%;
+ min-width: 50px;
+ padding-right: 10px;
+ padding-left: 10px;
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ font-size: 12px;
+ line-height: 20px;
+ color: rgba(27,31,35,.3);
+ text-align: right;
+ white-space: nowrap;
+ vertical-align: top;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.markdown-body .blob-num:hover {
+ color: rgba(27,31,35,.6);
+}
+
+.markdown-body .blob-num:before {
+ content: attr(data-line-number);
+}
+
+.markdown-body .blob-code {
+ position: relative;
+ padding-right: 10px;
+ padding-left: 10px;
+ line-height: 20px;
+ vertical-align: top;
+}
+
+.markdown-body .blob-code-inner {
+ overflow: visible;
+ font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
+ font-size: 12px;
+ color: #24292e;
+ word-wrap: normal;
+ white-space: pre;
+}
+
+.markdown-body .pl-token.active,
+.markdown-body .pl-token:hover {
+ cursor: pointer;
+ background: #ffea7f;
+}
+
+.markdown-body .tab-size[data-tab-size="1"] {
+ -moz-tab-size: 1;
+ tab-size: 1;
+}
+
+.markdown-body .tab-size[data-tab-size="2"] {
+ -moz-tab-size: 2;
+ tab-size: 2;
+}
+
+.markdown-body .tab-size[data-tab-size="3"] {
+ -moz-tab-size: 3;
+ tab-size: 3;
+}
+
+.markdown-body .tab-size[data-tab-size="4"] {
+ -moz-tab-size: 4;
+ tab-size: 4;
+}
+
+.markdown-body .tab-size[data-tab-size="5"] {
+ -moz-tab-size: 5;
+ tab-size: 5;
+}
+
+.markdown-body .tab-size[data-tab-size="6"] {
+ -moz-tab-size: 6;
+ tab-size: 6;
+}
+
+.markdown-body .tab-size[data-tab-size="7"] {
+ -moz-tab-size: 7;
+ tab-size: 7;
+}
+
+.markdown-body .tab-size[data-tab-size="8"] {
+ -moz-tab-size: 8;
+ tab-size: 8;
+}
+
+.markdown-body .tab-size[data-tab-size="9"] {
+ -moz-tab-size: 9;
+ tab-size: 9;
+}
+
+.markdown-body .tab-size[data-tab-size="10"] {
+ -moz-tab-size: 10;
+ tab-size: 10;
+}
+
+.markdown-body .tab-size[data-tab-size="11"] {
+ -moz-tab-size: 11;
+ tab-size: 11;
+}
+
+.markdown-body .tab-size[data-tab-size="12"] {
+ -moz-tab-size: 12;
+ tab-size: 12;
+}
+
+.markdown-body .task-list-item {
+ list-style-type: none;
+}
+
+.markdown-body .task-list-item+.task-list-item {
+ margin-top: 3px;
+}
+
+.markdown-body .task-list-item input {
+ margin: 0 .2em .25em -1.6em;
+ vertical-align: middle;
+}
diff --git a/src/assets/style/reactive.scss b/src/assets/style/reactive.scss
new file mode 100644
index 0000000..e4a152f
--- /dev/null
+++ b/src/assets/style/reactive.scss
@@ -0,0 +1,403 @@
+//
+/*
+* 主题变量
+*/
+
+
+/*
+* 内部通用scss
+*/
+
+
+@mixin clearfix {
+ &:after {
+ clear: both;
+ content: '.';
+ display: block;
+ height: 0;
+ line-height: 0;
+ overflow: hidden;
+ }
+ *height: 1%;
+}
+
+
+@mixin hairline {
+ &::after {
+ content: " ";
+ box-sizing: border-box;
+ pointer-events: none;
+ border: 0 solid #ebedf0;
+ position: absolute;
+ top: -50%;
+ right: -50%;
+ bottom: -50%;
+ left: -50%;
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ @content
+ }
+};
+@mixin hairline--all {
+ @include hairline{
+ border-width: 1px;
+ };
+}
+@mixin hairline--right {
+ @include hairline{
+ border-right-width: 1px;
+ };
+}
+@mixin hairline--left {
+ @include hairline{
+ border-left-width: 1px;
+ };
+}
+@mixin hairline--bottom {
+ @include hairline{
+ border-bottom-width: 1px;
+ };
+}
+
+@mixin hairline--top {
+ @include hairline{
+ border-top-width: 1px;
+ };
+}
+
+//一行溢出
+@mixin text-overflow{
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ word-break: break-all;
+};
+
+//两行溢出
+@mixin text-overflow($num: 2){
+ text-overflow: -o-ellipsis-lastline;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: $num;
+ line-clamp: $num;
+ -webkit-box-orient: vertical;
+}
+
+@mixin ellipsis($lines: 1) {
+ @if ($lines==1) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ } @else {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: $lines;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-all;
+ }
+}
+
+
+/*
+* 媒体查询
+*/
+// 只针对自己的屏幕
+@mixin media($type...) {
+ @each $screen in $type {
+ @if $screen == xs {
+ @media (max-width: 767.9999px) {
+ @content;
+ }
+ } @else if $screen == sm {
+ @media (min-width: 768px) and (max-width: 991.9999px) {
+ @content;
+ }
+ } @else if $screen == md {
+ @media (min-width: 992px) and (max-width: 1199.9999px) {
+ @content;
+ }
+ } @else if $screen == lg {
+ @media (min-width: 1200px) {
+ @content;
+ }
+ }
+ }
+}
+// 优先 PC 端
+@mixin media-pc($type...) {
+ @each $screen in $type {
+ @if $screen == xs {
+ @media (max-width: 768px) {
+ @content;
+ }
+ } @else if $screen == sm {
+ @media (max-width: 920px) {
+ @content;
+ }
+ } @else if $screen == md {
+ @media (max-width: 1200px) {
+ @content;
+ }
+ } @else if $screen == lg {
+ @media (max-width: 1366px) {
+ @content;
+ }
+ }
+ }
+}
+// 优先移动端
+@mixin media-mobile($type...) {
+ @each $screen in $type {
+ @if $screen == xs {
+ @media (min-width: 768px) {
+ @content;
+ }
+ } @else if $screen == sm {
+ @media (min-width: 920px) {
+ @content;
+ }
+ } @else if $screen == md {
+ @media (min-width: 1200px) {
+ @content;
+ }
+ } @else if $screen == lg {
+ @media (min-width: 1366px) {
+ @content;
+ }
+ }
+ }
+}
+
+// 通用手机屏幕
+$phone: 47em;
+
+// iphone4
+$iphone4-w: 320px;
+$iphone4-h: 480px;
+
+// iphone5
+$iphone5-w: 320px;
+$iphone5-h: 568px;
+
+// iphone6
+$iphone6-w: 375px;
+$iphone6-h: 667px;
+
+// plus
+$plus-w: 414px;
+$plus-h: 736px;
+
+// ipad = 768~1360px
+$ipad-min: 47.063em;
+$ipad-max: 85em;
+
+// 笔记本 = 1360~1600px
+$s-pc-min: 85.063em;
+$s-pc-max: 100em;
+
+// 笔记本~1080p显示器 = 1600~1920px
+$l-pc-min: 100.063em;
+$l-pc-max: 120em;
+
+// 高分屏显示器 > 1920px
+$xl-pc: 120.063em;
+
+
+@mixin zsy($devices){
+ @if $devices == phone{
+ @media only screen and (max-width: $phone){
+ @content;
+ }
+ }
+ @else if $devices == iphone4{
+ @media only screen and (device-width: $iphone4-w) and (device-height: $iphone4-h) and (-webkit-min-device-pixel-ratio: 2){
+ @content;
+ }
+ }
+ @else if $devices == iphone5{
+ @media only screen and (device-width: $iphone5-w) and (device-height: $iphone5-h) and (-webkit-min-device-pixel-ratio: 2){
+ @content;
+ }
+ }
+ @else if $devices == iphone6{
+ @media only screen and (device-width: $iphone6-w) and (device-height: $iphone6-h) and (-webkit-min-device-pixel-ratio: 2){
+ @content;
+ }
+ }
+ @else if $devices == plus{
+ @media only screen and (device-width: $plus-w) and (device-height: $plus-h) and (-webkit-min-device-pixel-ratio: 2){
+ @content;
+ }
+ }
+ @else if $devices == ipad{
+ @media only screen and (min-width: $ipad-min) and (max-width: $ipad-max){
+ @content;
+ }
+ }
+ @else if $devices == s-pc{
+ @media only screen and (min-width: $s-pc-min) and (max-width: $s-pc-max){
+ @content;
+ }
+ }
+ @else if $devices == l-pc{
+ @media only screen and (min-width: $l-pc-min) and (max-width: $l-pc-max){
+ @content;
+ }
+ }
+ @else if $devices == xl-pc{
+ @media only screen and (min-width: $xl-pc){
+ @content;
+ }
+ }
+}
+
+
+
+/**
+https://v3.bootcss.com/css/#helper-classes-center
+ */
+$hide-array: hidden-xs, hidden-sm, hidden-md, hidden-lg;
+@each $c in $hide-array {
+ $i: index($hide-array, $c);
+ .#{$c} { // SCSS 循环是从 1 开始,不是 0 哦~
+ display: block;
+ }
+}
+
+$visible-array: visible-xs, visible-sm, visible-md, visible-lg;
+@each $c in $visible-array {
+ $i: index($visible-array, $c);
+ .#{$c} { // SCSS 循环是从 1 开始,不是 0 哦~
+ display: none;
+ }
+}
+
+@include media(xs) {
+ .visible-xs {
+ display: block !important;
+ }
+ .hidden-xs {
+ display: none !important;
+ }
+}
+
+@include media(sm) {
+ .visible-sm {
+ display: block !important;
+ }
+ .hidden-sm {
+ display: none !important;
+ }
+}
+
+@include media(md) {
+ .visible-md {
+ display: block !important;
+ }
+ .hidden-md {
+ display: none !important;
+ }
+}
+
+@include media(lg) {
+ .visible-lg {
+ display: block !important;
+ }
+ .hidden-lg {
+ display: none !important;
+ }
+}
+
+
+@function col-width($col:1, $total:24) {
+ @return percentage($col/$total);
+}
+
+/**
+ 将一行分为12格
+ 以高像素媒体查询为主
+ */
+.row {
+ @include clearfix;
+ @include media(xs) {
+ @for $i from 1 through 12 {
+ .col-xs-#{$i} {
+ float: left;
+ }
+ .col-xs-#{$i} {
+ width: col-width($i);
+ }
+ }
+ }
+ @include media(sm) {
+ @for $i from 1 through 12 {
+ .col-sm-#{$i} {
+ float: left;
+ }
+ .col-sm-#{$i} {
+ width: col-width($i);
+ }
+ }
+ }
+ @include media(md) {
+ @for $i from 1 through 12 {
+ .col-md-#{$i} {
+ float: left;
+ }
+ .col-md-#{$i} {
+ width: col-width($i);
+ }
+ }
+ }
+ @include media(lg) {
+ @for $i from 1 through 12 {
+ .col-lg-#{$i} {
+ float: left;
+ }
+ .col-lg-#{$i} {
+ width: col-width($i);
+ }
+ }
+ }
+}
+
+//.row {
+// display: flex;
+// flex-wrap: wrap;
+// @media (max-width: 768px) {
+// @for $i from 1 through 12 {
+// .col-xs-#{$i} {
+// width: col-width($i);
+// }
+// }
+// }
+// @media (min-width: 768px) and (max-width: 992px) {
+// @for $i from 1 through 12 {
+// .col-sm-#{$i} {
+// width: col-width($i);
+// }
+// }
+// }
+// @media (min-width: 992px) and (max-width: 1200px) {
+// @for $i from 1 through 12 {
+// .col-md-#{$i} {
+// width: col-width($i);
+// }
+// }
+// }
+// @media (min-width: 1200px) {
+// @for $i from 1 through 12 {
+// .col-lg-#{$i} {
+// width: col-width($i);
+// }
+// }
+// }
+//}
+
+//
+
+// *{
+// user-select: none;
+// }
diff --git a/src/components/Header.vue b/src/components/Header.vue
new file mode 100644
index 0000000..7998fef
--- /dev/null
+++ b/src/components/Header.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue
new file mode 100644
index 0000000..e4f6590
--- /dev/null
+++ b/src/components/HelloWorld.vue
@@ -0,0 +1,30 @@
+
+ {{ msg }}
+
+
+ Vite Documentation |
+ Vue 3 Documentation
+
+
+
+
+ Edit
+ components/HelloWorld.vue
to test hot module replacement.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Image.vue b/src/components/Image.vue
new file mode 100644
index 0000000..1edc2fe
--- /dev/null
+++ b/src/components/Image.vue
@@ -0,0 +1,49 @@
+
+
+
![]()
+
+
+
+
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..165e101
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,11 @@
+import {createApp} from 'vue'
+import router from "./router/index"
+import App from './App.vue'
+import Header from "@/components/Header.vue"
+import Image from "@/components/Image.vue"
+
+const app = createApp(App);
+app.use(router);
+app.mount('#app')
+app.component("Header",Header)
+app.component("Image",Image)
diff --git a/src/mock/index.js b/src/mock/index.js
new file mode 100644
index 0000000..7ab2aa7
--- /dev/null
+++ b/src/mock/index.js
@@ -0,0 +1,139 @@
+export default {
+ homeData(){
+ return new Promise((resolve => {
+ setTimeout(()=>{
+ resolve({
+ code: 200,
+ data:[
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者弹性裤子",
+ price: 5,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者垫子",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ },
+ {
+ pic: 'https://scpic.chinaz.net/files/pic/pic9/202103/hpic3688.jpg',
+ title: "神秘的瑜伽舞者棉衣",
+ price: 100,
+ originprice: 998
+ }
+ ]
+ })
+ },1500)
+ }))
+ }
+}
diff --git a/src/pages/About/About.vue b/src/pages/About/About.vue
new file mode 100644
index 0000000..1fadd0d
--- /dev/null
+++ b/src/pages/About/About.vue
@@ -0,0 +1,31 @@
+
+
+
+
该项目用于学习vue3,如有冒犯,敬请见谅。
+
+
+
+
+
diff --git a/src/pages/Detail/Detail.vue b/src/pages/Detail/Detail.vue
new file mode 100644
index 0000000..fa776cc
--- /dev/null
+++ b/src/pages/Detail/Detail.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/src/pages/Home/Home.scss b/src/pages/Home/Home.scss
new file mode 100644
index 0000000..63ecae4
--- /dev/null
+++ b/src/pages/Home/Home.scss
@@ -0,0 +1,100 @@
+.page.home{
+ height: 100%;
+ background-color: #f5f5f5;
+ display: flex;
+ flex-direction: column;
+
+ .banner {
+ height: 150px;
+ width: 100%;
+ .banner-item{
+ position: relative;
+ width: 100%;
+ height: 100%;
+ .banner-text{
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 20px;
+ line-height: 20px;
+ padding: 0 10px;
+ background-color: rgba(255, 255, 255, 0.54);
+ }
+ }
+ }
+
+ .list{
+ flex: 1;
+ height: 0;
+ overflow-y: auto;
+ .list-wrapper{
+ padding-bottom: 10px;
+ .list-refresh{
+ position: absolute;
+ top: -100%;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ .list-refresh-content{
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ min-height: 30px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ padding: 10px 0;
+ text-align: center;
+ }
+ }
+ }
+ .item{
+ display: flex;
+ padding: 0 10px;
+ margin-top: 10px;
+ &:first-child{
+ margin-top: 0;
+ }
+ .item-left{
+ width: 100px;
+ height: 100px;
+ }
+ .item-right{
+ margin-left: 10px;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ position: relative;
+ .item-btn{
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ background-color: orange;
+ padding: 5px 6px;
+ color: white;
+ border-radius: 5px;
+ }
+ .item-title{
+ font-weight: bold;
+ font-size: 20px;
+ }
+ .item-bottom{
+ line-height: 1.2;
+ .item-price__real{
+ font-size: 20px;
+ color: red;
+ }
+ .item-price__normal{
+ font-size: 15px;
+ color: grey;
+ text-decoration: line-through;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/pages/Home/Home.vue b/src/pages/Home/Home.vue
new file mode 100644
index 0000000..2d3a936
--- /dev/null
+++ b/src/pages/Home/Home.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+ {{isRefresh==0?'下拉刷新':isRefresh==1?'松开刷新':isRefresh==2?'正在刷新':'刷新完成'}}
+
+
+
+
+
+
+
+
+ {{item.desc}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/plugins/pulldown.js b/src/plugins/pulldown.js
new file mode 100644
index 0000000..c7d5fb5
--- /dev/null
+++ b/src/plugins/pulldown.js
@@ -0,0 +1,158 @@
+import {onMounted, ref} from "vue";
+
+export function OnRefresh(hookEvent) {
+
+}
+
+export function OnLoadMore(hookEvent) {
+
+}
+
+export default function (el) {
+ let exportData = {}
+ let ELoading = {
+ NORMAL: 0,
+ LOADING: 1,
+ END: 2,
+ }
+ let ERefresh = {
+ NORMAL: 0,
+ PRELOADING: 1,
+ LOADING: 2,
+ END: 3,
+ }
+ let isRefresh = ref(ERefresh.NORMAL)
+ let isLoading = ref(ELoading.NORMAL)
+ exportData.isRefresh = isRefresh;
+ exportData.isLoading = isLoading;
+
+ let refreshArray = [];
+ exportData.RefreshEvent = (hook) => {
+ refreshArray.push(hook)
+ }
+
+ let loadMoreArray = [];
+ exportData.LoadMoreEvent = (hook) => {
+ loadMoreArray.push(hook)
+ }
+
+ let list = null
+
+ function Refreshing(needAnim) {
+ if (!list) {
+ return
+ }
+ isRefresh.value = ERefresh.LOADING
+ if (needAnim) {
+ list.style.transition = `transform .4s ease`;
+ }
+ list.style.transform = `translateY(${50}px)`;
+ let done = ()=>{
+ isRefresh.value = ERefresh.END
+ setTimeout(() => {
+ list.style.transform = `translateY(${0}px)`;
+ setTimeout(() => {
+ isRefresh.value = ERefresh.NORMAL
+ }, 400)
+ }, 200)
+ }
+ refreshArray.forEach(v => v(done))
+ }
+
+ function LoadMoreing() {
+ isLoading.value = ELoading.LOADING
+ let done = ()=>{
+ isLoading.value = ELoading.END
+ }
+ //上拉加载
+ loadMoreArray.forEach(v => v(done))
+ }
+
+ exportData.Refreshing = (type, needAnim) => {
+ setTimeout(() => {
+ if (type == undefined) {
+ Refreshing()
+ }
+ if (type) {
+ Refreshing(needAnim)
+ }
+ if (!type) {
+ LoadMoreing(needAnim)
+ }
+ },0)
+ }
+
+
+ onMounted(() => {
+ list = document.querySelector(el)
+ let startY = 0;
+ let isMove = false;
+ let zu = .2
+ let pageHeight = window.innerHeight; // 屏幕高度
+ let moreHeight = 50;
+ let parentNode = list.parentNode
+ let recordPoint = true // 是否可以记录起始点(下拉加载用)
+ let canRefresh = true // 是否可以刷新(下拉加载用)
+ let canLoading = true //
+ let lastScrollTop = 0
+ parentNode.addEventListener("scroll", (e) => {
+ let listHeight = list.offsetHeight; // 列表高度
+ let top = parentNode.scrollTop;
+ if (top <= 50) {
+ //下拉刷新
+ canRefresh = true
+ recordPoint = true
+ } else {
+ canRefresh = false
+ }
+ if (top - lastScrollTop > 0 && listHeight - (top + pageHeight) <= moreHeight && isLoading.value != ELoading.LOADING) {
+ LoadMoreing()
+ }
+ lastScrollTop = top
+ })
+ list.addEventListener("touchstart", (e) => {
+ isMove = true
+ })
+ list.addEventListener("touchmove", (e) => {
+ if (!isMove || !canRefresh ||
+ (isRefresh.value != ERefresh.NORMAL
+ && isRefresh.value != ERefresh.PRELOADING
+ && isRefresh.value != ERefresh.END)
+ ) {
+ return
+ }
+ let touch = e.touches[0];
+ if (recordPoint) {
+ startY = touch.clientY;
+ recordPoint = false
+ }
+ let y = (touch.clientY - startY) * zu;
+ if (y > 0) {
+ list.style.transform = `translateY(${y}px)`
+ list.style.transition = ''
+ if (y > 70) {
+ isRefresh.value = ERefresh.PRELOADING
+ } else {
+ isRefresh.value = ERefresh.NORMAL
+ }
+ }
+ })
+
+ list.addEventListener("touchend", (e) => {
+ isMove = false
+ recordPoint = true
+ if (isRefresh.value == ERefresh.LOADING) {
+ return
+ }
+ list.style.transition = `transform .4s ease`;
+ if (isRefresh.value == ERefresh.PRELOADING) {
+ Refreshing()
+ } else {
+ isRefresh.value = ERefresh.NORMAL
+ list.style.transform = `translateY(${0})`;
+ }
+ })
+
+ })
+ return exportData
+}
diff --git a/src/router/index.js b/src/router/index.js
new file mode 100644
index 0000000..d5b5863
--- /dev/null
+++ b/src/router/index.js
@@ -0,0 +1,62 @@
+import * as VueRouter from "vue-router"
+
+/**
+const routes = [
+ {
+ path: '/',
+ redirect: '/home',
+ },
+ {
+ path: '/home',
+ component: () => import("@/pages/home"),
+ },
+ {
+ path: '/about',
+ component: () => import("@/pages/about"),
+ }
+ ]
+ *
+ * */
+
+const routes = [
+ // 不能缺少.vue,因为没有指定extensions字段
+ {
+ path: '/',
+ alias: '/home',
+ component: () => import("@/pages/Home/Home.vue"),
+ meta:{
+ alive: true,
+ title: '干货集中营'
+ }
+ },
+ {
+ path: '/detail',
+ component: () => import("@/pages/Detail/Detail.vue"),
+ meta:{
+ alive: true
+ }
+ },
+ {
+ path: '/about',
+ component: () => import("@/pages/About/About.vue"),
+ meta:{
+ alive: true ,
+ title: '关于我们'
+ }
+ }
+]
+
+
+const router = VueRouter.createRouter({
+ history: VueRouter.createWebHashHistory(),
+ routes,
+ scrollBehavior(to, from, savedPosition) {
+ if (savedPosition) {
+ return savedPosition
+ } else {
+ return { top: 0 }
+ }
+ },
+});
+
+export default router;
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..ffa7757
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,20 @@
+import {defineConfig} from 'vite'
+import vue from '@vitejs/plugin-vue'
+import path from "path"
+// https://vitejs.dev/config/
+export default defineConfig({
+ resolve: {
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'],
+ alias: {
+ "@": path.resolve("./src")
+ }
+ },
+ css: {
+ preprocessorOptions: {
+ scss: {
+ additionalData: `@import '@/assets/style/_global.scss';\n`
+ }
+ }
+ },
+ plugins: [vue()]
+})