Commit c8823752d003988c7a4910c0d29df7f12c128979
1 parent
6d27ba43
perf: loginform code
Showing
3 changed files
with
56 additions
and
31 deletions
yudao-ui-admin-vue3/src/config/axios/index.ts
| @@ -124,7 +124,15 @@ service.interceptors.response.use( | @@ -124,7 +124,15 @@ service.interceptors.response.use( | ||
| 124 | }, | 124 | }, |
| 125 | (error: AxiosError) => { | 125 | (error: AxiosError) => { |
| 126 | console.log('err' + error) // for debug | 126 | console.log('err' + error) // for debug |
| 127 | - ElMessage.error(error.message) | 127 | + let { message } = error |
| 128 | + if (message === 'Network Error') { | ||
| 129 | + message = '后端接口连接异常' | ||
| 130 | + } else if (message.includes('timeout')) { | ||
| 131 | + message = '系统接口请求超时' | ||
| 132 | + } else if (message.includes('Request failed with status code')) { | ||
| 133 | + message = '系统接口' + message.substr(message.length - 3) + '异常' | ||
| 134 | + } | ||
| 135 | + ElMessage.error(message) | ||
| 128 | return Promise.reject(error) | 136 | return Promise.reject(error) |
| 129 | } | 137 | } |
| 130 | ) | 138 | ) |
yudao-ui-admin-vue3/src/views/Login/components/LoginForm.vue
| @@ -13,7 +13,14 @@ import { | @@ -13,7 +13,14 @@ import { | ||
| 13 | } from 'element-plus' | 13 | } from 'element-plus' |
| 14 | import { reactive, ref, unref, onMounted, computed, watch } from 'vue' | 14 | import { reactive, ref, unref, onMounted, computed, watch } from 'vue' |
| 15 | import * as LoginApi from '@/api/login' | 15 | import * as LoginApi from '@/api/login' |
| 16 | -import { setToken, setTenantId } from '@/utils/auth' | 16 | +import { |
| 17 | + setToken, | ||
| 18 | + setTenantId, | ||
| 19 | + getUsername, | ||
| 20 | + getRememberMe, | ||
| 21 | + getPassword, | ||
| 22 | + getTenantName | ||
| 23 | +} from '@/utils/auth' | ||
| 17 | import { useUserStoreWithOut } from '@/store/modules/user' | 24 | import { useUserStoreWithOut } from '@/store/modules/user' |
| 18 | import { useCache } from '@/hooks/web/useCache' | 25 | import { useCache } from '@/hooks/web/useCache' |
| 19 | import { usePermissionStore } from '@/store/modules/permission' | 26 | import { usePermissionStore } from '@/store/modules/permission' |
| @@ -40,7 +47,6 @@ const iconHouse = useIcon({ icon: 'ep:house' }) | @@ -40,7 +47,6 @@ const iconHouse = useIcon({ icon: 'ep:house' }) | ||
| 40 | const iconAvatar = useIcon({ icon: 'ep:avatar' }) | 47 | const iconAvatar = useIcon({ icon: 'ep:avatar' }) |
| 41 | const iconLock = useIcon({ icon: 'ep:lock' }) | 48 | const iconLock = useIcon({ icon: 'ep:lock' }) |
| 42 | const iconCircleCheck = useIcon({ icon: 'ep:circle-check' }) | 49 | const iconCircleCheck = useIcon({ icon: 'ep:circle-check' }) |
| 43 | -const remember = ref(false) | ||
| 44 | const LoginRules = { | 50 | const LoginRules = { |
| 45 | tenantName: [required], | 51 | tenantName: [required], |
| 46 | username: [required], | 52 | username: [required], |
| @@ -61,6 +67,7 @@ const loginData = reactive({ | @@ -61,6 +67,7 @@ const loginData = reactive({ | ||
| 61 | tenantName: '芋道源码', | 67 | tenantName: '芋道源码', |
| 62 | username: 'admin', | 68 | username: 'admin', |
| 63 | password: 'admin123', | 69 | password: 'admin123', |
| 70 | + rememberMe: false, | ||
| 64 | code: '', | 71 | code: '', |
| 65 | uuid: '' | 72 | uuid: '' |
| 66 | } | 73 | } |
| @@ -77,6 +84,20 @@ const getTenantId = async () => { | @@ -77,6 +84,20 @@ const getTenantId = async () => { | ||
| 77 | const res = await LoginApi.getTenantIdByNameApi(loginData.loginForm.tenantName) | 84 | const res = await LoginApi.getTenantIdByNameApi(loginData.loginForm.tenantName) |
| 78 | setTenantId(res) | 85 | setTenantId(res) |
| 79 | } | 86 | } |
| 87 | +// 记住我 | ||
| 88 | +const getCookie = () => { | ||
| 89 | + const username = getUsername() | ||
| 90 | + const password = getPassword() | ||
| 91 | + const rememberMe = getRememberMe() | ||
| 92 | + const tenantName = getTenantName() | ||
| 93 | + loginData.loginForm = { | ||
| 94 | + ...loginData.loginForm, | ||
| 95 | + username: username ? username : loginData.loginForm.username, | ||
| 96 | + password: password ? password : loginData.loginForm.password, | ||
| 97 | + rememberMe: rememberMe ? getRememberMe() : false, | ||
| 98 | + tenantName: tenantName ? tenantName : loginData.loginForm.tenantName | ||
| 99 | + } | ||
| 100 | +} | ||
| 80 | // 登录 | 101 | // 登录 |
| 81 | const handleLogin = async () => { | 102 | const handleLogin = async () => { |
| 82 | await getTenantId() | 103 | await getTenantId() |
| @@ -103,7 +124,7 @@ const getRoutes = async () => { | @@ -103,7 +124,7 @@ const getRoutes = async () => { | ||
| 103 | // 后端过滤菜单 | 124 | // 后端过滤菜单 |
| 104 | const res = await LoginApi.getAsyncRoutesApi() | 125 | const res = await LoginApi.getAsyncRoutesApi() |
| 105 | wsCache.set('roleRouters', res) | 126 | wsCache.set('roleRouters', res) |
| 106 | - await permissionStore.generateRoutes(res).catch(() => {}) | 127 | + await permissionStore.generateRoutes(res) |
| 107 | permissionStore.getAddRouters.forEach((route) => { | 128 | permissionStore.getAddRouters.forEach((route) => { |
| 108 | addRoute(route as RouteRecordRaw) // 动态添加可访问路由表 | 129 | addRoute(route as RouteRecordRaw) // 动态添加可访问路由表 |
| 109 | }) | 130 | }) |
| @@ -120,8 +141,9 @@ watch( | @@ -120,8 +141,9 @@ watch( | ||
| 120 | immediate: true | 141 | immediate: true |
| 121 | } | 142 | } |
| 122 | ) | 143 | ) |
| 123 | -onMounted(() => { | ||
| 124 | - getCode() | 144 | +onMounted(async () => { |
| 145 | + await getCode() | ||
| 146 | + getCookie() | ||
| 125 | }) | 147 | }) |
| 126 | </script> | 148 | </script> |
| 127 | <template> | 149 | <template> |
| @@ -165,7 +187,7 @@ onMounted(() => { | @@ -165,7 +187,7 @@ onMounted(() => { | ||
| 165 | <el-input | 187 | <el-input |
| 166 | v-model="loginData.loginForm.password" | 188 | v-model="loginData.loginForm.password" |
| 167 | type="password" | 189 | type="password" |
| 168 | - :placeholder="t('login.password')" | 190 | + :placeholder="t('login.passwordPlaceholder')" |
| 169 | show-password | 191 | show-password |
| 170 | @keyup.enter="handleLogin" | 192 | @keyup.enter="handleLogin" |
| 171 | :prefix-icon="iconLock" | 193 | :prefix-icon="iconLock" |
| @@ -178,7 +200,7 @@ onMounted(() => { | @@ -178,7 +200,7 @@ onMounted(() => { | ||
| 178 | <el-col :span="14"> | 200 | <el-col :span="14"> |
| 179 | <el-input | 201 | <el-input |
| 180 | v-model="loginData.loginForm.code" | 202 | v-model="loginData.loginForm.code" |
| 181 | - :placeholder="t('login.code')" | 203 | + :placeholder="t('login.codePlaceholder')" |
| 182 | @keyup.enter="handleLogin" | 204 | @keyup.enter="handleLogin" |
| 183 | :prefix-icon="iconCircleCheck" | 205 | :prefix-icon="iconCircleCheck" |
| 184 | style="width: 90%" | 206 | style="width: 90%" |
| @@ -199,7 +221,9 @@ onMounted(() => { | @@ -199,7 +221,9 @@ onMounted(() => { | ||
| 199 | <el-form-item> | 221 | <el-form-item> |
| 200 | <el-row justify="space-between" style="width: 100%"> | 222 | <el-row justify="space-between" style="width: 100%"> |
| 201 | <el-col :span="6"> | 223 | <el-col :span="6"> |
| 202 | - <el-checkbox v-model="remember">{{ t('login.remember') }}</el-checkbox> | 224 | + <el-checkbox v-model="loginData.loginForm.rememberMe"> |
| 225 | + {{ t('login.remember') }} | ||
| 226 | + </el-checkbox> | ||
| 203 | </el-col> | 227 | </el-col> |
| 204 | <el-col :span="12" :offset="6"> | 228 | <el-col :span="12" :offset="6"> |
| 205 | <el-link type="primary" style="float: right">{{ t('login.forgetPassword') }}</el-link> | 229 | <el-link type="primary" style="float: right">{{ t('login.forgetPassword') }}</el-link> |
| @@ -254,7 +278,7 @@ onMounted(() => { | @@ -254,7 +278,7 @@ onMounted(() => { | ||
| 254 | class="cursor-pointer anticon" | 278 | class="cursor-pointer anticon" |
| 255 | /> | 279 | /> |
| 256 | <Icon | 280 | <Icon |
| 257 | - icon="ant-design:weibo-circle-filled" | 281 | + icon="ant-design:dingtalk-circle-filled" |
| 258 | :size="iconSize" | 282 | :size="iconSize" |
| 259 | :color="iconColor" | 283 | :color="iconColor" |
| 260 | class="cursor-pointer anticon" | 284 | class="cursor-pointer anticon" |
yudao-ui-admin-vue3/src/views/Login/components/MobileForm.vue
| @@ -67,27 +67,21 @@ const redirect = ref<string>('') | @@ -67,27 +67,21 @@ const redirect = ref<string>('') | ||
| 67 | const getSmsCode = async () => { | 67 | const getSmsCode = async () => { |
| 68 | await getTenantId() | 68 | await getTenantId() |
| 69 | smsVO.smsCode.mobile = loginData.loginForm.mobileNumber | 69 | smsVO.smsCode.mobile = loginData.loginForm.mobileNumber |
| 70 | - console.log('getSmsCode begin:', smsVO.smsCode) | ||
| 71 | - await sendSmsCodeApi(smsVO.smsCode) | ||
| 72 | - .then(async (res) => { | ||
| 73 | - // 提示验证码发送成功 | ||
| 74 | - ElMessage({ | ||
| 75 | - type: 'success', | ||
| 76 | - message: t('login.SmsSendMsg') | ||
| 77 | - }) | ||
| 78 | - console.log('res', res) | ||
| 79 | - // 设置倒计时 | ||
| 80 | - mobileCodeTimer.value = 60 | ||
| 81 | - let msgTimer = setInterval(() => { | ||
| 82 | - mobileCodeTimer.value = mobileCodeTimer.value - 1 | ||
| 83 | - if (mobileCodeTimer.value <= 0) { | ||
| 84 | - clearInterval(msgTimer) | ||
| 85 | - } | ||
| 86 | - }, 1000) | ||
| 87 | - }) | ||
| 88 | - .catch(() => { | ||
| 89 | - console.log('error') | 70 | + await sendSmsCodeApi(smsVO.smsCode).then(async () => { |
| 71 | + // 提示验证码发送成功 | ||
| 72 | + ElMessage({ | ||
| 73 | + type: 'success', | ||
| 74 | + message: t('login.SmsSendMsg') | ||
| 90 | }) | 75 | }) |
| 76 | + // 设置倒计时 | ||
| 77 | + mobileCodeTimer.value = 60 | ||
| 78 | + let msgTimer = setInterval(() => { | ||
| 79 | + mobileCodeTimer.value = mobileCodeTimer.value - 1 | ||
| 80 | + if (mobileCodeTimer.value <= 0) { | ||
| 81 | + clearInterval(msgTimer) | ||
| 82 | + } | ||
| 83 | + }, 1000) | ||
| 84 | + }) | ||
| 91 | } | 85 | } |
| 92 | watch( | 86 | watch( |
| 93 | () => currentRoute.value, | 87 | () => currentRoute.value, |
| @@ -126,7 +120,6 @@ const signIn = async () => { | @@ -126,7 +120,6 @@ const signIn = async () => { | ||
| 126 | // 获取路由 | 120 | // 获取路由 |
| 127 | const getRoutes = async () => { | 121 | const getRoutes = async () => { |
| 128 | // 后端过滤菜单 | 122 | // 后端过滤菜单 |
| 129 | - // TODO @jinz:这块 getRoutes 的代码,是不是可以统一到 store 里,类似 ruoyi-vue 的做法,可能要找作者沟通下 | ||
| 130 | const routers = await getAsyncRoutesApi() | 123 | const routers = await getAsyncRoutesApi() |
| 131 | wsCache.set('roleRouters', routers) | 124 | wsCache.set('roleRouters', routers) |
| 132 | await permissionStore.generateRoutes(routers).catch(() => {}) | 125 | await permissionStore.generateRoutes(routers).catch(() => {}) |