Skip to content

Commit 5d6b14b

Browse files
setup register, login
1 parent b766472 commit 5d6b14b

File tree

21 files changed

+538
-145
lines changed

21 files changed

+538
-145
lines changed

src/App.vue

Lines changed: 18 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,25 @@
11
<template>
2-
<v-app>
3-
<v-app-bar
4-
app
5-
color="primary"
6-
dark
7-
>
8-
<div class="d-flex align-center">
9-
<v-img
10-
alt="Vuetify Logo"
11-
class="shrink mr-2"
12-
contain
13-
src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-dark.png"
14-
transition="scale-transition"
15-
width="40"
16-
/>
17-
18-
<v-img
19-
alt="Vuetify Name"
20-
class="shrink mt-1 hidden-sm-and-down"
21-
contain
22-
min-width="100"
23-
src="https://cdn.vuetifyjs.com/images/logos/vuetify-name-dark.png"
24-
width="100"
25-
/>
26-
</div>
27-
28-
<v-spacer></v-spacer>
29-
30-
<v-btn
31-
href="https://github.com/vuetifyjs/vuetify/releases/latest"
32-
target="_blank"
33-
text
34-
>
35-
<span class="mr-2">Latest Release</span>
36-
<v-icon>mdi-open-in-new</v-icon>
37-
</v-btn>
38-
</v-app-bar>
39-
40-
<v-main>
41-
<router-view/>
42-
</v-main>
43-
</v-app>
2+
<component :is="layout"/>
443
</template>
454

465
<script lang="ts">
47-
import Vue from 'vue'
48-
49-
export default Vue.extend({
50-
name: 'App',
6+
import { Vue, Component } from 'vue-property-decorator'
7+
import LayoutDefault from '@/layouts/LayoutDefault.vue'
518
52-
data: () => ({
53-
//
54-
})
9+
@Component({
10+
components: {
11+
LayoutDefault
12+
}
5513
})
14+
export default class App extends Vue {
15+
get layout (): typeof Vue {
16+
const defaultLayout = LayoutDefault
17+
18+
if (this.$route.meta !== undefined) {
19+
return this.$route.meta.layout || defaultLayout
20+
} else {
21+
return defaultLayout
22+
}
23+
}
24+
}
5625
</script>

src/api/account.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Vue from 'vue'
2+
import { endpoints } from './endpoints'
3+
import {
4+
LoginReq, LoginRes,
5+
MyInfoRes,
6+
RegisterTeacherReq, RegisterTeacherRes, TokenRefreshReq, TokenRefreshRes
7+
} from '@/interfaces/api/account'
8+
9+
export const account = {
10+
async registerTeacher (reqBody: RegisterTeacherReq): Promise<RegisterTeacherRes> {
11+
const res = await Vue.axios.post(endpoints.account.users.registerTeacher, reqBody)
12+
return {
13+
name: res.data.name,
14+
email: res.data.email,
15+
phoneNumber: res.data.phone_number
16+
}
17+
},
18+
19+
async login (reqBody: LoginReq): Promise<LoginRes> {
20+
const res = await Vue.axios.post(endpoints.account.users.login, reqBody)
21+
return {
22+
access: res.data.access,
23+
refresh: res.data.refresh
24+
}
25+
},
26+
27+
async tokenRefresh (reqBody: TokenRefreshReq): Promise<TokenRefreshRes> {
28+
const res = await Vue.axios.post(endpoints.account.users.tokenRefresh, reqBody)
29+
return {
30+
access: res.data.access,
31+
refresh: res.data.refresh
32+
}
33+
},
34+
35+
async getMyInfo (): Promise<MyInfoRes> {
36+
const res = await Vue.axios.get(endpoints.account.me.myInfo)
37+
return {
38+
pk: res.data.pk,
39+
url: res.data.url,
40+
name: res.data.name,
41+
email: res.data.email,
42+
phoneNumber: res.data.phone_number,
43+
userType: res.data.user_type,
44+
avatar: res.data.avatar,
45+
avatarThumbnail: res.data.avatar_thumbnail
46+
}
47+
}
48+
}

src/api/endpoints.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
export const endpoints = {
2-
users: {
3-
login: '/users/login/',
4-
tokenRefresh: '/users/token-refresh/',
5-
registerTeacher: '/users/register-teacher/'
2+
account: {
3+
users: {
4+
login: '/account/users/login/',
5+
tokenRefresh: '/account/users/token-refresh/',
6+
registerTeacher: '/account/users/register-teacher/'
7+
},
8+
me: {
9+
myInfo: '/account/users/me/'
10+
}
611
}
712
}
813

src/api/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { users } from './users'
1+
import { account } from './account'
22

33
export const Api = {
4-
users,
4+
account
55
}

src/api/users.ts

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/interfaces/api/user.ts renamed to src/interfaces/api/account.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export declare interface LoginReq {
2-
name: string;
2+
email: string;
33
password: string;
44
}
55

@@ -29,3 +29,14 @@ export declare interface RegisterTeacherRes {
2929
name: string;
3030
phoneNumber: string;
3131
}
32+
33+
export declare interface MyInfoRes {
34+
pk: number;
35+
url: string;
36+
name: string;
37+
email: string;
38+
phoneNumber: string;
39+
userType: string;
40+
avatar: string;
41+
avatarThumbnail: string;
42+
}

src/interfaces/group.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/interfaces/store/groups.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/layouts/LayoutDefault.vue

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<template>
2+
<v-app>
3+
<v-app-bar
4+
app
5+
color="primary"
6+
dark
7+
dense
8+
flat
9+
>
10+
<router-link
11+
:to="{ name: 'Home' }"
12+
class="d-flex align-center white--text"
13+
>
14+
Keep learning!
15+
</router-link>
16+
17+
<v-spacer></v-spacer>
18+
19+
<div>
20+
<v-progress-circular
21+
v-if="loading"
22+
indeterminate
23+
></v-progress-circular>
24+
<span v-else>
25+
{{ user.name }}
26+
</span>
27+
</div>
28+
</v-app-bar>
29+
30+
<v-main>
31+
<router-view/>
32+
</v-main>
33+
34+
<v-bottom-navigation
35+
app
36+
background-color="secondary"
37+
dark
38+
hide-on-scroll
39+
>
40+
<v-btn>
41+
<v-icon>mdi-chevron-left</v-icon>
42+
</v-btn>
43+
<v-spacer></v-spacer>
44+
</v-bottom-navigation>
45+
</v-app>
46+
</template>
47+
48+
<script lang="ts">
49+
import { User } from '@/interfaces/user'
50+
import { unexpectedExc } from '@/utils'
51+
import { Vue, Component } from 'vue-property-decorator'
52+
import { mapGetters } from 'vuex'
53+
54+
@Component({
55+
computed: {
56+
...mapGetters({
57+
user: 'account/loggedInUser',
58+
hasUserInfo: 'account/hasUserInfo'
59+
})
60+
}
61+
})
62+
export default class LayoutDefault extends Vue {
63+
user!: User
64+
hasUserInfo!: boolean
65+
loading = false
66+
67+
created (): void {
68+
this.setUserInfo()
69+
}
70+
71+
setUserInfo (): void {
72+
if (!this.hasUserInfo) {
73+
this.loading = true
74+
this.$store.dispatch('account/getInfo')
75+
.catch(unexpectedExc)
76+
.finally(() => {
77+
this.loading = false
78+
})
79+
}
80+
}
81+
}
82+
</script>

src/layouts/LayoutNoAppbar.vue

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<template>
2+
<v-app>
3+
<v-main>
4+
<router-view/>
5+
</v-main>
6+
</v-app>
7+
</template>
8+
9+
<script lang="ts">
10+
import { Vue, Component } from 'vue-property-decorator'
11+
12+
@Component
13+
export default class LayoutNoAppbar extends Vue {
14+
15+
}
16+
</script>

0 commit comments

Comments
 (0)