MiniCodelogin.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div class="aui-content">
  3. <div class="aui-container">
  4. <div class="aui-form">
  5. <div class="aui-image">
  6. <div class="aui-image-text">
  7. <img :src="adTextImg" alt="" />
  8. </div>
  9. </div>
  10. <div class="aui-formBox aui-formEwm">
  11. <div class="aui-formWell">
  12. <form>
  13. <div class="aui-flex aui-form-nav investment_title" style="padding-bottom: 19px">
  14. <div class="aui-flex-box activeNav">{{t('sys.login.qrSignInFormTitle')}}</div>
  15. </div>
  16. <div class="aui-form-box">
  17. <div class="aui-account" style="padding: 30px 0">
  18. <div class="aui-ewm">
  19. <QrCode :value="qrCodeUrl" class="enter-x flex justify-center xl:justify-start" :width="280" />
  20. </div>
  21. </div>
  22. </div>
  23. <div class="aui-formButton">
  24. <a class="aui-linek-code aui-link-register" @click="goBackHandleClick">{{t('sys.login.backSignIn')}}</a>
  25. </div>
  26. </form>
  27. </div>
  28. <div class="aui-flex aui-third-text">
  29. <div class="aui-flex-box aui-third-border">
  30. <span>{{ t('sys.login.otherSignIn') }}</span>
  31. </div>
  32. </div>
  33. <div class="aui-flex" :class="`${prefixCls}-sign-in-way`">
  34. <div class="aui-flex-box">
  35. <div class="aui-third-login">
  36. <a href="" title="github" @click="onThirdLogin('github')"><GithubFilled /></a>
  37. </div>
  38. </div>
  39. <div class="aui-flex-box">
  40. <div class="aui-third-login">
  41. <a href="" title="企业微信" @click="onThirdLogin('wechat_enterprise')"><icon-font class="item-icon" type="icon-qiyeweixin3" /></a>
  42. </div>
  43. </div>
  44. <div class="aui-flex-box">
  45. <div class="aui-third-login">
  46. <a href="" title="钉钉" @click="onThirdLogin('dingtalk')"><DingtalkCircleFilled /></a>
  47. </div>
  48. </div>
  49. <div class="aui-flex-box">
  50. <div class="aui-third-login">
  51. <a href="" title="微信" @click="onThirdLogin('wechat_open')"><WechatFilled /></a>
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. <!-- 第三方登录相关弹框 -->
  60. <ThirdModal ref="thirdModalRef"></ThirdModal>
  61. </template>
  62. <script lang="ts" setup name="mini-code-login">
  63. import { ref, onUnmounted } from 'vue';
  64. import { getLoginQrcode, getQrcodeToken } from '/@/api/sys/user';
  65. import { useUserStore } from '/@/store/modules/user';
  66. import { QrCode } from '/@/components/Qrcode/index';
  67. import ThirdModal from '/@/views/sys/login/ThirdModal.vue';
  68. import logoImg from '/@/assets/loginmini/icon/jeecg_logo.png';
  69. import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png';
  70. import { useI18n } from '/@/hooks/web/useI18n';
  71. import { useDesign } from "/@/hooks/web/useDesign";
  72. import { GithubFilled, WechatFilled, DingtalkCircleFilled, createFromIconfontCN } from '@ant-design/icons-vue';
  73. const IconFont = createFromIconfontCN({
  74. scriptUrl: '//at.alicdn.com/t/font_2316098_umqusozousr.js',
  75. });
  76. const { prefixCls } = useDesign('minilogin');
  77. const { t } = useI18n();
  78. const qrCodeUrl = ref<string>('');
  79. let timer: IntervalHandle;
  80. const state = ref('0');
  81. const thirdModalRef = ref();
  82. const userStore = useUserStore();
  83. const emit = defineEmits(['go-back', 'success', 'register']);
  84. //加载二维码信息
  85. function loadQrCode() {
  86. state.value = '0';
  87. getLoginQrcode().then((res) => {
  88. qrCodeUrl.value = res.qrcodeId;
  89. if (res.qrcodeId) {
  90. openTimer(res.qrcodeId);
  91. }
  92. });
  93. }
  94. //监控扫码状态
  95. function watchQrcodeToken(qrcodeId) {
  96. getQrcodeToken({ qrcodeId: qrcodeId }).then((res) => {
  97. let token = res.token;
  98. if (token == '-2') {
  99. //二维码过期重新获取
  100. loadQrCode();
  101. clearInterval(timer);
  102. }
  103. //扫码成功
  104. if (res.success) {
  105. state.value = '2';
  106. clearInterval(timer);
  107. setTimeout(() => {
  108. userStore.qrCodeLogin(token);
  109. }, 500);
  110. }
  111. });
  112. }
  113. /** 开启定时器 */
  114. function openTimer(qrcodeId) {
  115. watchQrcodeToken(qrcodeId);
  116. closeTimer();
  117. timer = setInterval(() => {
  118. watchQrcodeToken(qrcodeId);
  119. }, 1500);
  120. }
  121. /** 关闭定时器 */
  122. function closeTimer() {
  123. if (timer) clearInterval(timer);
  124. }
  125. /**
  126. * 第三方登录
  127. * @param type
  128. */
  129. function onThirdLogin(type) {
  130. thirdModalRef.value.onThirdLogin(type);
  131. }
  132. /**
  133. * 初始化表单
  134. */
  135. function initFrom() {
  136. loadQrCode();
  137. }
  138. /**
  139. * 返回
  140. */
  141. function goBackHandleClick() {
  142. emit('go-back');
  143. closeTimer();
  144. }
  145. onUnmounted(() => {
  146. closeTimer();
  147. });
  148. defineExpose({
  149. initFrom,
  150. });
  151. </script>
  152. <style lang="less" scoped>
  153. @import '/@/assets/loginmini/style/home.less';
  154. @import '/@/assets/loginmini/style/base.less';
  155. </style>