From 0b7089bb6c31faeeb5d12d76a917090708f1e13c Mon Sep 17 00:00:00 2001 From: kongfp <kongfp@qq.com> Date: Thu, 1 Jun 2023 13:53:06 +0800 Subject: [PATCH] init project --- package-lock.json | 203 ++++++++++++++++++++++++--- package.json | 6 +- public/index.html | 1 + public/server-config.js | 4 + src/App.vue | 8 +- src/assets/account-logo.png | Bin 0 -> 11762 bytes src/assets/login.svg | 127 +++++++++++++++++ src/components/HelloWorld.vue | 58 -------- src/components/Home.vue | 249 ++++++++++++++++++++++++++++++++++ src/components/Login.vue | 131 ++++++++++++++++++ src/components/MyPlayer.vue | 77 +++++++++++ src/components/Nav.vue | 65 +++++++++ src/main.js | 10 ++ src/router.js | 32 +++++ 14 files changed, 889 insertions(+), 82 deletions(-) create mode 100644 public/server-config.js create mode 100644 src/assets/account-logo.png create mode 100644 src/assets/login.svg delete mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/Home.vue create mode 100644 src/components/Login.vue create mode 100644 src/components/MyPlayer.vue create mode 100644 src/components/Nav.vue create mode 100644 src/router.js diff --git a/package-lock.json b/package-lock.json index ef9a229..167fbbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,8 +8,12 @@ "name": "tp_web", "version": "0.1.0", "dependencies": { + "axios": "^1.4.0", "core-js": "^3.8.3", - "vue": "^2.6.14" + "element-ui": "^2.15.13", + "vue": "^2.6.14", + "vue-dplayer": "^0.0.10", + "vue-router": "^3.0.1" }, "devDependencies": { "@babel/core": "^7.12.16", @@ -2161,9 +2165,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "node_modules/@types/mime": { @@ -2179,9 +2183,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.4", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.4.tgz", - "integrity": "sha512-ni5f8Xlf4PwnT/Z3f0HURc3ZSw8UyrqMqmM3L5ysa7VjHu8c3FOmIo1nKCcLrV/OAmtf3N4kFna/aJqxsfEtnA==", + "version": "20.2.3", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.2.3.tgz", + "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3295,6 +3299,19 @@ "lodash": "^4.17.14" } }, + "node_modules/async-validator": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", + "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", + "dependencies": { + "babel-runtime": "6.x" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", @@ -3327,6 +3344,21 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, "node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz", @@ -3408,12 +3440,38 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/balloon-css": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/balloon-css/-/balloon-css-1.2.0.tgz", + "integrity": "sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", @@ -3912,6 +3970,17 @@ "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==", + "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", @@ -4458,7 +4527,6 @@ "version": "1.5.2", "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz", "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4615,6 +4683,14 @@ "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==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", @@ -4756,6 +4832,26 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "node_modules/dplayer": { + "version": "1.27.1", + "resolved": "https://registry.npmjs.org/dplayer/-/dplayer-1.27.1.tgz", + "integrity": "sha512-2laBMXs5V1B9zPwJ7eAIw/OBo+Xjvy03i4GHTk3Cg+IWbrq8rKMFO0fFr6ClAYotYOCcFGOvaJDkOZcgKllsCA==", + "dependencies": { + "axios": "1.2.3", + "balloon-css": "^1.0.3", + "promise-polyfill": "8.3.0" + } + }, + "node_modules/dplayer/node_modules/axios": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.3.tgz", + "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz", @@ -4778,11 +4874,27 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.408", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.408.tgz", - "integrity": "sha512-vjeaj0u/UYnzA/CIdGXzzcxRLCqRwREYc9YfaWInjIEr7/XPttZ6ShpyqapchEy0S2r6LpLjDBTnNj7ZxnxJKg==", + "version": "1.4.407", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.407.tgz", + "integrity": "sha512-5smEvFSFYMv90tICOzRVP7Opp98DAC4KW7RRipg3BuNpGbbV3N+x24Zh3sbLb1T5haGtOSy/hrBfXsWnIM9aCg==", "dev": true }, + "node_modules/element-ui": { + "version": "2.15.13", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.13.tgz", + "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==", + "dependencies": { + "async-validator": "~1.8.1", + "babel-helper-vue-jsx-merge-props": "^2.0.0", + "deepmerge": "^1.2.0", + "normalize-wheel": "^1.0.1", + "resize-observer-polyfill": "^1.5.0", + "throttle-debounce": "^1.0.1" + }, + "peerDependencies": { + "vue": "^2.5.17" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -5784,7 +5896,6 @@ "version": "1.15.2", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, "engines": { "node": ">=4.0" }, @@ -5794,6 +5905,19 @@ } } }, + "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==", + "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", @@ -7155,7 +7279,6 @@ "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -7164,7 +7287,6 @@ "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -7471,6 +7593,11 @@ "node": ">=10" } }, + "node_modules/normalize-wheel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", + "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==" + }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -8543,6 +8670,11 @@ "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -8565,6 +8697,11 @@ "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==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz", @@ -8840,6 +8977,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz", @@ -9713,6 +9855,14 @@ "node": ">= 10.13.0" } }, + "node_modules/throttle-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", + "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==", + "engines": { + "node": ">=4" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", @@ -9951,6 +10101,15 @@ "csstype": "^3.1.0" } }, + "node_modules/vue-dplayer": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/vue-dplayer/-/vue-dplayer-0.0.10.tgz", + "integrity": "sha512-l6d6OnhEUO87lhAees9mEBUFsG5Thqv/VeEVZlSQ993/S0oxvWTDLjjkzH59hO2PALimBK2kB6yNYsHyJBgotw==", + "dependencies": { + "dplayer": "^1.22.2", + "vue-github-badge": "1.0.1" + } + }, "node_modules/vue-eslint-parser": { "version": "8.3.0", "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz", @@ -10050,6 +10209,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/vue-github-badge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-github-badge/-/vue-github-badge-1.0.1.tgz", + "integrity": "sha512-8X+FUWapnnDfs6cRUg3mCfHUf2r5arUfCSRdvbIn860oj9us3Rz3VOtioUgmfzh6EhaaYTs0Oh78EzJ+Z6uqAA==" + }, "node_modules/vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", @@ -10142,6 +10306,11 @@ "node": ">=8" } }, + "node_modules/vue-router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz", + "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==" + }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -10212,9 +10381,9 @@ "dev": true }, "node_modules/webpack": { - "version": "5.84.1", - "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.84.1.tgz", - "integrity": "sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==", + "version": "5.84.0", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.84.0.tgz", + "integrity": "sha512-XezNK3kwJq6IyeoZmZ1uEqQs+42nTqIi4jYM/YjLwaJedUC1N3bwnCC0+UcnHJPfqWX0kGrQnMIvZZyWYaIZrA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", diff --git a/package.json b/package.json index 28fe9a1..f330220 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,12 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "axios": "^1.4.0", "core-js": "^3.8.3", - "vue": "^2.6.14" + "element-ui": "^2.15.13", + "vue": "^2.6.14", + "vue-dplayer": "^0.0.10", + "vue-router": "^3.0.1" }, "devDependencies": { "@babel/core": "^7.12.16", diff --git a/public/index.html b/public/index.html index 3e5a139..3c47325 100644 --- a/public/index.html +++ b/public/index.html @@ -15,3 +15,4 @@ <!-- built files will be auto injected --> </body> </html> +<script src="<%= BASE_URL %>server-config.js"></script> diff --git a/public/server-config.js b/public/server-config.js new file mode 100644 index 0000000..9aeef19 --- /dev/null +++ b/public/server-config.js @@ -0,0 +1,4 @@ +window.serverConfig = { + // 后台服务器 + VUE_APP_HOST_URL: 'http://192.168.0.47:8000/api/', +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 55df315..ba26d0d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,17 +1,15 @@ <template> <div id="app"> - <img alt="Vue logo" src="./assets/logo.png"> - <HelloWorld msg="Welcome to Your Vue.js App"/> + <router-view></router-view> </div> </template> <script> -import HelloWorld from './components/HelloWorld.vue' + export default { name: 'App', components: { - HelloWorld } } </script> @@ -21,8 +19,6 @@ export default { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - text-align: center; color: #2c3e50; - margin-top: 60px; } </style> diff --git a/src/assets/account-logo.png b/src/assets/account-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..22cffd5994a639fb6174730163d9140ab79ac163 GIT binary patch literal 11762 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 literal 0 HcmV?d00001 diff --git a/src/assets/login.svg b/src/assets/login.svg new file mode 100644 index 0000000..2490aa7 --- /dev/null +++ b/src/assets/login.svg @@ -0,0 +1,127 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1361px" + height="609px" viewBox="0 0 1361 609" version="1.1"> + <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch --> + <title>Group 21</title> + <desc>Created with Sketch.</desc> + <defs/> + <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)"> + <g id="Group-21" transform="translate(77.000000, 73.000000)"> + <g id="Group-18" opacity="0.8" + transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)"> + <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" + rx="21.7830479" ry="21.766008"/> + <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" + rx="5.2173913" ry="5.21330997"/> + <path + d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" + id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"/> + <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" + stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"/> + <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" + stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" + stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/> + <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" + stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" + stroke-dasharray="1.405357899873153,2.108036953469981"/> + <g id="Group-17" + transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" + fill="#CFDAE6"> + <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" + ry="9.12768076"/> + <path + d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" + id="Oval-4" + transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "/> + </g> + </g> + <g id="Group-14" + transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)"> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" + rx="29.1176471" ry="29.1402439"/> + <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" + rx="21.5686275" ry="21.5853659"/> + <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" + rx="23.7254902" ry="23.7439024"/> + <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" + rx="10.7843137" ry="10.7926829"/> + <path + d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" + id="Oval-2" fill="#BACAD9"/> + <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" + fill="#E6A1A6"> + <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" + ry="6.47560976"/> + <path + d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" + id="Oval-2-Copy-2" + transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "/> + </g> + <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" + ry="1.61890244"/> + <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" + rx="1.61764706" ry="1.61890244"/> + <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" + rx="2.15686275" ry="2.15853659"/> + <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" + opacity="0.8"/> + </g> + <g id="Group-10" opacity="0.799999952" + transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)"> + <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" + rx="11.1864407" ry="11.2941176"/> + <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9"> + <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" + ry="8.55614973"/> + <path + d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" + id="Oval-7"/> + </g> + <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" + stroke-width="0.941176471"/> + <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" + cy="3.29411765" rx="3.26271186" ry="3.29411765"/> + <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" + ry="2.82352941"/> + <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" + stroke-width="0.941176471"/> + </g> + <g id="Group-19" opacity="0.33" + transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)"> + <g id="Group-17" + transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" + fill="#BACAD9"> + <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"/> + <path + d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" + id="Oval-4" + transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "/> + </g> + <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"/> + <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" + stroke-width="1.16666667"/> + <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" + stroke-width="1.16666667"/> + <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" + points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"/> + <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" + stroke-width="1.16666667" opacity="0.6"/> + <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" + stroke-width="1.16666667"/> + <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" + stroke-width="1.16666667"/> + <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"/> + <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"/> + <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" + r="8.75"/> + <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" + cy="30.3333333" r="5.83333333"/> + <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"/> + </g> + </g> + </g> + </g> + <div xmlns="" id="divScriptsUsed" style="display: none"/> + <script xmlns="" id="globalVarsDetection" + src="chrome-extension://cmkdbmfndkfgebldhnkbfhlneefdaaip/js/wrs_env.js"/> +</svg> diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index 879051a..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,58 +0,0 @@ -<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-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> diff --git a/src/components/Home.vue b/src/components/Home.vue new file mode 100644 index 0000000..8e577aa --- /dev/null +++ b/src/components/Home.vue @@ -0,0 +1,249 @@ +<template> + + <div class="hello"> + <Nav></Nav> + + <el-form :inline="true" :model="formInline" class="demo-form-inline"> + <el-form-item label="日期:"> + <el-input v-model="formInline.date" placeholder="日期"></el-input> + </el-form-item> + + <el-form-item label="警号:"> + <el-input v-model="formInline.policeId" placeholder="警号"></el-input> + </el-form-item> + <el-form-item label="事件:"> + <el-input v-model="formInline.event" placeholder="事件"></el-input> + + </el-form-item> + <el-form-item> + <el-button type="primary" @click="onSearch">查询</el-button> + </el-form-item> + </el-form> + + <el-table + :data="tableData" + stripe + style="width: 100%"> + <el-table-column + prop="record_time" + label="记录仪日期时间"> + </el-table-column> + <el-table-column + prop="police_id" + label="警号"> + </el-table-column> + <el-table-column + prop="event_type" + label="事件"> + <template v-slot="scope"> + <span> + {{ scope.row.event_type || '未定义事件' }} + </span> + </template> + </el-table-column> + + <el-table-column + prop="is_violation" + label="是否违规"> + <template v-slot="scope"> + <span v-if="scope.row.is_violation">是</span> + <span v-else>否</span> + </template> + </el-table-column> + + + <el-table-column + prop="small_image" + label="缩率图"> + + <template v-slot="scope"> + <el-image :preview-src-list="[scope.row.small_image]" + style="width: 80px; height: 80px" + :src="scope.row.small_image" + ></el-image> + + </template> + + </el-table-column> + + <el-table-column + prop="car_number" + label="车牌号"> + </el-table-column> + + <el-table-column show-overflow-tooltip label="视频"> + + <template v-slot="scope"> + + <el-button type="primary" @click="goto_video(scope.row)" icon="el-icon-video-play" + :disabled="scope.row.video_dir === '' || scope.row.video_dir === null" + > + + <span v-if="scope.row.video_dir">播放视频</span> + <span v-else>暂无视频</span> + </el-button> + </template> + + </el-table-column> + + + </el-table> + <el-pagination + class="tablePage" + @size-change="handleSizeChange" + @current-change="handleCurrentChange" + :current-page="currentPage" + :page-sizes="[10, 20, 30, 40]" + :page-size="pageSize" + layout="total, sizes, prev, pager, next" + :total="totalNumber"> + </el-pagination> + + </div> +</template> + +<script> +import Nav from "@/components/Nav.vue"; + +export default { + name: 'HelloWorld', + components: { + Nav + }, + props: { + msg: String + }, + + data() { + return { + currentPage: 1, + totalNumber: 0, + pageSize: 10, + isDisplay: true, + + formInline: { + date: '', + policeId: '', + event: '' + }, + + eventMap: { + 1: "抽烟", + 2: "汽车追尾", + 3: "打架", + 4: "闯红绿灯", + }, + + tableData: [ + { + record_time: '2016-05-02 20:20:20', + police_id: '王小虎', + event_type: '上海市普陀区金沙江路 1518 弄', + is_violation: true, + small_image: "", + video_dir: "http://static.smartisanos.cn/common/video/t1-ui.mp4", + car_number: "", + is_display: true, + relative_time: 0 + } + ] + } + }, + + methods: { + goto_video(rowData) { + let highlights = [ // 进度条时间点高亮 + { + text: rowData.event_type, + time: rowData.relative_time, + } + ]; + + this.$router.push({ + name: 'play_video', + params: {video_url: rowData.video_dir, highlights: highlights} + }); + }, + + onSearch() { + this.$axios({ + url: window.serverConfig.VUE_APP_HOST_URL, + method: 'get', + params: { + datetime: this.formInline.date || undefined, + police_id: this.formInline.policeId || undefined, + event_type: this.formInline.event || undefined, + page: this.currentPage || undefined, + page_size: this.pageSize || undefined + } + }).then(response => { + // console.log('请求成功'); + // console.log(response.data); + this.totalNumber = response.data.count; + if (!this.isDisplay) { + this.tableData = response.data.results.filter((data) => { + return data.is_display === true; + }); + } else { + this.tableData = response.data.results + } + + + }).catch(error => { + // console.log('请求失败'); + console.log(error); + }) + }, + + handleSizeChange(val) { + this.pageSize = val; + this.onSearch(); + }, + handleCurrentChange(val) { + this.currentPage = val; + this.onSearch(); + } + }, + mounted() { + this.onSearch(); + } + +} +</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 { +} + +a { + color: #42b983; +} + +.hello { + margin: 10px auto; + text-align: right; + overflow: hidden; +} + +.demo-form-inline { + display: flex; + justify-content: flex-end; + margin: 10px 10px; +} + +.tablePage { + display: flex; + justify-content: flex-end; + margin: 0 auto; +} +</style> diff --git a/src/components/Login.vue b/src/components/Login.vue new file mode 100644 index 0000000..2a8b558 --- /dev/null +++ b/src/components/Login.vue @@ -0,0 +1,131 @@ +<template> + <div class="view-account"> + + <div class="view-account-header"></div> + <div class="view-account-container"> + + <div class="view-account-top-logo"> + <img src="../assets/account-logo.png" alt=""> + <div>TP视频管理系统后台</div> + </div> + + + <div class="view-account-form"> + <el-form + ref="formRef" + label-placement="left" + size="large" + :model="formInline" + :rules="rules" + > + <el-form-item path="username"> + <el-input v-model="formInline.username" placeholder="请输入用户名"> + <template #prefix> + <span class="el-icon-user"></span> + </template> + </el-input> + </el-form-item> + <el-form-item path="password"> + <el-input + v-model="formInline.password" + type="password" + showPasswordOn="click" + placeholder="请输入密码" + > + <template #prefix> + <span class="el-icon-lock"></span> + </template> + </el-input> + </el-form-item> + + <el-form-item> + <el-button type="primary" @click="handleSubmit" class="loginButton">登录</el-button> + </el-form-item> + + </el-form> + </div> + </div> + </div> + + +</template> + +<script> +import {reactive} from 'vue'; + + +export default { + name: 'LoginPage', + data() { + return { + formInline: reactive({ + username: 'admin', + password: '123456', + isCaptcha: true, + }), + rules: { + username: {required: true, message: '请输入用户名', trigger: 'blur'}, + password: {required: true, message: '请输入密码', trigger: 'blur'}, + } + } + }, + methods: { + handleSubmit() { + this.$router.push({ + name: 'home', + }); + } + } +} + + +</script> + +<style scoped> +.view-account { + display: flex; + flex-direction: column; + height: 100vh; + overflow: auto; +} + +.view-account-header { + width: 100%; +} + + +.view-account-container { + flex: 1; + padding: 32px 12px; + width: 420px; + margin: 0 auto; +} + +.view-account-top-logo { + padding: 32px 0; + text-align: center; +} + +.loginButton { + min-width: 420px; + min-height: 40px; + padding: 0; +} + +img { + display: block; + max-width: 100%; + height: auto; +} + + +@media (min-width: 768px) { + .view-account { + background-image: url('../assets/login.svg'); + background-repeat: no-repeat; + background-position: 50%; + background-size: 100%; + } + +} +</style> diff --git a/src/components/MyPlayer.vue b/src/components/MyPlayer.vue new file mode 100644 index 0000000..91f6675 --- /dev/null +++ b/src/components/MyPlayer.vue @@ -0,0 +1,77 @@ +<template> + <div class='box'> + <Nav></Nav> + <div id="dplayer" ></div> + </div> +</template> + +<script> + +import Dplayer from 'dplayer'; +import Nav from "@/components/Nav.vue"; + +export default { + name: 'MyPlayer', + components: { + Nav + }, + data() { + return { + dp: {}, + VideoOptions: { + } + }; + }, + methods: {}, + mounted() { + let video_url = this.$route.params.video_url; + let highlight = this.$route.params.highlights; + let seek_time = 0 + if (typeof highlight != 'undefined') { + seek_time = highlight[0].time + } + + + this.dp = new Dplayer({ + container: document.getElementById('dplayer'), + video: { + url: video_url, + }, + theme: '#b7daff', // 风格颜色,例如播放条,音量条的颜色 + loop: false, // 是否自动循环 + lang: 'zh-cn', // 语言,'en', 'zh-cn', 'zh-tw' + screenshot: true, // 是否允许截图(按钮),点击可以自动将截图下载到本地 + hotkey: true, // 是否支持热键,调节音量,播放,暂停等 + preload: 'auto', // 自动预加载 + volume: 1, // 初始化音量 + autoplay: true, + highlight: highlight + }) + this.dp.seek(seek_time) + } +} + +</script> + + +<style scoped> +#dplayer { + width: 60%; + height: 60%; + margin: 10px auto; + +} + +.box { + width: 100%; + height: 80%; + margin: 10px auto; + text-align: right; + overflow: hidden; +} + +.nav a { + margin: 100px auto; + font: normal 20px/100px '微软雅黑'; +} +</style> \ No newline at end of file diff --git a/src/components/Nav.vue b/src/components/Nav.vue new file mode 100644 index 0000000..c66103a --- /dev/null +++ b/src/components/Nav.vue @@ -0,0 +1,65 @@ +<template> + <div class="nav"> + + <h1>TP视频管理系统</h1> + + <el-button type="primary" class="ChoiceButton"> + <router-link :to="routeInfo.name">{{ routeInfo.info }}</router-link> + </el-button> + + </div> +</template> + +<script> +export default { + name: "GlobNav", + data() { + return { + routeInfo: { + name: '/home', + info: '回到首页' + } + } + }, + + mounted() { + + let routeName = this.$route.name; + if (routeName === 'home') { + this.routeInfo.name = '/login' + this.routeInfo.info = '退出登录' + } + } +} +</script> + +<style scoped> +.nav { + margin: 0 auto; + height: 150px; + //background-color: rgba(0, 0, 0, 0.4); +} + +.nav a { + //margin: 30px 50px 0 50px; + font: normal 20px/20px '微软雅黑'; + text-align: center; + text-decoration: none; + color: white; +} + +.nav a:hover { + color: red; +} + +.ChoiceButton { + margin-right: 50px; +} + +h1 { + text-align: center; + margin: 0; + color: blue; + padding: 10px; +} +</style> \ No newline at end of file diff --git a/src/main.js b/src/main.js index 63eb05f..6df5b51 100644 --- a/src/main.js +++ b/src/main.js @@ -1,8 +1,18 @@ import Vue from 'vue' import App from './App.vue' +import router from "@/router"; + +import ElementUI from 'element-ui'; +import 'element-ui/lib/theme-chalk/index.css'; Vue.config.productionTip = false +Vue.use(ElementUI) + +// 配置axios,完成ajax请求 +import axios from 'axios' +Vue.prototype.$axios = axios; new Vue({ + router: router, render: h => h(App), }).$mount('#app') diff --git a/src/router.js b/src/router.js new file mode 100644 index 0000000..73826e7 --- /dev/null +++ b/src/router.js @@ -0,0 +1,32 @@ +// 路由管理 +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + + +export default new Router({ + mode: 'history', + base: process.env.BASE_URL, + routes: [ + { + path: '/', + redirect: '/home' + }, + { + path: '/home', + name: 'home', + component: () => import('./components/Home.vue') + }, + { + path: '/login', + name: 'login', + component: () => import('./components/Login.vue') + }, + { + path: '/play', + name: 'play_video', + component: () => import('./components/MyPlayer.vue') + } + ] +}) \ No newline at end of file