index.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <div v-loading="loading" class="social-callback"></div>
  3. </template>
  4. <script setup lang="ts">
  5. import { login, callback } from '@/api/login';
  6. import { setToken, getToken } from '@/utils/auth';
  7. import { LoginData } from '@/api/types';
  8. const route = useRoute();
  9. const loading = ref(true);
  10. /**
  11. * 接收Route传递的参数
  12. * @param {Object} route.query.
  13. */
  14. const code = route.query.code as string;
  15. const state = route.query.state as string;
  16. const source = route.query.source as string;
  17. const stateJson = JSON.parse(atob(state));
  18. const tenantId = stateJson.tenantId as string ? stateJson.tenantId as string : '000000';
  19. const domain = stateJson.domain as string;
  20. const processResponse = async (res: any) => {
  21. if (res.code !== 200) {
  22. throw new Error(res.msg);
  23. }
  24. if (res.data !== null) {
  25. setToken(res.data.access_token);
  26. }
  27. ElMessage.success(res.msg);
  28. setTimeout(() => {
  29. location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
  30. }, 2000);
  31. };
  32. const handleError = (error: any) => {
  33. ElMessage.error(error.message);
  34. setTimeout(() => {
  35. location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
  36. }, 2000);
  37. };
  38. const callbackByCode = async (data: LoginData) => {
  39. try {
  40. const res = await callback(data);
  41. await processResponse(res);
  42. loading.value = false;
  43. } catch (error) {
  44. handleError(error);
  45. }
  46. };
  47. const loginByCode = async (data: LoginData) => {
  48. try {
  49. const res = await login(data);
  50. await processResponse(res);
  51. loading.value = false;
  52. } catch (error) {
  53. handleError(error);
  54. }
  55. };
  56. const init = async () => {
  57. // 如果域名不相等 则重定向处理
  58. let host = window.location.host;
  59. if (domain !== host) {
  60. let urlFull = new URL(window.location.href);
  61. urlFull.host = domain;
  62. window.location.href = urlFull.toString();
  63. return;
  64. }
  65. const data: LoginData = {
  66. socialCode: code,
  67. socialState: state,
  68. tenantId: tenantId,
  69. source: source,
  70. clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
  71. grantType: 'social'
  72. };
  73. if (!getToken()) {
  74. await loginByCode(data);
  75. } else {
  76. await callbackByCode(data);
  77. }
  78. };
  79. onMounted(() => {
  80. nextTick(() => {
  81. init();
  82. });
  83. });
  84. </script>