From ecd9eca8d07b73a80da797f5a6ce2a584ae71a2a Mon Sep 17 00:00:00 2001
From: lgyg <1370861456@qq.com>
Date: Thu, 24 Aug 2023 22:33:07 +0800
Subject: [PATCH] new
---
package-lock.json | 1152 +++++++++++++++--
package.json | 8 +-
src/App.vue | 135 +-
src/api/index.js | 69 +
src/api/jwt.js | 57 +
src/api/luch-request/adapters/index.js | 99 ++
.../luch-request/core/InterceptorManager.js | 51 +
src/api/luch-request/core/Request.js | 199 +++
src/api/luch-request/core/buildFullPath.js | 20 +
src/api/luch-request/core/defaults.js | 30 +
src/api/luch-request/core/dispatchRequest.js | 6 +
src/api/luch-request/core/mergeConfig.js | 103 ++
src/api/luch-request/core/settle.js | 16 +
src/api/luch-request/helpers/buildURL.js | 69 +
src/api/luch-request/helpers/combineURLs.js | 14 +
src/api/luch-request/helpers/isAbsoluteURL.js | 14 +
src/api/luch-request/index.d.ts | 116 ++
src/api/luch-request/index.js | 2 +
src/api/luch-request/utils.js | 135 ++
src/com/subscribeTmplIds.js | 3 +
src/com/utils.js | 462 +++++++
src/main.js | 8 +-
src/pages.json | 62 +-
src/pages/index/index.vue | 7 +-
src/pages/login/login.vue | 218 ++++
src/pages/user/password-edit.vue | 67 +
src/pages/user/user.vue | 305 +++++
src/static/head.png | Bin 0 -> 162055 bytes
src/static/img/my_arrow_right.png | Bin 0 -> 220 bytes
src/static/logo.png | Bin 4023 -> 0 bytes
src/static/tab/tab_home.png | Bin 0 -> 4080 bytes
src/static/tab/tab_home_h.png | Bin 0 -> 4315 bytes
src/static/tab/tab_user.png | Bin 0 -> 3249 bytes
src/static/tab/tab_user_h.png | Bin 0 -> 3417 bytes
src/store/actions.js | 16 +
src/store/getters.js | 4 +
src/store/index.js | 30 +
src/store/mutation-types.js | 5 +
src/store/mutations.js | 14 +
src/store/state.js | 7 +
src/uni.scss | 2 +-
41 files changed, 3393 insertions(+), 112 deletions(-)
create mode 100644 src/api/index.js
create mode 100644 src/api/jwt.js
create mode 100644 src/api/luch-request/adapters/index.js
create mode 100644 src/api/luch-request/core/InterceptorManager.js
create mode 100644 src/api/luch-request/core/Request.js
create mode 100644 src/api/luch-request/core/buildFullPath.js
create mode 100644 src/api/luch-request/core/defaults.js
create mode 100644 src/api/luch-request/core/dispatchRequest.js
create mode 100644 src/api/luch-request/core/mergeConfig.js
create mode 100644 src/api/luch-request/core/settle.js
create mode 100644 src/api/luch-request/helpers/buildURL.js
create mode 100644 src/api/luch-request/helpers/combineURLs.js
create mode 100644 src/api/luch-request/helpers/isAbsoluteURL.js
create mode 100644 src/api/luch-request/index.d.ts
create mode 100644 src/api/luch-request/index.js
create mode 100644 src/api/luch-request/utils.js
create mode 100644 src/com/subscribeTmplIds.js
create mode 100644 src/com/utils.js
create mode 100644 src/pages/login/login.vue
create mode 100644 src/pages/user/password-edit.vue
create mode 100644 src/pages/user/user.vue
create mode 100644 src/static/head.png
create mode 100644 src/static/img/my_arrow_right.png
delete mode 100644 src/static/logo.png
create mode 100644 src/static/tab/tab_home.png
create mode 100644 src/static/tab/tab_home_h.png
create mode 100644 src/static/tab/tab_user.png
create mode 100644 src/static/tab/tab_user_h.png
create mode 100644 src/store/actions.js
create mode 100644 src/store/getters.js
create mode 100644 src/store/index.js
create mode 100644 src/store/mutation-types.js
create mode 100644 src/store/mutations.js
create mode 100644 src/store/state.js
diff --git a/package-lock.json b/package-lock.json
index 9c990c3..dba791a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3389,12 +3389,76 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
+ "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.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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
+ },
"hash-sum": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
"integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
"dev": true
},
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "optional": true
+ },
+ "loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
"ssri": {
"version": "8.0.1",
"resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
@@ -3403,6 +3467,28 @@
"requires": {
"minipass": "^3.1.1"
}
+ },
+ "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-loader-v16": {
+ "version": "npm:vue-loader@16.8.3",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
+ "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "hash-sum": "^2.0.0",
+ "loader-utils": "^2.0.0"
+ }
}
}
},
@@ -3706,6 +3792,12 @@
"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
"dev": true
},
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
"accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
@@ -3813,6 +3905,12 @@
"integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==",
"dev": true
},
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
+ "dev": true
+ },
"ansi-colors": {
"version": "3.2.4",
"resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz",
@@ -3881,6 +3979,16 @@
"integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
"dev": true
},
+ "are-we-there-yet": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+ "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
+ "dev": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz",
@@ -3921,6 +4029,12 @@
"integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==",
"dev": true
},
+ "array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
+ "dev": true
+ },
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -4067,6 +4181,12 @@
"resolved": "https://registry.npmmirror.com/async-each/-/async-each-1.0.6.tgz",
"integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg=="
},
+ "async-foreach": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmmirror.com/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==",
+ "dev": true
+ },
"async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz",
@@ -4461,11 +4581,29 @@
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"optional": true
},
+ "bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "optional": true,
+ "requires": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
"blob": {
"version": "0.0.5",
"resolved": "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz",
"integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
},
+ "block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmmirror.com/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.0"
+ }
+ },
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
@@ -4886,6 +5024,24 @@
"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
"dev": true
},
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==",
+ "dev": true
+ }
+ }
+ },
"caniuse-api": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
@@ -5248,6 +5404,12 @@
"q": "^1.1.2"
}
},
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==",
+ "dev": true
+ },
"collect-v8-coverage": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
@@ -5409,6 +5571,12 @@
"resolved": "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz",
"integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
},
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "dev": true
+ },
"consolidate": {
"version": "0.15.1",
"resolved": "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz",
@@ -5875,6 +6043,15 @@
}
}
},
+ "css-parse": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz",
+ "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==",
+ "dev": true,
+ "requires": {
+ "css": "^2.0.0"
+ }
+ },
"css-select": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz",
@@ -6047,6 +6224,15 @@
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz",
"integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
},
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
+ "dev": true,
+ "requires": {
+ "array-find-index": "^1.0.1"
+ }
+ },
"cyclist": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.2.tgz",
@@ -7320,6 +7506,12 @@
"schema-utils": "^2.5.0"
}
},
+ "file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "optional": true
+ },
"filesize": {
"version": "3.6.1",
"resolved": "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz",
@@ -7515,6 +7707,18 @@
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"optional": true
},
+ "fstream": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz",
+ "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ }
+ },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
@@ -7538,6 +7742,68 @@
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true
},
+ "gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmmirror.com/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ }
+ }
+ },
+ "gaze": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+ "dev": true,
+ "requires": {
+ "globule": "^1.0.0"
+ }
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -7566,6 +7832,12 @@
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true
},
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==",
+ "dev": true
+ },
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz",
@@ -7687,6 +7959,42 @@
}
}
},
+ "globule": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/globule/-/globule-1.3.4.tgz",
+ "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==",
+ "dev": true,
+ "requires": {
+ "glob": "~7.1.1",
+ "lodash": "^4.17.21",
+ "minimatch": "~3.0.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ }
+ }
+ },
"gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
@@ -7754,6 +8062,23 @@
"function-bind": "^1.1.1"
}
},
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ }
+ }
+ },
"has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -7812,6 +8137,12 @@
"has-symbols": "^1.0.2"
}
},
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "dev": true
+ },
"has-value": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz",
@@ -8393,6 +8724,21 @@
"resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
},
+ "in-publish": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/in-publish/-/in-publish-2.0.1.tgz",
+ "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
"indexes-of": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz",
@@ -8688,6 +9034,12 @@
"resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
},
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -8866,6 +9218,12 @@
"resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
},
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
+ "dev": true
+ },
"is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz",
@@ -10551,6 +10909,12 @@
}
}
},
+ "js-base64": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz",
+ "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
+ "dev": true
+ },
"js-message": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz",
@@ -10757,6 +11121,12 @@
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"dev": true
},
+ "klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "dev": true
+ },
"koa": {
"version": "2.14.2",
"resolved": "https://registry.npmmirror.com/koa/-/koa-2.14.2.tgz",
@@ -11073,6 +11443,39 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ }
+ }
+ },
"loader-runner": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz",
@@ -11101,6 +11504,12 @@
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
+ "dev": true
+ },
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -11172,6 +11581,16 @@
"@sinonjs/commons": "^1.7.0"
}
},
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ }
+ },
"lower-case": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz",
@@ -11222,6 +11641,12 @@
"resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz",
"integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="
},
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true
+ },
"map-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz",
@@ -11276,6 +11701,77 @@
"readable-stream": "^2.0.1"
}
},
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmmirror.com/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==",
+ "dev": true,
+ "requires": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ }
+ }
+ },
"merge": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/merge/-/merge-2.1.1.tgz",
@@ -11601,6 +12097,11 @@
"thenify-all": "^1.0.0"
}
},
+ "nan": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
+ "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ=="
+ },
"nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz",
@@ -11661,6 +12162,34 @@
"integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
"dev": true
},
+ "node-gyp": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmmirror.com/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+ "dev": true,
+ "requires": {
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "^2.87.0",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==",
+ "dev": true
+ }
+ }
+ },
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz",
@@ -11742,6 +12271,92 @@
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz",
"integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
},
+ "node-sass": {
+ "version": "4.14.1",
+ "resolved": "https://registry.npmmirror.com/node-sass/-/node-sass-4.14.1.tgz",
+ "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+ "dev": true,
+ "requires": {
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash": "^4.17.15",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.13.2",
+ "node-gyp": "^3.8.0",
+ "npmlog": "^4.0.0",
+ "request": "^2.88.0",
+ "sass-graph": "2.2.5",
+ "stdout-stream": "^1.4.0",
+ "true-case-path": "^1.0.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
"normalize-package-data": {
"version": "2.5.0",
"resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@@ -11780,6 +12395,18 @@
"path-key": "^2.0.0"
}
},
+ "npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
"nth-check": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz",
@@ -11795,6 +12422,12 @@
"integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==",
"dev": true
},
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==",
+ "dev": true
+ },
"nwsapi": {
"version": "2.2.7",
"resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.7.tgz",
@@ -12020,6 +12653,12 @@
"resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz",
"integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="
},
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "dev": true
+ },
"os-locale-s-fix": {
"version": "1.0.8-fix-1",
"resolved": "https://registry.npmmirror.com/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
@@ -12029,6 +12668,22 @@
"lcid": "^3.0.0"
}
},
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmmirror.com/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
"p-each-series": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/p-each-series/-/p-each-series-2.2.0.tgz",
@@ -13276,6 +13931,16 @@
"resolve": "^1.1.6"
}
},
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ }
+ },
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
@@ -13476,6 +14141,15 @@
"resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz",
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
},
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmmirror.com/request/-/request-2.88.2.tgz",
@@ -13784,6 +14458,209 @@
}
}
},
+ "sass-graph": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmmirror.com/sass-graph/-/sass-graph-2.2.5.tgz",
+ "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^13.3.2"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "sass-loader": {
+ "version": "10.4.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.4.1.tgz",
+ "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==",
+ "dev": true,
+ "requires": {
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz",
@@ -13809,6 +14686,27 @@
"ajv-keywords": "^3.5.2"
}
},
+ "scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmmirror.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==",
+ "dev": true,
+ "requires": {
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==",
+ "dev": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@@ -14067,6 +14965,11 @@
"dev": true,
"optional": true
},
+ "shvl": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz",
+ "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="
+ },
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
@@ -14597,6 +15500,15 @@
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
+ "stdout-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/stdout-stream/-/stdout-stream-1.4.1.tgz",
+ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "^2.0.1"
+ }
+ },
"stealthy-require": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/stealthy-require/-/stealthy-require-1.1.1.tgz",
@@ -14781,6 +15693,15 @@
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
"dev": true
},
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==",
+ "dev": true,
+ "requires": {
+ "get-stdin": "^4.0.1"
+ }
+ },
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -14811,6 +15732,68 @@
}
}
},
+ "stylus": {
+ "version": "0.54.8",
+ "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz",
+ "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==",
+ "dev": true,
+ "requires": {
+ "css-parse": "~2.0.0",
+ "debug": "~3.1.0",
+ "glob": "^7.1.6",
+ "mkdirp": "~1.0.4",
+ "safer-buffer": "^2.1.2",
+ "sax": "~1.2.4",
+ "semver": "^6.3.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true
+ }
+ }
+ },
+ "stylus-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
+ "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^1.0.2",
+ "lodash.clonedeep": "^4.5.0",
+ "when": "~3.6.x"
+ }
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz",
@@ -14889,6 +15872,17 @@
"resolved": "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz",
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
},
+ "tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmmirror.com/tar/-/tar-2.2.2.tgz",
+ "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "dev": true,
+ "requires": {
+ "block-stream": "*",
+ "fstream": "^1.0.12",
+ "inherits": "2"
+ }
+ },
"terminal-link": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz",
@@ -15162,6 +16156,21 @@
"punycode": "^2.1.0"
}
},
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==",
+ "dev": true
+ },
+ "true-case-path": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/true-case-path/-/true-case-path-1.0.3.tgz",
+ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.2"
+ }
+ },
"tryer": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz",
@@ -15591,6 +16600,11 @@
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
+ "uview-ui": {
+ "version": "1.8.8",
+ "resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-1.8.8.tgz",
+ "integrity": "sha512-Osal3yzXiHor0In9OPTZuXTaqTbDglMZ9RGK/MPYDoQQs+y0hrBCUD0Xp5T70C8i2lLu2X6Z11zJhmsQWMR7Jg=="
+ },
"v8-to-istanbul": {
"version": "4.1.4",
"resolved": "https://registry.npmmirror.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz",
@@ -15672,101 +16686,6 @@
"vue-style-loader": "^4.1.0"
}
},
- "vue-loader-v16": {
- "version": "npm:vue-loader@16.8.3",
- "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
- "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
- "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.npmmirror.com/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.2",
- "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "optional": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "optional": true
- },
- "hash-sum": {
- "version": "2.0.0",
- "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz",
- "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
- "dev": true,
- "optional": true
- },
- "json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "optional": true
- },
- "loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "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.npmmirror.com/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-style-loader": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
@@ -15795,6 +16714,22 @@
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
},
+ "vuex-persistedstate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
+ "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
+ "requires": {
+ "deepmerge": "^4.2.2",
+ "shvl": "^2.0.3"
+ },
+ "dependencies": {
+ "deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
+ }
+ }
+ },
"w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
@@ -15895,7 +16830,11 @@
"version": "1.2.13",
"resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "optional": true
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
},
"glob-parent": {
"version": "3.1.0",
@@ -16211,7 +17150,11 @@
"resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"dev": true,
- "optional": true
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
},
"glob-parent": {
"version": "3.1.0",
@@ -16495,6 +17438,12 @@
"webidl-conversions": "^4.0.2"
}
},
+ "when": {
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
+ "integrity": "sha512-d1VUP9F96w664lKINMGeElWdhhb5sC+thXM+ydZGU3ZnaE09Wv6FaS+mpM9570kcDs/xMfcXJBTLsMdHEFYY9Q==",
+ "dev": true
+ },
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz",
@@ -16535,6 +17484,15 @@
"has-tostringtag": "^1.0.0"
}
},
+ "wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
"word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
diff --git a/package.json b/package.json
index c34a776..cdd0546 100644
--- a/package.json
+++ b/package.json
@@ -70,8 +70,10 @@
"@vue/shared": "^3.0.0",
"core-js": "^3.6.5",
"flyio": "^0.6.2",
+ "uview-ui": "^1.8.8",
"vue": "^2.6.11",
- "vuex": "^3.2.0"
+ "vuex": "^3.2.0",
+ "vuex-persistedstate": "^4.1.0"
},
"devDependencies": {
"@dcloudio/types": "^3.3.2",
@@ -93,7 +95,11 @@
"jest": "^25.4.0",
"mini-types": "*",
"miniprogram-api-typings": "*",
+ "node-sass": "^4.14.1",
"postcss-comment": "^2.0.0",
+ "sass-loader": "^10.1.1",
+ "stylus": "^0.54.8",
+ "stylus-loader": "^3.0.2",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
diff --git a/src/App.vue b/src/App.vue
index 8c2b732..8a1ee82 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -12,6 +12,139 @@
}
-
diff --git a/src/api/index.js b/src/api/index.js
new file mode 100644
index 0000000..1d63636
--- /dev/null
+++ b/src/api/index.js
@@ -0,0 +1,69 @@
+import Request from './luch-request/index.js'
+import jwt from './jwt.js'
+import {toast} from '@/com/utils.js'
+//测试地址
+const baseApi = 'http://36.133.205.221:81';
+
+const http = new Request();
+
+http.setConfig((config) => { /* 设置全局配置 */
+ config.baseURL = baseApi
+ config.header = {
+ ...config.header,
+ 'Accept': 'application/json'
+ }
+ config.custom = {
+ auth: true, // 是否传token
+ // loading: false // 是否使用loading
+ }
+ config.imeout = 30000
+
+ return config
+})
+/* 请求之前拦截器 */
+http.interceptors.request.use((config, cancel) => {
+ if (config.custom.auth) {
+ // 需要权限认证的路由 需携带自定义参数 {custom: {auth: true}}
+ config.header.Authorization = 'Bearer '+jwt.getAccessToken();
+ }
+ return config
+})
+
+ /* 请求之后拦截器 */
+let isRefreshing = false;//多次锁
+
+http.interceptors.response.use((response) => { /* 请求之后拦截器*/
+ const {code} = response.data
+ console.log(response)
+ if(code ==4024){
+ toast(response.data.msg)
+ }else if(code ==401){
+ toast('请关闭小程序,重新进入')
+ } else{
+
+ }
+ return response
+}, (err) => { // 请求错误
+ const {code} = err.data
+ console.log(code)
+ if(code == 401){//过期未登录
+ const config = err.config
+ if(!isRefreshing){
+ isRefreshing = true
+
+ }else{
+
+ }
+ }else {
+
+ }
+ console.log(err,'======')
+ return Promise.reject(err)
+})
+const getFullUrl = (url,params,header) => {
+ return http.post(url, params,{...header});
+};
+export {
+ http,
+ getFullUrl
+}
\ No newline at end of file
diff --git a/src/api/jwt.js b/src/api/jwt.js
new file mode 100644
index 0000000..624c9c4
--- /dev/null
+++ b/src/api/jwt.js
@@ -0,0 +1,57 @@
+import store from '@/store/index.js'
+const tokenKey = 'user_access_token'; //键值
+// token
+const getAccessToken = function() {
+ let token = store.state.user_access_token ? store.state.user_access_token : uni.getStorageSync(tokenKey);
+ try {
+ token = token?token:''
+ } catch (e) {}
+ return token;
+}
+const setAccessToken = (access_token) => {
+ try {
+ uni.setStorageSync(tokenKey, access_token);
+ store.commit('USERACCESSTOKEN',access_token);
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+const clearAccessToken = function() {
+ try {
+ uni.removeStorageSync(tokenKey);
+ store.commit(tokenKey,'');
+ } catch (e) {}
+}
+//用户key
+const getUserKey = function() {
+ let userKey = store.state.user_key ? store.state.user_key : uni.getStorageSync('user_key');
+ try {
+ userKey = userKey?userKey:''
+ } catch (e) {}
+ return userKey;
+}
+const setUserKey = (user_key) => {
+ try {
+ uni.setStorageSync('user_key', user_key);
+ store.commit('USERKEY',user_key);
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+const clearUserKey = function() {
+ try {
+ uni.removeStorageSync('user_key');
+ store.commit('USERKEY','');
+ } catch (e) {}
+}
+
+export default {
+ getAccessToken,
+ setAccessToken,
+ clearAccessToken,
+ getUserKey,
+ setUserKey,
+ clearUserKey
+}
diff --git a/src/api/luch-request/adapters/index.js b/src/api/luch-request/adapters/index.js
new file mode 100644
index 0000000..a90a2b3
--- /dev/null
+++ b/src/api/luch-request/adapters/index.js
@@ -0,0 +1,99 @@
+import buildURL from '../helpers/buildURL'
+import buildFullPath from '../core/buildFullPath'
+import settle from '../core/settle'
+import { isUndefined } from "../utils"
+
+/**
+ * 返回可选值存在的配置
+ * @param {Array} keys - 可选值数组
+ * @param {Object} config2 - 配置
+ * @return {{}} - 存在的配置项
+ */
+const mergeKeys = (keys, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ return config
+}
+export default (config) => {
+ return new Promise((resolve, reject) => {
+ let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)
+ const _config = {
+ url: fullPath,
+ header: config.header,
+ complete: (response) => {
+ config.fullPath = fullPath
+ response.config = config
+ try {
+ // 对可能字符串不是json 的情况容错
+ if (typeof response.data === 'string') {
+ response.data = JSON.parse(response.data)
+ }
+ // eslint-disable-next-line no-empty
+ } catch (e) {
+ }
+ settle(resolve, reject, response)
+ }
+ }
+ let requestTask
+ if (config.method === 'UPLOAD') {
+ delete _config.header['content-type']
+ delete _config.header['Content-Type']
+ let otherConfig = {
+ // #ifdef MP-ALIPAY
+ fileType: config.fileType,
+ // #endif
+ filePath: config.filePath,
+ name: config.name
+ }
+ const optionalKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ // #ifdef H5 || APP-PLUS
+ 'timeout',
+ // #endif
+ 'formData'
+ ]
+ requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)})
+ } else if (config.method === 'DOWNLOAD') {
+ // #ifdef H5 || APP-PLUS
+ if (!isUndefined(config['timeout'])) {
+ _config['timeout'] = config['timeout']
+ }
+ // #endif
+ requestTask = uni.downloadFile(_config)
+ } else {
+ const optionalKeys = [
+ 'data',
+ 'method',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY || APP-PLUS
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ ]
+ requestTask = uni.request({..._config,...mergeKeys(optionalKeys, config)})
+ }
+ if (config.getTask) {
+ config.getTask(requestTask, config)
+ }
+ })
+}
diff --git a/src/api/luch-request/core/InterceptorManager.js b/src/api/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..3ea0d5e
--- /dev/null
+++ b/src/api/luch-request/core/InterceptorManager.js
@@ -0,0 +1,51 @@
+'use strict'
+
+
+function InterceptorManager() {
+ this.handlers = []
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected
+ })
+ return this.handlers.length - 1
+}
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null
+ }
+}
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+ this.handlers.forEach(h => {
+ if (h !== null) {
+ fn(h)
+ }
+ })
+}
+
+export default InterceptorManager
diff --git a/src/api/luch-request/core/Request.js b/src/api/luch-request/core/Request.js
new file mode 100644
index 0000000..cb5ac0e
--- /dev/null
+++ b/src/api/luch-request/core/Request.js
@@ -0,0 +1,199 @@
+/**
+ * @Class Request
+ * @description luch-request http请求插件
+ * @version 3.0.5
+ * @Author lu-ch
+ * @Date 2021-01-06
+ * @Email webwork.s@qq.com
+ * 文档: https://www.quanzhan.co/luch-request/
+ * github: https://github.com/lei-mu/luch-request
+ * DCloud: http://ext.dcloud.net.cn/plugin?id=392
+ * HBuilderX: beat-3.0.4 alpha-3.0.4
+ */
+
+
+import dispatchRequest from './dispatchRequest'
+import InterceptorManager from './InterceptorManager'
+import mergeConfig from './mergeConfig'
+import defaults from './defaults'
+import { isPlainObject } from '../utils'
+
+export default class Request {
+ /**
+ * @param {Object} arg - 全局配置
+ * @param {String} arg.baseURL - 全局根路径
+ * @param {Object} arg.header - 全局header
+ * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式
+ * @param {String} arg.dataType = [json] - 全局默认的dataType
+ * @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。App和支付宝小程序不支持
+ * @param {Object} arg.custom - 全局默认的自定义参数
+ * @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
+ * @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+)
+ * @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+)
+ * @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+)
+ * @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300
+ */
+ constructor(arg = {}) {
+ if (!isPlainObject(arg)) {
+ arg = {}
+ console.warn('设置全局参数必须接收一个Object')
+ }
+ this.config = {...defaults, ...arg}
+ this.interceptors = {
+ request: new InterceptorManager(),
+ response: new InterceptorManager()
+ }
+ }
+
+ /**
+ * @Function
+ * @param {Request~setConfigCallback} f - 设置全局默认配置
+ */
+ setConfig(f) {
+ this.config = f(this.config)
+ }
+
+ middleware(config) {
+ config = mergeConfig(this.config, config)
+ let chain = [dispatchRequest, undefined]
+ let promise = Promise.resolve(config)
+
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ chain.unshift(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ chain.push(interceptor.fulfilled, interceptor.rejected)
+ })
+
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift())
+ }
+
+ return promise
+ }
+
+ /**
+ * @Function
+ * @param {Object} config - 请求配置项
+ * @prop {String} options.url - 请求路径
+ * @prop {Object} options.data - 请求参数
+ * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型
+ * @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse
+ * @prop {Object} [options.header = config.header] - 请求header
+ * @prop {Object} [options.method = config.method] - 请求方法
+ * @returns {Promise}
+ */
+ request(config = {}) {
+ return this.middleware(config)
+ }
+
+ get(url, options = {}) {
+ return this.middleware({
+ url,
+ method: 'GET',
+ ...options
+ })
+ }
+
+ post(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'POST',
+ ...options
+ })
+ }
+
+ // #ifndef MP-ALIPAY
+ put(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'PUT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ delete(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'DELETE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ connect(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'CONNECT',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN || MP-BAIDU
+ head(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'HEAD',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+ options(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'OPTIONS',
+ ...options
+ })
+ }
+
+ // #endif
+
+ // #ifdef H5 || MP-WEIXIN
+ trace(url, data, options = {}) {
+ return this.middleware({
+ url,
+ data,
+ method: 'TRACE',
+ ...options
+ })
+ }
+
+ // #endif
+
+ upload(url, config = {}) {
+ config.url = url
+ config.method = 'UPLOAD'
+ return this.middleware(config)
+ }
+
+ download(url, config = {}) {
+ config.url = url
+ config.method = 'DOWNLOAD'
+ return this.middleware(config)
+ }
+}
+
+
+/**
+ * setConfig回调
+ * @return {Object} - 返回操作后的config
+ * @callback Request~setConfigCallback
+ * @param {Object} config - 全局默认config
+ */
diff --git a/src/api/luch-request/core/buildFullPath.js b/src/api/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..f2852f4
--- /dev/null
+++ b/src/api/luch-request/core/buildFullPath.js
@@ -0,0 +1,20 @@
+'use strict'
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL'
+import combineURLs from '../helpers/combineURLs'
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+ if (baseURL && !isAbsoluteURL(requestedURL)) {
+ return combineURLs(baseURL, requestedURL)
+ }
+ return requestedURL
+}
diff --git a/src/api/luch-request/core/defaults.js b/src/api/luch-request/core/defaults.js
new file mode 100644
index 0000000..178b617
--- /dev/null
+++ b/src/api/luch-request/core/defaults.js
@@ -0,0 +1,30 @@
+/**
+ * 默认的全局配置
+ */
+
+
+export default {
+ baseURL: '',
+ header: {},
+ method: 'GET',
+ dataType: 'json',
+ // #ifndef MP-ALIPAY || APP-PLUS
+ responseType: 'text',
+ // #endif
+ custom: {},
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ timeout: 60000,
+ // #endif
+ // #ifdef APP-PLUS
+ sslVerify: true,
+ // #endif
+ // #ifdef H5
+ withCredentials: false,
+ // #endif
+ // #ifdef APP-PLUS
+ firstIpv4: false,
+ // #endif
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300
+ }
+}
diff --git a/src/api/luch-request/core/dispatchRequest.js b/src/api/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..c5f2c85
--- /dev/null
+++ b/src/api/luch-request/core/dispatchRequest.js
@@ -0,0 +1,6 @@
+import adapter from '../adapters/index'
+
+
+export default (config) => {
+ return adapter(config)
+}
diff --git a/src/api/luch-request/core/mergeConfig.js b/src/api/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..e95ef31
--- /dev/null
+++ b/src/api/luch-request/core/mergeConfig.js
@@ -0,0 +1,103 @@
+import {deepMerge, isUndefined} from '../utils'
+
+/**
+ * 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局
+ * @param {Array} keys - 配置项
+ * @param {Object} globalsConfig - 当前的全局配置
+ * @param {Object} config2 - 局部配置
+ * @return {{}}
+ */
+const mergeKeys = (keys, globalsConfig, config2) => {
+ let config = {}
+ keys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ } else if (!isUndefined(globalsConfig[prop])) {
+ config[prop] = globalsConfig[prop]
+ }
+ })
+ return config
+}
+/**
+ *
+ * @param globalsConfig - 当前实例的全局配置
+ * @param config2 - 当前的局部配置
+ * @return - 合并后的配置
+ */
+export default (globalsConfig, config2 = {}) => {
+ const method = config2.method || globalsConfig.method || 'GET'
+ let config = {
+ baseURL: globalsConfig.baseURL || '',
+ method: method,
+ url: config2.url || '',
+ params: config2.params || {},
+ custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})},
+ header: deepMerge(globalsConfig.header || {}, config2.header || {})
+ }
+ const defaultToConfig2Keys = ['getTask', 'validateStatus']
+ config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)}
+
+ // eslint-disable-next-line no-empty
+ if (method === 'DOWNLOAD') {
+ // #ifdef H5 || APP-PLUS
+ if (!isUndefined(config2.timeout)) {
+ config['timeout'] = config2['timeout']
+ } else if (!isUndefined(globalsConfig.timeout)) {
+ config['timeout'] = globalsConfig['timeout']
+ }
+ // #endif
+ } else if (method === 'UPLOAD') {
+ delete config.header['content-type']
+ delete config.header['Content-Type']
+ const uploadKeys = [
+ // #ifdef APP-PLUS || H5
+ 'files',
+ // #endif
+ // #ifdef MP-ALIPAY
+ 'fileType',
+ // #endif
+ // #ifdef H5
+ 'file',
+ // #endif
+ 'filePath',
+ 'name',
+ // #ifdef H5 || APP-PLUS
+ 'timeout',
+ // #endif
+ 'formData',
+ ]
+ uploadKeys.forEach(prop => {
+ if (!isUndefined(config2[prop])) {
+ config[prop] = config2[prop]
+ }
+ })
+ // #ifdef H5 || APP-PLUS
+ if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+ config['timeout'] = globalsConfig['timeout']
+ }
+ // #endif
+ } else {
+ const defaultsKeys = [
+ 'data',
+ // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+ 'timeout',
+ // #endif
+ 'dataType',
+ // #ifndef MP-ALIPAY || APP-PLUS
+ 'responseType',
+ // #endif
+ // #ifdef APP-PLUS
+ 'sslVerify',
+ // #endif
+ // #ifdef H5
+ 'withCredentials',
+ // #endif
+ // #ifdef APP-PLUS
+ 'firstIpv4',
+ // #endif
+ ]
+ config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)}
+ }
+
+ return config
+}
diff --git a/src/api/luch-request/core/settle.js b/src/api/luch-request/core/settle.js
new file mode 100644
index 0000000..b2f1659
--- /dev/null
+++ b/src/api/luch-request/core/settle.js
@@ -0,0 +1,16 @@
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+export default function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus
+ const status = response.statusCode
+ if (status && (!validateStatus || validateStatus(status))) {
+ resolve(response)
+ } else {
+ reject(response)
+ }
+}
diff --git a/src/api/luch-request/helpers/buildURL.js b/src/api/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..d26dc30
--- /dev/null
+++ b/src/api/luch-request/helpers/buildURL.js
@@ -0,0 +1,69 @@
+'use strict'
+
+import * as utils from './../utils'
+
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%40/gi, '@').
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']')
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url
+ }
+
+ var serializedParams
+ if (utils.isURLSearchParams(params)) {
+ serializedParams = params.toString()
+ } else {
+ var parts = []
+
+ utils.forEach(params, function serialize(val, key) {
+ if (val === null || typeof val === 'undefined') {
+ return
+ }
+
+ if (utils.isArray(val)) {
+ key = key + '[]'
+ } else {
+ val = [val]
+ }
+
+ utils.forEach(val, function parseValue(v) {
+ if (utils.isDate(v)) {
+ v = v.toISOString()
+ } else if (utils.isObject(v)) {
+ v = JSON.stringify(v)
+ }
+ parts.push(encode(key) + '=' + encode(v))
+ })
+ })
+
+ serializedParams = parts.join('&')
+ }
+
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf('#')
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex)
+ }
+
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+ }
+
+ return url
+}
diff --git a/src/api/luch-request/helpers/combineURLs.js b/src/api/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..7b9d1ef
--- /dev/null
+++ b/src/api/luch-request/helpers/combineURLs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL
+}
diff --git a/src/api/luch-request/helpers/isAbsoluteURL.js b/src/api/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..2a82517
--- /dev/null
+++ b/src/api/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
+}
diff --git a/src/api/luch-request/index.d.ts b/src/api/luch-request/index.d.ts
new file mode 100644
index 0000000..2169947
--- /dev/null
+++ b/src/api/luch-request/index.d.ts
@@ -0,0 +1,116 @@
+type AnyObject = Record
+type HttpPromise = Promise>;
+type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask
+export interface RequestTask {
+ abort: () => void;
+ offHeadersReceived: () => void;
+ onHeadersReceived: () => void;
+}
+export interface HttpRequestConfig {
+ /** 请求基地址 */
+ baseURL?: string;
+ /** 请求服务器接口地址 */
+ url?: string;
+
+ /** 请求查询参数,自动拼接为查询字符串 */
+ params?: AnyObject;
+ /** 请求体参数 */
+ data?: AnyObject;
+
+ /** 文件对应的 key */
+ name?: string;
+ /** HTTP 请求中其他额外的 form data */
+ formData?: AnyObject;
+ /** 要上传文件资源的路径。 */
+ filePath?: string;
+ /** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */
+ files?: Array<{
+ name?: string;
+ file?: File;
+ uri: string;
+ }>;
+ /** 要上传的文件对象,仅H5(2.6.15+)支持 */
+ file?: File;
+
+ /** 请求头信息 */
+ header?: AnyObject;
+ /** 请求方式 */
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD";
+ /** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */
+ dataType?: string;
+ /** 设置响应的数据类型,App和支付宝小程序不支持 */
+ responseType?: "text" | "arraybuffer";
+ /** 自定义参数 */
+ custom?: AnyObject;
+ /** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */
+ timeout?: number;
+ /** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */
+ firstIpv4?: boolean;
+ /** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */
+ sslVerify?: boolean;
+ /** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */
+ withCredentials?: boolean;
+
+ /** 返回当前请求的task, options。请勿在此处修改options。 */
+ getTask?: (task: T, options: HttpRequestConfig) => void;
+ /** 全局自定义验证器 */
+ validateStatus?: (statusCode: number) => boolean | void;
+}
+export interface HttpResponse {
+ config: HttpRequestConfig;
+ statusCode: number;
+ cookies: Array;
+ data: T;
+ errMsg: string;
+ header: AnyObject;
+}
+export interface HttpUploadResponse {
+ config: HttpRequestConfig;
+ statusCode: number;
+ data: T;
+ errMsg: string;
+}
+export interface HttpDownloadResponse extends HttpResponse {
+ tempFilePath: string;
+}
+export interface HttpError {
+ config: HttpRequestConfig;
+ statusCode?: number;
+ cookies?: Array;
+ data?: any;
+ errMsg: string;
+ header?: AnyObject;
+}
+export interface HttpInterceptorManager {
+ use(
+ onFulfilled?: (config: V) => Promise | V,
+ onRejected?: (config: E) => Promise | E
+ ): void;
+ eject(id: number): void;
+}
+export abstract class HttpRequestAbstract {
+ constructor(config?: HttpRequestConfig);
+ config: HttpRequestConfig;
+ interceptors: {
+ request: HttpInterceptorManager;
+ response: HttpInterceptorManager;
+ }
+ middleware(config: HttpRequestConfig): HttpPromise;
+ request(config: HttpRequestConfig): HttpPromise;
+ get(url: string, config?: HttpRequestConfig): HttpPromise;
+ upload(url: string, config?: HttpRequestConfig): HttpPromise;
+ delete(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ head(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ post(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ put(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ connect(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ options(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+ trace(url: string, data?: AnyObject, config?: HttpRequestConfig): HttpPromise;
+
+ download(url: string, config?: HttpRequestConfig): Promise;
+
+ setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
+}
+
+declare class HttpRequest extends HttpRequestAbstract { }
+export default HttpRequest;
diff --git a/src/api/luch-request/index.js b/src/api/luch-request/index.js
new file mode 100644
index 0000000..d8fe348
--- /dev/null
+++ b/src/api/luch-request/index.js
@@ -0,0 +1,2 @@
+import Request from './core/Request'
+export default Request
diff --git a/src/api/luch-request/utils.js b/src/api/luch-request/utils.js
new file mode 100644
index 0000000..0b5bf21
--- /dev/null
+++ b/src/api/luch-request/utils.js
@@ -0,0 +1,135 @@
+'use strict'
+
+// utils is a library of generic helper functions non-specific to axios
+
+var toString = Object.prototype.toString
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+export function isArray (val) {
+ return toString.call(val) === '[object Array]'
+}
+
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+export function isObject (val) {
+ return val !== null && typeof val === 'object'
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+export function isDate (val) {
+ return toString.call(val) === '[object Date]'
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+export function isURLSearchParams (val) {
+ return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
+}
+
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+export function forEach (obj, fn) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return
+ }
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj]
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (var i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj)
+ }
+ } else {
+ // Iterate over object keys
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ fn.call(null, obj[key], key, obj)
+ }
+ }
+ }
+}
+
+/**
+ * 是否为boolean 值
+ * @param val
+ * @returns {boolean}
+ */
+export function isBoolean(val) {
+ return typeof val === 'boolean'
+}
+
+/**
+ * 是否为真正的对象{} new Object
+ * @param {any} obj - 检测的对象
+ * @returns {boolean}
+ */
+export function isPlainObject(obj) {
+ return Object.prototype.toString.call(obj) === '[object Object]'
+}
+
+
+
+/**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+export function deepMerge(/* obj1, obj2, obj3, ... */) {
+ let result = {}
+ function assignValue(val, key) {
+ if (typeof result[key] === 'object' && typeof val === 'object') {
+ result[key] = deepMerge(result[key], val)
+ } else if (typeof val === 'object') {
+ result[key] = deepMerge({}, val)
+ } else {
+ result[key] = val
+ }
+ }
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue)
+ }
+ return result
+}
+
+export function isUndefined (val) {
+ return typeof val === 'undefined'
+}
diff --git a/src/com/subscribeTmplIds.js b/src/com/subscribeTmplIds.js
new file mode 100644
index 0000000..963c41e
--- /dev/null
+++ b/src/com/subscribeTmplIds.js
@@ -0,0 +1,3 @@
+export const SHJGTMPLID = 'Xejag3ttwOw_xLvXsrMULjnoNcm5bJIyu-ACnshUnKY';//审核结果
+
+export const SFTZTMPLID = 'slzGT4a8GDQUjmd4uHrZmHYD8ta55KrXe9RTOrL0qRc';//收费通知
\ No newline at end of file
diff --git a/src/com/utils.js b/src/com/utils.js
new file mode 100644
index 0000000..64ba331
--- /dev/null
+++ b/src/com/utils.js
@@ -0,0 +1,462 @@
+
+/**
+ * 显示加载动画
+ * @export
+ * @param {string} [title="加载中..."]
+ * @param {boolean} [mask=true]
+ */
+export function showLoading(title = "加载中...", mask = true) {
+ uni.showLoading({
+ title,
+ mask
+ })
+}
+/**
+ * 关闭加载动画
+ * @export
+ */
+export function hideLoading() {
+ uni.hideLoading()
+}
+/**
+ * 轻提示框
+ * @export
+ * @param {*} title
+ * @param {*} duration
+ */
+export function toast(title = "", icon = "none", duration = 2000, cb) {
+ uni.showToast({
+ title,
+ icon: icon,
+ mask: false,
+ duration,
+ success: function() {
+ cb && cb()
+ }
+ })
+}
+
+/**
+ * 动态设置当前页面的标题
+ * @export
+ */
+export function setNavigationBarTitle(title = '') {
+ uni.setNavigationBarTitle({
+ title
+ });
+}
+
+/**
+ * 图片预览
+ * @export
+ * @param {*} current
+ * @param {*} [urls=[]]
+ */
+export function previewImage(current, urls = [],callback= () => {}) {
+ uni.previewImage({
+ current, // 当前显示图片的http链接
+ urls ,// 需要预览的图片http链接列表,
+ complete: function(e){
+ callback(e)
+ }
+ })
+}
+/**
+ * 从本地相册选择图片或使用相机拍照
+ * @export
+ * @param {string} [sourceType=['album', 'camera']]
+ * @param {*} cb
+ */
+export function chooseImage(count = 9, success = () => {}, err = () => {}) {
+ uni.chooseImage({
+ count,
+ sizeType: ['compressed'],
+ sourceType: ['album', 'camera'],
+ success(res) {
+ // tempFilePath可以作为img标签的src属性显示图片
+ const tempFilePaths = res.tempFilePaths;
+ success(tempFilePaths)
+ },
+ fail() {
+ err()
+ }
+ })
+}
+/**
+ * 从本地相册选择图片或使用相机拍照
+ * @export
+ * @param {string} [sourceType=['album', 'camera']]
+ * @param {*} cb
+ */
+export function chooseVideo(success = () => {},err = () => {},sourceType = ['album', 'camera']) {
+ uni.chooseVideo({
+ sourceType: sourceType,
+ success(res) {
+ // tempFilePath可以作为img标签的src属性显示图片
+ console.log(res);
+ const tempFilePath = res.tempFilePath;
+ success(tempFilePath,res)
+ },
+ fail() {
+ err()
+ }
+ })
+}
+/**
+ * 图片预览跟视频
+ * @export
+ * @param {*} current
+ * @param {*} [urls=[]]
+ */
+export function previewMedia(current, sources = [],callback= () => {}) {
+ uni.previewMedia({
+ current, // 当前显示index
+ sources ,// 需要预览的http链接列表,
+ complete: function(e){
+ callback(e)
+ }
+ })
+}
+/**
+ * 压缩图片接口,可选压缩质量
+ * @export
+ * @param {*} src
+ * @param {*} [success=()=> {}]
+ * @param {*} [err=()=> {}]
+ */
+export function compressImage(src, quality = 80, cb = () => {}, err = () => {}) {
+ console.log(src, '|');
+ uni.compressImage({
+ src: src,
+ quality: quality,
+ success: res => {
+ console.log(res.tempFilePath)
+ cb(res.tempFilePath)
+ },
+ fail(e) {
+ console.log("失败")
+ err(e)
+ }
+ })
+}
+/**
+ * setStorage 的同步版本
+ * @export
+ * @param {*} key
+ * @param {*} val
+ */
+export function setStorageSync(key, val) {
+ try {
+ uni.setStorageSync(key, val)
+ } catch (e) {
+
+ }
+}
+export function setStorage(key, val) {
+ try {
+ uni.setStorage({
+ key:key,
+ data:val
+ })
+ } catch (e) {
+
+ }
+}
+/**
+ * getStorage 的同步版本
+ * @export
+ * @param {*} key
+ * @returns
+ */
+export function getStorageSync(key) {
+ try {
+ return uni.getStorageSync(key)
+ } catch (e) {
+
+ }
+}
+/**
+ * removeStorage 的同步版本
+ * @export
+ * @param {*} key
+ */
+export function removeStorageSync(key) {
+ try {
+ uni.removeStorageSync(key)
+ } catch (e) {
+
+ }
+}
+
+
+/**
+ * clearStorage 的同步版本
+ * @export
+ */
+export function clearStorageSync() {
+ try {
+ uni.clearStorageSync()
+ } catch (e) {
+
+ }
+}
+/**
+ * 显示小红点
+ * @export
+ * @param {*} index
+ */
+export function showTabBarRedDot(index) {
+ uni.showTabBarRedDot({
+ index
+ })
+}
+
+/**
+ * 隐藏小红点
+ * @export
+ * @param {*} index
+ */
+export function hideTabBarRedDot(index) {
+ uni.hideTabBarRedDot({
+ index
+ })
+}
+
+/**
+ * 返回上一页
+ * @export
+ * @param
+ */
+export function navigateBack() {
+ uni.navigateBack({
+ delta: 1,
+ success() {},
+ fail() {
+ var pages = getCurrentPages();
+ var page = pages[pages.length - 2];
+ if(page){
+ uni.switchTab({
+ url: page.route
+ });
+ }else{
+ uni.switchTab({
+ url: '/pages/index/index'
+ });
+ }
+ }
+ });
+}
+
+export function formatDate(time, fmt) {
+ if (!time) {
+ return ''
+ }
+ let _date = new Date(time);
+ let o = {
+ 'M+': _date.getMonth() + 1, // 月份
+ 'd+': _date.getDate(), // 日
+ 'h+': _date.getHours(), // 小时
+ 'm+': _date.getMinutes(), // 分
+ 's+': _date.getSeconds(), // 秒
+ 'q+': Math.floor((_date.getMonth() + 3) / 3), // 季度
+ 'S': _date.getMilliseconds() // 毫秒
+ };
+ if (/(y+)/.test(fmt)) {
+ fmt = fmt.replace(RegExp.$1, (_date.getFullYear() + '').substr(4 - RegExp.$1.length));
+ }
+ for (let k in o) {
+ if (new RegExp('(' + k + ')').test(fmt)) {
+ fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
+ }
+ }
+ return fmt;
+}
+//验证手机
+export function isPhoneNumber(val){
+ let rt = /^1\d{10}$/
+ if(rt.test(val)){
+ return true
+ }else{
+ return false
+ }
+}
+
+export function arrayKeyGroup(array,key='id'){
+ let newArray = [];
+ console.log(key)
+ array.map(item=>{
+ return [item]
+ }).forEach(([{...item}])=>{
+ const flag = newArray.find(([{...o}])=>o[key] === item[key]);
+ if(!flag) {
+ newArray.push([{...item}])
+ } else {
+ newArray.forEach(([{...y}], index)=>{
+ if(y[key] === item[key]) {
+ newArray[index].push(item)
+ }
+ })
+ }
+ })
+ return newArray
+}
+
+export function stringHide(string,start,end){
+ let th = ''
+ let xlen = end - start;
+ for(let i =0;i < xlen;i++) {
+ th += '*'
+ }
+ return string.substring(0,start) + th + string.substring(end,string.length)
+}
+
+export function compareVersion(v1, v2) {
+ v1 = v1.split('.')
+ v2 = v2.split('.')
+ const len = Math.max(v1.length, v2.length)
+
+ while (v1.length < len) {
+ v1.push('0')
+ }
+ while (v2.length < len) {
+ v2.push('0')
+ }
+
+ for (let i = 0; i < len; i++) {
+ const num1 = parseInt(v1[i])
+ const num2 = parseInt(v2[i])
+
+ if (num1 > num2) {
+ return 1
+ } else if (num1 < num2) {
+ return -1
+ }
+ }
+
+ return 0
+}
+
+/**
+ * 路由跳转
+ *
+ * @param Object target {type, way, url}
+ */
+export function Target(target) {
+ if (target.type === 'mini-program') {
+ const way = target.way || 'navigateTo'
+ const params = { url: target.url }
+ switch (way) {
+ case 'navigateTo':
+ uni.navigateTo(params)
+ break;
+ case 'redirectTo':
+ uni.redirectTo(params)
+ break;
+ case 'reLaunch':
+ uni.reLaunch(params)
+ break;
+ case 'switchTab':
+ uni.switchTab(params)
+ break;
+ case 'navigateBack':
+ navigateBack()
+ break;
+ }
+ }
+}
+
+// 判断是否为空
+export function isEmpty(obj){
+ if(typeof obj == "undefined" || obj == null || obj == ''){
+ return true;
+ }else{
+ return false;
+ }
+}
+
+export function getQueryName(str,name){
+ let query = str.split('?')[1];
+ let vars = query.split("&");
+ for (let i=0;i {}){
+ let _tmplIds = tmplIds;
+ wx.requestSubscribeMessage({
+ tmplIds: _tmplIds,
+ success: (res)=> {
+ console.log(res,'成功')
+ let acceptnum = 0;
+ for(let vk of _tmplIds){
+ if(res[vk]==='accept'){//同意
+ acceptnum += 1
+ }
+ }
+ if(acceptnum==0){
+
+ }else{
+
+ callback(res)
+ }
+ },
+ fail:(err)=>{
+ if (err.errCode == 20004) {
+ console.log('用户拒绝了',err)
+ }else{
+ callback(res)
+ }
+
+ }
+ })
+}
+
+export function testIdCard(id) {
+ // 1 "验证通过!", 0 //校验不通过 // id为身份证号码
+ var format = /^(([1][1-5])|([2][1-3])|([3][1-7])|([4][1-6])|([5][0-4])|([6][1-5])|([7][1])|([8][1-2]))\d{4}(([1][9]\d{2})|([2]\d{3}))(([0][1-9])|([1][0-2]))(([0][1-9])|([1-2][0-9])|([3][0-1]))\d{3}[0-9xX]$/;
+ //号码规则校验
+ if(!format.test(id)){
+ return {'status':0,'msg':'身份证号码不合规'};
+ }
+ //区位码校验
+ //出生年月日校验 前正则限制起始年份为1900;
+ var year = id.substr(6,4),//身份证年
+ month = id.substr(10,2),//身份证月
+ date = id.substr(12,2),//身份证日
+ time = Date.parse(month+'-'+date+'-'+year),//身份证日期时间戳date
+ now_time = Date.parse(new Date()),//当前时间戳
+ dates = (new Date(year,month,0)).getDate();//身份证当月天数
+ if(time>now_time||date>dates){
+ return {'status':0,'msg':'出生日期不合规'}
+ }
+ //校验码判断
+ var c = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2); //系数
+ var b = new Array('1','0','X','9','8','7','6','5','4','3','2'); //校验码对照表
+ var id_array = id.split("");
+ var sum = 0;
+ for(var k=0;k<17;k++){
+ sum+=parseInt(id_array[k])*parseInt(c[k]);
+ }
+ if(id_array[17].toUpperCase() != b[sum%11].toUpperCase()){
+ return {'status':0,'msg':'身份证校验码不合规'}
+ }
+ return {'status':1,'msg':'校验通过'}
+}
+export function testEmail(email){
+ let regEmail = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$");
+ return regEmail.test(email)
+}
+export function testBank(bank){
+ let reg = /[1-9]\d{12,18}/;
+ return reg.test(bank)
+}
+export function testPhone(phone){
+ let reg = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+ return reg.test(phone)
+}
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index 20883fb..0b8bfe4 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,12 +1,18 @@
import Vue from 'vue'
import App from './App'
import './uni.promisify.adaptor'
-
+import uView from "uview-ui";
+Vue.use(uView);
+import {http,getFullUrl} from '@/api/index.js'
+import store from './store/index.js'
Vue.config.productionTip = false
+Vue.prototype.$http = http
+Vue.prototype.$getFullUrl = getFullUrl
App.mpType = 'app'
const app = new Vue({
+ store,
...App
})
app.$mount()
diff --git a/src/pages.json b/src/pages.json
index 1aea851..3fb5810 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -1,16 +1,66 @@
{
+ "easycom": {
+ "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+ },
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
- "navigationBarTitleText": "uni-app"
+ "navigationBarTitleText": "隆昌农业大数据监控平台"
}
}
- ],
+ ,{
+ "path" : "pages/login/login",
+ "style" :
+ {
+ "navigationBarTitleText": "",
+ "enablePullDownRefresh": false
+ }
+
+ }
+ ,{
+ "path" : "pages/user/user",
+ "style" :
+ {
+ "navigationBarTitleText": "个人中心",
+ "enablePullDownRefresh": false,
+ "navigationStyle": "custom"
+ }
+
+ }
+ ,{
+ "path" : "pages/user/password-edit",
+ "style" :
+ {
+ "navigationBarTitleText": "修改密码",
+ "enablePullDownRefresh": false
+ }
+
+ }
+ ],
"globalStyle": {
- "navigationBarTextStyle": "black",
- "navigationBarTitleText": "uni-app",
- "navigationBarBackgroundColor": "#F8F8F8",
- "backgroundColor": "#F8F8F8"
+ "navigationBarTextStyle": "white",
+ "navigationBarTitleText": "隆昌农业大数据监控平台",
+ "navigationBarBackgroundColor": "#2a7dc9",
+ "backgroundColor": "#2a7dc9"
+ },
+ "tabBar": {
+ "color": "#6c6b6b",
+ "selectedColor": "#1296db",
+ "borderStyle": "black",
+ "backgroundColor": "#ffffff",
+ "list": [{
+ "pagePath": "pages/index/index",
+ "iconPath": "static/tab/tab_home.png",
+ "selectedIconPath": "static/tab/tab_home_h.png",
+ "text": "工作台"
+ },
+ {
+ "pagePath": "pages/user/user",
+ "iconPath": "static/tab/tab_user.png",
+ "selectedIconPath": "static/tab/tab_user_h.png",
+ "text": "我的"
+ }
+ ]
}
}
diff --git a/src/pages/index/index.vue b/src/pages/index/index.vue
index bd118ba..49534b2 100644
--- a/src/pages/index/index.vue
+++ b/src/pages/index/index.vue
@@ -1,9 +1,6 @@
-
-
-
- {{title}}
-
+
+
diff --git a/src/pages/login/login.vue b/src/pages/login/login.vue
new file mode 100644
index 0000000..8174667
--- /dev/null
+++ b/src/pages/login/login.vue
@@ -0,0 +1,218 @@
+
+
+
+
+ 隆昌农业大数据监控平台
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/user/password-edit.vue b/src/pages/user/password-edit.vue
new file mode 100644
index 0000000..2a0aded
--- /dev/null
+++ b/src/pages/user/password-edit.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+ 确定
+
+
+
+
+
+
+
+
diff --git a/src/pages/user/user.vue b/src/pages/user/user.vue
new file mode 100644
index 0000000..88b743b
--- /dev/null
+++ b/src/pages/user/user.vue
@@ -0,0 +1,305 @@
+
+
+
+
+
+
+
+
+
+
+ {{userInfo.name}}
+ {{userInfo.phone|hidePhone}}
+
+
+
+
+
+
+
+
+
+ {{userInfo.username?userInfo.username:'——'}}
+ 登录名
+
+
+ {{userInfo.department?userInfo.department:'——'}}
+ 角色
+
+
+
+ 系统管理
+
+
+
+
+
+
+ 修改密码
+
+
+
+
+
+
+
+
+ 角色管理
+
+
+
+
+
+
+
+
+ 账号管理
+
+
+
+
+
+
+
+
+ 系统日志
+
+
+
+
+
+
+
+
+ 友情链接
+
+
+
+
+
+
+ 退出系统
+
+
+
+
+
+
+
+
+
diff --git a/src/static/head.png b/src/static/head.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc2bde640eb42591aaa3b23a1eb9474e94bad9d2
GIT binary patch
literal 162055
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 |