Files
xk-client-wx/utils/login.js

222 lines
6.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 登录工具函数
* 抽离登录逻辑,支持静默登录和正常登录
*/
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<Object>} 返回登录结果 { 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.2 绑定推广员(如果存在)
const salId = uni.getStorageSync('sal_id');
if (salId) {
bindUserApi({
user_id: res.data.data.data.user.id,
salesperson_id: salId,
}).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<Object>} 返回登录结果
*/
export async function silentLogin() {
return performLogin({ silent: true });
}