LoginForm.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <template>
  2. <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" size="large">
  3. <el-form-item prop="account">
  4. <el-input v-model="loginForm.account" placeholder="请输入用户名">
  5. <template #prefix>
  6. <el-icon class="el-input__icon">
  7. <user />
  8. </el-icon>
  9. </template>
  10. </el-input>
  11. </el-form-item>
  12. <el-form-item prop="password">
  13. <el-input v-model="loginForm.password" type="password" placeholder="请输入密码" show-password autocomplete="new-password">
  14. <template #prefix>
  15. <el-icon class="el-input__icon">
  16. <lock />
  17. </el-icon>
  18. </template>
  19. </el-input>
  20. </el-form-item>
  21. </el-form>
  22. <div class="login-btn">
  23. <el-button :icon="CircleClose" round size="large" @click="resetForm(loginFormRef)"> 重置 </el-button>
  24. <el-button :icon="UserFilled" round size="large" type="primary" :loading="loading" @click="login(loginFormRef)">
  25. 登录
  26. </el-button>
  27. </div>
  28. </template>
  29. <script setup lang="ts">
  30. import { ref, reactive, onMounted, onBeforeUnmount } from "vue";
  31. import { useRouter } from "vue-router";
  32. import { HOME_URL } from "@/config";
  33. // import { getTimeState } from "@/utils";
  34. import { Login } from "@/api/interface";
  35. import { loginApi } from "@/api/modules/login";
  36. import { useUserStore } from "@/stores/modules/user";
  37. import { useTabsStore } from "@/stores/modules/tabs";
  38. import { useKeepAliveStore } from "@/stores/modules/keepAlive";
  39. import { initDynamicRouter } from "@/routers/modules/dynamicRouter";
  40. import { CircleClose, UserFilled } from "@element-plus/icons-vue";
  41. import type { ElForm } from "element-plus";
  42. import request from "@/api";
  43. const router = useRouter();
  44. const userStore = useUserStore();
  45. const tabsStore = useTabsStore();
  46. const keepAliveStore = useKeepAliveStore();
  47. type FormInstance = InstanceType<typeof ElForm>;
  48. const loginFormRef = ref<FormInstance>();
  49. const loginRules = reactive({
  50. account: [{ required: true, message: "请输入用户名", trigger: "blur" }],
  51. password: [{ required: true, message: "请输入密码", trigger: "blur" }]
  52. });
  53. const loading = ref(false);
  54. const loginForm = reactive<Login.ReqLoginForm>({
  55. account: "",
  56. password: ""
  57. });
  58. // login
  59. const login = (formEl: FormInstance | undefined) => {
  60. if (!formEl) return;
  61. formEl.validate(async valid => {
  62. if (!valid) return;
  63. loading.value = true;
  64. try {
  65. // 1.执行登录接口
  66. const { data } = await loginApi({ ...loginForm, password: loginForm.password });
  67. userStore.setToken(data.token);
  68. request.get("/archivesService/agency/profile").then(resp => {
  69. userStore.setUserInfo({ ...resp.data.profile, name: resp.data.profile.nickname });
  70. });
  71. // 2.添加动态路由
  72. await initDynamicRouter();
  73. // 3.清空 tabs、keepAlive 数据
  74. tabsStore.setTabs([]);
  75. keepAliveStore.setKeepAliveName([]);
  76. // 4.跳转到首页
  77. router.push(HOME_URL);
  78. // ElNotification({
  79. // title: getTimeState(),
  80. // message: "欢迎登录 Geeker-Admin",
  81. // type: "success",
  82. // duration: 3000
  83. // });
  84. } finally {
  85. loading.value = false;
  86. }
  87. });
  88. };
  89. // resetForm
  90. const resetForm = (formEl: FormInstance | undefined) => {
  91. if (!formEl) return;
  92. formEl.resetFields();
  93. };
  94. onMounted(() => {
  95. // 监听 enter 事件(调用登录)
  96. document.onkeydown = (e: KeyboardEvent) => {
  97. if (e.code === "Enter" || e.code === "enter" || e.code === "NumpadEnter") {
  98. if (loading.value) return;
  99. login(loginFormRef.value);
  100. }
  101. };
  102. });
  103. onBeforeUnmount(() => {
  104. document.onkeydown = null;
  105. });
  106. </script>
  107. <style scoped lang="scss">
  108. @import "../index";
  109. </style>