202 lines
6.4 KiB
TypeScript
202 lines
6.4 KiB
TypeScript
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,
|
||
};
|
||
}
|