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('不识别的信息传递');
|
}
|
};
|
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,
|
};
|
}
|