/** * 登录工具函数 * 抽离登录逻辑,支持静默登录和正常登录 */ import { getsLogin } from '@/request/api/api.js'; import { bindUserApi } from '@/request/api/salesperson'; import { storeChange } from '@/request/api/api.js'; import { clearGuestMode, getRedirectInfo, clearRedirectInfo, buildUrlWithParams } from '@/common/utils/auth.js'; import { webSocketManager } from '@/utils/ws/websocket.js'; /** * 执行登录流程 * @param {Object} options - 配置选项 * @param {boolean} options.silent - 是否静默模式 * - true: 静默登录(不显示提示,不跳转) * - false: 正常登录(显示提示,执行跳转) * @param {Object} options.toastRef - Toast 引用(正常登录时用于显示错误提示) * @returns {Promise} 返回登录结果 { success: boolean, data: Object, message: string } */ export async function performLogin(options = { silent: false, toastRef: null }) { const { silent = false, toastRef = null } = options; try { // 步骤 1:显示加载提示(仅非静默模式) if (!silent) { uni.showLoading({ title: "登录中" }); } // 步骤 2:获取微信登录凭证 const loginRes = await new Promise((resolve, reject) => { uni.login({ provider: 'weixin', success: resolve, fail: reject }); }); const code = loginRes.code; // 步骤 3:调用登录接口 const res = await getsLogin({ method: "post", data: { code: code, status: 1 } }); // 步骤 4:隐藏加载提示(仅非静默模式) if (!silent) { uni.hideLoading(); } // 步骤 5:处理登录结果 if (res.data.errcode == 0) { // 登录成功 // 5.1 存储用户信息 uni.setStorageSync('token', res.data.data.token); uni.setStorageSync('user_id', res.data.data.data.user.id); uni.setStorageSync('userinfo', res.data.data.data['user']); // 5.2 绑定推广员(如果存在) const salespersonId = uni.getStorageSync('salesperson_id'); if (salespersonId) { bindUserApi({ user_id: res.data.data.data.user.id, salesperson_id: salespersonId, }).then((bindRes) => { console.log(bindRes, 'bindUserApi', bindRes); }).catch((err) => { console.error('绑定推广员失败:', err); }); } // 5.3 处理门店切换/设置 const storeId = uni.getStorageSync('store_id'); if (storeId) { storeChange({ method: "post", data: { store_id: storeId } }).catch((err) => { console.error('切换门店失败:', err); }); } else { uni.setStorageSync('store_id', res.data.data.data.store_id); } // 5.4 清除 Guest 模式标记 clearGuestMode(); // 5.5 重新绑定 WebSocket(登录成功后) try { webSocketManager.rebindUser(); } catch (error) { console.error('重新绑定 WebSocket 失败:', error); } // 5.6 页面跳转(仅非静默模式) if (!silent) { const redirectInfo = getRedirectInfo(); const userMobile = res.data.data.data.user.mobile; if (userMobile != '') { setTimeout(() => { if (redirectInfo) { // 有跳转信息,跳转回原页面 clearRedirectInfo(); const redirectUrl = buildUrlWithParams(redirectInfo.path, redirectInfo.params); uni.navigateTo({ url: redirectUrl, fail: () => { // 如果跳转失败,使用redirectTo uni.redirectTo({ url: redirectUrl }); } }); } else { // 没有跳转信息,跳转到首页 uni.reLaunch({ url: '/pages/home/home' }); } }, 500); } } return { success: true, data: res.data.data, message: '登录成功' }; } else { // 登录失败 const errorMsg = res.data.msg || '登录失败'; // 显示错误提示(仅非静默模式) if (!silent && toastRef) { toastRef.show({ title: errorMsg, type: 'default', icon: false }); } else if (!silent) { // 如果没有 toastRef,使用 uni.showToast uni.showToast({ title: errorMsg, icon: 'none', duration: 2000 }); } else { // 静默模式:仅记录日志 console.error('静默登录失败:', errorMsg); } return { success: false, data: null, message: errorMsg }; } } catch (error) { // 处理异常 const errorMsg = error.message || '登录过程发生错误'; // 隐藏加载提示(仅非静默模式) if (!silent) { uni.hideLoading(); } // 显示错误提示(仅非静默模式) if (!silent && toastRef) { toastRef.show({ title: errorMsg, type: 'default', icon: false }); } else if (!silent) { uni.showToast({ title: errorMsg, icon: 'none', duration: 2000 }); } else { // 静默模式:仅记录日志 console.error('静默登录异常:', error); } return { success: false, data: null, message: errorMsg }; } } /** * 静默登录(便捷方法) * @returns {Promise} 返回登录结果 */ export async function silentLogin() { return performLogin({ silent: true }); }