You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
4.9 KiB
186 lines
4.9 KiB
// 统一身份验证工具函数
|
|
const API = require('./api.js');
|
|
|
|
/**
|
|
* 统一的身份验证工具
|
|
* 用于在聊天、电话、消息中心等操作前检查用户登录状态
|
|
*/
|
|
const AuthManager = {
|
|
/**
|
|
* 检查用户是否已登录
|
|
* @returns {boolean} 是否已登录
|
|
*/
|
|
isLoggedIn: function() {
|
|
const userInfo = wx.getStorageSync('userInfo');
|
|
const openid = userInfo && userInfo.openid;
|
|
return !!openid;
|
|
},
|
|
|
|
/**
|
|
* 获取当前用户ID
|
|
* @returns {string|null} 用户ID
|
|
*/
|
|
getUserId: function() {
|
|
const userInfo = wx.getStorageSync('userInfo');
|
|
return userInfo && userInfo.userId ? String(userInfo.userId) : null;
|
|
},
|
|
|
|
/**
|
|
* 获取当前用户类型
|
|
* @returns {string} 用户类型
|
|
*/
|
|
getUserType: function() {
|
|
return wx.getStorageSync('userType') || '';
|
|
},
|
|
|
|
/**
|
|
* 判断是否为客服
|
|
* @returns {boolean} 是否为客服
|
|
*/
|
|
isCustomerService: function() {
|
|
const userType = this.getUserType();
|
|
return userType.includes('manager') || userType === 'manager';
|
|
},
|
|
|
|
/**
|
|
* 获取客服managerId
|
|
* @returns {string|null} managerId
|
|
*/
|
|
getManagerId: function() {
|
|
return wx.getStorageSync('managerId') || null;
|
|
},
|
|
|
|
/**
|
|
* 执行统一的身份验证
|
|
* @param {Function} successCallback - 验证成功后的回调
|
|
* @param {Function} failCallback - 验证失败后的回调
|
|
*/
|
|
authenticate: function(successCallback, failCallback) {
|
|
console.log('执行统一身份验证...');
|
|
|
|
// 检查是否已登录
|
|
if (!this.isLoggedIn()) {
|
|
console.log('用户未登录,执行授权登录');
|
|
|
|
// 显示登录模态框
|
|
wx.showModal({
|
|
title: '需要登录',
|
|
content: '请先授权登录后再继续操作',
|
|
showCancel: true,
|
|
cancelText: '取消',
|
|
confirmText: '去登录',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
// 执行登录操作
|
|
this.doLogin((loginRes) => {
|
|
if (loginRes.success) {
|
|
this.handlePostLogin(successCallback);
|
|
} else {
|
|
if (failCallback) {
|
|
failCallback(new Error('登录失败'));
|
|
} else {
|
|
wx.showToast({ title: '登录失败', icon: 'none' });
|
|
}
|
|
}
|
|
});
|
|
} else if (failCallback) {
|
|
failCallback(new Error('用户取消登录'));
|
|
}
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
// 已登录,继续后续处理
|
|
this.handlePostLogin(successCallback);
|
|
},
|
|
|
|
/**
|
|
* 执行登录操作
|
|
* @param {Function} callback - 登录回调
|
|
*/
|
|
doLogin: function(callback) {
|
|
console.log('执行微信登录...');
|
|
|
|
API.login()
|
|
.then(res => {
|
|
if (callback) {
|
|
callback(res);
|
|
}
|
|
})
|
|
.catch(err => {
|
|
console.error('登录失败:', err);
|
|
if (callback) {
|
|
callback({ success: false, error: err.message });
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 登录后的处理逻辑
|
|
* @param {Function} successCallback - 成功回调
|
|
*/
|
|
handlePostLogin: function(successCallback) {
|
|
const userId = this.getUserId();
|
|
const userType = this.getUserType();
|
|
|
|
console.log('登录后信息:', { userId, userType });
|
|
|
|
// 如果是客服,确保有managerId
|
|
if (this.isCustomerService() && !this.getManagerId()) {
|
|
console.warn('客服身份但缺少managerId,尝试重新获取');
|
|
this.syncCustomerServiceInfo(() => {
|
|
if (successCallback) {
|
|
successCallback({ userId, userType, managerId: this.getManagerId() });
|
|
}
|
|
});
|
|
} else {
|
|
if (successCallback) {
|
|
successCallback({ userId, userType, managerId: this.getManagerId() });
|
|
}
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 同步客服信息
|
|
* @param {Function} callback - 完成回调
|
|
*/
|
|
syncCustomerServiceInfo: function(callback) {
|
|
const userInfo = wx.getStorageSync('userInfo');
|
|
const phoneNumber = userInfo && userInfo.phoneNumber;
|
|
|
|
if (!phoneNumber) {
|
|
console.warn('没有手机号,无法同步客服信息');
|
|
if (callback) callback();
|
|
return;
|
|
}
|
|
|
|
// 重新获取managerId
|
|
Promise.all([
|
|
API.checkIfUserIsCustomerService(phoneNumber),
|
|
API.getManagerIdByPhone(phoneNumber)
|
|
]).then(([isCustomerService, managerId]) => {
|
|
if (isCustomerService && managerId) {
|
|
console.log('同步客服信息成功:', { managerId });
|
|
wx.setStorageSync('managerId', managerId);
|
|
}
|
|
if (callback) callback();
|
|
}).catch(err => {
|
|
console.error('同步客服信息失败:', err);
|
|
if (callback) callback();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 清理登录状态
|
|
*/
|
|
clearLoginStatus: function() {
|
|
wx.removeStorageSync('userInfo');
|
|
wx.removeStorageSync('userType');
|
|
wx.removeStorageSync('managerId');
|
|
wx.removeStorageSync('phoneNumber');
|
|
console.log('登录状态已清理');
|
|
}
|
|
};
|
|
|
|
module.exports = AuthManager;
|
|
|