2025-10-16 21:07:43 +08:00
|
|
|
|
<script setup>
|
|
|
|
|
|
import { onLaunch, onShow, onError } from '@dcloudio/uni-app';
|
|
|
|
|
|
import { ShoproInit } from './sheep';
|
2025-10-20 22:41:56 +08:00
|
|
|
|
import sheep from '@/sheep';
|
|
|
|
|
|
|
|
|
|
|
|
// 防止重复登录的标志
|
|
|
|
|
|
let isLoggingIn = false;
|
2025-10-16 21:07:43 +08:00
|
|
|
|
|
|
|
|
|
|
onLaunch(() => {
|
2025-10-20 22:41:56 +08:00
|
|
|
|
console.log('[App] 应用启动...');
|
|
|
|
|
|
|
2025-10-16 21:07:43 +08:00
|
|
|
|
// 隐藏原生导航栏 使用自定义底部导航
|
|
|
|
|
|
uni.hideTabBar({
|
|
|
|
|
|
fail: () => {},
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 加载Shopro底层依赖
|
|
|
|
|
|
ShoproInit();
|
2025-10-20 22:41:56 +08:00
|
|
|
|
|
|
|
|
|
|
// 检测建行生活登录参数
|
|
|
|
|
|
checkCCBLogin();
|
2025-10-16 21:07:43 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
onError((err) => {
|
|
|
|
|
|
console.log('AppOnError:', err);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
onShow(() => {
|
|
|
|
|
|
// #ifdef APP-PLUS
|
|
|
|
|
|
// 获取urlSchemes参数
|
|
|
|
|
|
const args = plus.runtime.arguments;
|
|
|
|
|
|
if (args) {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取剪贴板
|
|
|
|
|
|
uni.getClipboardData({
|
|
|
|
|
|
success: (res) => {},
|
|
|
|
|
|
});
|
|
|
|
|
|
// #endif
|
|
|
|
|
|
});
|
2025-10-20 22:41:56 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 检测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
|
|
|
|
|
|
};
|
2025-10-16 21:07:43 +08:00
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
|
|
@import '@/sheep/scss/index.scss';
|
|
|
|
|
|
</style>
|
2025-10-20 22:41:56 +08:00
|
|
|
|
|