login-form.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <div class="login-form-wrapper">
  3. <div class="login-form-title">{{ $t("login.form.title") }}</div>
  4. <!-- <div class="login-form-sub-title">{{ $t('login.form.title') }}</div>-->
  5. <div class="login-form-error-msg">{{ errorMessage }}</div>
  6. <a-form
  7. ref="loginForm"
  8. :model="userInfo"
  9. class="login-form"
  10. layout="vertical"
  11. @submit="handleSubmit"
  12. >
  13. <a-form-item
  14. field="email"
  15. :rules="[{ required: true, message: '请输入邮箱' }]"
  16. :validate-trigger="['change', 'blur']"
  17. hide-label
  18. >
  19. <a-input v-model="userInfo.email" placeholder="请输入邮箱">
  20. <template #prefix>
  21. <icon-user />
  22. </template>
  23. </a-input>
  24. </a-form-item>
  25. <a-form-item
  26. field="password"
  27. :rules="[{ required: true, message: '请输入密码' }]"
  28. :validate-trigger="['change', 'blur']"
  29. hide-label
  30. >
  31. <a-input-password
  32. v-model="userInfo.password"
  33. placeholder="请输入密码"
  34. allow-clear
  35. >
  36. <template #prefix>
  37. <icon-lock />
  38. </template>
  39. </a-input-password>
  40. </a-form-item>
  41. <a-space :size="16" direction="vertical">
  42. <div class="login-form-password-actions">
  43. <a-checkbox
  44. checked="rememberPassword"
  45. :model-value="loginConfig.rememberPassword"
  46. @change="setRememberPassword as any"
  47. >
  48. {{ $t("login.form.rememberPassword") }}
  49. </a-checkbox>
  50. <a-link>{{ $t("login.form.forgetPassword") }}</a-link>
  51. </div>
  52. <a-button type="primary" html-type="submit" long :loading="loading">
  53. {{ $t("login.form.login") }}
  54. </a-button>
  55. <!-- <a-button type="text" long class="login-form-register-btn">
  56. {{ $t('login.form.register') }}
  57. </a-button> -->
  58. </a-space>
  59. </a-form>
  60. </div>
  61. </template>
  62. <script lang="ts" setup>
  63. import { reactive, ref } from "vue";
  64. import { useRouter } from "vue-router";
  65. import { Message } from "@arco-design/web-vue";
  66. import { ValidatedError } from "@arco-design/web-vue/es/form/interface";
  67. import { useI18n } from "vue-i18n";
  68. import { useStorage } from "@vueuse/core";
  69. import { useUserStore } from "@/store";
  70. import useLoading from "@/hooks/loading";
  71. import type { LoginData } from "@/api/user";
  72. import { rsaPsw } from "@/utils/ras";
  73. const router = useRouter();
  74. const { t } = useI18n();
  75. const errorMessage = ref("");
  76. const { loading, setLoading } = useLoading();
  77. const userStore = useUserStore();
  78. const loginConfig = useStorage("login-config", {
  79. rememberPassword: true,
  80. email: "", // 演示默认值
  81. password: "" // demo default value
  82. });
  83. const userInfo = reactive({
  84. email: "", // 演示默认值
  85. password: "" // demo default value
  86. });
  87. const handleSubmit = async ({
  88. errors,
  89. values
  90. }: {
  91. errors: Record<string, ValidatedError> | undefined;
  92. values: Record<string, any>;
  93. }) => {
  94. if (loading.value) return;
  95. if (!errors) {
  96. setLoading(true);
  97. try {
  98. const rsaPassWord = rsaPsw(values.password) as string;
  99. console.log(values, "登录信息");
  100. let goto = await userStore.login({
  101. email: values.email,
  102. password: rsaPassWord
  103. } as LoginData);
  104. const { redirect, ...othersQuery } = router.currentRoute.value.query;
  105. router.push({
  106. name: goto,
  107. query: {
  108. ...othersQuery
  109. }
  110. });
  111. Message.success(t("登录成功"));
  112. const { rememberPassword } = loginConfig.value;
  113. const { email, password } = values;
  114. // 实际生产环境需要进行加密存储。
  115. // The actual production environment requires encrypted storage.
  116. loginConfig.value.email = rememberPassword ? email : "";
  117. loginConfig.value.password = rememberPassword ? password : "";
  118. } catch (err) {
  119. errorMessage.value = (err as Error).message;
  120. } finally {
  121. setLoading(false);
  122. }
  123. }
  124. };
  125. const setRememberPassword = (value: boolean) => {
  126. loginConfig.value.rememberPassword = value;
  127. };
  128. </script>
  129. <style lang="less" scoped>
  130. .login-form {
  131. &-wrapper {
  132. width: 320px;
  133. }
  134. &-title {
  135. color: var(--color-text-1);
  136. font-weight: 500;
  137. font-size: 24px;
  138. line-height: 32px;
  139. }
  140. &-sub-title {
  141. color: var(--color-text-3);
  142. font-size: 16px;
  143. line-height: 24px;
  144. }
  145. &-error-msg {
  146. height: 32px;
  147. color: rgb(var(--red-6));
  148. line-height: 32px;
  149. }
  150. &-password-actions {
  151. display: flex;
  152. justify-content: space-between;
  153. }
  154. &-register-btn {
  155. color: var(--color-text-3) !important;
  156. }
  157. }
  158. </style>