refactor: 使用vue3组合式API重构登录页代码 (#172)

This commit is contained in:
codeniu 2024-05-27 16:54:32 +08:00 committed by GitHub
parent 9526faeec1
commit 29011194c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -14,7 +14,7 @@
<el-form <el-form
:model="formData" :model="formData"
:rules="rules" :rules="rules"
ref="formData" ref="formDataRef"
label-width="100px" label-width="100px"
class="login-form" class="login-form"
@submit.prevent @submit.prevent
@ -36,17 +36,17 @@
<el-form-item class="button-group"> <el-form-item class="button-group">
<el-button <el-button
:loading="loginPending" :loading="pending.login"
size="small" size="small"
type="primary" type="primary"
class="button" class="button"
@click="submitForm('formData', 'login')" @click="submitForm('login')"
>登录</el-button >登录</el-button
> >
<el-button <el-button
:loading="registerPending" :loading="pending.register"
class="button register-button" class="button register-button"
@click="submitForm('formData', 'register')" @click="submitForm('register')"
>注册</el-button >注册</el-button
> >
</el-form-item> </el-form-item>
@ -55,24 +55,42 @@
</div> </div>
</template> </template>
<script> <script setup lang="ts">
import { onMounted, ref, reactive } from 'vue'
import { useStore } from 'vuex'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import 'element-plus/theme-chalk/src/message.scss' import 'element-plus/theme-chalk/src/message.scss'
import { login, register } from '@/management/api/auth' import { login, register } from '@/management/api/auth'
import { refreshCaptcha } from '@/management/api/captcha' import { refreshCaptcha as refreshCaptchaApi } from '@/management/api/captcha'
import { CODE_MAP } from '@/management/api/base' import { CODE_MAP } from '@/management/api/base'
export default {
name: 'LoginPage', const store = useStore()
data() { const route = useRoute()
return { const router = useRouter()
formData: {
interface FormData {
name: string
password: string
captcha: string
captchaId: string
}
interface Pending {
login: boolean
register: boolean
}
const formData = reactive<FormData>({
name: '', name: '',
password: '', password: '',
captcha: '', captcha: '',
captchaId: '' captchaId: ''
}, })
rules: {
const rules = {
name: [ name: [
{ required: true, message: '请输入账号', trigger: 'blur' }, { required: true, message: '请输入账号', trigger: 'blur' },
{ {
@ -98,72 +116,75 @@ export default {
trigger: 'blur' trigger: 'blur'
} }
] ]
},
loginPending: false,
registerPending: false,
captchaImgData: ''
} }
},
created() { onMounted(() => {
this.refreshCaptcha() refreshCaptcha()
}, })
methods: {
submitForm(formName, type) { const pending = reactive<Pending>({
this.$refs[formName].validate(async (valid) => { login: false,
register: false
})
const captchaImgData = ref<string>('')
const formDataRef = ref<any>(null)
const submitForm = (type: 'login' | 'register') => {
formDataRef.value.validate(async (valid: boolean) => {
if (valid) { if (valid) {
try { try {
const submitTypes = { const submitTypes = {
login, login,
register register
} }
this[`${type}Pending`] = true pending[type] = true
const res = await submitTypes[type]({ const res: any = await submitTypes[type]({
username: this.formData.name, username: formData.name,
password: this.formData.password, password: formData.password,
captcha: this.formData.captcha, captcha: formData.captcha,
captchaId: this.formData.captchaId captchaId: formData.captchaId
}) })
this[`${type}Pending`] = false pending[type] = false
if (res.code !== CODE_MAP.SUCCESS) { if (res.code !== CODE_MAP.SUCCESS) {
ElMessage.error(res.errmsg) ElMessage.error(res.errmsg)
throw new Error('登录/注册失败' + res.errmsg) throw new Error('登录/注册失败' + res.errmsg)
} }
this.$store.dispatch('user/login', { store.dispatch('user/login', {
username: res.data.username, username: res.data.username,
token: res.data.token token: res.data.token
}) })
let redirect = { let redirect: any = {
name: 'survey' name: 'survey'
} }
if (this.$route.query.redirect) { if (route.query.redirect) {
redirect = decodeURIComponent(this.$route.query.redirect) redirect = decodeURIComponent(route.query.redirect as string)
} }
this.$router.replace(redirect) router.replace(redirect)
} catch (error) { } catch (error) {
this[`${type}Pending`] = false pending[type] = false
} }
return true return true
} else { } else {
return false return false
} }
}) })
}, }
async refreshCaptcha() {
const refreshCaptcha = async () => {
try { try {
const res = await refreshCaptcha({ const res: any = await refreshCaptchaApi({
captchaId: this.formData.captchaId captchaId: formData.captchaId
}) })
if (res.code === 200) { if (res.code === 200) {
const { id, img } = res.data const { id, img } = res.data
this.formData.captchaId = id formData.captchaId = id
this.captchaImgData = img captchaImgData.value = img
} }
} catch (error) { } catch (error) {
ElMessage.error('获取验证码失败') ElMessage.error('获取验证码失败')
} }
} }
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>