| | |
| | | |
| | | import { computed, onMounted, ref } from 'vue'; |
| | | |
| | | import { AuthenticationLogin, Verification, z } from '@vben/common-ui'; |
| | | import { AuthenticationLogin, VbenButton, Verification, z } from '@vben/common-ui'; |
| | | import { isCaptchaEnable, isTenantEnable } from '@vben/hooks'; |
| | | import { SvgWeChatIcon } from '@vben/icons'; |
| | | import { $t } from '@vben/locales'; |
| | | import { useAccessStore } from '@vben/stores'; |
| | | |
| | |
| | | getCaptcha, |
| | | getTenantByWebsite, |
| | | getTenantSimpleList, |
| | | socialAuthRedirect, |
| | | } from '#/api/core/auth'; |
| | | import { useAuthStore } from '#/store'; |
| | | |
| | |
| | | onMounted(() => { |
| | | fetchTenantList(); |
| | | }); |
| | | |
| | | // ========== 企业微信登录 ========== |
| | | |
| | | /** 企业微信的社交类型,对应后端 SocialTypeEnum.WECHAT_ENTERPRISE */ |
| | | const WXCP_SOCIAL_TYPE = 30; |
| | | |
| | | const wxcpLoading = ref(false); |
| | | |
| | | /** |
| | | * 企业微信扫码登录 |
| | | * |
| | | * 流程:取授权地址 -> 整页跳转到企业微信扫码页 -> 扫码后企业微信带 code/state |
| | | * 回跳到 social-login 页面 -> 该页面调用 /system/auth/social-login 换取令牌 |
| | | */ |
| | | async function handleWxcpLogin() { |
| | | try { |
| | | wxcpLoading.value = true; |
| | | // 注意:type 需要先 encode 一次,配合 social-login 页面的 getUrlValue() 使用; |
| | | // 否则企业微信回跳后 type 参数会被吞掉,导致无法识别社交类型 |
| | | const redirectUri = `${location.origin}/auth/social-login?${encodeURIComponent( |
| | | `type=${WXCP_SOCIAL_TYPE}`, |
| | | )}`; |
| | | window.location.href = await socialAuthRedirect( |
| | | WXCP_SOCIAL_TYPE, |
| | | redirectUri, |
| | | ); |
| | | } catch (error) { |
| | | console.error('企业微信登录失败:', error); |
| | | wxcpLoading.value = false; |
| | | } |
| | | } |
| | | |
| | | const formSchema = computed((): VbenFormSchema[] => { |
| | | return [ |
| | |
| | | :show-forget-password="false" |
| | | :show-doc-link="false" |
| | | @submit="handleLogin" |
| | | /> |
| | | > |
| | | <template #third-party-login> |
| | | <div class="mt-4"> |
| | | <div class="mb-4 flex items-center justify-between"> |
| | | <span class="w-[35%] border-b border-input dark:border-gray-600"></span> |
| | | <span class="text-center text-xs text-muted-foreground"> |
| | | 其他登录方式 |
| | | </span> |
| | | <span class="w-[35%] border-b border-input dark:border-gray-600"></span> |
| | | </div> |
| | | <VbenButton |
| | | class="w-full" |
| | | variant="outline" |
| | | :loading="wxcpLoading" |
| | | @click="handleWxcpLogin" |
| | | > |
| | | <SvgWeChatIcon class="mr-2 size-5" /> |
| | | 企业微信登录 |
| | | </VbenButton> |
| | | </div> |
| | | </template> |
| | | </AuthenticationLogin> |
| | | <Verification |
| | | ref="verifyRef" |
| | | v-if="captchaEnable" |