From 9f818efc3d2731c299cdf45ae07174a6ad071409 Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Sat, 23 Oct 2021 23:29:33 +0300 Subject: [PATCH] login begin --- client/package.json | 2 + client/src/assets/logo.png | Bin 6849 -> 10280 bytes client/src/components/HelloWorld.vue | 31 +------------- client/src/router/index.ts | 6 +++ client/src/services/auth.service.ts | 35 +++++++++++++++ client/src/services/data.service.ts | 10 +++++ client/src/store/auth.module.ts | 62 +++++++++++++++++++++++++++ client/src/store/index.ts | 2 + client/src/types/user.ts | 5 +++ client/src/views/Login.vue | 27 ++++++++++++ client/tsconfig.json | 3 +- client/yarn.lock | 14 +++++- 12 files changed, 165 insertions(+), 32 deletions(-) create mode 100644 client/src/services/auth.service.ts create mode 100644 client/src/services/data.service.ts create mode 100644 client/src/store/auth.module.ts create mode 100644 client/src/types/user.ts create mode 100644 client/src/views/Login.vue diff --git a/client/package.json b/client/package.json index 981dbd0..0f73861 100644 --- a/client/package.json +++ b/client/package.json @@ -9,7 +9,9 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "axios": "^0.23.0", "vue": "^3.0.0", + "vue-class-component": "^8.0.0-0", "vue-router": "^4.0.0-0", "vuex": "^4.0.0-0" }, diff --git a/client/src/assets/logo.png b/client/src/assets/logo.png index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..cf44c2a1f41f558c03f3df3a64921dfbbda982ee 100644 GIT binary patch literal 10280 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 diff --git a/client/src/components/HelloWorld.vue b/client/src/components/HelloWorld.vue index 6dffac8..878d09f 100644 --- a/client/src/components/HelloWorld.vue +++ b/client/src/components/HelloWorld.vue @@ -1,35 +1,6 @@ diff --git a/client/src/router/index.ts b/client/src/router/index.ts index a6021e1..e8520ab 100644 --- a/client/src/router/index.ts +++ b/client/src/router/index.ts @@ -1,5 +1,6 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' import Home from '../views/Home.vue' +import Login from '../views/Login.vue' const routes: Array = [ { @@ -7,6 +8,11 @@ const routes: Array = [ name: 'Home', component: Home }, + { + path: '/', + name: 'Login', + component: Login + }, { path: '/about', name: 'About', diff --git a/client/src/services/auth.service.ts b/client/src/services/auth.service.ts new file mode 100644 index 0000000..0f347cf --- /dev/null +++ b/client/src/services/auth.service.ts @@ -0,0 +1,35 @@ +import { User } from "@/types/user"; + +import axios from 'axios'; + +const API_URL = 'http://localhost:8080/api/auth/'; + +class AuthService { + login(user: User) { + return axios + .post(API_URL + 'signin', { + username: user.username, + password: user.password + }) + .then((response: any) => { + if (response.data.accessToken) { + localStorage.setItem('user', JSON.stringify(response.data)); + } + return response.data; + }); + } + + logout() { + localStorage.removeItem('user'); + } + + register(user: User) { + return axios.post(API_URL + 'signup', { + username: user.username, + email: user.email, + password: user.password + }); + } +} + +export default new AuthService(); diff --git a/client/src/services/data.service.ts b/client/src/services/data.service.ts new file mode 100644 index 0000000..9835d9a --- /dev/null +++ b/client/src/services/data.service.ts @@ -0,0 +1,10 @@ +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/client/src/store/auth.module.ts b/client/src/store/auth.module.ts new file mode 100644 index 0000000..f67cae7 --- /dev/null +++ b/client/src/store/auth.module.ts @@ -0,0 +1,62 @@ +import AuthService from '@/services/auth.service'; +import { User } from '@/types/user'; + +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: 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; + } + } +}; diff --git a/client/src/store/index.ts b/client/src/store/index.ts index 5f05f19..9a32bbc 100644 --- a/client/src/store/index.ts +++ b/client/src/store/index.ts @@ -1,3 +1,4 @@ +import { auth } from "./auth.module"; import { createStore } from 'vuex' export default createStore({ @@ -8,5 +9,6 @@ export default createStore({ actions: { }, modules: { + auth } }) diff --git a/client/src/types/user.ts b/client/src/types/user.ts new file mode 100644 index 0000000..4f2aa2b --- /dev/null +++ b/client/src/types/user.ts @@ -0,0 +1,5 @@ +export class User { + public username?: String + public email?: String + public password?: String +} \ No newline at end of file diff --git a/client/src/views/Login.vue b/client/src/views/Login.vue new file mode 100644 index 0000000..13f8976 --- /dev/null +++ b/client/src/views/Login.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/client/tsconfig.json b/client/tsconfig.json index 87673b7..1c27e2e 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -2,10 +2,11 @@ "compilerOptions": { "target": "es5", "module": "esnext", - "strict": true, + "strict": false, "jsx": "preserve", "importHelpers": true, "moduleResolution": "node", + "experimentalDecorators": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, diff --git a/client/yarn.lock b/client/yarn.lock index bc80c0e..8303f44 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1564,6 +1564,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" + integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg== + dependencies: + follow-redirects "^1.14.4" + babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -3995,7 +4002,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.4: version "1.14.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== @@ -9350,6 +9357,11 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vue-class-component@^8.0.0-0: + version "8.0.0-rc.1" + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-8.0.0-rc.1.tgz#db692cd97656eb9a08206c03d0b7398cdb1d9420" + integrity sha512-w1nMzsT/UdbDAXKqhwTmSoyuJzUXKrxLE77PCFVuC6syr8acdFDAq116xgvZh9UCuV0h+rlCtxXolr3Hi3HyPQ== + vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.10.0: version "7.11.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf"