diff --git a/frontend/raw/index.html b/frontend/index.html similarity index 100% rename from frontend/raw/index.html rename to frontend/index.html diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5d8703f..0678506 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,8 +8,10 @@ "name": "metr", "version": "0.0.0", "dependencies": { + "axios": "^0.27.2", "vue": "^3.2.33", - "vue-router": "^4.0.14" + "vue-router": "^4.0.14", + "vuex": "^4.0.2" }, "devDependencies": { "@vitejs/plugin-vue": "^2.3.1", @@ -147,11 +149,44 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz", "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==" }, + "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/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "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/csstype": { "version": "2.6.20", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" }, + "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/esbuild": { "version": "0.14.39", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", @@ -512,6 +547,38 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -564,6 +631,25 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -736,6 +822,17 @@ "peerDependencies": { "vue": "^3.2.0" } + }, + "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" + } } }, "dependencies": { @@ -855,11 +952,38 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz", "integrity": "sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==" }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "csstype": { "version": "2.6.20", "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "esbuild": { "version": "0.14.39", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", @@ -1033,6 +1157,21 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "follow-redirects": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", + "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -1072,6 +1211,19 @@ "sourcemap-codec": "^1.4.8" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -1171,6 +1323,14 @@ "requires": { "@vue/devtools-api": "^6.0.0" } + }, + "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" + } } } } diff --git a/frontend/package.json b/frontend/package.json index e5153b9..b4da4ed 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,8 +7,10 @@ "preview": "vite preview --port 5050" }, "dependencies": { + "axios": "^0.27.2", "vue": "^3.2.33", - "vue-router": "^4.0.14" + "vue-router": "^4.0.14", + "vuex": "^4.0.2" }, "devDependencies": { "@vitejs/plugin-vue": "^2.3.1", diff --git a/frontend/raw/Catalog.html b/frontend/raw/Catalog.html index 5810b2a..c5fc7ad 100644 --- a/frontend/raw/Catalog.html +++ b/frontend/raw/Catalog.html @@ -7,7 +7,7 @@ - + Metr @@ -74,25 +74,25 @@

Квартира

- +

Купить

- +

Комнаты

- +

Цена

- +
diff --git a/frontend/raw/advertisment.html b/frontend/raw/advertisment.html index 65f4497..e77f4fb 100644 --- a/frontend/raw/advertisment.html +++ b/frontend/raw/advertisment.html @@ -7,7 +7,7 @@ - + Metr @@ -88,7 +88,7 @@
- +
diff --git a/frontend/raw/profile.html b/frontend/raw/profile.html index 17aa8b4..58a3079 100644 --- a/frontend/raw/profile.html +++ b/frontend/raw/profile.html @@ -7,7 +7,7 @@ - + Metr @@ -69,7 +69,7 @@

Виктория

@@ -77,11 +77,11 @@

4,5

- - - - - + + + + +
diff --git a/frontend/raw/assets/css/catalog.css b/frontend/src/assets/css/catalog.css similarity index 98% rename from frontend/raw/assets/css/catalog.css rename to frontend/src/assets/css/catalog.css index 28d8f21..2a435a2 100644 --- a/frontend/raw/assets/css/catalog.css +++ b/frontend/src/assets/css/catalog.css @@ -1,6 +1,6 @@ /* Fonts */ -@import url("../../fonts/StapelS/style.css"); +@import url("@/assets/fonts/StapelS/style.css"); body { margin: 0; @@ -66,7 +66,7 @@ h1, h2, h3, h4, h5, h6 { height: 96px; margin: 0 auto; - background: url("../images/metr.svg") center + background: url("@/assets/images/metr.svg") center no-repeat; background-size: cover; border-right: 2px solid white; @@ -189,7 +189,7 @@ h1, h2, h3, h4, h5, h6 { padding-top: 250px; background-image: linear-gradient(to top, rgb(124, 173, 201, 1), rgb(94, 196, 242, 0.3)), url( - "../images/intro.jpg"); + "@/assets/images/intro.jpg"); background-size: cover; } @@ -314,7 +314,7 @@ h1, h2, h3, h4, h5, h6 { height: 590px; border: 1px solid black; background-image: linear-gradient(to top, rgb(124, 173, 201, 0.6), rgb(94, 196, 242, 0.2)), url( - "../images/video.jpg"); + "@/assets/images/video.jpg"); background-size: cover; } diff --git a/frontend/raw/assets/css/advertisment.css b/frontend/src/assets/css/offer.css similarity index 97% rename from frontend/raw/assets/css/advertisment.css rename to frontend/src/assets/css/offer.css index d3fb620..b9ca953 100644 --- a/frontend/raw/assets/css/advertisment.css +++ b/frontend/src/assets/css/offer.css @@ -1,6 +1,6 @@ /* Fonts */ -@import url("../../fonts/StapelS/style.css"); +@import url("@/assets/fonts/StapelS/style.css"); body { margin: 0; @@ -66,7 +66,7 @@ h1, h2, h3, h4, h5, h6 { height: 96px; margin: 0 auto; - background: url("../images/metr.svg") center + background: url("../../../raw/assets/images/metr.svg") center no-repeat; background-size: cover; border-right: 2px solid white; @@ -189,7 +189,7 @@ h1, h2, h3, h4, h5, h6 { padding-top: 250px; background-image: linear-gradient(to top, rgb(124, 173, 201, 1), rgb(94, 196, 242, 0.6)), url( - "../images/intro.jpg"); + "../../../raw/assets/images/intro.jpg"); background-size: cover; } diff --git a/frontend/raw/assets/css/profile.css b/frontend/src/assets/css/profile.css similarity index 91% rename from frontend/raw/assets/css/profile.css rename to frontend/src/assets/css/profile.css index 88ee14e..4c563d3 100644 --- a/frontend/raw/assets/css/profile.css +++ b/frontend/src/assets/css/profile.css @@ -1,6 +1,6 @@ /* Fonts */ -@import url("../../fonts/StapelS/style.css"); +@import url("@/assets/fonts/StapelS/style.css"); body { margin: 0; @@ -66,7 +66,7 @@ h1, h2, h3, h4, h5, h6 { height: 96px; margin: 0 auto; - background: url("../images/metr.svg") center + background: url("@/assets/images/metr.svg") center no-repeat; background-size: cover; border-right: 2px solid white; @@ -189,7 +189,7 @@ h1, h2, h3, h4, h5, h6 { padding-top: 250px; background-image: linear-gradient(to top, rgb(124, 173, 201, 1), rgb(94, 196, 242, 0.6)), url( - "../images/intro.jpg"); + "@/assets/images/intro.jpg"); background-size: cover; } @@ -250,21 +250,6 @@ h1, h2, h3, h4, h5, h6 { color: white; font-size: 15px; font-weight: 600; + cursor: pointer; } -.about__user { - display: flex; - flex-direction: column; -} - -.about__images { - width: 105%; - display: flex; - flex-direction: row; - justify-content: space-between; - margin-top: 1%; -} - -.about_describtions { - margin-top: 5%; -} \ No newline at end of file diff --git a/frontend/src/assets/css/style.css b/frontend/src/assets/css/style.css index 8eaa5ca..bffd3ed 100644 --- a/frontend/src/assets/css/style.css +++ b/frontend/src/assets/css/style.css @@ -1,6 +1,6 @@ /* Fonts */ - @import url("../../fonts/StapelS/style.css"); + @import url("@/assets/fonts/StapelS/style.css"); body { margin: 0; diff --git a/frontend/raw/assets/images/arrow.png b/frontend/src/assets/images/arrow.png similarity index 100% rename from frontend/raw/assets/images/arrow.png rename to frontend/src/assets/images/arrow.png diff --git a/frontend/src/assets/images/forcomment.png b/frontend/src/assets/images/forcomment.png new file mode 100644 index 0000000..7b8d9cb Binary files /dev/null and b/frontend/src/assets/images/forcomment.png differ diff --git a/frontend/src/assets/images/heart.png b/frontend/src/assets/images/heart.png new file mode 100644 index 0000000..2bd0535 Binary files /dev/null and b/frontend/src/assets/images/heart.png differ diff --git a/frontend/src/assets/images/offer1.png b/frontend/src/assets/images/offer1.png new file mode 100644 index 0000000..f110a3c Binary files /dev/null and b/frontend/src/assets/images/offer1.png differ diff --git a/frontend/raw/assets/images/adv2.png b/frontend/src/assets/images/offer2.png similarity index 100% rename from frontend/raw/assets/images/adv2.png rename to frontend/src/assets/images/offer2.png diff --git a/frontend/src/assets/images/offer3.png b/frontend/src/assets/images/offer3.png new file mode 100644 index 0000000..592a0dc Binary files /dev/null and b/frontend/src/assets/images/offer3.png differ diff --git a/frontend/src/assets/images/offer4.png b/frontend/src/assets/images/offer4.png new file mode 100644 index 0000000..aaffe0d Binary files /dev/null and b/frontend/src/assets/images/offer4.png differ diff --git a/frontend/raw/assets/images/star.png b/frontend/src/assets/images/star.png similarity index 100% rename from frontend/raw/assets/images/star.png rename to frontend/src/assets/images/star.png diff --git a/frontend/src/assets/images/star1.png b/frontend/src/assets/images/star1.png new file mode 100644 index 0000000..e4d9cf4 Binary files /dev/null and b/frontend/src/assets/images/star1.png differ diff --git a/frontend/src/assets/images/starsmall.png b/frontend/src/assets/images/starsmall.png new file mode 100644 index 0000000..1cf2978 Binary files /dev/null and b/frontend/src/assets/images/starsmall.png differ diff --git a/frontend/raw/assets/images/userlogo.png b/frontend/src/assets/images/userlogo.png similarity index 100% rename from frontend/raw/assets/images/userlogo.png rename to frontend/src/assets/images/userlogo.png diff --git a/frontend/src/assets/images/userlogosmall.png b/frontend/src/assets/images/userlogosmall.png new file mode 100644 index 0000000..3db5cc2 Binary files /dev/null and b/frontend/src/assets/images/userlogosmall.png differ diff --git a/frontend/src/components/ProfileAbout.vue b/frontend/src/components/ProfileAbout.vue new file mode 100644 index 0000000..84b4ee0 --- /dev/null +++ b/frontend/src/components/ProfileAbout.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/ProfileAddOffer.vue b/frontend/src/components/ProfileAddOffer.vue new file mode 100644 index 0000000..a77e8b5 --- /dev/null +++ b/frontend/src/components/ProfileAddOffer.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/ProfileMyOffers.vue b/frontend/src/components/ProfileMyOffers.vue new file mode 100644 index 0000000..e1bf498 --- /dev/null +++ b/frontend/src/components/ProfileMyOffers.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js index c8e37b0..4667a10 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -1,9 +1,10 @@ -import { createApp } from 'vue' -import App from './App.vue' -import router from './router' +// Core +import { createApp } from 'vue'; +import router from './router'; +import store from './store'; -const app = createApp(App) +import App from './App.vue'; -app.use(router) +const app = createApp(App); -app.mount('#app') +app.use(router).use(store).mount('#app'); diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index fdc45a2..45d7855 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -1,6 +1,9 @@ import { createRouter, createWebHistory } from 'vue-router' import MainView from '@/views/MainView.vue' import AuthView from '@/views/AuthView.vue' +import CatalogView from "@/views/CatalogView.vue"; +import ProfileView from "@/views/ProfileView.vue"; +import OfferView from "@/views/OfferView.vue"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -15,6 +18,21 @@ const router = createRouter({ name: 'auth', component: AuthView }, + { + path: '/catalog', + name: 'catalog', + component: CatalogView + }, + { + path: '/profile', + name: 'profile', + component: ProfileView + }, + { + path: '/offer', + name: 'offer', + component: OfferView + }, ] }) diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js new file mode 100644 index 0000000..ce14510 --- /dev/null +++ b/frontend/src/services/api.js @@ -0,0 +1,6 @@ +import axios from 'axios'; + +export default axios.create({ + baseURL: 'http://tusur.tk:9080/api', + withCredentials: true, +}); diff --git a/frontend/src/services/auth.js b/frontend/src/services/auth.js new file mode 100644 index 0000000..510fb2c --- /dev/null +++ b/frontend/src/services/auth.js @@ -0,0 +1,27 @@ +import api from "@/services/api"; + +export const AuthService = { + async registration(email, password) { + const resp = await api.post('/auth/registration', { + email, + password, + }); + localStorage.setItem('auth', JSON.stringify(resp)); + return resp; + }, + async login(email, password) { + const resp = await api.post('/auth/login', { + email, + password, + }); + localStorage.setItem('auth', JSON.stringify(resp)); + return resp; + }, + async logout() { + await api.post('/auth/logout'); + localStorage.removeItem('auth'); + return true; + }, +}; + +export default AuthService; diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js new file mode 100644 index 0000000..a0a52fb --- /dev/null +++ b/frontend/src/store/index.js @@ -0,0 +1,8 @@ +import { createStore } from 'vuex'; +import auth from '@/store/modules/auth'; + +export default createStore({ + modules: { + auth, + }, +}); diff --git a/frontend/src/store/modules/auth.js b/frontend/src/store/modules/auth.js new file mode 100644 index 0000000..162aabb --- /dev/null +++ b/frontend/src/store/modules/auth.js @@ -0,0 +1,51 @@ +import authService from '@/services/auth'; + +const savedUser = JSON.parse(localStorage.getItem('auth')); + +export const state = { + user: savedUser?.data?.data ?? null, + token: savedUser?.data?.token ?? null, +}; + +export const actions = { + async login({ commit }, { email, password }) { + const { data: user } = await authService.login(email, password); + commit('SET_USER', user.data); + commit('SET_TOKEN', user.token); + }, + async logout({ commit }) { + await authService.logout(); + commit('SET_USER', null); + commit('SET_TOKEN', null); + }, +}; + +export const mutations = { + SET_USER(state, user) { + state.user = user; + }, + SET_TOKEN(state, token) { + state.token = token; + }, +}; + +export const getters = { + user(state) { + return state.user; + }, + username(state) { + return state.user && state.user.last_name && state.user.first_name + ? `${state.user.last_name} ${state.user.first_name}` + : null; + }, + userAuthenticated(state) { + return state.user !== null && state.token !== null; + }, +}; + +export default { + state, + actions, + mutations, + getters, +}; diff --git a/frontend/src/views/AuthView.vue b/frontend/src/views/AuthView.vue index e19a171..d58dc20 100644 --- a/frontend/src/views/AuthView.vue +++ b/frontend/src/views/AuthView.vue @@ -1,40 +1,65 @@ > diff --git a/frontend/src/views/CatalogView.vue b/frontend/src/views/CatalogView.vue new file mode 100644 index 0000000..d29a121 --- /dev/null +++ b/frontend/src/views/CatalogView.vue @@ -0,0 +1,140 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/views/MainView.vue b/frontend/src/views/MainView.vue index feb8cfa..46e9263 100644 --- a/frontend/src/views/MainView.vue +++ b/frontend/src/views/MainView.vue @@ -6,13 +6,16 @@
- каталог + + каталог +
+ @@ -27,9 +30,7 @@