123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- <template>
- <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" size="large">
- <el-form-item prop="account">
- <el-input v-model="loginForm.account" placeholder="请输入用户名">
- <template #prefix>
- <el-icon class="el-input__icon">
- <user />
- </el-icon>
- </template>
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input v-model="loginForm.password" type="password" placeholder="请输入密码" show-password autocomplete="new-password">
- <template #prefix>
- <el-icon class="el-input__icon">
- <lock />
- </el-icon>
- </template>
- </el-input>
- </el-form-item>
- </el-form>
- <div class="login-btn">
- <el-button :icon="CircleClose" round size="large" @click="resetForm(loginFormRef)"> 重置 </el-button>
- <el-button :icon="UserFilled" round size="large" type="primary" :loading="loading" @click="login(loginFormRef)">
- 登录
- </el-button>
- </div>
- </template>
- <script setup lang="ts">
- import { ref, reactive, onMounted, onBeforeUnmount } from "vue";
- import { useRouter } from "vue-router";
- import { HOME_URL } from "@/config";
- // import { getTimeState } from "@/utils";
- import { Login } from "@/api/interface";
- import { loginApi } from "@/api/modules/login";
- import { useUserStore } from "@/stores/modules/user";
- import { useTabsStore } from "@/stores/modules/tabs";
- import { useKeepAliveStore } from "@/stores/modules/keepAlive";
- import { initDynamicRouter } from "@/routers/modules/dynamicRouter";
- import { CircleClose, UserFilled } from "@element-plus/icons-vue";
- import type { ElForm } from "element-plus";
- import request from "@/api";
- const router = useRouter();
- const userStore = useUserStore();
- const tabsStore = useTabsStore();
- const keepAliveStore = useKeepAliveStore();
- type FormInstance = InstanceType<typeof ElForm>;
- const loginFormRef = ref<FormInstance>();
- const loginRules = reactive({
- account: [{ required: true, message: "请输入用户名", trigger: "blur" }],
- password: [{ required: true, message: "请输入密码", trigger: "blur" }]
- });
- const loading = ref(false);
- const loginForm = reactive<Login.ReqLoginForm>({
- account: "",
- password: ""
- });
- // login
- const login = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.validate(async valid => {
- if (!valid) return;
- loading.value = true;
- try {
- // 1.执行登录接口
- const { data } = await loginApi({ ...loginForm, password: loginForm.password });
- userStore.setToken(data.token);
- request.get("/archivesService/agency/profile").then(resp => {
- userStore.setUserInfo({ ...resp.data.profile, name: resp.data.profile.nickname });
- });
- // 2.添加动态路由
- await initDynamicRouter();
- // 3.清空 tabs、keepAlive 数据
- tabsStore.setTabs([]);
- keepAliveStore.setKeepAliveName([]);
- // 4.跳转到首页
- router.push(HOME_URL);
- // ElNotification({
- // title: getTimeState(),
- // message: "欢迎登录 Geeker-Admin",
- // type: "success",
- // duration: 3000
- // });
- } finally {
- loading.value = false;
- }
- });
- };
- // resetForm
- const resetForm = (formEl: FormInstance | undefined) => {
- if (!formEl) return;
- formEl.resetFields();
- };
- onMounted(() => {
- // 监听 enter 事件(调用登录)
- document.onkeydown = (e: KeyboardEvent) => {
- if (e.code === "Enter" || e.code === "enter" || e.code === "NumpadEnter") {
- if (loading.value) return;
- login(loginFormRef.value);
- }
- };
- });
- onBeforeUnmount(() => {
- document.onkeydown = null;
- });
- </script>
- <style scoped lang="scss">
- @import "../index";
- </style>
|