Skip to content

Commit dc7542d

Browse files
Codeniusudoooooo
authored andcommitted
refactor: 使用vue3组合式API重构登录页代码 (#172)
1 parent b18d872 commit dc7542d

File tree

1 file changed

+121
-100
lines changed

1 file changed

+121
-100
lines changed

web/src/management/pages/login/LoginPage.vue

Lines changed: 121 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<el-form
1515
:model="formData"
1616
:rules="rules"
17-
ref="formData"
17+
ref="formDataRef"
1818
label-width="100px"
1919
class="login-form"
2020
@submit.prevent
@@ -36,17 +36,17 @@
3636

3737
<el-form-item class="button-group">
3838
<el-button
39-
:loading="loginPending"
39+
:loading="pending.login"
4040
size="small"
4141
type="primary"
4242
class="button"
43-
@click="submitForm('formData', 'login')"
43+
@click="submitForm('login')"
4444
>登录</el-button
4545
>
4646
<el-button
47-
:loading="registerPending"
47+
:loading="pending.register"
4848
class="button register-button"
49-
@click="submitForm('formData', 'register')"
49+
@click="submitForm('register')"
5050
>注册</el-button
5151
>
5252
</el-form-item>
@@ -55,113 +55,134 @@
5555
</div>
5656
</template>
5757

58-
<script>
58+
<script setup lang="ts">
59+
import { onMounted, ref, reactive } from 'vue'
60+
import { useStore } from 'vuex'
61+
import { useRoute, useRouter } from 'vue-router'
62+
5963
import { ElMessage } from 'element-plus'
6064
import 'element-plus/theme-chalk/src/message.scss'
6165
6266
import { login, register } from '@/management/api/auth'
63-
import { refreshCaptcha } from '@/management/api/captcha'
67+
import { refreshCaptcha as refreshCaptchaApi } from '@/management/api/captcha'
6468
import { CODE_MAP } from '@/management/api/base'
65-
export default {
66-
name: 'LoginPage',
67-
data() {
68-
return {
69-
formData: {
70-
name: '',
71-
password: '',
72-
captcha: '',
73-
captchaId: ''
74-
},
75-
rules: {
76-
name: [
77-
{ required: true, message: '请输入账号', trigger: 'blur' },
78-
{
79-
min: 3,
80-
max: 10,
81-
message: '长度在 3 到 10 个字符',
82-
trigger: 'blur'
83-
}
84-
],
85-
password: [
86-
{ required: true, message: '请输入密码', trigger: 'blur' },
87-
{
88-
min: 8,
89-
max: 16,
90-
message: '长度在 8 到 16 个字符',
91-
trigger: 'blur'
92-
}
93-
],
94-
captcha: [
95-
{
96-
required: true,
97-
message: '请输入验证码',
98-
trigger: 'blur'
99-
}
100-
]
101-
},
102-
loginPending: false,
103-
registerPending: false,
104-
captchaImgData: ''
69+
70+
const store = useStore()
71+
const route = useRoute()
72+
const router = useRouter()
73+
74+
interface FormData {
75+
name: string
76+
password: string
77+
captcha: string
78+
captchaId: string
79+
}
80+
81+
interface Pending {
82+
login: boolean
83+
register: boolean
84+
}
85+
86+
const formData = reactive<FormData>({
87+
name: '',
88+
password: '',
89+
captcha: '',
90+
captchaId: ''
91+
})
92+
93+
const rules = {
94+
name: [
95+
{ required: true, message: '请输入账号', trigger: 'blur' },
96+
{
97+
min: 3,
98+
max: 10,
99+
message: '长度在 3 到 10 个字符',
100+
trigger: 'blur'
105101
}
106-
},
107-
created() {
108-
this.refreshCaptcha()
109-
},
110-
methods: {
111-
submitForm(formName, type) {
112-
this.$refs[formName].validate(async (valid) => {
113-
if (valid) {
114-
try {
115-
const submitTypes = {
116-
login,
117-
register
118-
}
119-
this[`${type}Pending`] = true
120-
const res = await submitTypes[type]({
121-
username: this.formData.name,
122-
password: this.formData.password,
123-
captcha: this.formData.captcha,
124-
captchaId: this.formData.captchaId
125-
})
126-
this[`${type}Pending`] = false
127-
if (res.code !== CODE_MAP.SUCCESS) {
128-
ElMessage.error(res.errmsg)
129-
throw new Error('登录/注册失败' + res.errmsg)
130-
}
131-
this.$store.dispatch('user/login', {
132-
username: res.data.username,
133-
token: res.data.token
134-
})
135-
let redirect = {
136-
name: 'survey'
137-
}
138-
if (this.$route.query.redirect) {
139-
redirect = decodeURIComponent(this.$route.query.redirect)
140-
}
141-
this.$router.replace(redirect)
142-
} catch (error) {
143-
this[`${type}Pending`] = false
144-
}
145-
return true
146-
} else {
147-
return false
148-
}
149-
})
150-
},
151-
async refreshCaptcha() {
102+
],
103+
password: [
104+
{ required: true, message: '请输入密码', trigger: 'blur' },
105+
{
106+
min: 8,
107+
max: 16,
108+
message: '长度在 8 到 16 个字符',
109+
trigger: 'blur'
110+
}
111+
],
112+
captcha: [
113+
{
114+
required: true,
115+
message: '请输入验证码',
116+
trigger: 'blur'
117+
}
118+
]
119+
}
120+
121+
onMounted(() => {
122+
refreshCaptcha()
123+
})
124+
125+
const pending = reactive<Pending>({
126+
login: false,
127+
register: false
128+
})
129+
130+
const captchaImgData = ref<string>('')
131+
const formDataRef = ref<any>(null)
132+
133+
const submitForm = (type: 'login' | 'register') => {
134+
formDataRef.value.validate(async (valid: boolean) => {
135+
if (valid) {
152136
try {
153-
const res = await refreshCaptcha({
154-
captchaId: this.formData.captchaId
137+
const submitTypes = {
138+
login,
139+
register
140+
}
141+
pending[type] = true
142+
const res: any = await submitTypes[type]({
143+
username: formData.name,
144+
password: formData.password,
145+
captcha: formData.captcha,
146+
captchaId: formData.captchaId
155147
})
156-
if (res.code === 200) {
157-
const { id, img } = res.data
158-
this.formData.captchaId = id
159-
this.captchaImgData = img
148+
pending[type] = false
149+
if (res.code !== CODE_MAP.SUCCESS) {
150+
ElMessage.error(res.errmsg)
151+
throw new Error('登录/注册失败' + res.errmsg)
160152
}
153+
store.dispatch('user/login', {
154+
username: res.data.username,
155+
token: res.data.token
156+
})
157+
let redirect: any = {
158+
name: 'survey'
159+
}
160+
if (route.query.redirect) {
161+
redirect = decodeURIComponent(route.query.redirect as string)
162+
}
163+
router.replace(redirect)
161164
} catch (error) {
162-
ElMessage.error('获取验证码失败')
165+
pending[type] = false
163166
}
167+
return true
168+
} else {
169+
return false
170+
}
171+
})
172+
}
173+
174+
const refreshCaptcha = async () => {
175+
try {
176+
const res: any = await refreshCaptchaApi({
177+
captchaId: formData.captchaId
178+
})
179+
if (res.code === 200) {
180+
const { id, img } = res.data
181+
formData.captchaId = id
182+
captchaImgData.value = img
164183
}
184+
} catch (error) {
185+
ElMessage.error('获取验证码失败')
165186
}
166187
}
167188
</script>

0 commit comments

Comments
 (0)