diff options
-rw-r--r-- | package-lock.json | 15 | ||||
-rw-r--r-- | package.json | 1 | ||||
-rw-r--r-- | public/index.html | 2 | ||||
-rw-r--r-- | src/App.vue | 1 | ||||
-rw-r--r-- | src/main.js | 3 | ||||
-rw-r--r-- | src/services/AuthService.js | 34 | ||||
-rw-r--r-- | src/views/Home.vue | 2 | ||||
-rw-r--r-- | src/views/Login.vue | 25 | ||||
-rw-r--r-- | src/views/Register.vue | 27 |
9 files changed, 80 insertions, 30 deletions
diff --git a/package-lock.json b/package-lock.json index f977a93..e43eb2f 100644 --- a/package-lock.json +++ b/package-lock.json | |||
@@ -11,6 +11,7 @@ | |||
11 | "axios": "^0.24.0", | 11 | "axios": "^0.24.0", |
12 | "core-js": "^3.6.5", | 12 | "core-js": "^3.6.5", |
13 | "vue": "^2.6.11", | 13 | "vue": "^2.6.11", |
14 | "vue-notification": "^1.3.20", | ||
14 | "vue-router": "^3.2.0", | 15 | "vue-router": "^3.2.0", |
15 | "vuex": "^3.4.0", | 16 | "vuex": "^3.4.0", |
16 | "vuex-persistedstate": "^4.1.0" | 17 | "vuex-persistedstate": "^4.1.0" |
@@ -14033,6 +14034,14 @@ | |||
14033 | "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", | 14034 | "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", |
14034 | "dev": true | 14035 | "dev": true |
14035 | }, | 14036 | }, |
14037 | "node_modules/vue-notification": { | ||
14038 | "version": "1.3.20", | ||
14039 | "resolved": "https://registry.npmjs.org/vue-notification/-/vue-notification-1.3.20.tgz", | ||
14040 | "integrity": "sha512-vPj67Ah72p8xvtyVE8emfadqVWguOScAjt6OJDEUdcW5hW189NsqvfkOrctxHUUO9UYl9cTbIkzAEcPnHu+zBQ==", | ||
14041 | "peerDependencies": { | ||
14042 | "vue": "^2.0.0" | ||
14043 | } | ||
14044 | }, | ||
14036 | "node_modules/vue-router": { | 14045 | "node_modules/vue-router": { |
14037 | "version": "3.5.3", | 14046 | "version": "3.5.3", |
14038 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", | 14047 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", |
@@ -26477,6 +26486,12 @@ | |||
26477 | } | 26486 | } |
26478 | } | 26487 | } |
26479 | }, | 26488 | }, |
26489 | "vue-notification": { | ||
26490 | "version": "1.3.20", | ||
26491 | "resolved": "https://registry.npmjs.org/vue-notification/-/vue-notification-1.3.20.tgz", | ||
26492 | "integrity": "sha512-vPj67Ah72p8xvtyVE8emfadqVWguOScAjt6OJDEUdcW5hW189NsqvfkOrctxHUUO9UYl9cTbIkzAEcPnHu+zBQ==", | ||
26493 | "requires": {} | ||
26494 | }, | ||
26480 | "vue-router": { | 26495 | "vue-router": { |
26481 | "version": "3.5.3", | 26496 | "version": "3.5.3", |
26482 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", | 26497 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.3.tgz", |
diff --git a/package.json b/package.json index 5673ddf..670f685 100644 --- a/package.json +++ b/package.json | |||
@@ -12,6 +12,7 @@ | |||
12 | "axios": "^0.24.0", | 12 | "axios": "^0.24.0", |
13 | "core-js": "^3.6.5", | 13 | "core-js": "^3.6.5", |
14 | "vue": "^2.6.11", | 14 | "vue": "^2.6.11", |
15 | "vue-notification": "^1.3.20", | ||
15 | "vue-router": "^3.2.0", | 16 | "vue-router": "^3.2.0", |
16 | "vuex": "^3.4.0", | 17 | "vuex": "^3.4.0", |
17 | "vuex-persistedstate": "^4.1.0" | 18 | "vuex-persistedstate": "^4.1.0" |
diff --git a/public/index.html b/public/index.html index fb5db08..9ae317a 100644 --- a/public/index.html +++ b/public/index.html | |||
@@ -7,7 +7,7 @@ | |||
7 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> | 7 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
8 | <title><%= htmlWebpackPlugin.options.title %></title> | 8 | <title><%= htmlWebpackPlugin.options.title %></title> |
9 | </head> | 9 | </head> |
10 | <body style="background-color: #151515; color: #fafafa;"> | 10 | <body style="background-color: #101010; color: #fafafa;"> |
11 | <noscript> | 11 | <noscript> |
12 | <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> | 12 | <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
13 | </noscript> | 13 | </noscript> |
diff --git a/src/App.vue b/src/App.vue index 403eae2..9d9e5ef 100644 --- a/src/App.vue +++ b/src/App.vue | |||
@@ -1,6 +1,7 @@ | |||
1 | <template> | 1 | <template> |
2 | <div id="app"> | 2 | <div id="app"> |
3 | <router-view/> | 3 | <router-view/> |
4 | <notifications /> | ||
4 | </div> | 5 | </div> |
5 | </template> | 6 | </template> |
6 | 7 | ||
diff --git a/src/main.js b/src/main.js index c370aef..95d9800 100644 --- a/src/main.js +++ b/src/main.js | |||
@@ -3,11 +3,14 @@ import App from './App.vue' | |||
3 | import router from './router' | 3 | import router from './router' |
4 | import store from './store' | 4 | import store from './store' |
5 | import Axios from 'axios' | 5 | import Axios from 'axios' |
6 | import Notifications from 'vue-notification' | ||
6 | 7 | ||
7 | Vue.config.productionTip = false | 8 | Vue.config.productionTip = false |
8 | 9 | ||
9 | Axios.defaults.headers.common['Authorization'] = store.state.token !== "" && `Token ${store.state.token}`; | 10 | Axios.defaults.headers.common['Authorization'] = store.state.token !== "" && `Token ${store.state.token}`; |
10 | 11 | ||
12 | Vue.use(Notifications) | ||
13 | |||
11 | new Vue({ | 14 | new Vue({ |
12 | router, | 15 | router, |
13 | store, | 16 | store, |
diff --git a/src/services/AuthService.js b/src/services/AuthService.js index 626a8fb..402d196 100644 --- a/src/services/AuthService.js +++ b/src/services/AuthService.js | |||
@@ -1,17 +1,47 @@ | |||
1 | import axios from "axios"; | 1 | import axios from "axios"; |
2 | import Vue from 'vue' | ||
2 | 3 | ||
3 | const url = 'http://localhost:8000/api/auth/' | 4 | const url = 'http://localhost:8000/api/auth/' |
4 | 5 | ||
6 | const error_notify = (error) => { | ||
7 | for (const [key, values] of Object.entries(error.response.data)) { | ||
8 | values.forEach(value => { | ||
9 | Vue.notify({ | ||
10 | type: 'error', | ||
11 | title: value, | ||
12 | text: key | ||
13 | }) | ||
14 | }) | ||
15 | } | ||
16 | return { | ||
17 | data: error.response.data, | ||
18 | status: error.response.status | ||
19 | } | ||
20 | } | ||
21 | |||
5 | export default { | 22 | export default { |
6 | async login(data) { | 23 | async login(data) { |
7 | return await axios | 24 | return await axios |
8 | .post(url+'login/', data) | 25 | .post(url+'login/', data) |
9 | .then(res => res.data) | 26 | .then(res => { |
27 | return { | ||
28 | data: res.data, | ||
29 | status: res.status | ||
30 | } | ||
31 | }) | ||
32 | .catch(error => error_notify(error)) | ||
10 | }, | 33 | }, |
11 | 34 | ||
12 | async register(data) { | 35 | async register(data) { |
13 | return await axios | 36 | return await axios |
14 | .post(url+'register/', data) | 37 | .post(url+'register/', data) |
15 | .then(res => res.data) | 38 | .then(res => { |
39 | return { | ||
40 | data: res.data, | ||
41 | status: res.status | ||
42 | } | ||
43 | }) | ||
44 | .catch(error => error_notify(error)) | ||
45 | |||
16 | } | 46 | } |
17 | } \ No newline at end of file | 47 | } \ No newline at end of file |
diff --git a/src/views/Home.vue b/src/views/Home.vue index e5b446b..5a2a903 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue | |||
@@ -16,7 +16,7 @@ export default { | |||
16 | 16 | ||
17 | computed: { | 17 | computed: { |
18 | get_username() { | 18 | get_username() { |
19 | return this.$store.getters.get_user.username | 19 | return this.$store.getters['get_user'].username |
20 | } | 20 | } |
21 | }, | 21 | }, |
22 | 22 | ||
diff --git a/src/views/Login.vue b/src/views/Login.vue index ae43ecd..cb5c8d8 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue | |||
@@ -6,9 +6,8 @@ | |||
6 | 6 | ||
7 | <input type="submit" value="Login!"> | 7 | <input type="submit" value="Login!"> |
8 | </form> | 8 | </form> |
9 | <p v-for="(mess, key) in messages" :key="key">{{mess}}</p> | ||
10 | 9 | ||
11 | <router-link to="/register"> Still don't have account? </router-link> | 10 | <router-link to="/register"> Still don't have an account? </router-link> |
12 | 11 | ||
13 | </div> | 12 | </div> |
14 | </template> | 13 | </template> |
@@ -21,25 +20,27 @@ export default { | |||
21 | return { | 20 | return { |
22 | login: "", | 21 | login: "", |
23 | password: "", | 22 | password: "", |
24 | messages: [] | ||
25 | } | 23 | } |
26 | }, | 24 | }, |
27 | methods: { | 25 | methods: { |
28 | async log_in(e) { | 26 | async log_in(e) { |
29 | e.preventDefault() | 27 | e.preventDefault() |
30 | 28 | ||
31 | const data = { | 29 | const login_data = { |
32 | "username": this.login, | 30 | "username": this.login, |
33 | "password": this.password | 31 | "password": this.password |
34 | } | 32 | } |
35 | try{ | 33 | |
36 | const res = await AuthService.login(data) | 34 | const {data, status} = await AuthService.login(login_data) |
37 | this.$store.dispatch('login', {token: res.token, user: res.user}) | 35 | |
38 | this.$router.push('/') | 36 | if (status === 200) { |
39 | } catch (error) { | 37 | this.$store.dispatch('login', {token: data.token, user: data.user}) |
40 | console.log(error.response.data) | 38 | this.$notify({ |
41 | this.messages.push('Wrong username or password!') | 39 | type: 'success', |
42 | } | 40 | text: 'Success!' |
41 | }) | ||
42 | this.$router.push('/') | ||
43 | } | ||
43 | } | 44 | } |
44 | }, | 45 | }, |
45 | created() { | 46 | created() { |
diff --git a/src/views/Register.vue b/src/views/Register.vue index c03f5fd..eb382c5 100644 --- a/src/views/Register.vue +++ b/src/views/Register.vue | |||
@@ -7,9 +7,8 @@ | |||
7 | 7 | ||
8 | <input type="submit" value="Register!"> | 8 | <input type="submit" value="Register!"> |
9 | </form> | 9 | </form> |
10 | <p v-for="(mess, key) in messages" :key="key">{{mess}}</p> | ||
11 | 10 | ||
12 | <router-link to="/login">Already have account?</router-link> | 11 | <router-link to="/login">Already have an account?</router-link> |
13 | 12 | ||
14 | </div> | 13 | </div> |
15 | </template> | 14 | </template> |
@@ -23,7 +22,6 @@ export default { | |||
23 | login: "", | 22 | login: "", |
24 | password: "", | 23 | password: "", |
25 | repeat_password: "", | 24 | repeat_password: "", |
26 | messages: [] | ||
27 | } | 25 | } |
28 | }, | 26 | }, |
29 | methods: { | 27 | methods: { |
@@ -32,27 +30,28 @@ export default { | |||
32 | 30 | ||
33 | e.preventDefault() | 31 | e.preventDefault() |
34 | if(this.password !== this.repeat_password){ | 32 | if(this.password !== this.repeat_password){ |
35 | this.messages.push("Passwords not equals") | 33 | this.$notify({ |
34 | type: 'warn', | ||
35 | text: 'Passwords not equals', | ||
36 | }) | ||
36 | this.password = "" | 37 | this.password = "" |
37 | this.repeat_password = "" | 38 | this.repeat_password = "" |
38 | 39 | ||
39 | return null | 40 | return null |
40 | } | 41 | } |
41 | 42 | ||
42 | const data = { | 43 | const register_data = { |
43 | "username": this.login, | 44 | "username": this.login, |
44 | "password": this.password | 45 | "password": this.password |
45 | } | 46 | } |
46 | 47 | ||
47 | try { | 48 | const { status } = await AuthService.register(register_data) |
48 | await AuthService.register(data) | 49 | if (status === 200) { |
49 | this.messages.push("Success!") | 50 | this.$notify({ |
50 | }catch (error) { | 51 | type: 'success', |
51 | if(error.response.data.username) | 52 | text:'Register success, you can now login.!' |
52 | this.messages.push(error.response.data.username[0]) | 53 | }) |
53 | if (error.response.data.password) | 54 | this.$router.push('/login') |
54 | this.messages.push(error.response.data.password[0]) | ||
55 | |||
56 | } | 55 | } |
57 | } | 56 | } |
58 | }, | 57 | }, |