QrCodeForm.vue 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <template v-if="getShow">
  3. <LoginFormTitle class="enter-x" />
  4. <div class="enter-x min-w-64 min-h-64">
  5. <QrCode :value="qrCodeUrl" class="enter-x flex justify-center xl:justify-start" :width="280" />
  6. <Divider class="enter-x">{{ scanContent }}</Divider>
  7. <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
  8. {{ t('sys.login.backSignIn') }}
  9. </Button>
  10. </div>
  11. </template>
  12. </template>
  13. <script lang="ts" setup>
  14. import { computed, onMounted, unref, ref, watch } from 'vue';
  15. import LoginFormTitle from './LoginFormTitle.vue';
  16. import { Button, Divider } from 'ant-design-vue';
  17. import { QrCode } from '/@/components/Qrcode/index';
  18. import { useUserStore } from '/@/store/modules/user';
  19. import { useI18n } from '/@/hooks/web/useI18n';
  20. import { useLoginState, LoginStateEnum } from './useLogin';
  21. import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';
  22. const qrCodeUrl = ref('');
  23. let timer: IntervalHandle;
  24. const { t } = useI18n();
  25. const userStore = useUserStore();
  26. const { handleBackLogin, getLoginState } = useLoginState();
  27. const state = ref('0');
  28. const getShow = computed(() => unref(getLoginState) === LoginStateEnum.QR_CODE);
  29. const scanContent = computed(() => {
  30. return unref(state) === '0' ? t('sys.login.scanSign') : t('sys.login.scanSuccess');
  31. });
  32. //加载二维码信息
  33. function loadQrCode() {
  34. state.value = '0';
  35. getLoginQrcode().then((res) => {
  36. qrCodeUrl.value = res.qrcodeId;
  37. if (res.qrcodeId) {
  38. openTimer(res.qrcodeId);
  39. }
  40. });
  41. }
  42. //监控扫码状态
  43. function watchQrcodeToken(qrcodeId) {
  44. getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {
  45. let token = res.token;
  46. if (token == '-2') {
  47. //二维码过期重新获取
  48. loadQrCode();
  49. clearInterval(timer);
  50. }
  51. //扫码成功
  52. if (res.success) {
  53. state.value = '2';
  54. clearInterval(timer);
  55. setTimeout(() => {
  56. userStore.qrCodeLogin(token);
  57. }, 500);
  58. }
  59. });
  60. }
  61. /** 开启定时器 */
  62. function openTimer(qrcodeId) {
  63. watchQrcodeToken(qrcodeId);
  64. closeTimer();
  65. timer = setInterval(() => {
  66. watchQrcodeToken(qrcodeId);
  67. }, 1500);
  68. }
  69. /** 关闭定时器 */
  70. function closeTimer() {
  71. if (timer) clearInterval(timer);
  72. }
  73. watch(getShow, (v) => {
  74. if (v) {
  75. loadQrCode();
  76. } else {
  77. closeTimer();
  78. }
  79. });
  80. </script>