Working on the front-end
This commit is contained in:
		
							parent
							
								
									bf64433e21
								
							
						
					
					
						commit
						50094eb3c8
					
				
							
								
								
									
										218
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										218
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -8,6 +8,7 @@ | |||||||
|       "name": "frontend", |       "name": "frontend", | ||||||
|       "version": "0.0.0", |       "version": "0.0.0", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  |         "element-plus": "^2.7.5", | ||||||
|         "vue": "^3.4.21" |         "vue": "^3.4.21" | ||||||
|       }, |       }, | ||||||
|       "devDependencies": { |       "devDependencies": { | ||||||
| @ -31,6 +32,22 @@ | |||||||
|         "node": ">=6.0.0" |         "node": ">=6.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@ctrl/tinycolor": { | ||||||
|  |       "version": "3.6.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", | ||||||
|  |       "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=10" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@element-plus/icons-vue": { | ||||||
|  |       "version": "2.3.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", | ||||||
|  |       "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "vue": "^3.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@esbuild/aix-ppc64": { |     "node_modules/@esbuild/aix-ppc64": { | ||||||
|       "version": "0.20.2", |       "version": "0.20.2", | ||||||
|       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", |       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", | ||||||
| @ -455,6 +472,28 @@ | |||||||
|         "node": "^12.22.0 || ^14.17.0 || >=16.0.0" |         "node": "^12.22.0 || ^14.17.0 || >=16.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@floating-ui/core": { | ||||||
|  |       "version": "1.6.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", | ||||||
|  |       "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@floating-ui/utils": "^0.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@floating-ui/dom": { | ||||||
|  |       "version": "1.6.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", | ||||||
|  |       "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@floating-ui/core": "^1.0.0", | ||||||
|  |         "@floating-ui/utils": "^0.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@floating-ui/utils": { | ||||||
|  |       "version": "0.2.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", | ||||||
|  |       "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" | ||||||
|  |     }, | ||||||
|     "node_modules/@humanwhocodes/config-array": { |     "node_modules/@humanwhocodes/config-array": { | ||||||
|       "version": "0.11.14", |       "version": "0.11.14", | ||||||
|       "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", |       "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", | ||||||
| @ -540,6 +579,16 @@ | |||||||
|         "url": "https://opencollective.com/unts" |         "url": "https://opencollective.com/unts" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@popperjs/core": { | ||||||
|  |       "name": "@sxzz/popperjs-es", | ||||||
|  |       "version": "2.11.7", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", | ||||||
|  |       "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", | ||||||
|  |       "funding": { | ||||||
|  |         "type": "opencollective", | ||||||
|  |         "url": "https://opencollective.com/popperjs" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@rollup/rollup-android-arm-eabi": { |     "node_modules/@rollup/rollup-android-arm-eabi": { | ||||||
|       "version": "4.18.0", |       "version": "4.18.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", |       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", | ||||||
| @ -760,6 +809,24 @@ | |||||||
|       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", |       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@types/lodash": { | ||||||
|  |       "version": "4.17.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", | ||||||
|  |       "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/@types/lodash-es": { | ||||||
|  |       "version": "4.17.12", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", | ||||||
|  |       "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@types/lodash": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@types/web-bluetooth": { | ||||||
|  |       "version": "0.0.16", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", | ||||||
|  |       "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" | ||||||
|  |     }, | ||||||
|     "node_modules/@ungap/structured-clone": { |     "node_modules/@ungap/structured-clone": { | ||||||
|       "version": "1.2.0", |       "version": "1.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", |       "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", | ||||||
| @ -883,6 +950,89 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", |       "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", | ||||||
|       "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" |       "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@vueuse/core": { | ||||||
|  |       "version": "9.13.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", | ||||||
|  |       "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@types/web-bluetooth": "^0.0.16", | ||||||
|  |         "@vueuse/metadata": "9.13.0", | ||||||
|  |         "@vueuse/shared": "9.13.0", | ||||||
|  |         "vue-demi": "*" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/antfu" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@vueuse/core/node_modules/vue-demi": { | ||||||
|  |       "version": "0.14.8", | ||||||
|  |       "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", | ||||||
|  |       "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", | ||||||
|  |       "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/@vueuse/metadata": { | ||||||
|  |       "version": "9.13.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", | ||||||
|  |       "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/antfu" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@vueuse/shared": { | ||||||
|  |       "version": "9.13.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", | ||||||
|  |       "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "vue-demi": "*" | ||||||
|  |       }, | ||||||
|  |       "funding": { | ||||||
|  |         "url": "https://github.com/sponsors/antfu" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@vueuse/shared/node_modules/vue-demi": { | ||||||
|  |       "version": "0.14.8", | ||||||
|  |       "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", | ||||||
|  |       "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", | ||||||
|  |       "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/acorn": { |     "node_modules/acorn": { | ||||||
|       "version": "8.11.3", |       "version": "8.11.3", | ||||||
|       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", |       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", | ||||||
| @ -950,6 +1100,11 @@ | |||||||
|       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", |       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/async-validator": { | ||||||
|  |       "version": "4.2.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", | ||||||
|  |       "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" | ||||||
|  |     }, | ||||||
|     "node_modules/balanced-match": { |     "node_modules/balanced-match": { | ||||||
|       "version": "1.0.2", |       "version": "1.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", |       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", | ||||||
| @ -1052,6 +1207,11 @@ | |||||||
|       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", |       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", | ||||||
|       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" |       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/dayjs": { | ||||||
|  |       "version": "1.11.11", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz", | ||||||
|  |       "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==" | ||||||
|  |     }, | ||||||
|     "node_modules/debug": { |     "node_modules/debug": { | ||||||
|       "version": "4.3.5", |       "version": "4.3.5", | ||||||
|       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", |       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", | ||||||
| @ -1087,6 +1247,31 @@ | |||||||
|         "node": ">=6.0.0" |         "node": ">=6.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/element-plus": { | ||||||
|  |       "version": "2.7.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.5.tgz", | ||||||
|  |       "integrity": "sha512-e4oqhfRGBpdblgsjEBK+tA2+fg1H1KZ2Qinty1SaJl0X49FrMLK0lpXQNheWyBqI4V/pyjVOF9sRjz2hfyoctw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@ctrl/tinycolor": "^3.4.1", | ||||||
|  |         "@element-plus/icons-vue": "^2.3.1", | ||||||
|  |         "@floating-ui/dom": "^1.0.1", | ||||||
|  |         "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", | ||||||
|  |         "@types/lodash": "^4.14.182", | ||||||
|  |         "@types/lodash-es": "^4.17.6", | ||||||
|  |         "@vueuse/core": "^9.1.0", | ||||||
|  |         "async-validator": "^4.2.5", | ||||||
|  |         "dayjs": "^1.11.3", | ||||||
|  |         "escape-html": "^1.0.3", | ||||||
|  |         "lodash": "^4.17.21", | ||||||
|  |         "lodash-es": "^4.17.21", | ||||||
|  |         "lodash-unified": "^1.0.2", | ||||||
|  |         "memoize-one": "^6.0.0", | ||||||
|  |         "normalize-wheel-es": "^1.2.0" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "vue": "^3.2.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/entities": { |     "node_modules/entities": { | ||||||
|       "version": "4.5.0", |       "version": "4.5.0", | ||||||
|       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", |       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", | ||||||
| @ -1136,6 +1321,11 @@ | |||||||
|         "@esbuild/win32-x64": "0.20.2" |         "@esbuild/win32-x64": "0.20.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/escape-html": { | ||||||
|  |       "version": "1.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", | ||||||
|  |       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" | ||||||
|  |     }, | ||||||
|     "node_modules/escape-string-regexp": { |     "node_modules/escape-string-regexp": { | ||||||
|       "version": "4.0.0", |       "version": "4.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", |       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", | ||||||
| @ -1680,8 +1870,22 @@ | |||||||
|     "node_modules/lodash": { |     "node_modules/lodash": { | ||||||
|       "version": "4.17.21", |       "version": "4.17.21", | ||||||
|       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", |       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", | ||||||
|       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", |       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" | ||||||
|       "dev": true |     }, | ||||||
|  |     "node_modules/lodash-es": { | ||||||
|  |       "version": "4.17.21", | ||||||
|  |       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", | ||||||
|  |       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/lodash-unified": { | ||||||
|  |       "version": "1.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", | ||||||
|  |       "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "@types/lodash-es": "*", | ||||||
|  |         "lodash": "*", | ||||||
|  |         "lodash-es": "*" | ||||||
|  |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/lodash.merge": { |     "node_modules/lodash.merge": { | ||||||
|       "version": "4.6.2", |       "version": "4.6.2", | ||||||
| @ -1697,6 +1901,11 @@ | |||||||
|         "@jridgewell/sourcemap-codec": "^1.4.15" |         "@jridgewell/sourcemap-codec": "^1.4.15" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/memoize-one": { | ||||||
|  |       "version": "6.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", | ||||||
|  |       "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" | ||||||
|  |     }, | ||||||
|     "node_modules/minimatch": { |     "node_modules/minimatch": { | ||||||
|       "version": "3.1.2", |       "version": "3.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", | ||||||
| @ -1738,6 +1947,11 @@ | |||||||
|       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", |       "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/normalize-wheel-es": { | ||||||
|  |       "version": "1.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", | ||||||
|  |       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" | ||||||
|  |     }, | ||||||
|     "node_modules/nth-check": { |     "node_modules/nth-check": { | ||||||
|       "version": "2.1.1", |       "version": "2.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", |       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ | |||||||
|     "format": "prettier --write src/" |     "format": "prettier --write src/" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "element-plus": "^2.7.5", | ||||||
|     "vue": "^3.4.21" |     "vue": "^3.4.21" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  | |||||||
| @ -1,15 +1,22 @@ | |||||||
| <script setup> | <script setup> | ||||||
|  | import CreateSecret from "./components/CreateSecret.vue"; | ||||||
| import HelloWorld from "./components/HelloWorld.vue"; | import HelloWorld from "./components/HelloWorld.vue"; | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <div> |   <div> | ||||||
|     <header> |     <HelloWorld msg="You did it!" @loggedin="loggedin = true" /> | ||||||
|       <div class="wrapper"> |     <CreateSecret v-if="loggedin" /> | ||||||
|         <HelloWorld msg="You did it!" /> |  | ||||||
|       </div> |  | ||||||
|     </header> |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       loggedin: false, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
| <style scoped></style> | <style scoped></style> | ||||||
|  | |||||||
| @ -60,27 +60,27 @@ | |||||||
| 
 | 
 | ||||||
| body { | body { | ||||||
|   min-height: 100vh; |   min-height: 100vh; | ||||||
|   color: var(--color-text); |   /* color: var(--color-text); | ||||||
|   background: var(--color-background); |   background: var(--color-background); | ||||||
|   transition: |   transition: | ||||||
|     color 0.5s, |     color 0.5s, | ||||||
|     background-color 0.5s; |     background-color 0.5s; */ | ||||||
|   line-height: 1.6; |   line-height: 1.6; | ||||||
|   font-family: |   font-family: | ||||||
|     Inter, |     /* Inter, | ||||||
|     -apple-system, |     -apple-system, | ||||||
|     BlinkMacSystemFont, |     BlinkMacSystemFont, */ | ||||||
|     'Segoe UI', |     'Segoe UI', | ||||||
|     Roboto, |     Roboto, | ||||||
|     Oxygen, |     /* Oxygen, | ||||||
|     Ubuntu, |     Ubuntu, | ||||||
|     Cantarell, |     Cantarell, | ||||||
|     'Fira Sans', |     'Fira Sans', | ||||||
|     'Droid Sans', |     'Droid Sans', | ||||||
|     'Helvetica Neue', |     'Helvetica Neue', */ | ||||||
|     sans-serif; |     sans-serif; | ||||||
|   font-size: 15px; |   font-size: 15px; | ||||||
|   text-rendering: optimizeLegibility; |   /* text-rendering: optimizeLegibility; | ||||||
|   -webkit-font-smoothing: antialiased; |   -webkit-font-smoothing: antialiased; | ||||||
|   -moz-osx-font-smoothing: grayscale; |   -moz-osx-font-smoothing: grayscale; */ | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										69
									
								
								frontend/src/components/CreateSecret.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								frontend/src/components/CreateSecret.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | <template> | ||||||
|  |   <div> | ||||||
|  |     <h3> | ||||||
|  |       {{ title }} | ||||||
|  |     </h3> | ||||||
|  |     <div id="container"> | ||||||
|  |       <el-form :model="form" label-width="auto"> | ||||||
|  |         <el-form-item label="Issuer"> | ||||||
|  |           <el-input v-model="form.issuer" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="Username"> | ||||||
|  |           <el-input v-model="form.username" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="Secret"> | ||||||
|  |           <el-input v-model="form.secret" /> | ||||||
|  |         </el-form-item> | ||||||
|  |         <el-form-item label="Notes"> | ||||||
|  |           <el-input v-model="form.notes" /> | ||||||
|  |         </el-form-item> | ||||||
|  |       </el-form> | ||||||
|  |       <el-button @click="createSecret" type="primary">Create secret</el-button> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       title: "Create Secret", | ||||||
|  |       apiBaseUrl: "http://localhost:8000", | ||||||
|  |       form: { | ||||||
|  |         issuer: "asdfasdf", | ||||||
|  |         username: "asdfasdf", | ||||||
|  |         secret: "asdfasdf", | ||||||
|  |         notes: "asdfasdf", | ||||||
|  |       }, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   methods: { | ||||||
|  |     async createSecret() { | ||||||
|  |       const url = `${this.apiBaseUrl}/secret`; | ||||||
|  |       const token = localStorage.getItem("token"); | ||||||
|  |       const requestOptions = { | ||||||
|  |         method: "POST", | ||||||
|  |         headers: { | ||||||
|  |           "Content-Type": "application/json", | ||||||
|  |           Authorization: `Bearer ${token}`, | ||||||
|  |         }, | ||||||
|  |         body: JSON.stringify({ data: btoa(JSON.stringify(this.form)) }), | ||||||
|  |       }; | ||||||
|  |       console.log(requestOptions); | ||||||
|  |       await fetch(url, requestOptions) | ||||||
|  |         .then((response) => response.json()) | ||||||
|  |         .then((data) => console.log(data)); | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  | h3 { | ||||||
|  |   margin-top: 1rem; | ||||||
|  |   font-weight: 700; | ||||||
|  |   font-size: 1.5rem; | ||||||
|  |   color: teal; | ||||||
|  | } | ||||||
|  | </style> | ||||||
| @ -2,43 +2,81 @@ | |||||||
| defineProps({ | defineProps({ | ||||||
|   msg: { |   msg: { | ||||||
|     type: String, |     type: String, | ||||||
|     required: true |     required: true, | ||||||
|   } |   }, | ||||||
| }) | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|   <div class="greetings"> |   <div> | ||||||
|     <h1 class="green">{{ msg }}</h1> |     <el-form :model="form" label-width="auto"> | ||||||
|     <h3> |       <el-form-item label="Username"> | ||||||
|       You’ve successfully created a project with |         <el-input v-model="form.username" /> | ||||||
|       <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> + |       </el-form-item> | ||||||
|       <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>. |       <el-form-item label="Password"> | ||||||
|     </h3> |         <el-input type="password" v-model="form.password" show-password /> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |     <el-button @click="register">Register</el-button> | ||||||
|  |     <el-button @click="login">Login</el-button> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <style scoped> | <script> | ||||||
| h1 { | export default { | ||||||
|   font-weight: 500; |   data() { | ||||||
|   font-size: 2.6rem; |     return { | ||||||
|   position: relative; |       message: "Hello world!", | ||||||
|   top: -10px; |       apiBaseUrl: "http://localhost:8000", | ||||||
| } |       form: { | ||||||
|  |         username: "gourav", | ||||||
|  |         password: "hello123", | ||||||
|  |       }, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
| 
 | 
 | ||||||
| h3 { |   methods: { | ||||||
|   font-size: 1.2rem; |     async login() { | ||||||
| } |       const url = `${this.apiBaseUrl}/login`; | ||||||
|  |       const requestOptions = { | ||||||
|  |         method: "POST", | ||||||
|  |         headers: { "Content-Type": "application/json" }, | ||||||
|  |         body: JSON.stringify(this.form), | ||||||
|  |       }; | ||||||
| 
 | 
 | ||||||
| .greetings h1, |       const response = await fetch(url, requestOptions) | ||||||
| .greetings h3 { |         .then((response) => response.json()) | ||||||
|   text-align: center; |         .then((data) => { | ||||||
|  |           console.log(data); | ||||||
|  |           return data; | ||||||
|  |         }) | ||||||
|  |         .catch((err) => { | ||||||
|  |           console.log(err); | ||||||
|  |           return false; | ||||||
|  |         }); | ||||||
|  |       console.log("response: ", response); | ||||||
|  |       if ("message" in response) { | ||||||
|  |         if (response.message === "authenticated") { | ||||||
|  |           const token = response.accessToken; | ||||||
|  |           localStorage.setItem("token", token); | ||||||
|  |           this.$emit("loggedin", true); | ||||||
|         } |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
| 
 | 
 | ||||||
| @media (min-width: 1024px) { |     async register() { | ||||||
|   .greetings h1, |       const url = `${this.apiBaseUrl}/register`; | ||||||
|   .greetings h3 { |       const requestOptions = { | ||||||
|     text-align: left; |         method: "POST", | ||||||
|   } |         headers: { "Content-Type": "application/json" }, | ||||||
| } |         body: JSON.stringify(this.form), | ||||||
| </style> |       }; | ||||||
|  | 
 | ||||||
|  |       await fetch(url, requestOptions) | ||||||
|  |         .then((response) => response.json()) | ||||||
|  |         .then((data) => console.log(data)); | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
|  | <style scoped></style> | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								frontend/src/components/ListSecrets.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								frontend/src/components/ListSecrets.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | <template> | ||||||
|  |   <div></div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       message: "Hello List Secret", | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  | }; | ||||||
|  | </script> | ||||||
| @ -3,4 +3,10 @@ import './assets/main.css' | |||||||
| import { createApp } from 'vue' | import { createApp } from 'vue' | ||||||
| import App from './App.vue' | import App from './App.vue' | ||||||
| 
 | 
 | ||||||
| createApp(App).mount('#app') | import ElementPlus from 'element-plus' | ||||||
|  | import 'element-plus/dist/index.css' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const app = createApp(App) | ||||||
|  | app.use(ElementPlus) | ||||||
|  | app.mount('#app') | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								main.py
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| import json | import json | ||||||
| 
 | 
 | ||||||
| from fastapi import Depends, FastAPI, HTTPException | from fastapi import Depends, FastAPI, HTTPException, status | ||||||
| from fastapi.encoders import jsonable_encoder | from fastapi.encoders import jsonable_encoder | ||||||
| from fastapi.middleware.cors import CORSMiddleware | from fastapi.middleware.cors import CORSMiddleware | ||||||
| from fastapi.security import OAuth2PasswordBearer | from fastapi.security import OAuth2PasswordBearer | ||||||
| @ -92,13 +92,19 @@ async def login(user: UserLogin): | |||||||
| 
 | 
 | ||||||
|     cur_user = [i for i in users if i['username']==user.username] |     cur_user = [i for i in users if i['username']==user.username] | ||||||
|     if not cur_user: |     if not cur_user: | ||||||
|         return {'message': "username or password is incorrect"} |         raise HTTPException( | ||||||
|  |             status_code=status.HTTP_400_BAD_REQUEST, | ||||||
|  |             detail="username or password is incorrect" | ||||||
|  |         ) | ||||||
|     else: |     else: | ||||||
|         cur_user = cur_user[0] |         cur_user = cur_user[0] | ||||||
| 
 | 
 | ||||||
|     password_match = Hasher.verify_password(user.password, cur_user['password']) |     password_match = Hasher.verify_password(user.password, cur_user['password']) | ||||||
|     if not password_match: |     if not password_match: | ||||||
|         return {'message': "username or password is incorrect"} |         raise HTTPException( | ||||||
|  |             status_code=status.HTTP_400_BAD_REQUEST, | ||||||
|  |             detail="username or password is incorrect" | ||||||
|  |         ) | ||||||
| 
 | 
 | ||||||
|     encrypted_encryption_key = cur_user['encryption_key'].encode() |     encrypted_encryption_key = cur_user['encryption_key'].encode() | ||||||
|     salt = deserialize_into_bytes(cur_user['salt']) |     salt = deserialize_into_bytes(cur_user['salt']) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user