|
14 | 14 | <el-form
|
15 | 15 | :model="formData"
|
16 | 16 | :rules="rules"
|
17 |
| - ref="formData" |
| 17 | + ref="formDataRef" |
18 | 18 | label-width="100px"
|
19 | 19 | class="login-form"
|
20 | 20 | @submit.prevent
|
|
36 | 36 |
|
37 | 37 | <el-form-item class="button-group">
|
38 | 38 | <el-button
|
39 |
| - :loading="loginPending" |
| 39 | + :loading="pending.login" |
40 | 40 | size="small"
|
41 | 41 | type="primary"
|
42 | 42 | class="button"
|
43 |
| - @click="submitForm('formData', 'login')" |
| 43 | + @click="submitForm('login')" |
44 | 44 | >登录</el-button
|
45 | 45 | >
|
46 | 46 | <el-button
|
47 |
| - :loading="registerPending" |
| 47 | + :loading="pending.register" |
48 | 48 | class="button register-button"
|
49 |
| - @click="submitForm('formData', 'register')" |
| 49 | + @click="submitForm('register')" |
50 | 50 | >注册</el-button
|
51 | 51 | >
|
52 | 52 | </el-form-item>
|
|
55 | 55 | </div>
|
56 | 56 | </template>
|
57 | 57 |
|
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 | +
|
59 | 63 | import { ElMessage } from 'element-plus'
|
60 | 64 | import 'element-plus/theme-chalk/src/message.scss'
|
61 | 65 |
|
62 | 66 | import { login, register } from '@/management/api/auth'
|
63 |
| -import { refreshCaptcha } from '@/management/api/captcha' |
| 67 | +import { refreshCaptcha as refreshCaptchaApi } from '@/management/api/captcha' |
64 | 68 | 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' |
105 | 101 | }
|
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) { |
152 | 136 | 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 |
155 | 147 | })
|
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) |
160 | 152 | }
|
| 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) |
161 | 164 | } catch (error) {
|
162 |
| - ElMessage.error('获取验证码失败') |
| 165 | + pending[type] = false |
163 | 166 | }
|
| 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 |
164 | 183 | }
|
| 184 | + } catch (error) { |
| 185 | + ElMessage.error('获取验证码失败') |
165 | 186 | }
|
166 | 187 | }
|
167 | 188 | </script>
|
|
0 commit comments