CEES-manage/src/hooks/system/useThirdLogin.ts

202 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ref, unref } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { useGlobSetting } from '/@/hooks/setting';
import { useMessage } from '/@/hooks/web/useMessage';
import { useUserStore } from '/@/store/modules/user';
import { setThirdCaptcha, getCaptcha } from '/@/api/sys/user';
import { useI18n } from '/@/hooks/web/useI18n';
export function useThirdLogin() {
const { createMessage, notification } = useMessage();
const { t } = useI18n();
const glob = useGlobSetting();
const userStore = useUserStore();
//第三方类型
const thirdType = ref('');
//第三方登录相关信息
const thirdLoginInfo = ref<any>({});
//状态
const thirdLoginState = ref(false);
//绑定手机号弹窗
const bindingPhoneModal = ref(false);
//第三方用户UUID
const thirdUserUuid = ref('');
//提示窗
const thirdConfirmShow = ref(false);
//绑定密码弹窗
const thirdPasswordShow = ref(false);
//绑定密码
const thirdLoginPassword = ref('');
//绑定用户
const thirdLoginUser = ref('');
//加载中
const thirdCreateUserLoding = ref(false);
//绑定手机号
const thirdPhone = ref('');
//验证码
const thirdCaptcha = ref('');
//第三方登录
function onThirdLogin(source) {
let url = `${glob.uploadUrl}/sys/thirdLogin/render/${source}`;
window.open(
url,
`login ${source}`,
'height=500, width=500, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=n o, status=no'
);
thirdType.value = source;
thirdLoginInfo.value = {};
thirdLoginState.value = false;
let receiveMessage = function (event) {
let token = event.data;
if (typeof token === 'string') {
//如果是字符串类型 说明是token信息
if (token === '登录失败') {
createMessage.warning(token);
} else if (token.includes('绑定手机号')) {
bindingPhoneModal.value = true;
let strings = token.split(',');
thirdUserUuid.value = strings[1];
} else {
doThirdLogin(token);
}
} else if (typeof token === 'object') {
//对象类型 说明需要提示是否绑定现有账号
if (token['isObj'] === true) {
thirdConfirmShow.value = true;
thirdLoginInfo.value = { ...token };
}
} else {
createMessage.warning('不识别的信息传递');
}
//update-begin---author:wangshuai---date:2024-02-20---for:【QQYUN-8156】连续登录失败导致失败提醒累加---
window.removeEventListener('message', unref(receiveMessage),false);
//update-end---author:wangshuai---date:2024-02-20---for:【QQYUN-8156】连续登录失败导致失败提醒累加---
};
window.addEventListener('message', receiveMessage, false);
}
// 根据token执行登录
function doThirdLogin(token) {
if (unref(thirdLoginState) === false) {
thirdLoginState.value = true;
userStore.ThirdLogin({ token, thirdType: unref(thirdType) }).then((res) => {
console.log('res====>doThirdLogin', res);
if (res && res.userInfo) {
notification.success({
message: t('sys.login.loginSuccessTitle'),
description: `${t('sys.login.loginSuccessDesc')}: ${res.userInfo.realname}`,
duration: 3,
});
} else {
requestFailed(res);
}
});
}
}
function requestFailed(err) {
notification.error({
message: '登录失败',
description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
duration: 4,
});
}
// 绑定已有账号 需要输入密码
function thirdLoginUserBind() {
thirdLoginPassword.value = '';
thirdLoginUser.value = thirdLoginInfo.value.uuid;
thirdConfirmShow.value = false;
thirdPasswordShow.value = true;
}
//创建新账号
function thirdLoginUserCreate() {
thirdCreateUserLoding.value = true;
// 账号名后面添加两位随机数
thirdLoginInfo.value.suffix = parseInt(Math.random() * 98 + 1);
defHttp
.post({ url: '/sys/third/user/create', params: { thirdLoginInfo: unref(thirdLoginInfo) } }, { isTransformResponse: false })
.then((res) => {
if (res.success) {
let token = res.result;
doThirdLogin(token);
thirdConfirmShow.value = false;
} else {
createMessage.warning(res.message);
}
})
.finally(() => {
thirdCreateUserLoding.value = false;
});
}
// 核实密码
function thirdLoginCheckPassword() {
let params = Object.assign({}, unref(thirdLoginInfo), { password: unref(thirdLoginPassword) });
defHttp.post({ url: '/sys/third/user/checkPassword', params }, { isTransformResponse: false }).then((res) => {
if (res.success) {
thirdLoginNoPassword();
doThirdLogin(res.result);
} else {
createMessage.warning(res.message);
}
});
}
// 没有密码 取消操作
function thirdLoginNoPassword() {
thirdPasswordShow.value = false;
thirdLoginPassword.value = '';
thirdLoginUser.value = '';
}
//倒计时执行前的函数
function sendCodeApi() {
//return setThirdCaptcha({mobile:unref(thirdPhone)});
return getCaptcha({ mobile: unref(thirdPhone), smsmode: '0' });
}
//绑定手机号点击确定按钮
function thirdHandleOk() {
if (!unref(thirdPhone)) {
cmsFailed('请输入手机号');
}
if (!unref(thirdCaptcha)) {
cmsFailed('请输入验证码');
}
let params = {
mobile: unref(thirdPhone),
captcha: unref(thirdCaptcha),
thirdUserUuid: unref(thirdUserUuid),
};
defHttp.post({ url: '/sys/thirdLogin/bindingThirdPhone', params }, { isTransformResponse: false }).then((res) => {
if (res.success) {
bindingPhoneModal.value = false;
doThirdLogin(res.result);
} else {
createMessage.warning(res.message);
}
});
}
function cmsFailed(err) {
notification.error({
message: '登录失败',
description: err,
duration: 4,
});
return;
}
//返回数据和方法
return {
thirdPasswordShow,
thirdLoginCheckPassword,
thirdLoginNoPassword,
thirdLoginPassword,
thirdConfirmShow,
thirdCreateUserLoding,
thirdLoginUserCreate,
thirdLoginUserBind,
bindingPhoneModal,
thirdHandleOk,
thirdPhone,
thirdCaptcha,
onThirdLogin,
sendCodeApi,
};
}