Files
blog-admin-ui/src/store/auth.ts
2025-09-21 22:48:33 +08:00

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
}
}
}
})