mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
236 lines
8.4 KiB
Vue
236 lines
8.4 KiB
Vue
<script setup>
|
||
import { onLaunch, onShow, onError } from '@dcloudio/uni-app';
|
||
import { ShoproInit } from './sheep';
|
||
import sheep from '@/sheep';
|
||
|
||
// 防止重复登录的标志
|
||
let isLoggingIn = false;
|
||
|
||
onLaunch(() => {
|
||
console.log('[App] 应用启动...');
|
||
|
||
// 隐藏原生导航栏 使用自定义底部导航
|
||
uni.hideTabBar({
|
||
fail: () => {},
|
||
});
|
||
|
||
// 加载Shopro底层依赖
|
||
ShoproInit();
|
||
|
||
// 检测建行生活登录参数
|
||
checkCCBLogin();
|
||
});
|
||
|
||
onError((err) => {
|
||
console.log('AppOnError:', err);
|
||
});
|
||
|
||
onShow(() => {
|
||
// #ifdef APP-PLUS
|
||
// 获取urlSchemes参数
|
||
const args = plus.runtime.arguments;
|
||
if (args) {
|
||
}
|
||
|
||
// 获取剪贴板
|
||
uni.getClipboardData({
|
||
success: (res) => {},
|
||
});
|
||
// #endif
|
||
});
|
||
|
||
/**
|
||
* 检测URL中的建行登录参数并自动登录
|
||
* 建行跳转URL格式:url?platform=ccblife&channel=mbs&ccbParamSJ=xxx&CITYID=330100&USERCITYID=440100
|
||
*
|
||
* 逻辑:
|
||
* 1. 解析URL参数获取ccbParamSJ
|
||
* 2. 与本地存储的lastCcbParamSJ比较
|
||
* 3. 如果一致则无需重新登录
|
||
* 4. 如果不一致则需要切换用户(退出当前用户后重新登录)
|
||
*/
|
||
const checkCCBLogin = () => {
|
||
// #ifdef H5
|
||
console.log('[App] ========== 开始检测建行登录参数 ==========');
|
||
console.log('[App] 完整URL:', window.location.href);
|
||
console.log('[App] search:', window.location.search);
|
||
|
||
try {
|
||
let ccbParamSJ = null;
|
||
let platform = null;
|
||
let cityid = null;
|
||
|
||
// 优先从search中提取参数(建行标准格式:url?platform=ccblife&ccbParamSJ=xxx)
|
||
if (window.location.search) {
|
||
const urlParams = new URLSearchParams(window.location.search);
|
||
ccbParamSJ = urlParams.get('ccbParamSJ');
|
||
platform = urlParams.get('platform');
|
||
cityid = urlParams.get('CITYID') || urlParams.get('cityid');
|
||
console.log('[App] 从search中解析参数');
|
||
}
|
||
|
||
// 备用:从hash中提取参数(UniApp内部跳转可能使用)
|
||
if (!ccbParamSJ && window.location.hash.includes('?')) {
|
||
const hashParts = window.location.hash.split('?');
|
||
if (hashParts.length > 1) {
|
||
const hashParams = new URLSearchParams(hashParts[1]);
|
||
ccbParamSJ = hashParams.get('ccbParamSJ');
|
||
platform = hashParams.get('platform');
|
||
cityid = hashParams.get('CITYID') || hashParams.get('cityid');
|
||
console.log('[App] 从hash中解析参数');
|
||
}
|
||
}
|
||
|
||
console.log('[App] ====== 参数解析结果 ======');
|
||
console.log('[App] platform:', platform);
|
||
console.log('[App] CITYID:', cityid);
|
||
console.log('[App] 当前ccbParamSJ:', ccbParamSJ ? ccbParamSJ.substring(0, 50) + '...' : 'null');
|
||
|
||
// 获取上次保存的ccbParamSJ
|
||
const lastCcbParamSJ = uni.getStorageSync('lastCcbParamSJ') || null;
|
||
console.log('[App] 上次ccbParamSJ:', lastCcbParamSJ ? lastCcbParamSJ.substring(0, 50) + '...' : 'null');
|
||
|
||
// 判断参数是否变化
|
||
const isParamChanged = ccbParamSJ && (lastCcbParamSJ !== ccbParamSJ);
|
||
const isFirstTime = ccbParamSJ && !lastCcbParamSJ;
|
||
|
||
console.log('[App] 是否首次登录:', isFirstTime);
|
||
console.log('[App] 参数是否变化:', isParamChanged);
|
||
console.log('[App] ===========================');
|
||
|
||
// 如果有建行参数
|
||
if (ccbParamSJ && platform === 'ccblife') {
|
||
|
||
// 如果参数未变化,无需重新登录
|
||
if (!isParamChanged && !isFirstTime) {
|
||
console.log('[App] ℹ️ ccbParamSJ未变化,无需重新登录,跳过');
|
||
// 清除URL参数
|
||
const cleanUrl = window.location.origin + window.location.pathname + '#/pages/index/index';
|
||
window.history.replaceState({}, '', cleanUrl);
|
||
console.log('[App] ========== 检测完成 ==========');
|
||
return;
|
||
}
|
||
|
||
// 参数变化了,需要切换用户
|
||
if (isParamChanged) {
|
||
console.log('[App] 🔄🔄🔄 检测到ccbParamSJ变化,需要切换用户!');
|
||
} else {
|
||
console.log('[App] 🆕 首次登录');
|
||
}
|
||
|
||
// 🔒 防止重复调用:检查是否正在登录中
|
||
if (isLoggingIn) {
|
||
console.log('[App] ⚠️ 已有登录流程正在执行,跳过重复调用');
|
||
return;
|
||
}
|
||
|
||
// 设置登录中标志
|
||
isLoggingIn = true;
|
||
console.log('[App] 🔒 设置登录锁定标志');
|
||
|
||
// 延迟执行登录,确保依赖已初始化
|
||
setTimeout(async () => {
|
||
try {
|
||
console.log('[App] 开始执行登录流程...');
|
||
|
||
// 如果是切换用户,先退出当前用户
|
||
const userStore = sheep.$store('user');
|
||
if (isParamChanged && userStore && userStore.isLogin) {
|
||
console.log('[App] 退出当前用户,准备切换...');
|
||
await userStore.logout();
|
||
uni.removeStorageSync('token');
|
||
uni.removeStorageSync('userInfo');
|
||
console.log('[App] 当前用户已退出');
|
||
}
|
||
|
||
// 显示loading
|
||
const loadingTitle = isParamChanged ? '切换用户中...' : '建行登录中...';
|
||
uni.showLoading({
|
||
title: loadingTitle,
|
||
mask: true
|
||
});
|
||
|
||
// 调用建行登录API(只传三个参数)
|
||
console.log('[App] 调用登录API,参数:', {
|
||
ccbParamSJ: ccbParamSJ.substring(0, 30) + '...',
|
||
cityid: cityid || '360100',
|
||
CITYID: cityid || '360100'
|
||
});
|
||
|
||
const result = await sheep.$api.third.ccbLogin({
|
||
ccbParamSJ: ccbParamSJ,
|
||
cityid: cityid || '360100',
|
||
CITYID: cityid || '360100'
|
||
});
|
||
|
||
console.log('[App] 登录API返回:', result);
|
||
|
||
uni.hideLoading();
|
||
|
||
if (result.code === 1) {
|
||
console.log('[App] ✅✅✅ 建行登录成功!');
|
||
console.log('[App] Token:', result.data.token?.substring(0, 20) + '...');
|
||
console.log('[App] 用户信息:', result.data.user_info);
|
||
|
||
// 设置token和用户信息
|
||
sheep.$store('user').setToken(result.data.token);
|
||
uni.setStorageSync('userInfo', result.data.user_info);
|
||
|
||
// 🔑 关键:保存当前的ccbParamSJ到本地存储
|
||
uni.setStorageSync('lastCcbParamSJ', ccbParamSJ);
|
||
console.log('[App] ✅ 已保存ccbParamSJ到本地存储');
|
||
|
||
// 显示欢迎提示
|
||
uni.showToast({
|
||
title: `登录成功`,
|
||
icon: 'success',
|
||
duration: 2000
|
||
});
|
||
|
||
// 清除URL中的敏感参数,保留干净的URL
|
||
const cleanUrl = window.location.origin + window.location.pathname + '#/pages/index/index';
|
||
window.history.replaceState({}, '', cleanUrl);
|
||
console.log('[App] URL参数已清除');
|
||
|
||
} else {
|
||
throw new Error(result.msg || '登录失败');
|
||
}
|
||
} catch (error) {
|
||
console.error('[App] ❌❌❌ 建行登录失败:', error);
|
||
uni.hideLoading();
|
||
|
||
uni.showModal({
|
||
title: isParamChanged ? '切换用户失败' : '登录失败',
|
||
content: error.message || error.msg || '请检查网络连接',
|
||
showCancel: false,
|
||
complete: () => {
|
||
// 登录失败后也清除URL参数
|
||
const cleanUrl = window.location.origin + window.location.pathname + '#/pages/index/index';
|
||
window.history.replaceState({}, '', cleanUrl);
|
||
}
|
||
});
|
||
} finally {
|
||
// 🔓 无论成功失败,都释放登录锁
|
||
isLoggingIn = false;
|
||
console.log('[App] 🔓 释放登录锁定标志');
|
||
}
|
||
}, 1200); // 延迟1200ms,确保Shopro和API已加载完成
|
||
} else {
|
||
console.log('[App] ℹ️ 未检测到建行登录参数');
|
||
if (ccbParamSJ && platform !== 'ccblife') {
|
||
console.warn('[App] ⚠️ 发现ccbParamSJ但platform不是ccblife:', platform);
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.error('[App] ❌ 参数解析错误:', error);
|
||
}
|
||
console.log('[App] ========== 检测完成 ==========');
|
||
// #endif
|
||
};
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
@import '@/sheep/scss/index.scss';
|
||
</style>
|
||
|