Commit a168bbe2 authored by Wallen姚文辉's avatar Wallen姚文辉

一版

parent 2cc7edfa
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
plugins: [
]
}
......@@ -16,4 +16,4 @@
"scripthost"
]
}
}
}
\ No newline at end of file
......@@ -8,9 +8,22 @@
"name": "yinhe_test",
"version": "0.1.0",
"dependencies": {
"@novnc/novnc": "^1.4.0",
"balm-ui": "^10.28.0",
"clipboard": "^2.0.11",
"core-js": "^3.8.3",
"echarts": "^5.5.0",
"file-saver": "^2.0.5",
"filesaver": "^0.0.13",
"html2canvas": "^1.4.1",
"screenfull": "^6.0.2",
"three": "^0.121.0",
"vanta": "^0.5.24",
"view-ui-plus": "^1.3.16",
"vue": "^3.2.13",
"vue-router": "^4.0.3"
"vue-echarts": "^6.7.2",
"vue-router": "^4.0.3",
"vuex": "^4.0.0"
},
"devDependencies": {
"@babel/core": "^7.12.16",
......@@ -18,8 +31,11 @@
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-router": "~5.0.0",
"@vue/cli-plugin-vuex": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/eslint-config-standard": "^6.1.0",
"axios": "^1.6.8",
"babel-plugin-import": "^1.13.8",
"eslint": "^7.32.0",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-node": "^11.1.0",
......@@ -1971,6 +1987,740 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"dev": true
},
"node_modules/@material/animation": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/animation/-/animation-14.0.0.tgz",
"integrity": "sha512-VlYSfUaIj/BBVtRZI8Gv0VvzikFf+XgK0Zdgsok5c1v5DDnNz5tpB8mnGrveWz0rHbp1X4+CWLKrTwNmjrw3Xw==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/auto-init": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-14.0.0.tgz",
"integrity": "sha512-RtrHVRTRtUvOd5PC5EZkwYrab11n4sVroYL5g9lH0+cvK6PDXv1M/wVdwOSWHYgzBUU1aSf9ZTMkKdrvharU+A==",
"dependencies": {
"@material/base": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/banner": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/banner/-/banner-14.0.0.tgz",
"integrity": "sha512-z0WPBVQxbQVcV1km4hFD40xBEeVWYtCzl2jrkHd8xXexP/fMvXkFU1UfwSWvY3jlWx//j4/Xd7VpnRdEXS4RLQ==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/button": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/base": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/base/-/base-14.0.0.tgz",
"integrity": "sha512-Ou7vS7n1H4Y10MUZyYAbt6H0t67c6urxoCgeVT7M38aQlaNUwFMODp7KT/myjYz2YULfhu3PtfSV3Sltgac9mA==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/button": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/button/-/button-14.0.0.tgz",
"integrity": "sha512-dqqHaJq0peyXBZupFzCjmvScrfljyVU66ZCS3oldsaaj5iz8sn33I/45Z4zPzdR5F5z8ExToHkRcXhakj1UEAA==",
"dependencies": {
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/card": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/card/-/card-14.0.0.tgz",
"integrity": "sha512-SnpYWUrCb92meGYLXV7qa/k40gnHR6rPki6A1wz0OAyG2twY48f0HLscAqxBLvbbm1LuRaqjz0RLKGH3VzxZHw==",
"dependencies": {
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/checkbox": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-14.0.0.tgz",
"integrity": "sha512-OoqwysCqvj1d0cRmEwVWPvg5OqYAiCFpE6Wng6me/Cahfe4xgRxSPa37WWqsClw20W7PG/5RrYRCBtc6bUUUZA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/touch-target": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/chips": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/chips/-/chips-14.0.0.tgz",
"integrity": "sha512-SfZX/Ovdq4NgjdtIr/N1O3fEHisZC+t8G8629OV/NrniSS6rKOa+q1mImzna8R4pfuYO+7nT5nZewQpL/JSYaQ==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/checkbox": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/circular-progress": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-14.0.0.tgz",
"integrity": "sha512-7EdkP6ty54g6qs6zzlsw29vWlUyrcSWr9b4pGGx4D/iNJww+eyxXZ07iWoNOr4uLgguauWEft2axpQiFCwFD0g==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/progress-indicator": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/data-table": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-14.0.0.tgz",
"integrity": "sha512-tnmLawGaMtnp29KH8pX99bqeKmFODE+MtRUTt6TauupkEfQE/wd0Um4JQDFiI0kCch7uF3r/NmQKyKuan10hXw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/checkbox": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/icon-button": "^14.0.0",
"@material/linear-progress": "^14.0.0",
"@material/list": "^14.0.0",
"@material/menu": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/select": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/density": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/density/-/density-14.0.0.tgz",
"integrity": "sha512-NlxXBV5XjNsKd8UXF4K/+fOXLxoFNecKbsaQO6O2u+iG8QBfFreKRmkhEBb2hPPwC3w8nrODwXX0lHV+toICQw==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/dialog": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-14.0.0.tgz",
"integrity": "sha512-E07NEE4jP8jHaw/y2Il2R1a3f4wDFh2sgfCBtRO/Xh0xxJUMuQ7YXo/F3SAA8jfMbbkUv/PHdJUM3I3HmI9mAA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/button": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/icon-button": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/dom": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/dom/-/dom-14.0.0.tgz",
"integrity": "sha512-8t88XyacclTj8qsIw9q0vEj4PI2KVncLoIsIMzwuMx49P2FZg6TsLjor262MI3Qs00UWAifuLMrhnOnfyrbe7Q==",
"dependencies": {
"@material/feature-targeting": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/drawer": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-14.0.0.tgz",
"integrity": "sha512-VPrxMIhbkXVbfH7aMFV+Um0tjOVrU/Y65X2hWsVdmjASadE8C5UYjIE3vjL1DM1M+zIa3qZZRUWqz0j1zqbr3w==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/list": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/elevation": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-14.0.0.tgz",
"integrity": "sha512-Di3tkxTpXwvf1GJUmaC8rd+zVh5dB2SWMBGagL4+kT8UmjSISif/OPRGuGnXs3QhF6nmEjkdC0ijdZLcYQkepw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/fab": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/fab/-/fab-14.0.0.tgz",
"integrity": "sha512-s4rrw2TLU8ITKopHSTEHuJEFsGEZsb+ijwW16pQt0h9GArxPGaALT+CCJIPjf75D3wPEEMW0vnLj7oMoII2VFg==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/feature-targeting": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-14.0.0.tgz",
"integrity": "sha512-a5WGgHEq5lJeeNL5yevtgoZjBjXWy6+klfVWQEh8oyix/rMJygGgO7gEc52uv8fB8uAIoYEB3iBMOv8jRq8FeA==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/floating-label": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-14.0.0.tgz",
"integrity": "sha512-Aq8BboP1sbNnOtsV72AfaYirHyOrQ/GKFoLrZ1Jt+ZGIAuXPETcj9z7nQDznst0ZeKcz420PxNn9tsybTbeL/Q==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/focus-ring": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-14.0.0.tgz",
"integrity": "sha512-fqqka6iSfQGJG3Le48RxPCtnOiaLGPDPikhktGbxlyW9srBVMgeCiONfHM7IT/1eu80O0Y67Lh/4ohu5+C+VAQ==",
"dependencies": {
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0"
}
},
"node_modules/@material/form-field": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-14.0.0.tgz",
"integrity": "sha512-k1GNBj6Sp8A7Xsn5lTMp5DkUkg60HX7YkQIRyFz1qCDCKJRWh/ou7Z45GMMgKmG3aF6LfjIavc7SjyCl8e5yVg==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/icon-button": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-14.0.0.tgz",
"integrity": "sha512-wHMqzm7Q/UwbWLoWv32Li1r2iVYxadIrwTNxT0+p+7NdfI3lEwMN3NoB0CvoJnHTljjXDzce0KJ3nZloa0P0gA==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/touch-target": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/image-list": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-14.0.0.tgz",
"integrity": "sha512-vx/7WCMbiZoy/R+DmO7r0N3jWzFjlvvDMeBpXt0btglWP3EYbVnDqzseW4u1TtY+IBbJldW/DsiCN1oLnlEVxw==",
"dependencies": {
"@material/feature-targeting": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/layout-grid": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-14.0.0.tgz",
"integrity": "sha512-tAce0PR/c85VI2gf1HUdM0Y15ZWpfZWAFIwaCRW1+jnOLWnG1/aOJYLlzqtVEv2m0TS1R1WRRGN3Or+CWvpDRA==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/line-ripple": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-14.0.0.tgz",
"integrity": "sha512-Rx9eSnfp3FcsNz4O+fobNNq2PSm5tYHC3hRpY2ZK3ghTvgp3Y40/soaGEi/Vdg0F7jJXRaBSNOe6p5t9CVfy8Q==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/linear-progress": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-14.0.0.tgz",
"integrity": "sha512-MGIAWMHMW6TSV/TNWyl5N/escpDHk3Rq6hultFif+D9adqbOXrtfZZIFPLj1FpMm1Ucnj6zgOmJHgCDsxRVNIA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/progress-indicator": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/list": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/list/-/list-14.0.0.tgz",
"integrity": "sha512-AFaBGV9vQyfnG8BT2R3UGVdF5w2SigQqBH+qbOSxQhk4BgVvhDfJUIKT415poLNMdnaDtcuYz+ZWvVNoRDaL7w==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/menu": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/menu/-/menu-14.0.0.tgz",
"integrity": "sha512-oU6GjbYnkG6a5nX9HUSege5OQByf6yUteEij8fpf0ci3f5BWf/gr39dnQ+rfl+q119cW0WIEmVK2YJ/BFxMzEQ==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/list": "^14.0.0",
"@material/menu-surface": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/menu-surface": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-14.0.0.tgz",
"integrity": "sha512-wRz3UCrhJ4kRrijJEbvIPRa0mqA5qkQmKXjBH4Xu1ApedZruP+OM3Qb2Bj4XugCA3eCXpiohg+gdyTAX3dVQyw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/notched-outline": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-14.0.0.tgz",
"integrity": "sha512-6S58DlWmhCDr4RQF2RuwqANxlmLdHtWy2mF4JQLD9WOiCg4qY9eCQnMXu3Tbhr7f/nOZ0vzc7AtA3vfJoZmCSw==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/floating-label": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/progress-indicator": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-14.0.0.tgz",
"integrity": "sha512-09JRTuIySxs670Tcy4jVlqCUbyrO+Ad6z3nHnAi8pYl74duco4n/9jTROV0mlFdr9NIFifnd08lKbiFLDmfJGQ==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@material/radio": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/radio/-/radio-14.0.0.tgz",
"integrity": "sha512-VwPOi5fAoZXL3RhQJ6iDWTR34L6JXlwd5VXli8ZhzNHnUzcmpMODrRhGVew4Z5uuNj6/n2Jbn1zcS9XmmqjssA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/touch-target": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/ripple": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-14.0.0.tgz",
"integrity": "sha512-9XoGBFd5JhFgELgW7pqtiLy+CnCIcV2s9cQ2BWbOQeA8faX9UZIDUx/g76nHLZ7UzKFtsULJxZTwORmsEt2zvw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/rtl": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-14.0.0.tgz",
"integrity": "sha512-xl6OZYyRjuiW2hmbjV2omMV8sQtfmKAjeWnD1RMiAPLCTyOW9Lh/PYYnXjxUrNa0cRwIIbOn5J7OYXokja8puA==",
"dependencies": {
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/segmented-button": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-14.0.0.tgz",
"integrity": "sha512-6es7PPNX3T3h7bOLyb8L38hMoTXqBs5XX8XCKycKZG2Dm4stac/yYMKKO/q3MOn36t37s+JAVTjyRB8HnJu5Gg==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/select": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/select/-/select-14.0.0.tgz",
"integrity": "sha512-4aY1kUHEnbOCRG3Tkuuk8yFfyNYSvOstBbjiYE/Z1ZGF3P1z+ON35iLatP84LvNteX4F1EMO2QAta2QbLRMAkw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/floating-label": "^14.0.0",
"@material/line-ripple": "^14.0.0",
"@material/list": "^14.0.0",
"@material/menu": "^14.0.0",
"@material/menu-surface": "^14.0.0",
"@material/notched-outline": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/shape": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/shape/-/shape-14.0.0.tgz",
"integrity": "sha512-o0mJB0+feOv473KckI8gFnUo8IQAaEA6ynXzw3VIYFjPi48pJwrxa0mZcJP/OoTXrCbDzDeFJfDPXEmRioBb9A==",
"dependencies": {
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/slider": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/slider/-/slider-14.0.0.tgz",
"integrity": "sha512-m5RqySIps1vhAQnGp2eg4Sh2Ss6bzrZm10TWBw2cNFHmbiI72rK2EeFnMsBXAarplY0cot/FaMuj91VP36gKFQ==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/snackbar": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-14.0.0.tgz",
"integrity": "sha512-28uQBj9bw7BalNarK9j8/aVW4Ys5aRaGHoWH+CeYvAjqQUJkrYoqM52aiKhBwqrjBPMJHk1aXthe3YbzMBm6vA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/button": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/icon-button": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/switch": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/switch/-/switch-14.0.0.tgz",
"integrity": "sha512-vHVKzbvHVKGSrkMB1lZAl8z3eJ8sPRnSR+DWn+IhqHcTsDdDyly2NNj4i2vTSrEA39CztGqkx0OnKM4vkpiZHw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tab/-/tab-14.0.0.tgz",
"integrity": "sha512-jGSQdp6BvZOVnvGbv0DvNDJL2lHYVFtKGehV0gSZ7FrjHK6gZnKZjWOVwt1NPu9ig9zy85vPRFpvFTeje1KZpg==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/tab-indicator": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-bar": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-14.0.0.tgz",
"integrity": "sha512-G/UYEOIcljCHlkj3iCRGIz4zE9RVcsdC9wuOR6LE2rla6EGyT0x2psNlL0pIMROjXoB0HGda/gB90ovzKcbURA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/tab": "^14.0.0",
"@material/tab-indicator": "^14.0.0",
"@material/tab-scroller": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-indicator": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-14.0.0.tgz",
"integrity": "sha512-wfq136fsJGqtCIW8x1wFQHgRr7dIQ9SWqp6WG4FQGHpSzliNDA23/bdBUjh3lX2U+mfbdsFmZWEPy06jg2uc5g==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tab-scroller": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-14.0.0.tgz",
"integrity": "sha512-wadETsRM7vT4mRjXedaPXxI/WFSSgqHRNI//dORJ6627hoiJfLb5ixwUKTYk9zTz6gNwAlRTrKh98Dr9T7n7Kw==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/tab": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/textfield": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-14.0.0.tgz",
"integrity": "sha512-HGbtAlvlIB2vWBq85yw5wQeeP3Kndl6Z0TJzQ6piVtcfdl2mPyWhuuVHQRRAOis3rCIaAAaxCQYYTJh8wIi0XQ==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/floating-label": "^14.0.0",
"@material/line-ripple": "^14.0.0",
"@material/notched-outline": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/theme": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/theme/-/theme-14.0.0.tgz",
"integrity": "sha512-6/SENWNIFuXzeHMPHrYwbsXKgkvCtWuzzQ3cUu4UEt3KcQ5YpViazIM6h8ByYKZP8A9d8QpkJ0WGX5btGDcVoA==",
"dependencies": {
"@material/feature-targeting": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/tokens": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-14.0.0.tgz",
"integrity": "sha512-SXgB9VwsKW4DFkHmJfDIS0x0cGdMWC1D06m6z/WQQ5P5j6/m0pKrbHVlrLzXcRjau+mFhXGvj/KyPo9Pp/Rc8Q==",
"dependencies": {
"@material/elevation": "^14.0.0"
}
},
"node_modules/@material/tooltip": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-14.0.0.tgz",
"integrity": "sha512-rp7sOuVE1hmg4VgBJMnSvtDbSzctL42X7y1yv8ukuu40Sli+H5FT0Zbn351EfjJgQWg/AlXA6+reVXkXje8JzQ==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/top-app-bar": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-14.0.0.tgz",
"integrity": "sha512-uPej5vHgZnlSB1+koiA9FnabXrHh3O/Npl2ifpUgDVwHDSOxKvLp2LNjyCO71co1QLNnNHIU0xXv3B97Gb0rpA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/base": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/typography": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/touch-target": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-14.0.0.tgz",
"integrity": "sha512-o3kvxmS4HkmZoQTvtzLJrqSG+ezYXkyINm3Uiwio1PTg67pDgK5FRwInkz0VNaWPcw9+5jqjUQGjuZMtjQMq8w==",
"dependencies": {
"@material/base": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/rtl": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@material/typography": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/@material/typography/-/typography-14.0.0.tgz",
"integrity": "sha512-/QtHBYiTR+TPMryM/CT386B2WlAQf/Ae32V324Z7P40gHLKY/YBXx7FDutAWZFeOerq/two4Nd2aAHBcMM2wMw==",
"dependencies": {
"@material/feature-targeting": "^14.0.0",
"@material/theme": "^14.0.0",
"tslib": "^2.1.0"
}
},
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"resolved": "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
......@@ -2027,6 +2777,11 @@
"node": ">= 8"
}
},
"node_modules/@novnc/novnc": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@novnc/novnc/-/novnc-1.4.0.tgz",
"integrity": "sha512-kW6ALMc5BuH08e/ond/I1naYcfjc19JYMN1EdtmgjjjzPGCjW8fMtVM3MwM6q7YLRjPlQ3orEvoKMgSS7RkEVQ=="
},
"node_modules/@polka/url": {
"version": "1.0.0-next.25",
"resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.25.tgz",
......@@ -3674,6 +4429,17 @@
"lodash": "^4.17.14"
}
},
"node_modules/async-validator": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.2.tgz",
"integrity": "sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ=="
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
......@@ -3718,6 +4484,17 @@
"node": ">= 0.4"
}
},
"node_modules/axios": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-loader": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz",
......@@ -3760,6 +4537,15 @@
"object.assign": "^4.1.0"
}
},
"node_modules/babel-plugin-import": {
"version": "1.13.8",
"resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.8.tgz",
"integrity": "sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.0.0"
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.10",
"resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
......@@ -3837,6 +4623,36 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
"node_modules/balm-ui": {
"version": "10.28.0",
"resolved": "https://registry.npmjs.org/balm-ui/-/balm-ui-10.28.0.tgz",
"integrity": "sha512-z9Da1uKEKOkBdURLuzgGlKXuC9Y9JKUYB5agv/GEnb0EP0lKtnepOLhKg/XGXFSBz1Q44iqUVfHo54GUvs/W5Q==",
"dependencies": {
"deepmerge": "^4.3.1",
"flatpickr": "^4.6.13",
"material-components-web": "14",
"quill": "^1.3.7"
},
"peerDependencies": {
"vue": ">=3"
}
},
"node_modules/balm-ui/node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
"integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
"engines": {
"node": ">= 0.6.0"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
......@@ -3849,6 +4665,11 @@
"integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
"dev": true
},
"node_modules/batch-processor": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
"integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA=="
},
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
......@@ -4017,7 +4838,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
......@@ -4264,6 +5084,16 @@
"node": ">=6"
}
},
"node_modules/clipboard": {
"version": "2.0.11",
"resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
"integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
"dependencies": {
"good-listener": "^1.2.2",
"select": "^1.1.2",
"tiny-emitter": "^2.0.0"
}
},
"node_modules/clipboardy": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
......@@ -4351,6 +5181,18 @@
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
"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==",
"dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
......@@ -4558,6 +5400,11 @@
"node": ">=10"
}
},
"node_modules/countup.js": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/countup.js/-/countup.js-1.9.3.tgz",
"integrity": "sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A=="
},
"node_modules/cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
......@@ -4595,6 +5442,14 @@
"postcss": "^8.0.9"
}
},
"node_modules/css-line-break": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
"integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
"dependencies": {
"utrie": "^1.0.2"
}
},
"node_modules/css-loader": {
"version": "6.10.0",
"resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-6.10.0.tgz",
......@@ -4916,6 +5771,11 @@
"node": ">= 0.4"
}
},
"node_modules/dayjs": {
"version": "1.11.10",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
"integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
},
"node_modules/debounce": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz",
......@@ -4939,6 +5799,25 @@
}
}
},
"node_modules/deep-equal": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
"integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
"dependencies": {
"is-arguments": "^1.1.1",
"is-date-object": "^1.0.5",
"is-regex": "^1.1.4",
"object-is": "^1.1.5",
"object-keys": "^1.1.1",
"regexp.prototype.flags": "^1.5.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
......@@ -5088,7 +5967,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
......@@ -5111,7 +5989,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz",
"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
"dependencies": {
"define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
......@@ -5121,6 +5998,20 @@
"node": ">= 0.4"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegate": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
"integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
......@@ -5277,6 +6168,20 @@
"node": ">=6.0.0"
}
},
"node_modules/echarts": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.0.tgz",
"integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==",
"dependencies": {
"tslib": "2.3.0",
"zrender": "5.5.0"
}
},
"node_modules/echarts/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
......@@ -5289,6 +6194,14 @@
"integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==",
"dev": true
},
"node_modules/element-resize-detector": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz",
"integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==",
"dependencies": {
"batch-processor": "1.0.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
......@@ -5441,7 +6354,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
......@@ -5453,7 +6365,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
......@@ -6478,12 +7389,22 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"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/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
"node_modules/fast-diff": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
"integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig=="
},
"node_modules/fast-glob": {
"version": "3.3.2",
"resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
......@@ -6569,6 +7490,20 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"node_modules/filesaver": {
"version": "0.0.13",
"resolved": "https://registry.npmjs.org/filesaver/-/filesaver-0.0.13.tgz",
"integrity": "sha512-ay2iShYJKmzKRPk89cgb14foqtCXcJIe5i+qdlSPAouKfBv7F2VZ0lxk9GjpcODe9p2YrXfi3Q+4CRn7ZDmleQ==",
"dependencies": {
"mkdirp": "^0.5.0",
"safename": "0.0.4"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
......@@ -6670,6 +7605,11 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/flatpickr": {
"version": "4.6.13",
"resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz",
"integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw=="
},
"node_modules/flatted": {
"version": "3.3.1",
"resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz",
......@@ -6699,6 +7639,20 @@
"is-callable": "^1.1.3"
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
......@@ -6770,8 +7724,7 @@
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
......@@ -6797,8 +7750,7 @@
"node_modules/functions-have-names": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
......@@ -6822,7 +7774,6 @@
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
......@@ -6933,11 +7884,18 @@
"node": ">=10"
}
},
"node_modules/good-listener": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
"integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
"dependencies": {
"delegate": "^3.1.2"
}
},
"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"
}
......@@ -6985,7 +7943,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
"dev": true,
"dependencies": {
"es-define-property": "^1.0.0"
}
......@@ -6994,7 +7951,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
......@@ -7003,7 +7959,6 @@
"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"
}
......@@ -7012,7 +7967,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"dependencies": {
"has-symbols": "^1.0.3"
},
......@@ -7030,7 +7984,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.2"
},
......@@ -7174,6 +8127,18 @@
}
}
},
"node_modules/html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
"integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
"dependencies": {
"css-line-break": "^2.1.0",
"text-segmentation": "^1.0.3"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/htmlparser2": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz",
......@@ -7376,6 +8341,21 @@
"node": ">= 10"
}
},
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
"integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-array-buffer": {
"version": "3.0.4",
"resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
......@@ -7475,7 +8455,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
......@@ -7595,7 +8574,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
......@@ -7766,6 +8744,11 @@
"@sideway/pinpoint": "^2.0.0"
}
},
"node_modules/js-calendar": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/js-calendar/-/js-calendar-1.2.3.tgz",
"integrity": "sha512-dAA1/Zbp4+c5E+ARCVTIuKepXsNLzSYfzvOimiYD4S5eeP9QuplSHLcdhfqFSwyM1o1u6ku6RRRCyaZ0YAjiBw=="
},
"node_modules/js-message": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz",
......@@ -7987,6 +8970,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"node_modules/lodash.chunk": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz",
"integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w=="
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
......@@ -8023,6 +9011,11 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
},
"node_modules/lodash.truncate": {
"version": "4.4.2",
"resolved": "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
......@@ -8269,6 +9262,62 @@
"node": ">=8"
}
},
"node_modules/material-components-web": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/material-components-web/-/material-components-web-14.0.0.tgz",
"integrity": "sha512-bfGTQQOMhlBfZYkMzXNdydotG8p/hntiln13IRVIN38F170OU/y7ONpCxUweANDEVxrMeKAupVw/4u9in+LKFA==",
"dependencies": {
"@material/animation": "^14.0.0",
"@material/auto-init": "^14.0.0",
"@material/banner": "^14.0.0",
"@material/base": "^14.0.0",
"@material/button": "^14.0.0",
"@material/card": "^14.0.0",
"@material/checkbox": "^14.0.0",
"@material/chips": "^14.0.0",
"@material/circular-progress": "^14.0.0",
"@material/data-table": "^14.0.0",
"@material/density": "^14.0.0",
"@material/dialog": "^14.0.0",
"@material/dom": "^14.0.0",
"@material/drawer": "^14.0.0",
"@material/elevation": "^14.0.0",
"@material/fab": "^14.0.0",
"@material/feature-targeting": "^14.0.0",
"@material/floating-label": "^14.0.0",
"@material/focus-ring": "^14.0.0",
"@material/form-field": "^14.0.0",
"@material/icon-button": "^14.0.0",
"@material/image-list": "^14.0.0",
"@material/layout-grid": "^14.0.0",
"@material/line-ripple": "^14.0.0",
"@material/linear-progress": "^14.0.0",
"@material/list": "^14.0.0",
"@material/menu": "^14.0.0",
"@material/menu-surface": "^14.0.0",
"@material/notched-outline": "^14.0.0",
"@material/radio": "^14.0.0",
"@material/ripple": "^14.0.0",
"@material/rtl": "^14.0.0",
"@material/segmented-button": "^14.0.0",
"@material/select": "^14.0.0",
"@material/shape": "^14.0.0",
"@material/slider": "^14.0.0",
"@material/snackbar": "^14.0.0",
"@material/switch": "^14.0.0",
"@material/tab": "^14.0.0",
"@material/tab-bar": "^14.0.0",
"@material/tab-indicator": "^14.0.0",
"@material/tab-scroller": "^14.0.0",
"@material/textfield": "^14.0.0",
"@material/theme": "^14.0.0",
"@material/tokens": "^14.0.0",
"@material/tooltip": "^14.0.0",
"@material/top-app-bar": "^14.0.0",
"@material/touch-target": "^14.0.0",
"@material/typography": "^14.0.0"
}
},
"node_modules/mdn-data": {
"version": "2.0.14",
"resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz",
......@@ -8478,8 +9527,7 @@
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
},
"node_modules/minipass": {
"version": "3.3.6",
......@@ -8503,7 +9551,6 @@
"version": "0.5.6",
"resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
"dependencies": {
"minimist": "^1.2.6"
},
......@@ -8708,6 +9755,14 @@
"boolbase": "^1.0.0"
}
},
"node_modules/numeral": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz",
"integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==",
"engines": {
"node": "*"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
......@@ -8723,11 +9778,25 @@
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"dev": true
},
"node_modules/object-is": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
"integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
......@@ -9025,6 +10094,11 @@
"tslib": "^2.0.3"
}
},
"node_modules/parchment": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
"integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg=="
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
......@@ -9166,6 +10240,16 @@
"node": ">=8"
}
},
"node_modules/popper.js": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==",
"deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/portfinder": {
"version": "1.0.32",
"resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz",
......@@ -9831,6 +10915,12 @@
"node": ">= 0.10"
}
},
"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==",
"dev": true
},
"node_modules/pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
......@@ -9874,6 +10964,45 @@
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
"dev": true
},
"node_modules/quill": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
"integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
"dependencies": {
"clone": "^2.1.1",
"deep-equal": "^1.0.1",
"eventemitter3": "^2.0.3",
"extend": "^3.0.2",
"parchment": "^1.1.4",
"quill-delta": "^3.6.2"
}
},
"node_modules/quill-delta": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
"integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
"dependencies": {
"deep-equal": "^1.0.1",
"extend": "^3.0.2",
"fast-diff": "1.1.2"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/quill/node_modules/clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/quill/node_modules/eventemitter3": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
"integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
......@@ -10017,7 +11146,6 @@
"version": "1.5.2",
"resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
"integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.6",
"define-properties": "^1.2.1",
......@@ -10121,6 +11249,11 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
"node_modules/resize-detector": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/resize-detector/-/resize-detector-0.3.0.tgz",
"integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
},
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz",
......@@ -10238,6 +11371,11 @@
"node": ">= 0.4"
}
},
"node_modules/safename": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/safename/-/safename-0.0.4.tgz",
"integrity": "sha512-+n4TsvESZKTXbHxOTSyQ0Q1JCXRb6MohgrqC2fbdALzTNQP/IhPOnCNRA4JPtagQq+6DD5ZsQ3lKMy57BYvwJA=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
......@@ -10258,6 +11396,22 @@
"node": ">= 8.9.0"
}
},
"node_modules/screenfull": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz",
"integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==",
"engines": {
"node": "^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/select": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
"integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
},
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
......@@ -10437,7 +11591,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
"dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
......@@ -10454,7 +11607,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz",
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
......@@ -11039,6 +12191,14 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"node_modules/text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
"integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
"dependencies": {
"utrie": "^1.0.2"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
......@@ -11113,12 +12273,27 @@
"node": ">= 10.13.0"
}
},
"node_modules/three": {
"version": "0.121.0",
"resolved": "https://registry.npmjs.org/three/-/three-0.121.0.tgz",
"integrity": "sha512-12bkOFsSCsfHViuqDuxDccMBT8eJ/UH829P1J50f4mvI9pWNX4iurZq8Vbo+rs9rKkgrSBRq7ubE77dQ1Y1hzA=="
},
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
"dev": true
},
"node_modules/tiny-emitter": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
......@@ -11191,8 +12366,7 @@
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dev": true
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/type-check": {
"version": "0.4.0",
......@@ -11414,6 +12588,14 @@
"node": ">= 0.4.0"
}
},
"node_modules/utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
"integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
"dependencies": {
"base64-arraybuffer": "^1.0.2"
}
},
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
......@@ -11423,6 +12605,15 @@
"uuid": "dist/bin/uuid"
}
},
"node_modules/v-click-outside-x": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/v-click-outside-x/-/v-click-outside-x-3.7.1.tgz",
"integrity": "sha512-WmUgmcIXr9clVpm1AYS/FgHtcDicfnfoxgQCNg4O6vfk9GVnxA0vSqO321ogUo0b7czYTidj7fQENvWFMWOkUg==",
"engines": {
"node": ">=8.11.4",
"npm": "6.4.1"
}
},
"node_modules/v8-compile-cache": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
......@@ -11439,6 +12630,11 @@
"spdx-expression-parse": "^3.0.0"
}
},
"node_modules/vanta": {
"version": "0.5.24",
"resolved": "https://registry.npmjs.org/vanta/-/vanta-0.5.24.tgz",
"integrity": "sha512-fvieEbHy1ZS23zrcX+topzqAgA4Uct1enngOEWLFBgs9TtOf6RDFOYatH7KSVdrABzQDMCQ5myQy+nTSZZwLzg=="
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
......@@ -11448,6 +12644,34 @@
"node": ">= 0.8"
}
},
"node_modules/view-ui-plus": {
"version": "1.3.16",
"resolved": "https://registry.npmjs.org/view-ui-plus/-/view-ui-plus-1.3.16.tgz",
"integrity": "sha512-3wu9XlTlbDYRoenAcslKydt2F0fjjqPzweOKbIOTBBBWizO670Jgs0SK/bQ1VYtdGzmU5JYeiWT/kq43Aoxnow==",
"dependencies": {
"async-validator": "^3.3.0",
"countup.js": "^1.9.3",
"dayjs": "^1.11.0",
"deepmerge": "^2.2.1",
"element-resize-detector": "^1.2.0",
"js-calendar": "^1.2.3",
"lodash.chunk": "^4.2.0",
"lodash.throttle": "^4.1.1",
"numeral": "^2.0.6",
"popper.js": "^1.14.6",
"select": "^1.1.2",
"tinycolor2": "^1.4.1",
"v-click-outside-x": "^3.7.1"
}
},
"node_modules/view-ui-plus/node_modules/deepmerge": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
"integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/vue": {
"version": "3.4.21",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz",
......@@ -11468,6 +12692,55 @@
}
}
},
"node_modules/vue-echarts": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-6.7.2.tgz",
"integrity": "sha512-SG8Vmszhx24KjtySsk361DogZLRkPCyLhgoyh7iN1eH3WGJ0kyl3k0g4QiSJqK0+F1Ej0HDopq4A5OGcBlAwzw==",
"hasInstallScript": true,
"dependencies": {
"resize-detector": "^0.3.0",
"vue-demi": "^0.13.11"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.5",
"@vue/runtime-core": "^3.0.0",
"echarts": "^5.4.1",
"vue": "^2.6.12 || ^3.1.1"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"@vue/runtime-core": {
"optional": true
}
}
},
"node_modules/vue-echarts/node_modules/vue-demi": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
"hasInstallScript": true,
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/vue-eslint-parser": {
"version": "8.3.0",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
......@@ -11692,6 +12965,17 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
"node_modules/vuex": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz",
"integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
"dependencies": {
"@vue/devtools-api": "^6.0.0-beta.11"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/watchpack": {
"version": "2.4.1",
"resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.1.tgz",
......@@ -12345,6 +13629,19 @@
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
"dev": true
},
"node_modules/zrender": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.5.0.tgz",
"integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==",
"dependencies": {
"tslib": "2.3.0"
}
},
"node_modules/zrender/node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
}
}
}
<template>
<nav>
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</nav>
<router-view/>
<router-view></router-view>
</template>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
nav {
padding: 30px;
}
nav a {
font-weight: bold;
color: #2c3e50;
}
nav a.router-link-exact-active {
color: #42b983;
}
</style>
<script>
</script>
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
<template>
<div id="arae" style="height: 100%;">
<div id="screen" style="height: 100%;"></div>
</div>
</template>
<script>
import RFB from '@novnc/novnc/core/rfb'
export default {
name: 'Novnc',
data () {
return {
url: '',
rfb: null
}
},
methods: {
getUrl (host) {
let protocol = ''
if (window.location.protocol === 'https:') {
protocol = 'wss://'
} else {
protocol = 'ws://'
}
// 加window.location.host可以走vue.config.js的代理,ws://localhost:8081/vnc/192.168.18.57:5900
const wsUrl = `${protocol}${window.location.host}/vnc/${host}`
console.log(wsUrl)
return wsUrl
},
// vnc连接断开的回调函数
disconnectedFromServer (msg) {
console.log('断开连接', msg)
// clean是boolean指示终止是否干净。在发生意外终止或错误时 clean将设置为 false。
if (msg.detail.clean) {
// 根据 断开信息的msg.detail.clean 来判断是否可以重新连接
} else {
// 这里做不可重新连接的一些操作
console.log('连接不可用(可能需要密码)')
}
this.rfb = null
this.connectVnc()
},
// 连接成功的回调函数
// connectedToServer(event) {
// },
// 连接vnc的函数
connectVnc () {
const PASSWORD = 'ywh940509'
const rfb = new RFB(document.getElementById('screen'), this.url, {
credentials: { password: PASSWORD }
})
rfb.addEventListener('connect', () => {
// var viewer = document.getElementsByTagName('canvas')[0];
console.info('我链接了')
// console.info(navigator.clipboard.readText())
// const a=async()=>{
// const m=await navigator.clipboard.readText()
// console.info(m)
// }
// a()
// document.getElementById('arae').addEventListener('paste', async function (e) {
// console.log(await navigator.clipboard.readText())
// rfb.clipboardPasteFrom(await navigator.clipboard.readText());
// });
// document.getElementById('arae').addEventListener('keyup', function (e) {
// console.log(navigator.clipboard.readText())
// e.keyCode == 86 && rfb.clipboardPasteFrom(navigator.clipboard.readText());
// });
})
rfb.addEventListener('disconnect', this.disconnectedFromServer)
// 复制粘贴
// var clipboard = document.getElementById('clipboard');
// rfb.addEventListener('clipboard', function (e) {
// clipboard.value = e.detail.text;
// });
// rfb.addEventListener('connect', function (e) {
// var viewer = document.getElementsByTagName('canvas')[0];
// document.body.addEventListener('paste', function (e) {
// rfb.clipboardPasteFrom(e.clipboardData.getData('text'));
// });
// });
// scaleViewport指示是否应在本地扩展远程会话以使其适合其容器。禁用时,如果远程会话小于其容器,则它将居中,或者根据clipViewport它是否更大来处理。默认情况下禁用。
rfb.scaleViewport = true
// 是一个boolean指示是否每当容器改变尺寸应被发送到调整远程会话的请求。默认情况下禁用
rfb.resizeSession = true
this.rfb = rfb
}
},
mounted () {
// console.log(this.$route)
this.url = this.getUrl('172.19.153.14')
this.connectVnc()
}
}
</script>
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import axios from 'axios';
import store from '@/store/index.js';
import OrganizationView from '@/views/systemview/OrganizationView.vue';
import Role from '@/views/systemview/Role.vue';
import Menu from '@/views/systemview/Menu.vue';
import UserList from '@/views/systemview/UserList.vue';
import VncShow from '@/views/VncShow.vue';
import EmailCenter from '@/views/systemview/EmailCenter';
import TestReport from '@/views/tool/TestReport';
import Echarts from "vue-echarts";
import 'echarts';
import ECharts from 'vue-echarts';
import ViewUIPlus from 'view-ui-plus';
createApp(App).use(router).mount('#app')
const app = createApp(App).use(store)
import 'view-ui-plus/dist/styles/viewuiplus.css'
axios.defaults.withCredentials = true
axios.defaults.baseURL = '/api'
// axios.defaults.baseURL = 0 ? 'http://172.22.25.173/api' : 'http://47.57.235.86:10001'
app.config.globalProperties.$http = axios
app.component('v-chart', Echarts)
const routers = [
{
path: 'vcnshow',
name: 'vncshow',
component: VncShow
}, {
path: 'organization',
name: 'organization',
component: OrganizationView
}, {
path: 'role',
name: 'role',
component: Role
}, {
path: 'menu',
name: 'menu',
component: Menu
}, {
path: 'userlist',
name: 'userlist',
component: UserList
}, {
path: 'report',
name: 'report',
component: TestReport
}, {
path: 'emialcenter',
name: 'emialcenter',
component: EmailCenter
}
]
axios.interceptors.request.use(function (config) {
if (store.getters.gettoken != "" && config.url != "user/login") config.headers['token'] = store.getters.gettoken
return config;
});
// axios.interceptors.response.use(function (response) {
// if (response.data.code != 41000) return response;
// this.$Message.error("登录已过期")
// store.commit("settoken", '');
// router.push('/login')
// })
router.beforeEach(async (to, from, next) => {
const a = (value) => {
for (let each of value) {
if (each.router) {
const index_ = routers.findIndex(ele => { return ele.name == each.router })
if (index_ != -1) { router.addRoute('home', { 'name': each.router, 'path': each.router, component: routers[index_].component }) }
}
if (each.children) {
a(each.children)
}
}
}
const findMenu = (menu, each) => {
for (let ele in menu) {
if (ele.router == each) return true
if (ele.children) return findMenu(ele.children, each)
}
}
if (to.path == '/login') return next();
if (localStorage.getItem('token')) {
let userinfo = localStorage.getItem("userinfo")
if (!userinfo) {
result = await axios[method]("user/userdetail", 'get')
userinfo = res.data.data
} else {
userinfo = JSON.parse(userinfo)
}
const menu = userinfo.menu
if (findMenu(menu, to.name) && !router.hasRoute(to.name)) {
a(menu)
console.info(router.getRoutes())
return next(to)
}
return next()
} else {
return next('/login')
}
})
function request(method, url, data, apply, successFun = () => { }, failFun = () => { }) {
axios[method](url, method != 'get' ? data : { params: data }).then(res => {
const data = JSON.parse(JSON.stringify(res.data))
if (method != "get" && apply) apply.$Message.success(data.message);
successFun(res.data)
}).catch(error => {
console.info(error)
try {
if (error.response.data.code == 401) {
apply.$Message.error(error.response.data.message);
router.push('login')
} else {
apply && apply.$Message.error(error.response.data.message);
failFun(error.response.data)
}
}
catch {
apply && apply.$Message.error("系统处理错误");
failFun()
}
})
}
function getElements(page_id, apply, fun) {
request('get', 'user/elements', { "id": page_id }, apply, fun)
}
app.config.globalProperties.$getElements = getElements
app.config.globalProperties.$request = request
app.config.globalProperties.elePro = function (menu_id) {
return null
}
app.config.globalProperties.$routers = routers
app.provide("$http", axios);
app.provide("$request", request);
app.provide("$getElements", getElements);
app.use(ViewUIPlus).use(router).mount('#app')
import { createRouter, createWebHashHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '@/views/HomeView.vue'
import Login from '@/views/Login.vue'
import UserInfo from '@/views/systemview/UserInfo.vue'
const routes = [
{ path: '/', redirect: '/home' },
{
path: '/',
name: 'home',
component: HomeView
path: '/:pathMatch(.*)*',
component: () => import('@/views/error/index.vue'),
hidden: true
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
name: 'home',
path: '/home',
component: HomeView,
children: [{
path: 'userinfo',
name: 'userinfo',
component: UserInfo,
},]
}, {
path: '/login',
name: '/login',
component: Login,
}
]
const router = createRouter({
history: createWebHashHistory(),
history: createWebHistory(),
routes
})
export default router
import { createStore } from 'vuex'
export default new createStore({
state: {
username: '',
token: '',
id: null,
router: '',
userinfo: ''
},
mutations: {
setusername(state, value) {
state.username = value
},
settoken(state, value) {
state.token = value
},
setid(state, value) {
state.id = value
},
setRouter(state, value) {
state.router = value
},
setUsreInfo(state, value) {
state.userinfo = value
}
},
getters: {
getUserInfo: state => {return state.userinfo},
gettoken(state) {
if (state.token == "" || state.token) {
state.token = localStorage.getItem('token')
}
return state.token
},
getId: state => state.id,
getRouter: state => {return state.router}
},
})
const render=(meun_id)=>{
return null
}
export default elePro
\ No newline at end of file
<style>
.layout {
border: 1px solid #d7dde4;
background: #f5f7f9;
position: relative;
border-radius: 4px;
overflow: hidden;
}
.layout-logo {
width: 100px;
height: 30px;
background: #5b6270;
border-radius: 3px;
float: left;
position: relative;
top: 15px;
left: 20px;
}
.layout-nav {
/* width: 200px; */
margin: 0 auto;
/* margin-right: 20px; */
/* text-align: left; */
display: flex;
}
</style>
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<div class="layout">
<Layout>
<Header style="box-shadow: 0 3px 3px rgba(0,0,0,.1);">
<Menu mode="horizontal" theme="dark" active-name="1">
<Row>
<Col :lg="12" span="6">
<Poptip trigger="hover" title="个人信息" placement="right-start">
<Space size="large">
<Avatar style="background: #7265e6">{{ userinfo.name && userinfo.name.substring(0, 1) }}
</Avatar>
</Space>
<template #content>
<List size="small" footer="Footer">
<ListItem>用户名:{{ userinfo.name }}</ListItem>
<ListItem>组:{{ userinfo.organization }}</ListItem>
<ListItem>角色:{{ userinfo.role_name }}</ListItem>
<ListItem>邮箱:{{ userinfo.email_address }}</ListItem>
<template #footer>
<Button type="primary"
@click="$router.push({ name: 'userinfo', query: { id: userinfo.id } })" size="small">修改信息</Button>
<Button type="primary"
@click="loginout" style="margin-left: 5px;" size="small">退出登录</Button>
</template>
</List>
</template>
</Poptip>
</Col>
<Col :lg="0" span="18">
<div class="layout-nav">
<MenuItem name="1" style="margin-right: auto;">
<Icon type="ios-navigate"></Icon>
</MenuItem>
<MenuItem name="2" style="margin-right: auto;">
<Icon type="ios-keypad"></Icon>
</MenuItem>
<MenuItem name="3" style="margin-right: auto;">
<Icon type="ios-analytics"></Icon>
</MenuItem>
<MenuItem name="4" style="margin-right: auto;">
<Icon type="ios-paper"></Icon>
</MenuItem>
</div>
</Col>
</Row>
</Menu>
</Header>
<Layout>
<Sider breakpoint="lg" collapsible :collapsed-width="0" v-model="isCollapsed" hide-trigger
:style="{ background: '#fff' }" style="box-shadow: 5px 0px 0px rgba(0,0,0,.1);z-index: 0;">
<Menu active-name="1-2" theme="light" width="auto" :open-names="['1']">
<Submenu v-for="each in menu" :key="each.id" :name="each.id">
<template #title>
<Icon :type="each.icon"></Icon>
{{ each.name }}
</template>
<MenuItem v-for="child in each.children" :key="child.id" :name="child.id"
:to="{ name: child.router }">
{{
child.name }}
</MenuItem>
</Submenu>
</Menu>
</Sider>
<Layout :style="{ padding: '0 5px 5px' }">
<Content :style="{ padding: '24px', background: '#fff', height: screenHeigh }"
style="overflow-y:auto">
<router-view :isCollapsed="isCollapsed"></router-view>
</Content>
</Layout>
</Layout>
</Layout>
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'HomeView',
components: {
HelloWorld
}
data() {
return {
isCollapsed: null,
screenHeigh: null,
myrouter: [],
menu: [],
userinfo: {}
};
},
computed: {
menuitemClasses: function () {
return [
'menu-item',
this.isCollapsed ? 'collapsed-menu' : ''
]
},
},
methods: {
getinfo() {
this.$request('get', 'user/userdetail', null, this, (data) => { this.menu = data.data.menu; this.userinfo = data.data; localStorage.setItem('userinfo', JSON.stringify(data.data)); })
},
loginout(){
this.$request('post','user/logout',null,this,(data)=>{
localStorage.removeItem('token'),
this.$router.push('login')
})
}
},
watch: {
isCollapsed(value1) {
this.screenHeigh = (!value1) ? window.innerHeight - 102 + 'px' : window.innerHeight - 72 + 'px'
},
menu(value) {
const a = (value) => {
for (let each of value) {
if (each.router) {
const index_ = this.$routers.findIndex(ele => { return ele.name == each.router })
if (index_ != -1) { this.$router.addRoute('home', { 'name': each.router, 'path': each.router, component: this.$routers[index_].component }) }
}
if (each.children) {
a(each.children)
}
}
}
a(value)
}
},
mounted() {
this.isCollapsed = window.innerWidth > 992 ? false : true
this.getinfo()
}
}
</script>
<template>
<div class="box" ref="vantaRef" style="width: 100%; height: 100vh">
<Row>
<Col span="24" :lg="{span:8,offset:8}">
<div class="card">
<div class="login">
<Login @on-submit="handleSubmit">
<UserName name="name" :value="User.name" />
<Password name="password" :value="User.password" />
<Submit />
</Login>
</div>
</div>
</Col>
</Row>
</div>
</template>
<script>
import * as THREE from 'three'//导入样式
import BIRDS from 'vanta/src/vanta.birds'//导入动态样式逻辑
export default {
data() {
return {
User: {
name: null,
password: null
}
}
},
methods: {
handleSubmit(valid, { name, password }) {
if (valid) {
this.$request("post", "user/login", { name, password }, this, (data) => {
this.$store.commit("setusername", data.data.name);
this.$store.commit("settoken", data.data.token);
this.$store.commit("setid", data.data.id);
localStorage.setItem("token", data.data.token);
localStorage.setItem("name", data.data.name);
localStorage.setItem("password", data.data.password);
this.$request('get', 'user/userdetail', null, this, (data) => {localStorage.setItem('userinfo',JSON.stringify(data.data));})
this.$router.push("/home");
})
}
}
},
mounted() {
this.vantaEffect = BIRDS({
el: this.$refs.vantaRef,
THREE: THREE
})
VANTA.BIRDS({
el: this.$refs.vantaRef,
mouseControls: true,
touchControls: true,
gyroControls: false,
minHeight: 200.0,
minWidth: 200.0,
scale: 1.0,
color1: 14381274,
color2: 16443110,
});
},
created() {
this.User.name = localStorage.getItem("name") || null;
this.User.password = localStorage.getItem("password") || null
}
}
</script>
<style>
.card{
height: 300px;
background: rgba(103, 176, 185, 0.7);
transform: translateY(90%);
-webkit-backdrop-filter: blur(5px);
backdrop-filter: blur(5px);
border-radius: 30px 5px 15px 5px;
text-align: center;
}
.login {
max-width: 400px;
margin: 0 auto !important;
transform: translateY(40%);
}
</style>
<template>
<div style="text-align: right;">
<Icon type="md-qr-scanner" color="#5cadff" size=30 @click="FullScreen" />
</div>
<div style="height: 100%;" id="Novnc">
<Novnc></Novnc>
</div>
</template>
<script>
import Novnc from '@/components/VncConnect.vue'
import { Icon } from 'view-ui-plus'
import screenfull from 'screenfull'
export default {
components: {
Novnc
},
data () {
return {
modal: false
}
},
methods: {
FullScreen () {
const element = document.getElementById('Novnc')
screenfull.request(element)
},
fullscreenElement () {
const fullscreenEle = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement
return fullscreenEle
}
}
}
</script>
<template>
<Exception type="404" />
</template>
<script>
export default {
}
</script>
\ No newline at end of file
<template>
<PageHeader :title="title">
<template #action>
<Button v-if="elements.indexOf('5-1') != -1" name="新增邮箱" type="primary"
@click="modlShow = true">新增邮箱</Button>
</template>
</PageHeader>
<div style="margin-top: 8px;">
<Table row-key="id" :columns="columns" :data="emails">
<template #name="{ row }">
<strong>{{ row.name }}</strong>
</template>
<template v-if="elements.indexOf('5-2') != -1" name="编辑列" #action="{ row }">
<Button type="primary" size="small" style="margin-right: 5px"
@click="addinfo = JSON.parse(JSON.stringify(row)); modlShow = true">编辑</Button>
<Button type="error" size="small" @click="delEmail(row.id)">删除</Button>
</template>
</Table>
</div>
<Space wrap>
<Modal :title="addinfo.id ? '编辑邮箱' : '添加邮箱'" v-model="modlShow" class-name="vertical-center-modal">
<Form ref="addForm" :model="addinfo" :rules="ruleValidate" :label-width="80">
<FormItem label="邮箱持有者" prop="name">
<Input v-model="addinfo.name" placeholder="请输入名字"></Input>
</FormItem>
<FormItem label="邮箱地址" prop="address">
<Input v-model="addinfo.address" placeholder="请输入邮箱地址"></Input>
</FormItem>
</Form>
<template #footer>
<Button @click="closeShow()">取消</Button>
<Button type="primary" @click="addinfo.id ? editEmail() : addEmail()">确认</Button>
</template>
</Modal>
</Space>
</template>
<script>
export default {
props: ['isCollapsed',],
data() {
return {
page_id: 20,
title: "邮箱中心",
modlShow: false,
addinfo: {
name: null,
address: null
},
emails: [],
ruleValidate: {
name: [
{ required: true, message: '持有者不能为空', trigger: 'blur' }
],
address: [
{ required: true, message: '邮箱地址不能为空', trigger: 'blur' },
{ type: 'email', message: '邮箱格式错误', trigger: 'blur' }
]
},
columns: [
{
title: '持有人',
key: 'name',
align: 'center'
}, {
title: '邮箱地址',
key: 'address',
align: 'center'
}
],
elements: []
}
},
methods: {
closeShow() {
this.addinfo = {
name: null,
address: null
},
this.modlShow = false;
},
async addEmail() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
this.$request("post", "/tool/testport/addemailuser", this.addinfo, this, () => { this.getEmail(); this.closeShow() })
},
getEmail() {
this.$request("get", "/tool/testport/emailuserlist", null, this, (data) => { this.emails = data.data })
},
async editEmail() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
this.$request("post", "/tool/testport/editemailuser", this.addinfo, this, () => { this.getEmail(); this.closeShow() })
},
delEmail(id_) {
this.$request("delete", "/tool/testport/deleteemailuser/" + id_, null, this, () => { this.getEmail(); })
},
},
watch: {
elements(value) {
if (value.indexOf('5-2') != -1 && this.columns.findIndex(each => { return each.title == '编辑' }) == -1) {
this.columns.push({
title: '编辑',
slot: 'action',
width: 200,
align: 'center'
})
} else {
const index = this.columns.findIndex(ele => { return ele.title == 'Action' })
index != -1 && this.columns.splice(index, 1)
}
}
},
created() {
this.$getElements(this.page_id, this, (data) => this.elements = data.data)
this.getEmail();
}
};
</script>
<style>
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
}
.vertical-center-modal .ivu-modal {
top: 0;
}
</style>
\ No newline at end of file
<template>
<PageHeader :title="title">
<template #action>
<Button v-if="elements.indexOf('2-1') != -1" name="添加顶级菜单" type="primary"
@click="modlShow = true">添加顶级菜单</Button>
</template>
</PageHeader>
<div style="margin-top: 8px;">
<Table highlight row-key="id" :columns="columns" :data="menuData">
<template #name="{ row }">
<strong>{{ row.name }}</strong>
</template>
<template #elements="{ row }">
<Tag v-for="item in row.elements" :key="item.id" :name="item.id" :checked="item.default_show"
color="primary" style="margin-right: 5px">
{{ item.name }}</Tag>
</template>
<template v-if="elements.indexOf('2-2') != -1" name="编辑列" #action="{ row }">
<Button v-if="elements.indexOf('2-3') != -1" name="新增子菜单" type="primary" size="small"
style="margin-right: 5px"
@click="changeinfo.parent_id = row.id; changeinfo.parent_name = row.name; modlShow = true">新增子菜单</Button>
<Button v-if="elements.indexOf('2-4') != -1" name="编辑" type="primary" size="small"
style="margin-right: 5px"
@click="changeinfo = JSON.parse(JSON.stringify(row)); changeinfo.type = 1; modlShow = true">编辑</Button>
<Button v-if="elements.indexOf('2-5') != -1" name="删除" type="error" size="small"
@click="delMenu(row.id)">删除</Button>
</template>
</Table>
</div>
<Space wrap>
<Modal :title="changeinfo.type ? '编辑菜单' : '新增菜单'" v-model="modlShow" class-name="vertical-center-modal"
@on-cancel="closeShow()">
<Form ref="addForm" :model="changeinfo" :rules="ruleValidate" :label-width="80">
<FormItem label="父菜单" prop="parent_name">
<Input v-model="changeinfo.parent_name" disabled></Input>
</FormItem>
<FormItem label="菜单名" prop="name">
<Input v-model="changeinfo.name" placeholder="请输入菜单名"></Input>
</FormItem>
<FormItem label="路由" prop="router">
<Input v-model="changeinfo.router" placeholder="请输入路由地址"></Input>
</FormItem>
<FormItem label="Icon" prop="icon">
<Input v-model="changeinfo.icon" placeholder="请输入菜单图标"></Input>
</FormItem>
<FormItem label="默认选中">
<Select v-model="changeinfo.default_show">
<Option :value="1"></Option>
<Option :value="0"></Option>
</Select>
</FormItem>
<FormItem label="子元素" prop="elements">
<div>
<Tag v-for="item, index in changeinfo.elements" :key="item.id" :name="item.id" closable
checkable :checked="item.default_show" @on-change="changeCheck" color="primary"
@on-close="changeinfo.elements.splice(index, 1)">
{{ item.name }}</Tag>
<Button icon="ios-add" type="dashed" size="small" @click="elemodlShow = true">添加元素</Button>
</div>
</FormItem>
</Form>
<template #footer>
<Button @click="closeShow()">取消</Button>
<Button type="primary" @click="changeinfo.type ? editMenu() : addMenu()">确认</Button>
</template>
</Modal>
<Modal title="添加元素" v-model="elemodlShow" class-name="vertical-center-modal" @on-cancel="closeEleShow()">
<Form ref="addForm2" :model="eleinfo" :rules="ruleValidate2" :label-width="80">
<FormItem label="菜单名" prop="parent_name">
<Input v-model="changeinfo.parent_name" disabled></Input>
</FormItem>
<FormItem label="元素名" prop="name">
<Input v-model="eleinfo.name" placeholder="请输入元素名"></Input>
</FormItem>
<FormItem label="默认选中">
<Select v-model="eleinfo.default_show">
<Option :value="1"></Option>
<Option :value="0"></Option>
</Select>
</FormItem>
<FormItem label="u_id" porp="u_id">
<Input v-model="eleinfo.u_id" placeholder="请输入uid"></Input>
</FormItem>
</Form>
<template #footer>
<Button @click="closeEleShow()">取消</Button>
<Button type="primary" @click="this.addEle()">确认</Button>
</template>
</Modal>
</Space>
</template>
<script>
export default {
props: ['isCollapsed'],
data() {
return {
page_id:15,
value: [],
title: "菜单管理",
modlShow: false,
elemodlShow: false,
eleinfo: {
name: null,
id: null,
u_id: null,
default_show: 0
},
changeinfo: {
parent_id: 0,
parent_name: null,
name: null,
default_show: 0,
elements: []
},
ruleValidate: {
name: [
{ required: true, message: '菜单名不能为空', trigger: 'blur' }
]
},
ruleValidate2: {
name: [
{ required: true, message: '元素名不能为空', trigger: 'blur' }
], u_id: [
{ required: true, message: 'uid不能为空', trigger: 'blur' }
],
},
elements: [],
columns: [
{
title: '菜单名',
key: 'name',
width: 200,
tree: true
}, {
title: '元素',
slot: 'elements',
align: 'center',
minWidth: 100,
}
],
editClo: {
title: '编辑',
slot: 'action',
width: 300,
align: 'center'
},
menuData: []
}
},
methods: {
closeShow() {
this.modlShow = false;
this.changeinfo = {
parent_id: 0,
parent_name: null,
name: null,
default_show: 0,
elements: []
}
},
changeCheck(chec, name) {
const index = this.changeinfo.elements.findIndex(x => { return x.id == name })
if (index == -1) return this.$Message.error("系统错误")
this.changeinfo.elements[index].default_show = chec ? 1 : 0
},
closeEleShow() {
this.eleinfo = {
name: null,
id: null,
u_id: null,
default_show: 0
},
this.elemodlShow = false
},
async addEle() {
var next_ = await this.$refs["addForm2"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
this.changeinfo.elements.push(this.eleinfo); this.closeEleShow()
},
async addMenu() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
console.info(this.changeinfo)
this.$request("post", "/identity/add_menu", this.changeinfo, this, () => {
this.getMenu();
this.closeShow()
})
},
async editMenu() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
console.info(this.changeinfo)
this.$request("post", "/identity/update_meun/" + this.changeinfo.id, this.changeinfo, this, () => {
this.getMenu();
this.closeShow()
})
},
getMenu() {
this.$request("get", "/identity/meun_list", null, this, (data) => { this.menuData = data.data })
},
delMenu(id_) {
this.$request("delete", "/identity/delete_meun/" + id_, null, this, () => {
this.getMenu();
})
},
},
watch: {
// 编辑权限2,删除权限3,操作栏4
elements(value) {
if (this.elements.indexOf("2-2") != -1 && !this.isCollapsed) {
if (this.columns.findIndex(each => { return each.title == this.editClo.title }) != -1) return
this.columns.push(this.editClo)
} else {
const index = this.columns.findIndex(ele => { return ele.title == '编辑' })
index != -1 && this.columns.splice(index, 1)
}
},
isCollapsed(value) {
if (this.elements.indexOf("2-2") != -1 && !value) {
if (this.columns.findIndex(each => { return each.title == this.editClo.title }) != -1) return
this.columns.push(this.editClo)
} else {
console.info(this.columns)
const index = this.columns.findIndex(ele => { return ele.title == '编辑' })
index != -1 && this.columns.splice(index, 1)
}
}
},
created() {
this.$router.hasRoute()
this.$getElements(this.page_id,this,(data)=>this.elements=data.data)
this.getMenu()
},
};
</script>
<style>
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
}
.vertical-center-modal .ivu-modal {
top: 0;
}
</style>
\ No newline at end of file
<template>
<PageHeader :title="title">
<template #action>
<Button v-if="elements.indexOf('1-1') != -1" name="添加顶级组织" type="primary" @click="modlShow = true">添加顶级组织</Button>
</template>
</PageHeader>
<div style="margin-top: 8px;">
<Table highlight border row-key="id" :columns="columns" :data="orgData">
<template #name="{ row }">
<strong>{{ row.name }}</strong>
</template>
<template v-if="elements.indexOf('1-2') != -1" name="编辑列" #action="{ row }">
<Button v-if="elements.indexOf('1-3') != -1" name="新增子组织" type="primary" size="small" style="margin-right: 5px"
@click="addinfo.parent_id = row.id; addinfo.parent_name = row.name; modlShow = true">新增子组织</Button>
<Button v-if="elements.indexOf('1-4') != -1" name="删除" type="error" size="small" @click="delOrg(row.id)">删除</Button>
</template>
</Table>
</div>
<Space wrap>
<Modal title="添加组织" v-model="modlShow" class-name="vertical-center-modal" @on-cancel="closeShow()" >
<Form ref="addForm" :model="addinfo" :rules="ruleValidate" :label-width="80">
<FormItem label="父组织" prop="parent_name">
<Input v-model="addinfo.parent_name" disabled></Input>
</FormItem>
<FormItem label="组织名" prop="name">
<Input v-model="addinfo.name" placeholder="请输入组织名"></Input>
</FormItem>
</Form>
<template #footer>
<Button @click="closeShow()">取消</Button>
<Button type="primary" @click="addOrg()">确认</Button>
</template>
</Modal>
</Space>
</template>
<script>
export default {
props: ['isCollapsed',],
data() {
return {
page_id:14,
title: "组织管理",
modlShow: false,
addinfo: {
parent_id: null,
parent_name: null,
name: null
},
ruleValidate: {
name: [
{ required: true, message: '组织名不能为空', trigger: 'blur' }
],
},
elements: [],
columns: [
{
title: '组织名',
key: 'name',
tree: true
}
],
orgData: [
]
}
},
methods: {
closeShow() {
this.modlShow = false;
this.addinfo = {
parent_id: 0,
parent_name: null,
name: null,
}
},
async addOrg() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
this.$request("post", "/identity/add_organization", this.addinfo, this, () => { this.getOrg(); this.closeShow() })
},
getOrg() {
this.$request("get","/identity/organization",null,this,(data)=>{this.orgData=data.data})
},
async delOrg(id_) {
this.$request("delete","/identity/delete_organization/" + id_,null,this,()=>{this.getOrg();})
},
},
watch: {
elements(value) {
console.info(value)
if (this.elements.indexOf("1-2") != -1) {
this.columns.push({
title: '编辑',
slot: 'action',
width: 200,
align: 'center'
})
} else {
const index = this.columns.findIndex(ele => { return ele.title == 'Action' })
index != -1 && this.columns.splice(index, 1)
}
}
},
created() {
this.$getElements(this.page_id,this,(data)=>this.elements=data.data)
this.getOrg()
}
};
</script>
<style>
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
}
.vertical-center-modal .ivu-modal {
top: 0;
}
</style>
\ No newline at end of file
<template>
<PageHeader :title="title">
<template #action>
<Button v-if="elements.indexOf('3-1') != -1" name="新增角色" type="primary"
@click="modlShow = true">新增角色</Button>
</template>
</PageHeader>
<div style="margin-top: 8px;">
<Row class="code-row-bg">
<Col :lg="10" span="24">
<Table row-key="id" :columns="columns" :data="allRole"
@on-cell-click="(row, column, data, event) => { column.key == 'name' && getRolePermissions(row.id) }">
<template #name="{ row }">
<strong>{{ row.name }}</strong>
</template>
<template v-if="elements.indexOf('3-2') != -1" name="编辑列" #action="{ row }">
<Button size="small" type="error" shape="circle" icon="md-trash" @click="delRole(row.id)"></Button>
</template>
</Table>
</Col>
<Col :lg="4" span="0">
</Col>
<Col :lg="10" span="0">
<Card v-if="choiceId" style="height: 600px;">
<Form >
<FormItem>
<Table :show-header="false" row-key="id" :columns="menu_columns"
@on-selection-change="(a) => { select_menu = a }" :data="choicePermissions">
<template #name="{ row }">
<strong>{{ row.name }}</strong>
</template>
<template #elements="{ row }">
<Tag v-for="item in row.elements" :key="item.id" :name="item.id"
:checked="item._checked" checkable
@on-change="(chec, name) => { elechoice(row, chec, name) }" color="primary"
style="margin-right: 5px">
{{ item.name }}</Tag>
</template>
</Table>
</FormItem>
<FormItem style="text-align: right;">
<Button type="primary" @click="updatePermissions(choiceId)">确认</Button>
</FormItem>
</Form>
</Card>
</Col>
</Row>
</div>
<Space wrap>
<Modal title="添加角色" v-model="modlShow" class-name="vertical-center-modal">
<Form ref="addForm" :model="addinfo" :rules="ruleValidate" :label-width="80">
<FormItem label="角色名" prop="name">
<Input v-model="addinfo.name" placeholder="请输入角色名"></Input>
</FormItem>
</Form>
<template #footer>
<Button @click="closeShow()">取消</Button>
<Button type="primary" @click="addRole()">确认</Button>
</template>
</Modal>
</Space>
</template>
<script>
export default {
props: ['isCollapsed',],
data() {
return {
page_id:16,
title: "角色管理",
modlShow: false,
addinfo: {
role_name: null
},
allRole: [],
choiceId: null,
choicePermissions: [],
select_menu: [],
select_element: [],
allPermissions: [],
ruleValidate: {
name: [
{ required: true, message: '角色名不能为空', trigger: 'blur' }
],
},
columns: [
{
title: '角色',
key: 'name',
align: 'center'
}
],
menu_columns: [
{
key: "_checked",
type: 'selection'
},
{
title: '菜单名',
key: 'name',
tree: true
}, {
title: '元素',
slot: 'elements',
align: 'center'
}
],
elements:[]
}
},
methods: {
closeShow() {
this.addinfo = {
role_name: null
},
this.modlShow = false;
},
elechoice(row, chec, name) {
const index = row.elements.findIndex(i => { return i.id == name })
const id = row.elements[index].id
const index2 = this.select_element.findIndex(i => { return i.id == id })
if (index2 == -1 && chec)
this.select_element.push({ type: 1, id })
if (index2 != -1 && !chec)
this.select_element.splice(index2, 1)
},
async addRole() {
var next_ = await this.$refs["addForm"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
this.$request("post", "/identity/add_role", this.addinfo, this, () => { this.getRole(); this.closeShow() })
},
getRole() {
this.$request("get", "/identity/role_list", null, this, (data) => { this.allRole = data.data })
},
async delRole(id_) {
this.$request("delete", "/identity/delete_role/" + id_, null, this, () => { this.getRole(); })
},
getMenu() {
this.$request("get", "/identity/meun_list", null, this, (data) => { this.allPermissions = data.data })
},
getRolePermissions(id_) {
if (this.elements.indexOf("3-3")==-1) return
this.$request("get", "/identity/get_permissions/" + id_, null, this, (data) => { a(data.data) })
this.select_element = []
const a = (Permissions) => {
const m = (elements) => {
elements.forEach(element => {
const index1 = Permissions.findIndex(e => { return (e.p_id == element.id && e.type == 0) })
element._checked = index1 == -1 ? false : true
index1 != -1 && this.select_menu.push({ type: 0, id: element.id })
if (element.elements) {
element.elements.forEach(each => {
const index2 = Permissions.findIndex(e => { return e.p_id == each.id && e.type == 1 })
each._checked = index2 == -1 ? false : true
index2 != -1 && this.select_element.push({ type: 1, id: each.id })
})
}
element.children && m(element.children)
})
}
this.choicePermissions = JSON.parse(JSON.stringify(this.allPermissions));
m(this.choicePermissions);
console.info(this.choicePermissions)
this.choiceId = id_
}
},
updatePermissions(id_) {
this.select_menu.forEach(ele => {
if (this.select_element.findIndex(i => { return i.id == ele.id && i.type == 0 }) == -1)
this.select_element.push({ type: 0, id: ele.id })
})
this.$request("post", "/identity/update_permissions/" + id_, this.select_element, this, () => { this.getRolePermissions(this.choiceId) })
}
},
watch: {
// choiceId(value) {
// value && this.getRolePermissions(value)
// }
// 编辑权限2,删除权限3,操作栏4
elements(value) {
if (value.indexOf('3-2') != -1 && this.columns.findIndex(each=>{return each.title=='编辑'})==-1) {
this.columns.push({
title: '编辑',
slot: 'action',
width: 200,
align: 'center'
})
} else {
const index = this.columns.findIndex(ele => { return ele.title == 'Action' })
index != -1 && this.columns.splice(index, 1)
}
}
},
created() {
this.$getElements(this.page_id,this,(data)=>this.elements=data.data)
this.getMenu();
this.getRole();
}
};
</script>
<style>
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
}
.vertical-center-modal .ivu-modal {
top: 0;
}
</style>
\ No newline at end of file
<template>
<PageHeader :title="title">
</PageHeader>
<Form ref="userValidate" :model="userinfo" :rules="userValidate" :label-width="80" style="margin-top: 20px;">
<FormItem label="用户名" prop="name">
<Input v-model="userinfo.name" placeholder="请输入用户名" style="max-width: 600px;"></Input>
</FormItem>
<!-- v-if="$route.query.id == $store.state.id && $route.query.id" -->
<FormItem v-if="elements.indexOf('4-3')==-1 && $route.query.id == $store.state.id && $route.query.id" label="原密码" prop="oldpassword">
<Input v-model="userinfo.oldpassword" placeholder="请确认原密码" type="password" password
style="max-width: 600px;"></Input>
</FormItem>
<FormItem label="密码" prop="password">
<Input v-model="userinfo.password" placeholder="请输入密码" type="password" password style="max-width: 600px;"></Input>
</FormItem>
<FormItem label="确认密码" prop="secondpassword">
<Input v-model="userinfo.secondpassword" placeholder="请再次输入密码" type="password" password
style="max-width: 600px;"></Input>
</FormItem>
<FormItem v-if="elements.indexOf('4-3')!=-1" name="组织更改" label="组织">
<Select filterable v-model="userinfo.organization_id" style="max-width: 300px;">
<Option v-for="item in organization" :value="item.id">{{ item.path }}</Option>
</Select>
</FormItem>
<FormItem v-if="elements.indexOf('4-3')!=-1" name="角色更改" label="角色" prop="role_id">
<Select filterable v-model="userinfo.role_id" style="max-width: 300px;">
<Option v-for="item in role" :value="item.id">{{ item.name }}</Option>
</Select>
</FormItem>
<FormItem label="jira账户" prop="jiar_account">
<Input v-model="userinfo.jira_account" placeholder="请输入jira账户" style="max-width: 600px;"></Input>
</FormItem>
<FormItem label="jira密码" prop="jira_password">
<Input v-model="userinfo.jira_password" placeholder="请输入jira账户密码" style="max-width: 600px;"
type="password" password ></Input>
</FormItem>
<FormItem label="email" prop="email">
<Input v-model="userinfo.email_address" placeholder="请输入邮箱地址" style="max-width: 600px;"></Input>
</FormItem>
<FormItem style="text-align: left;">
<Button type="primary" @click="submit">提交</Button>
<Button style="margin-left: 8px" @click="cancle">取消</Button>
</FormItem>
</Form>
</template>
<script>
export default {
data() {
const validatePass = (rule, value, callback) => {
if (value === '' && !this.$route.query.id) {
callback(new Error('请输入密码'));
} else {
// && this.$route.query.id == this.$store.state.id && this.$route.query.id
if (this.userinfo.oldpassword == '' && this.$route.query.id == this.$store.state.id && this.$route.query.id) {
this.$refs.userValidate.validateField('oldpassword')
}
if (this.userinfo.secondpassword !== '') {
this.$refs.userValidate.validateField('secondpassword');
}
callback();
}
};
const validatePassCheck = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else if (value !== this.userinfo.password) {
callback(new Error('两次密码不一致!'));
} else {
callback();
}
};
// && this.$route.query.id && this.$route.query.id == this.$store.state.id
const validateOldPassCheck = (rule, value, callback) => {
if (value === '' && this.userinfo.password && this.$route.query.id == this.$store.state.id && this.$route.query.id) {
callback(new Error('请输入旧密码'));
} else callback()
};
const validateJiraPassCheck = (rule, value, callback) => {
if (value === '' && this.userinfo.jiar_account) {
callback(new Error('请输入jira密码'));
} else callback()
};
return {
page_id:17,
elements:[],
userinfo: {
name: '',
password: '',
secondpassword: '',
oldpassword: '',
organization_id: null,
role_id: 0,
jiar_account: '',
jiar_password: '',
email_adress:''
},
userValidate: {
name: [
{ required: true, message: '用户名不能为空', trigger: 'blur' }
],
oldpassword: [
{ validator: validateOldPassCheck, trigger: 'blur' }
],
password: [
{ validator: validatePass, trigger: 'blur' ,required: this.$route.query.id ? false : true}
],
secondpassword: [
{ validator: validatePassCheck, trigger: 'blur' ,required: this.$route.query.id ? false : true}
],
role_id: [
{ required: true, message: '请选择角色', trigger: 'change',type:'number' }
],
email: [
{ type: 'email', message: '邮箱格式错误', trigger: 'blur' }
],
jiar_password: [
{ validator: validateJiraPassCheck, trigger: 'blur' }
]
},
role: [],
organization: [],
}
},
computed: {
title() {
return this.$route.query.id ? "编辑信息" : "新增用户"
}
},
methods: {
async submit(){
var next_ = await this.$refs["userValidate"].validate((valid) => {
if (!valid) {
this.$Message.error('请完善信息')
};
})
if (!next_) return
'id' in this.userinfo?this.updateUser():this.addUser()
},
cancle(){
setTimeout(() => {
this.$router.back()
}, 500);
},
getOrg() {
this.$request("get", "/identity/organization_list", null, this, (data) => { console.info(data), this.organization = data.data })
},
getRole() {
this.$request("get", "/identity/role_list", null, this, (data) => { this.role = data.data })
},
getUser(id) {
this.$request("get", "/user/getuser/"+id, null, this, (data) => { this.userinfo = data.data })
},
addUser() {
console.info(this.userinfo)
this.$request("post", "/user/adduser",this.userinfo, this,()=>{this.cancle()})
},
updateUser() {
this.$request("post", "/user/updateuser", this.userinfo, this,()=>{this.cancle()})
}
},
created() {
this.getOrg();
this.getRole();
this.$route.query.id && this.getUser(this.$route.query.id);
this.$getElements(this.page_id,this,(data)=>this.elements=data.data)
}
}
</script>
<template>
<PageHeader :title="title">
<template #action>
<Button v-if="elements.indexOf('4-1') != -1" name="添加用户" type="primary"
@click="$router.push('userinfo')">添加用户</Button>
</template>
<template #content>
<Space>
<Input v-model="searchinfo.name" placeholder="请输入用户名" style="width: 260px"
@on-contextmenu="(row) => { choice_id = row.id }" />
<Select v-model="searchinfo.organizations" multiple style="width:260px">
<Option v-for="item in organization" :value="item.id" :key="item.id">{{ item.path }}</Option>
</Select>
<Select v-model="searchinfo.roles" multiple style="width:260px">
<Option v-for="item in role" :value="item.id" :key="item.id">{{ item.name }}</Option>
</Select>
<Button type="primary" @click="getusers">搜索</Button>
</Space>
</template>
</PageHeader>
<div style="margin-top: 8px;">
<Table row-key="id" :columns="columns" :data="users" show-context-menu
@on-contextmenu="choiceRowMethod">
<template #date="{ row, index }">
<div>{{ row.create_date }}</div>
</template>
<template v-if="elements.indexOf('4-2') != -1" name="禁用" #action="{ row }">
<Switch :model-value="row.disable" @on-change="(status) => { changeDisable(row, status) }">
<template #open>
<span></span>
</template>
<template #close>
<span></span>
</template>
</Switch>
</template>
<template #contextMenu>
<DropdownItem @click="goEdit()">编辑</DropdownItem>
</template>
</Table>
<Page :total="totals" :page-size="searchinfo.page_size" :model-value="searchinfo.page_num" show-total
style="position: fixed;bottom: 10px;" />
</div>
</template>
<script>
export default {
props: ['isCollapsed',],
data() {
return {
page_id:17,
title: "用户管理",
choiceRow: null,
columns: [
{
title: '姓名',
key: 'name',
align: 'center'
}, {
title: '角色',
key: 'role_name',
align: 'center'
}, {
title: '组',
key: 'path',
align: 'center'
},
{
title: '创建时间',
slot: 'date',
align: 'center'
}
],
users: [
],
totals: 0,
organization: [],
role: [],
searchinfo: {
name: null,
roles: [],
organizations: [],
page_size: 10,
page_num: 1
},
choice_id: null,
elements: []
}
},
methods: {
choiceRowMethod(row){
if (this.elements.indexOf("4-3")==-1) return
this.choiceRow = row
},
goEdit(){
if (!this.choiceRow) return this.$Message.error("权限不足")
this.$router.push({ name: 'userinfo', query: { id: this.choiceRow.id } })
},
getusers() {
this.$request("get", '/user/user_list', this.searchinfo, this, (data) => { this.users = data.data.rows || []; this.totals = data.data.total || 0; console.info(this.users) })
},
changeDisable(row, status) {
this.$request("post", "/user/updateuser", { id: row.id, disable: status ? 1 : 0 }, this)
},
getOrg() {
this.$request("get", "/identity/organization_list", null, this, (data) => { this.organization = data.data})
},
getRole() {
this.$request("get", "/identity/role_list", null, this, (data) => { this.role = data.data ;console.info(this.role)})
},
jsonPath(target, key, key_value, get_value_key) {
const index = target.findindex(item => { item[key] == key_value })
if (index == -1) {
return null
} return target[index][get_value_key]
}
},
watch: {
elements(value) {
if (value.indexOf('4-2') != -1 && this.columns.findIndex(each => { return each.title == '禁用' }) == -1) {
this.columns.push({
title: '禁用',
slot: 'action',
align: 'center'
}
)
} else {
const index = this.columns.findIndex(ele => { return ele.title == 'Action' })
index != -1 && this.columns.splice(index, 1)
}
}
},
created() {
this.$getElements(this.page_id,this,(data)=>this.elements=data.data)
this.getOrg();
this.getRole();
this.getusers();
}
};
</script>
<style>
.vertical-center-modal {
display: flex;
align-items: center;
justify-content: center;
}
.vertical-center-modal .ivu-modal {
top: 0;
}
</style>
\ No newline at end of file
<template>
<PageHeader :title="title">
<template #action>
<div style="text-align: left;">
<Select v-model="ReC.project" style="width:200px" placeholder="项目" @on-change="getiterations">
<Option v-for="item in projects" :value="item.key" :key="item.key">{{
item.name }}</Option>
</Select>
<Select v-model="ReC.iteration" style="width:200px;margin-left: 10px;" placeholder="迭代"
@on-change="getReportInfo">
<Option v-for="item in iterations" :value="item.key" :key="item.key">{{ item.name }}</Option>
</Select>
<Button type="primary" @click="breforesend" style="width:100px;margin-left: 10px;">发送邮件</Button>
</div>
</template>
</PageHeader>
<Card v-if="report">
<template #extra>
<Icon v-if="!edit" type="md-create" @click="edit = !edit" size="20" color="#2b85e4" />
<Icon v-if="edit" type="md-checkmark-circle-outline" @click="edit = !edit" size="20" color="#2b85e4" />
</template>
<div style="margin-top: 8px;" id="reportBox">
<h2 style="text-align: center;">{{ info.project + "-" + info.sprint + "测试报告" }}</h2>
<h4 style="text-align: center;">{{ myname }}</h4>
<Button shape="circle" style="margin-top: 10px;margin-bottom: 10px;" type="primary">测试结论</Button>
<p>
&nbsp; &nbsp;
<Paragraph v-if="edit" v-model="testResult" editable />
<span v-if="!edit">{{ testResult }}</span>
</p>
<div style="background-color: #dcdee2;">
<P>
<span>用例总数:{{ mycase.length }};</span>
<span>用例密度:{{ story? (mycase.length/story).toFixed(2):0 }};</span>
<span>覆盖率:</span>
<span v-if="fugailu == 100" style="color: #19be6b;">{{ fugailu }}%</span>
<span v-else style="color: #ed4014;">{{ fugailu }}%</span>
</P>
<span v-for="item in story">
<span>{{ item.summary }}:{{ item.case.length }};&nbsp; &nbsp; </span>
</span>
<P>
<span>bug总数:{{ bug.length }};</span>
<span>未关闭bug数:</span>
<span v-if="bug.filter(ele => { return ele.statusId != getStatuSuccessId() }).length == 0"
style="color: #19be6b;">{{
bug.filter(ele => { return ele.statusId != getStatuSuccessId() }).length }}</span>
<span v-else style="color: #ed4014;">{{ bug.filter(ele => {
return ele.statusId != getStatuSuccessId()
}).length
}}</span>
</P>
</div>
<Button shape="circle" style="margin-top: 10px;margin-bottom: 10px;" type="primary">风险</Button>
<p>
&nbsp; &nbsp;
<Paragraph v-if="edit" v-model="fengxxian" editable />
<span v-if="!edit">{{ fengxxian }}</span>
</p>
<Button shape="circle" style="margin-top: 10px;margin-bottom: 10px;" type="primary">测试计划资源情况</Button>
<Table :columns="storycolumns" :data="story">
<template #summary="{ row, index }">
<a :href='"http://jira.galaxy-immi.com/browse/" + row.key'>
<u>{{ row.summary }}</u>
</a>
</template>
<template #chan="{ row, index }">
<p>
{{ filterPeopleString('chan', row.peoples) }}
</p>
</template>
<template #qian="{ row, index }">
<p>
{{ filterPeopleString('qian', row.peoples) }}
</p>
</template>
<template #hou="{ row, index }">
<p>
{{ filterPeopleString('hou', row.peoples) }}
</p>
</template>
<template #test="{ row, index }">
<p>
{{ filterPeopleString('test', row.peoples) }}
</p>
</template>
<template #start="{ row, index }">
<p v-if="!edit">
{{ row.start }}
</p>
<Paragraph v-else v-model="row.start" editable />
</template>
<template #end="{ row, index }">
<p v-if="!edit">
{{ row.end }}
</p>
<Paragraph v-else v-model="row.end" editable />
</template>
<template v-if="edit" #action="{ row, index }">
<Icon type="ios-remove-circle" style="color: crimson;" @click="this.story.splice(index, 1)"
size="15" />
</template>
</Table>
<Button shape="circle" style="margin-top: 10px;margin-bottom: 10px;" type="primary">测试用例</Button>
<div>
<div v-for="item in story">
<Button type="info" style="width: 100%;text-align: left;">
{{ item.summary }}
</Button>
<Table :columns="casecolumns" :data="item.case.map(ele => { return { key: ele } })">
<template #summary="{ row, index }">
<a v-if="searchCaseBykey(row.key)" :href='"http://jira.galaxy-immi.com/browse/" + row.key'>
<u>{{ searchCaseBykey(row.key).summary }}</u>
</a>
<p v-else style="color: #ed4014;">面板未找到相关用例,请联系jira人员配置</p>
</template>
<template #status="{ row, index }">
<p v-if="searchCaseBykey(row.key)">
{{ statusMap[searchCaseBykey(row.key).statusId] }}
</p>
</template>
<template v-if="edit" #action="{ row, index }">
<Icon type="ios-remove-circle" style="color: crimson;"
@click="item.case.splice(index, 1); rmcase(row.key)" size="15" />
</template>
</Table>
</div>
</div>
<!-- <Collapse simple v-model="cShow">
<Panel v-for="item in story" :name="item.key">
<template #content>
</template>
</Panel>
</Collapse> -->
<Button shape="circle" style="margin-top: 10px;margin-bottom: 10px;" type="primary">bug记录</Button>
<Table :columns="bugcolumns" :data="bug">
<template #summary="{ row, index }">
<a :href='"http://jira.galaxy-immi.com/browse/" + row.key'>
<u>{{ row.summary }}</u>
</a>
</template>
<template #create="{ row, index }">
<p>
{{ row.extraFields[1].html }}
</p>
</template>
<template #priority="{ row, index }">
<p>
{{ priorityMap[row.priorityId] }}
</p>
</template>
<template #status="{ row, index }">
<p>
{{ statusMap[row.statusId] }}
</p>
</template>
<template #people="{ row, index }">
<p>
{{ row.assigneeName }}
</p>
</template>
<template v-if="edit" #action="{ row, index }">
<Icon type="ios-remove-circle" style="color: crimson;" @click="this.bug.splice(index, 1)"
size="15" />
</template>
</Table>
</div>
<div id="biao" style="margin-top: 10px;">
<Row>
<Col :span="12">
<v-chart :option="bug_create_column" style="height: 300px"></v-chart></Col>
<Col justify="center" :span="12">
<v-chart :option="bug_p_column" style="height: 300px"></v-chart></Col>
</Row>
<Row>
<!-- <Col justify="center" :span="12">
<v-chart :option="case_s_column" style="height: 300px"></v-chart></Col> -->
<Col :span="12">
<v-chart :option="bug_user_column" style="height: 300px"></v-chart></Col>
</Row>
</div>
</Card>
<Space wrap>
<Modal title="选择收件人" v-model="modlShow" class-name="vertical-center-modal" @on-cancel="closeShow()">
<Select v-model="sendto" multiple style="width:260px">
<Option v-for="item in emailList" :value="item.address" :key="item.id">{{ item.name }}</Option>
</Select>
<template #footer>
<Button @click="closeShow()">取消</Button>
<Button type="primary" @click="send()">确认</Button>
</template>
</Modal>
</Space>
</template>
<script>
import html2canvas from "html2canvas";
export default {
props: ['isCollapsed'],
data() {
return {
modlShow: false,
sendto: [],
emailList: [],
bug_p_column: {
title: {
text: 'bug优先级占比',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: '50%',
data: [
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
},
mycase: [],
report: false,
case_s_column: {
title: {
text: '用例状态占比',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: '50%',
data: [
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
},
bug_create_column: {
title: {
text: 'bug产出趋势',
left: 'center'
},
xAxis: {
type: 'category',
data: []
},
yAxis: {
type: 'value'
},
series: [
{
data: [],
type: 'line'
}
]
},
bug_user_column: {
title: {
text: '开发bug分布',
left: 'center'
},
xAxis: {
axisLabel: { interval: 0, },
type: 'category',
data: []
},
yAxis: {
type: 'value'
},
series: [
{
data: [],
type: 'bar'
}
]
},
cShow: [],
p1option: [],
page_id: 17,
title: "测试报告",
edit: false,
projects: [],
iterations: [],
ReC: {
project: null,
iteration: null
},
testResult: '所有测试用例均已完成,所有bug均已修复,测试通过',
fengxxian: "无",
myname: null,
bug: [],
case: [],
people: [],
story: [],
storycolumns: [
{
title: '需求',
slot: 'summary'
},
{
title: '产品',
slot: 'chan'
},
{
title: '前端',
slot: 'qian'
},
{
title: '后端',
slot: 'hou'
},
{
title: '测试',
slot: 'test'
},
{
title: '开始时间',
slot: 'start'
},
{
title: '结束时间',
slot: 'end'
}
],
casecolumns: [
{
title: '用例名',
slot: 'summary'
},
{
title: '状态',
slot: 'status'
}
],
bugcolumns: [
{
title: 'BUG',
slot: 'summary'
},
{
title: '提出时间',
slot: 'create'
},
{
title: '优先级',
slot: 'priority'
},
{
title: '状态',
slot: 'status'
},
{
title: '修复人',
slot: 'people'
}
],
info: {
project: null,
sprint: null
},
statusMap: {},
priorityMap: {},
typeMap: {},
caseCount: 0,
fugailu: 0
}
},
methods: {
breforesend() {
if (!this.report) return this.$Message.error("请先完善报告信息")
this.getallEmail();
this.modlShow = true;
},
searchCaseBykey(key) {
const index = this.mycase.findIndex(ele => ele.key == key)
return index == -1 ? null : this.case[index]
},
rmcase(key) {
const index = this.mycase.findIndex(ele => ele.key == key)
index != -1 && this.mycase.splice(index, 1)
},
filterPeopleString(type, people) {
var result = ''
people.forEach(ele => {
if (this.people[type].indexOf(ele) != -1) { result = result + " " + ele }
})
return result
},
getprojects() {
this.$request('get', 'tool/testport/getproject', null, this, (data) => { this.projects = data.data; this.ReC.iteration = null })
},
getiterations(project) {
this.$request('get', 'tool/testport/iteration/' + project, null, this, (data) => { this.iterations = data.data })
}, getReportInfo() {
if (!this.ReC.iteration) return
this.$request('get', 'tool/testport/reportinfo', this.ReC, this, (data) => {
this.bug = data.data.bug
this.case = data.data.testcase
this.people = data.data.people
this.story = data.data.story
this.info.project = data.data.project
this.info.sprint = data.data.sprint
this.statusMap = data.data.statusMap
this.priorityMap = data.data.priorityMap
this.typeMap = data.data.typeMap
this.render()
})
},
getStatuSuccessId() {
for (var k in this.statusMap) {
if (this.statusMap[k] == '完成' || this.statusMap[k] == '已完成') return k
}
},
render() {
this.report = true
},
async send() {
if (!this.report) return
this.edit = false
const html = document.getElementById("reportBox").innerHTML
var stylestart = '<head><style type="text/css">'
var styleend = '</style></head>'
const cssBlock = document.styleSheets
for (var i of cssBlock) {
for (var j of i.rules) {
if (j.selectorText == ".ivu-table") {
stylestart = stylestart + ".ivu-table {width: inherit;max-width: 100%;overflow: hidden;color: rgb(81, 90, 110);font-size: 14px;background-color: rgb(255, 255, 255);box-sizing: border-box;}"
}
else { stylestart = stylestart + j.cssText }
}
}
const c = (stylestart + styleend + html).replace(/style="width(.*?)"/gm, 'style="width:100%"')
// const info = '<div style="display:flex"><div id="c1" style="width: 50%;height: 300px;"></div><div id="c2" style="width: 50%;height: 300px;"></div></div><div style="display:flex"><div id="c3" style="width: 50%;height: 300px;"></div><div id="c4" style="width: 50%;height: 300px;"></div></div>'
// const cjs1 = `var chartDom1 = document.getElementById('c1');var myChart1 = echarts.init(chartDom1);myChart1.setOption(${JSON.stringify(this.bug_create_column)});`
// const cjs2 = `var chartDom2 = document.getElementById('c2');var myChart2 = echarts.init(chartDom2);myChart2.setOption(${JSON.stringify(this.bug_p_column)});`
// const cjs3 = `var chartDom3 = document.getElementById('c3');var myChart3 = echarts.init(chartDom3);myChart3.setOption(${JSON.stringify(this.case_s_column)});`
// const cjs4 = `var chartDom4 = document.getElementById('c4');var myChart4 = echarts.init(chartDom4);myChart4.setOption(${JSON.stringify(this.bug_user_column)});`
// const result = c + info + '<' + 'script type="text/javascript" src="https://cdn.staticfile.org/echarts/5.5.0/echarts.min.js"></' + 'script>' + "<" + 'script type="text/javascript">' + cjs1 + cjs2 + cjs3 + cjs4 + "<" + "/script>"
var htmlDom = document.getElementById("biao")
html2canvas(htmlDom, {
useCORS: true,
width: window.screen.availWidth,
height: window.screen.availHeight,
windowwidth: document.body.scrollWidth,
windowHeight: document.body.scrollHeight,
x: 0,
y: window.pageYOffset
}).then((canvas) => {
const m = `<img src='${canvas.toDataURL("image/png")}'/>`
const result = c + m
const sub = this.info.project + "-" + this.info.sprint + "测试报告"
console.info(result)
this.$request("post", "/tool/testport/sendport", { to: this.sendto, subject: sub, contents: result }, this, () => { this.closeShow() })
});
},
getallEmail() {
this.$request("get", "/tool/testport/emailuserlist", null, this, (data) => { this.emailList = data.data })
},
closeShow() {
this.sendto = []
this.modlShow = false
}
},
watch: {
edit(value) {
const a = {
title: ' ',
slot: 'action'
}
if (value) {
this.storycolumns.push(a)
this.bugcolumns.push(a)
this.casecolumns.push(a)
} else {
const index1 = this.storycolumns.findIndex(ele => { return ele.slot == 'action' })
const index2 = this.bugcolumns.findIndex(ele => { return ele.slot == 'action' })
const index3 = this.casecolumns.findIndex(ele => { return ele.slot == 'action' })
index1 == -1 || this.storycolumns.splice(index1, 1)
index2 == -1 || this.bugcolumns.splice(index2, 1)
index3 == -1 || this.casecolumns.splice(index3, 1)
}
},
bug: {
handler(value) {
this.bug_p_column.series[0].data = []
this.bug_create_column.xAxis.data = []
this.bug_create_column.series[0].data = []
this.bug_user_column.xAxis.data = []
this.bug_user_column.series[0].data = []
if (value) {
var pinfo = {}
var dateinfo = {}
var bugUser = {}
value.forEach(ele => {
ele.priorityId in pinfo ? pinfo[ele.priorityId]++ : pinfo[ele.priorityId] = 1
// let date = ele.extraFields[1].html.split(' ')[0] || ''
let date= ele.extraFields[1].html?ele.extraFields[1].html.split(' ')[0]:0
date in dateinfo ? dateinfo[date]++ : dateinfo[date] = 1
ele.assigneeName in bugUser ? bugUser[ele.assigneeName]++ : bugUser[ele.assigneeName] = 1
})
for (var i in pinfo) {
this.bug_p_column.series[0].data.push({ value: pinfo[i], name: this.priorityMap[i] })
}
for (var i in dateinfo) {
this.bug_create_column.xAxis.data.push(i)
this.bug_create_column.series[0].data.push(dateinfo[i])
}
for (var i = 0; i < this.bug_create_column.xAxis.data.length; i++) {
for (var j = i + 1; j < this.bug_create_column.xAxis.data.length; j++) {
if (this.bug_create_column.xAxis.data[i] > this.bug_create_column.xAxis.data[j]) {
const a = this.bug_create_column.xAxis.data[i]
const b = this.bug_create_column.series[0].data[i]
this.bug_create_column.xAxis.data[i] = this.bug_create_column.xAxis.data[j]
this.bug_create_column.xAxis.data[j] = a
this.bug_create_column.series[0].data[i] = this.bug_create_column.series[0].data[j]
this.bug_create_column.series[0].data[j] = b
}
}
}
for (var i in bugUser) {
this.bug_user_column.xAxis.data.push(i)
this.bug_user_column.series[0].data.push(bugUser[i])
}
}
}, deep: true
},
story: {
handler(value) {
if (value) {
this.mycase = []
var a = 0
var b = 0
this.cShow = value.map(ele => { return ele.key });
value.forEach(ele => {
if (ele.case.length > 0) {
b += 1
};
a += 1
})
value.forEach(ele => {
ele.start = ele.extraFields[1].html?ele.extraFields[1].html.split(" ")[0]:''
ele.end = new Date().toLocaleDateString()
this.case.forEach(each => {
if (ele.case.indexOf(each.key) != -1) {
this.mycase.push(each)
}
})
})
this.fugailu = a ? ((b / a) * 100).toFixed(2) : 0
}
},
deep: true
},
mycase: {
handler(value) {
this.case_s_column.series[0].data = []
if (value) {
var info = {}
value.forEach(ele => {
ele.statusId in info ? info[ele.statusId]++ : info[ele.statusId] = 1
})
for (var i in info) {
this.case_s_column.series[0].data.push({ value: info[i], name: this.statusMap[i] })
}
}
},
deep: true
}
},
created() {
this.getprojects()
this.myname = JSON.parse(localStorage.getItem("userinfo")).name
},
mounted() {
}
};
</script>
<style>
.chart {
height: 100vh;
}
</style>
\ No newline at end of file
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
transpileDependencies: true,
lintOnSave: false,
runtimeCompiler: true,
configureWebpack: {
resolve: {
alias: {
'balm-ui-plus': 'balm-ui/dist/balm-ui-plus.js',
'balm-ui-css': 'balm-ui/dist/balm-ui.css'
}
}
},
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'/api': ''
}
}
}
}
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment