| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <script setup lang="ts">
- import { computed, onMounted, reactive, ref, watch } from 'vue';
- import { Crypto } from '@sa/utils';
- import { fetchGetCaptcha } from '@/service/api/common';
- import { useAuthStore } from '@/store/modules/auth';
- import { useFormRules, useNaiveForm } from '@/hooks/common/form';
- import { localStg } from '@/utils/storage';
- import { $t } from '@/locales';
- defineOptions({
- name: 'PwdLogin'
- });
- const pd = new Crypto<{ data: string }>('zhongshuweilai');
- const authStore = useAuthStore();
- const { formRef, validate } = useNaiveForm();
- const isRememberMe = ref(false);
- const imgPath = ref('');
- interface FormModel {
- userName: string;
- password: string;
- captchaCode: string;
- }
- const model: FormModel = reactive({
- userName: '',
- password: '',
- captchaCode: ''
- });
- onMounted(() => {
- const userName = localStg.get('userName');
- const password = localStg.get('password');
- const obj = pd.decrypt(String(password));
- if (userName && password && obj) {
- model.userName = userName;
- model.password = obj.data;
- isRememberMe.value = true;
- }
- });
- const rules = computed<Record<keyof FormModel, App.Global.FormRule[]>>(() => {
- // inside computed to make locale reactive, if not apply i18n, you can define it without computed
- const { formRules } = useFormRules();
- return {
- userName: formRules.userName,
- password: formRules.pwd,
- captchaCode: formRules.captchaCode
- };
- });
- const captchaKey = ref('');
- async function handleSubmit() {
- await validate();
- if (isRememberMe.value) {
- const pwd = pd.encrypt({ data: model.password });
- localStg.set('userName', model.userName);
- localStg.set('password', pwd);
- }
- await authStore.login({ ...model, captchaKey: captchaKey.value });
- }
- async function getDataCode() {
- const { data } = await fetchGetCaptcha();
- imgPath.value = String(data?.captchaBase64);
- captchaKey.value = String(data?.captchaId);
- model.captchaCode = '';
- }
- getDataCode();
- watch(
- () => authStore.loginLoading,
- () => {
- if (!authStore.loginLoading) {
- getDataCode();
- }
- }
- );
- </script>
- <template>
- <NForm ref="formRef" :model="model" :rules="rules" size="large" :show-label="false" @keyup.enter="handleSubmit">
- <NFormItem path="userName">
- <NInput v-model:value="model.userName" :placeholder="$t('page.login.common.userNamePlaceholder')" />
- </NFormItem>
- <NFormItem path="password">
- <NInput
- v-model:value="model.password"
- type="password"
- show-password-on="click"
- :placeholder="$t('page.login.common.passwordPlaceholder')"
- />
- </NFormItem>
- <NFormItem path="imageCode">
- <NInput v-model:value="model.captchaCode" placeholder="请输入验证码" />
- <img :src="imgPath" alt="" class="ml20px h40px w220px cursor-pointer" @click="getDataCode" />
- </NFormItem>
- <NSpace vertical :size="24">
- <div class="flex-y-center justify-between">
- <NCheckbox v-model:checked="isRememberMe">{{ $t('page.login.pwdLogin.rememberMe') }}</NCheckbox>
- </div>
- <NButton type="primary" size="large" round block :loading="authStore.loginLoading" @click="handleSubmit">
- {{ $t('common.confirm') }}
- </NButton>
- </NSpace>
- </NForm>
- </template>
- <style scoped></style>
|