auth-web/src/views/login/components/login-form.vue

101 lines
3.0 KiB
Vue
Raw Normal View History

2024-09-26 22:05:24 +08:00
<script lang="ts" setup>
2025-04-25 16:21:15 +08:00
import { useRenderIcon } from '@/components/ReIcon/src/hooks';
2025-04-29 18:18:07 +08:00
import User from '~icons/ri/user-3-fill';
import Lock from '~icons/ri/lock-fill';
2024-09-26 22:05:24 +08:00
import { onBeforeUnmount, onMounted, reactive, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useI18n } from 'vue-i18n';
import { useUserStore } from '@/store/system/user';
2024-09-26 22:05:24 +08:00
import { message } from '@/utils/message';
import { getTopMenu, initRouter } from '@/router/utils';
2025-04-25 17:10:22 +08:00
import Motion from '../utils';
import { ElMessage, FormInstance } from 'element-plus';
2025-04-07 14:48:04 +08:00
import { currentPage, formRules } from '@/views/login/utils';
2024-09-26 22:05:24 +08:00
const router = useRouter();
const userStore = useUserStore();
const ruleFormRef = ref<FormInstance>();
const loading = ref(false);
const { t } = useI18n();
const ruleForm = reactive({
2025-04-24 13:43:37 +08:00
username: 'bunny',
password: 'admin123',
type: currentPage.value,
2024-09-26 22:05:24 +08:00
});
/**
* 登录
* @param formEl
*/
const onLogin = async (formEl: FormInstance | undefined) => {
2025-04-24 13:43:37 +08:00
if (!formEl) return;
await formEl.validate(async (valid) => {
if (valid) {
loading.value = true;
const result = await userStore.loginByUsername(ruleForm);
2024-09-26 22:05:24 +08:00
2025-04-24 13:43:37 +08:00
if (result) {
// 获取后端路由
await initRouter();
router.push(getTopMenu(true).path).then(() => {
ElMessage.closeAll();
message(t('login.loginSuccess'), { type: 'success' });
});
}
2024-09-26 22:05:24 +08:00
2025-04-24 13:43:37 +08:00
loading.value = false;
}
});
2024-09-26 22:05:24 +08:00
};
/** 使用公共函数,避免`removeEventListener`失效 */
function onkeypress({ code }: KeyboardEvent) {
2025-04-24 13:43:37 +08:00
if (['Enter', 'NumpadEnter'].includes(code)) {
onLogin(ruleFormRef.value);
}
2024-09-26 22:05:24 +08:00
}
onMounted(() => {
2025-04-24 13:43:37 +08:00
window.document.addEventListener('keypress', onkeypress);
2024-09-26 22:05:24 +08:00
});
onBeforeUnmount(() => {
2025-04-24 13:43:37 +08:00
window.document.removeEventListener('keypress', onkeypress);
2024-09-26 22:05:24 +08:00
});
</script>
<template>
2025-04-24 13:43:37 +08:00
<el-form ref="ruleFormRef" :model="ruleForm" :rules="formRules" size="large">
<Motion>
<el-form-item prop="username">
2025-04-28 09:39:28 +08:00
<el-input v-model="ruleForm.username" :placeholder="t('login.username')" :prefix-icon="useRenderIcon(User)" clearable />
2025-04-24 13:43:37 +08:00
</el-form-item>
</Motion>
2024-09-26 22:05:24 +08:00
2025-04-24 13:43:37 +08:00
<Motion :delay="150">
<el-form-item prop="password">
2025-04-28 09:39:28 +08:00
<el-input v-model="ruleForm.password" :placeholder="t('login.password')" :prefix-icon="useRenderIcon(Lock)" clearable show-password />
2025-04-24 13:43:37 +08:00
<el-checkbox v-model="userStore.isRemembered">
2025-05-01 14:37:08 +08:00
<el-text size="small" type="primary">{{ userStore.readMeDay }}天免登录</el-text>
2025-04-24 13:43:37 +08:00
</el-checkbox>
</el-form-item>
</Motion>
2024-09-26 22:05:24 +08:00
2025-04-24 13:43:37 +08:00
<Motion :delay="150">
<el-form-item>
<el-button :loading="loading" class="w-full" size="default" type="primary" @click="onLogin(ruleFormRef)">
{{ t('login.login') }}
</el-button>
</el-form-item>
</Motion>
2024-09-26 22:05:24 +08:00
2025-04-24 13:43:37 +08:00
<!-- 邮箱登录 -->
<Motion :delay="300">
<el-form-item>
<el-button class="w-full" size="default" @click="currentPage = 'email'">邮箱登录</el-button>
</el-form-item>
</Motion>
</el-form>
2024-09-26 22:05:24 +08:00
</template>