<template>
<template v-if="getShow">
<LoginFormTitle class="enter-x" />
<div class="enter-x min-w-64 min-h-64">
<QrCode :value="qrCodeUrl" class="enter-x flex justify-center xl:justify-start" :width="280" />
<Divider class="enter-x">{{ scanContent }}</Divider>
<Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
{{ t('sys.login.backSignIn') }}
</Button>
</div>
</template>
</template>
<script lang="ts" setup>
import { computed, onMounted, unref, ref, watch } from 'vue';
import LoginFormTitle from './LoginFormTitle.vue';
import { Button, Divider } from 'ant-design-vue';
import { QrCode } from '/@/components/Qrcode/index';
import { useUserStore } from '/@/store/modules/user';
import { useI18n } from '/@/hooks/web/useI18n';
import { useLoginState, LoginStateEnum } from './useLogin';
import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';
const qrCodeUrl = ref('');
let timer: IntervalHandle;
const { t } = useI18n();
const userStore = useUserStore();
const { handleBackLogin, getLoginState } = useLoginState();
const state = ref('0');
const getShow = computed(() => unref(getLoginState) === LoginStateEnum.QR_CODE);
const scanContent = computed(() => {
return unref(state) === '0' ? t('sys.login.scanSign') : t('sys.login.scanSuccess');
});
//加载二维码信息
function loadQrCode() {
state.value = '0';
getLoginQrcode().then((res) => {
qrCodeUrl.value = res.qrcodeId;
if (res.qrcodeId) {
openTimer(res.qrcodeId);
}
});
}
//监控扫码状态
function watchQrcodeToken(qrcodeId) {
getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {
let token = res.token;
if (token == '-2') {
//二维码过期重新获取
loadQrCode();
clearInterval(timer);
}
//扫码成功
if (res.success) {
state.value = '2';
clearInterval(timer);
setTimeout(() => {
userStore.qrCodeLogin(token);
}, 500);
}
});
}
/** 开启定时器 */
function openTimer(qrcodeId) {
watchQrcodeToken(qrcodeId);
closeTimer();
timer = setInterval(() => {
watchQrcodeToken(qrcodeId);
}, 1500);
}
/** 关闭定时器 */
function closeTimer() {
if (timer) clearInterval(timer);
}
watch(getShow, (v) => {
if (v) {
loadQrCode();
} else {
closeTimer();
}
});
</script>