Authored by QC-L

更新登录逻辑,手机号登录页面增加授权逻辑 review by 黄敬囿

... ... @@ -3,6 +3,12 @@ import event from '../../utils/event.js'
const login = new LoginService().yohoApi();
const USER_GET_PHONENUMBER_ERROR = 'user-get-phonenumber-error';
const USER_LOGIN_CALLBACK = 'user-login-callback';
const USER_LOGIN_SUCCESS = 'user-login-success';
const MY_USER_LOGIN_SUCCESS = 'my-user-login-success';
const USER_CHANGE_LOGIN_STATUS = 'change-login-status';
export const loginAction = (callBack) => {
return wx.login({
success(res) {
... ... @@ -74,7 +80,9 @@ export const decodeUnionId = (srd_session, result) => {
throw new Error('union_id is null');
}
// 网络上传头像,union_id,昵称
login.sendWeChatUserDataWithUnionId(data.union_id, nickName, avatarUrl).catch(error => {});
login.sendWeChatUserDataWithUnionId(data.union_id, nickName, avatarUrl).catch(error => {
console.log(error);
});
return {
union_id: union_id,
userInfo: res.userInfo
... ... @@ -111,6 +119,7 @@ export const wechatUserIsBind = (union_id, userInfo) => {
message: '微信用户已绑定手机号'
});
} else {
console.log('login ------------ globalData: ', globalData);
return Promise.resolve({
code: 10004,
message: '微信用户未绑定手机号'
... ... @@ -158,20 +167,29 @@ const isStringEmpty = (str) => {
}
}
const checkEventName = (eventName, fromPage) => {
if (fromPage) {
console.log(fromPage);
return `${fromPage}-${eventName}`;
}
return eventName;
}
export const getUserInfo = (e) => {
const fromPage = e.currentTarget.dataset.from;
if (e.detail.errMsg === 'getUserInfo:ok') {
loginAction((error, loginData) => {
if (error) {
event.emit('user-get-phonenumber-error', e.detail);
event.emit(checkEventName(USER_GET_PHONENUMBER_ERROR, fromPage), error.message);
return;
}
decodeUnionId(loginData.srd_session, e).then(data => {
wechatUserIsBind(data.union_id, data.userInfo).then(message => {
if (message.code === 10003) {
event.emit('user-login-success');
event.emit(checkEventName(USER_LOGIN_SUCCESS, fromPage));
setTimeout(() => {
event.emit('my-user-login-success');
event.emit(MY_USER_LOGIN_SUCCESS);
}, 1000);
wx.showToast({
icon: 'none',
... ... @@ -179,7 +197,7 @@ export const getUserInfo = (e) => {
duration: 3000
});
} else if (message.code === 10004) {
event.emit('change-login-status', {
event.emit(checkEventName(USER_CHANGE_LOGIN_STATUS, fromPage), {
text: '绑定手机号',
tips: '还差一步,绑定手机号码,加入Yoho!Family'
});
... ... @@ -189,25 +207,25 @@ export const getUserInfo = (e) => {
duration: 3000
});
}
event.emit('user-login-callback', message);
event.emit(checkEventName(USER_LOGIN_CALLBACK, fromPage), message);
}).catch(error => {
event.emit('user-login-callback', error);
console.log(error);
event.emit(checkEventName(USER_LOGIN_CALLBACK, fromPage), error);
});
}).catch(error => {
event.emit('user-login-callback', error);
console.log(error);
event.emit(checkEventName(USER_LOGIN_CALLBACK, fromPage), error);
});
});
} else {
loginAction((error, loginAction) => {
if (error) {
event.emit('user-get-phonenumber-error', e.detail);
return;
}
event.emit(checkEventName(USER_GET_PHONENUMBER_ERROR, fromPage), e.detail.errMsg);
});
}
}
export const getPhoneNumber = (e) => {
const fromPage = e.currentTarget.dataset.from;
if (e.detail.errMsg === 'getPhoneNumber:ok') {
const srd_session = wx.getStorageSync('srd_session');
const globalData = getGlobalData();
... ... @@ -223,23 +241,25 @@ export const getPhoneNumber = (e) => {
return login.bindMiniAppByAuto(union_id, phoneNumber, countryCode);
}
throw new Error('手机号获取失败,请重新获取');
}).then(res => {
if (data.data.is_register !== undefined && data.data.is_register === 0) {
}).then(result => {
if (result.is_register !== undefined && result.is_register === 0) {
const newUserInfo = {
is_bind: data.is_bind,
mobile: data.profile,
session_key: data.session_key,
uid: data.uid,
ssouid: data.ssouid,
is_bind: result.is_bind,
mobile: result.profile,
session_key: result.session_key,
uid: result.uid,
ssouid: result.ssouid,
union_id: union_id,
vip: data.vip
vip: result.vip
};
let userInfo = wx.getStorageSync('userInfo');
userInfo = Object.assign(userInfo, newUserInfo);
setStorageWithValueForKey('userInfo', userInfo);
setStorageWithValueForKey('session_key', result.session_key);
event.emit(checkEventName(USER_LOGIN_SUCCESS, fromPage));
setTimeout(() => {
event.emit('my-user-login-success');
event.emit(MY_USER_LOGIN_SUCCESS);
}, 1000);
wx.showToast({
icon: 'none',
... ... @@ -248,15 +268,10 @@ export const getPhoneNumber = (e) => {
});
}
}).catch(error => {
wx.showToast({
icon: 'none',
title: error.message,
duration: 3000
});
event.emit('user-get-phonenumber-error', error);
event.emit(checkEventName(USER_GET_PHONENUMBER_ERROR, fromPage), error.message);
});
} else {
event.emit('user-get-phonenumber-error', e.detail.errMsg);
event.emit(checkEventName(USER_GET_PHONENUMBER_ERROR, fromPage), e.detail.errMsg);
}
}
... ...
... ... @@ -8,6 +8,13 @@ import * as globalData from '../../actions/globalData';
import config from '../../config';
import './index.scss';
import event from '../../utils/event.js'
import { getUserInfo, getPhoneNumber } from '../../libs/login/login.js'
const USER_GET_PHONENUMBER_ERROR = 'user-get-phonenumber-error';
const USER_LOGIN_CALLBACK = 'user-login-callback';
const USER_LOGIN_SUCCESS = 'user-login-success';
const MY_USER_LOGIN_SUCCESS = 'my-user-login-success';
const USER_CHANGE_LOGIN_STATUS = 'change-login-status';
@connect(({ globalData }) => ({
globalData
... ... @@ -42,14 +49,48 @@ export default class Login extends Component {
componentDidMount () {
let wxUnionId = this.props.globalData.userInfo.union_id;
console.log(wxUnionId);
this.setState({
inviteCode: this.$router.params.inviteCode ? this.$router.params.inviteCode : '',
hasUnionID: wxUnionId !== null && wxUnionId !== '' && wxUnionId !== undefined ? true : false
});
this.fetchImageCheckSwitchOn();
this.eventOnAll();
}
addPrefix(prefix, eventName) {
return `${prefix}-${eventName}`;
}
eventOnAll() {
const prefix = 'phonenumber';
event.on(this.addPrefix(prefix, USER_GET_PHONENUMBER_ERROR), (errMsg) => {
if (errMsg === 'getPhoneNumber:fail user deny') {
errMsg = '获取手机号失败,请使用验证码登录';
}
Taro.showToast({
title: errMsg,
duration: 3000,
icon: 'none'
});
});
event.on(this.addPrefix(prefix, USER_LOGIN_CALLBACK), (error) => {
console.log(error);
});
event.on(this.addPrefix(prefix, USER_LOGIN_SUCCESS), () => {
this.redirectAction();
});
event.on(this.addPrefix(prefix, USER_CHANGE_LOGIN_STATUS), (message) => {
console.log(message);
const wxUnionId = this.props.globalData.userInfo.union_id;
let hasUnionID = wxUnionId !== null && wxUnionId !== '' && wxUnionId !== undefined ? true : false;
console.log(wxUnionId);
console.log(hasUnionID);
this.setState({
hasUnionID
})
});
}
initCheckImage() {
let udid = this.props.globalData.udid;
let timeStamp = Date.parse(new Date());
... ... @@ -245,13 +286,22 @@ export default class Login extends Component {
});
}
setTimeout(() => {
console.log('执行了');
event.emit('my-user-login-success');
}, 1000);
}
getUserInfo(e) {
console.log('getUserInfo');
getUserInfo(e);
}
getPhoneNumber(e) {
console.log('getPhoneNumber');
getPhoneNumber(e);
}
render () {
let {tipText, verifyBtnText, countryArea, graphicsCodeElement, graphicsCodeSwitch, graphicsCodeUrl} = this.state;
let { tipText, verifyBtnText, countryArea, graphicsCodeElement, graphicsCodeSwitch, graphicsCodeUrl, hasUnionID } = this.state;
return (
<View className="login-page">
... ... @@ -304,7 +354,7 @@ export default class Login extends Component {
}
<Button onClick={this.bindBtnAction} className={disabledClass ? 'bind-btn disabled' : 'bind-btn'} >完成</Button>
<Button className="verify-btn" open-type="{{hasUnionID?'getPhoneNumber':'getUserInfo'}}" onGetPhoneNumber="getPhoneNumber" onGetUserInfo='getUserInfo'>自动验证</Button>
<Button className="verify-btn" openType={hasUnionID?'getPhoneNumber':'getUserInfo'} onGetPhoneNumber={this.getPhoneNumber} onGetUserInfo={this.getUserInfo} data-from="phonenumber">自动验证</Button>
</View>
)
}
... ...
... ... @@ -31,9 +31,28 @@ Page({
},
getPhonenumberError(error) {
wx.navigateTo({
url: `../login/index`,
})
if (error === 'getPhoneNumber:fail user deny') {
error = '获取手机号失败, 请使用验证码登录';
}
let timeOut = 1000;
if (error === 'getUserInfo:fail auth deny') {
timeOut = 0;
}
setTimeout(() => {
wx.navigateTo({
url: `../login/index`,
})
}, timeOut);
wx.showToast({
title: error,
duration: 3000,
icon: 'none'
});
},
loginCallback(res) {
... ...