Skip to content

Commit bc51ede

Browse files
committed
feat: Add get verification code (#123)
1 parent 1334b0b commit bc51ede

File tree

8 files changed

+59
-27
lines changed

8 files changed

+59
-27
lines changed

mock/modules/user.mock.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { defineMock } from 'vite-plugin-mock-dev-server'
2+
import { builder } from '../util'
23

34
export default defineMock([
45
{
@@ -39,4 +40,12 @@ export default defineMock([
3940
}
4041
},
4142
},
43+
{
44+
url: '/api/user/email-code',
45+
delay: 1000,
46+
body: () => {
47+
const code = '123456'
48+
return builder(code)
49+
},
50+
},
4251
])

src/api/typing.ts

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

src/api/user.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,7 @@ export function logout() {
2626
export function getUserInfo() {
2727
return request<UserState>('/user/me')
2828
}
29+
30+
export function getEmailCode(): Promise<any> {
31+
return request.get('/user/email-code')
32+
}

src/locales/en-US.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@
6262
"pleaseEnterConfirmPassword": "Please enter password again",
6363
"confirm": "Confirm",
6464
"backToLogin": "Back to login",
65-
"getCode": "Get code"
65+
"getCode": "Get code",
66+
"gettingCode": "Getting Code",
67+
"sendCodeSuccess": "Sent, the code is"
6668

6769
},
6870
"settings": {

src/locales/zh-CN.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@
6262
"pleaseEnterConfirmPassword": "请再次输入密码",
6363
"confirm": "确认",
6464
"backToLogin": "返回登录",
65-
"getCode": "获取验证码"
65+
"getCode": "获取验证码",
66+
"gettingCode": "获取中",
67+
"sendCodeSuccess": "已发送,验证码为"
6668
},
6769
"settings": {
6870
"logout": "退出登录",

src/pages/forgot-password/index.vue

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const postData = reactive({
1515
})
1616
1717
const rules = reactive({
18-
eamil: [
18+
email: [
1919
{ required: true, message: t('forgot-password.pleaseEnterEmail') },
2020
],
2121
code: [
@@ -46,6 +46,27 @@ async function reset(values: any) {
4646
}
4747
}
4848
49+
const isGettingCode = ref(false)
50+
51+
const buttonText = computed(() => {
52+
return isGettingCode.value ? t('forgot-password.gettingCode') : t('forgot-password.getCode')
53+
})
54+
55+
async function getCode() {
56+
if (!postData.email) {
57+
showNotify({ type: 'warning', message: t('forgot-password.pleaseEnterEmail') })
58+
return
59+
}
60+
61+
isGettingCode.value = true
62+
const res = await userStore.getCode()
63+
if (res.code === 0) {
64+
showNotify({ type: 'success', message: `${t('forgot-password.sendCodeSuccess')}: ${res.result}` })
65+
}
66+
67+
isGettingCode.value = false
68+
}
69+
4970
function handleBackLogin() {
5071
router.replace({ name: 'login' })
5172
}
@@ -56,31 +77,31 @@ function handleBackLogin() {
5677
<van-form :model="postData" :rules="rules" @submit="reset">
5778
<div class="overflow-hidden rounded-3xl">
5879
<van-field
59-
v-model="postData.email"
60-
:rules="rules.eamil"
80+
v-model.trim="postData.email"
81+
:rules="rules.email"
6182
name="email"
6283
:placeholder="t('forgot-password.email')"
6384
/>
6485
</div>
6586

6687
<div class="mt-16 overflow-hidden rounded-3xl">
6788
<van-field
68-
v-model="postData.code"
89+
v-model.trim="postData.code"
6990
:rules="rules.code"
7091
name="code"
7192
:placeholder="t('forgot-password.code')"
7293
>
7394
<template #button>
74-
<van-button size="small" type="primary" plain>
75-
{{ $t('forgot-password.getCode') }}
95+
<van-button size="small" type="primary" plain @click="getCode">
96+
{{ buttonText }}
7697
</van-button>
7798
</template>
7899
</van-field>
79100
</div>
80101

81102
<div class="mt-16 overflow-hidden rounded-3xl">
82103
<van-field
83-
v-model="postData.password"
104+
v-model.trim="postData.password"
84105
type="password"
85106
:rules="rules.password"
86107
name="password"
@@ -90,7 +111,7 @@ function handleBackLogin() {
90111

91112
<div class="mt-16 overflow-hidden rounded-3xl">
92113
<van-field
93-
v-model="postData.confirmPassword"
114+
v-model.trim="postData.confirmPassword"
94115
type="password"
95116
:rules="rules.confirmPassword"
96117
name="confirmPassword"

src/stores/modules/user.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineStore } from 'pinia'
22
import type { LoginData, UserState } from '@/api/user'
3-
import { getUserInfo, login as userLogin, logout as userLogout } from '@/api/user'
3+
import { getEmailCode, getUserInfo, login as userLogin, logout as userLogout } from '@/api/user'
44
import { clearToken, setToken } from '@/utils/auth'
55

66
const InitUserInfo = {
@@ -49,11 +49,20 @@ export const useUserStore = defineStore('user', () => {
4949
}
5050
}
5151

52+
const getCode = async () => {
53+
try {
54+
const data = await getEmailCode()
55+
return data
56+
}
57+
catch {}
58+
}
59+
5260
return {
5361
userInfo,
5462
info,
5563
login,
5664
logout,
65+
getCode,
5766
}
5867
}, {
5968
persist: true,

src/types/auto-imports.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ declare global {
102102
const shallowReactive: typeof import('vue')['shallowReactive']
103103
const shallowReadonly: typeof import('vue')['shallowReadonly']
104104
const shallowRef: typeof import('vue')['shallowRef']
105+
const showNotify: typeof import('vant/es')['showNotify']
105106
const suite: typeof import('vitest')['suite']
106107
const syncRef: typeof import('@vueuse/core')['syncRef']
107108
const syncRefs: typeof import('@vueuse/core')['syncRefs']

0 commit comments

Comments
 (0)