From 818bb9db81999aaa061abf887f8f54fcb2f22f38 Mon Sep 17 00:00:00 2001 From: Llloooggg Date: Sun, 11 Sep 2022 15:41:14 +0300 Subject: [PATCH] =?UTF-8?q?[frontend]:=20=D0=91=D0=B0=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/wheretogo/wheretogo/urls.py | 4 +- frontend/wheretogo/package-lock.json | 171 ++++++++++++++++-- frontend/wheretogo/package.json | 6 +- frontend/wheretogo/src/App.vue | 60 +++++- .../wheretogo/src/components/LoginPage.vue | 87 +++++++++ frontend/wheretogo/src/components/MapPage.vue | 12 ++ .../src/components/NavigationBar.vue | 54 ------ frontend/wheretogo/src/main.js | 15 +- frontend/wheretogo/src/router.js | 19 ++ .../wheretogo/src/services/auth-header.js | 8 + .../wheretogo/src/services/auth.service.js | 28 +++ .../wheretogo/src/services/user.service.js | 18 ++ frontend/wheretogo/src/store/auth.module.js | 59 ++++++ frontend/wheretogo/src/store/index.js | 8 + 14 files changed, 470 insertions(+), 79 deletions(-) create mode 100644 frontend/wheretogo/src/components/LoginPage.vue create mode 100644 frontend/wheretogo/src/components/MapPage.vue delete mode 100644 frontend/wheretogo/src/components/NavigationBar.vue create mode 100644 frontend/wheretogo/src/router.js create mode 100644 frontend/wheretogo/src/services/auth-header.js create mode 100644 frontend/wheretogo/src/services/auth.service.js create mode 100644 frontend/wheretogo/src/services/user.service.js create mode 100644 frontend/wheretogo/src/store/auth.module.js create mode 100644 frontend/wheretogo/src/store/index.js diff --git a/backend/wheretogo/wheretogo/urls.py b/backend/wheretogo/wheretogo/urls.py index b57a035..02ceb3c 100644 --- a/backend/wheretogo/wheretogo/urls.py +++ b/backend/wheretogo/wheretogo/urls.py @@ -19,6 +19,6 @@ from django.urls import include urlpatterns = [ path("admin/", admin.site.urls), - path("api/authentication", include("authentication.urls")), - path("api/facilities", include("facilities.urls")), + path("api/auth/", include("authentication.urls")), + path("api/facilities/", include("facilities.urls")), ] diff --git a/frontend/wheretogo/package-lock.json b/frontend/wheretogo/package-lock.json index 6c4cca8..983f452 100644 --- a/frontend/wheretogo/package-lock.json +++ b/frontend/wheretogo/package-lock.json @@ -11,7 +11,11 @@ "axios": "^0.27.2", "bootstrap": "^5.2.1", "core-js": "^3.8.3", - "vue": "^3.2.13" + "vee-validate": "^4.6.7", + "vue": "^3.2.13", + "vue-router": "^4.1.5", + "vuex": "^4.0.2", + "yup": "^0.32.11" }, "devDependencies": { "@babel/core": "^7.12.16", @@ -1665,7 +1669,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2182,6 +2185,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.185", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.185.tgz", + "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==" + }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -2880,6 +2888,11 @@ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true }, + "node_modules/@vue/devtools-api": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz", + "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==" + }, "node_modules/@vue/reactivity": { "version": "3.2.39", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.39.tgz", @@ -7176,8 +7189,12 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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.debounce": { "version": "4.0.8", @@ -7757,6 +7774,11 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -8995,6 +9017,11 @@ "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" } }, + "node_modules/property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -9207,8 +9234,7 @@ "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -10314,6 +10340,11 @@ "node": ">=0.6" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, "node_modules/totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -10517,6 +10548,17 @@ "node": ">= 0.8" } }, + "node_modules/vee-validate": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.6.7.tgz", + "integrity": "sha512-8W9cR/EGqPuHJpodYriAlp5BndQf/IWFifZLyIWeNs7RGB+B0jr50TACjzgtwtp5qE6hgRskOToEhcfhWJdgyw==", + "dependencies": { + "@vue/devtools-api": "^6.1.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue": { "version": "3.2.39", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.39.tgz", @@ -10720,6 +10762,20 @@ "node": ">=8" } }, + "node_modules/vue-router": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz", + "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==", + "dependencies": { + "@vue/devtools-api": "^6.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -10742,6 +10798,17 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "node_modules/vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.0.2" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -11470,6 +11537,23 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true + }, + "node_modules/yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } } }, "dependencies": { @@ -12605,7 +12689,6 @@ "version": "7.19.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -13040,6 +13123,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/lodash": { + "version": "4.14.185", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.185.tgz", + "integrity": "sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==" + }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -13605,6 +13693,11 @@ } } }, + "@vue/devtools-api": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.2.1.tgz", + "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==" + }, "@vue/reactivity": { "version": "3.2.39", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.39.tgz", @@ -16800,8 +16893,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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==" }, "lodash.debounce": { "version": "4.0.8", @@ -17252,6 +17349,11 @@ "thenify-all": "^1.0.0" } }, + "nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -18105,6 +18207,11 @@ "log-update": "^2.3.0" } }, + "property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -18264,8 +18371,7 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.15.0", @@ -19115,6 +19221,11 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", @@ -19263,6 +19374,14 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vee-validate": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.6.7.tgz", + "integrity": "sha512-8W9cR/EGqPuHJpodYriAlp5BndQf/IWFifZLyIWeNs7RGB+B0jr50TACjzgtwtp5qE6hgRskOToEhcfhWJdgyw==", + "requires": { + "@vue/devtools-api": "^6.1.4" + } + }, "vue": { "version": "3.2.39", "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.39.tgz", @@ -19413,6 +19532,14 @@ } } }, + "vue-router": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz", + "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==", + "requires": { + "@vue/devtools-api": "^6.1.4" + } + }, "vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -19437,6 +19564,14 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.11" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -19977,6 +20112,20 @@ "dev": true } } + }, + "yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "requires": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + } } } } diff --git a/frontend/wheretogo/package.json b/frontend/wheretogo/package.json index 68b1b46..f75aba0 100644 --- a/frontend/wheretogo/package.json +++ b/frontend/wheretogo/package.json @@ -11,7 +11,11 @@ "axios": "^0.27.2", "bootstrap": "^5.2.1", "core-js": "^3.8.3", - "vue": "^3.2.13" + "vee-validate": "^4.6.7", + "vue": "^3.2.13", + "vue-router": "^4.1.5", + "vuex": "^4.0.2", + "yup": "^0.32.11" }, "devDependencies": { "@babel/core": "^7.12.16", diff --git a/frontend/wheretogo/src/App.vue b/frontend/wheretogo/src/App.vue index b3b2949..43237c4 100644 --- a/frontend/wheretogo/src/App.vue +++ b/frontend/wheretogo/src/App.vue @@ -1,11 +1,69 @@ diff --git a/frontend/wheretogo/src/components/LoginPage.vue b/frontend/wheretogo/src/components/LoginPage.vue new file mode 100644 index 0000000..a131aef --- /dev/null +++ b/frontend/wheretogo/src/components/LoginPage.vue @@ -0,0 +1,87 @@ + + \ No newline at end of file diff --git a/frontend/wheretogo/src/components/MapPage.vue b/frontend/wheretogo/src/components/MapPage.vue new file mode 100644 index 0000000..fa003bc --- /dev/null +++ b/frontend/wheretogo/src/components/MapPage.vue @@ -0,0 +1,12 @@ + + diff --git a/frontend/wheretogo/src/components/NavigationBar.vue b/frontend/wheretogo/src/components/NavigationBar.vue deleted file mode 100644 index 3231cb7..0000000 --- a/frontend/wheretogo/src/components/NavigationBar.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - diff --git a/frontend/wheretogo/src/main.js b/frontend/wheretogo/src/main.js index 7be07d1..6fa740d 100644 --- a/frontend/wheretogo/src/main.js +++ b/frontend/wheretogo/src/main.js @@ -1,15 +1,10 @@ import { createApp } from "vue"; -import App from "./App.vue"; -import axios from "axios"; - +import App from "@/App.vue"; +import router from "./router"; +import store from "./store"; import "bootstrap/dist/css/bootstrap.min.css"; +import "bootstrap/dist/js/bootstrap.min.js"; -import NavigationBar from "./components/NavigationBar.vue"; - -const app = createApp(App); - -app.config.globalProperties.axios = axios; - -app.component("NavigationBar", NavigationBar); +const app = createApp(App).use(router).use(store); app.mount("#app"); diff --git a/frontend/wheretogo/src/router.js b/frontend/wheretogo/src/router.js new file mode 100644 index 0000000..b7373ab --- /dev/null +++ b/frontend/wheretogo/src/router.js @@ -0,0 +1,19 @@ +import { createWebHistory, createRouter } from "vue-router"; +import MapPage from "./components/MapPage.vue"; +import LoginPage from "./components/LoginPage.vue"; +const routes = [ + { + path: "/", + name: "map", + component: MapPage, + }, + { + path: "/login", + component: LoginPage, + }, +]; +const router = createRouter({ + history: createWebHistory(), + routes, +}); +export default router; \ No newline at end of file diff --git a/frontend/wheretogo/src/services/auth-header.js b/frontend/wheretogo/src/services/auth-header.js new file mode 100644 index 0000000..2aa49ae --- /dev/null +++ b/frontend/wheretogo/src/services/auth-header.js @@ -0,0 +1,8 @@ +export default function authHeader() { + let user = JSON.parse(localStorage.getItem('user')); + if (user && user.accessToken) { + return { Authorization: 'Bearer ' + user.accessToken }; + } else { + return {}; + } +} \ No newline at end of file diff --git a/frontend/wheretogo/src/services/auth.service.js b/frontend/wheretogo/src/services/auth.service.js new file mode 100644 index 0000000..5dbbe12 --- /dev/null +++ b/frontend/wheretogo/src/services/auth.service.js @@ -0,0 +1,28 @@ +import axios from "axios"; +const API_URL = "http://localhost:8000/api/auth/"; +class AuthService { + login(user) { + return axios + .post(API_URL + "token", { + username: user.username, + password: user.password, + }) + .then((response) => { + if (response.data.accessToken) { + localStorage.setItem("user", JSON.stringify(response.data)); + } + return response.data; + }); + } + logout() { + localStorage.removeItem("user"); + } + register(user) { + return axios.post(API_URL + "signup", { + username: user.username, + email: user.email, + password: user.password, + }); + } +} +export default new AuthService(); diff --git a/frontend/wheretogo/src/services/user.service.js b/frontend/wheretogo/src/services/user.service.js new file mode 100644 index 0000000..38ddf45 --- /dev/null +++ b/frontend/wheretogo/src/services/user.service.js @@ -0,0 +1,18 @@ +import axios from 'axios'; +import authHeader from './auth-header'; +const API_URL = 'http://localhost:8000/api/auth/user/'; +class UserService { + getPublicContent() { + return axios.get(API_URL + 'all'); + } + getUserBoard() { + return axios.get(API_URL + 'user', { headers: authHeader() }); + } + getModeratorBoard() { + return axios.get(API_URL + 'mod', { headers: authHeader() }); + } + getAdminBoard() { + return axios.get(API_URL + 'admin', { headers: authHeader() }); + } +} +export default new UserService(); \ No newline at end of file diff --git a/frontend/wheretogo/src/store/auth.module.js b/frontend/wheretogo/src/store/auth.module.js new file mode 100644 index 0000000..b2d15d6 --- /dev/null +++ b/frontend/wheretogo/src/store/auth.module.js @@ -0,0 +1,59 @@ +import AuthService from '../services/auth.service.js'; +const user = JSON.parse(localStorage.getItem('user')); +const initialState = user + ? { status: { loggedIn: true }, user } + : { status: { loggedIn: false }, user: null }; +export const auth = { + namespaced: true, + state: initialState, + actions: { + login({ commit }, user) { + return AuthService.login(user).then( + user => { + commit('loginSuccess', user); + return Promise.resolve(user); + }, + error => { + commit('loginFailure'); + return Promise.reject(error); + } + ); + }, + logout({ commit }) { + AuthService.logout(); + commit('logout'); + }, + register({ commit }, user) { + return AuthService.register(user).then( + response => { + commit('registerSuccess'); + return Promise.resolve(response.data); + }, + error => { + commit('registerFailure'); + return Promise.reject(error); + } + ); + } + }, + mutations: { + loginSuccess(state, user) { + state.status.loggedIn = true; + state.user = user; + }, + loginFailure(state) { + state.status.loggedIn = false; + state.user = null; + }, + logout(state) { + state.status.loggedIn = false; + state.user = null; + }, + registerSuccess(state) { + state.status.loggedIn = false; + }, + registerFailure(state) { + state.status.loggedIn = false; + } + } +}; \ No newline at end of file diff --git a/frontend/wheretogo/src/store/index.js b/frontend/wheretogo/src/store/index.js new file mode 100644 index 0000000..9455aff --- /dev/null +++ b/frontend/wheretogo/src/store/index.js @@ -0,0 +1,8 @@ +import { createStore } from "vuex"; +import { auth } from "./auth.module.js"; +const store = createStore({ + modules: { + auth, + }, +}); +export default store; \ No newline at end of file