// 统一身份验证工具函数 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) { // 跳转到登录页面,让用户完整完成登录流程 wx.switchTab({ url: '/pages/index/index', success: function() { console.log('成功跳转到登录页面'); }, fail: function(error) { console.error('跳转到登录页面失败:', error); wx.showToast({ title: '跳转失败,请稍后重试', icon: 'none' }); } }); } else if (failCallback) { failCallback(new Error('用户取消登录')); } } }); return; } // 已登录,继续后续处理 this.handlePostLogin(successCallback); }, /** * 执行登录操作 * @param {Object} loginParams - 登录参数 * @param {string} loginParams.encryptedData - 加密的手机号数据 * @param {string} loginParams.iv - 解密向量 * @param {Function} callback - 登录回调 */ doLogin: function(loginParams, callback) { console.log('执行微信登录...'); // 验证必要参数 if (!loginParams || !loginParams.encryptedData || !loginParams.iv) { console.error('登录失败: 缺少必要的加密数据参数'); if (callback) { callback({ success: false, error: '登录失败: 缺少必要的加密数据参数' }); } return; } API.login(loginParams.encryptedData, loginParams.iv) .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() }); } // 登录成功后请求位置授权 this.requestLocationAuth(); }); } else { if (successCallback) { successCallback({ userId, userType, managerId: this.getManagerId() }); } // 登录成功后请求位置授权 this.requestLocationAuth(); } }, /** * 同步客服信息 * @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('登录状态已清理'); }, /** * 请求位置授权 */ requestLocationAuth: function() { console.log('登录成功后请求位置授权'); wx.authorize({ scope: 'scope.userLocation', success() { // 授权成功,获取用户位置 wx.getLocation({ type: 'gcj02', success(res) { const latitude = res.latitude; const longitude = res.longitude; console.log('获取位置成功:', { latitude, longitude }); // 可以将位置信息存储到本地 wx.setStorageSync('userLocation', { latitude, longitude }); }, fail() { console.error('获取位置失败'); } }); }, fail() { // 授权失败,弹出模态框引导用户重新授权 wx.showModal({ title: '需要位置授权', content: '请在设置中开启位置授权,以便我们为您提供相关服务', showCancel: true, cancelText: '取消', confirmText: '去授权', success: (res) => { if (res.confirm) { // 打开设置页面让用户手动开启授权 wx.openSetting({ success: (settingRes) => { if (settingRes.authSetting['scope.userLocation']) { // 用户在设置中开启了位置授权 wx.getLocation({ type: 'gcj02', success(res) { const latitude = res.latitude; const longitude = res.longitude; console.log('获取位置成功:', { latitude, longitude }); // 可以将位置信息存储到本地 wx.setStorageSync('userLocation', { latitude, longitude }); }, fail() { console.error('获取位置失败'); } }); } }, fail: () => { console.error('打开设置失败'); } }); } } }); } }); } }; module.exports = AuthManager;