pwd-login.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <script setup lang="ts">
  2. import { computed, onMounted, reactive, ref, watch } from 'vue';
  3. import { Crypto } from '@sa/utils';
  4. import { fetchGetCaptcha } from '@/service/api/common';
  5. import { useAuthStore } from '@/store/modules/auth';
  6. import { useFormRules, useNaiveForm } from '@/hooks/common/form';
  7. import { localStg } from '@/utils/storage';
  8. import { $t } from '@/locales';
  9. defineOptions({
  10. name: 'PwdLogin'
  11. });
  12. const pd = new Crypto<{ data: string }>('zhongshuweilai');
  13. const authStore = useAuthStore();
  14. const { formRef, validate } = useNaiveForm();
  15. const isRememberMe = ref(false);
  16. const imgPath = ref('');
  17. interface FormModel {
  18. userName: string;
  19. password: string;
  20. captchaCode: string;
  21. }
  22. const model: FormModel = reactive({
  23. userName: '',
  24. password: '',
  25. captchaCode: ''
  26. });
  27. onMounted(() => {
  28. const userName = localStg.get('userName');
  29. const password = localStg.get('password');
  30. const obj = pd.decrypt(String(password));
  31. if (userName && password && obj) {
  32. model.userName = userName;
  33. model.password = obj.data;
  34. isRememberMe.value = true;
  35. }
  36. });
  37. const rules = computed<Record<keyof FormModel, App.Global.FormRule[]>>(() => {
  38. // inside computed to make locale reactive, if not apply i18n, you can define it without computed
  39. const { formRules } = useFormRules();
  40. return {
  41. userName: formRules.userName,
  42. password: formRules.pwd,
  43. captchaCode: formRules.captchaCode
  44. };
  45. });
  46. const captchaKey = ref('');
  47. async function handleSubmit() {
  48. await validate();
  49. if (isRememberMe.value) {
  50. const pwd = pd.encrypt({ data: model.password });
  51. localStg.set('userName', model.userName);
  52. localStg.set('password', pwd);
  53. }
  54. await authStore.login({ ...model, captchaKey: captchaKey.value });
  55. }
  56. async function getDataCode() {
  57. const { data } = await fetchGetCaptcha();
  58. imgPath.value = String(data?.captchaBase64);
  59. captchaKey.value = String(data?.captchaId);
  60. model.captchaCode = '';
  61. }
  62. getDataCode();
  63. watch(
  64. () => authStore.loginLoading,
  65. () => {
  66. if (!authStore.loginLoading) {
  67. getDataCode();
  68. }
  69. }
  70. );
  71. </script>
  72. <template>
  73. <NForm ref="formRef" :model="model" :rules="rules" size="large" :show-label="false" @keyup.enter="handleSubmit">
  74. <NFormItem path="userName">
  75. <NInput v-model:value="model.userName" :placeholder="$t('page.login.common.userNamePlaceholder')" />
  76. </NFormItem>
  77. <NFormItem path="password">
  78. <NInput
  79. v-model:value="model.password"
  80. type="password"
  81. show-password-on="click"
  82. :placeholder="$t('page.login.common.passwordPlaceholder')"
  83. />
  84. </NFormItem>
  85. <NFormItem path="imageCode">
  86. <NInput v-model:value="model.captchaCode" placeholder="请输入验证码" />
  87. <img :src="imgPath" alt="" class="ml20px h40px w220px cursor-pointer" @click="getDataCode" />
  88. </NFormItem>
  89. <NSpace vertical :size="24">
  90. <div class="flex-y-center justify-between">
  91. <NCheckbox v-model:checked="isRememberMe">{{ $t('page.login.pwdLogin.rememberMe') }}</NCheckbox>
  92. </div>
  93. <NButton type="primary" size="large" round block :loading="authStore.loginLoading" @click="handleSubmit">
  94. {{ $t('common.confirm') }}
  95. </NButton>
  96. </NSpace>
  97. </NForm>
  98. </template>
  99. <style scoped></style>