129 lines
3.4 KiB
TypeScript
129 lines
3.4 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ILoginType, ISession } from '@/types/auth'
|
|
import { loginAdminApi, loginHomeApi } from '@/apis/session'
|
|
import { ElMessage } from 'element-plus'
|
|
import { emailPattern, phonePattern } from '@/utils/element/elRules'
|
|
|
|
export const useAuthStore = defineStore('auth', {
|
|
state: () => ({
|
|
loginForm: {
|
|
username: '',
|
|
password: '',
|
|
isRemember: false
|
|
},
|
|
phoneLoginForm: {
|
|
phoneNumber: '',
|
|
code: ''
|
|
},
|
|
emailLoginForm: {
|
|
email: '',
|
|
code: ''
|
|
},
|
|
loginType: 'common' as ILoginType,
|
|
loginLoading: false,
|
|
loginAdminLoading: false,
|
|
isVerified: false,
|
|
isGettingCode: false,
|
|
getCodeCountdown: 60,
|
|
getCodeTimer: null as NodeJS.Timeout | null,
|
|
homeSession: {} as ISession
|
|
}),
|
|
actions: {
|
|
changeLoginType(type: ILoginType) {
|
|
this.loginType = type
|
|
|
|
if (type === 'common') {
|
|
this.stopCountdown()
|
|
}
|
|
this.resetLoginForm()
|
|
},
|
|
getAuthCode(type: ILoginType) {
|
|
switch (type) {
|
|
case 'phone':
|
|
if (phonePattern.test(this.phoneLoginForm.phoneNumber)) {
|
|
this.isGettingCode = true
|
|
ElMessage.success('验证码已发送至手机')
|
|
this.startCountdown()
|
|
} else {
|
|
ElMessage.error('请先输入正确的手机号')
|
|
}
|
|
break
|
|
case 'email':
|
|
if (emailPattern.test(this.emailLoginForm.email)) {
|
|
this.isGettingCode = true
|
|
ElMessage.success('验证码已发送至邮箱')
|
|
this.startCountdown()
|
|
} else {
|
|
ElMessage.error('请先输入正确的邮箱地址')
|
|
}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
},
|
|
startCountdown() {
|
|
this.getCodeTimer = setInterval(() => {
|
|
if (this.getCodeCountdown > 0) {
|
|
this.getCodeCountdown--
|
|
} else {
|
|
clearInterval(this.getCodeTimer as NodeJS.Timeout)
|
|
this.isGettingCode = false
|
|
this.getCodeCountdown = 60
|
|
}
|
|
}, 1000)
|
|
},
|
|
stopCountdown() {
|
|
if (this.getCodeTimer) {
|
|
clearInterval(this.getCodeTimer)
|
|
}
|
|
},
|
|
async handleLogin(type: ILoginType) {
|
|
const { username, password } = this.loginForm
|
|
const { phoneNumber, code: phoneCode } = this.phoneLoginForm
|
|
const { email, code: emailCode } = this.emailLoginForm
|
|
switch (type) {
|
|
case 'common':
|
|
this.homeSession = await loginHomeApi(username, password)
|
|
break
|
|
case 'phone':
|
|
this.homeSession = await loginHomeApi(phoneNumber, phoneCode)
|
|
break
|
|
case 'email':
|
|
this.homeSession = await loginHomeApi(email, emailCode)
|
|
break
|
|
case 'admin':
|
|
this.homeSession = await loginAdminApi(username, password)
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
ElMessage.success('登录成功')
|
|
},
|
|
resetLoginForm() {
|
|
switch (this.loginType) {
|
|
case 'common':
|
|
this.loginForm = {
|
|
username: '',
|
|
password: '',
|
|
isRemember: false
|
|
}
|
|
break
|
|
case 'phone':
|
|
this.phoneLoginForm = {
|
|
phoneNumber: '',
|
|
code: ''
|
|
}
|
|
break
|
|
case 'email':
|
|
this.emailLoginForm = {
|
|
email: '',
|
|
code: ''
|
|
}
|
|
break
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
}
|
|
})
|