<template>
<view class="other-login u-f-ac">
<block v-for="(item,index) in providerList" :key="index">
<view class="u-f-ajc u-f1" @tap="tologin(item)">
<view class="icon iconfont u-f-ajc"
:class="['icon-'+item.icon]">
支
</view>
</view>
</block>
<button type="primary" open-type="getUserInfo" @getuserinfo="mpGetUserInfo">微信登录</button>
</view>
</template>
<script>
export default {
props:{
noback:{
type:Boolean,
default:true
}
},
data() {
return {
providerList: []
}
},
onReady() {
this.getLoginAuth();
},
methods:{
mpGetUserInfo(result) {
uni.showLoading({ title: '登录中...', mask: true });
if (result.detail.errMsg !== 'getUserInfo:ok') {
uni.hideLoading();
uni.showModal({
title: '获取用户信息失败',
content: '错误原因' + result.detail.errMsg,
showCancel: false
});
return;
}
let userinfo = result.detail.userInfo;
uni.login({
provider:"weixin",
success: (res) => {
this.MpLogin({
url:"/wxlogin",
code:res.code,
nickName:userinfo.nickName,
avatarUrl:userinfo.avatarUrl
})
},
complete: () => {
uni.hideLoading();
}
})
},
MpLogin(options){
this.$http.post(options.url,{
code:options.code,
nickName:options.nickName,
avatarUrl:options.avatarUrl
}).then(data=>{
let [err2,res2] = data;
if (!this.$http.errorCheck(err2,res2)){
return false;
}
console.log(res2.data.data)
this.User.token = res2.data.data.token;
this.User.userinfo = this.User.__formatUserinfo(res2.data.data);
uni.setStorageSync("userinfo",this.User.userinfo);
uni.setStorageSync("token", this.User.token);
if (this.User.userinfo.id) {
this.User.getCounts();
}
if (this.User.userinfo.id) {
this.$chat.Open();
}
uni.showToast({ title: '登录成功' });
this.$emit('logining')
if (!this.noback) {
uni.navigateBack();
}
});
},
getLoginAuth(){
uni.getProvider({
service: 'oauth',
success: (result) => {
this.providerList = result.provider.map((value) => {
let providerName = '';
let icon='';
switch (value) {
case 'weixin':
providerName = '微信登录';
icon='weixin';
break;
case 'qq':
providerName = 'QQ登录';
icon='QQ';
break;
case 'sinaweibo':
providerName = '新浪微博登录';
icon='xinlangweibo';
break;
case 'alipay':
providerName = '支付宝登录';
icon='changyonglogo30';
break;
}
return {
name: providerName,
icon:icon,
id: value
}
});
},
fail: (error) => {
console.log('获取登录通道失败', error);
}
});
},
tologin(provider) {
uni.login({
provider: provider.id,
scopes: 'auth_user',
success: (res) => {
uni.showLoading({
title: '登陆中...',
mask: false
});
console.log(res)
uni.getUserInfo({
provider:provider.id,
success: (infoRes)=> {
console.log(infoRes)
this.MpLogin({
url:"/alilogin",
code:res.code,
avatarUrl:infoRes.userInfo.avatarUrl,
nickName:infoRes.userInfo.nickName
})
console.log(JSON.stringify(infoRes.userInfo))
let data = this.User.__formatOtherLogin(provider.id,Object.assign(infoRes,res));
this.loginEvent(data);
}
});
console.log('登录成功,保存到本地存储,修改当前用户登录状态')
},
fail: (err) => {
console.log('login fail:', err);
},
complete:()=>{
uni.hideLoading();
}
});
},
async loginEvent(data){
let res = await this.User.login({
url:'/user/otherlogin',
data:data,
Noback:this.noback
});
if (res) {
this.$emit('logining')
}
}
}
}
</script>
<style>
.other-login{
padding: 20upx 80upx;
}
.other-login>view>view{
width: 100upx;
height: 100upx;
border-radius: 100%;
font-size: 55upx!important;
color: #FFFFFF!important;
}
.other-login .icon-QQ{
background: #2CAEFC;
}
.other-login .icon-weixin{
background: #2BD19B;
}
.other-login .icon-xinlangweibo{
background: #FC7729;
}
.other-login .icon-changyonglogo30{
background: #007AFF;
}
</style>