commit 8309808835339351ac215fe096fd1e9279235a63 Author: 张成 Date: Fri Nov 21 16:53:49 2025 +0800 1 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c2153a5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,15 @@ +.DS_Store +node_modules/ +npm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln + +# LocalHistory in vscode + +package-lock.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9eed65b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +upload/ +logs/ +node_modules.* +build/ +www/ +config/template/temp/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..867e503 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "启动程序", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}\\app.js" + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..26e672e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 light + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..848ca3e --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# 项目前后端整合在一起, + +## 前端使用 vue2.0+ivew+vue-router + +### 如何运行 + +#### 第一步 + +npm run api + +npm run serve + +#### 第二步 + +退回到根目录 +cd ../ npm run serve 即可启动前端 + +## 后端使用 koa2+ sequelize+mysql + +### 如何运行 + +根目录 运行 + +npm install + +vscode 直接点调试按钮即可 + +## 生产环境 + +vue_admin /service/webapps/production/dm/plug_vue_admin_web + +nodejs /data/service/nodejs/easy-analysis-plug-api diff --git a/admin/.babelrc b/admin/.babelrc new file mode 100644 index 0000000..708f452 --- /dev/null +++ b/admin/.babelrc @@ -0,0 +1,10 @@ +{ + 'presets': [ + [ + '@vue/app', + { + useBuiltIns: 'entry' + } + ] + ] +} \ No newline at end of file diff --git a/admin/.editorconfig b/admin/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/admin/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/admin/.env.prod b/admin/.env.prod new file mode 100644 index 0000000..4894abf --- /dev/null +++ b/admin/.env.prod @@ -0,0 +1,2 @@ +NODE_ENV=production +VUE_APP_ENV=production diff --git a/admin/.env.sit b/admin/.env.sit new file mode 100644 index 0000000..5e14715 --- /dev/null +++ b/admin/.env.sit @@ -0,0 +1,2 @@ +NODE_ENV=production +VUE_APP_ENV=sit diff --git a/admin/.eslintignore b/admin/.eslintignore new file mode 100644 index 0000000..e69de29 diff --git a/admin/.eslintrc.js b/admin/.eslintrc.js new file mode 100644 index 0000000..e7bb04d --- /dev/null +++ b/admin/.eslintrc.js @@ -0,0 +1,21 @@ +module.exports = { + root: true, + parserOptions: { + sourceType: 'module' + }, + extends: ['plugin:vue/essential', '@vue/standard'], + rules: { + 'generator-star-spacing': 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'space-before-function-paren': 0, + 'no-undef': 'off', + camelcase: 'off', + semi: ['off', 'always'], + indent: ['off', 2], + "prettier/prettier": "off" + }, + parserOptions: { parser: 'babel-eslint' }, + parser: 'vue-eslint-parser', + plugins: ['prettier'], + extends: ['plugin:prettier/recommended'] +} \ No newline at end of file diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100644 index 0000000..d8e029c --- /dev/null +++ b/admin/.gitignore @@ -0,0 +1,27 @@ +.DS_Store +node_modules +/dist +/config + +/tests/e2e/videos/ +/tests/e2e/screenshots/ + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* + +build/env.js diff --git a/admin/.postcssrc.js b/admin/.postcssrc.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/admin/.postcssrc.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/admin/.travis.yml b/admin/.travis.yml new file mode 100644 index 0000000..07c971f --- /dev/null +++ b/admin/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: stable +script: npm run lint +notifications: + email: false diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 0000000..5885495 --- /dev/null +++ b/admin/README.md @@ -0,0 +1,35 @@ +# 智能代码系统 + +` + +## 安装依赖 + +```bush +npm install +``` + +## Run + +### 运行 + +```bush +npm run serve +``` + +### 编译 + +```bush +npm run build +``` + +## 简介 + +## 功能 + +- 登录/登出 +- 权限管理 + - 列表过滤 + - 权限切换 +- 多语言切换 + +Copyright (c) 2016-present diff --git a/admin/cypress.json b/admin/cypress.json new file mode 100644 index 0000000..470c720 --- /dev/null +++ b/admin/cypress.json @@ -0,0 +1,3 @@ +{ + "pluginsFile": "tests/e2e/plugins/index.js" +} diff --git a/admin/package.json b/admin/package.json new file mode 100644 index 0000000..c2dc8e6 --- /dev/null +++ b/admin/package.json @@ -0,0 +1,94 @@ +{ + "name": "light", + "version": "2.0.0", + "author": "light", + "private": false, + "scripts": { + "serve": "vue-cli-service serve --open", + "build": "vue-cli-service build", + "build:sit": "vue-cli-service build --mode sit" + }, + "dependencies": { + "@babel/core": "^7.2.2", + "@babel/polyfill": "^7.2.5", + "@babel/preset-env": "^7.2.3", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-preset-jsx": "^1.1.2", + "ali-oss": "^6.18.0", + "axios": "^0.18.0", + "babel-eslint": "^10.1.0", + "babel-polyfill": "^6.26.0", + "brace": "^0.11.1", + "child_process": "^1.0.2", + "clipboard": "^2.0.0", + "codemirror": "^5.38.0", + "copy-webpack-plugin": "^9.0.0", + "core-js": "^2.6.12", + "countup": "^1.8.2", + "cropperjs": "^1.2.2", + "dayjs": "^1.7.7", + "echarts": "^4.1.0", + "eslint": "^7.15.0", + "eslint-config-prettier": "^7.0.0", + "eslint-plugin-prettier": "^3.3.0", + "html2canvas": "^1.0.0-alpha.12", + "iview": "^3.1.3", + "iview-area": "^1.5.17", + "js-cookie": "^2.2.0", + "regenerator-runtime": "^0.14.1", + "simplemde": "^1.11.2", + "sortablejs": "^1.7.0", + "three": "^0.130.1", + "tree-table-vue": "^1.1.0", + "v-org-tree": "^1.0.6", + "view-design": "^4.7.0", + "vue": "^2.5.10", + "vue-router": "^3.0.1", + "vuedraggable": "^2.16.0", + "vuex": "^3.0.1", + "vuex-persistedstate": "^2.7.0", + "wangeditor": "^4.7.5", + "xlsx": "^0.13.3" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^3.0.1", + "@vue/cli-plugin-eslint": "^3.0.1", + "@vue/cli-plugin-unit-mocha": "^3.0.1", + "@vue/cli-service": "^3.0.1", + "@vue/eslint-config-standard": "^3.0.0-beta.10", + "@vue/test-utils": "^1.0.0-beta.10", + "autoprefixer": "^9.8.6", + "cache-loader": "^4.1.0", + "chai": "^4.1.2", + "copy-webpack-plugin": "^5.1.2", + "css-loader": "^3.6.0", + "eslint-plugin-cypress": "^2.0.1", + "file-loader": "^6.2.0", + "less-loader": "^6.2.0", + "lint-staged": "^6.0.0", + "postcss-loader": "^3.0.0", + "thread-loader": "^2.1.3", + "url-loader": "^4.1.1", + "vue-loader": "^15.4.2", + "vue-style-loader": "^4.1.3", + "vue-template-compiler": "^2.5.13" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "gitHooks": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*.js": [ + "vue-cli-service lint", + "git add" + ], + "*.vue": [ + "vue-cli-service lint", + "git add" + ] + } +} diff --git a/admin/public/icon.ico b/admin/public/icon.ico new file mode 100644 index 0000000..c306912 Binary files /dev/null and b/admin/public/icon.ico differ diff --git a/admin/public/index.html b/admin/public/index.html new file mode 100644 index 0000000..4f8eee6 --- /dev/null +++ b/admin/public/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + 智能代码平台 + + + + + + +
+ + + \ No newline at end of file diff --git a/admin/public/static/jquery.3.2.1.min.js b/admin/public/static/jquery.3.2.1.min.js new file mode 100644 index 0000000..9b96fed --- /dev/null +++ b/admin/public/static/jquery.3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + diff --git a/admin/src/api/ad/sysAdServer.js b/admin/src/api/ad/sysAdServer.js new file mode 100644 index 0000000..1ac32f3 --- /dev/null +++ b/admin/src/api/ad/sysAdServer.js @@ -0,0 +1,21 @@ +import http from "@/libs/http"; + +class SysAdServer { + async getAll(param) { + return await http.get("/sys_ad/index", param); + } + + async add(row) { + return await http.post("/sys_ad/add", row); + } + + async edit(row) { + return await http.post("/sys_ad/edit", row); + } + + async del(row) { + return await http.post("/sys_ad/del", row); + } +} +const sysAdServer = new SysAdServer(); +export default sysAdServer; diff --git a/admin/src/api/auto/formFieldServer.js b/admin/src/api/auto/formFieldServer.js new file mode 100644 index 0000000..627d13a --- /dev/null +++ b/admin/src/api/auto/formFieldServer.js @@ -0,0 +1,30 @@ +import http from "@/libs/http"; +class FormFieldServer { + async all(param) { + let res = await http.get("/sys_form_field/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_form_field/page", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_form_field/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_form_field/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_form_field/del", row); + return res; + } +} + +const formFieldServer = new FormFieldServer(); +export default formFieldServer; diff --git a/admin/src/api/auto/formServer.js b/admin/src/api/auto/formServer.js new file mode 100644 index 0000000..2621d83 --- /dev/null +++ b/admin/src/api/auto/formServer.js @@ -0,0 +1,35 @@ +import http from "@/libs/http"; +class FormServer { + async all(param) { + let res = await http.get("/sys_form/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_form/page", row); + return res; + } + + async generate(row) { + let res = await http.post("/sys_form/generate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_form/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_form/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_form/del", row); + return res; + } +} + +const formServer = new FormServer(); +export default formServer; diff --git a/admin/src/api/auto/menuServer.js b/admin/src/api/auto/menuServer.js new file mode 100644 index 0000000..8996760 --- /dev/null +++ b/admin/src/api/auto/menuServer.js @@ -0,0 +1,30 @@ +import http from "@/libs/http"; + +class MenuServer { + async list(row) { + let res = await http.get("/sys_menu/index", row); + return res; + } + + async generate(row) { + let res = await http.post("/sys_menu/generate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_menu/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_menu/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_menu/del", row); + return res; + } +} +const menuServer = new MenuServer(); +export default menuServer; \ No newline at end of file diff --git a/admin/src/api/auto/modelFieldServer.js b/admin/src/api/auto/modelFieldServer.js new file mode 100644 index 0000000..44ecf1f --- /dev/null +++ b/admin/src/api/auto/modelFieldServer.js @@ -0,0 +1,32 @@ +import http from "@/libs/http"; +class ModelFieldServer { + async all(row) { + let res = await http.get("/sys_model_field/all", row); + return res; + } + + async allByKey(row) { + let res = await http.get("/sys_model_field/allByKey", row, { + hideLoad: true + }); + return res; + } + + async add(row) { + let res = await http.post("/sys_model_field/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_model_field/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_model_field/del", row); + return res; + } +} + +const modelFieldServer = new ModelFieldServer(); +export default modelFieldServer; \ No newline at end of file diff --git a/admin/src/api/auto/modelServer.js b/admin/src/api/auto/modelServer.js new file mode 100644 index 0000000..b996d1f --- /dev/null +++ b/admin/src/api/auto/modelServer.js @@ -0,0 +1,48 @@ +import http from "@/libs/http"; +class ModelServer { + async interface(row) { + let res = await http.post("/sys_model/interface", row); + return res; + } + + async all() { + let res = await http.get("/sys_model/all", {}); + return res; + } + + async detail(row) { + let res = await http.get("/sys_model/detail", row); + return res; + } + + + async autoModelBydb(row) { + let res = await http.post("/sys_model/autoModelBydb", row); + return res; + + + } + + async regenerate(row) { + let res = await http.post("/sys_model/regenerate", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_model/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_model/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_model/del", row); + return res; + } +} + +const modelServer = new ModelServer(); +export default modelServer; diff --git a/admin/src/api/auto/paramSetupServer.js b/admin/src/api/auto/paramSetupServer.js new file mode 100644 index 0000000..07831c0 --- /dev/null +++ b/admin/src/api/auto/paramSetupServer.js @@ -0,0 +1,29 @@ +import http from "@/libs/http"; +class ParamSetupServer { + async getAll() { + return await http.get("/sys_parameter/index", {}); + } + + async getOne(key) { + return await http.get("/sys_parameter/key", { key }); + } + + async add(row) { + return await http.post("/sys_parameter/add", row); + } + + async edit(row) { + return await http.post("/sys_parameter/edit", row); + } + + async setSysConfig(row) { + return await http.post("/sys_parameter/setSysConfig", row); + } + + async del(row) { + return await http.post("/sys_parameter/del", row); + } +} + +const paramSetupServer = new ParamSetupServer(); +export default paramSetupServer; diff --git a/admin/src/api/auto/projectServer.js b/admin/src/api/auto/projectServer.js new file mode 100644 index 0000000..208e829 --- /dev/null +++ b/admin/src/api/auto/projectServer.js @@ -0,0 +1,35 @@ +import http from "@/libs/http"; +class listClServer { + async all(param) { + let res = await http.get("/sys_project/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_project/page", row); + return res; + } + + async exportCsv(row) { + let res = http.fileExport("/sys_project/export", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_project/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_project/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_project/del", row); + return res; + } +} + +const listServer = new listClServer(); +export default listServer; diff --git a/admin/src/api/auto/sysControlTypeServer.js b/admin/src/api/auto/sysControlTypeServer.js new file mode 100644 index 0000000..1a97b3a --- /dev/null +++ b/admin/src/api/auto/sysControlTypeServer.js @@ -0,0 +1,29 @@ +import http from "@/libs/http"; +class SysControlTypeServer { + async all(param) { + let res = await http.get("/sys_control_type/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_control_type/page", row); + return res; + } + + async add(param) { + let res = await http.post("/sys_control_type/add", param); + return res; + } + + async edit(param) { + let res = await http.post("/sys_control_type/edit", param); + return res; + } + async del(param) { + let res = await http.post("/sys_control_type/del", param); + return res; + } +} + +const sysControlTypeServer = new SysControlTypeServer(); +export default sysControlTypeServer; diff --git a/admin/src/api/cote/info_server.js b/admin/src/api/cote/info_server.js new file mode 100644 index 0000000..7eb94de --- /dev/null +++ b/admin/src/api/cote/info_server.js @@ -0,0 +1,35 @@ +import http from "@/libs/http"; +class infoClServer { + async all(param) { + let res = await http.get("/inf_info/all", param); + return res; + } + + async page(row) { + let res = await http.post("/inf_info/page", row); + return res; + } + + async exportCsv(row) { + let res = http.fileExport("/inf_info/export", row); + return res; + } + + async add(row) { + let res = await http.post("/inf_info/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/inf_info/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/inf_info/del", row); + return res; + } +} + +const infoServer = new infoClServer(); +export default infoServer; diff --git a/admin/src/api/cote/info_type_server.js b/admin/src/api/cote/info_type_server.js new file mode 100644 index 0000000..d0fad7f --- /dev/null +++ b/admin/src/api/cote/info_type_server.js @@ -0,0 +1,38 @@ +import http from '@/libs/http'; +class info_typeClServer { + async all(param) { + let res= await http.get('/inf_info_type/all', param); + return res; + } + + + async page(row) { + let res= await http.post('/inf_info_type/page', row); + return res; + } + + + async exportCsv(row) { + let res = http.fileExport("/inf_info_type/export", row); + return res; + } + + async add(row) { + let res= await http.post('/inf_info_type/add', row); + return res; + } + + async edit(row) { + let res= await http.post('/inf_info_type/edit', row); + return res; + } + + async del(row) { + let res= await http.post('/inf_info_type/del', row); + return res; + } +} + +const info_typeServer = new info_typeClServer(); +export default info_typeServer; + \ No newline at end of file diff --git a/admin/src/api/home/homeServer.js b/admin/src/api/home/homeServer.js new file mode 100644 index 0000000..fcd0124 --- /dev/null +++ b/admin/src/api/home/homeServer.js @@ -0,0 +1,26 @@ +import http from "@/libs/http"; +class HomeServer { + // 获取订单统计 + async getOderCount() { + let res = await http.get("/order/count"); + return res; + } + + async getUserCount() { + let res = await http.get("/user/count"); + return res; + } + + async getSalesRank() { + let res = await http.get("/index/salesRank"); + return res; + } + + async userRecommendRank() { + let res = await http.get("/index/userRecommendRank"); + return res; + } +} + +const homeServer = new HomeServer(); +export default homeServer; \ No newline at end of file diff --git a/admin/src/api/project/detail_server.js b/admin/src/api/project/detail_server.js new file mode 100644 index 0000000..0a97198 --- /dev/null +++ b/admin/src/api/project/detail_server.js @@ -0,0 +1,40 @@ +import http from "@/libs/http"; +class DetailServer { + async editDbConfig(row) { + let res = await http.post("/sys_project/editDbConfig", row); + return res; + } + + + async editWxConfig(row) { + let res = await http.post("/sys_project/editWxConfig", row); + return res; + } + + async editRedisConfig(row) { + let res = await http.post("/sys_project/editRedisConfig", row); + return res; + } + + + async editAliyunConfig(row) { + let res = await http.post("/sys_project/editAliyunConfig", row); + return res; + } + + + + async autoInitDb(row) { + let res = await http.post("/sys_project/autoInitDb", row); + return res; + } + + + async detailConfig(row) { + let res = await http.post("/sys_project/detailConfig", row); + return res; + } +} + +const detailServer = new DetailServer(); +export default detailServer; diff --git a/admin/src/api/project/list_server.js b/admin/src/api/project/list_server.js new file mode 100644 index 0000000..208e829 --- /dev/null +++ b/admin/src/api/project/list_server.js @@ -0,0 +1,35 @@ +import http from "@/libs/http"; +class listClServer { + async all(param) { + let res = await http.get("/sys_project/all", param); + return res; + } + + async page(row) { + let res = await http.post("/sys_project/page", row); + return res; + } + + async exportCsv(row) { + let res = http.fileExport("/sys_project/export", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_project/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_project/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_project/del", row); + return res; + } +} + +const listServer = new listClServer(); +export default listServer; diff --git a/admin/src/api/system/announcementServer.js b/admin/src/api/system/announcementServer.js new file mode 100644 index 0000000..d63905b --- /dev/null +++ b/admin/src/api/system/announcementServer.js @@ -0,0 +1,20 @@ +import http from '@/libs/http' +class AnnouncementServer { + async dtl() { + let res = await http.get('/sys_announcement/dtl') + return res + } + + async add(row) { + let res = await http.post('/sys_announcement/add', row) + return res + } + + async edit(row) { + let res = await http.post('/sys_announcement/edit', row) + return res + } +} + +const announcementServer = new AnnouncementServer() +export default announcementServer diff --git a/admin/src/api/system/fileServe.js b/admin/src/api/system/fileServe.js new file mode 100644 index 0000000..dbfcbfe --- /dev/null +++ b/admin/src/api/system/fileServe.js @@ -0,0 +1,21 @@ +import http from "@/libs/http"; +class FileServe { + async upload_oos_img(row) { + let res = await http.postFormData("/sys_file/upload_oos_img", row); + return res; + } + + async upload_Img(row) { + let res = await http.postFormData("/file/upload_Img", row); + return res; + } + + // 下载基础项目 + async getBaseProject(row){ + let res = await http.post("/sys_file/get_base_project", row); + return res; + } +} + +const fileServe = new FileServe(); +export default fileServe; diff --git a/admin/src/api/system/rolePermissionServer.js b/admin/src/api/system/rolePermissionServer.js new file mode 100644 index 0000000..e222a1c --- /dev/null +++ b/admin/src/api/system/rolePermissionServer.js @@ -0,0 +1,30 @@ +import http from '@/libs/http' +class RolePermissionServer { + async getRoles(callback) { + let res = await http.get('/SysRolePermission/Query', {}) + return res + } + + async getRole(row) { + let res = await http.get('/SysRolePermission/QueryByRoleId', row) + return res + } + + async add(row) { + let res = await http.post('/SysRolePermission/add', row) + return res + } + + async edit(row) { + let res = await http.post('/SysRolePermission/edit', row) + return res + } + + async del(row) { + let res = await http.post('/SysRolePermission/del', row) + return res + } +} + +const rolePermissionServer = new RolePermissionServer() +export default rolePermissionServer diff --git a/admin/src/api/system/roleServer.js b/admin/src/api/system/roleServer.js new file mode 100644 index 0000000..dbc40ce --- /dev/null +++ b/admin/src/api/system/roleServer.js @@ -0,0 +1,26 @@ +import http from "@/libs/http"; +class RoleServer { + async list() { + let res = await http.get("/sys_role/index", {}); + return res; + } + + async add(row) { + let res = await http.post("/sys_role/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_role/edit", row); + + return res; + } + + async del(row) { + let res = await http.post("/sys_role/del", row); + return res; + } +} + +const roleServer = new RoleServer(); +export default roleServer; \ No newline at end of file diff --git a/admin/src/api/system/shpProfitServer.js b/admin/src/api/system/shpProfitServer.js new file mode 100644 index 0000000..d2835fe --- /dev/null +++ b/admin/src/api/system/shpProfitServer.js @@ -0,0 +1,15 @@ +import http from '@/libs/http' +class ShpProfitServer { + async report(param) { + let res = await http.post('/shpProfit/report', param) + return res + } + + async list(param) { + let res = await http.post('/shpProfit/list', param) + return res + } +} + +const shpProfitServer = new ShpProfitServer() +export default shpProfitServer diff --git a/admin/src/api/system/specificationServer.js b/admin/src/api/system/specificationServer.js new file mode 100644 index 0000000..4a8f1f4 --- /dev/null +++ b/admin/src/api/system/specificationServer.js @@ -0,0 +1,25 @@ +import http from '@/libs/http' +class SpecificationServer { + async list() { + let res = await http.post('/specification/list', {}) + return res + } + + async add(row) { + let res = await http.post('/specification/add', row) + return res + } + + async edit(row) { + let res = await http.post('/specification/edit', row) + return res + } + + async del(row) { + let res = await http.post('/specification/del', row) + return res + } +} + +const specificationServer = new SpecificationServer() +export default specificationServer diff --git a/admin/src/api/system/sysAddressServer.js b/admin/src/api/system/sysAddressServer.js new file mode 100644 index 0000000..d0cde93 --- /dev/null +++ b/admin/src/api/system/sysAddressServer.js @@ -0,0 +1,10 @@ +import http from "@/libs/http"; +class SysAddress { + async index(param) { + let res = await http.get("/sys_address/index", param); + return res; + } +} + +const sysAddress = new SysAddress(); +export default sysAddress; diff --git a/admin/src/api/system/sysModuleServer.js b/admin/src/api/system/sysModuleServer.js new file mode 100644 index 0000000..a4ddd6d --- /dev/null +++ b/admin/src/api/system/sysModuleServer.js @@ -0,0 +1,30 @@ +import http from "@/libs/http"; +class SysModuleServer { + async all() { + let res = await http.get("/sys_menu/all", {}); + return res; + } + + async list(row) { + let res = await http.get("/sys_menu/all", row); + return res; + } + + async add(row) { + let res = await http.post("/sys_menu/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_menu/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_menu/del", row); + return res; + } +} + +const sysModuleServer = new SysModuleServer(); +export default sysModuleServer; \ No newline at end of file diff --git a/admin/src/api/system/sys_log_serve.js b/admin/src/api/system/sys_log_serve.js new file mode 100644 index 0000000..106d7aa --- /dev/null +++ b/admin/src/api/system/sys_log_serve.js @@ -0,0 +1,25 @@ +import http from "@/libs/http"; +class SysLogServe { + async all(param) { + let res = await http.get("/sys_log/all", param); + return res; + } + + async detail(param) { + let res = await http.get("/sys_log/detail", param); + return res; + } + + async delete(param) { + let res = await http.get("/sys_log/delete", param); + return res; + } + + async operates(param) { + let res = await http.get("/sys_log/operates", param); + return res; + } +} + +const sys_log_serve = new SysLogServe(); +export default sys_log_serve; diff --git a/admin/src/api/system/systemType_server.js b/admin/src/api/system/systemType_server.js new file mode 100644 index 0000000..cea2467 --- /dev/null +++ b/admin/src/api/system/systemType_server.js @@ -0,0 +1,38 @@ +import http from '@/libs/http'; +class systemTypeClServer { + async all(param) { + let res= await http.get('/sys_project_type/all', param); + return res; + } + + + async page(row) { + let res= await http.post('/sys_project_type/page', row); + return res; + } + + + async exportCsv(row) { + let res = http.fileExport("/sys_project_type/export", row); + return res; + } + + async add(row) { + let res= await http.post('/sys_project_type/add', row); + return res; + } + + async edit(row) { + let res= await http.post('/sys_project_type/edit', row); + return res; + } + + async del(row) { + let res= await http.post('/sys_project_type/del', row); + return res; + } +} + +const systemTypeServer = new systemTypeClServer(); +export default systemTypeServer; + \ No newline at end of file diff --git a/admin/src/api/system/userServer.js b/admin/src/api/system/userServer.js new file mode 100644 index 0000000..0929ac8 --- /dev/null +++ b/admin/src/api/system/userServer.js @@ -0,0 +1,40 @@ +import http from "@/libs/http"; +class UserServer { + async login(row) { + let res = await http.post("/sys_user/login", row); + return res; + } + + async all() { + let res = await http.get("/sys_user/index", {}); + return res; + } + + async exportCsv(row) { + let res = http.fileExport("/sys_user/export", row); + return res; + } + + async authorityMenus() { + let res = await http.post("/sys_user/authorityMenus", {}); + return res; + } + + async add(row) { + let res = await http.post("/sys_user/add", row); + return res; + } + + async edit(row) { + let res = await http.post("/sys_user/edit", row); + return res; + } + + async del(row) { + let res = await http.post("/sys_user/del", row); + return res; + } +} + +const userServer = new UserServer(); +export default userServer; diff --git a/admin/src/api/vip/vip_member_server.js b/admin/src/api/vip/vip_member_server.js new file mode 100644 index 0000000..fc3e6e8 --- /dev/null +++ b/admin/src/api/vip/vip_member_server.js @@ -0,0 +1,38 @@ +import http from '@/libs/http'; +class vip_memberClServer { + async all(param) { + let res= await http.get('/vip_member/all', param); + return res; + } + + + async page(row) { + let res= await http.post('/vip_member/page', row); + return res; + } + + + async exportCsv(row) { + let res = http.fileExport("/vip_member/export", row); + return res; + } + + async add(row) { + let res= await http.post('/vip_member/add', row); + return res; + } + + async edit(row) { + let res= await http.post('/vip_member/edit', row); + return res; + } + + async del(row) { + let res= await http.post('/vip_member/del', row); + return res; + } +} + +const vip_memberServer = new vip_memberClServer(); +export default vip_memberServer; + \ No newline at end of file diff --git a/admin/src/assets/css/animate.css b/admin/src/assets/css/animate.css new file mode 100644 index 0000000..f47d78b --- /dev/null +++ b/admin/src/assets/css/animate.css @@ -0,0 +1,3688 @@ +@charset "UTF-8"; +/*! + * animate.css -http://daneden.me/animate + * Version - 3.7.0 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2018 Daniel Eden + */ + +@-webkit-keyframes bounce { + + from, + 20%, + 53%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0); + } +} + +@keyframes bounce { + + from, + 20%, + 53%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 40%, + 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -4px, 0); + transform: translate3d(0, -4px, 0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} + +@keyframes flash { + + from, + 50%, + to { + opacity: 1; + } + + 25%, + 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(0.95, 1.05, 1); + transform: scale3d(0.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, 0.95, 1); + transform: scale3d(1.05, 0.95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } +} + +@keyframes shake { + + from, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes wobble { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + + from, + 11.1%, + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes heartBeat { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 14% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 28% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 42% { + -webkit-transform: scale(1.3); + transform: scale(1.3); + } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +.heartBeat { + -webkit-animation-name: heartBeat; + animation-name: heartBeat; + -webkit-animation-duration: 1.3s; + animation-duration: 1.3s; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; +} + +@-webkit-keyframes bounceIn { + + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + + from, + 20%, + 40%, + 60%, + 80%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(0.97, 0.97, 0.97); + transform: scale3d(0.97, 0.97, 0.97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInDown { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInLeft { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInRight { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + + from, + 60%, + 75%, + 90%, + to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); + } + + 50%, + 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } +} + +.bounceOut { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, + 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-animation-duration: 0.75s; + animation-duration: 0.75s; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, + 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, + 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-name: hinge; + animation-name: hinge; +} + +@-webkit-keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes jackInTheBox { + from { + opacity: 0; + -webkit-transform: scale(0.1) rotate(30deg); + transform: scale(0.1) rotate(30deg); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + } + + 50% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 70% { + -webkit-transform: rotate(3deg); + transform: rotate(3deg); + } + + to { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +.jackInTheBox { + -webkit-animation-name: jackInTheBox; + animation-name: jackInTheBox; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(0.3, 0.3, 0.3); + transform: scale3d(0.3, 0.3, 0.3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); + transform: scale(0.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); + transform: scale(0.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); + } + + to { + opacity: 0; + -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.delay-1s { + -webkit-animation-delay: 1s; + animation-delay: 1s; +} + +.animated.delay-2s { + -webkit-animation-delay: 2s; + animation-delay: 2s; +} + +.animated.delay-3s { + -webkit-animation-delay: 3s; + animation-delay: 3s; +} + +.animated.delay-4s { + -webkit-animation-delay: 4s; + animation-delay: 4s; +} + +.animated.delay-5s { + -webkit-animation-delay: 5s; + animation-delay: 5s; +} + +.animated.fast { + -webkit-animation-duration: 800ms; + animation-duration: 800ms; +} + +.animated.faster { + -webkit-animation-duration: 500ms; + animation-duration: 500ms; +} + +.animated.slow { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.slower { + -webkit-animation-duration: 3s; + animation-duration: 3s; +} + +@media (prefers-reduced-motion) { + .animated { + -webkit-animation: unset !important; + animation: unset !important; + -webkit-transition: none !important; + transition: none !important; + } +} + +.loopJump { + animation: shake 2s infinite; + -webkit-animation: shake 2s infinite; + color: red; + +} + + +@keyframes ani-demo-spin { + from { + transform: rotate(0deg); + } + + 50% { + transform: rotate(180deg); + } + + to { + transform: rotate(360deg); + } +} + +.spin-icon-load { + + animation: ani-demo-spin 1s linear infinite; +} + +@keyframes loopload { + from { + width: 0px; + } + + 50% { + width: 7px; + } + + to { + width: 15px; + } +} + + +.spin-loopload { + overflow: hidden; + animation: loopload 1s linear infinite; +} + + + +@keyframes call-police { + + from { + color: #495060; + } + + to { + color: red; + } +} + +.call-police-icon { + animation: call-police 0.5s linear infinite; +} diff --git a/admin/src/assets/css/base.less b/admin/src/assets/css/base.less new file mode 100644 index 0000000..764f73a --- /dev/null +++ b/admin/src/assets/css/base.less @@ -0,0 +1,149 @@ +body, +div, +dl, +dt, +dd, +ul, +ol, +li, +h1, +h2, +h3, +h4, +h5, +h6, +pre, +code, +form, +fieldset, +legend, +input, +button, +textarea, +p, +blockquote, +th, +td { + margin: 0; + padding: 0; +} + +body { + background: #fff; + color: #495060; + font-size: 14px; + font-family: Verdana, Arial, Helvetica, sans-serif; +} + +td, +th, +caption { + font-size: 14px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: normal; + font-size: 100%; +} + +a { + color: #495060; + text-decoration: none; + font-weight: bold; +} + +a:hover { + text-decoration: underline; +} + +img { + border: none; +} + +ol, +ul, +li { + list-style: none; +} + +input, +textarea, +select, +button { + font: 14px Verdana, Helvetica, Arial, sans-serif; +} + +html { + overflow-y: auto; +} + +/*滚动条整体样式*/ +*::-webkit-scrollbar { + width: 10px; + /*高宽分别对应横竖滚动条的尺寸*/ + height: 10px; +} + +*::-webkit-scrollbar-thumb { + /*滚动条里面小方块*/ + border-radius: 5px; + -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1); + background: #9ca6bb; +} + +*::-webkit-scrollbar-track { + /*滚动条里面轨道*/ + -webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.1); + border-radius: 5px; + background: #dcdee2; +} + +.ml(@i) when(@i <= 300) { + .ml@{i} { + margin-left: @i + 0px; + } + .ml((@i + 5)); +} + +.ml(5); + +.mt(@i) when(@i <= 100) { + .mt@{i} { + margin-top: @i + 0px; + } + .mt((@i + 5)); +} + +.mt(5); + +.pa(@i) when(@i <= 100) { + .pa@{i} { + padding: @i + 0px; + } + .pa((@i + 5)); +} + +.pa(5); + +.w(@i) when(@i <= 100) { + .w@{i} { + width: @i + 0%; + } + .w((@i + 5)); +} + +.w(5); + +.h(@i) when(@i <= 100) { + .h@{i} { + height: @i + 0%; + } + .h((@i + 5)); +} + +.h(5); diff --git a/admin/src/assets/css/ivewExpand.less b/admin/src/assets/css/ivewExpand.less new file mode 100644 index 0000000..ed949bb --- /dev/null +++ b/admin/src/assets/css/ivewExpand.less @@ -0,0 +1,269 @@ +.ace_print-margin-layer { + display: none; +} + +.ivu-select-dropdown { + z-index: 999999; +} + +.ivu-select-dropdown-list { + height: 200px !important; +} + +.float-right { + float: right; + margin-right: 10px; +} +.ivu-tooltip-inner { + background: #fff; + color: #495060; +} + +.flex { + display: flex; + flex: 1; + align-items: center; +} + +.flex-left { + justify-content: flex-start; + flex-direction: row; +} + +.flex-right { + justify-content: flex-end; + margin-right: 10px; +} + +.ivu-layout-header { + background-color: #f5f7f9; + + padding: 0px 0.05rem; +} + +.mt10 { + margin-top: 10px; +} + +.mt20 { + margin-top: 20px; +} + +.mt30 { + margin-top: 30px; +} + +.ml5 { + margin-left: 5px; +} + +.ml10 { + margin-left: 10px; +} + +.ml20 { + margin-left: 20px; +} + +.ml30 { + margin-left: 30px; +} + +.ml100 { + margin-left: 100px; +} + +.pa-5 { + padding: 0.05rem; +} + +.pa-10 { + padding: 0.1rem; +} + +.pa-20 { + padding: 0.2rem; +} + +.pa-30 { + padding: 0.3rem; +} + +.red { + color: red; +} + +.buld { + color: green; +} + +.bold { + font-weight: bold; +} + +.float-right { + float: right; +} + +.chart-element { + width: 100%; + height: 100%; + flex: 1; + flex-direction: column; +} + +.table-warp { + .ivu-card-body { + height: 100%; + display: flex; + flex-direction: column; + } +} + +.w-e-text-container { + min-height: 800px !important; +} + +.ivu-card-body { + padding: 5px; +} + +.ivu-btn { + margin: 0px 5px; +} + +.head-tool-box { + padding: 5px; + background-color: #dcdee2; + width: 100%; +} + +.h50 { + height: 0.5rem; + line-height: 0.5rem; +} + +.mr10 { + margin-right: 10px; +} + +.content-view { + flex: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + background-color: #fff; + padding: 5px; + + .table-head-tool { + width: 100%; + padding: 10px; + line-height: 35px; + display: flex; + justify-content: space-between; + + .ivu-form-item { + margin-bottom: 5px; + } + } + + .table-body { + display: flex; + flex-direction: column; + width: 100%; + flex: 1; + } +} + +.ivu-table-cell { + padding-left: 5px; + padding-right: 5px; +} + +.arrowBox { + cursor: pointer; + position: absolute; + width: 13px; + height: 50px; + margin-top: -25px; + top: 49%; + right: 1px; + background-color: #043250; + border-radius: 4px 0 0 4px; + overflow: hidden; + + .ivu-icon { + position: relative; + font-size: 36px; + color: #515a6e; + top: 8px; + left: -12px; + } +} + +.ivu-badge-count { + top: 3px; +} + +.datetime-box { + .ivu-date-picker-cells-cell:not(.ivu-date-picker-cells-cell-disabled) { + background-color: rgba(10, 255, 0, 0.3); + color: #000000; + } +} + +.sub-title { + font-size: 20px; + font-weight: bold; +} + +.tip-info { + color: #ff9900; + font-size: 12px; +} + +.tc { + text-align: center; +} + +.seach-input { + width: 300px; + float: right; + margin: 10px; +} + +.item-right { + position: absolute; + right: 10px; +} + +.sort-num { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + i { + margin: 5px; + font-size: 20px; + cursor: pointer; + &.ivu-icon-md-arrow-up { + color: green; + } + + &.ivu-icon-md-arrow-down { + color: indianred; + } + } +} + + +html, +body { + width: 100%; + height: 100%; + overflow: hidden; + margin: 0; + padding: 0; +} diff --git a/admin/src/assets/icons/iconfont.css b/admin/src/assets/icons/iconfont.css new file mode 100644 index 0000000..80a476c --- /dev/null +++ b/admin/src/assets/icons/iconfont.css @@ -0,0 +1,37 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1541579316141'); /* IE9*/ + src: url('iconfont.eot?t=1541579316141#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAiEAAsAAAAADmgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8eUnXY21hcAAAAYAAAACjAAACLi+YJuBnbHlmAAACJAAABAgAAAcg4dRWHmhlYWQAAAYsAAAAMQAAADYTL8piaGhlYQAABmAAAAAgAAAAJAfdA4xobXR4AAAGgAAAABQAAAAsLAD//2xvY2EAAAaUAAAAGAAAABgImgpGbWF4cAAABqwAAAAfAAAAIAEcAG5uYW1lAAAGzAAAAUUAAAJtPlT+fXBvc3QAAAgUAAAAbgAAAI54roygeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMTx/ytzwv4EhhrmBoRkozAiSAwDuUwzMeJzlkUEKwkAMRd/YabXFhQvxFF6qPYPrUujGY7jyIr1JoZNjtMnEhag3MOEN5MMk8D9QAoVyVSKEJwGrh6oh6wVN1iM3nc+cVImJVKdOehlklElmWdYVstp+ql8VdIv15a1NLW0zFXsO7Kjz3erH/3+rY37vr6kxnx1LKNWOJZlaxxJNnWOpSu+ot8jgqMvI6KjfyOSo88jsaAbI4tBsig89rQB4nLVUTWwbRRSeNzO767i2g7N/FP9s7MRrE5ON4/V6rSZyU0PiINSSNImES4IUoapWz6hEiqiMBDQqEojkAkiFStyKRC+9VSoFCeUEyqESVUAqEkcu3OAQb3hrJxAXwSGI3X0/szPz5vvm2x0i7O/vf8IJe5VkSJnUyUtklRBQJE1VIjRtUafkmk6pSu2ipleh4+xikkKxSksWTUeo8m8NoagpYtoslTmxrLl37z64e33esuJjU8P5Wd262LxoPVnPZ06Pxfe+C0YjkhSJygPhQCA8ABPOykwuN7NyuRvgUnAgLEnhATkaCQQiUe/7XKUyV6nQz+t2o7l66+rs7NVbq82GXTdrdjxjRGU5amTids2bUDMFtzCsqsMYMqr3IDY6OT05GjsI8Exv/6CSkOWEQigh+y3clxY5QVTcEZFIGtHLxDUJs6WsHR1y9SFKdr1HggCp3V1ICYL36OOpVmvKN9bC1u6R3vZ0qwWtVovgJfqOfUvfIYxIWL+fyETHNVJqSkIT1JTjW8ZWh3yDJDz0ctvsyt51etvrg9/QHhqGlzMM+vbmizPnDWPLMNbW19e7tffvsBzL99aWEfBRY46t+tbe3PypXv/IMDYN43WsQBe9HL2NC33RuxABrPsG+xH3o4bVRE2KgCRqulbWNf8W/UYVHM129aKra24VshZkq+CWD/Oy6Xt8cGYEthgHVlVliCfynAlqjo6oysTKlYUAD4docMI5/1ZioN+GwZNBcTwWUmTdBUqhTwX29QebXzF4An4JJMzwfMl+WQ01+IlQZVR4yhie53ycA16pOI/ODiYNGK4MChdCgXNnX5gIJXPCSYnf2OF850aQ+zJIyOs+u8+mMO8jQdwtg1TIWVRjKAnFcslMi8KfGUPoSUCergUyUk77dMyS69Ms6tijKZKYwUGKbpfdzu+iYeZYAHMFiOVi+MD7h9mb99qC0L7X8c+XatMfTj97KZ5IxJt/pd43tYYQKEjAnXMOB6kQEBrwg+LPjindAPOHNdC3q3ait0I3/ZIunZEARLNYNEUA6czSP3N/7j9wz6ZESdX0VNl1zGNS/szbQaQSIGk4DtVPcZf8AgXpf9A2OyTit5s2syZmand46bhEe2WtodLHkvaoqtTXuXN2/c42WADP9HGfbUcUW7JgqHss4xHtlMys679FqUomdP9VJBQBdnlPABBubpuNwqnmQj6/0HwNQzKxDUJFgKiXurBG6dqFjmeBzsvtRPJgGIZThYa5fdOvsReOticPh6JHHXxsv7ItJpOniYPYsmZ/x0QD/o5P105DeQwF6MH33ogoLi+KQp7zpY3HQV5bFMURzheXeds7gpP+jKNXljjHuYvXHke7cdCxLLZf6YX7B63UcCV4nGNgZGBgAOKAN2ZR8fw2Xxm4WRhA4AbHYRMY/f///1oWBuYGIJeDgQkkCgAvWgs2AAAAeJxjYGRgYG7438AQw8Lw/z8DAwsDA1AEBXADAHXiBHJ4nGNhYGBgYfj/nwVM48cATwECKwAAAAAAjAC6AOgBFAGAAf4CbgLqAzgDkHicY2BkYGDgZkhiYGcAASYg5gJCBob/YD4DABOmAYsAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbYhdDoIwEAb3a6k/YIIX8VArWewmdJFWJOnpJTG+OQ+TzJCjLy39p4ODR4OAA4444YwWHS7U3IVzn6Voldtb8ksHnvohrlqjjmw1rmzXsvdT7fEbblnCmOfNfJIYStJJfGIL27yb6AOCGR89AAA=') format('woff'), + url('iconfont.ttf?t=1541579316141') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1541579316141#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-bear:before { content: "\e600"; } + +.icon-resize-vertical:before { content: "\e7c3"; } + +.icon-chuizhifanzhuan:before { content: "\e661"; } + +.icon-shuipingfanzhuan:before { content: "\e662"; } + +.icon-qq:before { content: "\e609"; } + +.icon-frown:before { content: "\e77e"; } + +.icon-meh:before { content: "\e780"; } + +.icon-smile:before { content: "\e783"; } + +.icon-man:before { content: "\e7e2"; } + +.icon-woman:before { content: "\e7e5"; } + diff --git a/admin/src/assets/icons/iconfont.eot b/admin/src/assets/icons/iconfont.eot new file mode 100644 index 0000000..045499d Binary files /dev/null and b/admin/src/assets/icons/iconfont.eot differ diff --git a/admin/src/assets/icons/iconfont.svg b/admin/src/assets/icons/iconfont.svg new file mode 100644 index 0000000..6aa3270 --- /dev/null +++ b/admin/src/assets/icons/iconfont.svg @@ -0,0 +1,56 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/assets/icons/iconfont.ttf b/admin/src/assets/icons/iconfont.ttf new file mode 100644 index 0000000..0c557de Binary files /dev/null and b/admin/src/assets/icons/iconfont.ttf differ diff --git a/admin/src/assets/icons/iconfont.woff b/admin/src/assets/icons/iconfont.woff new file mode 100644 index 0000000..105adab Binary files /dev/null and b/admin/src/assets/icons/iconfont.woff differ diff --git a/admin/src/assets/images/administrato.png b/admin/src/assets/images/administrato.png new file mode 100644 index 0000000..8c3d02a Binary files /dev/null and b/admin/src/assets/images/administrato.png differ diff --git a/admin/src/assets/images/auxiliaryPosition.jpg b/admin/src/assets/images/auxiliaryPosition.jpg new file mode 100644 index 0000000..30af094 Binary files /dev/null and b/admin/src/assets/images/auxiliaryPosition.jpg differ diff --git a/admin/src/assets/images/bg.png b/admin/src/assets/images/bg.png new file mode 100644 index 0000000..da5ce77 Binary files /dev/null and b/admin/src/assets/images/bg.png differ diff --git a/admin/src/assets/images/bigmeter.png b/admin/src/assets/images/bigmeter.png new file mode 100644 index 0000000..bf6310f Binary files /dev/null and b/admin/src/assets/images/bigmeter.png differ diff --git a/admin/src/assets/images/error-page/error-401.svg b/admin/src/assets/images/error-page/error-401.svg new file mode 100644 index 0000000..19e2f9f --- /dev/null +++ b/admin/src/assets/images/error-page/error-401.svg @@ -0,0 +1 @@ +tasting \ No newline at end of file diff --git a/admin/src/assets/images/error-page/error-404.svg b/admin/src/assets/images/error-page/error-404.svg new file mode 100644 index 0000000..77d97f7 --- /dev/null +++ b/admin/src/assets/images/error-page/error-404.svg @@ -0,0 +1 @@ +drone_delivery \ No newline at end of file diff --git a/admin/src/assets/images/error-page/error-500.svg b/admin/src/assets/images/error-page/error-500.svg new file mode 100644 index 0000000..ef72fd3 --- /dev/null +++ b/admin/src/assets/images/error-page/error-500.svg @@ -0,0 +1 @@ +co-working \ No newline at end of file diff --git a/admin/src/assets/images/famen.png b/admin/src/assets/images/famen.png new file mode 100644 index 0000000..61f20c7 Binary files /dev/null and b/admin/src/assets/images/famen.png differ diff --git a/admin/src/assets/images/flowarrow.png b/admin/src/assets/images/flowarrow.png new file mode 100644 index 0000000..97b9157 Binary files /dev/null and b/admin/src/assets/images/flowarrow.png differ diff --git a/admin/src/assets/images/flowarrow2.png b/admin/src/assets/images/flowarrow2.png new file mode 100644 index 0000000..1919b70 Binary files /dev/null and b/admin/src/assets/images/flowarrow2.png differ diff --git a/admin/src/assets/images/load.gif b/admin/src/assets/images/load.gif new file mode 100644 index 0000000..16e7b64 Binary files /dev/null and b/admin/src/assets/images/load.gif differ diff --git a/admin/src/assets/images/logo.png b/admin/src/assets/images/logo.png new file mode 100644 index 0000000..e424a84 Binary files /dev/null and b/admin/src/assets/images/logo.png differ diff --git a/admin/src/assets/images/meter.png b/admin/src/assets/images/meter.png new file mode 100644 index 0000000..fe41026 Binary files /dev/null and b/admin/src/assets/images/meter.png differ diff --git a/admin/src/assets/images/mincompanyLogo.png b/admin/src/assets/images/mincompanyLogo.png new file mode 100644 index 0000000..e08bb49 Binary files /dev/null and b/admin/src/assets/images/mincompanyLogo.png differ diff --git a/admin/src/assets/images/secondaryflowMeter.png b/admin/src/assets/images/secondaryflowMeter.png new file mode 100644 index 0000000..b23bf54 Binary files /dev/null and b/admin/src/assets/images/secondaryflowMeter.png differ diff --git a/admin/src/assets/images/start.png b/admin/src/assets/images/start.png new file mode 100644 index 0000000..4f232f0 Binary files /dev/null and b/admin/src/assets/images/start.png differ diff --git a/admin/src/assets/images/unbigmeter.png b/admin/src/assets/images/unbigmeter.png new file mode 100644 index 0000000..a5d4f0a Binary files /dev/null and b/admin/src/assets/images/unbigmeter.png differ diff --git a/admin/src/assets/images/unfamen.png b/admin/src/assets/images/unfamen.png new file mode 100644 index 0000000..2410922 Binary files /dev/null and b/admin/src/assets/images/unfamen.png differ diff --git a/admin/src/assets/images/unmeter.png b/admin/src/assets/images/unmeter.png new file mode 100644 index 0000000..7b7c367 Binary files /dev/null and b/admin/src/assets/images/unmeter.png differ diff --git a/admin/src/assets/images/unsecondaryflowMeter.png b/admin/src/assets/images/unsecondaryflowMeter.png new file mode 100644 index 0000000..4aa3ff7 Binary files /dev/null and b/admin/src/assets/images/unsecondaryflowMeter.png differ diff --git a/admin/src/assets/three/OrbitControls.js b/admin/src/assets/three/OrbitControls.js new file mode 100644 index 0000000..930d4f3 --- /dev/null +++ b/admin/src/assets/three/OrbitControls.js @@ -0,0 +1,1019 @@ +/** + * @author qiao / https://github.com/qiao + * @author mrdoob / http://mrdoob.com + * @author alteredq / http://alteredqualia.com/ + * @author WestLangley / http://github.com/WestLangley + * @author erich666 / http://erichaines.com + * @author ScieCode / http://github.com/sciecode + */ + +import { + EventDispatcher, + MOUSE, + Quaternion, + Spherical, + TOUCH, + Vector2, + Vector3 +} from "three"; + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// +// Orbit - left mouse / touch: one-finger move +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move + +var OrbitControls = function(object, domElement) { + this.object = object; + + this.domElement = domElement !== undefined ? domElement : document; + + // Set to false to disable this control + this.enabled = true; + + // "target" sets the location of focus, where the object orbits around + this.target = new Vector3(); + + // How far you can dolly in and out ( PerspectiveCamera only ) + this.minDistance = 0; + this.maxDistance = Infinity; + + // How far you can zoom in and out ( OrthographicCamera only ) + this.minZoom = 0; + this.maxZoom = Infinity; + + // How far you can orbit vertically, upper and lower limits. + // Range is 0 to Math.PI radians. + this.minPolarAngle = 0; // radians + this.maxPolarAngle = Math.PI; // radians + + // How far you can orbit horizontally, upper and lower limits. + // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. + this.minAzimuthAngle = -Infinity; // radians + this.maxAzimuthAngle = Infinity; // radians + + // Set to true to enable damping (inertia) + // If damping is enabled, you must call controls.update() in your animation loop + this.enableDamping = false; + this.dampingFactor = 0.05; + + // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. + // Set to false to disable zooming + this.enableZoom = true; + this.zoomSpeed = 1.0; + + // Set to false to disable rotating + this.enableRotate = true; + this.rotateSpeed = 1.0; + + // Set to false to disable panning + this.enablePan = true; + this.panSpeed = 1.0; + this.screenSpacePanning = false; // if true, pan in screen-space + this.keyPanSpeed = 7.0; // pixels moved per arrow key push + + // Set to true to automatically rotate around the target + // If auto-rotate is enabled, you must call controls.update() in your animation loop + this.autoRotate = false; + this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60 + + // Set to false to disable use of the keys + this.enableKeys = true; + + // The four arrow keys + this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 }; + + // Mouse buttons + this.mouseButtons = { + LEFT: MOUSE.ROTATE, + MIDDLE: MOUSE.DOLLY, + RIGHT: MOUSE.PAN + }; + + // Touch fingers + this.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }; + + // for reset + this.target0 = this.target.clone(); + this.position0 = this.object.position.clone(); + this.zoom0 = this.object.zoom; + + // + // public methods + // + + this.getPolarAngle = function() { + return spherical.phi; + }; + + this.getAzimuthalAngle = function() { + return spherical.theta; + }; + + this.saveState = function() { + scope.target0.copy(scope.target); + scope.position0.copy(scope.object.position); + scope.zoom0 = scope.object.zoom; + }; + + this.reset = function() { + scope.target.copy(scope.target0); + scope.object.position.copy(scope.position0); + scope.object.zoom = scope.zoom0; + + scope.object.updateProjectionMatrix(); + scope.dispatchEvent(changeEvent); + + scope.update(); + + state = STATE.NONE; + }; + + // this method is exposed, but perhaps it would be better if we can make it private... + this.update = (function() { + var offset = new Vector3(); + + // so camera.up is the orbit axis + var quat = new Quaternion().setFromUnitVectors( + object.up, + new Vector3(0, 1, 0) + ); + var quatInverse = quat.clone().inverse(); + + var lastPosition = new Vector3(); + var lastQuaternion = new Quaternion(); + + return function update() { + var position = scope.object.position; + + offset.copy(position).sub(scope.target); + + // rotate offset to "y-axis-is-up" space + offset.applyQuaternion(quat); + + // angle from z-axis around y-axis + spherical.setFromVector3(offset); + + if (scope.autoRotate && state === STATE.NONE) { + rotateLeft(getAutoRotationAngle()); + } + + if (scope.enableDamping) { + spherical.theta += sphericalDelta.theta * scope.dampingFactor; + spherical.phi += sphericalDelta.phi * scope.dampingFactor; + } else { + spherical.theta += sphericalDelta.theta; + spherical.phi += sphericalDelta.phi; + } + + // restrict theta to be between desired limits + spherical.theta = Math.max( + scope.minAzimuthAngle, + Math.min(scope.maxAzimuthAngle, spherical.theta) + ); + + // restrict phi to be between desired limits + spherical.phi = Math.max( + scope.minPolarAngle, + Math.min(scope.maxPolarAngle, spherical.phi) + ); + + spherical.makeSafe(); + + spherical.radius *= scale; + + // restrict radius to be between desired limits + spherical.radius = Math.max( + scope.minDistance, + Math.min(scope.maxDistance, spherical.radius) + ); + + // move target to panned location + + if (scope.enableDamping === true) { + scope.target.addScaledVector(panOffset, scope.dampingFactor); + } else { + scope.target.add(panOffset); + } + + offset.setFromSpherical(spherical); + + // rotate offset back to "camera-up-vector-is-up" space + offset.applyQuaternion(quatInverse); + + position.copy(scope.target).add(offset); + + scope.object.lookAt(scope.target); + + if (scope.enableDamping === true) { + sphericalDelta.theta *= 1 - scope.dampingFactor; + sphericalDelta.phi *= 1 - scope.dampingFactor; + + panOffset.multiplyScalar(1 - scope.dampingFactor); + } else { + sphericalDelta.set(0, 0, 0); + + panOffset.set(0, 0, 0); + } + + scale = 1; + + // update condition is: + // min(camera displacement, camera rotation in radians)^2 > EPS + // using small-angle approximation cos(x/2) = 1 - x^2 / 8 + + if ( + zoomChanged || + lastPosition.distanceToSquared(scope.object.position) > EPS || + 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS + ) { + scope.dispatchEvent(changeEvent); + + lastPosition.copy(scope.object.position); + lastQuaternion.copy(scope.object.quaternion); + zoomChanged = false; + + return true; + } + + return false; + }; + })(); + + this.dispose = function() { + scope.domElement.removeEventListener("contextmenu", onContextMenu, false); + scope.domElement.removeEventListener("mousedown", onMouseDown, false); + scope.domElement.removeEventListener("wheel", onMouseWheel, false); + + scope.domElement.removeEventListener("touchstart", onTouchStart, false); + scope.domElement.removeEventListener("touchend", onTouchEnd, false); + scope.domElement.removeEventListener("touchmove", onTouchMove, false); + + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + + window.removeEventListener("keydown", onKeyDown, false); + + //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here? + }; + + // + // internals + // + + var scope = this; + + var changeEvent = { type: "change" }; + var startEvent = { type: "start" }; + var endEvent = { type: "end" }; + + var STATE = { + NONE: -1, + ROTATE: 0, + DOLLY: 1, + PAN: 2, + TOUCH_ROTATE: 3, + TOUCH_PAN: 4, + TOUCH_DOLLY_PAN: 5, + TOUCH_DOLLY_ROTATE: 6 + }; + + var state = STATE.NONE; + + var EPS = 0.000001; + + // current position in spherical coordinates + var spherical = new Spherical(); + var sphericalDelta = new Spherical(); + + var scale = 1; + var panOffset = new Vector3(); + var zoomChanged = false; + + var rotateStart = new Vector2(); + var rotateEnd = new Vector2(); + var rotateDelta = new Vector2(); + + var panStart = new Vector2(); + var panEnd = new Vector2(); + var panDelta = new Vector2(); + + var dollyStart = new Vector2(); + var dollyEnd = new Vector2(); + var dollyDelta = new Vector2(); + + function getAutoRotationAngle() { + return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed; + } + + function getZoomScale() { + return Math.pow(0.95, scope.zoomSpeed); + } + + function rotateLeft(angle) { + sphericalDelta.theta -= angle; + } + + function rotateUp(angle) { + sphericalDelta.phi -= angle; + } + + var panLeft = (function() { + var v = new Vector3(); + + return function panLeft(distance, objectMatrix) { + v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix + v.multiplyScalar(-distance); + + panOffset.add(v); + }; + })(); + + var panUp = (function() { + var v = new Vector3(); + + return function panUp(distance, objectMatrix) { + if (scope.screenSpacePanning === true) { + v.setFromMatrixColumn(objectMatrix, 1); + } else { + v.setFromMatrixColumn(objectMatrix, 0); + v.crossVectors(scope.object.up, v); + } + + v.multiplyScalar(distance); + + panOffset.add(v); + }; + })(); + + // deltaX and deltaY are in pixels; right and down are positive + var pan = (function() { + var offset = new Vector3(); + + return function pan(deltaX, deltaY) { + var element = + scope.domElement === document + ? scope.domElement.body + : scope.domElement; + + if (scope.object.isPerspectiveCamera) { + // perspective + var position = scope.object.position; + offset.copy(position).sub(scope.target); + var targetDistance = offset.length(); + + // half of the fov is center to top of screen + targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0); + + // we use only clientHeight here so aspect ratio does not distort speed + panLeft( + (2 * deltaX * targetDistance) / element.clientHeight, + scope.object.matrix + ); + panUp( + (2 * deltaY * targetDistance) / element.clientHeight, + scope.object.matrix + ); + } else if (scope.object.isOrthographicCamera) { + // orthographic + panLeft( + (deltaX * (scope.object.right - scope.object.left)) / + scope.object.zoom / + element.clientWidth, + scope.object.matrix + ); + panUp( + (deltaY * (scope.object.top - scope.object.bottom)) / + scope.object.zoom / + element.clientHeight, + scope.object.matrix + ); + } else { + // camera neither orthographic nor perspective + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - pan disabled." + ); + scope.enablePan = false; + } + }; + })(); + + function dollyIn(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale /= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max( + scope.minZoom, + Math.min(scope.maxZoom, scope.object.zoom * dollyScale) + ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled." + ); + scope.enableZoom = false; + } + } + + function dollyOut(dollyScale) { + if (scope.object.isPerspectiveCamera) { + scale *= dollyScale; + } else if (scope.object.isOrthographicCamera) { + scope.object.zoom = Math.max( + scope.minZoom, + Math.min(scope.maxZoom, scope.object.zoom / dollyScale) + ); + scope.object.updateProjectionMatrix(); + zoomChanged = true; + } else { + console.warn( + "WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled." + ); + scope.enableZoom = false; + } + } + + // + // event callbacks - update the object state + // + + function handleMouseDownRotate(event) { + rotateStart.set(event.clientX, event.clientY); + } + + function handleMouseDownDolly(event) { + dollyStart.set(event.clientX, event.clientY); + } + + function handleMouseDownPan(event) { + panStart.set(event.clientX, event.clientY); + } + + function handleMouseMoveRotate(event) { + rotateEnd.set(event.clientX, event.clientY); + + rotateDelta + .subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + + var element = + scope.domElement === document ? scope.domElement.body : scope.domElement; + + rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height + + rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); + + rotateStart.copy(rotateEnd); + + scope.update(); + } + + function handleMouseMoveDolly(event) { + dollyEnd.set(event.clientX, event.clientY); + + dollyDelta.subVectors(dollyEnd, dollyStart); + + if (dollyDelta.y > 0) { + dollyIn(getZoomScale()); + } else if (dollyDelta.y < 0) { + dollyOut(getZoomScale()); + } + + dollyStart.copy(dollyEnd); + + scope.update(); + } + + function handleMouseMovePan(event) { + panEnd.set(event.clientX, event.clientY); + + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + + scope.update(); + } + + function handleMouseUp(/*event*/) { + // no-op + } + + function handleMouseWheel(event) { + if (event.deltaY < 0) { + dollyOut(getZoomScale()); + } else if (event.deltaY > 0) { + dollyIn(getZoomScale()); + } + + scope.update(); + } + + function handleKeyDown(event) { + var needsUpdate = false; + + switch (event.keyCode) { + case scope.keys.UP: + pan(0, scope.keyPanSpeed); + needsUpdate = true; + break; + + case scope.keys.BOTTOM: + pan(0, -scope.keyPanSpeed); + needsUpdate = true; + break; + + case scope.keys.LEFT: + pan(scope.keyPanSpeed, 0); + needsUpdate = true; + break; + + case scope.keys.RIGHT: + pan(-scope.keyPanSpeed, 0); + needsUpdate = true; + break; + } + + if (needsUpdate) { + // prevent the browser from scrolling on cursor keys + event.preventDefault(); + + scope.update(); + } + } + + function handleTouchStartRotate(event) { + if (event.touches.length == 1) { + rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + rotateStart.set(x, y); + } + } + + function handleTouchStartPan(event) { + if (event.touches.length == 1) { + panStart.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + panStart.set(x, y); + } + } + + function handleTouchStartDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyStart.set(0, distance); + } + + function handleTouchStartDollyPan(event) { + if (scope.enableZoom) handleTouchStartDolly(event); + + if (scope.enablePan) handleTouchStartPan(event); + } + + function handleTouchStartDollyRotate(event) { + if (scope.enableZoom) handleTouchStartDolly(event); + + if (scope.enableRotate) handleTouchStartRotate(event); + } + + function handleTouchMoveRotate(event) { + if (event.touches.length == 1) { + rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + rotateEnd.set(x, y); + } + + rotateDelta + .subVectors(rotateEnd, rotateStart) + .multiplyScalar(scope.rotateSpeed); + + var element = + scope.domElement === document ? scope.domElement.body : scope.domElement; + + rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight); // yes, height + + rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight); + + rotateStart.copy(rotateEnd); + } + + function handleTouchMovePan(event) { + if (event.touches.length == 1) { + panEnd.set(event.touches[0].pageX, event.touches[0].pageY); + } else { + var x = 0.5 * (event.touches[0].pageX + event.touches[1].pageX); + var y = 0.5 * (event.touches[0].pageY + event.touches[1].pageY); + + panEnd.set(x, y); + } + + panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed); + + pan(panDelta.x, panDelta.y); + + panStart.copy(panEnd); + } + + function handleTouchMoveDolly(event) { + var dx = event.touches[0].pageX - event.touches[1].pageX; + var dy = event.touches[0].pageY - event.touches[1].pageY; + + var distance = Math.sqrt(dx * dx + dy * dy); + + dollyEnd.set(0, distance); + + dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed)); + + dollyIn(dollyDelta.y); + + dollyStart.copy(dollyEnd); + } + + function handleTouchMoveDollyPan(event) { + if (scope.enableZoom) handleTouchMoveDolly(event); + + if (scope.enablePan) handleTouchMovePan(event); + } + + function handleTouchMoveDollyRotate(event) { + if (scope.enableZoom) handleTouchMoveDolly(event); + + if (scope.enableRotate) handleTouchMoveRotate(event); + } + + function handleTouchEnd(/*event*/) { + // no-op + } + + // + // event handlers - FSM: listen for events and reset state + // + + function onMouseDown(event) { + if (scope.enabled === false) return; + + // Prevent the browser from scrolling. + + event.preventDefault(); + + // Manually set the focus since calling preventDefault above + // prevents the browser from setting it automatically. + + scope.domElement.focus ? scope.domElement.focus() : window.focus(); + + switch (event.button) { + case 0: + switch (scope.mouseButtons.LEFT) { + case MOUSE.ROTATE: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + } else { + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + } + + break; + + case MOUSE.PAN: + if (event.ctrlKey || event.metaKey || event.shiftKey) { + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + } else { + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + } + + break; + + default: + state = STATE.NONE; + } + + break; + + case 1: + switch (scope.mouseButtons.MIDDLE) { + case MOUSE.DOLLY: + if (scope.enableZoom === false) return; + + handleMouseDownDolly(event); + + state = STATE.DOLLY; + + break; + + default: + state = STATE.NONE; + } + + break; + + case 2: + switch (scope.mouseButtons.RIGHT) { + case MOUSE.ROTATE: + if (scope.enableRotate === false) return; + + handleMouseDownRotate(event); + + state = STATE.ROTATE; + + break; + + case MOUSE.PAN: + if (scope.enablePan === false) return; + + handleMouseDownPan(event); + + state = STATE.PAN; + + break; + + default: + state = STATE.NONE; + } + + break; + } + + if (state !== STATE.NONE) { + document.addEventListener("mousemove", onMouseMove, false); + document.addEventListener("mouseup", onMouseUp, false); + + scope.dispatchEvent(startEvent); + } + } + + function onMouseMove(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + + switch (state) { + case STATE.ROTATE: + if (scope.enableRotate === false) return; + + handleMouseMoveRotate(event); + + break; + + case STATE.DOLLY: + if (scope.enableZoom === false) return; + + handleMouseMoveDolly(event); + + break; + + case STATE.PAN: + if (scope.enablePan === false) return; + + handleMouseMovePan(event); + + break; + } + } + + function onMouseUp(event) { + if (scope.enabled === false) return; + + handleMouseUp(event); + + document.removeEventListener("mousemove", onMouseMove, false); + document.removeEventListener("mouseup", onMouseUp, false); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onMouseWheel(event) { + if ( + scope.enabled === false || + scope.enableZoom === false || + (state !== STATE.NONE && state !== STATE.ROTATE) + ) + return; + + event.preventDefault(); + event.stopPropagation(); + + scope.dispatchEvent(startEvent); + + handleMouseWheel(event); + + scope.dispatchEvent(endEvent); + } + + function onKeyDown(event) { + if ( + scope.enabled === false || + scope.enableKeys === false || + scope.enablePan === false + ) + return; + + handleKeyDown(event); + } + + function onTouchStart(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + + switch (event.touches.length) { + case 1: + switch (scope.touches.ONE) { + case TOUCH.ROTATE: + if (scope.enableRotate === false) return; + + handleTouchStartRotate(event); + + state = STATE.TOUCH_ROTATE; + + break; + + case TOUCH.PAN: + if (scope.enablePan === false) return; + + handleTouchStartPan(event); + + state = STATE.TOUCH_PAN; + + break; + + default: + state = STATE.NONE; + } + + break; + + case 2: + switch (scope.touches.TWO) { + case TOUCH.DOLLY_PAN: + if (scope.enableZoom === false && scope.enablePan === false) return; + + handleTouchStartDollyPan(event); + + state = STATE.TOUCH_DOLLY_PAN; + + break; + + case TOUCH.DOLLY_ROTATE: + if (scope.enableZoom === false && scope.enableRotate === false) + return; + + handleTouchStartDollyRotate(event); + + state = STATE.TOUCH_DOLLY_ROTATE; + + break; + + default: + state = STATE.NONE; + } + + break; + + default: + state = STATE.NONE; + } + + if (state !== STATE.NONE) { + scope.dispatchEvent(startEvent); + } + } + + function onTouchMove(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + event.stopPropagation(); + + switch (state) { + case STATE.TOUCH_ROTATE: + if (scope.enableRotate === false) return; + + handleTouchMoveRotate(event); + + scope.update(); + + break; + + case STATE.TOUCH_PAN: + if (scope.enablePan === false) return; + + handleTouchMovePan(event); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_PAN: + if (scope.enableZoom === false && scope.enablePan === false) return; + + handleTouchMoveDollyPan(event); + + scope.update(); + + break; + + case STATE.TOUCH_DOLLY_ROTATE: + if (scope.enableZoom === false && scope.enableRotate === false) return; + + handleTouchMoveDollyRotate(event); + + scope.update(); + + break; + + default: + state = STATE.NONE; + } + } + + function onTouchEnd(event) { + if (scope.enabled === false) return; + + handleTouchEnd(event); + + scope.dispatchEvent(endEvent); + + state = STATE.NONE; + } + + function onContextMenu(event) { + if (scope.enabled === false) return; + + event.preventDefault(); + } + + // + + scope.domElement.addEventListener("contextmenu", onContextMenu, false); + + scope.domElement.addEventListener("mousedown", onMouseDown, false); + scope.domElement.addEventListener("wheel", onMouseWheel, false); + + scope.domElement.addEventListener("touchstart", onTouchStart, false); + scope.domElement.addEventListener("touchend", onTouchEnd, false); + scope.domElement.addEventListener("touchmove", onTouchMove, false); + + window.addEventListener("keydown", onKeyDown, false); + + // force an update at start + + this.update(); +}; + +OrbitControls.prototype = Object.create(EventDispatcher.prototype); +OrbitControls.prototype.constructor = OrbitControls; + +// This set of controls performs orbiting, dollying (zooming), and panning. +// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). +// This is very similar to OrbitControls, another set of touch behavior +// +// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate +// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish +// Pan - left mouse, or arrow keys / touch: one-finger move + +var MapControls = function(object, domElement) { + OrbitControls.call(this, object, domElement); + + this.mouseButtons.LEFT = MOUSE.PAN; + this.mouseButtons.RIGHT = MOUSE.ROTATE; + + this.touches.ONE = TOUCH.PAN; + this.touches.TWO = TOUCH.DOLLY_ROTATE; +}; + +MapControls.prototype = Object.create(EventDispatcher.prototype); +MapControls.prototype.constructor = MapControls; + +export { OrbitControls, MapControls }; diff --git a/admin/src/component.js b/admin/src/component.js new file mode 100644 index 0000000..db6f99b --- /dev/null +++ b/admin/src/component.js @@ -0,0 +1,30 @@ +import Vue from "vue"; +import TreeGrid from "./components/treeGrid/index.vue"; +import asyncModal from "./components/asyncModal/index.vue"; +import Editor from "./components/editor/index.vue"; +import UploadSingle from "./components/upload/Single.vue"; +import UoloadMultiple from "./components/upload/Multiple.vue"; +import CustomUpload from "./components/upload/Custom.vue"; +import pageHead from "./components/main/pageHead.vue"; + +import TextArea from "@component/textArea"; +import Tables from "@component/tables"; +import editModal from "@component/tables/editModal.vue"; +import FieldItem from "@component/tables/fieldItem.vue"; +class Component { + register() { + Vue.component("pageHead", pageHead); + Vue.component("asyncModal", asyncModal); + Vue.component("Editor", Editor); + Vue.component("TreeGrid", TreeGrid); + Vue.component("UploadSingle", UploadSingle); + Vue.component("UoloadMultiple", UoloadMultiple); + Vue.component("CustomUpload", CustomUpload); + Vue.component("Tables", Tables); + Vue.component("TextArea", TextArea); + Vue.component("editModal", editModal); + Vue.component("FieldItem", FieldItem); + } +} + +export const component = new Component(); diff --git a/admin/src/components/asyncModal/index.vue b/admin/src/components/asyncModal/index.vue new file mode 100644 index 0000000..5ab4b3b --- /dev/null +++ b/admin/src/components/asyncModal/index.vue @@ -0,0 +1,47 @@ + + + + \ No newline at end of file diff --git a/admin/src/components/common-icon/common-icon.vue b/admin/src/components/common-icon/common-icon.vue new file mode 100644 index 0000000..cf266b6 --- /dev/null +++ b/admin/src/components/common-icon/common-icon.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/admin/src/components/common-icon/index.js b/admin/src/components/common-icon/index.js new file mode 100644 index 0000000..1207d15 --- /dev/null +++ b/admin/src/components/common-icon/index.js @@ -0,0 +1,2 @@ +import CommonIcon from './common-icon.vue' +export default CommonIcon diff --git a/admin/src/components/cropper/index.js b/admin/src/components/cropper/index.js new file mode 100644 index 0000000..e7db5ea --- /dev/null +++ b/admin/src/components/cropper/index.js @@ -0,0 +1,2 @@ +import Cropper from './index.vue' +export default Cropper diff --git a/admin/src/components/cropper/index.less b/admin/src/components/cropper/index.less new file mode 100644 index 0000000..3057f88 --- /dev/null +++ b/admin/src/components/cropper/index.less @@ -0,0 +1,36 @@ +.bg{ + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC") +} +.cropper-wrapper{ + width:100%; + height: 100%; + .img-box{ + height: 600px; + width: 600px; + border: 1px solid #ebebeb; + display: inline-block; + .bg; + img{ + max-width: 100%; + display: block; + } + } + .right-con{ + display: inline-block; + width: 170px; + vertical-align: top; + box-sizing: border-box; + padding: 0 10px; + margin-left: 30px; + .preview-box{ + height: 150px !important; + width: 100% !important; + overflow: hidden; + border: 1px solid #ebebeb; + .bg; + } + .button-box{ + padding: 10px 0 0; + } + } +} diff --git a/admin/src/components/cropper/index.vue b/admin/src/components/cropper/index.vue new file mode 100644 index 0000000..3bd9fb9 --- /dev/null +++ b/admin/src/components/cropper/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/admin/src/components/editor/index.vue b/admin/src/components/editor/index.vue new file mode 100644 index 0000000..f4c8a52 --- /dev/null +++ b/admin/src/components/editor/index.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/admin/src/components/info-card/index.js b/admin/src/components/info-card/index.js new file mode 100644 index 0000000..354419b --- /dev/null +++ b/admin/src/components/info-card/index.js @@ -0,0 +1,2 @@ +import InforCard from './infor-card.vue' +export default InforCard diff --git a/admin/src/components/info-card/infor-card.vue b/admin/src/components/info-card/infor-card.vue new file mode 100644 index 0000000..f113306 --- /dev/null +++ b/admin/src/components/info-card/infor-card.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/admin/src/components/load-flower/index.vue b/admin/src/components/load-flower/index.vue new file mode 100644 index 0000000..27288c6 --- /dev/null +++ b/admin/src/components/load-flower/index.vue @@ -0,0 +1,32 @@ + + + + diff --git a/admin/src/components/login-form/index.js b/admin/src/components/login-form/index.js new file mode 100644 index 0000000..d480c28 --- /dev/null +++ b/admin/src/components/login-form/index.js @@ -0,0 +1,2 @@ +import LoginForm from './login-form.vue' +export default LoginForm diff --git a/admin/src/components/login-form/login-form.vue b/admin/src/components/login-form/login-form.vue new file mode 100644 index 0000000..e0399a6 --- /dev/null +++ b/admin/src/components/login-form/login-form.vue @@ -0,0 +1,68 @@ + + diff --git a/admin/src/components/main/components/a-back-top/index.js b/admin/src/components/main/components/a-back-top/index.js new file mode 100644 index 0000000..4da0014 --- /dev/null +++ b/admin/src/components/main/components/a-back-top/index.js @@ -0,0 +1,2 @@ +import ABackTop from './index.vue' +export default ABackTop diff --git a/admin/src/components/main/components/a-back-top/index.vue b/admin/src/components/main/components/a-back-top/index.vue new file mode 100644 index 0000000..529a9e2 --- /dev/null +++ b/admin/src/components/main/components/a-back-top/index.vue @@ -0,0 +1,95 @@ + + diff --git a/admin/src/components/main/components/fullscreen/fullscreen.vue b/admin/src/components/main/components/fullscreen/fullscreen.vue new file mode 100644 index 0000000..749ccb3 --- /dev/null +++ b/admin/src/components/main/components/fullscreen/fullscreen.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/admin/src/components/main/components/fullscreen/index.js b/admin/src/components/main/components/fullscreen/index.js new file mode 100644 index 0000000..422c7c1 --- /dev/null +++ b/admin/src/components/main/components/fullscreen/index.js @@ -0,0 +1,2 @@ +import Fullscreen from './fullscreen.vue' +export default Fullscreen diff --git a/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less b/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less new file mode 100644 index 0000000..1ace1eb --- /dev/null +++ b/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less @@ -0,0 +1,4 @@ +.custom-bread-crumb{ + display: inline-block; + vertical-align: top; +} diff --git a/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue b/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue new file mode 100644 index 0000000..5d3814a --- /dev/null +++ b/admin/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue @@ -0,0 +1,46 @@ + + diff --git a/admin/src/components/main/components/header-bar/custom-bread-crumb/index.js b/admin/src/components/main/components/header-bar/custom-bread-crumb/index.js new file mode 100644 index 0000000..a590fe0 --- /dev/null +++ b/admin/src/components/main/components/header-bar/custom-bread-crumb/index.js @@ -0,0 +1,2 @@ +import customBreadCrumb from './custom-bread-crumb.vue' +export default customBreadCrumb diff --git a/admin/src/components/main/components/header-bar/header-bar.less b/admin/src/components/main/components/header-bar/header-bar.less new file mode 100644 index 0000000..1594d65 --- /dev/null +++ b/admin/src/components/main/components/header-bar/header-bar.less @@ -0,0 +1,18 @@ +.header-bar { + width: 100%; + height: 100%; + position: relative; + height: 64px; + display: flex; + flex-direction: row; + + .custom-content-con { + height: 64px; + padding-right: 120px; + line-height: 64px; + display: inline-block; + vertical-align: top; + flex: 1; + } + +} diff --git a/admin/src/components/main/components/header-bar/header-bar.vue b/admin/src/components/main/components/header-bar/header-bar.vue new file mode 100644 index 0000000..0774b8c --- /dev/null +++ b/admin/src/components/main/components/header-bar/header-bar.vue @@ -0,0 +1,39 @@ + + diff --git a/admin/src/components/main/components/header-bar/index.js b/admin/src/components/main/components/header-bar/index.js new file mode 100644 index 0000000..3d4a170 --- /dev/null +++ b/admin/src/components/main/components/header-bar/index.js @@ -0,0 +1,2 @@ +import HeaderBar from './header-bar' +export default HeaderBar diff --git a/admin/src/components/main/components/header-bar/sider-trigger/index.js b/admin/src/components/main/components/header-bar/sider-trigger/index.js new file mode 100644 index 0000000..15853f4 --- /dev/null +++ b/admin/src/components/main/components/header-bar/sider-trigger/index.js @@ -0,0 +1,2 @@ +import siderTrigger from './sider-trigger.vue' +export default siderTrigger diff --git a/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.less b/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.less new file mode 100644 index 0000000..eb50999 --- /dev/null +++ b/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.less @@ -0,0 +1,21 @@ +.trans{ + transition: transform .2s ease; +} +@size: 40px; +.sider-trigger-a{ + padding: 6px; + width: @size; + height: @size; + display: inline-block; + text-align: center; + color: #5c6b77; + margin-top: 12px; + i{ + .trans; + vertical-align: top; + } + &.collapsed i{ + transform: rotateZ(90deg); + .trans; + } +} diff --git a/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue b/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue new file mode 100644 index 0000000..86ab9ca --- /dev/null +++ b/admin/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue @@ -0,0 +1,27 @@ + + + diff --git a/admin/src/components/main/components/language/index.js b/admin/src/components/main/components/language/index.js new file mode 100644 index 0000000..de2a90a --- /dev/null +++ b/admin/src/components/main/components/language/index.js @@ -0,0 +1,2 @@ +import Language from './language.vue' +export default Language diff --git a/admin/src/components/main/components/language/language.vue b/admin/src/components/main/components/language/language.vue new file mode 100644 index 0000000..692c437 --- /dev/null +++ b/admin/src/components/main/components/language/language.vue @@ -0,0 +1,51 @@ + + + diff --git a/admin/src/components/main/components/side-menu/collapsed-menu.vue b/admin/src/components/main/components/side-menu/collapsed-menu.vue new file mode 100644 index 0000000..848bca0 --- /dev/null +++ b/admin/src/components/main/components/side-menu/collapsed-menu.vue @@ -0,0 +1,58 @@ + + + diff --git a/admin/src/components/main/components/side-menu/index.js b/admin/src/components/main/components/side-menu/index.js new file mode 100644 index 0000000..5b36868 --- /dev/null +++ b/admin/src/components/main/components/side-menu/index.js @@ -0,0 +1,2 @@ +import SideMenu from './side-menu.vue' +export default SideMenu diff --git a/admin/src/components/main/components/side-menu/item-mixin.js b/admin/src/components/main/components/side-menu/item-mixin.js new file mode 100644 index 0000000..e5a9367 --- /dev/null +++ b/admin/src/components/main/components/side-menu/item-mixin.js @@ -0,0 +1,21 @@ +export default { + props: { + parentItem: { + type: Object, + default: () => {} + }, + theme: String, + iconSize: Number + }, + computed: { + parentName() { + return this.parentItem.name + }, + children() { + return this.parentItem.children + }, + textColor() { + return this.theme === 'dark' ? '#fff' : '#495060' + } + } +} diff --git a/admin/src/components/main/components/side-menu/mixin.js b/admin/src/components/main/components/side-menu/mixin.js new file mode 100644 index 0000000..f81972e --- /dev/null +++ b/admin/src/components/main/components/side-menu/mixin.js @@ -0,0 +1,18 @@ +import CommonIcon from "@component/common-icon"; +import { showTitle } from "@/libs/util"; +export default { + components: { + CommonIcon + }, + methods: { + showTitle(item) { + return showTitle(item, this); + }, + showChildren(item) { + return item.type === "菜单"; + }, + getNameOrHref(item, children0) { + return item.href ? `isTurnByHref_${item.href}` : item.name; + } + } +}; \ No newline at end of file diff --git a/admin/src/components/main/components/side-menu/side-menu-item.vue b/admin/src/components/main/components/side-menu/side-menu-item.vue new file mode 100644 index 0000000..07ffba7 --- /dev/null +++ b/admin/src/components/main/components/side-menu/side-menu-item.vue @@ -0,0 +1,25 @@ + + diff --git a/admin/src/components/main/components/side-menu/side-menu.less b/admin/src/components/main/components/side-menu/side-menu.less new file mode 100644 index 0000000..d154b77 --- /dev/null +++ b/admin/src/components/main/components/side-menu/side-menu.less @@ -0,0 +1,39 @@ +.side-menu-wrapper { + user-select: none; + .menu-collapsed { + padding-top: 10px; + + .ivu-dropdown { + width: 100%; + .ivu-dropdown-rel a { + width: 100%; + } + } + .ivu-tooltip { + width: 100%; + .ivu-tooltip-rel { + width: 100%; + } + + .ivu-tooltip-popper .ivu-tooltip-content { + .ivu-tooltip-arrow { + border-right-color: #fff; + } + .ivu-tooltip-inner { + background: #fff; + color: #495060; + } + } + } + } + a.drop-menu-a { + display: inline-block; + padding: 6px 15px; + width: 100%; + text-align: center; + color: #495060; + } +} +.menu-title { + padding-left: 6px; +} diff --git a/admin/src/components/main/components/side-menu/side-menu.vue b/admin/src/components/main/components/side-menu/side-menu.vue new file mode 100644 index 0000000..6a54884 --- /dev/null +++ b/admin/src/components/main/components/side-menu/side-menu.vue @@ -0,0 +1,112 @@ + + + diff --git a/admin/src/components/main/components/user/index.js b/admin/src/components/main/components/user/index.js new file mode 100644 index 0000000..3d04a5c --- /dev/null +++ b/admin/src/components/main/components/user/index.js @@ -0,0 +1,2 @@ +import User from './user.vue' +export default User diff --git a/admin/src/components/main/components/user/user.less b/admin/src/components/main/components/user/user.less new file mode 100644 index 0000000..a3c95af --- /dev/null +++ b/admin/src/components/main/components/user/user.less @@ -0,0 +1,12 @@ +.user{ + &-avator-dropdown{ + cursor: pointer; + display: inline-block; + // height: 64px; + vertical-align: middle; + // line-height: 64px; + .ivu-badge-dot{ + top: 16px; + } + } +} diff --git a/admin/src/components/main/components/user/user.vue b/admin/src/components/main/components/user/user.vue new file mode 100644 index 0000000..291cc3a --- /dev/null +++ b/admin/src/components/main/components/user/user.vue @@ -0,0 +1,60 @@ + + + + diff --git a/admin/src/components/main/index.js b/admin/src/components/main/index.js new file mode 100644 index 0000000..7df2a08 --- /dev/null +++ b/admin/src/components/main/index.js @@ -0,0 +1,2 @@ +import Main from './main.vue' +export default Main diff --git a/admin/src/components/main/main.less b/admin/src/components/main/main.less new file mode 100644 index 0000000..ef792c3 --- /dev/null +++ b/admin/src/components/main/main.less @@ -0,0 +1,109 @@ +.main { + .logo-con { + height: 64px; + padding: 10px; + padding-left: 0px; + color: white; + + img { + width: auto; + display: block; + margin: 0 auto; + } + } + + .header-con { + padding: 0px 10px; + width: 100%; + background: #fff; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.1); + margin-bottom: 5px; + } + + .main-content-con { + height: 100%; + overflow: hidden; + color: darkgray; + display: flex; + } + + .main-layout-con { + display: flex; + display: -webkit-flex; + overflow: hidden; + } + + .tag-nav-wrapper { + padding: 0; + height: 40px; + background: #f0f0f0; + } + + .content-wrapper { + padding: 0px 0.05rem; + height: ~"calc(100% - 40px)"; + display: flex; + display: -webkit-flex; + flex-direction: column; + overflow: auto; + } + + .left-sider { + .ivu-layout-sider-children { + overflow-y: scroll; + margin-right: -10px; + } + } +} + +.ivu-menu-item > i { + margin-right: 12px !important; +} + +.ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; +} + +.collased-menu-dropdown { + width: 100%; + margin: 0; + line-height: normal; + padding: 7px 0 6px 16px; + clear: both; + font-size: 12px !important; + white-space: nowrap; + list-style: none; + cursor: pointer; + transition: background 0.2s ease-in-out; + + &:hover { + background: rgba(100, 100, 100, 0.1); + } + + & * { + color: #515a6e; + } + + .ivu-menu-item > i { + margin-right: 12px !important; + } + + .ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { + margin-right: 8px !important; + } +} + +.ivu-select-dropdown.ivu-dropdown-transfer { + max-height: 400px; +} + +.police-box { + margin-left: 10px; + color: darkgoldenrod; + overflow: hidden; + height: 100%; + + span { + margin: 0px 5px; + } +} diff --git a/admin/src/components/main/main.vue b/admin/src/components/main/main.vue new file mode 100644 index 0000000..110d975 --- /dev/null +++ b/admin/src/components/main/main.vue @@ -0,0 +1,150 @@ + + + diff --git a/admin/src/components/main/pageHead.vue b/admin/src/components/main/pageHead.vue new file mode 100644 index 0000000..eafb256 --- /dev/null +++ b/admin/src/components/main/pageHead.vue @@ -0,0 +1,29 @@ + + + + \ No newline at end of file diff --git a/admin/src/components/markdown/index.js b/admin/src/components/markdown/index.js new file mode 100644 index 0000000..99e0cda --- /dev/null +++ b/admin/src/components/markdown/index.js @@ -0,0 +1,2 @@ +import MarkdownEditor from './markdown.vue' +export default MarkdownEditor diff --git a/admin/src/components/markdown/markdown.vue b/admin/src/components/markdown/markdown.vue new file mode 100644 index 0000000..d47a388 --- /dev/null +++ b/admin/src/components/markdown/markdown.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/admin/src/components/md-icons/icons.vue b/admin/src/components/md-icons/icons.vue new file mode 100644 index 0000000..68c9ff5 --- /dev/null +++ b/admin/src/components/md-icons/icons.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/admin/src/components/md-icons/index.js b/admin/src/components/md-icons/index.js new file mode 100644 index 0000000..bdc38b2 --- /dev/null +++ b/admin/src/components/md-icons/index.js @@ -0,0 +1,2 @@ +import Icons from './icons.vue' +export default Icons diff --git a/admin/src/components/parent-view/index.js b/admin/src/components/parent-view/index.js new file mode 100644 index 0000000..a959c65 --- /dev/null +++ b/admin/src/components/parent-view/index.js @@ -0,0 +1,2 @@ +import ParentView from './parent-view.vue' +export default ParentView diff --git a/admin/src/components/parent-view/parent-view.vue b/admin/src/components/parent-view/parent-view.vue new file mode 100644 index 0000000..37471ee --- /dev/null +++ b/admin/src/components/parent-view/parent-view.vue @@ -0,0 +1,18 @@ + + diff --git a/admin/src/components/paste-editor/index.js b/admin/src/components/paste-editor/index.js new file mode 100644 index 0000000..f02331a --- /dev/null +++ b/admin/src/components/paste-editor/index.js @@ -0,0 +1,2 @@ +import PasteEditor from './paste-editor.vue' +export default PasteEditor diff --git a/admin/src/components/paste-editor/paste-editor.less b/admin/src/components/paste-editor/paste-editor.less new file mode 100644 index 0000000..2ffd2bd --- /dev/null +++ b/admin/src/components/paste-editor/paste-editor.less @@ -0,0 +1,26 @@ +.paste-editor-wrapper{ + width: 100%; + height: 100%; + border: 1px dashed gainsboro; + textarea.textarea-el{ + width: 100%; + height: 100%; + } + .CodeMirror{ + height: 100%; + padding: 0; + .CodeMirror-code div .CodeMirror-line > span > span.cm-tab{ + &::after{ + content: '→'; + color: #BFBFBF; + } + } + } + .first-row{ + font-weight: 700; + font-size: 14px; + } + .incorrect-row{ + background: #F5CBD1; + } +} diff --git a/admin/src/components/paste-editor/paste-editor.vue b/admin/src/components/paste-editor/paste-editor.vue new file mode 100644 index 0000000..33071d2 --- /dev/null +++ b/admin/src/components/paste-editor/paste-editor.vue @@ -0,0 +1,120 @@ + + + diff --git a/admin/src/components/paste-editor/plugins/placeholder.js b/admin/src/components/paste-editor/plugins/placeholder.js new file mode 100644 index 0000000..26f75a1 --- /dev/null +++ b/admin/src/components/paste-editor/plugins/placeholder.js @@ -0,0 +1,61 @@ +export default codemirror => { + ;(function(mod) { + mod(codemirror) + })(function(CodeMirror) { + CodeMirror.defineOption('placeholder', '', function(cm, val, old) { + var prev = old && old !== CodeMirror.Init + if (val && !prev) { + cm.on('blur', onBlur) + cm.on('change', onChange) + cm.on('swapDoc', onChange) + onChange(cm) + } else if (!val && prev) { + cm.off('blur', onBlur) + cm.off('change', onChange) + cm.off('swapDoc', onChange) + clearPlaceholder(cm) + var wrapper = cm.getWrapperElement() + wrapper.className = wrapper.className.replace(' CodeMirror-empty', '') + } + + if (val && !cm.hasFocus()) onBlur(cm) + }) + + function clearPlaceholder(cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder) + cm.state.placeholder = null + } + } + function setPlaceholder(cm) { + clearPlaceholder(cm) + var elt = (cm.state.placeholder = document.createElement('pre')) + elt.style.cssText = 'height: 0; overflow: visible; color: #80848f;' + elt.style.direction = cm.getOption('direction') + elt.className = 'CodeMirror-placeholder' + var placeHolder = cm.getOption('placeholder') + if (typeof placeHolder === 'string') + placeHolder = document.createTextNode(placeHolder) + elt.appendChild(placeHolder) + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild) + } + + function onBlur(cm) { + if (isEmpty(cm)) setPlaceholder(cm) + } + function onChange(cm) { + let wrapper = cm.getWrapperElement() + let empty = isEmpty(cm) + wrapper.className = + wrapper.className.replace(' CodeMirror-empty', '') + + (empty ? ' CodeMirror-empty' : '') + + if (empty) setPlaceholder(cm) + else clearPlaceholder(cm) + } + + function isEmpty(cm) { + return cm.lineCount() === 1 && cm.getLine(0) === '' + } + }) +} diff --git a/admin/src/components/split-pane/index.js b/admin/src/components/split-pane/index.js new file mode 100644 index 0000000..f5ed60e --- /dev/null +++ b/admin/src/components/split-pane/index.js @@ -0,0 +1,2 @@ +import Split from './split.vue' +export default Split diff --git a/admin/src/components/split-pane/index.less b/admin/src/components/split-pane/index.less new file mode 100644 index 0000000..2583d90 --- /dev/null +++ b/admin/src/components/split-pane/index.less @@ -0,0 +1,114 @@ +@split-prefix-cls: ~"ivu-split"; +@box-shadow: 0 0 4px 0 rgba(28, 36, 56, 0.4); +@trigger-bar-background: rgba(23, 35, 61, 0.25); +@trigger-background: #F8F8F9; +@trigger-width: 6px; +@trigger-bar-width: 4px; +@trigger-bar-offset: (@trigger-width - @trigger-bar-width) / 2; +@trigger-bar-interval: 3px; +@trigger-bar-weight: 1px; +@trigger-bar-con-height: (@trigger-bar-weight + @trigger-bar-interval) * 8; + +.@{split-prefix-cls}{ + &-wrapper{ + position: relative; + width: 100%; + height: 100%; + } + &-pane{ + position: absolute; + &.left-pane, &.right-pane{ + top: 0px; + bottom: 0px; + } + &.left-pane{ + left: 0px; + } + &.right-pane{ + right: 0px; + } + &.top-pane, &.bottom-pane{ + left: 0px; + right: 0px; + } + &.top-pane{ + top: 0px; + } + &.bottom-pane{ + bottom: 0px; + } + } + &-trigger{ + &-con{ + position: absolute; + transform: translate(-50%, -50%); + z-index: 10; + } + &-bar-con{ + position: absolute; + overflow: hidden; + &.vertical{ + left: @trigger-bar-offset; + top: 50%; + height: @trigger-bar-con-height; + transform: translate(0, -50%); + } + &.horizontal{ + left: 50%; + top: @trigger-bar-offset; + width: @trigger-bar-con-height; + transform: translate(-50%, 0); + } + } + &-vertical{ + width: @trigger-width; + height: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: col-resize; + .@{split-prefix-cls}-trigger-bar{ + width: @trigger-bar-width; + height: 1px; + background: @trigger-bar-background; + float: left; + margin-top: @trigger-bar-interval; + } + } + &-horizontal{ + height: @trigger-width; + width: 100%; + background: @trigger-background; + box-shadow: @box-shadow; + cursor: row-resize; + .@{split-prefix-cls}-trigger-bar{ + height: @trigger-bar-width; + width: 1px; + background: @trigger-bar-background; + float: left; + margin-right: @trigger-bar-interval; + } + } + } + &-horizontal{ + .@{split-prefix-cls}-trigger-con{ + top: 50%; + height: 100%; + width: 0; + } + } + &-vertical{ + .@{split-prefix-cls}-trigger-con{ + left: 50%; + height: 0; + width: 100%; + } + } + .no-select{ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } +} diff --git a/admin/src/components/split-pane/split.vue b/admin/src/components/split-pane/split.vue new file mode 100644 index 0000000..a22cb40 --- /dev/null +++ b/admin/src/components/split-pane/split.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/admin/src/components/split-pane/trigger.vue b/admin/src/components/split-pane/trigger.vue new file mode 100644 index 0000000..0948fc3 --- /dev/null +++ b/admin/src/components/split-pane/trigger.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/admin/src/components/tables/editModal.vue b/admin/src/components/tables/editModal.vue new file mode 100644 index 0000000..ff66a54 --- /dev/null +++ b/admin/src/components/tables/editModal.vue @@ -0,0 +1,240 @@ + + + diff --git a/admin/src/components/tables/fieldItem.vue b/admin/src/components/tables/fieldItem.vue new file mode 100644 index 0000000..c1f8908 --- /dev/null +++ b/admin/src/components/tables/fieldItem.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/admin/src/components/tables/index.vue b/admin/src/components/tables/index.vue new file mode 100644 index 0000000..e1bef57 --- /dev/null +++ b/admin/src/components/tables/index.vue @@ -0,0 +1,199 @@ + + + + diff --git a/admin/src/components/tables/templateRender.js b/admin/src/components/tables/templateRender.js new file mode 100644 index 0000000..3ed3642 --- /dev/null +++ b/admin/src/components/tables/templateRender.js @@ -0,0 +1,9 @@ +export default { + name: 'templateRender', + props: ['render', 'value'], + functional: true, + render: (h, ctx) => { + const params = ctx.props.value + return ctx.props.render(h, params) + }, +} \ No newline at end of file diff --git a/admin/src/components/textArea/index.vue b/admin/src/components/textArea/index.vue new file mode 100644 index 0000000..dce3920 --- /dev/null +++ b/admin/src/components/textArea/index.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/admin/src/components/treeGrid/component/renderCol.vue b/admin/src/components/treeGrid/component/renderCol.vue new file mode 100644 index 0000000..9657b2f --- /dev/null +++ b/admin/src/components/treeGrid/component/renderCol.vue @@ -0,0 +1,14 @@ + diff --git a/admin/src/components/treeGrid/component/subColmns.vue b/admin/src/components/treeGrid/component/subColmns.vue new file mode 100644 index 0000000..fd67f0f --- /dev/null +++ b/admin/src/components/treeGrid/component/subColmns.vue @@ -0,0 +1,11 @@ + + + diff --git a/admin/src/components/treeGrid/component/subThead.vue b/admin/src/components/treeGrid/component/subThead.vue new file mode 100644 index 0000000..9678df4 --- /dev/null +++ b/admin/src/components/treeGrid/component/subThead.vue @@ -0,0 +1,18 @@ + + + + diff --git a/admin/src/components/treeGrid/component/subTreeGrid.vue b/admin/src/components/treeGrid/component/subTreeGrid.vue new file mode 100644 index 0000000..0c9eaeb --- /dev/null +++ b/admin/src/components/treeGrid/component/subTreeGrid.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/admin/src/components/treeGrid/index.vue b/admin/src/components/treeGrid/index.vue new file mode 100644 index 0000000..21b4865 --- /dev/null +++ b/admin/src/components/treeGrid/index.vue @@ -0,0 +1,44 @@ + + + + diff --git a/admin/src/config/icons.json b/admin/src/config/icons.json new file mode 100644 index 0000000..39d6b0e --- /dev/null +++ b/admin/src/config/icons.json @@ -0,0 +1,302 @@ +[ + "md-add", + "md-add-circle", + "md-alarm", + "md-albums", + "md-alert", + "md-american-football", + "md-analytics", + "md-aperture", + "md-apps", + "md-appstore", + "md-archive", + "md-arrow-back", + "md-arrow-down", + "md-arrow-dropdown", + "md-arrow-dropdown-circle", + "md-arrow-dropleft", + "md-arrow-dropleft-circle", + "md-arrow-dropright", + "md-arrow-dropright-circle", + "md-arrow-dropup", + "md-arrow-dropup-circle", + "md-arrow-forward", + "md-arrow-round-back", + "md-arrow-round-down", + "md-arrow-round-forward", + "md-arrow-round-up", + "md-arrow-up", + "md-at", + "md-attach", + "md-backspace", + "md-barcode", + "md-baseball", + "md-basket", + "md-basketball", + "md-battery-charging", + "md-battery-dead", + "md-battery-full", + "md-beaker", + "md-beer", + "md-bicycle", + "md-bluetooth", + "md-boat", + "md-body", + "md-bonfire", + "md-book", + "md-bookmark", + "md-bookmarks", + "md-bowtie", + "md-briefcase", + "md-browsers", + "md-brush", + "md-bug", + "md-build", + "md-bulb", + "md-bus", + "md-cafe", + "md-calculator", + "md-calendar", + "md-call", + "md-camera", + "md-car", + "md-card", + "md-cart", + "md-cash", + "md-chatboxes", + "md-chatbubbles", + "md-checkbox", + "md-checkbox-outline", + "md-checkmark", + "md-checkmark-circle", + "md-checkmark-circle-outline", + "md-clipboard", + "md-clock", + "md-close", + "md-close-circle", + "md-closed-captioning", + "md-cloud", + "md-cloud-circle", + "md-cloud-done", + "md-cloud-download", + "md-cloud-outline", + "md-cloud-upload", + "md-cloudy", + "md-cloudy-night", + "md-code", + "md-code-download", + "md-code-working", + "md-cog", + "md-color-fill", + "md-color-filter", + "md-color-palette", + "md-color-wand", + "md-compass", + "md-construct", + "md-contact", + "md-contacts", + "md-contract", + "md-contrast", + "md-copy", + "md-create", + "md-crop", + "md-cube", + "md-cut", + "md-desktop", + "md-disc", + "md-document", + "md-done-all", + "md-download", + "md-easel", + "md-egg", + "md-exit", + "md-expand", + "md-eye", + "md-eye-off", + "md-fastforward", + "md-female", + "md-filing", + "md-film", + "md-finger-print", + "md-flag", + "md-flame", + "md-flash", + "md-flask", + "md-flower", + "md-folder", + "md-folder-open", + "md-football", + "md-funnel", + "md-game-controller-a", + "md-game-controller-b", + "md-git-branch", + "md-git-commit", + "md-git-compare", + "md-git-merge", + "md-git-network", + "md-git-pull-request", + "md-glasses", + "md-globe", + "md-grid", + "md-hammer", + "md-hand", + "md-happy", + "md-headset", + "md-heart", + "md-heart-outline", + "md-help", + "md-help-buoy", + "md-help-circle", + "md-home", + "md-ice-cream", + "md-image", + "md-images", + "md-infinite", + "md-information", + "md-information-circle", + "md-ionic", + "md-ionitron", + "md-jet", + "md-key", + "md-keypad", + "md-laptop", + "md-leaf", + "md-link", + "md-list", + "md-list-box", + "md-locate", + "md-lock", + "md-log-in", + "md-log-out", + "md-magnet", + "md-mail", + "md-mail-open", + "md-male", + "md-man", + "md-map", + "md-medal", + "md-medical", + "md-medkit", + "md-megaphone", + "md-menu", + "md-mic", + "md-mic-off", + "md-microphone", + "md-moon", + "md-more", + "md-move", + "md-musical-note", + "md-musical-notes", + "md-navigate", + "md-no-smoking", + "md-notifications", + "md-notifications-off", + "md-notifications-outline", + "md-nuclear", + "md-nutrition", + "md-open", + "md-options", + "md-outlet", + "md-paper", + "md-paper-plane", + "md-partly-sunny", + "md-pause", + "md-paw", + "md-people", + "md-person", + "md-person-add", + "md-phone-landscape", + "md-phone-portrait", + "md-photos", + "md-pie", + "md-pin", + "md-pint", + "md-pizza", + "md-plane", + "md-planet", + "md-play", + "md-podium", + "md-power", + "md-pricetag", + "md-pricetags", + "md-print", + "md-pulse", + "md-qr-scanner", + "md-quote", + "md-radio", + "md-radio-button-off", + "md-radio-button-on", + "md-rainy", + "md-recording", + "md-redo", + "md-refresh", + "md-refresh-circle", + "md-remove", + "md-remove-circle", + "md-reorder", + "md-repeat", + "md-resize", + "md-restaurant", + "md-return-left", + "md-return-right", + "md-reverse-camera", + "md-rewind", + "md-ribbon", + "md-rose", + "md-sad", + "md-school", + "md-search", + "md-send", + "md-settings", + "md-share", + "md-share-alt", + "md-shirt", + "md-shuffle", + "md-skip-backward", + "md-skip-forward", + "md-snow", + "md-speedometer", + "md-square", + "md-square-outline", + "md-star", + "md-star-half", + "md-star-outline", + "md-stats", + "md-stopwatch", + "md-subway", + "md-sunny", + "md-swap", + "md-switch", + "md-sync", + "md-tablet-landscape", + "md-tablet-portrait", + "md-tennisball", + "md-text", + "md-thermometer", + "md-thumbs-down", + "md-thumbs-up", + "md-thunderstorm", + "md-time", + "md-timer", + "md-train", + "md-transgender", + "md-trash", + "md-trending-down", + "md-trending-up", + "md-trophy", + "md-umbrella", + "md-undo", + "md-unlock", + "md-videocam", + "md-volume-down", + "md-volume-mute", + "md-volume-off", + "md-volume-up", + "md-walk", + "md-warning", + "md-watch", + "md-water", + "md-wifi", + "md-wine", + "md-woman" +] \ No newline at end of file diff --git a/admin/src/config/index.js b/admin/src/config/index.js new file mode 100644 index 0000000..6207898 --- /dev/null +++ b/admin/src/config/index.js @@ -0,0 +1,27 @@ +const config = require("../../../config/config"); +let nodePort = config.port.node || 9090; + +let env = process.env.VUE_APP_ENV || process.env.NODE_ENV; + +let apiUrl = `http://localhost:${nodePort}/admin_api/`; +if (env === "sit") { + apiUrl = "https://auto.light120.com/admin_api/"; +} else if (env === "production") { + apiUrl = "https://auto.light120.com/admin_api/"; +} + +module.exports = { + title: "自动生成管理系统", + homeName: "首页", + apiUrl, + cookieExpires: 1, + uploadMaxLimitSize: 10, //10g + oss: { + region: "oss-cn-beijing", + accessKeyId: "LTAI5tQVZhfnccgXiCkMNZho", + accessKeySecret: "TA4j4cLYdRTDIWBc0DGoSNstSDW5CY", + bucket: "light22600", + url: "http://light22600.oss-cn-beijing.aliyuncs.com", + basePath: "front/plug/" + } +}; diff --git a/admin/src/libs/funTool.js b/admin/src/libs/funTool.js new file mode 100644 index 0000000..bc50067 --- /dev/null +++ b/admin/src/libs/funTool.js @@ -0,0 +1,201 @@ +import dayjs from 'dayjs' +export default class funTool { + static IsNullorEmpty(obj) { + if (typeof obj === 'undefined' || obj == null || obj === '') { + return true + } + return false + } + + // 设置Cookie + static setCookie(name, value) { + var exdate = new Date() + var expiredays = 7 + exdate.setDate(exdate.getDate() + expiredays) + document.cookie = + name + + '=' + + escape(value) + + (expiredays == null ? '' : ';expires=' + exdate.toGMTString()) + } + + // 读取cookie + static getCookie(name) { + if (document.cookie.length > 0) { + var c_start = document.cookie.indexOf(name + '=') + if (c_start !== -1) { + c_start = c_start + name.length + 1 + var c_end = document.cookie.indexOf(';', c_start) + if (c_end === -1) c_end = document.cookie.length + return unescape(document.cookie.substring(c_start, c_end)) + } + } + return '' + } + + static getCheckString(value) { + let curTemp = !funTool.IsNullorEmpty(value) ? value : '' + return curTemp + } + + static generateUUID() { + var d = new Date().getTime() + if (window.performance && typeof window.performance.now === 'function') { + d += performance.now() // use high-precision timer if available + } + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( + /[xy]/g, + function(c) { + var r = (d + Math.random() * 16) % 16 | 0 + d = Math.floor(d / 16) + return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16) + } + ) + return uuid + } + + static toJson(data) { + return JSON.parse(JSON.stringify(data)) + } + + // 图片验证码 + static createCode() { + var code = '' + var codeLength = 4 // 验证码的长度 + // eslint-disable-next-line no-array-constructor + var random = + '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]' // 随机数 + random = JSON.parse(random) // 随机数 + for (var i = 0; i < codeLength; i++) { + // 循环操作 + var index = Math.floor(Math.random() * 36) // 取得随机数的索引(0~35) + code += random[index] // 根据索引取得随机数加到code上 + } + return code + } + + static removeEmptyObject(data) { + data = data || {} + for (let index in data) { + if (data[index] === '' || data[index] === '全部') { + delete data[index] + } + } + return data + } + + static formatDate(val, fmt) { + val = val || new Date() + + if (!funTool.IsNullorEmpty(val)) { + fmt = fmt || 'YYYY-MM-DD' + if (!val.getDate) { + val = new Date(val) + } + var date = dayjs(val).format(fmt) + return date + } + return val + } + + static getComponentHeight(diffHegiht) { + let curBodyHeight = document.documentElement.clientHeight + let height = curBodyHeight - diffHegiht + return height + } + + static showMainLoad() { + var div = '
' + if ($('body .loadPop').length === 0) { + $('body').append(div) + } + } + + static hideMainLoad() { + setTimeout(() => { + $('.loadPop').remove() + }, 600) + } + + static showLoad() { + var div = + '
' + if ($('body .loadLeftPop').length === 0) { + $('body').append(div) + } + } + + static hideLoad() { + setTimeout(() => { + $('body .loadLeftPop').remove() + }, 600) + } + + /** + * 取得url参数 + */ + static getUrlParam(key) { + var index = window.location.href.indexOf('?') + 1 + var reg = new RegExp('(^|&)' + key + '=([^&]*)(&|$)') // 构造一个含有目标参数的正则表达式对象 + var r = window.location.href.substr(index).match(reg) // 匹配目标参数 + if (r != null) return unescape(r[2]) + return null // 返回参数值 + } + + // 获取两者之间的整数 + static getRandomNum(minNum, maxNum) { + switch (arguments.length) { + case 1: + return parseInt(Math.random() * minNum + 1, 10) + case 2: + return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10) + default: + return 0 + } + } + + // 颠倒数组顺序 + static reverse(arr) { + // 初始化数组并定义长度 + let arrResult = [] + let j = 0 // 新数组的下标 + // 通过循环替换数据 + for (let i = arr.length - 1; i >= 0; i--, j++) { + arrResult[j] = arr[i] + } + return arrResult + } + + static isObjectEqual(a, b) { + let isEqual = true + + for (var key in a) { + if (a[key] !== b[key]) { + isEqual = false + break + } + } + return isEqual + } + + static downloadImg(url, name) { + const aLink = document.createElement('a') + aLink.download = name + aLink.href = url + aLink.dispatchEvent(new MouseEvent('click', {})) + } + + static dictionaries(key) { + let str = '' + if (key === 1) { + str = '-BIGUSER' + } + return str + } + + static isDate(date) { + var reDateTime = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/ + var isDateTime = reDateTime.test(date) + return isDateTime + } +} \ No newline at end of file diff --git a/admin/src/libs/http.js b/admin/src/libs/http.js new file mode 100644 index 0000000..5df6ec7 --- /dev/null +++ b/admin/src/libs/http.js @@ -0,0 +1,207 @@ +import axios from "axios"; +import store from "@/store"; +import funTool from "./funTool"; +import config from "@/config"; + +const axiosLoad = { + show: () => { + let loadWarp = document.getElementById("load-warp"); + if (loadWarp) { + loadWarp.style.display = "block"; + } + }, + hide: () => { + let loadWarp = document.getElementById("load-warp"); + if (loadWarp) { + loadWarp.style.display = "none"; + } + } +}; + +class Http { + static baseUrl() { + return config.apiUrl; + } + + static ImgSrc(src) { + return Http.baseUrl() + src; + } + + static getHttpInstance(config) { + let defaultConfig = { + timeout: 300000, + // withCredentials: true, + headers: {}, + baseURL: Http.baseUrl(), + dataponseType: "json", // default + transformdataponse: [ + function (data) { + // 在这里根据自己的需求改变数据 + return data; + } + ] + }; + let newConfig = Object.assign({}, defaultConfig, config); + + newConfig.headers["admin-token"] = store.state.user.token; + newConfig.headers["admin-project"] = store.state.app.projectId; + let instance = axios.create(newConfig); + + // 请求过滤 + instance.interceptors.request.use( + config => { + return config; + }, + error => { + return Promise.reject(error); + } + ); + + // 响应过滤 + instance.interceptors.response.use( + response => { + if (response.status === 200) { + if (response.data && response.data.code === 0) { + return response; + } else { + axiosLoad.hide(); + let msg = response.data.message; + window.rootVue.$Message.error({ content: msg, duration: 3 }); + return Promise.reject(msg); + } + } else { + axiosLoad.hide(); + return Promise.reject(error); + } + }, + error => { + axiosLoad.hide(); + + if (error && error.response && error.response.status === 401) { + store.commit("user/setToken", ""); + window.rootVue.$router.push({ + name: "login" // 跳转到homeName页 + }); + return Promise.reject(error); + } + + let msg = error.message; + if (msg.indexOf("Network Error") > -1) { + msg = "网络错误,请刷新后重试"; + } else if (msg.indexOf("timeout of") > -1) { + msg = "请求超时,请稍后后重试"; + } + window.rootVue.$Message.error({ content: msg, duration: 3 }); + return Promise.reject(error); + } + ); + + return instance; + } + + static formatParamete(param) { + param = param || {}; + + // param = funTool.removeEmptyObject(param); + + // 格式化时间字符串 + if (param) { + for (let key in param) { + if (param[key] && param[key].getFullYear) { + param[key] = funTool.formatDate(param[key], "YYYY-MM-DD HH:mm:ss"); + } + } + } + + param = JSON.parse(JSON.stringify(param)); + + return param; + } + + // 格式化FormData参数 + static formatFormDataParam(param) { + let formData = new FormData(); + + Object.keys(param).forEach(key => { + formData.append(key, param[key]); + }); + + return formData; + } + + getBaseUrl(src) { + return Http.baseUrl() + src; + } + + async get(url, param, config) { + let instance = Http.getHttpInstance(); + param = Http.formatParamete(param); + let promise = new Promise(function (resolve, reject) { + if (!config || !config.hideLoad) { + axiosLoad.show(); + } + + instance.get(url, { params: param }).then(async respnose => { + axiosLoad.hide(); + resolve(respnose.data); + }); + }); + + return promise; + } + + async postFormData(url, data) { + let instance = Http.getHttpInstance({ + headers: { "Content-Type": "application/x-www-form-urlencoded" } + }); + let param = Http.formatFormDataParam(data); + let promise = new Promise(function (resolve, reject) { + instance.post(url, param).then(respnose => { + axiosLoad.hide(); + resolve(respnose.data); + }); + }); + return promise; + } + + async post(url, param, config) { + let instance = Http.getHttpInstance(config); + param = Http.formatParamete(param); + + let promise = new Promise(function (resolve, reject) { + axiosLoad.show(); + instance.post(url, param).then(respnose => { + axiosLoad.hide(); + resolve(respnose.data); + }); + }); + + return promise; + } + + async fileExport(url, param) { + let formData = Http.formatFormDataParam(param); + + let config = { + headers: { + "admin-token": store.state.user.token, + "Content-Type": "application/json" + }, + baseURL: Http.baseUrl(), + url: url, + responseType: "blob" + }; + let res = await axios.post(url, formData, config); + const filename = res.headers.filename; + const a = document.createElement("a"); + const href = window.URL.createObjectURL(res.data); + a.href = href; + a.download = filename; + a.click(); + window.URL.revokeObjectURL(url); + } +} + +const http = new Http(); + +export default http; diff --git a/admin/src/libs/ossTool.js b/admin/src/libs/ossTool.js new file mode 100644 index 0000000..c60d250 --- /dev/null +++ b/admin/src/libs/ossTool.js @@ -0,0 +1,25 @@ +import config from "@/config"; +import OSS from "ali-oss"; +import userServer from "@/api/system/userServer"; +class OssTool { + async getClient() { + let { region, bucket } = config.oss; + let { accessKeyId, accessKeySecret, } = config.oss; + + let client = new OSS({ region, accessKeyId, accessKeySecret, bucket, }); + + return client; + } + + async getStsClient() { + let res = await userServer.getOssSts() + let { accessKeyId, accessKeySecret, securityToken } = res.data + let { region, bucket } = config.oss; + let client = new OSS({ region, accessKeyId, accessKeySecret, stsToken: securityToken, bucket, }); + return client; + } +} + +const ossTool = new OssTool(); + +export default ossTool; diff --git a/admin/src/libs/socketTool.js b/admin/src/libs/socketTool.js new file mode 100644 index 0000000..c35bf26 --- /dev/null +++ b/admin/src/libs/socketTool.js @@ -0,0 +1,48 @@ +import { mapMutations } from 'vuex' + +let ws = null + +let app = { + ...mapMutations(['setAlarms']) +} + +export default class socketTool { + static init() { + if (ws == null) { + try { + window.rootVue.setAlarms = app.setAlarms + ws = new WebSocket(window.global.config.socketUrl + 'Home/CreateSocket') + + ws.onopen = function() { + console.log('WebSocket连接成功!') + } + ws.onmessage = function(res) { + console.log('推送数据:' + res.data) + window.rootVue.setAlarms() + } + ws.onerror = function(error) { + console.log('WebSocket连接失败,错误:' + error) + } + ws.onclose = function() { + console.log('WebSocket连接关闭!') + } + } catch (e) { + console.warn(e) + } + } + } + + // 发送数据到后端 + static send(msg) { + if (ws.readyState === WebSocket.OPEN) { + ws.send(msg) + } else { + console.warn('WebSocket连接已关闭!') + } + } + + // 关闭Socket + static close() { + ws.close() + } +} diff --git a/admin/src/libs/tools.js b/admin/src/libs/tools.js new file mode 100644 index 0000000..4b83a49 --- /dev/null +++ b/admin/src/libs/tools.js @@ -0,0 +1,244 @@ +export const forEach = (arr, fn) => { + if (!arr.length || !fn) return + let i = -1 + let len = arr.length + while (++i < len) { + let item = arr[i] + fn(item, i, arr) + } +} + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的交集, 两个数组的元素为数值或字符串 + */ +export const getIntersection = (arr1, arr2) => { + let len = Math.min(arr1.length, arr2.length) + let i = -1 + let res = [] + while (++i < len) { + const item = arr2[i] + if (arr1.indexOf(item) > -1) res.push(item) + } + return res +} + +/** + * @param {Array} arr1 + * @param {Array} arr2 + * @description 得到两个数组的并集, 两个数组的元素为数值或字符串 + */ +export const getUnion = (arr1, arr2) => { + return Array.from(new Set([...arr1, ...arr2])) +} + +/** + * @param {Array} target 目标数组 + * @param {Array} arr 需要查询的数组 + * @description 判断要查询的数组是否至少有一个元素包含在目标数组中 + */ +export const hasOneOf = (targetarr, arr) => { + return targetarr.some(_ => arr.indexOf(_) > -1) +} + +/** + * @param {String|Number} value 要验证的字符串或数值 + * @param {*} validList 用来验证的列表 + */ +export function oneOf(value, validList) { + for (let i = 0; i < validList.length; i++) { + if (value === validList[i]) { + return true + } + } + return false +} + +/** + * @param {Number} timeStamp 判断时间戳格式是否是毫秒 + * @returns {Boolean} + */ +const isMillisecond = timeStamp => { + const timeStr = String(timeStamp) + return timeStr.length > 10 +} + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} currentTime 当前时间时间戳 + * @returns {Boolean} 传入的时间戳是否早于当前时间戳 + */ +const isEarly = (timeStamp, currentTime) => { + return timeStamp < currentTime +} + +/** + * @param {Number} num 数值 + * @returns {String} 处理后的字符串 + * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0 + */ +const getHandledValue = num => { + return num < 10 ? '0' + num : num +} + +/** + * @param {Number} timeStamp 传入的时间戳 + * @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间 + */ +const getDate = (timeStamp, startType) => { + const d = new Date(timeStamp * 1000) + const year = d.getFullYear() + const month = getHandledValue(d.getMonth() + 1) + const date = getHandledValue(d.getDate()) + const hours = getHandledValue(d.getHours()) + const minutes = getHandledValue(d.getMinutes()) + const second = getHandledValue(d.getSeconds()) + let resStr = '' + if (startType === 'year') + resStr = + year + + '-' + + month + + '-' + + date + + ' ' + + hours + + ':' + + minutes + + ':' + + second + else resStr = month + '-' + date + ' ' + hours + ':' + minutes + return resStr +} + +/** + * @param {String|Number} timeStamp 时间戳 + * @returns {String} 相对时间字符串 + */ +export const getRelativeTime = timeStamp => { + // 判断当前传入的时间戳是秒格式还是毫秒 + const IS_MILLISECOND = isMillisecond(timeStamp) + // 如果是毫秒格式则转为秒格式 + if (IS_MILLISECOND) Math.floor((timeStamp /= 1000)) + // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型 + timeStamp = Number(timeStamp) + // 获取当前时间时间戳 + const currentTime = Math.floor(Date.parse(new Date()) / 1000) + // 判断传入时间戳是否早于当前时间戳 + const IS_EARLY = isEarly(timeStamp, currentTime) + // 获取两个时间戳差值 + let diff = currentTime - timeStamp + // 如果IS_EARLY为false则差值取反 + if (!IS_EARLY) diff = -diff + let resStr = '' + const dirStr = IS_EARLY ? '前' : '后' + // 少于等于59秒 + if (diff <= 59) resStr = diff + '秒' + dirStr + // 多于59秒,少于等于59分钟59秒 + else if (diff > 59 && diff <= 3599) + resStr = Math.floor(diff / 60) + '分钟' + dirStr + // 多于59分钟59秒,少于等于23小时59分钟59秒 + else if (diff > 3599 && diff <= 86399) + resStr = Math.floor(diff / 3600) + '小时' + dirStr + // 多于23小时59分钟59秒,少于等于29天59分钟59秒 + else if (diff > 86399 && diff <= 2623859) + resStr = Math.floor(diff / 86400) + '天' + dirStr + // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前 + else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) + resStr = getDate(timeStamp) + else resStr = getDate(timeStamp, 'year') + return resStr +} + +/** + * @returns {String} 当前浏览器名称 + */ +export const getExplorer = () => { + const ua = window.navigator.userAgent + const isExplorer = exp => { + return ua.indexOf(exp) > -1 + } + if (isExplorer('MSIE')) return 'IE' + else if (isExplorer('Firefox')) return 'Firefox' + else if (isExplorer('Chrome')) return 'Chrome' + else if (isExplorer('Opera')) return 'Opera' + else if (isExplorer('Safari')) return 'Safari' +} + +/** + * @description 绑定事件 on(element, event, handler) + */ +export const on = (function() { + if (document.addEventListener) { + return function(element, event, handler) { + if (element && event && handler) { + element.addEventListener(event, handler, false) + } + } + } else { + return function(element, event, handler) { + if (element && event && handler) { + element.attachEvent('on' + event, handler) + } + } + } +})() + +/** + * @description 解绑事件 off(element, event, handler) + */ +export const off = (function() { + if (document.removeEventListener) { + return function(element, event, handler) { + if (element && event) { + element.removeEventListener(event, handler, false) + } + } + } else { + return function(element, event, handler) { + if (element && event) { + element.detachEvent('on' + event, handler) + } + } + } +})() + +/** + * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性 + * 如果没有传入key这个参数,则判断obj对象是否有键值对 + */ +export const hasKey = (obj, key) => { + if (key) return key in obj + else { + let keysArr = Object.keys(obj) + return keysArr.length + } +} + +/** + * @param {*} obj1 对象 + * @param {*} obj2 对象 + * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串 + */ +export const objEqual = (obj1, obj2) => { + const keysArr1 = Object.keys(obj1) + const keysArr2 = Object.keys(obj2) + if (keysArr1.length !== keysArr2.length) return false + else if (keysArr1.length === 0 && keysArr2.length === 0) return true + /* eslint-disable-next-line */ else + return !keysArr1.some(key => obj1[key] !== obj2[key]) +} + +export const downStream = res => { + const fileName = new Date().getTime() + '.xlsx' + let blob = new Blob([res.data]) + let downloadElement = document.createElement('a') + let href = window.URL.createObjectURL(blob) // 创建下载的链接 + downloadElement.href = href + downloadElement.download = fileName // 下载后文件名 + document.body.appendChild(downloadElement) + downloadElement.click() // 点击下载 + document.body.removeChild(downloadElement) // 下载完成移除元素 + window.URL.revokeObjectURL(href) // 释放掉blob对象 +} diff --git a/admin/src/libs/uiTool.js b/admin/src/libs/uiTool.js new file mode 100644 index 0000000..49c4489 --- /dev/null +++ b/admin/src/libs/uiTool.js @@ -0,0 +1,199 @@ +import http from "../libs/http"; + +import Main from "@/components/main"; +import parentView from "@/components/parent-view"; +import page404 from "@/view/error-page/404.vue"; + +export default class uiTool { + static setRem() { + let whdef = 100 / 1920; // 表示1920的设计图,使用100PX的默认值 + let bodyWidth = document.body.clientWidth; // 当前窗口的宽度 + if (bodyWidth < 1360) { + bodyWidth = 1360; + } + + let rem = bodyWidth * whdef; // 以默认比例值乘以当前窗口宽度,得到该宽度下的相应FONT-SIZE值 + document.documentElement.style.fontSize = rem + "px"; + console.log("自适应html字体大小", parseInt(rem)); + console.log("自适应缩放比列", (rem / 100).toFixed(3)); + window.$whdef = rem; + } + + // 获取图片路径 + static getImgSrc(src) { + if (src) { + return http.baseUrl() + src; + } else { + return "/assets/img/noImg.png"; + } + } + + static getBtn(h, options) { + let rets = []; + if (!options) { + options = [options]; + } + + options.forEach(item => { + rets.push( + h( + "Button", + { + props: { + type: "text", + ghost: true, + loading: item.loading + }, + style: { + margin: "2px", + color: "#2d8cf0" + }, + on: { + click: () => { + item.click && item.click(); + } + } + }, + item.title + ) + ); + }); + + return h("div", { style: { margin: "5px" } }, rets); + } + + // 下拉 + static getDropdown(h, items) { + let btns = []; + if (items && items.length > 0) { + items.forEach(item => { + btns.push( + h( + "DropdownItem", + { + on: { + click: () => { + item.click && item.click(); + } + } + }, + item.title + ) + ); + }); + } + + return h("Dropdown", {}, [ + h("a", {}, ["更多", h("Icon", { props: { type: "ios-arrow-down" } })]), + h("DropdownMenu", { slot: "list" }, btns) + ]); + } + + // 删除确认层 + static delConfirm(callback) { + window.rootVue.$Modal.confirm({ + title: "温馨提示", + content: "

你确定删除吗?

", + onOk: () => { + callback && callback(); + } + }); + } + + // 删除确认层 + static showConfirm({ title = "温馨提示", content = "内容" }, callback) { + window.rootVue.$Modal.confirm({ + title, + content, + onOk: () => { + callback && callback(); + } + }); + } + + static subTree(curTree, tree, callback) { + if (curTree && curTree.length > 0) { + curTree.forEach(p => { + let childrenTree = tree.filter(p2 => p.id === p2.parent_id); + if (childrenTree) { + let subTree = uiTool.subTree(childrenTree, tree, callback); + p.children = subTree || []; + } + }); + + if (callback) { + return curTree.map(p => { + return callback(p); + }); + } + + return curTree; + } + + return []; + } + + static transformTree(tree, callback) { + let rootTree = tree.filter(p => p.parent_id === 0); + let curTrees = uiTool.subTree(rootTree, tree, callback); + return curTrees; + } + + static menuToRoute(menus) { + if (menus && menus.length > 0) { + menus.forEach(item => { + if (item.type === "菜单") { + item.component = parentView; + } else if (item.type === "页面" || item.type === "功能") { + try { + let componentName = item.component; + item.component = () => import("@/view/" + componentName); + } catch (e) { + item.component = page404; + } + } else { + item.component = parentView; + } + + item.meta = { + icon: item.icon, + isMenu: item.is_show_menu, + type: item.type + }; + + if (item.children && item.children.length > 0) { + item.children = uiTool.menuToRoute(item.children); + } + }); + return menus; + } + return []; + } + + static getRoutes() { + let mainRoute = { + path: "/", + name: "主视图", + redirect: "/home", + component: Main, + meta: { title: "首页", notCache: true }, + children: [] + }; + + if ( + localStorage.authorityMenus && + localStorage.authorityMenus !== "undefined" + ) { + let authorityMenus = JSON.parse(localStorage.authorityMenus) || []; + + if (authorityMenus && authorityMenus.length > 0) { + let menus = uiTool.transformTree(authorityMenus); + let curRoutes = uiTool.menuToRoute(menus); + + mainRoute.children = curRoutes; + } + } + + return mainRoute; + } +} diff --git a/admin/src/libs/util.js b/admin/src/libs/util.js new file mode 100644 index 0000000..78bd5ae --- /dev/null +++ b/admin/src/libs/util.js @@ -0,0 +1,421 @@ +import Cookies from "js-cookie"; +import config from "@/config"; +import { forEach, hasOneOf, objEqual } from "@/libs/tools"; +const { title, cookieExpires } = config; + +export const TOKEN_KEY = "token"; +export const MENU_KEY = "authoritymenu"; +export const PROJECT_kEY = "project_id"; + +export const setToken = token => { + Cookies.set(TOKEN_KEY, token, { + expires: cookieExpires || 7 + }); +}; + +export const getToken = () => { + const token = Cookies.get(TOKEN_KEY); + if (token) { + return token; + } else { + return false; + } +}; + +export const hasChild = item => { + return item.children && item.children.length !== 0; +}; + +const showThisMenuEle = (item, access) => { + if (item.meta && item.meta.access && item.meta.access.length) { + if (hasOneOf(item.meta.access, access)) return true; + else return false; + } else return true; +}; +/** + * @param {Array} list 通过路由列表得到菜单列表 + * @returns {Array} + */ +export const getMenuByRouter = (list, access) => { + let res = []; + forEach(list, item => { + if (!item.meta || (item.meta && !item.meta.hideInMenu)) { + let obj = { + icon: (item.meta && item.meta.icon) || "", + name: item.name, + meta: item.meta + }; + if ( + (hasChild(item) || (item.meta && item.meta.showAlways)) && + showThisMenuEle(item, access) + ) { + obj.children = getMenuByRouter(item.children, access); + } + if (item.meta && item.meta.href) obj.href = item.meta.href; + if (showThisMenuEle(item, access)) res.push(obj); + } + }); + return res; +}; + +/** + * @param {Array} routeMetched 当前路由metched + * @returns {Array} + */ +export const getBreadCrumbList = (route, homeRoute) => { + let routeMetched = route.matched; + + let res = routeMetched + .filter(item => { + return item.meta === undefined || !item.meta.hideInBread; + }) + .map(item => { + let meta = { + ...item.meta + }; + if (meta.title && typeof meta.title === "function") { + meta.__titleIsFunction__ = true; + meta.title = meta.title(route); + } + let obj = { + icon: (item.meta && item.meta.icon) || "", + name: item.name, + meta: meta + }; + + if (item.name === homeRoute.name) { + obj.to = homeRoute.path; + } + return obj; + }); + + res = res.filter(item => { + return !item.meta.hideInMenu; + }); + + res.splice(0, 1); // 删除最顶级模板页 + + return [...res]; +}; + +export const getRouteTitleHandled = route => { + let router = { + ...route + }; + let meta = { + ...route.meta + }; + let title = ""; + if (meta.title) { + if (typeof meta.title === "function") { + meta.__titleIsFunction__ = true; + title = meta.title(router); + } else title = meta.title; + } + meta.title = title; + router.meta = meta; + return router; +}; + +export const showTitle = (item, vm) => { + let title = item.name; + if (!title) return; + return title; +}; + +/** + * @description 本地存储和获取标签导航列表 + */ +export const setTagNavListInLocalstorage = list => { + localStorage.tagNaveList = JSON.stringify(list); +}; +/** + * @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项 + */ +export const getTagNavListFromLocalstorage = () => { + const list = localStorage.tagNaveList; + return list ? JSON.parse(list) : []; +}; + +/** + * @param {Array} routers 路由列表数组 + * @description 用于找到路由列表中name为home的对象 + */ +export const getHomeRoute = (routers, homeName = "home") => { + let homeRoute = routers.find(item => { + return item.name === homeName; + }); + delete homeRoute.children; + delete homeRoute.component; + return homeRoute; +}; + +/** + * @param {*} list 现有标签导航列表 + * @param {*} newRoute 新添加的路由原信息对象 + * @description 如果该newRoute已经存在则不再添加 + */ +export const getNewTagList = (list, newRoute) => { + const { name, path, meta } = newRoute; + let newList = [...list]; + if (newList.findIndex(item => item.name === name) >= 0) return newList; + else { + newList.push({ + name, + path, + meta + }); + } + return newList; +}; + +/** + * @param {*} access 用户权限数组,如 ['super_admin', 'admin'] + * @param {*} route 路由列表 + */ +const hasAccess = (access, route) => { + if (route.meta && route.meta.access) + return hasOneOf(access, route.meta.access); + else return true; +}; + +/** + * 权鉴 + * @param {*} name 即将跳转的路由name + * @param {*} access 用户权限数组 + * @param {*} routes 路由列表 + * @description 用户是否可跳转到该页 + */ +export const canTurnTo = (name, access, routes) => { + const routePermissionJudge = list => { + return list.some(item => { + if (item.children && item.children.length) { + return routePermissionJudge(item.children); + } else if (item.name === name) { + return hasAccess(access, item); + } + }); + }; + + return routePermissionJudge(routes); +}; + +/** + * @param {String} url + * @description 从URL中解析参数 + */ +export const getParams = url => { + const keyValueArr = url.split("?")[1].split("&"); + let paramObj = {}; + keyValueArr.forEach(item => { + const keyValue = item.split("="); + paramObj[keyValue[0]] = keyValue[1]; + }); + return paramObj; +}; + +/** + * @param {Array} list 标签列表 + * @param {String} name 当前关闭的标签的name + */ +export const getNextRoute = (list, route) => { + let res = {}; + if (list.length === 2) { + res = getHomeRoute(list); + } else { + const index = list.findIndex(item => routeEqual(item, route)); + if (index === list.length - 1) res = list[list.length - 2]; + else res = list[index + 1]; + } + return res; +}; + +/** + * @param {Number} times 回调函数需要执行的次数 + * @param {Function} callback 回调函数 + */ +export const doCustomTimes = (times, callback) => { + let i = -1; + while (++i < times) { + callback(i); + } +}; + +/** + * @param {Object} file 从上传组件得到的文件对象 + * @returns {Promise} resolve参数是解析后的二维数组 + * @description 从Csv文件中解析出表格,解析成二维数组 + */ +export const getArrayFromFile = file => { + let nameSplit = file.name.split("."); + let format = nameSplit[nameSplit.length - 1]; + return new Promise((resolve, reject) => { + let reader = new FileReader(); + reader.readAsText(file); // 以文本格式读取 + let arr = []; + reader.onload = function(evt) { + let data = evt.target.result; // 读到的数据 + let pasteData = data.trim(); + arr = pasteData + .split(/[\n\u0085\u2028\u2029]|\r\n?/g) + .map(row => { + return row.split("\t"); + }) + .map(item => { + return item[0].split(","); + }); + if (format === "csv") resolve(arr); + else reject(new Error("[Format Error]:你上传的不是Csv文件")); + }; + }); +}; + +/** + * @param {Array} array 表格数据二维数组 + * @returns {Object} { columns, tableData } + * @description 从二维数组中获取表头和表格数据,将第一行作为表头,用于在iView的表格中展示数据 + */ +export const getTableDataFromArray = array => { + let columns = []; + let tableData = []; + if (array.length > 1) { + let titles = array.shift(); + columns = titles.map(item => { + return { + title: item, + key: item + }; + }); + tableData = array.map(item => { + let res = {}; + item.forEach((col, i) => { + res[titles[i]] = col; + }); + return res; + }); + } + return { + columns, + tableData + }; +}; + +export const findNodeUpper = (ele, tag) => { + if (ele.parentNode) { + if (ele.parentNode.tagName === tag.toUpperCase()) { + return ele.parentNode; + } else { + return findNodeUpper(ele.parentNode, tag); + } + } +}; + +export const findNodeUpperByClasses = (ele, classes) => { + let parentNode = ele.parentNode; + if (parentNode) { + let classList = parentNode.classList; + if ( + classList && + classes.every(className => classList.contains(className)) + ) { + return parentNode; + } else { + return findNodeUpperByClasses(parentNode, classes); + } + } +}; + +export const findNodeDownward = (ele, tag) => { + const tagName = tag.toUpperCase(); + if (ele.childNodes.length) { + let i = -1; + let len = ele.childNodes.length; + while (++i < len) { + let child = ele.childNodes[i]; + if (child.tagName === tagName) return child; + else return findNodeDownward(child, tag); + } + } +}; + +export const showByAccess = (access, canViewAccess) => { + return hasOneOf(canViewAccess, access); +}; + +/** + * @description 根据name/params/query判断两个路由对象是否相等 + * @param {*} route1 路由对象 + * @param {*} route2 路由对象 + */ +export const routeEqual = (route1, route2) => { + const params1 = route1.params || {}; + const params2 = route2.params || {}; + const query1 = route1.query || {}; + const query2 = route2.query || {}; + return ( + route1.name === route2.name && + objEqual(params1, params2) && + objEqual(query1, query2) + ); +}; + +export const localSave = (key, value) => { + localStorage.setItem(key, value); +}; + +export const localRead = key => { + return localStorage.getItem(key) || ""; +}; + +// scrollTop animation +export const scrollTop = (el, from = 0, to, duration = 500, endCallback) => { + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + } + const difference = Math.abs(from - to); + const step = Math.ceil((difference / duration) * 50); + + const scroll = (start, end, step) => { + if (start === end) { + endCallback && endCallback(); + return; + } + + let d = start + step > end ? end : start + step; + if (start > end) { + d = start - step < end ? end : start - step; + } + + if (el === window) { + window.scrollTo(d, d); + } else { + el.scrollTop = d; + } + window.requestAnimationFrame(() => scroll(d, end, step)); + }; + scroll(from, to, step); +}; + +// 过滤菜单 +export const filterMenu = menu => { + if (menu && menu.length > 0) { + menu = menu.filter(p => { + return !(p.meta && p.meta.isMenu === false); + }); + menu.forEach(p => { + if (p.children && p.children.length > 0) { + p.children = filterMenu(p.children); + } + }); + + return menu; + } + + return menu; +}; diff --git a/admin/src/main.js b/admin/src/main.js new file mode 100644 index 0000000..fd45237 --- /dev/null +++ b/admin/src/main.js @@ -0,0 +1,48 @@ +import Vue from "vue"; +import App from "./App"; + +import store from "./store"; +import ViewUI from "view-design"; +import config from "@/config"; +import router from "./router"; +import uiTool from "@/libs/uiTool"; +import { component } from "./component"; + +import "@babel/polyfill"; + +import "view-design/dist/styles/iview.css"; +import "@/assets/icons/iconfont.css"; +import "@/assets/css/animate.css"; +import "@/assets/css/base.less"; +import "@/assets/css/ivewExpand.less"; + +Vue.use(ViewUI); + +/** + * @description 生产环境关掉提示 + */ +Vue.config.productionTip = false; +/** + * @description 全局注册应用配置 + */ +Vue.prototype.$config = config; + +component.register(); + +let mainRoutes = uiTool.getRoutes(); + +router.addRoutes([mainRoutes]); + +window.rootVue = new Vue({ + el: "#app", + router, + store, + render: h => h(App), + mounted() { + uiTool.setRem(); + this.$store.dispatch("setAuthorityMenus"); + } +}); + +window.addEventListener("load", uiTool.setRem); +window.addEventListener("resize", uiTool.setRem); diff --git a/admin/src/mixin/uploadOssMixin.js b/admin/src/mixin/uploadOssMixin.js new file mode 100644 index 0000000..2227165 --- /dev/null +++ b/admin/src/mixin/uploadOssMixin.js @@ -0,0 +1,107 @@ + +import uiTool from '@/libs/uiTool' +import funTool from '@/libs/funTool' +import { v4 as uuidv4 } from "uuid"; +import config from '@/config' +import ossTool from '@/libs/ossTool' + + +export default { + + props: { + + isRow: { + default: true, + type: Boolean + }, + noTip: { + default: false, + type: Boolean + }, + disabled: { + default: false, + type: Boolean + }, + accept: { + type: String, + default: '.mp4,.flv,.avi,.mkv,.mov,.webm', + }, + + + }, + data() { + return { + client: null, + action: '', + + chunkSize: 1 * 1024 * 1024, // 3M + } + }, + + computed: { + + infoTip() { + let acceptTips = this.accept.split(',').join('、').replace(/\./g, '') + return `支持 ${acceptTips} 等格式,大小小于 ${config.uploadMaxLimitSize}G` + } + }, + mounted() { + this.initClient() + }, + methods: { + async initClient() { + this.client = await ossTool.getClient() + }, + + async startUpload({ file, callbackProcess }) { + try { + + let isComplete = false + let fileName = file.name + + // 分片上传 + let ossFileUrl = await this.singlePartUpload(file, callbackProcess) + + + isComplete = true + + return { uploadProcess: 100, isComplete, ossFileUrl, fileName, fileMd5, } + + } catch (err) { + + Promise.reject(err) + console.warn(err) + } + }, + + + async singlePartUpload(file, callbackProcess, folder = '') { + let { url } = config.oss + let fileName = file.name + let lastIndex = fileName.lastIndexOf('.') + let suffix = fileName.slice(lastIndex) + + folder = folder || '' + + let ossName = `${config.oss.basePath}${folder}${fileName}` + const row = await this.client.multipartUpload(ossName, file, { + // 获取分片上传进度、断点和返回值。 + progress: (p, cpt, res) => { + let uploadProcess = parseFloat(parseFloat(p * 100).toFixed(2)) + + console.log('progress', { uploadProcess, fileName }) + callbackProcess && callbackProcess({ uploadProcess, fileName }) + + + }, + parallel: 6, + partSize: 1024 * 1024 * 2 + }) + + let ossFileUrl = `${url}/${ossName}` + return ossFileUrl + + } + + } +} \ No newline at end of file diff --git a/admin/src/router/index.js b/admin/src/router/index.js new file mode 100644 index 0000000..db0e764 --- /dev/null +++ b/admin/src/router/index.js @@ -0,0 +1,46 @@ +import Vue from "vue"; +import Router from "vue-router"; +import iView from "iview"; +import config from "@/config"; + +import { getToken } from "@/libs/util"; +import routes from "./routers"; + +const { homeName } = config; +const LOGIN_PAGE_NAME = "login"; + +Vue.use(Router); + +const router = new Router({ + routes, + mode: "hash" +}); + +router.beforeEach((to, from, next) => { + const token = getToken(); + iView.LoadingBar.start(); + + if (!token && to.name !== LOGIN_PAGE_NAME) { + // 未登录且要跳转的页面不是登录页 + next({ + name: LOGIN_PAGE_NAME // 跳转到登录页 + }); + } else if (!token && to.name === LOGIN_PAGE_NAME) { + // 未登陆且要跳转的页面是登录页 + next(); // 跳转 + } else if (token && to.name === LOGIN_PAGE_NAME) { + // 已登录且要跳转的页面是登录页 + next({ + name: homeName // 跳转到homeName页 + }); + } else { + next(); + } +}); + +router.afterEach(to => { + iView.LoadingBar.finish(); + window.scrollTo(0, 0); +}); + +export default router; diff --git a/admin/src/router/routers.js b/admin/src/router/routers.js new file mode 100644 index 0000000..408691a --- /dev/null +++ b/admin/src/router/routers.js @@ -0,0 +1,18 @@ +export default [ + { + path: '/login', + name: 'login', + component: () => import('@/view/login/login.vue') + }, + { + path: '*', + name: 'error_401', + component: () => import('@/view/error-page/401.vue') + }, + + { + path: '/500', + name: 'error_500', + component: () => import('@/view/error-page/500.vue') + } +] diff --git a/admin/src/store/index.js b/admin/src/store/index.js new file mode 100644 index 0000000..51602ec --- /dev/null +++ b/admin/src/store/index.js @@ -0,0 +1,19 @@ +import Vue from "vue"; +import Vuex from "vuex"; +import createPersistedState from "vuex-persistedstate"; +import user from "./module/user"; +import app from "./module/app"; + +Vue.use(Vuex); + +export default new Vuex.Store({ + modules: { + app, + user + }, + plugins: [ + createPersistedState({ + storage: window.localStorage + }) + ] +}); diff --git a/admin/src/store/module/app.js b/admin/src/store/module/app.js new file mode 100644 index 0000000..94b4381 --- /dev/null +++ b/admin/src/store/module/app.js @@ -0,0 +1,75 @@ +import { getBreadCrumbList, getHomeRoute } from "@/libs/util"; +import config from "@/config"; +import paramSetupServer from "@/api/auto/paramSetupServer"; +import projectServer from "@/api/auto/projectServer"; + +const { homeName } = config; + +export default { + state: { + sysFormModel: { title: "", logoUrl: "" }, + breadCrumbList: [], + homeRoute: {}, + projectList: [], + projectId: 0 + }, + getters: { + sysFormModel: state => state.sysFormModel, + breadCrumbList: state => state.breadCrumbList, + homeRoute: state => state.homeRoute, + projectList: state => state.projectList, + projectId: state => state.projectId + }, + mutations: { + setBreadCrumb(state, route) { + state.breadCrumbList = getBreadCrumbList(route, state.homeRoute); + }, + setHomeRoute(state, routes) { + state.homeRoute = getHomeRoute(routes, homeName); + }, + setSysTitle(state, reload) { + state.sysFormModel = reload; + }, + setSysProject(state, reload) { + state.projectList = reload; + }, + setProjectId(state, reload) { + state.projectId = reload; + } + }, + actions: { + async getSysProject({ state, commit }) { + let res = await projectServer.all(); + let projectRows = res.data.map(p => { + let { id, name } = p; + return { id, name }; + }); + + commit("setSysProject", projectRows); + + if (state.projectId === 0 && projectRows.length > 0) { + let projectId = projectRows[0].id; + commit("setProjectId", projectId); + } + }, + + async getSysTitle({ state, commit }) { + let formModel = { + title: "智能代码平台", + logoUrl: require("../../assets/images/logo.png") + }; + + let res1 = await paramSetupServer.getOne("sys_title"); + if (res1.data) { + formModel.title = res1.data.value; + document.title = res1.data.value; + } + let res2 = await paramSetupServer.getOne("sys_logo"); + if (res2.data) { + formModel.logoUrl = res2.data.value; + } + + commit("setSysTitle", formModel); + } + } +}; diff --git a/admin/src/store/module/user.js b/admin/src/store/module/user.js new file mode 100644 index 0000000..1b20eff --- /dev/null +++ b/admin/src/store/module/user.js @@ -0,0 +1,77 @@ +import { setToken, getToken } from "@/libs/util"; +import uiTool from "@/libs/uiTool"; +import userServer from "@/api/system/userServer"; + +export default { + state: { + userName: "", + avatorImgPath: require("@/assets/images/administrato.png"), + token: getToken(), + authorityMenus: [], + menuList: [] + }, + mutations: { + setAvator(state, avatorPath) { + state.avatorImgPath = avatorPath; + }, + setUserName(state, userName) { + state.userName = userName; + localStorage.userName = state.userName; + }, + setToken(state, token) { + state.token = token; + setToken(token); + }, + setAuthorityMenus(state, menus) { + state.authorityMenus = menus; + localStorage.authorityMenus = menus; + }, + setMenuList(state, menus) { + state.menuList = menus; + } + }, + getters: { + avatorImgPath: state => state.avatorImgPath, + userName(state) { + if (!state.userName) { + state.userName = localStorage.userName; + } + return state.userName; + }, + menuList: state => state.menuList + }, + actions: { + async setAuthorityMenus({ state, commit }) { + let res = await userServer.authorityMenus(); + let authorityMenus = res.data; + commit("setAuthorityMenus", JSON.stringify(authorityMenus)); + + let mainMenu = uiTool.getRoutes(); + commit("setMenuList", mainMenu.children); + }, + // 登录 + async handleLogin({ state, commit, dispatch }, userFrom) { + let promise = new Promise(async (resolve, reject) => { + let res = await userServer.login(userFrom); + + let token = res.data.token; + let name = res.data.user.name.trim(); + + commit("setUserName", name); + commit("setToken", token); + + // 设置登录权限 + await dispatch("setAuthorityMenus"); + resolve(res); + }); + + return promise; + }, + // 退出登录 + async handleLogOut({ state, commit }, vue) { + commit("setToken", ""); + commit("setAuthorityMenus", "[]"); + window.location.reload(); + } + } +}; diff --git a/admin/src/view/auto/com/databaseType.vue b/admin/src/view/auto/com/databaseType.vue new file mode 100644 index 0000000..d56833c --- /dev/null +++ b/admin/src/view/auto/com/databaseType.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/auto/com/frontEndControlType.vue b/admin/src/view/auto/com/frontEndControlType.vue new file mode 100644 index 0000000..0d76173 --- /dev/null +++ b/admin/src/view/auto/com/frontEndControlType.vue @@ -0,0 +1,252 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/auto/sys_control.vue b/admin/src/view/auto/sys_control.vue new file mode 100644 index 0000000..a3f4d73 --- /dev/null +++ b/admin/src/view/auto/sys_control.vue @@ -0,0 +1,150 @@ + + + + \ No newline at end of file diff --git a/admin/src/view/auto/sys_form.vue b/admin/src/view/auto/sys_form.vue new file mode 100644 index 0000000..60d5c25 --- /dev/null +++ b/admin/src/view/auto/sys_form.vue @@ -0,0 +1,150 @@ + + + + \ No newline at end of file diff --git a/admin/src/view/auto/sys_form_field_id.vue b/admin/src/view/auto/sys_form_field_id.vue new file mode 100644 index 0000000..dc0f651 --- /dev/null +++ b/admin/src/view/auto/sys_form_field_id.vue @@ -0,0 +1,291 @@ + + diff --git a/admin/src/view/auto/sys_model.vue b/admin/src/view/auto/sys_model.vue new file mode 100644 index 0000000..3fc60fd --- /dev/null +++ b/admin/src/view/auto/sys_model.vue @@ -0,0 +1,180 @@ + + diff --git a/admin/src/view/auto/sys_model_field.vue b/admin/src/view/auto/sys_model_field.vue new file mode 100644 index 0000000..65ecfeb --- /dev/null +++ b/admin/src/view/auto/sys_model_field.vue @@ -0,0 +1,318 @@ + + diff --git a/admin/src/view/cote/info.vue b/admin/src/view/cote/info.vue new file mode 100644 index 0000000..ccfe85a --- /dev/null +++ b/admin/src/view/cote/info.vue @@ -0,0 +1,204 @@ + + + + diff --git a/admin/src/view/cote/info_type.vue b/admin/src/view/cote/info_type.vue new file mode 100644 index 0000000..f0400fc --- /dev/null +++ b/admin/src/view/cote/info_type.vue @@ -0,0 +1,200 @@ + + + + diff --git a/admin/src/view/error-page/401.vue b/admin/src/view/error-page/401.vue new file mode 100644 index 0000000..8ea2a0f --- /dev/null +++ b/admin/src/view/error-page/401.vue @@ -0,0 +1,19 @@ + + + diff --git a/admin/src/view/error-page/404.vue b/admin/src/view/error-page/404.vue new file mode 100644 index 0000000..edf8a9f --- /dev/null +++ b/admin/src/view/error-page/404.vue @@ -0,0 +1,19 @@ + + + diff --git a/admin/src/view/error-page/500.vue b/admin/src/view/error-page/500.vue new file mode 100644 index 0000000..b6752a0 --- /dev/null +++ b/admin/src/view/error-page/500.vue @@ -0,0 +1,19 @@ + + + diff --git a/admin/src/view/error-page/back-btn-group.vue b/admin/src/view/error-page/back-btn-group.vue new file mode 100644 index 0000000..729a03d --- /dev/null +++ b/admin/src/view/error-page/back-btn-group.vue @@ -0,0 +1,38 @@ + + + diff --git a/admin/src/view/error-page/error-content.vue b/admin/src/view/error-page/error-content.vue new file mode 100644 index 0000000..60c7de1 --- /dev/null +++ b/admin/src/view/error-page/error-content.vue @@ -0,0 +1,30 @@ + + + + diff --git a/admin/src/view/error-page/error.less b/admin/src/view/error-page/error.less new file mode 100644 index 0000000..dd0f20b --- /dev/null +++ b/admin/src/view/error-page/error.less @@ -0,0 +1,46 @@ +.error-page{ + width: 100%; + height: 100%; + position: relative; + background: #f8f8f9; + .content-con{ + width: 700px; + height: 600px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + img{ + display: block; + width: 100%; + height: 100%; + } + .text-con{ + position: absolute; + left: 0px; + top: 0px; + h4{ + position: absolute; + left: 0px; + top: 0px; + font-size: 80px; + font-weight: 700; + color: #348EED; + } + h5{ + position: absolute; + width: 700px; + left: 0px; + top: 100px; + font-size: 20px; + font-weight: 700; + color: #67647D; + } + } + .back-btn-group{ + position: absolute; + right: 0px; + bottom: 20px; + } + } +} diff --git a/admin/src/view/home/com/charts/bar.vue b/admin/src/view/home/com/charts/bar.vue new file mode 100644 index 0000000..b0a2709 --- /dev/null +++ b/admin/src/view/home/com/charts/bar.vue @@ -0,0 +1,58 @@ + + + diff --git a/admin/src/view/home/com/charts/index.js b/admin/src/view/home/com/charts/index.js new file mode 100644 index 0000000..2ca3c91 --- /dev/null +++ b/admin/src/view/home/com/charts/index.js @@ -0,0 +1,3 @@ +import ChartPie from './pie.vue' +import ChartBar from './bar.vue' +export { ChartPie, ChartBar } diff --git a/admin/src/view/home/com/charts/pie.vue b/admin/src/view/home/com/charts/pie.vue new file mode 100644 index 0000000..c86d68c --- /dev/null +++ b/admin/src/view/home/com/charts/pie.vue @@ -0,0 +1,70 @@ + + + diff --git a/admin/src/view/home/com/charts/theme.json b/admin/src/view/home/com/charts/theme.json new file mode 100644 index 0000000..c0352a3 --- /dev/null +++ b/admin/src/view/home/com/charts/theme.json @@ -0,0 +1,491 @@ + +{ + "color": [ + "#2d8cf0", + "#19be6b", + "#ff9900", + "#E46CBB", + "#9A66E4", + "#ed3f14" + ], + "backgroundColor": "rgba(0,0,0,0)", + "textStyle": {}, + "title": { + "textStyle": { + "color": "#516b91" + }, + "subtextStyle": { + "color": "#93b7e3" + } + }, + "line": { + "itemStyle": { + "normal": { + "borderWidth": "2" + } + }, + "lineStyle": { + "normal": { + "width": "2" + } + }, + "symbolSize": "6", + "symbol": "emptyCircle", + "smooth": true + }, + "radar": { + "itemStyle": { + "normal": { + "borderWidth": "2" + } + }, + "lineStyle": { + "normal": { + "width": "2" + } + }, + "symbolSize": "6", + "symbol": "emptyCircle", + "smooth": true + }, + "bar": { + "itemStyle": { + "normal": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + }, + "emphasis": { + "barBorderWidth": 0, + "barBorderColor": "#ccc" + } + } + }, + "pie": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "scatter": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "boxplot": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "parallel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "sankey": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "funnel": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "gauge": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + }, + "emphasis": { + "borderWidth": 0, + "borderColor": "#ccc" + } + } + }, + "candlestick": { + "itemStyle": { + "normal": { + "color": "#edafda", + "color0": "transparent", + "borderColor": "#d680bc", + "borderColor0": "#8fd3e8", + "borderWidth": "2" + } + } + }, + "graph": { + "itemStyle": { + "normal": { + "borderWidth": 0, + "borderColor": "#ccc" + } + }, + "lineStyle": { + "normal": { + "width": 1, + "color": "#aaa" + } + }, + "symbolSize": "6", + "symbol": "emptyCircle", + "smooth": true, + "color": [ + "#2d8cf0", + "#19be6b", + "#f5ae4a", + "#9189d5", + "#56cae2", + "#cbb0e3" + ], + "label": { + "normal": { + "textStyle": { + "color": "#eee" + } + } + } + }, + "map": { + "itemStyle": { + "normal": { + "areaColor": "#f3f3f3", + "borderColor": "#516b91", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(165,231,240,1)", + "borderColor": "#516b91", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#000" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(81,107,145)" + } + } + } + }, + "geo": { + "itemStyle": { + "normal": { + "areaColor": "#f3f3f3", + "borderColor": "#516b91", + "borderWidth": 0.5 + }, + "emphasis": { + "areaColor": "rgba(165,231,240,1)", + "borderColor": "#516b91", + "borderWidth": 1 + } + }, + "label": { + "normal": { + "textStyle": { + "color": "#000" + } + }, + "emphasis": { + "textStyle": { + "color": "rgb(81,107,145)" + } + } + } + }, + "categoryAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "valueAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "logAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "timeAxis": { + "axisLine": { + "show": true, + "lineStyle": { + "color": "#cccccc" + } + }, + "axisTick": { + "show": false, + "lineStyle": { + "color": "#333" + } + }, + "axisLabel": { + "show": true, + "textStyle": { + "color": "#999999" + } + }, + "splitLine": { + "show": true, + "lineStyle": { + "color": [ + "#eeeeee" + ] + } + }, + "splitArea": { + "show": false, + "areaStyle": { + "color": [ + "rgba(250,250,250,0.05)", + "rgba(200,200,200,0.02)" + ] + } + } + }, + "toolbox": { + "iconStyle": { + "normal": { + "borderColor": "#999" + }, + "emphasis": { + "borderColor": "#666" + } + } + }, + "legend": { + "textStyle": { + "color": "#999999" + } + }, + "tooltip": { + "axisPointer": { + "lineStyle": { + "color": "#ccc", + "width": 1 + }, + "crossStyle": { + "color": "#ccc", + "width": 1 + } + } + }, + "timeline": { + "lineStyle": { + "color": "#8fd3e8", + "width": 1 + }, + "itemStyle": { + "normal": { + "color": "#8fd3e8", + "borderWidth": 1 + }, + "emphasis": { + "color": "#8fd3e8" + } + }, + "controlStyle": { + "normal": { + "color": "#8fd3e8", + "borderColor": "#8fd3e8", + "borderWidth": 0.5 + }, + "emphasis": { + "color": "#8fd3e8", + "borderColor": "#8fd3e8", + "borderWidth": 0.5 + } + }, + "checkpointStyle": { + "color": "#8fd3e8", + "borderColor": "rgba(138,124,168,0.37)" + }, + "label": { + "normal": { + "textStyle": { + "color": "#8fd3e8" + } + }, + "emphasis": { + "textStyle": { + "color": "#8fd3e8" + } + } + } + }, + "visualMap": { + "color": [ + "#516b91", + "#59c4e6", + "#a5e7f0" + ] + }, + "dataZoom": { + "backgroundColor": "rgba(0,0,0,0)", + "dataBackgroundColor": "rgba(255,255,255,0.3)", + "fillerColor": "rgba(167,183,204,0.4)", + "handleColor": "#a7b7cc", + "handleSize": "100%", + "textStyle": { + "color": "#333" + } + }, + "markPoint": { + "label": { + "normal": { + "textStyle": { + "color": "#eee" + } + }, + "emphasis": { + "textStyle": { + "color": "#eee" + } + } + } + } +} diff --git a/admin/src/view/home/com/count-to/count-to.vue b/admin/src/view/home/com/count-to/count-to.vue new file mode 100644 index 0000000..a10e3ff --- /dev/null +++ b/admin/src/view/home/com/count-to/count-to.vue @@ -0,0 +1,174 @@ + + + diff --git a/admin/src/view/home/com/count-to/index.js b/admin/src/view/home/com/count-to/index.js new file mode 100644 index 0000000..17b3332 --- /dev/null +++ b/admin/src/view/home/com/count-to/index.js @@ -0,0 +1,2 @@ +import countTo from './count-to.vue' +export default countTo diff --git a/admin/src/view/home/com/count-to/index.less b/admin/src/view/home/com/count-to/index.less new file mode 100644 index 0000000..e17d7c6 --- /dev/null +++ b/admin/src/view/home/com/count-to/index.less @@ -0,0 +1,10 @@ +@prefix: ~"count-to"; + +.@{prefix}-wrapper{ + .content-outer{ + display: inline-block; + .@{prefix}-unit-text{ + font-style: normal; + } + } +} diff --git a/admin/src/view/home/com/info-card/index.js b/admin/src/view/home/com/info-card/index.js new file mode 100644 index 0000000..354419b --- /dev/null +++ b/admin/src/view/home/com/info-card/index.js @@ -0,0 +1,2 @@ +import InforCard from './infor-card.vue' +export default InforCard diff --git a/admin/src/view/home/com/info-card/infor-card.vue b/admin/src/view/home/com/info-card/infor-card.vue new file mode 100644 index 0000000..714967e --- /dev/null +++ b/admin/src/view/home/com/info-card/infor-card.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/admin/src/view/home/index.vue b/admin/src/view/home/index.vue new file mode 100644 index 0000000..8c74847 --- /dev/null +++ b/admin/src/view/home/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/admin/src/view/login/login.less b/admin/src/view/login/login.less new file mode 100644 index 0000000..77bb162 --- /dev/null +++ b/admin/src/view/login/login.less @@ -0,0 +1,29 @@ +.login { + width: 100%; + height: 100%; + background-image: url("../../assets/images/bg.png"); + background-size: cover; + + position: relative; + &-con { + position: absolute; + right: 160px; + top: 50%; + transform: translateY(-60%); + width: 300px; + &-header { + font-size: 16px; + font-weight: 300; + text-align: center; + padding: 30px 0; + } + .form-con { + padding: 10px 0 0; + } + .login-tip { + font-size: 10px; + text-align: center; + color: #c3c3c3; + } + } +} diff --git a/admin/src/view/login/login.vue b/admin/src/view/login/login.vue new file mode 100644 index 0000000..6076089 --- /dev/null +++ b/admin/src/view/login/login.vue @@ -0,0 +1,83 @@ + + + + + + + diff --git a/admin/src/view/project/detail/index.vue b/admin/src/view/project/detail/index.vue new file mode 100644 index 0000000..d00dcca --- /dev/null +++ b/admin/src/view/project/detail/index.vue @@ -0,0 +1,75 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/project/detail/mod/aliyunConfig.vue b/admin/src/view/project/detail/mod/aliyunConfig.vue new file mode 100644 index 0000000..8ec271d --- /dev/null +++ b/admin/src/view/project/detail/mod/aliyunConfig.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/project/detail/mod/dbConfig.vue b/admin/src/view/project/detail/mod/dbConfig.vue new file mode 100644 index 0000000..0e64f2e --- /dev/null +++ b/admin/src/view/project/detail/mod/dbConfig.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/admin/src/view/project/detail/mod/redisConfig.vue b/admin/src/view/project/detail/mod/redisConfig.vue new file mode 100644 index 0000000..aff481a --- /dev/null +++ b/admin/src/view/project/detail/mod/redisConfig.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/project/detail/mod/wxConfig.vue b/admin/src/view/project/detail/mod/wxConfig.vue new file mode 100644 index 0000000..a4fe713 --- /dev/null +++ b/admin/src/view/project/detail/mod/wxConfig.vue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/project/list.vue b/admin/src/view/project/list.vue new file mode 100644 index 0000000..0b79096 --- /dev/null +++ b/admin/src/view/project/list.vue @@ -0,0 +1,252 @@ + + + diff --git a/admin/src/view/project/systemType.vue b/admin/src/view/project/systemType.vue new file mode 100644 index 0000000..dd0ce00 --- /dev/null +++ b/admin/src/view/project/systemType.vue @@ -0,0 +1,161 @@ + + + \ No newline at end of file diff --git a/admin/src/view/sofawa/list_fa.vue b/admin/src/view/sofawa/list_fa.vue new file mode 100644 index 0000000..5ec0b14 --- /dev/null +++ b/admin/src/view/sofawa/list_fa.vue @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/admin/src/view/system/sys_log.vue b/admin/src/view/system/sys_log.vue new file mode 100644 index 0000000..060405c --- /dev/null +++ b/admin/src/view/system/sys_log.vue @@ -0,0 +1,161 @@ + + + + + \ No newline at end of file diff --git a/admin/src/view/system/sys_log_operate.vue b/admin/src/view/system/sys_log_operate.vue new file mode 100644 index 0000000..34cbdd3 --- /dev/null +++ b/admin/src/view/system/sys_log_operate.vue @@ -0,0 +1,69 @@ + + diff --git a/admin/src/view/system/sys_menu.vue b/admin/src/view/system/sys_menu.vue new file mode 100644 index 0000000..e94deb9 --- /dev/null +++ b/admin/src/view/system/sys_menu.vue @@ -0,0 +1,366 @@ + + + + + diff --git a/admin/src/view/system/sys_param_setup.vue b/admin/src/view/system/sys_param_setup.vue new file mode 100644 index 0000000..4802e77 --- /dev/null +++ b/admin/src/view/system/sys_param_setup.vue @@ -0,0 +1,111 @@ + + diff --git a/admin/src/view/system/sys_role.vue b/admin/src/view/system/sys_role.vue new file mode 100644 index 0000000..43ed8c7 --- /dev/null +++ b/admin/src/view/system/sys_role.vue @@ -0,0 +1,149 @@ + + diff --git a/admin/src/view/system/sys_user.vue b/admin/src/view/system/sys_user.vue new file mode 100644 index 0000000..98f2a00 --- /dev/null +++ b/admin/src/view/system/sys_user.vue @@ -0,0 +1,139 @@ + + diff --git a/admin/src/view/vip/vip_member.vue b/admin/src/view/vip/vip_member.vue new file mode 100644 index 0000000..0deb9c7 --- /dev/null +++ b/admin/src/view/vip/vip_member.vue @@ -0,0 +1,205 @@ + + + + diff --git a/admin/vue.config.js b/admin/vue.config.js new file mode 100644 index 0000000..d2129e9 --- /dev/null +++ b/admin/vue.config.js @@ -0,0 +1,35 @@ +const path = require("path"); +const CopyWebpackPlugin = require("copy-webpack-plugin"); +const resolve = dir => { + return path.join(__dirname, dir); +}; + + +let env = process.env.VUE_APP_ENV || process.env.NODE_ENV; + +const sourceMap = env !== "production"; + +let BASE_URL = '/' +if (env === "production") { + BASE_URL = "/"; +} + + +module.exports = { + baseUrl: BASE_URL, + // 如果你不需要使用eslint,把lintOnSave设为false即可 + lintOnSave: false, + chainWebpack: config => { + config.resolve.alias + .set("@", resolve("src")) + .set("@component", resolve("src/components")); + }, + configureWebpack: { + output: { + filename: 'js/[name].[hash].js', // 默认使用 contenthash 和 chunk 名称 + chunkFilename: 'js/[name].[hash].js', // 对于异步加载的 chunk 文件同样配置 + } + }, + // 设为false打包时不生成.map文件 + productionSourceMap: sourceMap, +}; diff --git a/api/controller_admin/sys_announcement.js b/api/controller_admin/sys_announcement.js new file mode 100644 index 0000000..6022815 --- /dev/null +++ b/api/controller_admin/sys_announcement.js @@ -0,0 +1,32 @@ +const { sys_announcement, op } = require('../../middleware/baseModel') + +module.exports = { + 'GET /sys_announcement/dtl': async (ctx, next) => { + const resList = await sys_announcement.findOne({ order: [['id', 'DESC']] }) + return ctx.success(resList) + }, + + 'POST /sys_announcement/add': async (ctx, next) => { + let row = ctx.getBody() + let dbRow = await sys_announcement.findOne({ order: [['id', 'DESC']] }) + if (dbRow) { + await dbRow.update(row) + } else { + await sys_announcement.create(row) + } + return ctx.success() + }, + + 'POST /sys_announcement/edit': async (ctx, next) => { + let row = ctx.getBody() + let id = ctx.get('id') + + const resList = await sys_announcement.update(row, { + where: { + id: id + } + }) + return ctx.success(resList) + }, + +} diff --git a/api/controller_admin/sys_build.js b/api/controller_admin/sys_build.js new file mode 100644 index 0000000..a028b6d --- /dev/null +++ b/api/controller_admin/sys_build.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const path = require("path"); +const { sys_model, querySql, sys_model_field, op } = require("../../middleware/baseModel"); +const autoFile = require("../service/autoFile"); +const funTool = require("../../tool/funTool"); +const uuid = require("node-uuid"); +module.exports = { + "POST /sys_build/down": async (ctx, next) => {}, +}; diff --git a/api/controller_admin/sys_control_type.js b/api/controller_admin/sys_control_type.js new file mode 100644 index 0000000..05ff743 --- /dev/null +++ b/api/controller_admin/sys_control_type.js @@ -0,0 +1,43 @@ +const { sys_control_type, op } = require("../../middleware/baseModel"); + +module.exports = { + "GET /sys_control_type/all": async (ctx, next) => { + const resList = await sys_control_type.findAll(); + return ctx.success(resList); + }, + + "POST /sys_control_type/page": async (ctx, next) => { + let param = ctx.getPageSize(); + let row = ctx.getBody(); + let { key, value } = row.seachOption; + let where = {}; + if (key && value) { + where[key] = { [op.like]: "%" + value + "%" }; + } + + const res = await sys_control_type.findAndCountAll({ + where, + order: [["id", "DESC"]], + ...param, + }); + return ctx.success(res); + }, + + "POST /sys_control_type/add": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_control_type.create(row); + return ctx.success(res); + }, + "POST /sys_control_type/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + const resList = await sys_control_type.update(row, { where: { id: id } }); + return ctx.success(resList); + }, + + "POST /sys_control_type/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_control_type.destroy({ where: { id: id } }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_file.js b/api/controller_admin/sys_file.js new file mode 100644 index 0000000..b507714 --- /dev/null +++ b/api/controller_admin/sys_file.js @@ -0,0 +1,104 @@ +var UUID = require("uuid"); +var fs = require("fs"); +var path = require("path"); +const ossTool = require("../service/ossTool"); +const funTool = require("../../tool/funTool"); +const { sys_project, sys_project_config } = require("../../middleware/baseModel"); +var ejs = require("ejs"); +const AdmZip = require("adm-zip"); + +module.exports = { + "POST /sys_file/upload_img": async (ctx, next) => { + const files = ctx.request.files; // 获取上传文件 + let fileArray = []; + let rootPath = path.join(__dirname, "../../upload/imgs"); + for (var key in files) { + fileArray.push(files[key]); + } + + //创建文件夹 + await funTool.mkdirsSync(rootPath); + + let resArray = []; + fileArray.forEach((file) => { + // 创建可读流 + const reader = fs.createReadStream(file.path); + + let filePath = `/${UUID.v1() + "_" + file.name}`; + // 创建可写流 + const upStream = fs.createWriteStream(path.join(rootPath, filePath)); + // 可读流通过管道写入可写流 + + reader.pipe(upStream); + + resArray.push({ name: file.name, path: path.join("/imgs", filePath) }); + }); + + ctx.success(resArray); + }, + "POST /sys_file/upload_oos_img": async (ctx, next) => { + let fileArray = []; + const files = ctx.request.files; // 获取上传文件 + for (var key in files) { + fileArray.push(files[key]); + } + let data = await ossTool.putImg(fileArray[0]); + if (data.path) { + return ctx.success(data); + } else { + return ctx.fail(); + } + }, + "POST /sys_file/get_base_project": async (ctx, next) => { + + let project_id = ctx.get("project_id"); + + const project_row = await sys_project.findOne({ where: { id: project_id } }); + const project_config_row = await sys_project_config.findOne({ where: { project_id: project_id } }); + + if (project_row && project_config_row) { + let tempPath = `./config/template/temp/${project_row.key}/` + + const zip = new AdmZip("./config/template/systemWeb.zip"); + zip.extractAllTo(tempPath, true); + + + + let apiConfigPath = tempPath + "config/config.js" + + let apiTemplateConfig = await fs.readFileSync(apiConfigPath, "utf-8"); + let { db, aliyun, redis, wechat } = project_config_row + let apiConfigText = ejs.render(apiTemplateConfig, { project_key: project_row.key, db, aliyun, redis, wechat }, { rmWhitespace: true }); + + fs.writeFileSync(apiConfigPath, apiConfigText) // 替换api 配置文件 + + let adminConfigPath = tempPath + "admin/src/config/index.js" + let adminTemplateConfig = await fs.readFileSync(adminConfigPath, "utf-8"); + + let adminConfigText = ejs.render(adminTemplateConfig, { title: project_row.name }, { rmWhitespace: true }); + + fs.writeFileSync(adminConfigPath, adminConfigText) // 替换admin 配置文件 + + + const zip2 = new AdmZip(); + zip2.addLocalFolder(tempPath); + let buildPath = `./build/${project_row.key}/${project_row.key}.zip` + + if (fs.existsSync(buildPath)) { + fs.unlinkSync(buildPath); + } + + zip2.writeZip(buildPath); // 重新压缩文件 + + fs.rmSync(tempPath, { recursive: true, force: true }); + + return ctx.success({ path: buildPath.substring(2, buildPath.length) }); + + } + else { + return ctx.fail('获取错误,db 或者项目 配置不正确'); + } + } + + +}; diff --git a/api/controller_admin/sys_form_field.js b/api/controller_admin/sys_form_field.js new file mode 100644 index 0000000..67c8170 --- /dev/null +++ b/api/controller_admin/sys_form_field.js @@ -0,0 +1,46 @@ +const { sys_form_field, sys_form, op } = require("../../middleware/baseModel"); +const { getMd5 } = require("../../tool/md5"); + +module.exports = { + "GET /sys_form_field/all": async (ctx, next) => { + let form_id = ctx.get("form_id"); + const resList = await sys_form_field.findAll({ + where: { form_id }, + include: [ + { + association: sys_form_field.associations.field, + attributes: ["key", "name"], + }, + ], + order: [["sort", "asc"]], + }); + return ctx.success(resList); + }, + + "POST /sys_form_field/add": async (ctx, next) => { + let row = ctx.getBody(); + + const res = await sys_form_field.create(row); + return ctx.success(res); + }, + "POST /sys_form_field/edit": async (ctx, next) => { + let row = ctx.getBody(); + let { id } = row; + + const res = await sys_form_field.update(row, { + where: { + id: id, + }, + }); + return ctx.success(res); + }, + "POST /sys_form_field/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_form_field.destroy({ + where: { + id: id, + }, + }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_from.js b/api/controller_admin/sys_from.js new file mode 100644 index 0000000..c6ab513 --- /dev/null +++ b/api/controller_admin/sys_from.js @@ -0,0 +1,75 @@ +const path = require("path"); +const autoFile = require("../service/autoFile"); +const { sys_form, op } = require("../../middleware/baseModel"); + +module.exports = { + "GET /sys_form/all": async (ctx, next) => { + let project_id = ctx.getAdminProjectId(); + const res = await sys_form.findAll({ where: { project_id } }); + return ctx.success(res); + }, + + "GET /sys_form/detail": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_form.findOne({ + where: { id: id }, + include: [{ association: sys_form.associations.model, attributes: ["key", "name"] }], + }); + return ctx.success(res); + }, + + "POST /sys_form/page": async (ctx, next) => { + let project_id = ctx.getAdminProjectId(); + let param = ctx.getPageSize(); + let row = ctx.getBody(); + let { key, value } = row.seachOption; + let where = { project_id }; + if (key && value) { + where[key] = { [op.like]: "%" + value + "%" }; + } + + const res = await sys_form.findAndCountAll({ + where, + include: [{ association: sys_form.associations.model, attributes: ["key", "name"] }], + order: [["id", "DESC"]], + ...param, + }); + return ctx.success(res); + }, + + "POST /sys_form/add": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_form.create(row); + return ctx.success(res); + }, + "POST /sys_form/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + const res = await sys_form.update(row, { where: { id: id } }); + return ctx.success(res); + }, + + "POST /sys_form/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_form.destroy({ where: { id: id } }); + return ctx.success(res); + }, + + "POST /sys_form/generate": async (ctx, next) => { + let form_id = ctx.get("id"); + if (form_id) { + const sysFormRow = await sys_form.findOne({ where: { id: form_id } }); + if (sysFormRow) { + await autoFile.createForm(sysFormRow); + let frontApiUrl = await autoFile.autoFrontApi(sysFormRow); + let frontVueUrl = await autoFile.autoFrontVue(sysFormRow); + + frontApiUrl = path.normalize(frontApiUrl); + frontVueUrl = path.normalize(frontVueUrl); + + return ctx.success({ frontApiUrl, frontVueUrl }); + } + } + return ctx.fail("生成失败"); + }, +}; diff --git a/api/controller_admin/sys_log.js b/api/controller_admin/sys_log.js new file mode 100644 index 0000000..dff313a --- /dev/null +++ b/api/controller_admin/sys_log.js @@ -0,0 +1,41 @@ +const fs = require("fs"); +const path = require("path"); +const funTool = require("../../tool/funTool"); +const { sys_log, op } = require("../../middleware/baseModel"); +module.exports = { + "GET /sys_log/all": async (ctx, next) => { + let folderPath = path.join(__dirname, `../../logs`); + let files = fs.readdirSync(folderPath); + let newFiles = files.reverse().map((p) => { + return { + title: p, + }; + }); + return ctx.success(newFiles); + }, + + "GET /sys_log/detail": async (ctx, next) => { + let title = ctx.get("title"); + let filePath = path.join(__dirname, `../../logs/${title}`); + let data = fs.readFileSync(filePath, "utf-8"); + + // data = data.replace(/\n/g, "
"); + return ctx.success(data); + }, + + "GET /sys_log/delete": async (ctx, next) => { + let title = ctx.get("title"); + let filePath = path.join(__dirname, `../../logs/${title}`); + + if (await funTool.isExist(filePath)) { + fs.unlinkSync(filePath); + } + return ctx.success(); + }, + + "GET /sys_log/operates": async (ctx, next) => { + let param = ctx.getPageSize(); + let data = await sys_log.findAndCountAll({ order: [["id", "desc"]], ...param }); + return ctx.success(data); + }, +}; diff --git a/api/controller_admin/sys_menu.js b/api/controller_admin/sys_menu.js new file mode 100644 index 0000000..7772b13 --- /dev/null +++ b/api/controller_admin/sys_menu.js @@ -0,0 +1,46 @@ +const { sys_menu, op } = require("../../middleware/baseModel"); +const autoFile = require("../service/autoFile"); + +const funTool = require("../../tool/funTool"); + +module.exports = { + "GET /sys_menu/index": async (ctx, next) => { + const menuRows = await sys_menu.findAll({ + order: [["sort", "ASC"]], + }); + + let newMenuRows = menuRows.map((row) => { + let newRow = row.toJSON(); + let nodeIds = funTool.getParantNode(newRow, menuRows); + newRow.parent_node_ids = nodeIds.reverse(); + return newRow; + }); + + return ctx.success(newMenuRows); + }, + + "POST /sys_menu/add": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_menu.create(row); + return ctx.success(res); + }, + + "POST /sys_menu/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + + const resList = await sys_menu.update(row, { + where: { + id: id, + }, + }); + + return ctx.success(resList); + }, + + "POST /sys_menu/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_menu.destroy({ where: { id: id } }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_model.js b/api/controller_admin/sys_model.js new file mode 100644 index 0000000..bc2b783 --- /dev/null +++ b/api/controller_admin/sys_model.js @@ -0,0 +1,229 @@ +const fs = require("fs"); +const path = require("path"); +const { sys_model, querySql, sys_model_field, op } = require("../../middleware/baseModel"); + +const autoFile = require("../service/autoFile"); +const funTool = require("../../tool/funTool"); +const uuid = require("node-uuid"); + + +module.exports = { + "GET /sys_model/detail": async (ctx, next) => { + let id = ctx.get("id"); + let res = await sys_model.findOne({ where: { id } }); + return ctx.success(res); + }, + + "GET /sys_model/all": async (ctx, next) => { + let project_id = ctx.getAdminProjectId(); + + let resList = await sys_model.findAll({ where: { project_id } }); + let resPromise = resList.map(async (row) => { + let newRow = row.toJSON(); + + let isExistTableName = await autoFile.querySql(`select TABLE_NAME from information_schema.TABLES where TABLE_NAME ="${newRow.key}"`, project_id); + if (isExistTableName && isExistTableName.length > 0) { + newRow.isTableExist = true; + } else { + newRow.isTableExist = false; + } + + let modelPath = await autoFile.outBuildPath(`api/model/${newRow.key}.js`, project_id); + let isExistModel = await funTool.isExist(modelPath); + newRow.isExistModel = isExistModel; + + // 查询模型下所有字段 + let dbColKeys = []; + let modelRow = await sys_model.findOne({ where: { id: newRow.id } }); + if (modelRow && newRow.isTableExist) { + let colRows = await autoFile.querySql(`show columns from ${modelRow.key}`, project_id); + dbColKeys = colRows.map((p) => p.Field); + } + + let isDbFielExist = true; + let model_fields = await sys_model_field.findAll({ where: { model_id: newRow.id } }); + model_fields.forEach((newFielRow) => { + let curRow = newFielRow.toJSON(); + if (dbColKeys.indexOf(curRow.key) === -1) { + isDbFielExist = false; + } + }); + + newRow.isDbFielExist = isDbFielExist; + + return newRow; + }); + + let newResList = await Promise.all(resPromise); + + return ctx.success(newResList); + }, + + // 从db中同步模型 + "POST /sys_model/autoModelBydb": async (ctx, next) => { + let project_id = ctx.getAdminProjectId(); + let rows = await autoFile.querySql(`select TABLE_NAME,TABLE_COMMENT from information_schema.TABLES`, project_id) + + let notNeedPrefix = ["sys", "usr", "dtl"] + + const checkNeedPrefix = (item) => { + let isCheck = true + + for (let i = 0; i < notNeedPrefix.length; i++) { + let str = notNeedPrefix[i] + if (item.indexOf(str) > -1) { + isCheck = false + break; + } + } + + return isCheck + } + + let needKeys = rows.filter(item => item.TABLE_NAME.charAt(3) === '_' && /^[a-z_]+$/.test(item.TABLE_NAME) && checkNeedPrefix(item.TABLE_NAME)); + if (needKeys && needKeys.length > 0) { + + + // 删除已存在的 model + let model_rows = await sys_model.findAll({ where: { project_id } }) + if (model_rows && model_rows.length > 0) { + + for (let i = 0; i < model_rows.length; i++) { + let model_row = model_rows[i] + await sys_model_field.destroy({ where: { model_id: model_row.id } }) + await model_row.destroy() + } + + } + + for (let i = 0; i < needKeys.length; i++) { + let needKey = needKeys[i].TABLE_NAME + let needName = needKeys[i].TABLE_COMMENT || '' + let modelRow = await sys_model.findOne({ where: { key: needKey, project_id } }); + // 不存在,则创建model + if (!modelRow) { + let res = await sys_model.create({ key: needKey, name: needName, project_id: project_id }) + let sql = `SELECT COLUMN_NAME AS Field,COLUMN_TYPE AS Type,COLUMN_COMMENT AS Comment, IS_NULLABLE AS 'NULL',COLUMN_DEFAULT AS 'Default' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '${needKey}'` + console.warn(`\nautoModelBydb:${sql}\n`) + let colRows = await autoFile.querySql(sql, project_id); + + // 过滤掉id主键 + colRows = colRows.filter(p => p.Field !== "id" || p.Field !== "last_modify_time" || p.Field !== "create_time") + + if (colRows && colRows.length > 0) { + + for (let j = 0; j < colRows.length; j++) { + let colRow = colRows[j] + let sort = (j + 1) * 10 + + let default_value = colRow.Default ? colRow.Default : "" + let allow_null = colRow.Null === "NO" ? false : true + let data_length = 0 + if (colRow.Type) { + let regex = /\((\d+)\)/g; + let match = regex.exec(colRow.Type) + if (match && match.length === 2 && match[1]) { + data_length = parseInt(match[1]) + } + } + + + let data_type = autoFile.mapMySQLTypeToSequelize(colRow.Type) + + // 映射前端组件 + const dataTypeToComponentMap = { STRING: 'Input', TEXT: 'Editor', INTEGER: 'InputNumber', BOOLEAN: 'i-switch', DATE: 'DatePicker' }; + let comType = dataTypeToComponentMap[data_type] || "Input" + let control = { "comType": comType } + + await sys_model_field.create({ model_id: res.id, key: colRow.Field, name: colRow.Comment, data_type, data_length, control, allow_null, default_value: default_value, sort }) + } + + } + } + } + } + + return ctx.success(); + }, + + + "POST /sys_model/interface": async (ctx, next) => { + let row = ctx.getBody(); + const baseModel = require("../../middleware/baseModel"); + let { model_key, map_option } = row; + let { key, value } = map_option; + + if (baseModel[model_key]) { + let dataRows = await baseModel[model_key].findAll({ attributes: [key, value] }); + + dataRows = dataRows.map((p) => { + return { key: p[key], value: p[value] }; + }); + return ctx.success(dataRows); + } + + return ctx.fail("数据模型不存在"); + }, + + "POST /sys_model/add": async (ctx, next) => { + let row = ctx.getBody(); + let project_id = ctx.getAdminProjectId(); + let { key, name } = row; + key = key.trim(); + + const res = await sys_model.create({ key, name, project_id }); + + return ctx.success(res); + }, + + "POST /sys_model/edit": async (ctx, next) => { + let row = ctx.getBody(); + let { id, key, name } = row; + key = key.trim(); + + const res = await sys_model.update( + { id, key, name }, + { + where: { + id: id, + }, + } + ); + return ctx.success(res); + }, + "POST /sys_model/del": async (ctx, next) => { + let id = ctx.get("id"); + + await autoFile.destroyApiFile(id); + + // 删除字段表 + await sys_model_field.destroy({ where: { model_id: id } }); + + // 删除主数据 + const res = await sys_model.destroy({ where: { id: id } }); + + return ctx.success(res); + }, + // 生成model + "POST /sys_model/regenerate": async (ctx, next) => { + let row = ctx.getBody(); + let { id } = row; + if (id) { + let sysModelFields = await sys_model_field.findAll({ where: { model_id: id } }); + if (sysModelFields && sysModelFields.length > 0) { + let tempUUid = uuid.v4(); + // 创建model + await autoFile.autoModel(id, tempUUid); + + // 创建db + await autoFile.autoDb(id, tempUUid); + + // 创建apiServer + await autoFile.autoController(id); + } else { + return ctx.fail("字段未添加,无效生成"); + } + } + return ctx.success(); + }, +}; diff --git a/api/controller_admin/sys_model_field.js b/api/controller_admin/sys_model_field.js new file mode 100644 index 0000000..821be11 --- /dev/null +++ b/api/controller_admin/sys_model_field.js @@ -0,0 +1,90 @@ +const { sys_model_field, sys_model, querySql, op } = require("../../middleware/baseModel"); +const autoFile = require("../service/autoFile"); + +const handleRow = (row) => { + let { data_type, defaultValue } = row; + if (data_type === "INTEGER") { + row.defaultValue = row.defaultValue || 0; + + if (row.data_length < 1 || row.data_length > 11) { + row.data_length = 11; + } + } else if (data_type === "DOUBLE") { + row.defaultValue = row.defaultValue || 0; + + if (row.data_length < 1 || row.data_length > 12) { + row.data_length = 12; + } + } +}; + +module.exports = { + "GET /sys_model_field/all": async (ctx, next) => { + let model_id = ctx.get("model_id"); + + let dbColKeys = []; + let modelRow = await sys_model.findOne({ where: { id: model_id } }); + if (modelRow) { + let { project_id } = modelRow; + let isExistTableName = await autoFile.querySql(`select TABLE_NAME from information_schema.TABLES where TABLE_NAME ="${modelRow.key}"`, project_id); + if (isExistTableName && isExistTableName.length > 0) { + let colRows = await autoFile.querySql(`show columns from ${modelRow.key}`, project_id); + dbColKeys = colRows.map((p) => p.Field); + } + } + + let model_fields = await sys_model_field.findAll({ where: { model_id }, order: [["sort", "asc"]] }); + model_fields = model_fields.map((p) => { + let newRow = p.toJSON(); + if (dbColKeys.indexOf(newRow.key) > -1) { + newRow.isDbExist = true; + } else { + newRow.isDbExist = false; + } + return newRow; + }); + + return ctx.success(model_fields); + }, + "GET /sys_model_field/allByKey": async (ctx, next) => { + let key = ctx.get("key"); + + let modelRow = await sys_model.findOne({ where: { key } }); + if (modelRow) { + let model_id = modelRow.id; + const resList = await sys_model_field.findAll({ where: { model_id }, order: [["sort", "asc"]] }); + return ctx.success(resList); + } + + return ctx.fail(); + }, + + "POST /sys_model_field/add": async (ctx, next) => { + let row = ctx.getBody(); + + handleRow(row); + + const res = await sys_model_field.create(row); + return ctx.success(res); + }, + "POST /sys_model_field/edit": async (ctx, next) => { + let row = ctx.getBody(); + let { id } = row; + handleRow(row); + const res = await sys_model_field.update(row, { + where: { + id: id, + }, + }); + return ctx.success(res); + }, + "POST /sys_model_field/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_model_field.destroy({ + where: { + id: id, + }, + }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_parameter.js b/api/controller_admin/sys_parameter.js new file mode 100644 index 0000000..4dfddf8 --- /dev/null +++ b/api/controller_admin/sys_parameter.js @@ -0,0 +1,46 @@ +const { sys_parameter, op } = require("../../middleware/baseModel"); + +module.exports = { + "GET /sys_parameter/index": async (ctx, next) => { + const resList = await sys_parameter.findAll({ where: { is_modified: 0 } }); + return ctx.success(resList); + }, + + "GET /sys_parameter/key": async (ctx, next) => { + let key = ctx.get("key"); + const res = await sys_parameter.findOne({ where: { key: key } }); + return ctx.success(res); + }, + + "POST /sys_parameter/setSysConfig": async (ctx, next) => { + let { title, logoUrl } = ctx.getBody(); + await sys_parameter.update({ value: title }, { where: { key: "sys_title" } }); + await sys_parameter.update({ value: logoUrl }, { where: { key: "sys_logo" } }); + return ctx.success(); + }, + + "POST /sys_parameter/add": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_parameter.create(row); + return ctx.success(res); + }, + "POST /sys_parameter/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + const resList = await sys_parameter.update(row, { + where: { + id: id, + }, + }); + return ctx.success(resList); + }, + "POST /sys_parameter/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_parameter.destroy({ + where: { + id: id, + }, + }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_project.js b/api/controller_admin/sys_project.js new file mode 100644 index 0000000..e4f563d --- /dev/null +++ b/api/controller_admin/sys_project.js @@ -0,0 +1,152 @@ +const { sys_project, sys_project_config, op } = require("../../middleware/baseModel"); +const autoFile = require("../service/autoFile"); + + + +module.exports = { + "GET /sys_project/all": async (ctx, next) => { + const res = await sys_project.findAll(); + return ctx.success(res); + }, + + "GET /sys_project/detail": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_project.findOne({ where: { id: id } }); + return ctx.success(res); + }, + + "POST /sys_project/detailConfig": async (ctx, next) => { + let project_id = ctx.get("project_id"); + const res = await sys_project_config.findOne({ where: { project_id } }); + return ctx.success(res); + }, + + "POST /sys_project/autoInitDb": async (ctx, next) => { + let project_id = ctx.get("project_id"); + + await autoFile.autoInitDb(project_id) + return ctx.success(); + }, + + + + "POST /sys_project/editDbConfig": async (ctx, next) => { + let { project_id, username, password, database, host, port, dialect } = ctx.getBody(); + + const projectRow = await sys_project_config.findOne({ where: { project_id: project_id } }); + if (projectRow) { + const res = await projectRow.update({ db: { username, password, database, host, port, dialect } }, { individualHooks: true }); + await autoFile.autoDbConfig(project_id); + await autoFile.autoConfig(project_id); + + return ctx.success(res); + } else { + return ctx.fail("未存在项目配置") + } + }, + "POST /sys_project/editWxConfig": async (ctx, next) => { + let { project_id, appid, secret, mch_id, partner_key, partnerV3_key, notify_url, refund_notify_url } = ctx.getBody(); + + const projectRow = await sys_project_config.findOne({ where: { project_id: project_id } }); + if (projectRow) { + const res = await projectRow.update({ wechat: { appid, secret, mch_id, partner_key, partnerV3_key, notify_url, refund_notify_url } }, { individualHooks: true }); + + await autoFile.autoConfig(project_id); + + return ctx.success(res); + } else { + return ctx.fail("未存在项目配置") + } + }, + + "POST /sys_project/editRedisConfig": async (ctx, next) => { + + let { project_id, host, pwd, port } = ctx.getBody(); + + const projectRow = await sys_project_config.findOne({ where: { project_id: project_id } }); + if (projectRow) { + const res = await projectRow.update({ redis: { host, pwd, port } }, { individualHooks: true }); + await autoFile.autoConfig(project_id); + return ctx.success(res); + } + else { + return ctx.fail("未存在项目配置") + } + }, + + "POST /sys_project/editAliyunConfig": async (ctx, next) => { + let { project_id, accessKeyId, accessKeySecret, ossUrl, } = ctx.getBody(); + + const projectRow = await sys_project_config.findOne({ where: { project_id: project_id } }); + if (projectRow) { + const res = await projectRow.update({ aliyun: { accessKeyId, accessKeySecret, ossUrl } }, { individualHooks: true }); + await autoFile.autoConfig(project_id); + return ctx.success(res); + } else { + return ctx.fail("未存在项目配置") + } + }, + + "POST /sys_project/export": async (ctx, next) => { + let rows = []; + let cols = []; + let title = "sys_project"; + + let tableAttributes = sys_project.tableAttributes; + let colKeys = Object.keys(tableAttributes); + + colKeys.forEach((key) => { + let row = tableAttributes[key]; + let caption = row.comment ? row.comment : row.fieldName; + cols.push({ caption, type: row.type.__proto__.key === "INTEGER" ? "number" : "string", key: row.field }); + }); + + const dbRows = await sys_project.findAll({}); + rows = dbRows.map((p) => { + let tempRow = p.toJSON(); + let row = []; + cols.forEach((col) => { + row.push(tempRow[col.key]); + }); + return row; + }); + + return ctx.downFile({ title, rows, cols }); + }, + + "POST /sys_project/page": async (ctx, next) => { + let param = ctx.getPageSize(); + let row = ctx.getBody(); + let { key, value } = row.seachOption; + let where = {}; + if (key && value) { + where[key] = { [op.like]: "%" + value + "%" }; + } + + const res = await sys_project.findAndCountAll({ + where, + order: [["id", "DESC"]], + ...param, + }); + return ctx.success(res); + }, + + "POST /sys_project/add": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_project.create(row); + await sys_project_config.create({ project_id: res.id }); + return ctx.success(res); + }, + "POST /sys_project/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + const res = await sys_project.update(row, { where: { id: id }, individualHooks: true }); + return ctx.success(res); + }, + + "POST /sys_project/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_project.destroy({ where: { id: id }, individualHooks: true }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_project_type.js b/api/controller_admin/sys_project_type.js new file mode 100644 index 0000000..c2977df --- /dev/null +++ b/api/controller_admin/sys_project_type.js @@ -0,0 +1,77 @@ +const {sys_project_type, op } = require('../../middleware/baseModel'); + + module.exports = { + 'GET /sys_project_type/all' : async (ctx, next) => { + const res = await sys_project_type.findAll(); + return ctx.success(res); + }, + + 'GET /sys_project_type/detail' : async (ctx, next) => { + let id = ctx.get('id') + const res = await sys_project_type.findOne({where:{id:id}}); + return ctx.success(res); + }, + + + "POST /sys_project_type/export": async (ctx, next) => { + let rows = []; + let cols = []; + let title='sys_project_type'; + + let tableAttributes = sys_project_type.tableAttributes; + let colKeys = Object.keys(tableAttributes); + + colKeys.forEach((key) => { + let row = tableAttributes[key]; + let caption = row.comment ? row.comment : row.fieldName; + cols.push({ caption, type: row.type.__proto__.key === "INTEGER" ? "number" : "string", key: row.field }); + }); + + const dbRows = await sys_project_type.findAll({}); + rows = dbRows.map((p) => { + let tempRow = p.toJSON(); + let row = []; + cols.forEach((col) => { + row.push(tempRow[col.key]); + }); + return row; + }); + + return ctx.downFile({title, rows, cols }); + }, + + 'POST /sys_project_type/page' : async (ctx, next) => { + let param = ctx.getPageSize() + let row = ctx.getBody(); + let {key,value}=row.seachOption + let where={} + if(key&&value){ + where[key]={ [op.like]:'%' +value + '%'} + } + + const res = await sys_project_type.findAndCountAll({ + where, + order: [["id", "DESC"]], + ...param, + }); + return ctx.success(res); + }, + + 'POST /sys_project_type/add': async (ctx, next) => { + let row = ctx.getBody(); + const res = await sys_project_type.create(row); + return ctx.success(res); + }, + 'POST /sys_project_type/edit': async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get('id') + const res = await sys_project_type.update(row, { where: { id: id }, individualHooks: true }); + return ctx.success(res); + }, + + 'POST /sys_project_type/del': async (ctx, next) => { + let id = ctx.get('id') + const res = await sys_project_type.destroy({ where: { id: id }, individualHooks: true }); + return ctx.success(res); + } + }; \ No newline at end of file diff --git a/api/controller_admin/sys_role.js b/api/controller_admin/sys_role.js new file mode 100644 index 0000000..ca8f649 --- /dev/null +++ b/api/controller_admin/sys_role.js @@ -0,0 +1,39 @@ +const { sys_role, op } = require("../../middleware/baseModel"); +const { getMd5 } = require("../../tool/md5"); +module.exports = { + "GET /sys_role/index": async (ctx, next) => { + const resList = await sys_role.findAll({ where: {} }); + return ctx.success(resList); + }, + "POST /sys_role/add": async (ctx, next) => { + let row = ctx.getBody(); + let { name, menus } = row; + const res = await sys_role.create({ name, menus }); + + return ctx.success(res); + }, + "POST /sys_role/edit": async (ctx, next) => { + let row = ctx.getBody(); + + let { id, name, menus } = row; + + const res = await sys_role.update( + { name, menus }, + { + where: { + id: id, + }, + } + ); + return ctx.success(res); + }, + "POST /sys_role/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_role.destroy({ + where: { + id: id, + }, + }); + return ctx.success(res); + }, +}; diff --git a/api/controller_admin/sys_user.js b/api/controller_admin/sys_user.js new file mode 100644 index 0000000..28b373e --- /dev/null +++ b/api/controller_admin/sys_user.js @@ -0,0 +1,132 @@ +const { sys_user, sys_role, sys_log, sys_menu, op } = require("../../middleware/baseModel"); +const tokenService = require("../service/token"); +const { getMd5 } = require("../../tool/md5"); +const dayjs = require("dayjs"); + +module.exports = { + "GET /sys_user/index": async (ctx, next) => { + const resList = await sys_user.findAll({ + where: { + name: { [op.not]: "zc" }, + }, + include: [{ association: sys_user.associations.role, attributes: ["id", "name"] }], + }); + return ctx.success(resList); + }, + "POST /sys_user/login": async (ctx, next) => { + let name = ctx.get("name"); + let password = ctx.get("password"); + + const userRow = await sys_user.findOne({ + where: { name: name, password: getMd5(password) }, + }); + + if (userRow) { + let { id, name, password, roleId } = userRow; + let role = await sys_role.findOne({ where: { id: roleId } }); + let token = await tokenService.create({ id, name, password }); + + let nowDateStr = dayjs().format("YYYY-MM-DD HH:mm:ss"); + await sys_log.create({ table_name: "sys_user", operate: "登录", content: `用户 ${name} 于 ${nowDateStr} 登录系统` }); + return ctx.success({ token: token, user: userRow, authorityMenus: role.menus }); + } + return ctx.fail("账号或密码错误!"); + }, + + "POST /sys_user/export": async (ctx, next) => { + let rows = []; + let cols = []; + let title = "sys_user"; + let tableAttributes = sys_user.tableAttributes; + let colKeys = Object.keys(tableAttributes); + + colKeys.forEach((key) => { + let row = tableAttributes[key]; + let caption = row.comment ? row.comment : row.fieldName; + cols.push({ caption, type: row.type.__proto__.key === "INTEGER" ? "number" : "string", key: row.field }); + }); + + const userRows = await sys_user.findAll({}); + + rows = userRows.map((p) => { + let tempRow = p.toJSON(); + let row = []; + cols.forEach((col) => { + row.push(tempRow[col.key]); + }); + return row; + }); + + return ctx.downFile({ title, rows, cols }); + }, + + "POST /sys_user/authorityMenus": async (ctx, next) => { + let user_id = ctx.getAdminUserId(); + if (user_id) { + const userRow = await sys_user.findOne({ where: { id: user_id } }); + if (userRow) { + let { id, roleId } = userRow; + + let where = {}; + let role = await sys_role.findOne({ where: { id: roleId } }); + + // 系统角色 不用授权 + if (role.type === 0) { + let menuIds = JSON.parse(role.menus); + where = { + id: { + [op.in]: menuIds, + }, + }; + } + let munuRows = await sys_menu.findAll({ + where, + order: [["sort", "ASC"]], + }); + + return ctx.success(munuRows); + } + } + + return ctx.success(); + }, + + "POST /sys_user/add": async (ctx, next) => { + let row = ctx.getBody(); + + // md5 加密 + if (row && row.password) { + row.password = getMd5(row.password); + } + + const res = await sys_user.create(row); + return ctx.success(res); + }, + "POST /sys_user/edit": async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get("id"); + + let { name, roleId, password } = row; + + if (password.length !== 32) { + password = getMd5(password); + } + + const resList = await sys_user.update( + { name, roleId, password }, + { + where: { + id: id, + }, + } + ); + return ctx.success(resList); + }, + "POST /sys_user/del": async (ctx, next) => { + let id = ctx.get("id"); + const res = await sys_user.destroy({ + where: { id: id }, + }); + return ctx.success(res); + }, +}; diff --git a/api/controller_front/config.js b/api/controller_front/config.js new file mode 100644 index 0000000..73a7fef --- /dev/null +++ b/api/controller_front/config.js @@ -0,0 +1,149 @@ +const dayjs = require("dayjs"); +const fs = require('fs') +const path = require('path') +const { plu_api_linkjs, plu_ga, plu_func, plu_func_type, plu_version, querySql, op } = require("../../middleware/baseModel"); + +module.exports = { + + "GET /config/v3_test": async (ctx, next) => { + + let data = [ + { + create_time: "2021-11-23 16:27:06", + last_modify_time: "2021-11-23 16:27:06", + id: 1, + name: "数据银行", + platformUrl: "databank.tmall.com", + linkUrl: "https://yunzhuan.light120.com/platform/databank/index.js", + inline: true, + }, + { + create_time: "2021-11-23 16:26:38", + last_modify_time: "2021-11-23 16:26:38", + id: 2, + name: "生意参谋", + platformUrl: "sycm.taobao.com", + linkUrl: "https://yunzhuan.light120.com/platform/businessStaff/index.js", + inline: false, + }, + { + create_time: "2021-11-23 16:26:03", + last_modify_time: "2021-11-23 16:26:03", + id: 3, + name: "策略中心", + platformUrl: "strategy.tmall.com", + linkUrl: "https://yunzhuan.light120.com/platform/strategy/index.js", + inline: false, + }, + { + create_time: "2021-11-24 19:13:00", + last_modify_time: "2021-11-24 19:13:00", + id: 4, + name: "淘宝直播", + platformUrl: "market.m.taobao.com", + linkUrl: "https://yunzhuan.light120.com/platform/tbLive/index.js", + inline: true, + }, + { + create_time: "2021-11-24 19:13:00", + last_modify_time: "2021-11-24 19:13:00", + id: 5, + name: "达摩盘", + platformUrl: "dmp.taobao.com", + linkUrl: "https://yunzhuan.light120.com/platform/dmp/index.js", + inline: true, + }, + { + create_time: "2021-11-24 19:13:00", + last_modify_time: "2021-11-24 19:13:00", + id: 5, + name: "淘宝光合", + platformUrl: "creator.guanghe.taobao.com", + linkUrl: "https://yunzhuan.light120.com/platform/guanghe/index.js", + inline: true, + }, + { + create_time: "2021-11-24 19:13:00", + last_modify_time: "2021-11-24 19:13:00", + id: 5, + name: "抖音电商", + platformUrl: "compass.jinritemai.com", + linkUrl: "https://yunzhuan.light120.com/platform/tikTok/index.js", + inline: true, + }, + { + create_time: "2021-11-24 19:13:00", + last_modify_time: "2021-11-24 19:13:00", + id: 6, + name: "天猫详情", + platformUrl: "detail.tmall.com", + linkUrl: "https://yunzhuan.light120.com/platform/tmall/index.js", + inline: true, + }, + ]; + return ctx.success(data); + + }, + + "GET /config/v3": async (ctx, next) => { + const res = await plu_api_linkjs.findAll({ where: {} }); + return ctx.success(res); + + }, + + "GET /config/ga": async (ctx, next) => { + let ip = ctx.getIp(); + let { title, brand, type, postion, parentSelector: parent_selector, className: class_name, icon, path, browser } = ctx.getQuery(); + let res = await plu_ga.create({ title, type, brand, postion, parent_selector, class_name, icon, path, ip, browser }); + return ctx.success(res); + }, + + "GET /config/funType": async (ctx, next) => { + + const res = await plu_func_type.findAll({ where: { is_enable: 1 } }); + let rows = res.map(p => { + return { key: p.id, value: p.value } + }) + + return ctx.success(rows); + }, + + + "GET /config/funAll": async (ctx, next) => { + let rows = await plu_func.findAll({ where: { is_enable: 1 }, order: [["sort", "asc"]] }); + return ctx.success(rows); + }, + + + "GET /config/lastPlug": async (ctx, next) => { + + const replaceUrl = (url) => { + url = url.replace('https:', '') + url = url.replace('http:', '') + return url + } + + let defaultRow = { + plugVersion: '2.7.5', + plugUpdateDate: '2023-06-09', + officialUrl: "//shopant.baozun.com/plug/#/", + downUrl: '//bztic-shopant-files.oss-cn-shanghai.aliyuncs.com/front/plug/business-staff-extension_2.7.5.zip', + helpUrl: '//bztic-shopant-files.oss-cn-shanghai.aliyuncs.com/front/plug/helpDoc.pdf' + } + + let row = await plu_version.findOne({ where: { is_enable: 1 }, order: [["id", "desc"]] }) + if (row) { + + let { plugVersion, plugUpdateDate, downUrl, helpUrl } = row + plugUpdateDate = dayjs(plugUpdateDate).format('YYYY-MM-DD') + downUrl = replaceUrl(downUrl) + helpUrl = replaceUrl(helpUrl) + + defaultRow = Object.assign({}, defaultRow, { plugVersion, plugUpdateDate, downUrl, helpUrl }) + } + + + return ctx.success(defaultRow); + }, + +}; diff --git a/api/controller_front/model.js b/api/controller_front/model.js new file mode 100644 index 0000000..80777aa --- /dev/null +++ b/api/controller_front/model.js @@ -0,0 +1,159 @@ +const fs = require("fs"); +const path = require("path"); +const { sys_model, sys_project, querySql, sys_model_field, op } = require("../../middleware/baseModel"); +const autoFile = require("../service/autoFile"); +const funTool = require("../../tool/funTool"); +const uuid = require("node-uuid"); + +module.exports = { + "POST /model/all": async (ctx, next) => { + let { projectKey } = ctx.getBody(); + + let projectRow = await sys_project.findOne({ where: { key: projectKey } }); + if (projectRow) { + let project_id = projectRow.id; + let resList = await sys_model.findAll({ where: { project_id } }); + + let resPromise = resList.map(async (row) => { + let newRow = row.toJSON(); + + let isExistTableName = await querySql(`select TABLE_NAME from information_schema.TABLES where TABLE_NAME ="${newRow.key}"`); + if (isExistTableName && isExistTableName.length > 0) { + newRow.isTableExist = true; + } else { + newRow.isTableExist = false; + } + + let modelPath = await autoFile.outBuildPath(`api/model/${newRow.key}.js`, project_id); + let isExistModel = await funTool.isExist(modelPath); + newRow.isExistModel = isExistModel; + + // 查询模型下所有字段 + let dbColKeys = []; + let modelRow = await sys_model.findOne({ where: { id: newRow.id } }); + if (modelRow && newRow.isTableExist) { + let colRows = await querySql(`show columns from ${modelRow.key}`); + dbColKeys = colRows.map((p) => p.Field); + } + + let isDbFielExist = true; + let model_fields = await sys_model_field.findAll({ where: { model_id: newRow.id } }); + model_fields.forEach((newFielRow) => { + let = newFielRow.toJSON(); + if (dbColKeys.indexOf(newFielRow.key) === -1) { + isDbFielExist = false; + } + }); + + newRow.isDbFielExist = isDbFielExist; + + return newRow; + }); + + let newResList = await Promise.all(resPromise); + + return ctx.success(newResList); + } else { + return ctx.fail("未找到项目key"); + } + }, + + "POST /model/detailPath": async (ctx, next) => { + let { id } = ctx.getBody(); + let modelRow = await sys_model.findOne({ where: { id } }); + if (modelRow) { + let { key, project_id } = modelRow; + let projectRow = await sys_project.findOne({ where: { id: project_id } }); + if (projectRow) { + let controllerPath = path.normalize(`/${projectRow.key}/api/controller_admin/${key}.js`); + let modelPath = path.normalize(`/${projectRow.key}/api/model/${key}.js`); + return ctx.success({ controllerPath, modelPath }); + } + } + + return ctx.success({ controllerPath: "", modelPath: "" }); + }, + + + "POST /form/updateForm": async (ctx, next) => { + let { id, name, model_id, api_path, component } = ctx.getBody(); + let formRow = await sys_form.findOne({ where: { id: id } }); + if (formRow) { + let res = await sys_form.update({ name: `${name}_表单`, model_id, api_path, component }, { where: { id } }); + return ctx.success(res); + } else { + return ctx.fail("未找到指定项目"); + } + }, + + "POST /form/createForm": async (ctx, next) => { + let { name, project_key, model_id, api_path, component } = ctx.getBody(); + let projectRow = await sys_project.findOne({ where: { key: project_key } }); + if (projectRow) { + let project_id = projectRow.id; + let res = await sys_form.create({ name: `${name}_表单`, project_id, model_id, api_path, component }); + return ctx.success(res); + } else { + return ctx.fail("未找到指定项目"); + } + }, + + "POST /form/generate": async (ctx, next) => { + let form_id = ctx.get("id"); + if (form_id) { + const sysFormRow = await sys_form.findOne({ where: { id: form_id } }); + if (sysFormRow) { + await autoFile.createForm(sysFormRow); + let frontApiUrl = await autoFile.autoFrontApi(sysFormRow); + let frontVueUrl = await autoFile.autoFrontVue(sysFormRow); + + frontApiUrl = path.normalize(frontApiUrl); + frontVueUrl = path.normalize(frontVueUrl); + + return ctx.success({ frontApiUrl, frontVueUrl }); + } + } + return ctx.fail("生成失败"); + }, + + // 生成model + "POST /model/regenerate": async (ctx, next) => { + let row = ctx.getBody(); + let { id } = row; + if (id) { + let sysModelFields = await sys_model_field.findAll({ where: { model_id: id } }); + if (sysModelFields && sysModelFields.length > 0) { + let tempUUid = uuid.v4(); + // 创建model + await autoFile.autoModel(id, tempUUid); + + // 创建apiServer + await autoFile.autoController(id); + + + let modelRow = await sys_model.findOne({ where: { id } }); + if (modelRow) { + let { key, project_id } = modelRow; + let projectRow = await sys_project.findOne({ where: { id: project_id } }); + if (projectRow) { + let controllerPath = path.normalize(`/${projectRow.key}/api/controller_admin/${key}.js`); + let modelPath = path.normalize(`/${projectRow.key}/api/model/${key}.js`); + return ctx.success({ controllerPath, modelPath }); + } + else { + return ctx.fail("未找到项目"); + } + } + else { + return ctx.fail("未找到模型文件"); + } + + + + } else { + return ctx.fail("字段未添加,无效生成"); + } + } + return ctx.fail("参数错误 id"); + }, +}; diff --git a/api/controller_front/project.js b/api/controller_front/project.js new file mode 100644 index 0000000..29f12f1 --- /dev/null +++ b/api/controller_front/project.js @@ -0,0 +1,14 @@ +const dayjs = require("dayjs"); +const fs = require("fs"); +const path = require("path"); +const autoFile = require("../service/autoFile"); +const { querySql, sys_project, op } = require("../../middleware/baseModel"); + +module.exports = { + "POST /project/down": async (ctx, next) => { + let { model_id } = ctx.getBody(); + }, + "POST /project/build": async (ctx, next) => { + let { model_id } = ctx.getBody(); + }, +}; diff --git a/api/controller_front/sofaware.js b/api/controller_front/sofaware.js new file mode 100644 index 0000000..e47c60e --- /dev/null +++ b/api/controller_front/sofaware.js @@ -0,0 +1,15 @@ +const dayjs = require("dayjs"); +const { querySql, sof_sofawa_ga, op } = require("../../middleware/baseModel"); +module.exports = { + "POST /sofaware/last": async (ctx, next) => { + let row = { version: "1.5.0", officialUrl: "https://shopant.baozun.com/plug/#/", updateDate: "2024-05-10", downUrl: "https://bztic-shopant-files.oss-cn-shanghai.aliyuncs.com/prod/split_video/split_video_latest.zip" } + return ctx.success(row) + }, + + "POST /sofaware/ga": async (ctx, next) => { + let row = ctx.getBody(); + const res = await sof_sofawa_ga.create(row); + return ctx.success(res); + }, + +}; diff --git a/api/controller_front/sys_file.js b/api/controller_front/sys_file.js new file mode 100644 index 0000000..c625c85 --- /dev/null +++ b/api/controller_front/sys_file.js @@ -0,0 +1,49 @@ +var UUID = require("uuid"); +var fs = require("fs"); +var path = require("path"); +const ossTool = require("../service/ossTool"); +const funTool = require("../../tool/funTool"); + +module.exports = { + "POST /sys_file/upload_img": async (ctx, next) => { + const files = ctx.request.files; // 获取上传文件 + let fileArray = []; + let rootPath = path.join(__dirname, "../../upload/imgs"); + for (var key in files) { + fileArray.push(files[key]); + } + + //创建文件夹 + await funTool.mkdirsSync(rootPath); + + let resArray = []; + fileArray.forEach((file) => { + // 创建可读流 + const reader = fs.createReadStream(file.path); + + let filePath = `/${UUID.v1() + "_" + file.name}`; + // 创建可写流 + const upStream = fs.createWriteStream(path.join(rootPath, filePath)); + // 可读流通过管道写入可写流 + + reader.pipe(upStream); + + resArray.push({ name: file.name, path: path.join("/imgs", filePath) }); + }); + + ctx.success(resArray); + }, + "POST /sys_file/upload_oos_img": async (ctx, next) => { + let fileArray = []; + const files = ctx.request.files; // 获取上传文件 + for (var key in files) { + fileArray.push(files[key]); + } + let data = await ossTool.putImg(fileArray[0]); + if (data.path) { + return ctx.success(data); + } else { + return ctx.fail(); + } + }, +}; diff --git a/api/controller_front/upgrade.js b/api/controller_front/upgrade.js new file mode 100644 index 0000000..9ea80a5 --- /dev/null +++ b/api/controller_front/upgrade.js @@ -0,0 +1,24 @@ +const { plu_upgrade, op } = require("../../middleware/baseModel"); + +module.exports = { + "POST /upgrade/add": async (ctx, next) => { + let row = ctx.getBody(); + let { fingerPrintKey, newVersion, oldVersion } = row; + let upgradeRow = await plu_upgrade.findOne({ where: { fingerPrintKey, newVersion } }); + if (upgradeRow) { + await plu_upgrade.update({ fingerPrintKey, newVersion, oldVersion, whetherTip: true }, { where: { id: upgradeRow.id }, individualHooks: true }); + return ctx.success(); + } else { + const res = await plu_upgrade.create(row); + return ctx.success(res); + } + }, + + "GET /upgrade/detail": async (ctx, next) => { + let fingerPrintKey = ctx.get("fingerPrintKey"); + let newVersion = ctx.get("newVersion"); + + const res = await plu_upgrade.findOne({ where: { fingerPrintKey, newVersion } }); + return ctx.success(res); + }, +}; diff --git a/api/controller_front/video_effects.js b/api/controller_front/video_effects.js new file mode 100644 index 0000000..08f7841 --- /dev/null +++ b/api/controller_front/video_effects.js @@ -0,0 +1,78 @@ +const { plu_upgrade, op } = require("../../middleware/baseModel"); +const { encoder } = require("../service/ffmpeg/encoder"); +const fs = require('fs'); +const stream = require("stream"); +const path = require("path"); + +const getStreamContentTobase64Stream = async (file) => { + + let p = new Promise((resolve, reject) => { + const readStream = fs.createReadStream(file.path) + const readStream2 = new stream.Readable(); + + + + let str = '' + readStream.on('data', data => { + str += data.toString() + + }) + + readStream.on('end', () => { + + let base64Array = str.split('data:image/png;base64,') + console.log('count', base64Array.length) + for (let i = 0; i < base64Array.length; i++) { + let base64 = base64Array[i].replace(/^data:\w+\/\w+;base64,/, '') + const buffer = Buffer.from(base64, "base64"); + readStream2.push(buffer); + } + + readStream2.push(null) + + + resolve(readStream2) + }) + + readStream.on('error', err => { + reject(err) + console.log(err) + }) + + + }) + + return p + +} + +module.exports = { + "POST /video_effects/build": async (ctx, next) => { + const files = ctx.request.files; // 获取上传文件 + + let file = files.file + + let frameStream = await getStreamContentTobase64Stream(file) + + + const output = await encoder({ + silent: false, + frameStream: frameStream, + backgroundVideo: { + videoPath: path.join(__dirname, "../../config/media/demo_out.mp4"), + inSeconds: 1, + outSeconds: 30, + }, + output: "output/test.mp4", + fps: { + input: 30, + output: 30, + }, + }); + + + console.log("process done,", output.path); + + return ctx.success({ path: output.path }); + }, +}; diff --git a/api/model/sof_sofawa.js b/api/model/sof_sofawa.js new file mode 100644 index 0000000..df97e5f --- /dev/null +++ b/api/model/sof_sofawa.js @@ -0,0 +1,41 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); + + +module.exports = sof_sofawa = db.define("sof_sofawa", { + + sofaKey: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "软件key", + }, + title: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "软件名称", + }, + version: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + comment: "软件版本", + }, + down_url: { + type: Sequelize.STRING(500), + allowNull: false, + defaultValue: "", + comment: "软件版本", + }, + file_size: { + + type: Sequelize.STRING(500), + allowNull: false, + defaultValue: "", + comment: "软件大小", + } + +}) + +// sof_sofawa.sync({ force: true }); \ No newline at end of file diff --git a/api/model/sof_sofawa_ga.js b/api/model/sof_sofawa_ga.js new file mode 100644 index 0000000..d71f572 --- /dev/null +++ b/api/model/sof_sofawa_ga.js @@ -0,0 +1,64 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); + + +module.exports = sof_sofawa_ga = db.define("sof_sofawa_ga", { + + sofaKey: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "软件key", + }, + version: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "版本号", + }, + serialNumber: { + type: Sequelize.STRING(200), + allowNull: false, + defaultValue: "", + comment: "硬盘序列号", + }, + + ip: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "ip", + }, + position: { + type: Sequelize.STRING(200), + allowNull: false, + defaultValue: "", + comment: "功能位置", + }, + type: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "类型", + }, + msg: { + type: Sequelize.JSON, + allowNull: false, + defaultValue: "{}", + comment: "详细信息", + set(value) { + this.setDataValue('msg', { value }); + }, + get() { + let jsonValue = this.getDataValue("msg") + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } + else { + return jsonValue + } + } + }, +}); + +//sof_sofawa_ga.sync({ force: true }); diff --git a/api/model/sys_control_type.js b/api/model/sys_control_type.js new file mode 100644 index 0000000..4496ae8 --- /dev/null +++ b/api/model/sys_control_type.js @@ -0,0 +1,24 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +module.exports = sys_control_type = db.define("sys_control_type", { + name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "控件名称", + }, + module_key: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "组件key", + }, + data_lenght: { + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: "50", + comment: "数据长度", + }, +}); + +// sys_control_type.sync({ force: true }); diff --git a/api/model/sys_form.js b/api/model/sys_form.js new file mode 100644 index 0000000..966090c --- /dev/null +++ b/api/model/sys_form.js @@ -0,0 +1,42 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +// 表单表 +module.exports = sys_form = db.define("sys_form", { + // 表单名称 + name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "表单名称", + }, + // 模型id + model_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: true, + defaultValue: 0, + comment: "模型id", + }, + // 项目id + project_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: true, + defaultValue: 0, + comment: "项目id", + }, + // 组件地址 + component: { + type: Sequelize.STRING(100), + allowNull: true, + defaultValue: 0, + comment: "组件地址", + }, + //api地址 + api_path: { + type: Sequelize.STRING(100), + allowNull: true, + defaultValue: 0, + comment: "api地址", + }, +}); + +// sys_form.sync({ force: true }); diff --git a/api/model/sys_form_field.js b/api/model/sys_form_field.js new file mode 100644 index 0000000..9b4cfec --- /dev/null +++ b/api/model/sys_form_field.js @@ -0,0 +1,78 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); + +module.exports = sys_form_field = db.define("sys_form_field", { + form_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: false, + defaultValue: "0", + comment: "表单id", + }, + model_field_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: false, + defaultValue: "0", + comment: "字段id", + }, + model_field_name: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + comment: "字段名称", + }, + control: { + type: Sequelize.JSON, + allowNull: false, + defaultValue: "{}", + comment: "控件", + set(value) { + this.setDataValue('control', { value }); + }, + get() { + let jsonValue = this.getDataValue("control") + if (jsonValue && jsonValue.value !== undefined) { + + + + return jsonValue.value; + } + else { + return jsonValue + } + } + }, + is_show_edit: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: 0, + comment: "是否显示在编辑界面", + }, + + is_edit_disable: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: 0, + comment: "编辑界面是否禁用", + }, + is_show_list: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: 0, + comment: "是否显示在列表", + }, + + is_show_seach: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: 0, + comment: "是否显示在搜索", + }, + sort: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: false, + defaultValue: "0", + comment: "排序", + }, +}); + +// sys_form_field.sync({ force: true }); diff --git a/api/model/sys_log.js b/api/model/sys_log.js new file mode 100644 index 0000000..8df368f --- /dev/null +++ b/api/model/sys_log.js @@ -0,0 +1,35 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +// db日志管理 +module.exports = sys_log = db.define("sys_log", { + table_name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "表名", + }, + operate: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "操作", + }, + content: { + type: Sequelize.JSON, + allowNull: false, + defaultValue: "", + comment: "内容", + set(value) { + this.setDataValue("content", { value }); + }, + get() { + let jsonValue = this.getDataValue("content"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + }, +}); +// sys_log.sync({ force: true }); diff --git a/api/model/sys_menu.js b/api/model/sys_menu.js new file mode 100644 index 0000000..dca3cca --- /dev/null +++ b/api/model/sys_menu.js @@ -0,0 +1,87 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +// 菜单表 +module.exports = sys_menu = db.define("sys_menu", { + // 菜单名称 + name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "菜单名称", + }, + + // 父id + parent_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: true, + defaultValue: 0, + comment: "父id", + }, + + // 图标 + icon: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "图标", + }, + path: { + type: Sequelize.STRING(255), + allowNull: false, + defaultValue: "", + comment: "路径", + }, + + // 菜单类型 "菜单", "页面", "外链", "功能" + type: { + type: Sequelize.STRING(255), + allowNull: false, + defaultValue: "页面", + comment: "菜单类型", + }, + //模型id + model_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: true, + defaultValue: 0, + comment: "模型id", + }, + // 组件地址 + component: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "组件地址", + }, + + // api地址 + api_path: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "api地址", + }, + // 是否显示在菜单中 + is_show_menu: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: true, + comment: "是否显示在菜单中", + }, + is_show: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: true, + comment: "是否展示", + }, + + // 菜单类型 + sort: { + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: "0", + comment: "菜单类型", + }, +}); + +// sys_menu.sync({ force: true }) diff --git a/api/model/sys_model.js b/api/model/sys_model.js new file mode 100644 index 0000000..acc1738 --- /dev/null +++ b/api/model/sys_model.js @@ -0,0 +1,26 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); + +module.exports = sys_model = db.define("sys_model", { + key: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + comment: "模型key", + }, + name: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: 0, + comment: "模型名称", + }, + // 项目id + project_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: true, + defaultValue: 0, + comment: "项目id", + }, +}); + +// sys_model.sync({ force: true }); diff --git a/api/model/sys_model_field.js b/api/model/sys_model_field.js new file mode 100644 index 0000000..3e7a5c8 --- /dev/null +++ b/api/model/sys_model_field.js @@ -0,0 +1,82 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); + +module.exports = sys_model_field = db.define("sys_model_field", { + model_id: { + type: Sequelize.INTEGER(11).UNSIGNED, + allowNull: false, + defaultValue: "0", + comment: "模型Id", + }, + + key: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + comment: "字段Key", + }, + name: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: 0, + comment: "名称", + }, + // 控件 + control: { + type: Sequelize.JSON, + allowNull: false, + defaultValue: "{}", + comment: "控件", + set(value) { + this.setDataValue("control", { value }); + }, + get() { + let jsonValue = this.getDataValue("control"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + }, + // 排序 + sort: { + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: 1, + comment: "排序", + }, + // 类型 + data_type: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "0", + comment: "数据类型", + }, + + //数据长度 + data_length: { + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: 50, + comment: "数据长度", + }, + + //是否为空 0 为空 , 1 不允许为空 + allow_null: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: 0, + comment: "是否为空", + }, + + // 默认值 + default_value: { + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + comment: "默认值", + }, +}); + +// sys_model_field.sync({ force: true }); diff --git a/api/model/sys_parameter.js b/api/model/sys_parameter.js new file mode 100644 index 0000000..0d3a807 --- /dev/null +++ b/api/model/sys_parameter.js @@ -0,0 +1,35 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +// 字典表 +module.exports = sys_parameter = db.define("sys_parameter", { + key: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "字典key", + }, + + value: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "值", + }, + + remark: { + type: Sequelize.STRING(500), + allowNull: false, + defaultValue: "", + comment: "备注", + }, + + // 是否允许修改 0 允许,1 不允许 + is_modified: { + type: Sequelize.INTEGER(2), + allowNull: false, + defaultValue: 0, + comment: "是否允许修改", + }, +}); + +// sys_parameter.sync({ force: true }) diff --git a/api/model/sys_project.js b/api/model/sys_project.js new file mode 100644 index 0000000..b7d9ec4 --- /dev/null +++ b/api/model/sys_project.js @@ -0,0 +1,33 @@ +const dayjs = require("dayjs"); +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +module.exports = sys_project = db.define("sys_project", { + name: { + comment: "项目名称", + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + }, + key: { + comment: "项目key", + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + }, + + project_type_id: { + comment: "项目类型", + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: "0", + }, + + remark: { + comment: "备注", + type: Sequelize.STRING(500), + allowNull: 1, + defaultValue: "", + }, +}); + +// sys_project.sync({ force: true }); diff --git a/api/model/sys_project_config.js b/api/model/sys_project_config.js new file mode 100644 index 0000000..ccd520c --- /dev/null +++ b/api/model/sys_project_config.js @@ -0,0 +1,141 @@ +const dayjs = require("dayjs"); +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +module.exports = sys_project_config = db.define("sys_project_config", { + project_id: { + comment: "项目id", + type: Sequelize.INTEGER(11), + allowNull: false, + defaultValue: "0", + }, + + config_env_type: { + comment: "环境类型", + type: Sequelize.INTEGER(2), + allowNull: false, + defaultValue: "0", + }, + + db: { + comment: "db配置", + type: Sequelize.JSON, + allowNull: false, + set(value) { + this.setDataValue("db", { value }); + }, + get() { + let jsonValue = this.getDataValue("db"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + defaultValue: { + username: "", + password: "", + database: "", + host: "", + port: 3306, + dialect: "mysql", + }, + }, + aliyun: { + comment: "阿里云配置", + type: Sequelize.JSON, + allowNull: false, + set(value) { + this.setDataValue("aliyun", { value }); + }, + get() { + let jsonValue = this.getDataValue("aliyun"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + defaultValue: { + accessKeyId: "", + accessKeySecret: "", + ossUrl: "", + }, + }, + redis: { + comment: "redis配置", + type: Sequelize.JSON, + allowNull: false, + set(value) { + this.setDataValue("redis", { value }); + }, + get() { + let jsonValue = this.getDataValue("redis"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + defaultValue: { + host: "", + port: "", + pwd: "", + opt: {}, + }, + }, + + file: { + comment: "文件配置", + type: Sequelize.JSON, + allowNull: false, + + set(value) { + this.setDataValue("file", { value }); + }, + get() { + let jsonValue = this.getDataValue("file"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + defaultValue: { + vue: { + api: "../../admin/src/api/", + view: "../../admin/src/view/", + }, + node: { + controller: "../controller_admin/", + model: "../model/", + }, + }, + }, + wechat: { + comment: "微信配置", + type: Sequelize.JSON, + allowNull: false, + set(value) { + this.setDataValue("wechat", { value }); + }, + get() { + let jsonValue = this.getDataValue("wechat"); + if (jsonValue && jsonValue.value !== undefined) { + return jsonValue.value; + } else { + return jsonValue; + } + }, + defaultValue: { + appid: "", + secret: "", + mch_id: "", + partner_key: "", + partnerV3_key: "", + notify_url: "", + refund_notify_url: "", + }, + }, +}); + +// sys_project_config.sync({ force: true }); diff --git a/api/model/sys_project_type.js b/api/model/sys_project_type.js new file mode 100644 index 0000000..7ddb7b0 --- /dev/null +++ b/api/model/sys_project_type.js @@ -0,0 +1,19 @@ +const dayjs = require("dayjs"); +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +module.exports = sys_project_type = db.define("sys_project_type", { + name: { + comment: "类型名称", + type: Sequelize.STRING(50), + allowNull: false, + defaultValue: "", + }, + + remark: { + comment: "备注", + type: Sequelize.STRING(500), + allowNull: false, + defaultValue: "", + }, +}); +// sys_project_type.sync({ force: true }); \ No newline at end of file diff --git a/api/model/sys_role.js b/api/model/sys_role.js new file mode 100644 index 0000000..b5a1895 --- /dev/null +++ b/api/model/sys_role.js @@ -0,0 +1,39 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +//角色表 +module.exports = sys_role = db.define("sys_role", { + name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "角色名称", + }, + // 0 普通角色 1 系统角色 + type: { + type: Sequelize.INTEGER(1), + allowNull: false, + defaultValue: "0", + comment: "角色类型", + }, + menus: { + type: Sequelize.JSON, + allowNull: false, + defaultValue: "", + comment: "权限菜单", + set(value) { + this.setDataValue('menus', { value }); + }, + get() { + let jsonValue = this.getDataValue("menus") + if (jsonValue && jsonValue.value !== undefined) { + + return jsonValue.value; + } + else { + return jsonValue + } + } + }, +}); + +// sys_role.sync({ force: true }) diff --git a/api/model/sys_user.js b/api/model/sys_user.js new file mode 100644 index 0000000..68ac265 --- /dev/null +++ b/api/model/sys_user.js @@ -0,0 +1,24 @@ +const db = require("../../middleware/db"); +const Sequelize = require("sequelize"); +// 系统用户表 +module.exports = sys_user = db.define("sys_user", { + name: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "名称", + }, + password: { + type: Sequelize.STRING(100), + allowNull: false, + defaultValue: "", + comment: "密码", + }, + roleId: { + type: Sequelize.INTEGER, + allowNull: false, + comment: "角色id", + }, +}); + +// sys_user.sync({ force: true }); diff --git a/api/service/autoFile.js b/api/service/autoFile.js new file mode 100644 index 0000000..2a87298 --- /dev/null +++ b/api/service/autoFile.js @@ -0,0 +1,426 @@ +var ejs = require("ejs"); +const path = require("path"); +const fs = require("fs"); +const db = require("../../middleware/db"); +const funTool = require("../../tool/funTool"); +const logsUtil = require("../../tool/logs"); +const Sequelize = require("sequelize"); +const { sys_project, sys_model, sys_model_field, sys_form, sys_form_field, op, querySql } = require("../../middleware/baseModel"); + +module.exports = { + configTemplate(curPath) { + let tempPath = path.join(__dirname, `../../config/template/${curPath}`); + return tempPath; + }, + + mapMySQLTypeToSequelize(mysqlType) { + const typeMapping = { + 'INT': "INTEGER", + 'VARCHAR': "STRING", + 'TEXT': "TEXT", + 'DATE': "DATE", + 'DATETIME': "DATE", + 'TIMESTAMP': "DATE", + 'BOOLEAN': "BOOLEAN", + 'FLOAT': "FLOAT", + 'DOUBLE': "DOUBLE", + 'DECIMAL': "DECIMAL", + 'BLOB': "BLOB", + 'JSON': "JSON", + }; + + const baseType = mysqlType.replace(/\(.*?\)/, '').toUpperCase(); + + return typeMapping[baseType] || "STRING"; + }, + async outBuildPath(curPath, projectId) { + let PROJECT_PATH = ``; + if (projectId) { + let projectRow = await sys_project.findOne({ where: { id: projectId } }); + if (projectRow) { + let { key } = projectRow; + PROJECT_PATH = `${key}/`; + } + } + + let tempPath = path.join(__dirname, `../../build/${PROJECT_PATH}${curPath}`); + + let directoryPath = path.dirname(tempPath); + if (!fs.existsSync(directoryPath)) { + // 如果目录不存在,创建目录 + fs.mkdirSync(directoryPath, { recursive: true }); + console.log("目录已创建"); + } + return tempPath; + }, + + getBuildUrl(curPath) { + let dirPath = path.join(__dirname, "../../"); + let newFilePath = curPath.replace(dirPath, ""); + newFilePath = newFilePath.replace("build", ""); + return newFilePath; + }, + + async querySql(sql, project_id) { + let dbPath = await this.outBuildPath(`api/db.js`, project_id); + let db = require(dbPath); + return await db.sequelize.query(sql, { type: Sequelize.QueryTypes.RAW }); + }, + + async ddlSql(sql, project_id) { + let dbPath = await this.outBuildPath(`api/db.js`, project_id); + let db = require(dbPath); + return await db.sequelize.query(sql, { type: Sequelize.QueryTypes.RAW }); + }, + + async autoConfig(project_id) { + let projectRow = await sys_project.findOne({ where: { id: project_id } }); + + if (projectRow) { + let { key: project_key } = projectRow + let projectConfig = await sys_project_config.findOne({ where: { project_id: project_id } }); + + let tempPath = this.configTemplate(`config.ejs`); + let dbTxt = await fs.readFileSync(tempPath, "utf-8"); + let htmlDbConnect = ejs.render(dbTxt, { project_key, config: projectConfig }, { rmWhitespace: true }); + let dbTempBuildPath = await this.outBuildPath(`config/config.json`, project_id); + await fs.writeFileSync(dbTempBuildPath, htmlDbConnect); + + } + + }, + + async autoDbConfig(project_id) { + let projectRow = await sys_project.findOne({ where: { id: project_id } }); + if (projectRow) { + let projectConfigRow = await sys_project_config.findOne({ where: { project_id } }); + if (projectConfigRow) { + let dbConfig = projectConfigRow.db; + + let tempPath = this.configTemplate(`db.ejs`); + let dbTxt = await fs.readFileSync(tempPath, "utf-8"); + let htmlDbConnect = ejs.render(dbTxt, { dbConfig }, { rmWhitespace: true }); + let dbTempBuildPath = await this.outBuildPath(`api/db.js`, project_id); + + if (await funTool.isExist(dbTempBuildPath)) { + fs.unlinkSync(dbTempBuildPath); + } + + await fs.writeFileSync(dbTempBuildPath, htmlDbConnect); + } + } + }, + + async autoInitDb(project_id) { + + let dbDdlPath = this.configTemplate(`dbInit/ddl.db`); + let ddlSql = await fs.readFileSync(dbDdlPath, "utf-8"); + let ddlRows = ddlSql.split(';') + + // 创建ddl表 + if (ddlRows && ddlRows.length > 0) { + for (let i = 0; i < ddlRows.length; i++) { + try { + let sql = ddlRows[i].trim() + + await this.ddlSql(sql, project_id) + } + catch (e) { + logsUtil.errError(e.message) + } + } + } + + + let dbInsertPath = this.configTemplate(`dbInit/insert.db`); + let insertSql = await fs.readFileSync(dbInsertPath, "utf-8"); + let insertRows = insertSql.split(';') + + // 初始化表 数据 + if (insertRows && insertRows.length > 0) { + for (let i = 0; i < insertRows.length; i++) { + try { + let sql = insertRows[i].trim() + let projectRow = await sys_project.findOne({ where: { id: project_id } }); + if (projectRow) { + sql = sql.replace("${demo系统管理}", projectRow.name) + } + + await this.ddlSql(sql, project_id) + } + catch (e) { + logsUtil.errError(e.message) + } + } + } + + }, + + async autoModel(id, uuid) { + let modelRow = await sys_model.findOne({ where: { id: id } }); + if (modelRow) { + let tempPath = this.configTemplate(`model.ejs`); + let modelTxt = await fs.readFileSync(tempPath, "utf-8"); + let columnsRows = await sys_model_field.findAll({ + where: { + model_id: id, + key: { + [op.notIn]: ["id", "create_time", "last_modify_time"] + } + }, order: [["sort", "asc"]] + }); + if (columnsRows) { + let html = ejs.render(modelTxt, { columns: columnsRows, table_name: modelRow.key, isProjectDb: false }, { rmWhitespace: true }); + let modelBuildPath = await this.outBuildPath(`api/model/${modelRow.key}.js`, modelRow.project_id); + await fs.writeFileSync(modelBuildPath, html); + + let htmlDb = ejs.render(modelTxt, { columns: columnsRows, table_name: modelRow.key, isProjectDb: true }, { rmWhitespace: true }); + let modelTempBuildPath = await this.outBuildPath(`api/model/${modelRow.key}_${uuid}.js`, modelRow.project_id); + await fs.writeFileSync(modelTempBuildPath, htmlDb); + } + } + }, + async autoDb(id, uuid) { + let modelRow = await sys_model.findOne({ where: { id: id } }); + if (modelRow) { + let { project_id, key } = modelRow; + let modelPath = await this.outBuildPath(`api/model/${key}_${uuid}.js`, project_id); + try { + // 延时调用 重新生成数据库 + let modelDb = require(modelPath); + await modelDb.sync({ force: true }); + fs.unlinkSync(modelPath); // 重新删除文件 + } catch (e) { + console.error(e.message); + fs.unlinkSync(modelPath); // 重新删除文件 + } + } + }, + + async autoController(id) { + let modelRow = await sys_model.findOne({ where: { id: id } }); + if (modelRow) { + let { key: table_name } = modelRow.toJSON(); + let controllerPath = this.configTemplate("controller.ejs"); + let controllerTxt = await fs.readFileSync(controllerPath, "utf-8", { rmWhitespace: true }); + let html = ejs.render(controllerTxt, { table_name }); + + let controllerAdminPath = await this.outBuildPath(`api/controller_admin/${table_name}.js`, modelRow.project_id); + await fs.writeFileSync(controllerAdminPath, html); + } + }, + + async getFrontTemplatePath(form_id) { + let fileName = ""; + let model_id = ""; + let modelName = "custom_template"; + + let sysFormRow = await sys_form.findOne({ where: { id: form_id } }); + if (sysFormRow) { + fileName = path.basename(sysFormRow.component).replace(".vue", ""); + model_id = sysFormRow.model_id; + let modelRow = await sys_model.findOne({ where: { id: model_id } }); + if (modelRow) { + modelName = modelRow.key; + } + } + + return { modelName, fileName, model_id }; + }, + + async createForm(row) { + if (row) { + let { model_id, component, api_path } = row; + let formRow = await sys_form.findOne({ where: { model_id, component, api_path } }); + + if (formRow) { + await sys_form_field.destroy({ where: { form_id: formRow.id } }); // 删除所有字段 + } else { + let modelRow = await sys_model.findOne({ where: { id: model_id } }); + let { name, project_id } = modelRow; + formRow = await sys_form.create({ name, project_id, model_id, component, api_path }); + } + + // 创建表单 + if (formRow) { + let form_id = formRow.id; + let fieldRows = await sys_model_field.findAll({ where: { model_id: model_id }, order: [["sort", "asc"]] }); + if (fieldRows && fieldRows.length > 0) { + for (let i = 0; i < fieldRows.length; i++) { + let { id: model_field_id, name: model_field_name, control, data_type } = fieldRows[i]; + let is_show_list = data_type === "TEXT" ? 0 : 1; + + await sys_form_field.create({ form_id, model_field_id, model_field_name, control, is_show_edit: 1, is_edit_disable: 0, is_show_list, is_show_seach: 1, sort: i }); + } + } + } + } + }, + + // 生成前端文件Api + async autoFrontApi(row) { + if (row) { + let { id: form_id, api_path, project_id } = row; + let api_path_index = api_path.lastIndexOf("/"); + let folderPath = await this.outBuildPath(`admin/src/api/${api_path.substr(0, api_path_index)}`, project_id); + let filePath = api_path.substr(api_path_index, api_path.length - 1); + + let apihtml = ""; + let { modelName, fileName } = await this.getFrontTemplatePath(form_id); + if (fileName) { + let apiServerPath = this.configTemplate("vue_file/apiServer.ejs"); + let controllerTxt = await fs.readFileSync(apiServerPath, "utf-8"); + apihtml = ejs.render(controllerTxt, { modelName, fileName }); + } + + //创建文件夹 + await funTool.mkdirsSync(folderPath); + + let newFilePath = `${folderPath}/${filePath}`; + + // 创建api文件 + await fs.writeFileSync(newFilePath, apihtml); + + let buildUrl = this.getBuildUrl(newFilePath); + + return buildUrl; + } + }, + + // 创建page 下Vue文件 + async autoFrontVue(row) { + if (row) { + let { id: form_id, component, api_path } = row; + let component_index = component.lastIndexOf("/"); + let folderRoot = `${component.substr(0, component_index)}`; + + let { fileName, model_id } = await this.getFrontTemplatePath(form_id); + if (fileName) { + let sysFormRow = await sys_form.findOne({ where: { id: form_id } }); + if (sysFormRow && sysFormRow.id) { + let sysFormFields = await sys_form_field.findAll({ + where: { form_id: sysFormRow.id }, + include: [ + { + association: sys_form_field.associations.field, + attributes: ["key", "name", "data_type", "default_value"], + }, + ], + order: [["sort", "asc"]], + }); + let newcolumnsRows = sysFormFields.map((p) => { + let newRow = p.toJSON(); + + // 设置默认值 + if (newRow.field && newRow.field.default_value) { + newRow.default_value = newRow.field.default_value; + } else { + newRow.default_value = ""; + } + + newRow.name = newRow.model_field_name; + + if (newRow.field && newRow.field.key) { + newRow.key = newRow.field.key; + newRow.data_type = newRow.field.data_type; + } + + if (typeof newRow.control === "string") { + newRow.control = JSON.parse(newRow.control); + } + + if (newRow.control.interfaceType === "本地数据") { + newRow.source = newRow.control.localData || []; + } else { + newRow.source = []; + } + return newRow; + }); + + let pagePath = this.configTemplate(`vue_file/page.ejs`); + let controllerTxt = await fs.readFileSync(pagePath, "utf-8"); + + let pageHtml = ejs.render(controllerTxt, { api_path, fileName, columns: newcolumnsRows, model_id }, { rmWhitespace: true }); + + let folderPath = await this.outBuildPath(`admin/src/view/${folderRoot}`, sysFormRow.project_id); + + //创建文件夹 + await funTool.mkdirsSync(folderPath); + + let filePath = `${folderPath}/${fileName}.vue`; + + await fs.writeFileSync(filePath, pageHtml); + + let buildUrl = this.getBuildUrl(filePath); + + return buildUrl; + } + } + } + }, + // 删除vueApiServer文件 + async destroyApiFile(form_id) { + try { + let formRow = await sys_form.findOne({ where: { id: form_id } }); + if (formRow) { + let { model_id, project_id } = formRow; + let modelRow = await sys_model.findOne({ where: { id: model_id } }); + if (modelRow) { + let modelKey = modelRow.key; + + // 删除后端 controller + let controller_admin_path = await this.outBuildPath(`api/controller_admin/${modelKey}.js`, project_id); + if (await funTool.isExist(controller_admin_path)) { + fs.unlinkSync(controller_admin_path); + } + + // 删除后端 modelPath + let modelPath = await this.outBuildPath(`api/model/${modelKey}.js`, project_id); + if (await funTool.isExist(modelPath)) { + fs.unlinkSync(modelPath); + } + + // 删除数据库 + await ddlSql(`DROP TABLE ${modelKey}`); + } + } + } catch (error) { + logsUtil.errError(error.message); + return false; + } + + return true; + }, + + // 删除vue文件 + async destroyVueFile(form_id) { + let formRow = await sys_form.findOne({ where: { id: form_id } }); + + if (formRow) { + let { id, component, api_path, project_id } = formRow; + + // 删除前端page + if (component) { + let pagePath = await this.outBuildPath(`admin/src/view/${component}`, project_id); + if (await funTool.isExist(pagePath)) { + fs.unlinkSync(pagePath); + } + } + + // 删除前端apiServe + if (api_path) { + let apiPath = await this.outBuildPath(`admin/src/api/${api_path}`, project_id); + if (await funTool.isExist(apiPath)) { + fs.unlinkSync(apiPath); + } + } + + // 删除表单 + let formRow = await sys_form.findOne({ where: { id } }); + if (formRow) { + await sys_form_field.destroy({ where: { form_id: formRow.id } }); + await formRow.destroy({}); + } + } + }, +}; diff --git a/api/service/ffmpeg/encoder.js b/api/service/ffmpeg/encoder.js new file mode 100644 index 0000000..714918d --- /dev/null +++ b/api/service/ffmpeg/encoder.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var ffmpeg = require("fluent-ffmpeg"); +var fs = require("fs"); +var path = require("path"); +var cliProgress = require("cli-progress"); +var stream_1 = require("stream"); +var progressBar = new cliProgress.SingleBar({ + format: "Processing | {bar} | {percentage}%", + barCompleteChar: "\u2588", + barIncompleteChar: "\u2591", + hideCursor: true, +}); +var typeCheck = function (reject, config) { + var frameStream = config.frameStream, output = config.output, backgroundVideo = config.backgroundVideo, fps = config.fps; + if (!(frameStream instanceof stream_1.Readable)) { + reject(new Error("frameStream should be in type Readable. You provided " + typeof frameStream)); + } + if (!(typeof output === "string")) { + reject(new Error("output should be a string. You provided " + typeof output)); + } + if (!(fps && fps.input && fps.output)) { + reject(new Error("fps should be an object with input and output properties")); + } + if (backgroundVideo) { + var inSeconds = backgroundVideo.inSeconds, videoPath = backgroundVideo.videoPath, outSeconds = backgroundVideo.outSeconds; + if (typeof inSeconds !== "number" || + typeof outSeconds !== "number" || + typeof videoPath !== "string") { + reject(new Error("backgroundVideo property is not correctly set")); + } + } +}; +var createDir = function (reject, silent, output) { + try { + var outDir = path.dirname(output); + if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir, { recursive: true }); + } + } + catch (e) { + if (!silent) + console.log("Could not create/access output directory"); + reject(new Error("Cannot create/access output directory")); + } +}; +var createFilter = function (backgroundVideo) { + var inSeconds = backgroundVideo.inSeconds, outSeconds = backgroundVideo.outSeconds; + return [ + "[1:v]setpts=PTS+" + inSeconds + "/TB[out]", + { + filter: "overlay", + options: { + enable: "between(t," + inSeconds + "," + outSeconds + ")", + x: "0", + y: "0", + }, + inputs: "[0:v][out]", + outputs: "tmp", + }, + ]; +}; +var percent = function (percent) { + return percent ? parseFloat(percent.toFixed(2)) : 0; +}; +var outputOptions = [ + "-preset veryfast", + "-crf 24", + "-f mp4", + "-vcodec libx264", + "-movflags frag_keyframe+empty_moov", + "-pix_fmt yuv420p", +]; +var encoder = function (config) { + return new Promise(function (resolve, reject) { + var frameStream = config.frameStream, output = config.output, backgroundVideo = config.backgroundVideo, fps = config.fps, _a = config.silent, silent = _a === void 0 ? true : _a; + typeCheck(reject, config); + createDir(reject, silent, output); + var outputStream = fs.createWriteStream(output); + var command = ffmpeg(); + if (backgroundVideo) + command.input(backgroundVideo.videoPath); + command.input(frameStream).inputFPS(fps.input); + command.outputOptions(outputOptions); + command.fps(fps.output); + if (backgroundVideo) + command.complexFilter(createFilter(backgroundVideo), "tmp"); + command.output(outputStream); + command.on("start", function (commandLine) { + console.log("ffmpeg started with command: ", commandLine); + if (!silent) + progressBar.start(100, 0); + }); + command.on("end", function (str) { + if (!silent) + progressBar.stop(); + if (!silent) + console.log("Processing complete...," + str); + resolve({ path: output, stream: outputStream }); + }); + command.on("progress", function (progress) { + if (!silent) + progressBar.update(percent(progress.percent)); + }); + command.on("error", function (err) { + if (!silent) + console.log("An error occured while processing,", err.message); + reject(new Error(err.message)); + }); + command.run(); + }); +}; +module.exports = { encoder }; diff --git a/api/service/http.js b/api/service/http.js new file mode 100644 index 0000000..6085609 --- /dev/null +++ b/api/service/http.js @@ -0,0 +1,61 @@ +const logsUtil = require("../../tool/logs"); +const axios = require("axios"); +const request = require("request"); + +const instanceRequest = (options) => { + let promise = new Promise(function (resolve, reject) { + request.post(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + resolve(body); + } + reject(error); + }); + }); + return promise; +}; + +module.exports = { + async postFormData(url, param) { + const options = { + method: "POST", + url: url, + headers: { "Content-Type": "multipart/form-data" }, + formData: param, + json: true, + }; + + return await instanceRequest(options); + }, + + async post(url, param) { + const options = { + method: "POST", + url: url, + body: param, + json: true, + encoding: null, + }; + + return await instanceRequest(options); + }, + + async get(url, param) { + const options = { + method: "GET", + url: url, + qs: param, + json: true, + encoding: null, + }; + + let promise = new Promise(function (resolve, reject) { + request.get(options, function (error, response, body) { + if (!error && response.statusCode == 200) { + resolve(body); + } + reject(error); + }); + }); + return promise; + }, +}; diff --git a/api/service/ossTool.js b/api/service/ossTool.js new file mode 100644 index 0000000..1e7226e --- /dev/null +++ b/api/service/ossTool.js @@ -0,0 +1,47 @@ +let OSS = require('ali-oss') +var fs = require('fs') +const config = require('../../config/config')['aliyun'] +const uuid = require('node-uuid') + + +let client = new OSS({ + region: 'oss-cn-shanghai', + accessKeyId: config.accessKeyId, + accessKeySecret: config.accessKeySecret, + bucket: 'bztic-shopant-files' +}) + + +module.exports = { + + async putImg(file) { + + const stream = fs.createReadStream(file.path) + + let uid = uuid.v4() + + let lastIndex = file.name.lastIndexOf('.') + + let suffix = file.name.substring(lastIndex, file.name.length) + + let result = await client.put('/front/plug/images/' + uid + suffix, stream, { headers: { 'content-disposition': 'inline', "content-type": file.type } }) + if (result.res.status === 200) { + let ossPath = config.ossUrl + '/' + result.name + return { name: result.name, path: result.url, ossPath } + } else { + return {} + } + }, + + async putImgStream(stream, suffix = 'png') { + + let uid = uuid.v4() + let result = await client.put('front/plug/images/' + uid + '.' + suffix, stream, { headers: { 'content-disposition': 'inline', "content-type": `image/${suffix}` } }) + if (result.res.status === 200) { + let ossPath = config.ossUrl + result.name + return { name: result.name, path: result.url, ossPath } + } else { + return {} + } + }, +} \ No newline at end of file diff --git a/api/service/redis.js b/api/service/redis.js new file mode 100644 index 0000000..07ce116 --- /dev/null +++ b/api/service/redis.js @@ -0,0 +1,50 @@ +const redis = require("redis"); +const config = require("../../config/config"); +let rclient = null; +module.exports = { + + getConfig() { + let { port, host, opt } = config.redis || {} + return { port, host, opt } + }, + init() { + + let { port, host, opt } = this.getConfig() + + if (host && port) { + rclient = redis.createClient(port, host, opt); + rclient.auth(config.pwd, function () { + console.log("redis通过认证"); + }); + rclient.on("connect", function () { + console.log("redis连接成功"); + }); + } + + + }, + + // 设置key值 + set(key, value, expire = 0) { + if (!rclient) { + this.init(); + } + + rclient.set(key, value); //赋值 + if (expire) { + rclient.expire(key, expire); //60秒自动过期 + } + }, + + get(key) { + if (!rclient) { + this.init(); + } + + return new Promise((resolve, reject) => { + rclient.get(key, function (err, data) { + resolve(data); + }); + }); + }, +}; diff --git a/api/service/token.js b/api/service/token.js new file mode 100644 index 0000000..9ab98ab --- /dev/null +++ b/api/service/token.js @@ -0,0 +1,27 @@ +const jwt = require('jsonwebtoken'); +const secret = 'SLDLKKDS323ssdd@#@@gf'; + +module.exports = { + + create (userInfo) { + const token = jwt.sign(userInfo, secret); + return token; + }, + parse (token) { + if (token) { + try { + return jwt.verify(token, secret); + } catch (err) { + return null; + } + } + return null; + }, + verify (token) { + const result = this.parse(token); + if (!result) { + return false; + } + return true; + } +}; diff --git a/app.js b/app.js new file mode 100644 index 0000000..d5e87aa --- /dev/null +++ b/app.js @@ -0,0 +1,56 @@ +const Koa = require("koa"); +const bodyParser = require("koa-bodyparser"); +const cors = require("koa2-cors"); +const koaBody = require("koa-body"); +const staticFiles = require("koa-static"); +const path = require("path"); +const baseRequest = require("./middleware/baseRequest"); +const baseController = require("./middleware/baseController"); +const schedule = require("./middleware/schedule"); +const sqlUpdate = require("./middleware/sqlUpdate"); + +const db = require("./middleware/db"); +const { port } = require("./config/config.json"); +const app = new Koa(); + +// 配置静态web服务的中间件 +app.use(staticFiles(path.resolve(__dirname, "./upload"), { extensions: ["html"] })); + +app.use(staticFiles(path.resolve(__dirname, "./build"), { extensions: ["html", "js", "vue"] })); + + + +app.use( + cors({ + exposeHeaders: ["*"], + }) +); + +let bodyConfig = { + multipart: true, + formidable: { + maxFileSize: 200 * 1024 * 1024, // 设置上传文件大小最大限制,默认2M + }, +}; + +app.use(koaBody(bodyConfig)); + +// 格式化body +app.use(bodyParser()); + +// 过滤请求 +app.use(baseRequest()); + +// 注册路由 +app.use(baseController()); + +schedule.init(); + +app.listen(port.node); + +// sqlUpdate.init() + +console.log(`http://localhost:${port.node}`); + +// 同步数据库结构 +// db.sync({ force: true }); diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..cf4f99a --- /dev/null +++ b/config/config.json @@ -0,0 +1,49 @@ +{ + "jwtkey": "97856358!@#", + "port": { + "node": 9096, + "web": 9095 + }, + "allowUrls": ["/admin_api/sys_user/login", "/admin_api/sys_user/authorityMenus", "/admin_api/sys_user/register", "/api/user/loginByWeixin", "/file/", "/sys_file/"], + + "fileConifg": { + "vue": { + "api": "../../admin/src/api/", + "view": "../../admin/src/view/" + }, + "node": { + "controller": "../controller_admin/", + "model": "../model/" + } + }, + "db": { + "database": "platformweb", + "username": "platformweb", + "password": "BPPypsjfZExHzA7G", + "host": "47.98.167.204", + "port": 3306, + "dialect": "mysql" + }, + + "wechat": { + "appid": "", + "secret": "", + "mch_id": "", + "partner_key": "", + "partnerV3_key": "", + "notify_url": "", + "refund_notify_url": "", + "shareUrlQr": "" + }, + "aliyun": { + "accessKeyId": "LTAITcmHTshBRPQ4", + "accessKeySecret": "TA4j4cLYdRTDIWBc0DGoSNstSDW5CY", + "ossUrl": "http://light22600.oss-cn-beijing.aliyuncs.com" + }, + "redis": { + "host": "", + "port": "", + "pwd": "", + "opt": {} + } +} diff --git a/config/template/config.ejs b/config/template/config.ejs new file mode 100644 index 0000000..361ddef --- /dev/null +++ b/config/template/config.ejs @@ -0,0 +1,52 @@ +{ + + "platformApiUrl": "http://auto.light120.com/api", + "project_key": "<%=project_key%>", + "jwtkey": "9233358!@#", + "port": { + "node": 9091, + "web": 9090 + }, + "allowUrls": ["/admin_api/sys_user/login", "/admin_api/sys_user/authorityMenus", "/admin_api/sys_user/register", "/api/user/loginByWeixin", "/file/", "/sys_file/"], + + "fileConifg": { + "vue": { + "api": "../../admin/src/api/", + "view": "../../admin/src/view/" + }, + "node": { + "controller": "../controller_admin/", + "model": "../model/" + } + }, + "db":{ + "username": "<%=config.db.username%>", + "password": "<%=config.db.password%>", + "database": "<%=config.db.database%>", + "host": "<%=config.db.host%>", + "port": <%=config.db.port%>, + "dialect": "<%=config.db.dialect%>" + }, + "wechat":{ + "appid": "<%=config.wechat.appid%>", + "secret": "<%=config.wechat.secret%>", + "mch_id": "<%=config.wechat.mch_id%>", + "partner_key": "<%=config.wechat.partner_key%>", + "partnerV3_key": "<%=config.wechat.partnerV3_key%>", + "notify_url": "<%=config.wechat.notify_url%>", + "refund_notify_url": "<%=config.wechat.refund_notify_url%>" + + }, + "aliyun":{ + "accessKeyId": "<%=config.aliyun.accessKeyId%>", + "accessKeySecret": "<%=config.aliyun.accessKeyId%>", + "ossUrl": "<%=config.aliyun.accessKeyId%>" + } , + "redis":{ + "host": "<%=config.redis.host%>", + "port": "<%=config.redis.port%>", + "pwd": "<%=config.redis.pwd%>", + "opt": {} + + } +} diff --git a/config/template/controller.ejs b/config/template/controller.ejs new file mode 100644 index 0000000..fe6b189 --- /dev/null +++ b/config/template/controller.ejs @@ -0,0 +1,77 @@ +const {<%=table_name%>, op } = require('../../middleware/baseModel'); + + module.exports = { + 'GET /<%=table_name%>/all' : async (ctx, next) => { + const res = await <%=table_name%>.findAll(); + return ctx.success(res); + }, + + 'GET /<%=table_name%>/detail' : async (ctx, next) => { + let id = ctx.get('id') + const res = await <%=table_name%>.findOne({where:{id:id}}); + return ctx.success(res); + }, + + + "POST /<%=table_name%>/export": async (ctx, next) => { + let rows = []; + let cols = []; + let title='<%=table_name%>'; + + let tableAttributes = <%=table_name%>.tableAttributes; + let colKeys = Object.keys(tableAttributes); + + colKeys.forEach((key) => { + let row = tableAttributes[key]; + let caption = row.comment ? row.comment : row.fieldName; + cols.push({ caption, type: row.type.__proto__.key === "INTEGER" ? "number" : "string", key: row.field }); + }); + + const dbRows = await <%=table_name%>.findAll({}); + rows = dbRows.map((p) => { + let tempRow = p.toJSON(); + let row = []; + cols.forEach((col) => { + row.push(tempRow[col.key]); + }); + return row; + }); + + return ctx.downFile({title, rows, cols }); + }, + + 'POST /<%=table_name%>/page' : async (ctx, next) => { + let param = ctx.getPageSize() + let row = ctx.getBody(); + let {key,value}=row.seachOption + let where={} + if(key&&value){ + where[key]={ [op.like]:'%' +value + '%'} + } + + const res = await <%=table_name%>.findAndCountAll({ + where, + order: [["id", "DESC"]], + ...param, + }); + return ctx.success(res); + }, + + 'POST /<%=table_name%>/add': async (ctx, next) => { + let row = ctx.getBody(); + const res = await <%=table_name%>.create(row); + return ctx.success(res); + }, + 'POST /<%=table_name%>/edit': async (ctx, next) => { + let row = ctx.getBody(); + let id = ctx.get('id') + const res = await <%=table_name%>.update(row, { where: { id: id }, individualHooks: true }); + return ctx.success(res); + }, + + 'POST /<%=table_name%>/del': async (ctx, next) => { + let id = ctx.get('id') + const res = await <%=table_name%>.destroy({ where: { id: id }, individualHooks: true }); + return ctx.success(res); + } + }; \ No newline at end of file diff --git a/config/template/db.ejs b/config/template/db.ejs new file mode 100644 index 0000000..5b39c08 --- /dev/null +++ b/config/template/db.ejs @@ -0,0 +1,168 @@ +const dayjs = require("dayjs"); +const Sequelize = require("sequelize"); + +const config ={ + "username": "<%=dbConfig.username%>", + "password": "<%=dbConfig.password%>", + "database": "<%=dbConfig.database%>", + "host": "<%=dbConfig.host%>", + "port": <%=dbConfig.port%>, + "dialect": "<%=dbConfig.dialect%>" +} + +let model = {}; + +const logEditField = (oldRow, newRow) => { + let str = ``; + oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; + newRow = newRow ? newRow.toJSON() : newRow; + + let keyRows = Object.keys(oldRow); + for (let i = 0; i < keyRows.length; i++) { + let key = keyRows[i]; + + if (key !== "create_time" && key !== "last_modify_time" && oldRow[key] !== newRow[key]) { + let oldVal = oldRow[key]; + if (typeof oldVal === "string") { + oldVal = oldVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + + let newVal = newRow[key]; + if (typeof newVal === "string") { + newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + str += ` ${key} 从 ${oldVal} 变更为 ${newVal}
`; + } + } + return str; +}; + +const logCreateField = (oldRow) => { + let str = ``; + oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; + let keyRows = Object.keys(oldRow); + + for (let i = 0; i < keyRows.length; i++) { + let key = keyRows[i]; + + if (key !== "create_time" && key !== "last_modify_time") { + let newVal = oldRow[key]; + if (typeof newVal === "string") { + newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + + str += ` ${key} ${newVal}
`; + } + } + return str; +}; + +let sequelize = new Sequelize(config.database, config.username, config.password, { + host: config.host, + dialect: config.dialect, + pool: { + max: 5, + min: 0, + idle: 10000, + }, + dialectOptions: { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci", + supportBigNumbers: true, + bigNumberStrings: true, + }, +}); + +const define = (name, attributes) => { + let attrs = {}; + for (let key in attributes) { + let value = attributes[key]; + if (typeof value === "object" && value["type"]) { + value.allowNull = value.allowNull || false; + attrs[key] = value; + } else { + attrs[key] = { + type: value, + allowNull: false, + }; + } + } + + attrs.create_time = { + type: Sequelize.DATE, + allowNull: false, + defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), + comment: "创建时间", + get() { + return dayjs(this.getDataValue("create_time")).format("YYYY-MM-DD HH:mm:ss"); + }, + }; + + attrs.last_modify_time = { + type: Sequelize.DATE, + allowNull: false, + comment: "最后更新时间", + defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), + get() { + return dayjs(this.getDataValue("last_modify_time")).format("YYYY-MM-DD HH:mm:ss"); + }, + }; + + model[name] = sequelize.define(name, attrs, { + tableName: name, + timestamps: false, + hooks: { + beforeValidate: (obj) => { + let now = Date.now(); + if (obj.isNewRecord) { + obj.create_time = now; + obj.last_modify_time = now; + } else { + obj.last_modify_time = now; + } + }, + afterCreate: async (obj) => { + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + let logStr = logCreateField(obj); + await model["sys_log"].create({ table_name: tableName, operate: "新增", content: logStr }); + } + }, + + afterDestroy: async (obj) => { + let id = obj.id; + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + await model["sys_log"].create({ table_name: tableName, operate: "删除", content: `用户删除id为 ${id} ` }); + } + }, + + beforeUpdate: async (obj) => { + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + let id = obj.id; + let tableName = obj._modelOptions.tableName; + let updateRow = await model[tableName].findOne({ where: { id } }); + let logStr = logEditField(updateRow, obj); + await model["sys_log"].create({ table_name: tableName, operate: "修改", content: logStr }); + } + }, + }, + }); + + return model[name]; +}; + +let exp = { + sequelize, + define, + sync: () => { + if (process.env.NODE_ENV !== "production") { + sequelize.sync({ force: false }); + } else { + throw new Error("Cannot sync() when NODE_ENV is set to 'production'."); + } + }, +}; + +module.exports = exp; diff --git a/config/template/dbInit/ddl.db b/config/template/dbInit/ddl.db new file mode 100644 index 0000000..e3b1d5e --- /dev/null +++ b/config/template/dbInit/ddl.db @@ -0,0 +1,68 @@ +DROP TABLE IF EXISTS sys_user; +CREATE TABLE `sys_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '', + `password` varchar(100) NOT NULL DEFAULT '', + `roleId` int(8) NOT NULL, + `create_time` datetime DEFAULT NULL, + `last_modify_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + + + + +DROP TABLE IF EXISTS sys_role; +CREATE TABLE `sys_role` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '', + `type` int(1) NOT NULL DEFAULT '0', + `menus` json NOT NULL, + `create_time` datetime DEFAULT NULL, + `last_modify_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS sys_menu; +CREATE TABLE `sys_menu` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '', + `parent_id` int(5) unsigned DEFAULT '0', + `model_id` int(11) unsigned DEFAULT NULL, + `form_id` int(11) DEFAULT NULL, + `icon` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `component` varchar(100) NOT NULL DEFAULT '', + `api_path` varchar(100) DEFAULT NULL, + `is_show_menu` tinyint(1) NOT NULL DEFAULT '1', + `is_show` tinyint(1) NOT NULL DEFAULT '1', + `type` enum('菜单','页面','外链','功能') NOT NULL DEFAULT '页面', + `sort` int(11) DEFAULT '0', + `create_time` datetime DEFAULT NULL, + `last_modify_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS sys_log; +CREATE TABLE `sys_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `table_name` varchar(100) NOT NULL DEFAULT '', + `user_id` int(11) unsigned NOT NULL DEFAULT '0', + `operate` varchar(100) NOT NULL DEFAULT '', + `content` json NOT NULL, + `create_time` datetime DEFAULT NULL, + `last_modify_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1388 DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS sys_parameter; +CREATE TABLE `sys_parameter` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(100) NOT NULL DEFAULT '', + `value` varchar(100) NOT NULL DEFAULT '', + `is_modified` int(2) DEFAULT '0', + `remark` varchar(500) NOT NULL DEFAULT '', + `create_time` datetime DEFAULT NULL, + `last_modify_time` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/config/template/dbInit/insert.db b/config/template/dbInit/insert.db new file mode 100644 index 0000000..6ba9b71 --- /dev/null +++ b/config/template/dbInit/insert.db @@ -0,0 +1,43 @@ +INSERT INTO sys_user +(id, name, password, roleId, create_time, last_modify_time) +VALUES(1, 'zc', 'd3df61764ee9a26091f714b88958caef', 6, '2022-10-24 05:45:40', '2022-10-24 05:45:40'); + + + +INSERT INTO sys_user +(id, name, password, roleId, create_time, last_modify_time) +VALUES(2, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 4, '2022-10-24 05:45:40', '2022-10-24 05:45:40'); + + + +INSERT INTO sys_role +(id, name, `type`, menus, create_time, last_modify_time) +VALUES(3, '运营专员', 0, '{"value": "[1,71,77,82,67,68]"}', '2020-03-20 05:22:40', '2020-03-20 05:22:40'); + +INSERT INTO sys_role +(id, name, `type`, menus, create_time, last_modify_time) +VALUES(4, '管理员', 0, '{"value": "[1,71,76,77,78,79,5,11,12,67,68,15]"}', '2020-03-28 17:35:39', '2022-10-28 19:04:40'); + +INSERT INTO sys_role +(id, name, `type`, menus, create_time, last_modify_time) +VALUES(6, '超级管理员', 1, '{"value": "[1,71,80,78,76,77,5,11,12,67,68,15,31,13,26,27]"}', '2020-05-02 08:32:44', '2020-05-02 08:32:44'); + + +INSERT INTO sys_parameter (id, `key`, value, is_modified, remark, create_time, last_modify_time) VALUES(1, 'sys_title', '${demo系统管理}', 0, '系统标题', '2023-11-16 09:28:45', '2023-11-16 09:28:45'); +INSERT INTO sys_parameter (id, `key`, value, is_modified, remark, create_time, last_modify_time) VALUES(2, 'sys_logo', 'https://light22600.oss-cn-beijing.aliyuncs.com/bgWeb/logo.png', 0, '系统logo', '2021-11-12 14:44:31', '2021-11-12 14:44:31'); + + +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(1, '首页', 0, NULL, NULL, 'md-home', 'home', 'home/index.vue', NULL, 1, 1, '页面', 0, '2021-07-16 11:48:15', '2021-07-16 11:48:15'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(5, '系统管理', 0, NULL, NULL, 'ios-construct', 'system', '', NULL, 1, 1, '菜单', 100, '2021-07-16 12:02:32', '2021-07-16 12:02:32'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(11, '系统用户', 5, NULL, NULL, 'md-bug', 'sys_user', 'system/sys_user.vue', 'system/sys_user_server.js', 1, 1, '页面', 0, '2021-07-16 04:56:54', '2021-07-16 04:56:54'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(12, '角色管理', 5, NULL, NULL, 'md-disc', 'sys_role', 'system/sys_role.vue', 'system/sys_role_server.js', 1, 1, '页面', 0, '2021-07-16 04:57:04', '2021-07-16 04:57:04'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(13, '菜单管理', 5, NULL, NULL, 'ios-people', 'menu', 'system_high/sys_menu.vue', NULL, 1, 1, '页面', 0, '2021-06-17 09:13:37', '2021-06-17 09:13:37'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(15, '参数设定管理', 5, NULL, NULL, 'ios-people', 'sys_param_setup', 'system/sys_param_setup.vue', 'system/sys_param_setup_server.js', 1, 1, '页面', 5, '2021-11-12 06:06:58', '2021-11-12 06:06:58'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(60, '用户管理', 59, 4, NULL, 'md-cloud-upload', 'vip_member', 'vip/vip_member.vue', 'vip/vip_member_server.js', 1, 1, '页面', 1, '2021-07-05 09:55:53', '2021-07-05 09:55:53'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(65, '信息类目管理', 64, 5, NULL, 'md-calculator', 'info_type', 'cote/info_type.vue', 'cote/info_type_server.js', 1, 1, '页面', 1, '2021-09-02 06:25:45', '2021-09-02 06:25:45'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(66, '信息管理', 64, 6, NULL, 'md-color-palette', 'info', 'cote/info.vue', 'cote/info_server.js', 1, 1, '页面', 2, '2021-07-15 09:33:57', '2021-07-15 09:33:57'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(67, '日志管理', 5, 0, NULL, 'md-cash', 'sys_log', 'system/sys_log.vue', 'system/sys_log_server.js', 1, 1, '页面', 1, '2021-07-16 08:44:34', '2021-07-16 08:44:34'); +INSERT INTO sys_menu (id, name, parent_id, model_id, form_id, icon, `path`, component, api_path, is_show_menu, is_show, `type`, sort, create_time, last_modify_time) VALUES(68, '操作日志', 5, 0, NULL, 'md-female', 'sys_log_operate', 'system/sys_log_operate.vue', 'system/sys_log_operate_server.js', 1, 1, '页面', 1, '2021-07-19 05:49:52', '2021-07-19 05:49:52'); + + + diff --git a/config/template/model.ejs b/config/template/model.ejs new file mode 100644 index 0000000..a575015 --- /dev/null +++ b/config/template/model.ejs @@ -0,0 +1,25 @@ +const dayjs = require("dayjs"); +const Sequelize = require('sequelize'); +<% if(isProjectDb){%> +const db = require('../db.js'); +<%} else{%> +const db = require('../../middleware/db'); +<%}%> + +module.exports = db.define('<%=table_name%>', { + <% columns.forEach(function(col){ %> + <%=col.key%>:{ + comment:'<%=col.name%>', + <%if(col.data_type==="DOUBLE") {%>type: Sequelize.<%=col.data_type%>(<%=col.data_length%>,4),<%} + else if(col.data_type==='DATE'||col.data_type==='TEXT'||col.data_type==='JSON'){%>type: Sequelize.<%=col.data_type%>(), <%} + else {%>type: Sequelize.<%=col.data_type%>(<%=col.data_length%>), <%}%> + allowNull: <%=col.allow_null||false%>, + <%if(col.data_type==='DATE'){%>defaultValue: Sequelize.literal("CURRENT_TIMESTAMP"), + get() { return dayjs(this.getDataValue("<%=col.key%>")).format("YYYY-MM-DD HH:mm:ss");}<%} + else if(col.data_type==='INTEGER'){%>defaultValue: '0'<%} + else if(col.data_type==='BOOLEAN'){%>defaultValue: '0'<%} + else{%>defaultValue: '<%=col.default_value%>' + <%}%> + }, + <%});%> +}); \ No newline at end of file diff --git a/config/template/systemWeb.zip b/config/template/systemWeb.zip new file mode 100644 index 0000000..04645a4 Binary files /dev/null and b/config/template/systemWeb.zip differ diff --git a/config/template/vue_file/apiServer.ejs b/config/template/vue_file/apiServer.ejs new file mode 100644 index 0000000..7b6780d --- /dev/null +++ b/config/template/vue_file/apiServer.ejs @@ -0,0 +1,38 @@ +import http from '@/libs/http'; +class <%=fileName%>ClServer { + async all(param) { + let res= await http.get('/<%=modelName%>/all', param); + return res; + } + + + async page(row) { + let res= await http.post('/<%=modelName%>/page', row); + return res; + } + + + async exportCsv(row) { + let res = http.fileExport("/<%=modelName%>/export", row); + return res; + } + + async add(row) { + let res= await http.post('/<%=modelName%>/add', row); + return res; + } + + async edit(row) { + let res= await http.post('/<%=modelName%>/edit', row); + return res; + } + + async del(row) { + let res= await http.post('/<%=modelName%>/del', row); + return res; + } +} + +const <%=fileName%>Server = new <%=fileName%>ClServer(); +export default <%=fileName%>Server; + \ No newline at end of file diff --git a/config/template/vue_file/page.ejs b/config/template/vue_file/page.ejs new file mode 100644 index 0000000..8116e05 --- /dev/null +++ b/config/template/vue_file/page.ejs @@ -0,0 +1,190 @@ + + + + diff --git a/middleware/baseController.js b/middleware/baseController.js new file mode 100644 index 0000000..ce149fa --- /dev/null +++ b/middleware/baseController.js @@ -0,0 +1,61 @@ +const fs = require("fs"); +let api_front_dir = "../api/controller_front"; +let admin_api_dir = "../api/controller_admin"; + +let rootApiPath = "/admin_api"; +const baseController = { + // 普通api + init(routerGloab) { + rootApiPath = "/api"; + this.registerRouter(routerGloab, api_front_dir); + return routerGloab; + }, + init_admin(routerGloab) { + rootApiPath = "/admin_api"; + this.registerRouter(routerGloab, admin_api_dir); + return routerGloab; + }, + + // 注册路由 + registerRouter(routerGloab, dir) { + let folderPath = __dirname + "/" + dir; + let controllerFiles = fs.readdirSync(folderPath).filter((f) => { + return f.endsWith(".js"); + }); + controllerFiles.forEach((f) => { + let controllerName = require(folderPath + "/" + f); + console.warn(`${f}`); + this.fileRouter(routerGloab, controllerName); + }); + }, + // 注册 路由至 routerGloab + fileRouter(routerGloab, controller) { + try { + for (let url in controller) { + let path = ""; + if (url.startsWith("GET ")) { + path = rootApiPath + url.substring(4); + routerGloab.get(path, controller[url]); + } else if (url.startsWith("POST ")) { + path = rootApiPath + url.substring(5); + routerGloab.post(path, controller[url]); + } else { + console.warn("无效路由:" + url); + } + + console.log(path); + } + console.log("\n"); + } catch (e) { + console.warn(e); + } + }, +}; + +module.exports = () => { + let routerGloab = require("koa-router")(); + baseController.init_admin(routerGloab); + baseController.init(routerGloab); + + return routerGloab.routes(); +}; diff --git a/middleware/baseModel.js b/middleware/baseModel.js new file mode 100644 index 0000000..a7d03bf --- /dev/null +++ b/middleware/baseModel.js @@ -0,0 +1,17 @@ +const Sequelize = require("sequelize"); +const common = require("../tool/common"); +let models = common.mapFiles("../api/model/"); +const db = require("./db"); +models["Sequelize"] = Sequelize; +models["op"] = Sequelize.Op; +models["sys_user"].belongsTo(models["sys_role"], { foreignKey: "roleId", targetKey: "id", as: "role" }); + +models["sys_form"].belongsTo(models["sys_model"], { foreignKey: "model_id", targetKey: "id", as: "model" }); + +models["sys_form_field"].belongsTo(models["sys_model_field"], { foreignKey: "model_field_id", targetKey: "id", as: "field" }); + +models.querySql = async (sql) => { + return await db.sequelize.query(sql, { type: Sequelize.QueryTypes.SELECT }); +}; + +module.exports = models; diff --git a/middleware/baseRequest.js b/middleware/baseRequest.js new file mode 100644 index 0000000..665fb4c --- /dev/null +++ b/middleware/baseRequest.js @@ -0,0 +1,241 @@ +const token = require("../api/service/token"); +const logsUtil = require("../tool/logs"); +const xml2js = require("xml2js"); +const nodeExcel = require("excel-export"); +const UUID = require("uuid"); +const config = require("../config/config"); + +const builder = new xml2js.Builder({ + headless: true, + allowSurrogateChars: true, + rootName: "xml", + cdata: true, +}); + +module.exports = function () { + return async (ctx, next) => { + // 合并对象 兼容处理参数 + ctx.get = (id) => { + let obj = Object.assign({}, ctx.request.query, ctx.request.body); + if (obj && typeof obj === "string") { + obj = JSON.parse(obj); + } + + let value = obj[id] === undefined ? "" : obj[id]; + return value; + }; + + ctx.getQuery = () => { + return ctx.request.query; + }; + + ctx.getIp = () => { + let req = ctx.req; + let ip = ""; + let forwardedIpsStr = req.headers["x-forwarded-for"]; + if (forwardedIpsStr) { + //如果有,则将头信息中第一个地址拿出,该地址就是真实的客户端IP; + let forwardedIps = forwardedIpsStr.split(","); + ip = forwardedIps[0]; + } else { + ip = req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress; + } + + return ip; + }; + + ctx.getBody = () => { + let obj = Object.assign({}, ctx.body, ctx.request.body); + if (obj && typeof obj === "string") { + obj = JSON.parse(obj); + } + return obj; + }; + + ctx.getXml = () => { + let getxml = ctx.request.body; + return new Promise(async (resolveT, rejectT) => { + let paramsJson = null; + + const parseObj = await new Promise(function (resolve) { + xml2js.parseString(getxml, { explicitArray: false }, function (err, json) { + if (err) throw err; + return resolve(json); + }); + }); + + if (parseObj.xml) delete parseObj.xml._; + paramsJson = parseObj.xml; + + console.log("getXml", paramsJson); + resolveT(paramsJson); + }); + }; + + // admin + ctx.getAdminUserId = () => { + let adminToken = ctx.header["admin-token"]; + if (adminToken) { + let userInfo = token.parse(adminToken); + if (userInfo) { + return userInfo.id; + } + } + return 0; + }; + + ctx.getAdminProjectId = () => { + let id = ctx.header["admin-project"]; + if (id) { + return id; + } + return 0; + }; + + // 获取小程序id + ctx.getPappletUserId = () => { + // 模拟用户登陆 + let userId = ctx.request.query["userId206"]; + if (userId) { + return userId; + } + + let appletToken = ctx.header["applet-token"]; + if (appletToken) { + let userInfo = token.parse(appletToken); + if (userInfo.weixin_openid && userInfo.id) { + return userInfo.id; + } + } + return 0; + }; + + ctx.getSessionKey = () => { + let appletToken = ctx.header["applet-token"]; + if (appletToken) { + let userInfo = token.parse(appletToken); + if (userInfo.session_key) { + return userInfo.session_key; + } + } + + return ""; + }; + + // 获取分页排序 + ctx.getPageSize = () => { + let pageOption = ctx.get("pageOption"); + + if (pageOption && typeof pageOption === "string") { + pageOption = JSON.parse(pageOption); + } + + let page = pageOption.page || 1; + let size = pageOption.pageSize || 20; + return { + limit: size, + offset: size * (page - 1), + }; + }; + + // 获取订单排序相关 [['sale_price','desc']] + ctx.getOrder = (key) => { + key = key || "order"; + let order = ctx.get(key); + if (Array.isArray(order)) { + return order; + } else { + try { + order = eval("(" + order + ")"); + } catch (e) { + console.warn("error " + e.message); + order = []; + } + return order; + } + }; + + //返回自定义code + ctx.json = (code, message, data) => { + ctx.response.type = "application/json"; + let resObj = { + code, + message, + data, + }; + + ctx.response.body = resObj; + }; + + ctx.jsonToXml = (return_code, return_msg) => { + ctx.response.type = "application/xml"; + let resObj = { + return_code, + return_msg, + }; + + const xmlOption = builder.buildObject(resObj); + ctx.response.body = xmlOption; + }; + + ctx.downFile = ({ title, cols, rows }) => { + let fileName = title + "_" + UUID.v4() + ".xlsx"; + let result = nodeExcel.execute({ cols, rows }); + let data = new Buffer.from(result, "binary"); + ctx.set("Content-Type", "application/vnd.openxmlformats"); + ctx.set("Content-Disposition", "attachment; filename=" + fileName); + ctx.set("filename", fileName); + ctx.body = data; + }; + + // 成功请求 + ctx.success = (data) => { + ctx.json(0, "请求成功!", data); + }; + + // 失败请求 + ctx.fail = (msg) => { + let message = msg || "请求失败!"; + ctx.json(-1, message, {}); + }; + + //token 失效 + ctx.tokenFail = (data) => { + ctx.json(-2, "非法请求,或登录已超时!", data); + }; + + console.log(`Process API ${ctx.request.method} ${ctx.request.url}...`); + + let allowUrls = config.allowUrls; + try { + // 登录注册不需要验证token + const checkApi = (path) => { + let isCheck = false; + for (let i = 0; i < allowUrls.length; i++) { + let url = allowUrls[i]; + if (path.indexOf(url) > -1) { + isCheck = true; + } + } + return isCheck; + }; + + if (checkApi(ctx.request.path)) { + return await next(); + } else { + if (ctx.request.path.indexOf("/admin_api/") > -1) { + let id = ctx.getAdminUserId(); + if (id) { + return await next(); + } + } else if (ctx.request.path.indexOf("/api/") > -1) { + return await next(); + } + return ctx.tokenFail(); // 非法请求 + } + } catch (e) { + logsUtil.ctxError(e, ctx); + return ctx.fail(e.message); + } + }; +}; diff --git a/middleware/db.js b/middleware/db.js new file mode 100644 index 0000000..1071acd --- /dev/null +++ b/middleware/db.js @@ -0,0 +1,160 @@ +const Sequelize = require("sequelize"); +const config = require("../config/config")["db"]; +const dayjs = require("dayjs"); + +let model = {}; + +const logEditField = (oldRow, newRow) => { + let str = ``; + oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; + newRow = newRow ? newRow.toJSON() : newRow; + + let keyRows = Object.keys(oldRow); + for (let i = 0; i < keyRows.length; i++) { + let key = keyRows[i]; + + if (key !== "create_time" && key !== "last_modify_time" && oldRow[key] !== newRow[key]) { + let oldVal = oldRow[key]; + if (typeof oldVal === "string") { + oldVal = oldVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + + let newVal = newRow[key]; + if (typeof newVal === "string") { + newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + str += ` ${key} 从 ${oldVal} 变更为 ${newVal}
`; + } + } + return str; +}; + +const logCreateField = (oldRow) => { + let str = ``; + oldRow = oldRow.toJSON ? oldRow.toJSON() : oldRow; + let keyRows = Object.keys(oldRow); + + for (let i = 0; i < keyRows.length; i++) { + let key = keyRows[i]; + + if (key !== "create_time" && key !== "last_modify_time") { + let newVal = oldRow[key]; + if (typeof newVal === "string") { + newVal = newVal.replace(/

/g, "").replace(/<\/p>/g, ""); + } + + str += ` ${key} ${newVal}
`; + } + } + return str; +}; + +let sequelize = new Sequelize(config.database, config.username, config.password, { + host: config.host, + dialect: config.dialect, + pool: { + max: 5, + min: 0, + idle: 10000, + }, + dialectOptions: { + charset: "utf8mb4", + collate: "utf8mb4_unicode_ci", + supportBigNumbers: true, + bigNumberStrings: true, + }, +}); + +const define = (name, attributes) => { + let attrs = {}; + for (let key in attributes) { + let value = attributes[key]; + if (typeof value === "object" && value["type"]) { + value.allowNull = value.allowNull || false; + attrs[key] = value; + } else { + attrs[key] = { + type: value, + allowNull: false, + }; + } + } + + attrs.create_time = { + type: Sequelize.DATE, + allowNull: false, + defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), + comment: "创建时间", + get() { + return dayjs(this.getDataValue("create_time")).format("YYYY-MM-DD HH:mm:ss"); + }, + }; + + attrs.last_modify_time = { + type: Sequelize.DATE, + allowNull: false, + comment: "最后更新时间", + defaultValue: sequelize.literal("CURRENT_TIMESTAMP"), + get() { + return dayjs(this.getDataValue("last_modify_time")).format("YYYY-MM-DD HH:mm:ss"); + }, + }; + + model[name] = sequelize.define(name, attrs, { + tableName: name, + timestamps: false, + hooks: { + beforeValidate: (obj) => { + let now = Date.now(); + if (obj.isNewRecord) { + obj.create_time = now; + obj.last_modify_time = now; + } else { + obj.last_modify_time = now; + } + }, + afterCreate: async (obj) => { + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + let logStr = logCreateField(obj); + await model["sys_log"].create({ table_name: tableName, operate: "新增", content: logStr }); + } + }, + + afterDestroy: async (obj) => { + let id = obj.id; + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + await model["sys_log"].create({ table_name: tableName, operate: "删除", content: `用户删除id为 ${id} ` }); + } + }, + + beforeUpdate: async (obj) => { + let tableName = obj._modelOptions.tableName; + if (tableName !== "sys_log") { + let id = obj.id; + let tableName = obj._modelOptions.tableName; + let updateRow = await model[tableName].findOne({ where: { id } }); + let logStr = logEditField(updateRow, obj); + await model["sys_log"].create({ table_name: tableName, operate: "修改", content: logStr }); + } + }, + }, + }); + + return model[name]; +}; + +let exp = { + sequelize, + define, + sync: () => { + if (process.env.NODE_ENV !== "production") { + sequelize.sync({ force: false }); + } else { + throw new Error("Cannot sync() when NODE_ENV is set to 'production'."); + } + }, +}; + +module.exports = exp; diff --git a/middleware/schedule.js b/middleware/schedule.js new file mode 100644 index 0000000..4f8f1e9 --- /dev/null +++ b/middleware/schedule.js @@ -0,0 +1,7 @@ +const node_schedule = require("node-schedule"); +class Schedule { + init() {} +} + +const schedule = new Schedule(); +module.exports = schedule; \ No newline at end of file diff --git a/middleware/sqlUpdate.js b/middleware/sqlUpdate.js new file mode 100644 index 0000000..ad6c30c --- /dev/null +++ b/middleware/sqlUpdate.js @@ -0,0 +1,52 @@ +const { querySql, user, good, business, good_evaluate, shp_profit, user_apply_cash, user_dividend, user_meet, user_note_invite, user_question, op } = require("./baseModel"); +class SqlUpdate { + async init() { + // await this.udateGoodSelePrice() + // await this.udateShippingFee() + // await this.initDb() + } + + // 更新邮费 + async udateShippingFee() { + let resBusiness = await querySql(`select a.business_id,sum(a.shipping_fee) as shipping_fee_total from business_profit_dtl as a + where a.shipping_fee!=0 + GROUP BY a.business_id`); + + if (resBusiness && resBusiness.length > 0) { + for (let i = 0; i < resBusiness.length; i++) { + let row = resBusiness[i]; + let { shipping_fee_total, business_id } = row; + await business.update({ shipping_fee_total: shipping_fee_total }, { where: { id: business_id } }); + } + } + } + + async udateGoodSelePrice() { + let goodRows = await good.findAll(); + + for (let i = 0; i < goodRows.length; i++) { + let goodRow = goodRows[i]; + await goodRow.update({ sale_price: goodRow.specificationStr.sale_price }); + } + } + // 测试数据库专用用于 初始化db + async initDb() { + await order.destroy({ where: {}, truncate: true }); + await order_dtls.destroy({ where: {}, truncate: true }); + await good_evaluate.destroy({ where: {}, truncate: true }); + await shp_profit.destroy({ where: {}, truncate: true }); + await user_apply_cash.destroy({ where: {}, truncate: true }); + await user_dividend.destroy({ where: {}, truncate: true }); + await user_meet.destroy({ where: {}, truncate: true }); + await user_note_invite.destroy({ where: {}, truncate: true }); + await user_question.destroy({ where: {}, truncate: true }); + let userRows = await user.findAll({}); + for (let i = 0; i < userRows.length; i++) { + let userRow = userRows[i]; + await userRow.update({ in_come: 0, extend_come: 0, total_consume: 0, overage_money: 0, consume_equity: 0, seed_number: 10, vip_grade_id: 1 }); + } + } +} + +const sqlUpdate = new SqlUpdate(); +module.exports = sqlUpdate; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c798356 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9851 @@ +{ + "name": "frameapi", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "frameapi", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@alicloud/pop-core": "^1.7.10", + "ali-oss": "^6.3.1", + "art-template": "^4.13.2", + "axios": "^0.24.0", + "cli-progress": "^3.11.2", + "crypto": "^1.0.1", + "dayjs": "1.8.24", + "echarts": "^5.1.2", + "ejs": "^2.7.1", + "excel-export": "^0.5.1", + "fluent-ffmpeg": "^2.1.2", + "fs": "0.0.1-security", + "https": "^1.0.0", + "jsonwebtoken": "^8.5.1", + "koa": "^2.8.1", + "koa-body": "^4.1.1", + "koa-bodyparser": "^4.2.1", + "koa-router": "^7.4.0", + "koa-sslify": "^4.0.3", + "koa-static": "^5.0.0", + "koa2-cors": "^2.0.6", + "lodash": "^4.17.15", + "log4js": "^6.1.2", + "md5": "^2.2.1", + "mysql2": "^1.7.0", + "node-schedule": "^1.3.2", + "node-uuid": "^1.4.8", + "qr-image": "^3.2.0", + "redis": "^3.0.2", + "request": "^2.88.2", + "request-promise": "^4.2.6", + "sequelize": "^5.19.0", + "string-random": "^0.1.3", + "urlencode": "^1.1.0", + "uuid": "^8.3.2", + "vue-table-with-tree-grid": "^0.2.4", + "vuex-persistedstate": "^2.5.4", + "wechatpay-node-v3": "^1.2.3", + "xml2js": "^0.4.23" + }, + "devDependencies": { + "assert": "^2.0.0", + "cookie": "^0.5.0", + "mocha": "^10.1.0", + "nodemon": "^2.0.15", + "selenium-webdriver": "^4.6.0", + "vue2-ace-editor": "0.0.15" + } + }, + "node_modules/@alicloud/pop-core": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@alicloud/pop-core/-/pop-core-1.7.10.tgz", + "integrity": "sha512-9/aLWgmgaAdB1ERNTpdOvF7wueLY5CDTRxKZr93x542iuYRA1NDpcKslFqLOy5CUOa0CbopET3JGaHSAz5qv9g==", + "dependencies": { + "debug": "^3.1.0", + "httpx": "^2.1.2", + "json-bigint": "^1.0.0", + "kitx": "^1.2.1", + "xml2js": "^0.4.17" + } + }, + "node_modules/@alicloud/pop-core/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "dependencies": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.nlark.com/@sindresorhus/is/download/@sindresorhus/is-0.14.0.tgz", + "integrity": "sha1-n7OjzzEyMoFR81PeRjLgHlIQK+o=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/@szmarczak/http-timer/download/@szmarczak/http-timer-1.1.2.tgz", + "integrity": "sha1-sWZeLEYaLNkvTBu/UNVFTeDUtCE=", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/formidable": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.0.32.tgz", + "integrity": "sha512-jOAB5+GFW+C+2xdvUcpd/CnYg2rD5xCyagJLBJU+9PB4a/DKmsAqS9yZI3j/Q9zwvM7ztPHaAIH1ijzp4cezdQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "14.14.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", + "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ali-oss": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.13.2.tgz", + "integrity": "sha512-85z+2Cd3ydCmdw/l6oFkaMmyswPVXm2r6a8GI+738s7O6YsDHDSogQ04joymUT2gdFNVWHYWTmXWLKEkD19eEQ==", + "dependencies": { + "address": "^1.0.0", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "co-defer": "^1.0.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^2.2.0", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.0.0", + "js-base64": "^2.5.2", + "jstoxml": "^0.2.3", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "mz-modules": "^2.1.0", + "platform": "^1.3.1", + "pump": "^3.0.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "^2.33.1", + "utility": "^1.8.0", + "xml2js": "^0.4.16" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ansi-align/download/ansi-align-3.0.1.tgz?cache=0&sync_timestamp=1632743673432&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fansi-align%2Fdownload%2Fansi-align-3.0.1.tgz", + "integrity": "sha1-DN8S4RGs53OobpofrRIlxDyxmlk=", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995547052&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz?cache=0&sync_timestamp=1617747494189&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-3.1.2.tgz", + "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/art-template": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/art-template/-/art-template-4.13.2.tgz", + "integrity": "sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==", + "dependencies": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + }, + "engines": { + "node": ">= 1.0.0" + } + }, + "node_modules/art-template/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/axios/download/axios-0.24.0.tgz", + "integrity": "sha1-gE5voeS5xSiFAd2d/1anoJQNINY=", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/boxen/download/boxen-5.1.2.tgz?cache=0&sync_timestamp=1634028640223&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fboxen%2Fdownload%2Fboxen-5.1.2.tgz", + "integrity": "sha1-eIy2hvyDwfSG36ikDGj8K4MdK1A=", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/brace": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/brace/download/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/cacheable-request/download/cacheable-request-6.1.0.tgz?cache=0&sync_timestamp=1623237592260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcacheable-request%2Fdownload%2Fcacheable-request-6.1.0.tgz", + "integrity": "sha1-IP+4vRYrpL4R6VZ9gj22UQUsqRI=", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz", + "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/lowercase-keys/download/lowercase-keys-2.0.0.tgz?cache=0&sync_timestamp=1634551715073&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2Fdownload%2Flowercase-keys-2.0.0.tgz", + "integrity": "sha1-JgPni3tLAAbLyi+8yKMgJVislHk=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz", + "integrity": "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz", + "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ci-info/download/ci-info-2.0.0.tgz", + "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=", + "dev": true + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-2.2.1.tgz?cache=0&sync_timestamp=1610827877787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-boxes%2Fdownload%2Fcli-boxes-2.2.1.tgz", + "integrity": "sha1-3dUDXSUJT84iDpyrQKRYQKRAMY8=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-progress": { + "version": "3.11.2", + "resolved": "https://registry.npmmirror.com/cli-progress/-/cli-progress-3.11.2.tgz", + "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/clone-response/download/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "dependencies": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/co-body": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", + "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.4.0", + "raw-body": "^2.2.0", + "type-is": "^1.6.14" + } + }, + "node_modules/co-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/co-defer/-/co-defer-1.0.0.tgz", + "integrity": "sha1-Pkp4eo7tawoh7ih8CU9+jeDTyBg=", + "engines": { + "node": ">= 0.11.14" + }, + "peerDependencies": { + "co": "4" + } + }, + "node_modules/collections": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/collections/-/collections-3.0.0.tgz", + "integrity": "sha1-J+OJTfGyTO38VaG7sMDaEvaLqzE=", + "dependencies": { + "weak-map": "~1.0.x" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/configstore/download/configstore-5.0.1.tgz", + "integrity": "sha1-02UCG130uYzdGH1qOw4/anzF7ZY=", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cookies/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cron-parser": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", + "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "dependencies": { + "is-nan": "^1.3.0", + "moment-timezone": "^0.5.31" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "engines": { + "node": "*" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz", + "integrity": "sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" + }, + "node_modules/date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "deprecated": "3.x is no longer supported. Please upgrade to 4.x or higher.", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.8.24", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.24.tgz", + "integrity": "sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.nlark.com/decompress-response/download/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha1-FsRu/cq6PtxF8k8r1IaLAbfCrcY=", + "dependencies": { + "os-name": "~1.0.3" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/defer-to-connect/download/defer-to-connect-1.1.3.tgz", + "integrity": "sha1-MxrgUMCNz3ifjIOnuB8O2U9KxZE=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dependencies": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/digest-header": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-0.0.1.tgz", + "integrity": "sha1-Ecz23uxXZqw3l0TZAcEsuklRS+Y=", + "dependencies": { + "utility": "0.1.11" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/digest-header/node_modules/utility": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz", + "integrity": "sha1-/eYM+bTkdRlHoM9dEEzik2ciZxU=", + "dependencies": { + "address": ">=0.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.nlark.com/dot-prop/download/dot-prop-5.3.0.tgz", + "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/duplexer3/download/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/echarts": { + "version": "5.1.2", + "resolved": "https://registry.nlark.com/echarts/download/echarts-5.1.2.tgz", + "integrity": "sha1-qhqwzvW3T6L3xiAmGl8oaJPTD9E=", + "dependencies": { + "tslib": "2.0.3", + "zrender": "5.1.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz", + "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha1-3HpiEP5403L+4kqLSJnb0VVBTcs=", + "engines": { + "node": ">= 0.11.14" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/escape-goat/download/escape-goat-2.1.1.tgz", + "integrity": "sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/excel-export": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/excel-export/-/excel-export-0.5.1.tgz", + "integrity": "sha1-bQh4f5iy7JMeSz3P8YzJCDu7i3c=", + "dependencies": { + "collections": "^3.0.0", + "node-zip": "1.x" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "dependencies": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.5.tgz?cache=0&sync_timestamp=1635857764332&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.5.tgz", + "integrity": "sha1-8JpYSJgdPHcrU5Iwl3hSP42Fw4E=", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau" + }, + "node_modules/formstream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.0.tgz", + "integrity": "sha1-UfOXDyYTbrCtRDBN5M67UCB7RHk=", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^1.3.4", + "pause-stream": "~0.0.11" + } + }, + "node_modules/formstream/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I=" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "dependencies": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953697891&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/global-dirs/download/global-dirs-3.0.0.tgz", + "integrity": "sha1-cKdv6E6jFas3sfVXbL3n1I73JoY=", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/gopd/node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "node_modules/gopd/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.nlark.com/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1628752531824&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgot%2Fdownload%2Fgot-9.6.0.tgz", + "integrity": "sha1-7fRefWf5lUVwXeH3u+7rEhdl7YU=", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/has-yarn/download/has-yarn-2.1.0.tgz?cache=0&sync_timestamp=1631299106681&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-yarn%2Fdownload%2Fhas-yarn-2.1.0.tgz", + "integrity": "sha1-E34RNUp7W/EapctknPDG8/8rLnc=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz", + "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" + }, + "node_modules/https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/httpx": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/httpx/-/httpx-2.2.7.tgz", + "integrity": "sha512-Wjh2JOAah0pdczfqL8NC5378G7jMt0Zcpn8U+yyxAiejjlagzSTQgJHuVvka2VNPQlKfoGehYRc79WKq9E4gDw==", + "dependencies": { + "@types/node": "^14", + "debug": "^4.1.1" + } + }, + "node_modules/httpx/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/httpx/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz?cache=0&sync_timestamp=1592055969434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore-by-default%2Fdownload%2Fignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "engines": [ + "node >= 0.4.0" + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ini/download/ini-2.0.0.tgz", + "integrity": "sha1-5f1Vbs3VcmvpePoQAYYurLCpS8U=", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-ci/download/is-ci-2.0.0.tgz?cache=0&sync_timestamp=1635261061017&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-ci%2Fdownload%2Fis-ci-2.0.0.tgz", + "integrity": "sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw=", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.4.0.tgz?cache=0&sync_timestamp=1610875271474&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-installed-globally%2Fdownload%2Fis-installed-globally-0.4.0.tgz", + "integrity": "sha1-mg/UB5ScMPhutpWe8beZTtC3tSA=", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/is-npm/download/is-npm-5.0.0.tgz?cache=0&sync_timestamp=1631992770984&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-npm%2Fdownload%2Fis-npm-5.0.0.tgz", + "integrity": "sha1-Q+jWXMVuG2f41HJiz2ZwmRk/Rag=", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz?cache=0&sync_timestamp=1618600378936&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-obj%2Fdownload%2Fis-obj-2.0.0.tgz", + "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-3.0.3.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-3.0.3.tgz", + "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "node_modules/is-type-of": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz", + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==", + "dependencies": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/is-yarn-global/download/is-yarn-global-0.3.0.tgz?cache=0&sync_timestamp=1619356824740&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-yarn-global%2Fdownload%2Fis-yarn-global-0.3.0.tgz", + "integrity": "sha1-1QLTOCWQ6jAEiTdGdUyJE5lz4jI=", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/json-buffer/download/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jstoxml": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-0.2.4.tgz", + "integrity": "sha1-/z+2eFaIOgMpU8fOjOdIYhD0hEc=", + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/jszip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", + "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=", + "dependencies": { + "pako": "~0.2.5" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/keyv/download/keyv-3.1.0.tgz?cache=0&sync_timestamp=1635869183541&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz", + "integrity": "sha1-7MIoSG9pmR5J6UdkhaW+Ho/FxNk=", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kitx": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/kitx/-/kitx-1.3.0.tgz", + "integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ==" + }, + "node_modules/ko-sleep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.0.3.tgz", + "integrity": "sha1-KKKgoUhei39BX/SI3uF9JHiKsII=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-body": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-4.2.0.tgz", + "integrity": "sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==", + "dependencies": { + "@types/formidable": "^1.0.31", + "co-body": "^5.1.1", + "formidable": "^1.1.1" + } + }, + "node_modules/koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "dependencies": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/koa-bodyparser/node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "dependencies": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "node_modules/koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/koa-convert/node_modules/koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/koa-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", + "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", + "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", + "dependencies": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/koa-router/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa-router/node_modules/koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/koa-send/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/koa-sslify": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/koa-sslify/-/koa-sslify-4.0.3.tgz", + "integrity": "sha512-5RwsRc+Zkawoq9ev5pNAPP8r+wj4Eqo3b7IfSXrpYISBDNo0fwrMcYMioR+B00piV9NpXqPZA4gh36SpIeZSvw==", + "engines": { + "node": ">6.0.0" + } + }, + "node_modules/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/koa2-cors": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/koa2-cors/-/koa2-cors-2.0.6.tgz", + "integrity": "sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==", + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/latest-version/download/latest-version-5.1.0.tgz?cache=0&sync_timestamp=1626951703884&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flatest-version%2Fdownload%2Flatest-version-5.1.0.tgz", + "integrity": "sha1-EZ3+kI/jjRXfpD7NE/oS7Igy+s4=", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dependencies": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/lowercase-keys/download/lowercase-keys-1.0.1.tgz?cache=0&sync_timestamp=1634551715073&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2Fdownload%2Flowercase-keys-1.0.1.tgz", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/mimic-response/download/mimic-response-1.0.1.tgz?cache=0&sync_timestamp=1628692495204&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmimic-response%2Fdownload%2Fmimic-response-1.0.1.tgz", + "integrity": "sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.32", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", + "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mysql2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.7.0.tgz", + "integrity": "sha512-xTWWQPjP5rcrceZQ7CSTKR/4XIDeH/cRkNH/uzvVGQ7W5c7EJ0dXeJUusk7OKhIoHj7uFKUxDVSCfLIl+jluog==", + "dependencies": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/mz-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz", + "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==", + "dependencies": { + "glob": "^7.1.2", + "ko-sleep": "^1.0.3", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "rimraf": "^2.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "dependencies": { + "lru-cache": "^4.1.3" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/named-placeholders/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-schedule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz", + "integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==", + "dependencies": { + "cron-parser": "^2.18.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + } + }, + "node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "deprecated": "Use uuid module instead", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/node-zip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", + "integrity": "sha1-lNGtZ0o81GoViN1zb0qaeMdX62I=", + "dependencies": { + "jszip": "2.5.0" + }, + "bin": { + "nodezip": "bin/nodezip" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmmirror.com/nodemon/download/nodemon-2.0.15.tgz?cache=0&sync_timestamp=1636481768356&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnodemon%2Fdownload%2Fnodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1636300872595&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-4.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-url%2Fdownload%2Fnormalize-url-4.5.1.tgz", + "integrity": "sha1-DdkM8SiO4dExO4cIHJpZMu5IUYo=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=", + "dependencies": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=", + "dependencies": { + "minimist": "^1.1.0" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/p-cancelable/download/p-cancelable-1.1.0.tgz", + "integrity": "sha1-0HjRWjr0CSIMiG8dmgyi5EGrJsw=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "dependencies": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dependencies": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.nlark.com/package-json/download/package-json-6.5.0.tgz", + "integrity": "sha1-b+7ayjXnVyWHbQsOZJdGl/7RRbA=", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648246651&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz", + "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/prepend-http/download/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "dependencies": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpstree.remy%2Fdownload%2Fpstree.remy-1.1.8.tgz", + "integrity": "sha1-wkIiT0pnwh9oaDm720rCgrg3PTo=", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/pupa/download/pupa-2.1.1.tgz", + "integrity": "sha1-9ej9SvwsXZeCj6pSNUnth0SiDWI=", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qr-image": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/qr-image/download/qr-image-3.2.0.tgz", + "integrity": "sha512-rXKDS5Sx3YipVsqmlMJsJsk6jXylEpiHRC2+nJy66fxA5ExYyGa4PqwteW69SaVmAb2OQ18HbYriT7cGQMbduw==" + }, + "node_modules/qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.nlark.com/ini/download/ini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", + "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", + "dependencies": { + "denque": "^1.4.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-4.2.1.tgz", + "integrity": "sha1-bXtABkQZGJcszV/tzUHcMix5slA=", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/registry-url/download/registry-url-5.1.0.tgz?cache=0&sync_timestamp=1618682227919&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregistry-url%2Fdownload%2Fregistry-url-5.1.0.tgz", + "integrity": "sha1-6YM0tQ1UNLgRNrROxjjZwgCcUAk=", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/responselike/download/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "dependencies": { + "any-promise": "^1.3.0" + } + }, + "node_modules/rfdc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", + "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha1-ukAonovfJy7RHdnql+r5jgNtJMY=", + "dependencies": { + "get-ready": "~1.0.0" + } + }, + "node_modules/selenium-webdriver": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/selenium-webdriver/-/selenium-webdriver-4.6.0.tgz", + "integrity": "sha512-HIH/+J+V7l/lbSRSOwyLcpjezg9CV4DLo1pBhP9aphuMlf/PJXEDwC/A/Ht2bFc1AqQppFBGvClYcuMzyO6tRw==", + "dev": true, + "dependencies": { + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.7.0" + }, + "engines": { + "node": ">= 14.20.0" + } + }, + "node_modules/selenium-webdriver/node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/selenium-webdriver/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/semver-diff/download/semver-diff-3.1.1.tgz?cache=0&sync_timestamp=1620044887257&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver-diff%2Fdownload%2Fsemver-diff-3.1.1.tgz", + "integrity": "sha1-Bfd85Z8yXgDicGr9Z7tQbdscoys=", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "node_modules/sequelize": { + "version": "5.22.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.3.tgz", + "integrity": "sha512-+nxf4TzdrB+PRmoWhR05TP9ukLAurK7qtKcIFv5Vhxm5Z9v+d2PcTT6Ea3YAoIQVkZ47QlT9XWAIUevMT/3l8Q==", + "deprecated": "Please update to v6 or higher! A migration guide can be found here: https://sequelize.org/v6/manual/upgrade-to-v6.html", + "dependencies": { + "bluebird": "^3.5.0", + "cls-bluebird": "^2.1.0", + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "moment-timezone": "^0.5.21", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", + "sequelize-pool": "^2.3.0", + "toposort-class": "^1.0.1", + "uuid": "^3.3.3", + "validator": "^10.11.0", + "wkx": "^0.4.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/sequelize/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sequelize/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/sequelize/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sequelize/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/shvl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.2.tgz", + "integrity": "sha512-G3KkIXPza3dgkt6Bo8zIl5K/KvAAhbG6o9KfAjhPvrIIzzAhnfc2ztv1i+iPTbNNM43MaBUqIaZwqVjkSgY/rw==", + "deprecated": "older versions vulnerable to prototype pollution" + }, + "node_modules/signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.5.tgz?cache=0&sync_timestamp=1632948374592&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.5.tgz", + "integrity": "sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8=", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dependencies": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "deprecated": "2.x is no longer supported. Please upgrade to 3.x or higher.", + "dependencies": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "deprecated": "2.x is no longer supported. Please upgrade to 4.x or higher.", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-random": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/string-random/-/string-random-0.1.3.tgz", + "integrity": "sha512-g+UsIwzKhNi+9/+Q3Q7hP8R4HkQxiIkQlttnxw6GRdk9pnnkGIv53C6H8dvh8wxAVDhkqpnWeauaPXS1b2sBJg==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&sync_timestamp=1629397119136&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/superagent/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/to-readable-stream/download/to-readable-stream-1.0.0.tgz", + "integrity": "sha1-zgqgwvPfat+FLvtASng+d8BHV3E=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/touch/download/touch-3.1.0.tgz", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz?cache=0&sync_timestamp=1636459972076&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/undefsafe/download/undefsafe-2.0.5.tgz", + "integrity": "sha1-OHM7kye9zSJtuIn7cjpu/RYubiw=", + "dev": true + }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/unique-string/download/unique-string-2.0.0.tgz", + "integrity": "sha1-OcZFH4GvsnSd4rIz4/fF6IQ72J0=", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/update-notifier/download/update-notifier-5.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupdate-notifier%2Fdownload%2Fupdate-notifier-5.1.0.tgz", + "integrity": "sha1-SrDXx/NqIx3XMWz3cpMT8CFNmtk=", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.nlark.com/semver/download/semver-7.3.5.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-notifier/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.5.tgz", + "integrity": "sha512-48z9VGWwdCV5KfizHsE05DWS5fhK6gFlx5MjO7xu0Krc5FGPWzjlXEVV0nPMrdVuP7xmMHiPZ2HoYZwKOFTZOg==" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/url-parse-lax/download/url-parse-lax-3.0.0.tgz?cache=0&sync_timestamp=1628551699328&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl-parse-lax%2Fdownload%2Furl-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/urlencode": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/urlencode/download/urlencode-1.1.0.tgz", + "integrity": "sha512-OOAOh9owHXr/rCN1tteSnYwIvsrGHamSz0hafMhmQa7RcS4+Ets6/2iVClVGjt9jkDW84UqoMw/Gmpc7QolX6A==", + "dependencies": { + "iconv-lite": "~0.4.11" + } + }, + "node_modules/urllib": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.36.1.tgz", + "integrity": "sha512-g0Gh7bH5AwfPUzFetxPtJwumGHE6D7KQn0K68MwcJXPgO2K0AliwEIxLAwGMF+TpY75DYAsvz1h9ekagYoq33w==", + "dependencies": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "debug": "^2.6.9", + "default-user-agent": "^1.0.0", + "digest-header": "^0.0.1", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.4.15", + "ip": "^1.1.5", + "proxy-agent": "^3.1.0", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmmirror.com/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utility": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz", + "integrity": "sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw==", + "dependencies": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vue": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-table-with-tree-grid": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/vue-table-with-tree-grid/-/vue-table-with-tree-grid-0.2.4.tgz", + "integrity": "sha512-V9+wckhA8u1K6RBu7m7bjUEyRrjFFnGVaRghEjzn/fIQJc2VRxVbq8qFXIRlTTC7XUQwbiEK0Xlp4zOXP5W0Gg==", + "dependencies": { + "vue": "^2.4.3" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + }, + "peerDependencies": { + "vue": "^2.4.3" + } + }, + "node_modules/vue2-ace-editor": { + "version": "0.0.15", + "resolved": "https://registry.npm.taobao.org/vue2-ace-editor/download/vue2-ace-editor-0.0.15.tgz", + "integrity": "sha1-VpsgjlSudxrh7dO4kCrELw7cdOM=", + "dev": true, + "dependencies": { + "brace": "^0.11.0" + } + }, + "node_modules/vuex-persistedstate": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-2.7.1.tgz", + "integrity": "sha512-Ktvp6Bt6ApYj35MuxTClu+9Lpukcgl3Z/0o4PU12+Z4jU6lyOMzos0k6zGT5xrukAkGM1VV3EYNwz1TnHPhgFA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dependencies": { + "deepmerge": "^4.2.2", + "shvl": "^2.0.0" + }, + "peerDependencies": { + "vue": "^2.0.0", + "vuex": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "node_modules/wechatpay-node-v3": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/wechatpay-node-v3/-/wechatpay-node-v3-1.2.3.tgz", + "integrity": "sha512-lY5/RMU93UeRSA8J9lVm6/DH3nsLIAIv63xs0CXIx73XItGi2tyvdW3ImGUpjtRsoFB4yG4F/TuTxVmYv0PCag==", + "dependencies": { + "@fidm/x509": "^1.2.1", + "superagent": "^6.1.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/widest-line/download/widest-line-3.1.0.tgz?cache=0&sync_timestamp=1634023966185&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwidest-line%2Fdownload%2Fwidest-line-3.1.0.tgz", + "integrity": "sha1-gpIzO79my0X/DeFgOxNreuFJbso=", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "dependencies": { + "semver": "^5.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wkx": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-3.0.3.tgz", + "integrity": "sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/xdg-basedir/download/xdg-basedir-4.0.0.tgz", + "integrity": "sha1-S8jZmEQDaWIl74OhVzy7y0552xM=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/zrender": { + "version": "5.1.1", + "resolved": "https://registry.nlark.com/zrender/download/zrender-5.1.1.tgz", + "integrity": "sha1-BRX0+MwPR0LwKmuIGVUKbRPWTFw=", + "dependencies": { + "tslib": "2.0.3" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz", + "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=" + } + }, + "dependencies": { + "@alicloud/pop-core": { + "version": "1.7.10", + "resolved": "https://registry.npmjs.org/@alicloud/pop-core/-/pop-core-1.7.10.tgz", + "integrity": "sha512-9/aLWgmgaAdB1ERNTpdOvF7wueLY5CDTRxKZr93x542iuYRA1NDpcKslFqLOy5CUOa0CbopET3JGaHSAz5qv9g==", + "requires": { + "debug": "^3.1.0", + "httpx": "^2.1.2", + "json-bigint": "^1.0.0", + "kitx": "^1.2.1", + "xml2js": "^0.4.17" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" + }, + "@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==" + }, + "@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "requires": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.nlark.com/@sindresorhus/is/download/@sindresorhus/is-0.14.0.tgz", + "integrity": "sha1-n7OjzzEyMoFR81PeRjLgHlIQK+o=", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.nlark.com/@szmarczak/http-timer/download/@szmarczak/http-timer-1.1.2.tgz", + "integrity": "sha1-sWZeLEYaLNkvTBu/UNVFTeDUtCE=", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/formidable": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.0.32.tgz", + "integrity": "sha512-jOAB5+GFW+C+2xdvUcpd/CnYg2rD5xCyagJLBJU+9PB4a/DKmsAqS9yZI3j/Q9zwvM7ztPHaAIH1ijzp4cezdQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.14.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", + "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" + }, + "@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "requires": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ali-oss": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/ali-oss/-/ali-oss-6.13.2.tgz", + "integrity": "sha512-85z+2Cd3ydCmdw/l6oFkaMmyswPVXm2r6a8GI+738s7O6YsDHDSogQ04joymUT2gdFNVWHYWTmXWLKEkD19eEQ==", + "requires": { + "address": "^1.0.0", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "co-defer": "^1.0.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^2.2.0", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.0.0", + "js-base64": "^2.5.2", + "jstoxml": "^0.2.3", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "mz-modules": "^2.1.0", + "platform": "^1.3.1", + "pump": "^3.0.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "^2.33.1", + "utility": "^1.8.0", + "xml2js": "^0.4.16" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ansi-align/download/ansi-align-3.0.1.tgz?cache=0&sync_timestamp=1632743673432&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fansi-align%2Fdownload%2Fansi-align-3.0.1.tgz", + "integrity": "sha1-DN8S4RGs53OobpofrRIlxDyxmlk=", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.nlark.com/ansi-regex/download/ansi-regex-5.0.1.tgz?cache=0&sync_timestamp=1631634988487&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618995547052&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz?cache=0&sync_timestamp=1617747494189&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fanymatch%2Fdownload%2Fanymatch-3.1.2.tgz", + "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "art-template": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/art-template/-/art-template-4.13.2.tgz", + "integrity": "sha512-04ws5k+ndA5DghfheY4c8F1304XJKeTcaXqZCLpxFkNMSkaR3ChW1pX2i9d3sEEOZuLy7de8lFriRaik1jEeOQ==", + "requires": { + "acorn": "^5.0.3", + "escodegen": "^1.8.1", + "estraverse": "^4.2.0", + "html-minifier": "^3.4.3", + "is-keyword-js": "^1.0.3", + "js-tokens": "^3.0.1", + "merge-source-map": "^1.0.3", + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "requires": { + "tslib": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/axios/download/axios-0.24.0.tgz", + "integrity": "sha1-gE5voeS5xSiFAd2d/1anoJQNINY=", + "requires": { + "follow-redirects": "^1.14.4" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299293319&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/boxen/download/boxen-5.1.2.tgz?cache=0&sync_timestamp=1634028640223&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fboxen%2Fdownload%2Fboxen-5.1.2.tgz", + "integrity": "sha1-eIy2hvyDwfSG36ikDGj8K4MdK1A=", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "brace": { + "version": "0.11.1", + "resolved": "https://registry.npm.taobao.org/brace/download/brace-0.11.1.tgz", + "integrity": "sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/cacheable-request/download/cacheable-request-6.1.0.tgz?cache=0&sync_timestamp=1623237592260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcacheable-request%2Fdownload%2Fcacheable-request-6.1.0.tgz", + "integrity": "sha1-IP+4vRYrpL4R6VZ9gj22UQUsqRI=", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-5.2.0.tgz", + "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/lowercase-keys/download/lowercase-keys-2.0.0.tgz?cache=0&sync_timestamp=1634551715073&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2Fdownload%2Flowercase-keys-2.0.0.tgz", + "integrity": "sha1-JgPni3tLAAbLyi+8yKMgJVislHk=", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-6.2.0.tgz", + "integrity": "sha1-kkr4gcnVJaydh/QNlk5c6pgqGAk=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.2.tgz?cache=0&sync_timestamp=1627646697260&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.2.tgz", + "integrity": "sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/chokidar/download/chokidar-3.5.2.tgz", + "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ci-info/download/ci-info-2.0.0.tgz", + "integrity": "sha1-Z6npZL4xpR4V5QENWObxKDQAL0Y=", + "dev": true + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-2.2.1.tgz?cache=0&sync_timestamp=1610827877787&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-boxes%2Fdownload%2Fcli-boxes-2.2.1.tgz", + "integrity": "sha1-3dUDXSUJT84iDpyrQKRYQKRAMY8=", + "dev": true + }, + "cli-progress": { + "version": "3.11.2", + "resolved": "https://registry.npmmirror.com/cli-progress/-/cli-progress-3.11.2.tgz", + "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", + "requires": { + "string-width": "^4.2.3" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/clone-response/download/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "requires": { + "is-bluebird": "^1.0.2", + "shimmer": "^1.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "co-body": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", + "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.4.0", + "raw-body": "^2.2.0", + "type-is": "^1.6.14" + } + }, + "co-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/co-defer/-/co-defer-1.0.0.tgz", + "integrity": "sha1-Pkp4eo7tawoh7ih8CU9+jeDTyBg=", + "requires": {} + }, + "collections": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/collections/-/collections-3.0.0.tgz", + "integrity": "sha1-J+OJTfGyTO38VaG7sMDaEvaLqzE=", + "requires": { + "weak-map": "~1.0.x" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/configstore/download/configstore-5.0.1.tgz", + "integrity": "sha1-02UCG130uYzdGH1qOw4/anzF7ZY=", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } + }, + "copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cron-parser": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-2.18.0.tgz", + "integrity": "sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==", + "requires": { + "is-nan": "^1.3.0", + "moment-timezone": "^0.5.31" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, + "crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/crypto-random-string/download/crypto-random-string-2.0.0.tgz", + "integrity": "sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU=", + "dev": true + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, + "dayjs": { + "version": "1.8.24", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.24.tgz", + "integrity": "sha512-bImQZbBv86zcOWOq6fLg7r4aqMx8fScdmykA7cSh+gH1Yh8AM0Dbw0gHYrsOrza6oBBnkK+/OaR+UAa9UsMrDw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.nlark.com/decompress-response/download/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha1-FsRu/cq6PtxF8k8r1IaLAbfCrcY=", + "requires": { + "os-name": "~1.0.3" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.nlark.com/defer-to-connect/download/defer-to-connect-1.1.3.tgz", + "integrity": "sha1-MxrgUMCNz3ifjIOnuB8O2U9KxZE=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "digest-header": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/digest-header/-/digest-header-0.0.1.tgz", + "integrity": "sha1-Ecz23uxXZqw3l0TZAcEsuklRS+Y=", + "requires": { + "utility": "0.1.11" + }, + "dependencies": { + "utility": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/utility/-/utility-0.1.11.tgz", + "integrity": "sha1-/eYM+bTkdRlHoM9dEEzik2ciZxU=", + "requires": { + "address": ">=0.0.1" + } + } + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.nlark.com/dot-prop/download/dot-prop-5.3.0.tgz", + "integrity": "sha1-kMzOcIzZzYLMTcjD3dmr3VWyDog=", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dottie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", + "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/duplexer3/download/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "echarts": { + "version": "5.1.2", + "resolved": "https://registry.nlark.com/echarts/download/echarts-5.1.2.tgz", + "integrity": "sha1-qhqwzvW3T6L3xiAmGl8oaJPTD9E=", + "requires": { + "tslib": "2.0.3", + "zrender": "5.1.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz", + "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751333727&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha1-3HpiEP5403L+4kqLSJnb0VVBTcs=" + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/escape-goat/download/escape-goat-2.1.1.tgz", + "integrity": "sha1-Gy3HcANnbEV+x2Cy3GjttkgYhnU=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "excel-export": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/excel-export/-/excel-export-0.5.1.tgz", + "integrity": "sha1-bQh4f5iy7JMeSz3P8YzJCDu7i3c=", + "requires": { + "collections": "^3.0.0", + "node-zip": "1.x" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "requires": { + "async": ">=0.2.9", + "which": "^1.1.1" + } + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmmirror.com/follow-redirects/download/follow-redirects-1.14.5.tgz?cache=0&sync_timestamp=1635857764332&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.5.tgz", + "integrity": "sha1-8JpYSJgdPHcrU5Iwl3hSP42Fw4E=" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, + "formstream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/formstream/-/formstream-1.1.0.tgz", + "integrity": "sha1-UfOXDyYTbrCtRDBN5M67UCB7RHk=", + "requires": { + "destroy": "^1.0.4", + "mime": "^1.3.4", + "pause-stream": "~0.0.11" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + } + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/download/fsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "optional": true + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-stream%2Fdownload%2Fget-stream-4.1.0.tgz", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1632953697891&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/global-dirs/download/global-dirs-3.0.0.tgz", + "integrity": "sha1-cKdv6E6jFas3sfVXbL3n1I73JoY=", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.nlark.com/got/download/got-9.6.0.tgz?cache=0&sync_timestamp=1628752531824&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fgot%2Fdownload%2Fgot-9.6.0.tgz", + "integrity": "sha1-7fRefWf5lUVwXeH3u+7rEhdl7YU=", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/has-yarn/download/has-yarn-2.1.0.tgz?cache=0&sync_timestamp=1631299106681&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-yarn%2Fdownload%2Fhas-yarn-2.1.0.tgz", + "integrity": "sha1-E34RNUp7W/EapctknPDG8/8rLnc=", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/http-cache-semantics/download/http-cache-semantics-4.1.0.tgz", + "integrity": "sha1-SekcXL82yblLz81xwj1SSex045A=", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "httpx": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/httpx/-/httpx-2.2.7.tgz", + "integrity": "sha512-Wjh2JOAah0pdczfqL8NC5378G7jMt0Zcpn8U+yyxAiejjlagzSTQgJHuVvka2VNPQlKfoGehYRc79WKq9E4gDw==", + "requires": { + "@types/node": "^14", + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/ignore-by-default/download/ignore-by-default-1.0.1.tgz?cache=0&sync_timestamp=1592055969434&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore-by-default%2Fdownload%2Fignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/import-lazy/download/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/ini/download/ini-2.0.0.tgz", + "integrity": "sha1-5f1Vbs3VcmvpePoQAYYurLCpS8U=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-ci/download/is-ci-2.0.0.tgz?cache=0&sync_timestamp=1635261061017&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fis-ci%2Fdownload%2Fis-ci-2.0.0.tgz", + "integrity": "sha1-a8YzQYGBDgS1wis9WJ/cpVAmQEw=", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/download/is-glob-4.0.3.tgz", + "integrity": "sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/is-installed-globally/download/is-installed-globally-0.4.0.tgz?cache=0&sync_timestamp=1610875271474&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-installed-globally%2Fdownload%2Fis-installed-globally-0.4.0.tgz", + "integrity": "sha1-mg/UB5ScMPhutpWe8beZTtC3tSA=", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-keyword-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz", + "integrity": "sha1-rDDc81tnH0snsX9ctXI1EmAhEy0=" + }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/is-npm/download/is-npm-5.0.0.tgz?cache=0&sync_timestamp=1631992770984&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-npm%2Fdownload%2Fis-npm-5.0.0.tgz", + "integrity": "sha1-Q+jWXMVuG2f41HJiz2ZwmRk/Rag=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz?cache=0&sync_timestamp=1618600378936&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-obj%2Fdownload%2Fis-obj-2.0.0.tgz", + "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/is-path-inside/download/is-path-inside-3.0.3.tgz?cache=0&sync_timestamp=1620046845369&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-path-inside%2Fdownload%2Fis-path-inside-3.0.3.tgz", + "integrity": "sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM=", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-type-of": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.2.1.tgz", + "integrity": "sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==", + "requires": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.nlark.com/is-yarn-global/download/is-yarn-global-0.3.0.tgz?cache=0&sync_timestamp=1619356824740&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-yarn-global%2Fdownload%2Fis-yarn-global-0.3.0.tgz", + "integrity": "sha1-1QLTOCWQ6jAEiTdGdUyJE5lz4jI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/json-buffer/download/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jstoxml": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jstoxml/-/jstoxml-0.2.4.tgz", + "integrity": "sha1-/z+2eFaIOgMpU8fOjOdIYhD0hEc=" + }, + "jszip": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", + "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=", + "requires": { + "pako": "~0.2.5" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/keyv/download/keyv-3.1.0.tgz?cache=0&sync_timestamp=1635869183541&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fkeyv%2Fdownload%2Fkeyv-3.1.0.tgz", + "integrity": "sha1-7MIoSG9pmR5J6UdkhaW+Ho/FxNk=", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kitx": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/kitx/-/kitx-1.3.0.tgz", + "integrity": "sha512-fhBqFlXd0GkKTB+8ayLfpzPUw+LHxZlPAukPNBD1Om7JMeInT+/PxCAf1yLagvD+VKoyWhXtJR68xQkX/a0wOQ==" + }, + "ko-sleep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ko-sleep/-/ko-sleep-1.0.3.tgz", + "integrity": "sha1-KKKgoUhei39BX/SI3uF9JHiKsII=", + "requires": { + "ms": "^2.0.0" + } + }, + "koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "koa-body": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-4.2.0.tgz", + "integrity": "sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==", + "requires": { + "@types/formidable": "^1.0.31", + "co-body": "^5.1.1", + "formidable": "^1.1.1" + } + }, + "koa-bodyparser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz", + "integrity": "sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==", + "requires": { + "co-body": "^6.0.0", + "copy-to": "^2.0.1" + }, + "dependencies": { + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + } + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "requires": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-router": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", + "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", + "requires": { + "debug": "^3.1.0", + "http-errors": "^1.3.1", + "koa-compose": "^3.0.0", + "methods": "^1.0.1", + "path-to-regexp": "^1.1.1", + "urijs": "^1.19.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "koa-sslify": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/koa-sslify/-/koa-sslify-4.0.3.tgz", + "integrity": "sha512-5RwsRc+Zkawoq9ev5pNAPP8r+wj4Eqo3b7IfSXrpYISBDNo0fwrMcYMioR+B00piV9NpXqPZA4gh36SpIeZSvw==" + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "koa2-cors": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/koa2-cors/-/koa2-cors-2.0.6.tgz", + "integrity": "sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.nlark.com/latest-version/download/latest-version-5.1.0.tgz?cache=0&sync_timestamp=1626951703884&other_urls=https%3A%2F%2Fregistry.nlark.com%2Flatest-version%2Fdownload%2Flatest-version-5.1.0.tgz", + "integrity": "sha1-EZ3+kI/jjRXfpD7NE/oS7Igy+s4=", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/lowercase-keys/download/lowercase-keys-1.0.1.tgz?cache=0&sync_timestamp=1634551715073&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flowercase-keys%2Fdownload%2Flowercase-keys-1.0.1.tgz", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "source-map": "^0.6.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/mimic-response/download/mimic-response-1.0.1.tgz?cache=0&sync_timestamp=1628692495204&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmimic-response%2Fdownload%2Fmimic-response-1.0.1.tgz", + "integrity": "sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "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 + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + } + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moment-timezone": { + "version": "0.5.32", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", + "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "mysql2": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.7.0.tgz", + "integrity": "sha512-xTWWQPjP5rcrceZQ7CSTKR/4XIDeH/cRkNH/uzvVGQ7W5c7EJ0dXeJUusk7OKhIoHj7uFKUxDVSCfLIl+jluog==", + "requires": { + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "mz-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz", + "integrity": "sha512-sjk8lcRW3vrVYnZ+W+67L/2rL+jbO5K/N6PFGIcLWTiYytNr22Ah9FDXFs+AQntTM1boZcoHi5qS+CV1seuPog==", + "requires": { + "glob": "^7.1.2", + "ko-sleep": "^1.0.3", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "rimraf": "^2.6.1" + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-schedule": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-1.3.3.tgz", + "integrity": "sha512-uF9Ubn6luOPrcAYKfsXWimcJ1tPFtQ8I85wb4T3NgJQrXazEzojcFZVk46ZlLHby3eEJChgkV/0T689IsXh2Gw==", + "requires": { + "cron-parser": "^2.18.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "node-zip": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", + "integrity": "sha1-lNGtZ0o81GoViN1zb0qaeMdX62I=", + "requires": { + "jszip": "2.5.0" + } + }, + "nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmmirror.com/nodemon/download/nodemon-2.0.15.tgz?cache=0&sync_timestamp=1636481768356&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnodemon%2Fdownload%2Fnodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1636300872595&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.nlark.com/normalize-url/download/normalize-url-4.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnormalize-url%2Fdownload%2Fnormalize-url-4.5.1.tgz", + "integrity": "sha1-DdkM8SiO4dExO4cIHJpZMu5IUYo=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=", + "requires": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + } + }, + "osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=", + "requires": { + "minimist": "^1.1.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.nlark.com/p-cancelable/download/p-cancelable-1.1.0.tgz", + "integrity": "sha1-0HjRWjr0CSIMiG8dmgyi5EGrJsw=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "requires": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.nlark.com/package-json/download/package-json-6.5.0.tgz", + "integrity": "sha1-b+7ayjXnVyWHbQsOZJdGl/7RRbA=", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz?cache=0&sync_timestamp=1621648246651&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpicomatch%2Fdownload%2Fpicomatch-2.3.0.tgz", + "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=", + "dev": true + }, + "platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/prepend-http/download/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "requires": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npm.taobao.org/pstree.remy/download/pstree.remy-1.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpstree.remy%2Fdownload%2Fpstree.remy-1.1.8.tgz", + "integrity": "sha1-wkIiT0pnwh9oaDm720rCgrg3PTo=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/pupa/download/pupa-2.1.1.tgz", + "integrity": "sha1-9ej9SvwsXZeCj6pSNUnth0SiDWI=", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qr-image": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/qr-image/download/qr-image-3.2.0.tgz", + "integrity": "sha512-rXKDS5Sx3YipVsqmlMJsJsk6jXylEpiHRC2+nJy66fxA5ExYyGa4PqwteW69SaVmAb2OQ18HbYriT7cGQMbduw==" + }, + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.nlark.com/ini/download/ini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", + "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", + "requires": { + "denque": "^1.4.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + } + }, + "redis-commands": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", + "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/registry-auth-token/download/registry-auth-token-4.2.1.tgz", + "integrity": "sha1-bXtABkQZGJcszV/tzUHcMix5slA=", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/registry-url/download/registry-url-5.1.0.tgz?cache=0&sync_timestamp=1618682227919&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregistry-url%2Fdownload%2Fregistry-url-5.1.0.tgz", + "integrity": "sha1-6YM0tQ1UNLgRNrROxjjZwgCcUAk=", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "requires": { + "lodash": "^4.17.19" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/responselike/download/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "^1.3.0" + } + }, + "rfdc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", + "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha1-ukAonovfJy7RHdnql+r5jgNtJMY=", + "requires": { + "get-ready": "~1.0.0" + } + }, + "selenium-webdriver": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/selenium-webdriver/-/selenium-webdriver-4.6.0.tgz", + "integrity": "sha512-HIH/+J+V7l/lbSRSOwyLcpjezg9CV4DLo1pBhP9aphuMlf/PJXEDwC/A/Ht2bFc1AqQppFBGvClYcuMzyO6tRw==", + "dev": true, + "requires": { + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.7.0" + }, + "dependencies": { + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.nlark.com/semver-diff/download/semver-diff-3.1.1.tgz?cache=0&sync_timestamp=1620044887257&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver-diff%2Fdownload%2Fsemver-diff-3.1.1.tgz", + "integrity": "sha1-Bfd85Z8yXgDicGr9Z7tQbdscoys=", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.nlark.com/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, + "sequelize": { + "version": "5.22.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.3.tgz", + "integrity": "sha512-+nxf4TzdrB+PRmoWhR05TP9ukLAurK7qtKcIFv5Vhxm5Z9v+d2PcTT6Ea3YAoIQVkZ47QlT9XWAIUevMT/3l8Q==", + "requires": { + "bluebird": "^3.5.0", + "cls-bluebird": "^2.1.0", + "debug": "^4.1.1", + "dottie": "^2.0.0", + "inflection": "1.12.0", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "moment-timezone": "^0.5.21", + "retry-as-promised": "^3.2.0", + "semver": "^6.3.0", + "sequelize-pool": "^2.3.0", + "toposort-class": "^1.0.1", + "uuid": "^3.3.3", + "validator": "^10.11.0", + "wkx": "^0.4.8" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "shvl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.2.tgz", + "integrity": "sha512-G3KkIXPza3dgkt6Bo8zIl5K/KvAAhbG6o9KfAjhPvrIIzzAhnfc2ztv1i+iPTbNNM43MaBUqIaZwqVjkSgY/rw==" + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/signal-exit/download/signal-exit-3.0.5.tgz?cache=0&sync_timestamp=1632948374592&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.5.tgz", + "integrity": "sha1-nj6MwMdamUcrRDIQM6dwLnc4JS8=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "sqlstring": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", + "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==" + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-random": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/string-random/-/string-random-0.1.3.tgz", + "integrity": "sha512-g+UsIwzKhNi+9/+Q3Q7hP8R4HkQxiIkQlttnxw6GRdk9pnnkGIv53C6H8dvh8wxAVDhkqpnWeauaPXS1b2sBJg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/download/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.nlark.com/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&sync_timestamp=1629397119136&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "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==", + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "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==" + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703414084&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=" + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.nlark.com/to-readable-stream/download/to-readable-stream-1.0.0.tgz", + "integrity": "sha1-zgqgwvPfat+FLvtASng+d8BHV3E=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/touch/download/touch-3.1.0.tgz", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz?cache=0&sync_timestamp=1636459972076&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftype-fest%2Fdownload%2Ftype-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + } + } + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/undefsafe/download/undefsafe-2.0.5.tgz", + "integrity": "sha1-OHM7kye9zSJtuIn7cjpu/RYubiw=", + "dev": true + }, + "unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "requires": { + "extend-shallow": "^2.0.1" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/unique-string/download/unique-string-2.0.0.tgz", + "integrity": "sha1-OcZFH4GvsnSd4rIz4/fF6IQ72J0=", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/update-notifier/download/update-notifier-5.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupdate-notifier%2Fdownload%2Fupdate-notifier-5.1.0.tgz", + "integrity": "sha1-SrDXx/NqIx3XMWz3cpMT8CFNmtk=", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.nlark.com/semver/download/semver-7.3.5.tgz?cache=0&sync_timestamp=1618846864940&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsemver%2Fdownload%2Fsemver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urijs": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.5.tgz", + "integrity": "sha512-48z9VGWwdCV5KfizHsE05DWS5fhK6gFlx5MjO7xu0Krc5FGPWzjlXEVV0nPMrdVuP7xmMHiPZ2HoYZwKOFTZOg==" + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/url-parse-lax/download/url-parse-lax-3.0.0.tgz?cache=0&sync_timestamp=1628551699328&other_urls=https%3A%2F%2Fregistry.nlark.com%2Furl-parse-lax%2Fdownload%2Furl-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "urlencode": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/urlencode/download/urlencode-1.1.0.tgz", + "integrity": "sha512-OOAOh9owHXr/rCN1tteSnYwIvsrGHamSz0hafMhmQa7RcS4+Ets6/2iVClVGjt9jkDW84UqoMw/Gmpc7QolX6A==", + "requires": { + "iconv-lite": "~0.4.11" + } + }, + "urllib": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/urllib/-/urllib-2.36.1.tgz", + "integrity": "sha512-g0Gh7bH5AwfPUzFetxPtJwumGHE6D7KQn0K68MwcJXPgO2K0AliwEIxLAwGMF+TpY75DYAsvz1h9ekagYoq33w==", + "requires": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "debug": "^2.6.9", + "default-user-agent": "^1.0.0", + "digest-header": "^0.0.1", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.4.15", + "ip": "^1.1.5", + "proxy-agent": "^3.1.0", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + } + }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmmirror.com/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utility": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/utility/-/utility-1.17.0.tgz", + "integrity": "sha512-KdVkF9An/0239BJ4+dqOa7NPrPIOeQE9AGfx0XS16O9DBiHNHRJMoeU5nL6pRGAkgJOqdOu8R4gBRcXnAocJKw==", + "requires": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vue": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "requires": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "vue-table-with-tree-grid": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/vue-table-with-tree-grid/-/vue-table-with-tree-grid-0.2.4.tgz", + "integrity": "sha512-V9+wckhA8u1K6RBu7m7bjUEyRrjFFnGVaRghEjzn/fIQJc2VRxVbq8qFXIRlTTC7XUQwbiEK0Xlp4zOXP5W0Gg==", + "requires": { + "vue": "^2.4.3" + } + }, + "vue2-ace-editor": { + "version": "0.0.15", + "resolved": "https://registry.npm.taobao.org/vue2-ace-editor/download/vue2-ace-editor-0.0.15.tgz", + "integrity": "sha1-VpsgjlSudxrh7dO4kCrELw7cdOM=", + "dev": true, + "requires": { + "brace": "^0.11.0" + } + }, + "vuex-persistedstate": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-2.7.1.tgz", + "integrity": "sha512-Ktvp6Bt6ApYj35MuxTClu+9Lpukcgl3Z/0o4PU12+Z4jU6lyOMzos0k6zGT5xrukAkGM1VV3EYNwz1TnHPhgFA==", + "requires": { + "deepmerge": "^4.2.2", + "shvl": "^2.0.0" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "wechatpay-node-v3": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/wechatpay-node-v3/-/wechatpay-node-v3-1.2.3.tgz", + "integrity": "sha512-lY5/RMU93UeRSA8J9lVm6/DH3nsLIAIv63xs0CXIx73XItGi2tyvdW3ImGUpjtRsoFB4yG4F/TuTxVmYv0PCag==", + "requires": { + "@fidm/x509": "^1.2.1", + "superagent": "^6.1.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/widest-line/download/widest-line-3.1.0.tgz?cache=0&sync_timestamp=1634023966185&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fwidest-line%2Fdownload%2Fwidest-line-3.1.0.tgz", + "integrity": "sha1-gpIzO79my0X/DeFgOxNreuFJbso=", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "requires": { + "semver": "^5.0.1" + } + }, + "wkx": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "requires": { + "@types/node": "*" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.nlark.com/wrap-ansi/download/wrap-ansi-7.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrap-ansi%2Fdownload%2Fwrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-3.0.3.tgz", + "integrity": "sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/xdg-basedir/download/xdg-basedir-4.0.0.tgz", + "integrity": "sha1-S8jZmEQDaWIl74OhVzy7y0552xM=", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zrender": { + "version": "5.1.1", + "resolved": "https://registry.nlark.com/zrender/download/zrender-5.1.1.tgz", + "integrity": "sha1-BRX0+MwPR0LwKmuIGVUKbRPWTFw=", + "requires": { + "tslib": "2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.0.3.tgz", + "integrity": "sha1-jgdBrEX8DCJuWKF7/D5kubxsphw=" + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0208304 --- /dev/null +++ b/package.json @@ -0,0 +1,65 @@ +{ + "name": "frameapi", + "version": "1.0.0", + "author": "light22600", + "description": "a node webApi", + "main": "app.js", + "type": "commonjs", + "dependencies": { + "@alicloud/pop-core": "^1.7.10", + "adm-zip": "^0.5.16", + "ali-oss": "^6.3.1", + "art-template": "^4.13.2", + "axios": "^0.24.0", + "cli-progress": "^3.11.2", + "crypto": "^1.0.1", + "dayjs": "1.8.24", + "echarts": "^5.1.2", + "ejs": "^2.7.1", + "excel-export": "^0.5.1", + "fluent-ffmpeg": "^2.1.2", + "fs": "0.0.1-security", + "https": "^1.0.0", + "jsonwebtoken": "^8.5.1", + "koa": "^2.8.1", + "koa-body": "^4.1.1", + "koa-bodyparser": "^4.2.1", + "koa-router": "^7.4.0", + "koa-sslify": "^4.0.3", + "koa-static": "^5.0.0", + "koa2-cors": "^2.0.6", + "lodash": "^4.17.15", + "log4js": "^6.1.2", + "md5": "^2.2.1", + "mysql2": "^1.7.0", + "node-schedule": "^1.3.2", + "node-uuid": "^1.4.8", + "qr-image": "^3.2.0", + "redis": "^3.0.2", + "request": "^2.88.2", + "request-promise": "^4.2.6", + "sequelize": "^5.19.0", + "string-random": "^0.1.3", + "urlencode": "^1.1.0", + "uuid": "^8.3.2", + "vue-table-with-tree-grid": "^0.2.4", + "vuex-persistedstate": "^2.5.4", + "wechatpay-node-v3": "^1.2.3", + "xml2js": "^0.4.23" + }, + "devDependencies": { + "assert": "^2.0.0", + "cookie": "^0.5.0", + "mocha": "^10.1.0", + "nodemon": "^2.0.15", + "selenium-webdriver": "^4.6.0", + "vue2-ace-editor": "0.0.15" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "api": " nodemon ./app.js ", + "serve": "cd ./admin&&npm run serve -- --port 9095 ", + "build": "cd ./admin&&npm run build " + }, + "license": "MIT" +} diff --git a/tool/WXBizDataCrypt.js b/tool/WXBizDataCrypt.js new file mode 100644 index 0000000..a3f1159 --- /dev/null +++ b/tool/WXBizDataCrypt.js @@ -0,0 +1,34 @@ +var crypto = require("crypto"); + +function WXBizDataCrypt(appId, sessionKey) { + this.appId = appId; + this.sessionKey = sessionKey; +} + +WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { + // base64 decode + var sessionKey = new Buffer(this.sessionKey, "base64"); + encryptedData = new Buffer(encryptedData, "base64"); + iv = new Buffer(iv, "base64"); + + try { + // 解密 + var decipher = crypto.createDecipheriv("aes-128-cbc", sessionKey, iv); + // 设置自动 padding 为 true,删除填充补位 + decipher.setAutoPadding(true); + var decoded = decipher.update(encryptedData, "binary", "utf8"); + decoded += decipher.final("utf8"); + + decoded = JSON.parse(decoded); + } catch (err) { + throw new Error("Illegal Buffer"); + } + + if (decoded.watermark.appid !== this.appId) { + throw new Error("Illegal Buffer"); + } + + return decoded; +}; + +module.exports = WXBizDataCrypt; diff --git a/tool/chromedriver/drive/chromedriver b/tool/chromedriver/drive/chromedriver new file mode 100644 index 0000000..1dec7ae Binary files /dev/null and b/tool/chromedriver/drive/chromedriver differ diff --git a/tool/chromedriver/drive/chromedriver.exe b/tool/chromedriver/drive/chromedriver.exe new file mode 100644 index 0000000..cb54d37 Binary files /dev/null and b/tool/chromedriver/drive/chromedriver.exe differ diff --git a/tool/chromedriver/index.js b/tool/chromedriver/index.js new file mode 100644 index 0000000..6cdf7da --- /dev/null +++ b/tool/chromedriver/index.js @@ -0,0 +1,90 @@ +const { Builder, By, Key, until, support } = require('selenium-webdriver') +const chrome = require('selenium-webdriver/chrome'); +const assert = require('assert') +const cookie = require('cookie'); +const path = require("path"); + + + + +module.exports = { + + + async initDriver({ url, cookies2 }) { + console.log('initDriver开始初始化') + let options = new chrome.Options(); + options.addArguments('--User-Agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36"') + options.addArguments('--no-sandbox') + + if (process.platform === 'linux') { + options.addArguments('--headless') + } + + options.addArguments('--Cache-Control="no-cache"') + options.addArguments('--Host="huodong.taobao.com"') + + + console.log('系统', process.platform) + let service = null + // lunix 系统 + if (process.platform === 'linux') { + service = new chrome.ServiceBuilder(path.join(__dirname, './drive/chromedriver')); + } + else if (process.platform === 'win32') { + service = new chrome.ServiceBuilder(path.join(__dirname, './drive/chromedriver.exe')); + } + + const driver = new Builder().forBrowser('chrome').setChromeService(service).setChromeOptions(options).build(); + + driver.get(url) + + let cookies = `cookie2=${cookies2};` + + var cookieObj = cookie.parse(cookies); + let keys = Object.keys(cookieObj) + for (let i = 0; i < keys.length; i++) { + let key = keys[i] + let value = cookieObj[key] + await driver.manage().addCookie({ name: key, value, domain: '.taobao.com' }) + } + + console.log('initDriver初始化完成') + return driver + }, + + + + async checkForm(driver) { + + try { + + let formCheckText = await driver.findElement(By.xpath("//div[@id=\'global-modal\']/div/div/div/h2")).getText() + + let formCheckRules = [] + let formCheckRulesDom = await driver.findElements(By.css("#global-modal>div p")) + for (let e of formCheckRulesDom) { + let text = await e.getText(); + formCheckRules.push(text) + } + + + if (formCheckText === "请检查表单信息") { + return { formCheckText, formCheckRules } + } + + + return null + } + + catch (e) { + return null + } + + + } + + + + + +} \ No newline at end of file diff --git a/tool/common.js b/tool/common.js new file mode 100644 index 0000000..227f05c --- /dev/null +++ b/tool/common.js @@ -0,0 +1,41 @@ +'use strict'; +const path = require('path'); +const fs = require('fs'); +module.exports = { + isTokenValid: (token, client) => { + return new Promise((resove, reject) => { + client.hgetall(token, (err, value) => { + if (err) { + resove(false); + } else { + if (value) { + let { creatTime, expires } = value; + let now = Date.now(); + if (now - creatTime > expires) { + resove(false); + } else { + resove(true); + } + } else { + resove(false); + } + } + }); + }); + }, + mapFiles (folderName) { + let exportFiles = {}; + let modelUrl = path.resolve(__dirname, folderName); + let files = fs.readdirSync(modelUrl); + let js_files = files.filter(f => { + return f.endsWith('.js'); + }, files); + + for (let f of js_files) { + let name = f.substring(0, f.length - 3); + exportFiles[name] = require(path.resolve(modelUrl, f)); + } + + return exportFiles; + } +}; diff --git a/tool/funTool.js b/tool/funTool.js new file mode 100644 index 0000000..1f14324 --- /dev/null +++ b/tool/funTool.js @@ -0,0 +1,127 @@ +const fs = require("fs"); +const request = require("request"); +const path = require("path"); +const { sys_parameter } = require("../middleware/baseModel"); + +module.exports = { + async getParameterByKey(key) { + let res = await sys_parameter.findOne({ where: { key: key } }); + if (res) { + return res.value; + } + return ""; + }, + + delay(seconds = 1, callback) { + let promise = new Promise((resolve, reject) => { + setTimeout(() => { + if (callback) { + callback(); + } + resolve(true); + }, seconds * 1000); + }); + + return promise; + }, + + getParantNode(row, moduleRows) { + let nodeIds = []; + if (row) { + nodeIds.push(row.id); + } + + let nodes = moduleRows.filter((p) => p.id === row.parent_id); + if (nodes && nodes.length > 0) { + let node = nodes[0]; + nodeIds.push(node.id); + + if (node.parent_id) { + let sonNodeIds = this.getParantNode(node, moduleRows); + if (sonNodeIds && sonNodeIds.length > 0) { + nodeIds.push(...sonNodeIds); + } + } + } + + return nodeIds; + }, + readFileList(dir, filesList = []) { + const files = fs.readdirSync(dir); + files.forEach((item, index) => { + var fullPath = path.join(dir, item); + const stat = fs.statSync(fullPath); + if (stat.isDirectory()) { + this.readFileList(path.join(dir, item), filesList); //递归读取文件 + } else { + filesList.push(fullPath); + } + }); + return filesList; + }, + + mkdirsSync(dirname) { + if (fs.existsSync(dirname)) { + return true; + } else { + if (this.mkdirsSync(path.dirname(dirname))) { + fs.mkdirSync(dirname); + return true; + } + } + }, + + isExist(path) { + let promise = new Promise((resolve, reject) => { + fs.access(path, function (err) { + if (err && err.code == "ENOENT") { + resolve(false); + } + resolve(true); + }); + }); + + return promise; + }, + + downloadFile(file_url) { + let promise = new Promise((resolve, reject) => { + let fileName = path.basename(file_url); + + let received_bytes = 0; + let total_bytes = 0; + + let req = request({ + method: "GET", + uri: file_url, + }); + + let filePath = path.join(__dirname, `../downVideo/${fileName}`); + + let out = fs.createWriteStream(filePath); + req.pipe(out); + + req.on("response", function (data) { + // Change the total bytes value to get progress later. + total_bytes = parseInt(data.headers["content-length"]); + }); + + req.on("data", function (chunk) { + // Update the received bytes + received_bytes += chunk.length; + + console.log("downloadFile", parseFloat((received_bytes / total_bytes) * 100).toFixed(2) + "%"); + }); + + req.on("end", function () { + resolve(filePath); + }); + + req.on("error", function (e) { + resolve(false); + }); + }); + + return promise; + }, +}; diff --git a/tool/logs.js b/tool/logs.js new file mode 100644 index 0000000..db92573 --- /dev/null +++ b/tool/logs.js @@ -0,0 +1,105 @@ +const dayjs = require("dayjs"); +const fs = require("fs"); +const path = require("path"); + +let formatText = { + request: function (req) { + let logText = new String(); + let method = req.method; + //访问方法 + logText += "request method: " + method + "\n"; + //请求原始地址 + logText += "request originalUrl: " + req.originalUrl + "\n"; + //客户端ip + logText += "request client ip: " + req.ip + "\n"; + + //请求参数 + if (method === "GET") { + logText += "request query: " + JSON.stringify(req.query) + "\n"; + } else { + logText += "request body: " + "\n" + JSON.stringify(req.body) + "\n"; + } + + return logText; + }, + + handle: (info) => { + let logText = new String(); + //响应日志开始 + logText += "\n" + `***************info log start ***************日志记录时间: ${dayjs().format("YYYY.MM.DD HH:mm:ss")}` + "\n"; + //响应内容 + logText += "\n" + info + "\n"; + //响应日志结束 + logText += "*************** info log end ***************************************************************************" + "\n"; + return logText; + }, + error: (ctx, err) => { + let logText = new String(); + //错误信息开始 + logText += "\n" + `*************** error log start ***************日志记录时间: ${dayjs().format("YYYY.MM.DD HH:mm:ss")}` + "\n"; + //添加请求日志 + logText += formatText.request(ctx.request); + //错误名称 + logText += "err name: " + err.name + "\n"; + //错误信息 + logText += "err message: " + err.message + "\n"; + //错误详情 + logText += "err stack: " + err.stack + "\n"; + //错误信息结束 + logText += "*************** error log end ***************************************************************************" + "\n"; + return logText; + }, +}; + +const writeLog = (msg, type) => { + console.log(msg); + + let pathDir = path.join(__dirname, "../logs"); + if (!fs.existsSync(pathDir)) { + fs.mkdirSync(pathDir); + } + + let fileName = dayjs().format("log_YYYY.MM.DD.log"); + + if (type === "error") { + fileName = dayjs().format("logError_YYYY.MM.DD.log"); + } + + let fileFullPath = path.join(pathDir, fileName); + + if (fs.existsSync(fileFullPath)) { + fs.appendFileSync(fileFullPath, msg); + } else { + fs.writeFileSync(fileFullPath, msg); + } +}; + +module.exports = { + //封装操作日志 + log: (msg, data) => { + let msgTotal = msg; + + if (data) { + if (typeof data === "object") { + msgTotal += ":" + JSON.stringify(data); + } else { + msgTotal += ":" + data; + } + } + + let msgStr = formatText.handle(msgTotal); + writeLog(msgStr); + }, + + errError(msg) { + let msgStr = formatText.handle(msg); + writeLog(msgStr, "error"); + }, + //封装错误日志 + ctxError: (error, ctx) => { + if (ctx && error) { + let msg = formatText.error(ctx, error); + writeLog(msg, "error"); + } + }, +}; diff --git a/tool/md5.js b/tool/md5.js new file mode 100644 index 0000000..0a5d6fd --- /dev/null +++ b/tool/md5.js @@ -0,0 +1,11 @@ +const crypto = require('crypto'); + +function getMd5(str) { + let obj = crypto.createHash('md5'); + obj.update(str); + return obj.digest('hex'); +} + +module.exports = { + getMd5: getMd5 +}; diff --git a/tool/node-wxpay/index.js b/tool/node-wxpay/index.js new file mode 100644 index 0000000..aeb8af6 --- /dev/null +++ b/tool/node-wxpay/index.js @@ -0,0 +1,6 @@ +'use strict'; +// 支付 查询 退款 +exports.WxPay = require('./lib/wx_pay'); +// 提现到零钱 提现到银行卡 优惠券 +exports.WxWithdraw = require('./lib/wx_withdraw'); +exports.RefundMiddleware = require('./utils/refund_middleware'); diff --git a/tool/node-wxpay/lib/wx_ipay.js b/tool/node-wxpay/lib/wx_ipay.js new file mode 100644 index 0000000..4b7d188 --- /dev/null +++ b/tool/node-wxpay/lib/wx_ipay.js @@ -0,0 +1,170 @@ +'use strict'; +const md5 = require('md5'); +const xml2js = require('xml2js'); +const util = require('../utils/util'); +const request = require('superagent'); +const crypto = require('crypto'); +// xmlBuilder工具 +const builder = new xml2js.Builder({ + 'headless': true, + 'allowSurrogateChars': true, + 'rootName': 'xml', + 'cdata': true, +}); +// 请求路径 +const urls = { + 'unifiedorder': 'https://api.mch.weixin.qq.com/pay/unifiedorder', // 统一下单 + 'orderquery': 'https://api.mch.weixin.qq.com/pay/orderquery', // 查询订单 + 'closeorder': 'https://api.mch.weixin.qq.com/pay/closeorder', // 关闭订单 + 'refund': 'https://api.mch.weixin.qq.com/secapi/pay/refund', // 申请退款 + 'refundquery': 'https://api.mch.weixin.qq.com/pay/refundquery', // 查询退款 + 'downloadbill': 'https://api.mch.weixin.qq.com/pay/downloadbill', // 下载交易账单 + 'downloadfundflow': 'https://api.mch.weixin.qq.com/pay/downloadfundflow', // 下载资金账单 + 'report': 'https://api.mch.weixin.qq.com/payitil/report', // 交易保障 + 'batchquerycomment': 'https://api.mch.weixin.qq.com/billcommentsp/batchquerycomment', // 拉取订单评价数据 + 'reverse': 'https://api.mch.weixin.qq.com/secapi/pay/reverse', // 撤销订单 + 'micropay': 'https://api.mch.weixin.qq.com/pay/micropay', // 付款码支付 + 'authcodetoopenid': 'https://api.mch.weixin.qq.com/tools/authcodetoopenid', // 付款码查询openid +}; +// 微信支付相关接口 +class IOrder { + // options 参数值 参考微信支付文档 + constructor(options) { + this._options = {}; + this._options['appid'] = options.appid; + this._options['pfx'] = options.pfx; + this._options['mch_id'] = options.mch_id; + this._options['key'] = options.partner_key; + this._options['sign'] = ''; + + this._params = {}; + } + // 添加其他参数 + _otherParams(params) { + this._params = { + 'nonce_str': util.getNonceStr(), + ...params, + ...this._options, + }; + if (!this._params['sign_type'] || ![ 'MD5', 'HMAC-SHA256' ].includes(this._params['sign_type'])) this._params['sign_type'] = 'MD5'; + } + // 参数检验 + _checkOptions(properties) { + if (!this._params.appid) throw new Error('缺少appid'); + if (!this._params.mch_id) throw new Error('缺少mch_id'); + if (!this._params.key) throw new Error('缺少partner_key'); + + properties.forEach(item => { + if (this._params[item] === undefined || this._params[item] === null) throw new Error('缺少' + item); + }); + } + // MD5加密 + _md5(params) { + let object = { + ...this._params, + }; + if (params) { + object = { + ...params, + 'key': this._options['key'], + }; + } + const querystring = Object.keys(object).filter(function(key) { + return object[key] !== undefined && object[key] !== '' && ![ 'pfx', 'sign', 'partner_key', 'key', 'redirect_url' ].includes(key); + }).sort() + .map(function(key) { + return key + '=' + object[key]; + }) + .join('&') + '&key=' + object.key; + return md5(querystring).toUpperCase(); + } + // HMAC-SHA256 加密 + _hmac(params) { + let object = { + ...this._params, + }; + if (params) { + object = { + ...params, + 'key': this._options['key'], + }; + } + + const querystring = Object.keys(object).filter(function(key) { + return object[key] !== undefined && object[key] !== '' && ![ 'pfx', 'sign', 'partner_key', 'key', 'redirect_url' ].includes(key); + }).sort() + .map(function(key) { + return key + '=' + object[key]; + }) + .join('&') + '&key=' + object.key; + const hash = crypto.createHmac('sha256', this._options['key']) + .update(querystring) + .digest('hex'); + + return hash.toUpperCase(); + } + // toxml + _jsontoxml() { + const object = { + ...this._params, + }; + if (object['sign_type'] === 'HMAC-SHA256') { + object.sign = this._hmac(); + } else { + object.sign = this._md5(); + } + + // 移除证书 + delete object['pfx']; + delete object['key']; // 移除密钥 不然会报{ return_code: 'FAIL', return_msg: '不识别的参数key' } + delete object['redirect_url']; + + // 生成请求统一下单下单xml参数 + const xmlOption = builder.buildObject(object); + return xmlOption; + } + _xmltojson(data) { + let body = {}; + xml2js.parseString(data, { 'trim': true, 'explicitArray': false }, (err, result) => { + if (err) { + // throw new Error(err); + console.error(err); + body = {}; + } else { + body = result.xml; + } + + }); + + return body; + } + // 请求 + async _request(name, xmlOption) { + const url = urls[name]; + let result = await request.post(url) + .send(xmlOption) + .pfx({ + 'pfx': this._options.pfx, // 证书 + 'passphrase': this._options.mch_id, // 证书秘钥【微信设置为商户号id】 + }) + .type('xml'); + + return this._xmltojson(result.text); + } + // 请求 + async _request2(name, xmlOption) { + const url = urls[name]; + let result = await request.post(url) + .send(xmlOption) + .pfx({ + 'pfx': this._options.pfx, // 证书 + 'passphrase': this._options.mch_id, // 证书秘钥【微信设置为商户号id】 + }) + .type('xml'); + + return result; + } + +} + +module.exports = IOrder; diff --git a/tool/node-wxpay/lib/wx_iwithdraw.js b/tool/node-wxpay/lib/wx_iwithdraw.js new file mode 100644 index 0000000..65e0a71 --- /dev/null +++ b/tool/node-wxpay/lib/wx_iwithdraw.js @@ -0,0 +1,164 @@ +'use strict'; +const md5 = require('md5'); +const xml2js = require('xml2js'); +const util = require('../utils/util'); +const request = require('superagent'); +const crypto = require('crypto'); +// xmlBuilder工具 +const builder = new xml2js.Builder({ + 'headless': true, + 'allowSurrogateChars': true, + 'rootName': 'xml', + 'cdata': true, +}); +// 请求路径 +const urls = { + 'sendredpack': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', // 发放红包 + 'sendgroupredpack': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack', // 发放裂变红包 + 'gethbinfo': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo', // 查询红包记录 + 'sendminiprogramhb': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendminiprogramhb', // 小程序红包 + 'transfers': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers', // 企业付款到零钱 + 'gettransferinfo': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo', // 查询企业付款到零钱 + 'pay_bank': 'https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank', // 企业付款到银行卡 + 'query_bank': 'https://api.mch.weixin.qq.com/mmpaysptrans/query_bank', // 查询企业付款到银行卡 + 'getpublickey': 'https://fraud.mch.weixin.qq.com/risk/getpublickey', // 获取RSA加密公钥 + 'send_coupon': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/send_coupon', // 发放代金券 + 'query_coupon_stock': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/query_coupon_stock', // 查询代金券批次 + 'querycouponsinfo': 'https://api.mch.weixin.qq.com/mmpaymkttransfers/querycouponsinfo', // 查询代金券信息 +}; +class IWithdraw { + constructor(options) { + this._options = {}; + this._options['pfx'] = options.pfx; + this._options['key'] = options.partner_key; + this._options['sign'] = ''; + + this._params = {}; + } + // 添加其他参数 + _otherParams(params) { + this._params = { + 'nonce_str': util.getNonceStr(), + ...params, + ...this._options, + }; + } + // 参数检验 + _checkOptions(properties) { + if (!this._params.key) throw new Error('缺少partner_key'); + if (!this._params.pfx) throw new Error('缺少pfx'); + + properties.forEach(item => { + if (this._params[item] === undefined || this._params[item] === null) throw new Error('缺少' + item); + }); + } + // MD5加密 + _md5(params) { + let object = { + ...this._params, + }; + const exclude = [ 'pfx', 'sign', 'partner_key', 'key' ]; + + if (params) { + object = { + ...params, + 'key': this._options['key'], + }; + } + + // 不能把sign_type 带入加密中 + const querystring = Object.keys(object).filter(function(key) { + return object[key] !== undefined && object[key] !== '' && !exclude.includes(key); + }).sort() + .map(function(key) { + return key + '=' + object[key]; + }) + .join('&') + '&key=' + object.key; + return md5(querystring).toUpperCase(); + } + // HMAC-SHA256 加密 + _hmac(params) { + let object = { + ...this._params, + }; + if (params) { + object = { + ...params, + 'key': this._options['key'], + }; + } + + const querystring = Object.keys(object).filter(function(key) { + return object[key] !== undefined && object[key] !== '' && ![ 'pfx', 'sign', 'partner_key', 'key' ].includes(key); + }).sort() + .map(function(key) { + return key + '=' + object[key]; + }) + .join('&') + '&key=' + object.key; + const hash = crypto.createHmac('sha256', this._options['key']) + .update(querystring) + .digest('hex'); + return hash.toUpperCase(); + } + // toxml + _jsontoxml() { + const object = { + ...this._params, + }; + if (object.sign_type === 'HMAC-SHA256') { + object.sign = this._hmac(); + } else { + object.sign = this._md5(); + } + + // 移除证书 + delete object['pfx']; + delete object['key']; // 移除密钥 不然会报{ return_code: 'FAIL', return_msg: '不识别的参数key' } + + // 生成请求统一下单下单xml参数 + const xmlOption = builder.buildObject(object); + return xmlOption; + } + _xmltojson(data) { + let body = {}; + xml2js.parseString(data, { 'trim': true, 'explicitArray': false }, (err, result) => { + if (err) { + // throw new Error(err); + console.error(err); + body = {}; + } else { + body = result.xml; + } + }); + + return body; + } + // 请求 + async _request(name, xmlOption) { + const url = urls[name]; + let result = await request.post(url) + .send(xmlOption) + .pfx({ + 'pfx': this._options.pfx, // 证书 + 'passphrase': this._params.mch_id || this._params.mchid, // 证书秘钥【微信设置为商户号id】 + }) + .type('xml'); + + return this._xmltojson(result.text); + } + // 请求 + async _request2(name, xmlOption) { + const url = urls[name]; + let result = await request.post(url) + .send(xmlOption) + .pfx({ + 'pfx': this._options.pfx, // 证书 + 'passphrase': this._params.mch_id || this._params.mchid, // 证书秘钥【微信设置为商户号id】 + }) + .type('xml'); + + // application/xml 返回参数是buffer + return this._xmltojson(result.body.toString()); + } +} +module.exports = IWithdraw; diff --git a/tool/node-wxpay/lib/wx_pay.js b/tool/node-wxpay/lib/wx_pay.js new file mode 100644 index 0000000..a812abe --- /dev/null +++ b/tool/node-wxpay/lib/wx_pay.js @@ -0,0 +1,256 @@ +'use strict'; +const IOrder = require('./wx_ipay'); +const util = require('../utils/util'); + +// 支付 +class Pay extends IOrder { + constructor({ appid, mch_id, partner_key, pfx }) { + super({ appid, mch_id, partner_key, pfx }); + } + // 初始化参数 请求 + async init(params, name, properties) { + this._otherParams(params); + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + const result = await this._request(name, this._xml); + return result; + } + // md5加密 暴露给外部调用 + md5(params) { + return this._md5(params); + } + // HMAC-SHA256 加密 暴露给外部调用 + hmac(params) { + return this._hmac(params); + } + // xml 转json 暴露给外部调用 + xmltojson(data) { + return this._xmltojson(data); + } + // 统一下单 + async unifiedorder(params) { + // 必传参数 + const properties = ['body', 'out_trade_no', 'total_fee', 'spbill_create_ip', 'notify_url', 'trade_type']; + if (params.trade_type === 'JSAPI') properties.push('openid'); + if (params.trade_type === 'NATIVE') properties.push('product_id'); + if (params.trade_type === 'MWEB') { + properties.push('scene_info'); + properties.push('redirect_url'); + }; + + const result = await this.init(params, 'unifiedorder', properties); + + const { prepay_id, return_code, return_msg, result_code } = result; + if (return_code !== 'SUCCESS' || result_code !== 'SUCCESS') return result; + + // 参数处理 + let _data = {}; + switch (this._params.trade_type) { + case 'JSAPI': + _data['appId'] = this._params.appid; + _data['timeStamp'] = `${parseInt((+new Date()) / 1000)}`; + _data['package'] = `prepay_id=${prepay_id}`; + _data['nonceStr'] = util.getNonceStr().toLowerCase(); + _data['signType'] = params['sign_type'] || 'MD5'; + if (params['sign_type'] === 'HMAC-SHA256') { + _data['paySign'] = this._hmac(_data); + } else { + _data['paySign'] = this._md5(_data); + } + + break; + case 'APP': + _data['appid'] = this._params.appid; + _data['timestamp'] = `${parseInt((+new Date()) / 1000)}`; + _data['partnerid'] = this._params.mch_id; + _data['prepayid'] = prepay_id; + _data['package'] = 'Sign=WXPay'; + _data['noncestr'] = util.getNonceStr().toLowerCase(); + if (params['sign_type'] === 'HMAC-SHA256') { + _data['sign'] = this._hmac(_data); + } else { + _data['sign'] = this._md5(_data); + } + break; + case 'NATIVE': // pc端网站 模式二 + _data = { // 把code_url 生成图片 + ...result, + }; + break; + case 'MWEB': + // 不能直接在浏览器中访问mweb_url,会报商家参数错误,因为他会检测Referer,所以Referer不能为空 + // 手机浏览器中支付 https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn + _data = { + ...result, + 'mweb_url': result.mweb_url + `&redirect_url=${encodeURIComponent(this._params.redirect_url)}`, + }; + break; + default: + console.error('trade_type参数有误'); + _data = {}; + } + + const req_data = { + ...this._params, + }; + delete req_data['pfx']; + delete req_data['key']; + delete req_data['sign']; + + return { + // req_data, // 创建订单的参数 用于回调验证 + ..._data, + return_code, + return_msg, + result_code, + }; + } + // 支付回调验证 + callback_check(data) { + let _sign = ''; + if (data.sign_type === 'HMAC-SHA256') { + _sign = this._hmac(data); + } else { + _sign = this._md5(data); + } + return data.sign === _sign; // boolean true 成功 + } + // 订单查询 + async orderquery(params) { + // 必传参数 + const properties = []; + if (!params.transaction_id && !params.out_trade_no) throw new Error('缺少参数transaction_id或out_trade_no!'); + + let reuslt = await this.init(params, 'orderquery', properties); + return reuslt; + } + // 关闭订单 + async closeorder(params) { + const properties = ['out_trade_no']; + let reuslt = await this.init(params, 'closeorder', properties); + return reuslt; + } + // 申请退款 + async refund(params) { + if (!params.transaction_id && !params.out_trade_no) throw new Error('缺少参数transaction_id或out_trade_no!'); + if (!this._options.pfx) throw new Error('缺少pfx'); + const properties = ['out_refund_no', 'total_fee', 'refund_fee']; + let reuslt = await this.init(params, 'refund', properties); + return reuslt; + } + // 查询退款 + async refundquery(params) { + if (!params.transaction_id && !params.out_trade_no && !params.out_refund_no && !params.refund_id) { + throw new Error('缺少参数transaction_id或out_trade_no或refund_id或out_refund_no!'); + } + const properties = []; + let reuslt = await this.init(params, 'refundquery', properties); + return reuslt; + } + // 下载交易账单 + async downloadbill(params) { + this._otherParams(params); + const properties = ['bill_date']; + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + const result = await this._request2('downloadbill', this._xml); + + if (result.status !== 200 && result.statusCode !== 200) return result; + // 参数处理 + if (result.type === 'application/x-gzip') { + return { + 'data': result.body, + 'return_code': 'SUCCESS', + }; + } else if (result.type === 'text/plain') { + if (result.text.indexOf('') !== -1) return this._xmltojson(result.text); + return { + 'data': result.text, + 'return_code': 'SUCCESS', + }; + } + return result; + } + // 下载资金账单 + async downloadfundflow(params) { + this._otherParams(params); + if (params.sign_type !== 'HMAC-SHA256') throw new Error('请选择HMAC-SHA256加密!'); + if (!this._params.pfx) throw new Error('缺少pfx'); + const properties = ['bill_date', 'account_type']; + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + const result = await this._request2('downloadfundflow', this._xml); + + if (result.status !== 200 && result.statusCode !== 200) return result; + // 参数处理 + if (result.type === 'application/x-gzip') { + return { + 'data': result.body, + 'return_code': 'SUCCESS', + 'result_code': 'SUCCESS', + }; + } else if (result.type === 'text/plain') { + if (result.text.indexOf('') !== -1) return this._xmltojson(result.text); + return { + 'data': result.text, + 'return_code': 'SUCCESS', + 'result_code': 'SUCCESS', + }; + } + return result; + } + // 交易保障 + async report(params) { + const properties = ['interface_url', 'execute_time_', 'return_code', 'result_code', 'user_ip']; + let reuslt = await this.init(params, 'report', properties); + return reuslt; + } + // 拉取订单评价数据 + async batchquerycomment(params) { + this._otherParams(params); + const properties = ['begin_time', 'end_time', 'offset', 'limit']; + if (!this._params.pfx) throw new Error('缺少pfx'); + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + + const result = await this._request2('batchquerycomment', this._xml); + + if (result.status !== 200 && result.statusCode !== 200) return result; + // 参数处理 + if (result.type === 'text/html') { + if (result.text.indexOf('') !== -1) { + return this._xmltojson(result.text); + } + return { + 'data': result.text, + 'return_code': 'SUCCESS', + 'result_code': 'SUCCESS', + }; + } + return result; + } + // 付款码支付 + async micropay(params) { + const properties = ['body', 'out_trade_no', 'total_fee', 'spbill_create_ip', 'auth_code']; + let reuslt = await this.init(params, 'micropay', properties); + return reuslt; + } + // 撤销订单(只支持付款码支付的订单才可以撤销,统一下单生成的订单不能撤销) + async reverse(params) { + if (!params.transaction_id && !params.out_trade_no) throw new Error('缺少参数transaction_id或out_trade_no!'); + const properties = []; + let reuslt = await this.init(params, 'reverse', properties); + return reuslt; + } + // 付款码查询openid + async authcodetoopenid(params) { + const properties = ['auth_code']; + let reuslt = await this.init(params, 'authcodetoopenid', properties); + return reuslt; + } +} +module.exports = Pay; \ No newline at end of file diff --git a/tool/node-wxpay/lib/wx_withdraw.js b/tool/node-wxpay/lib/wx_withdraw.js new file mode 100644 index 0000000..b94dd8f --- /dev/null +++ b/tool/node-wxpay/lib/wx_withdraw.js @@ -0,0 +1,145 @@ +'use strict'; +// 微信提现相关接口 +const IWithdraw = require('./wx_iwithdraw'); +const urlencode = require('urlencode'); +const util = require('../utils/util'); +// const NodeRSA = require('node-rsa'); +const crypto = require('crypto'); + +class Withdraw extends IWithdraw { + constructor({ partner_key, pfx }) { + super({ partner_key, pfx }); + } + // md5加密 暴露给外部调用 + md5(params) { + return this._md5(params); + } + // HMAC-SHA256 加密 暴露给外部调用 + hmac(params) { + return this._hmac(params); + } + // 公钥加密 + publicEncrypt(publicKey, data) { + // const clientKey = new NodeRSA(publicKey); + // // 在node-rsa模块中加解密默认使用 pkcs1_oaep ,而在js中加密解密默认使用的是 pkcs1 + // clientKey.setOptions({ 'encryptionScheme': 'pkcs1_oaep' }); // RSA_PKCS1_OAEP_PADDING + // let encrypted = clientKey.encrypt(data, 'base64'); + // return encrypted; + + return crypto.publicEncrypt(publicKey, Buffer.from(data)).toString('base64'); + } + async init(params, name, properties) { + this._otherParams(params); + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + const result = await this._request(name, this._xml); + return result; + } + // 发放红包 + async sendredpack(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'mch_billno', 'mch_id', 'wxappid', 'send_name', 're_openid', 'total_amount', 'total_num', + 'wishing', 'client_ip', 'act_name', 'remark' ]; + let result = await this.init(params, 'sendredpack', properties); + return result; + } + // 发放裂变红包 + async sendgroupredpack(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'mch_billno', 'mch_id', 'wxappid', 'send_name', 're_openid', 'total_amount', 'total_num', + 'amt_type', 'wishing', 'wishing', 'remark' ]; + let result = await this.init(params, 'sendgroupredpack', properties); + return result; + } + // 查询红包记录 + async gethbinfo(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'mch_billno', 'mch_id', 'appid', 'bill_type' ]; + let result = await this.init(params, 'gethbinfo', properties); + return result; + } + // 小程序红包 + async sendminiprogramhb(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'mch_billno', 'mch_id', 'wxappid', 'send_name', 're_openid', 'total_amount', 'total_num', 'wishing', 'client_ip', + 'act_name', 'remark', 'notify_way' ]; + let result = await this.init(params, 'sendminiprogramhb', properties); + + const _data = {}; + if (result.return_code === 'SUCCESS' && result.result_code === 'SUCCESS' && result.package) { + + _data['timestamp'] = `${parseInt((+new Date()) / 1000)}`; + _data['package'] = urlencode(result.package); + _data['signType'] = 'MD5'; + _data['nonceStr'] = util.getNonceStr().toLowerCase(); + _data['paySign'] = this._md5(_data); + + _data['return_code'] = 'SUCCESS'; + _data['result_code'] = 'SUCCESS'; + return _data; + } + return result; + } + // 企业付款到零钱 + async transfers(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'mch_appid', 'mchid', 'partner_trade_no', 'openid', 'check_name', 'amount', 'desc' ]; + if (params['check_name'] === 'FORCE_CHECK' && !params['re_user_name']) throw new Error('缺少 re_user_name'); + let result = await this.init(params, 'transfers', properties); + return result; + } + // 查询企业付款到零钱 + async gettransferinfo(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'partner_trade_no', 'mch_id', 'appid' ]; + let result = await this.init(params, 'gettransferinfo', properties); + return result; + } + // 获取RSA加密公钥API + async getpublickey(params) { + const properties = [ 'mch_id', 'sign_type' ]; + this._otherParams(params); + this._checkOptions(properties); + this._xml = this._jsontoxml(); + + const result = await this._request2('getpublickey', this._xml); + return result; + } + // 企业付款到银行卡 + async pay_bank(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'partner_trade_no', 'mch_id', 'enc_bank_no', 'enc_true_name', 'bank_code', 'amount' ]; + let result = await this.init(params, 'pay_bank', properties); + return result; + } + // 查询企业付款到银行卡 + async query_bank(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'partner_trade_no', 'mch_id' ]; + let result = await this.init(params, 'query_bank', properties); + return result; + } + // 发放代金券 + async send_coupon(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'coupon_stock_id', 'mch_id', 'openid_count', 'partner_trade_no', 'openid', 'appid' ]; + let result = await this.init(params, 'send_coupon', properties); + return result; + } + // 查询代金券批次 + async query_coupon_stock(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'coupon_stock_id', 'mch_id', 'appid' ]; + let result = await this.init(params, 'query_coupon_stock', properties); + return result; + } + // 查询代金券信息 + async querycouponsinfo(params) { + delete params['sign_type']; // 必须移除 不然会报密钥错误 + const properties = [ 'coupon_id', 'mch_id', 'appid', 'openid', 'stock_id' ]; + let result = await this.init(params, 'querycouponsinfo', properties); + return result; + } +} +module.exports = Withdraw; diff --git a/tool/node-wxpay/utils/refund_middleware.js b/tool/node-wxpay/utils/refund_middleware.js new file mode 100644 index 0000000..fa01a40 --- /dev/null +++ b/tool/node-wxpay/utils/refund_middleware.js @@ -0,0 +1,35 @@ +'use strict'; +const xml2js = require('xml2js'); + +module.exports = () => { + return async (ctx, next) => { + let paramsJson = null; + let contentType = ctx.headers['content-type'] || 'application/json'; + if (contentType.indexOf('xml') !== -1) { // xml格式参数获取 + let data = ''; + ctx.req.setEncoding('utf8'); + ctx.req.on('data', function(chunk) { + data += chunk; + }); + + const getxml = await new Promise(function(resolve) { + ctx.req.on('end', function() { + resolve(data); + }); + }); + const parseObj = await new Promise(function(resolve) { + xml2js.parseString(getxml, { + 'explicitArray': false, + }, function(err, json) { + if (err) throw err; + return resolve(json); + }); + }); + if (parseObj.xml) delete parseObj.xml._; + paramsJson = parseObj.xml; + + } + ctx.request.body = paramsJson; + await next(); + }; +}; diff --git a/tool/node-wxpay/utils/util.js b/tool/node-wxpay/utils/util.js new file mode 100644 index 0000000..26fb1c5 --- /dev/null +++ b/tool/node-wxpay/utils/util.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + getNonceStr() { + return Math.random().toString(36).substr(2, 15); + }, +}; diff --git a/updateSql/2022 -11-15.sql b/updateSql/2022 -11-15.sql new file mode 100644 index 0000000..a0591a0 --- /dev/null +++ b/updateSql/2022 -11-15.sql @@ -0,0 +1,75 @@ + +-- 2022 -11-15 号更新 + + + + +CREATE TABLE `stg_custom_create_crowd` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `opName` varchar(100) NOT NULL DEFAULT '' COMMENT '记录名称', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '登录账号', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `imageDataURl` varchar(255) NOT NULL DEFAULT '' COMMENT '截图', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='策略中心-消费者细分-自定义人群创建记录'; + + + +CREATE TABLE `stg_custom_create_crowd_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `customCrowdId` int(11) NOT NULL DEFAULT '0' COMMENT '记录id', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '账号名称', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '品牌url', + `params` json NOT NULL COMMENT '参数', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `responseCount` varchar(50) DEFAULT '0' COMMENT '人数', + `responseErrCode` varchar(50) DEFAULT '0' COMMENT '响应错误code', + `responseErrMsg` varchar(150) DEFAULT '' COMMENT '响应错误消息', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='策略中心-消费者细分-自定义人群创建明细记录'; + + + + + +CREATE TABLE `dat_custom_create_crowd` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `opName` varchar(100) NOT NULL DEFAULT '' COMMENT '记录名称', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '登录账号', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `imageDataURl` varchar(255) NOT NULL DEFAULT '' COMMENT '截图', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据银行-自定义人群创建包表'; + + + + + +CREATE TABLE `dat_custom_create_crowd_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `customCrowdId` int(11) NOT NULL DEFAULT '0' COMMENT '记录id', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '账号名称', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '品牌url', + `params` json NOT NULL COMMENT '参数', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `responseCount` varchar(50) DEFAULT '0' COMMENT '人数', + `responseErrCode` varchar(50) DEFAULT '0' COMMENT '响应错误code', + `responseErrMsg` varchar(150) DEFAULT '' COMMENT '响应错误消息', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据银行-自定义人群创建包明细表'; diff --git a/updateSql/2022-11-16.sql b/updateSql/2022-11-16.sql new file mode 100644 index 0000000..0712c4e --- /dev/null +++ b/updateSql/2022-11-16.sql @@ -0,0 +1,32 @@ + +CREATE TABLE `dat_custom_crowd` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `opName` varchar(100) NOT NULL DEFAULT '' COMMENT '记录名称', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '登录账号', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `imageDataURl` varchar(255) NOT NULL DEFAULT '' COMMENT '截图', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8mb4 COMMENT='数据银行-自定义人群计算表'; + + + +CREATE TABLE `dat_custom_crowd_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `customCrowdId` int(11) NOT NULL DEFAULT '0' COMMENT '记录id', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '账号名称', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '品牌url', + `params` json NOT NULL COMMENT '参数', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `responseCount` varchar(50) DEFAULT '0' COMMENT '人数', + `responseErrCode` varchar(50) DEFAULT '0' COMMENT '响应错误code', + `responseErrMsg` varchar(150) DEFAULT '' COMMENT '响应错误消息', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARSET=utf8mb4 COMMENT='数据银行-自定义人群计算明细表'; \ No newline at end of file diff --git a/updateSql/2022-11-29.sql b/updateSql/2022-11-29.sql new file mode 100644 index 0000000..92ef06f --- /dev/null +++ b/updateSql/2022-11-29.sql @@ -0,0 +1,37 @@ +-- dm_tools.usr_reply definition + +CREATE TABLE `usr_reply` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) unsigned DEFAULT '0' COMMENT '用户id', + `feedback_id` int(11) unsigned DEFAULT '0' COMMENT '问题id', + `nick_name` varchar(50) NOT NULL COMMENT '用户昵称', + `context` json NOT NULL COMMENT '内容', + `pictureList` json NOT NULL COMMENT '图片列表', + `likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数', + `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '是否删除', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COMMENT='用户反馈回复表'; + + + + +-- dm_tools.usr_feedback definition + +CREATE TABLE `usr_feedback` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) unsigned DEFAULT '0' COMMENT '用户id', + `nick_name` varchar(100) NOT NULL DEFAULT '' COMMENT '昵称', + `problem_type` varchar(100) NOT NULL DEFAULT '页面优化建议' COMMENT '问题类别', + `context` json NOT NULL COMMENT '内容', + `mail_box` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱', + `pictureList` json NOT NULL COMMENT '图片列表', + `likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数', + `is_top` int(1) NOT NULL DEFAULT '0' COMMENT '是否置顶', + `is_comments` int(1) NOT NULL DEFAULT '0' COMMENT '是否关闭评论', + `is_delete` int(1) NOT NULL DEFAULT '0' COMMENT '是否删除', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COMMENT='用户反馈表'; \ No newline at end of file diff --git a/updateSql/2023-06-08.sql b/updateSql/2023-06-08.sql new file mode 100644 index 0000000..0444ef3 --- /dev/null +++ b/updateSql/2023-06-08.sql @@ -0,0 +1,57 @@ + + +CREATE TABLE `tok_live_good_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `product_id` varchar(150) NOT NULL DEFAULT '' COMMENT '商品id', + `product_title` varchar(250) NOT NULL DEFAULT '' COMMENT '商品标题', + `explain_time` varchar(150) NOT NULL DEFAULT '' COMMENT '商品讲解时间', + `explain_duration` varchar(150) NOT NULL DEFAULT '' COMMENT '讲解时长', + `live_id` int(11) NOT NULL DEFAULT '0' COMMENT '直播id', + `product_click_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '商品点击次数', + `product_pay_amt` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '商品成交金额', + `watch_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '直播间进入次数(推荐feed)', + `avg_online_ucnt` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '平均在线人数', + `cproduct_lick_radio` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '商品点击率', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播商品数据表'; + + + +CREATE TABLE `tok_live_screen` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `brand` varchar(150) NOT NULL DEFAULT '' COMMENT '品牌', + `live_app_id` varchar(50) NOT NULL DEFAULT '0' COMMENT '直播appid', + `room_id` varchar(50) NOT NULL DEFAULT '0' COMMENT '直播间id', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播大屏表'; + + + + +CREATE TABLE `tok_live_screen_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `cur_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间', + `good_name` varchar(150) NOT NULL DEFAULT '' COMMENT '商品名称', + `live_id` int(11) NOT NULL DEFAULT '0' COMMENT '直播id', + `gpm` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '千次观看成交金额', + `pay_ucnt` int(11) NOT NULL DEFAULT '0' COMMENT '成交人数', + `pay_combo_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '成交件数', + `watch_pay_ucnt_ratio` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '观看-成交率(人数)', + `product_click_pay_ucnt_ratio` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '商品点击-成交率(人数)', + `current_cnt` int(11) NOT NULL DEFAULT '0' COMMENT '平均在线人数', + `watch_cnt_show_ratio` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '曝光-观看率(次数)', + `avg_watch_duration` int(11) NOT NULL DEFAULT '0' COMMENT '人均观看时长', + `interact_watch_ucnt_ratio` decimal(14,4) NOT NULL DEFAULT '0.0000' COMMENT '观看-互动率(人数)', + `follow_anchor_ucnt` int(11) NOT NULL DEFAULT '0' COMMENT '新增粉丝数', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='直播数据表'; + + + +ALTER TABLE `tok_live_screen_dtl` ADD COLUMN `gmv` decimal(14,4) DEFAULT 0 COMMENT '直播间成交金额'; \ No newline at end of file diff --git a/updateSql/2023.09.11.sql b/updateSql/2023.09.11.sql new file mode 100644 index 0000000..6d9dc2c --- /dev/null +++ b/updateSql/2023.09.11.sql @@ -0,0 +1,33 @@ +-- pluginconfignew.plu_func_type definition + +CREATE TABLE `plu_func_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `value` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + `url` varchar(250) NOT NULL DEFAULT '' COMMENT '平台链接', + `is_enable` int(2) NOT NULL DEFAULT '0' COMMENT '是否启用', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='功能类别表' + + + +-- pluginconfignew.plu_version definition + +CREATE TABLE `plu_version` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `plugVersion` varchar(50) NOT NULL DEFAULT '' COMMENT '插件版本', + `plugUpdateDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新日期', + `downUrl` varchar(200) NOT NULL DEFAULT '' COMMENT '下载地址', + `helpUrl` varchar(200) NOT NULL DEFAULT '' COMMENT '帮助文档地址', + `description` json DEFAULT NULL COMMENT '更新说明', + `is_enable` int(2) NOT NULL DEFAULT '0' COMMENT '是否启用', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后更新时间' ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='插件版本表'; + + + + diff --git a/updateSql/20230914.sql b/updateSql/20230914.sql new file mode 100644 index 0000000..28d11ba --- /dev/null +++ b/updateSql/20230914.sql @@ -0,0 +1,2 @@ +ALTER TABLE plu_data ADD COLUMN postion varchar(300) COMMENT '位置'; + diff --git a/updateSql/20231117_dll.sql b/updateSql/20231117_dll.sql new file mode 100644 index 0000000..d2b46fb --- /dev/null +++ b/updateSql/20231117_dll.sql @@ -0,0 +1,5 @@ +ALTER TABLE plu_data ADD COLUMN `type` varchar(50) COMMENT '平台类别'; + +ALTER TABLE plu_data MODIFY COLUMN `url` varchar(500) COMMENT 'url'; + + diff --git a/updateSql/ddl.sql b/updateSql/ddl.sql new file mode 100644 index 0000000..ba8a6c3 --- /dev/null +++ b/updateSql/ddl.sql @@ -0,0 +1,274 @@ + + +CREATE TABLE `plu_api_linkjs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + `platformUrl` varchar(250) NOT NULL DEFAULT '' COMMENT '平台url', + `linkUrl` varchar(250) NOT NULL DEFAULT '' COMMENT 'js链接url', + `inline` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否内联', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='不同平台注入js表'; + + + + + +CREATE TABLE `plu_data` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `url` varchar(150) NOT NULL DEFAULT '' COMMENT 'url', + `method` varchar(50) NOT NULL DEFAULT '' COMMENT '请求类型', + `data` json NOT NULL COMMENT '数据', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=607 DEFAULT CHARSET=utf8mb4 COMMENT='通用数据下载调用保存接口'; + + + + +CREATE TABLE `plu_func` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + `type` int(11) NOT NULL DEFAULT '0' COMMENT '平台类型', + `url` varchar(250) NOT NULL DEFAULT '' COMMENT '功能链接', + `help_url` varchar(250) NOT NULL DEFAULT '' COMMENT '帮助文档链接', + `position` varchar(250) NOT NULL DEFAULT '' COMMENT '位置', + `help_content` json NOT NULL COMMENT '帮助文档内容', + `is_enable` int(2) NOT NULL DEFAULT '0' COMMENT '是否启用', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='控制插件是否展示当前功能'; + + + + + +CREATE TABLE `plu_ga` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + `brand` varchar(50) NOT NULL DEFAULT '' COMMENT '品牌', + `type` varchar(50) NOT NULL DEFAULT '' COMMENT '类型', + `postion` varchar(250) NOT NULL DEFAULT '' COMMENT '位置', + `parent_selector` varchar(500) NOT NULL DEFAULT '' COMMENT '页面选择器', + `class_name` varchar(50) NOT NULL DEFAULT '' COMMENT '按钮类名', + `icon` varchar(250) NOT NULL DEFAULT '' COMMENT '图标', + `path` varchar(500) NOT NULL DEFAULT '' COMMENT '路径', + `ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'ip', + `browser` varchar(150) NOT NULL DEFAULT '' COMMENT '浏览器', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=95712 DEFAULT CHARSET=utf8mb4 COMMENT='下载日志ga数据'; + + + + + +CREATE TABLE `plu_upgrade` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `fingerPrintKey` varchar(50) NOT NULL DEFAULT '' COMMENT '浏览器Key', + `oldVersion` varchar(50) NOT NULL DEFAULT '' COMMENT '当前安装版本', + `newVersion` varchar(50) NOT NULL DEFAULT '' COMMENT '新版本', + `whetherTip` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否忽略提示', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=139 DEFAULT CHARSET=utf8mb4 COMMENT='插件安装升级日志'; + + + + +CREATE TABLE `stg_custom_crowd` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `opName` varchar(100) NOT NULL DEFAULT '' COMMENT '记录名称', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '登录账号', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `imageDataURl` varchar(255) NOT NULL DEFAULT '' COMMENT '截图', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='策略中心-消费者细分-自定义人群计算记录'; + + + +CREATE TABLE `stg_custom_crowd_dtl` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `customCrowdId` int(11) NOT NULL DEFAULT '0' COMMENT '记录id', + `accountName` varchar(100) NOT NULL DEFAULT '' COMMENT '账号名称', + `brandId` varchar(20) DEFAULT '' COMMENT '品牌id', + `brandName` varchar(100) NOT NULL DEFAULT '' COMMENT '品牌名称', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '品牌url', + `params` json NOT NULL COMMENT '参数', + `asynKey` varchar(500) NOT NULL DEFAULT '' COMMENT '动态条件', + `responseCount` varchar(50) DEFAULT '0' COMMENT '人数', + `responseErrCode` varchar(50) DEFAULT '0' COMMENT '响应错误code', + `responseErrMsg` varchar(150) DEFAULT '' COMMENT '响应错误消息', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='策略中心-消费者细分-自定义人群计算明细记录'; + + + + + +CREATE TABLE `sys_control_type` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '控件名称', + `module_key` varchar(100) NOT NULL DEFAULT '' COMMENT '组件key', + `data_lenght` int(11) NOT NULL DEFAULT '50' COMMENT '数据长度', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统-控件类型表'; + + + + +CREATE TABLE `sys_form` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '表单名称', + `model_id` int(11) unsigned DEFAULT '0' COMMENT '模型id', + `menu_id` int(11) unsigned DEFAULT '0' COMMENT '菜单id', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8mb4 COMMENT='系统-表单表'; + + + + +CREATE TABLE `sys_form_field` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `form_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '表单id', + `model_field_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '字段id', + `model_field_name` varchar(50) NOT NULL DEFAULT '' COMMENT '字段名称', + `control` json NOT NULL COMMENT '控件', + `is_show_edit` int(1) NOT NULL DEFAULT '0' COMMENT '是否显示在编辑界面', + `is_edit_disable` int(1) NOT NULL DEFAULT '0' COMMENT '编辑界面是否禁用', + `is_show_list` int(1) NOT NULL DEFAULT '0' COMMENT '是否显示在列表', + `is_show_seach` int(1) NOT NULL DEFAULT '0' COMMENT '是否显示在搜索', + `sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '排序', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=421 DEFAULT CHARSET=utf8mb4 COMMENT='系统-表单字段表'; + + + + +CREATE TABLE `sys_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `table_name` varchar(100) NOT NULL DEFAULT '' COMMENT '表名', + `operate` varchar(100) NOT NULL DEFAULT '' COMMENT '操作', + `content` json NOT NULL COMMENT '内容', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COMMENT='系统-日志表'; + + + + +CREATE TABLE `sys_menu` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '菜单名称', + `parent_id` int(11) unsigned DEFAULT '0' COMMENT '父id', + `icon` varchar(100) NOT NULL DEFAULT '' COMMENT '图标', + `path` varchar(255) NOT NULL DEFAULT '' COMMENT '路径', + `type` varchar(50) NOT NULL DEFAULT '页面' COMMENT '菜单类型', + `model_id` int(11) unsigned DEFAULT '0' COMMENT '模型id', + `component` varchar(100) NOT NULL DEFAULT '' COMMENT '组件地址', + `api_path` varchar(100) DEFAULT '' COMMENT 'api地址', + `is_show_menu` int(1) NOT NULL DEFAULT '1' COMMENT '是否显示在菜单中', + `is_show` int(1) NOT NULL DEFAULT '1' COMMENT '是否展示', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '菜单类型', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8mb4 COMMENT='系统-菜单表'; + + + + + +CREATE TABLE `sys_model` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(50) NOT NULL DEFAULT '' COMMENT '模型key', + `name` varchar(50) NOT NULL DEFAULT '0' COMMENT '模型名称', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='系统-模型表'; + + + + + + +CREATE TABLE `sys_model_field` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `model_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '模型Id', + `key` varchar(50) NOT NULL DEFAULT '' COMMENT '字段Key', + `name` varchar(50) NOT NULL DEFAULT '0' COMMENT '名称', + `control` json NOT NULL COMMENT '控件', + `sort` int(11) NOT NULL DEFAULT '1' COMMENT '排序', + `data_type` varchar(50) NOT NULL DEFAULT '0' COMMENT '数据类型', + `data_length` int(11) NOT NULL DEFAULT '50' COMMENT '数据长度', + `allow_null` int(1) NOT NULL DEFAULT '0' COMMENT '是否为空', + `default_value` varchar(50) NOT NULL DEFAULT '' COMMENT '默认值', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8mb4 COMMENT='系统-模型字段表'; + + + + +CREATE TABLE `sys_parameter` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `key` varchar(100) NOT NULL DEFAULT '' COMMENT '字典key', + `value` varchar(100) NOT NULL DEFAULT '' COMMENT '值', + `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注', + `is_modified` int(2) NOT NULL DEFAULT '0' COMMENT '是否允许修改', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系统-配置表'; + + + + +CREATE TABLE `sys_role` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '角色名称', + `type` int(1) NOT NULL DEFAULT '0' COMMENT '角色类型', + `menus` json NOT NULL COMMENT '权限菜单', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='系统-角色表'; + + + + +CREATE TABLE `sys_user` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', + `password` varchar(100) NOT NULL DEFAULT '' COMMENT '密码', + `roleId` int(11) NOT NULL COMMENT '角色id', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='系统-用户表'; + + + + +