diff --git a/frontend/index.html b/frontend/index.html index 95e2a1f..95b416f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -7,6 +7,8 @@ frontend + +
diff --git a/frontend/src/pages/approval/detail.tsx b/frontend/src/pages/approval/detail.tsx index 04c6c7e..1fd4052 100644 --- a/frontend/src/pages/approval/detail.tsx +++ b/frontend/src/pages/approval/detail.tsx @@ -126,41 +126,75 @@ export default function ApprovalDetail() { console.log('🔍 tryFeishuLogin 开始') console.log('📱 isInFeishu:', isInFeishu) console.log('🔧 window.tt:', window.tt) + console.log('🔧 window.h5sdk:', (window as any).h5sdk) + console.log('🔧 window.bridge:', (window as any).bridge) - if (!isInFeishu || !window.tt) { - console.log('❌ 不在飞书内或 tt 对象不可用,跳过免登') + if (!isInFeishu) { + console.log('❌ 不在飞书内,跳过免登') resolve(false) return } - console.log('🚀 开始调用 tt.requestAuthCode') const appId = 'cli_a8033d607cba500d' - - window.tt.requestAuthCode({ - appId: appId, - success: async (res: any) => { - console.log('✅ tt.requestAuthCode 成功:', res) - console.log('🔑 authCode:', res.code?.substring(0, 30) + '...') - try { - console.log('📡 调用后端登录API...') - const result = await authApi.feishuLogin(res.code) - console.log('✅ 后端登录成功:', result.user?.name) - login(result.user, result.token) - Toast.show('登录成功') - resolve(true) - } catch (error) { - console.error('❌ 飞书登录API失败:', error) - Toast.show('登录失败: ' + (error.message || '未知错误')) + const requestAuthCode = (apiObj: any, source: string) => { + console.log(`🚀 使用 ${source} 调用 requestAuthCode`) + apiObj.requestAuthCode({ + appId: appId, + success: async (res: any) => { + console.log(`✅ ${source}.requestAuthCode 成功:`, res) + console.log('🔑 authCode:', res.code?.substring(0, 30) + '...') + try { + console.log('📡 调用后端登录API...') + const result = await authApi.feishuLogin(res.code) + console.log('✅ 后端登录成功:', result.user?.name) + login(result.user, result.token) + Toast.show('登录成功') + resolve(true) + } catch (error) { + console.error('❌ 飞书登录API失败:', error) + Toast.show('登录失败: ' + (error.message || '未知错误')) + resolve(false) + } + }, + fail: (error: any) => { + console.error(`❌ ${source}.requestAuthCode 失败:`, error) + console.error('❌ 错误详情:', JSON.stringify(error)) + Toast.show('免登失败: ' + (error.errorMessage || error.errMsg || '未知错误')) resolve(false) - } - }, - fail: (error: any) => { - console.error('❌ tt.requestAuthCode 失败:', error) - console.error('❌ 错误详情:', JSON.stringify(error)) - Toast.show('免登失败: ' + (error.errorMessage || error.errMsg || '未知错误')) - resolve(false) - }, - }) + }, + }) + } + + // 优先使用 tt 对象 + if (window.tt && typeof window.tt.requestAuthCode === 'function') { + requestAuthCode(window.tt, 'tt') + return + } + + // 尝试使用 h5sdk + const h5sdk = (window as any).h5sdk + if (h5sdk && typeof h5sdk.requestAuthCode === 'function') { + requestAuthCode(h5sdk, 'h5sdk') + return + } + + // 尝试使用 bridge + const bridge = (window as any).bridge + if (bridge && typeof bridge.requestAuthCode === 'function') { + requestAuthCode(bridge, 'bridge') + return + } + + // 尝试使用 ttjsBridge + if (window.ttjsBridge && typeof window.ttjsBridge.requestAuthCode === 'function') { + requestAuthCode(window.ttjsBridge, 'ttjsBridge') + return + } + + // 所有方法都不可用 + console.log('❌ 所有飞书 API 都不可用') + Toast.show('飞书API不可用,请使用其他方式登录') + resolve(false) }) } diff --git a/frontend/src/pages/debug-feishu.tsx b/frontend/src/pages/debug-feishu.tsx index eeab2a3..1083a5a 100644 --- a/frontend/src/pages/debug-feishu.tsx +++ b/frontend/src/pages/debug-feishu.tsx @@ -26,47 +26,112 @@ export default function DebugFeishuPage() { const [envInfo, setEnvInfo] = useState(null) useEffect(() => { - const ua = navigator.userAgent - const isInFeishu = ua.includes('Lark') || ua.includes('feishu') || ua.includes('lark') + // 延迟检测,等待 JSBridge 注入 + setTimeout(() => { + const ua = navigator.userAgent + const isInFeishu = ua.includes('Lark') || ua.includes('feishu') || ua.includes('lark') - const ttMethods = window.tt ? Object.keys(window.tt) : [] + const ttMethods = window.tt ? Object.keys(window.tt) : [] - setEnvInfo({ - ua, - isInFeishu, - hasTT: !!window.tt, - hasTTJSBridge: !!window.ttjsBridge, - hasH5SDK: !!(window as any).h5sdk, - hasBridge: !!(window as any).bridge, - ttMethods, - }) + setEnvInfo({ + ua, + isInFeishu, + hasTT: !!window.tt, + hasTTJSBridge: !!window.ttjsBridge, + hasH5SDK: !!(window as any).h5sdk, + hasBridge: !!(window as any).bridge, + ttMethods, + }) - console.log('=== 飞书环境调试 ===') - console.log('User Agent:', ua) - console.log('在飞书中:', isInFeishu) - console.log('window.tt:', window.tt) - console.log('tt 对象方法:', ttMethods) + console.log('=== 飞书环境调试 ===') + console.log('User Agent:', ua) + console.log('在飞书中:', isInFeishu) + console.log('window.tt:', window.tt) + console.log('window.h5sdk:', (window as any).h5sdk) + console.log('window.bridge:', (window as any).bridge) + console.log('window.ttjsBridge:', window.ttjsBridge) + console.log('tt 对象方法:', ttMethods) + + // 检查所有全局对象 + console.log('所有全局对象:', Object.keys(window).filter(k => k.includes('tt') || k.includes('h5') || k.includes('bridge') || k.includes('lark') || k.includes('feishu'))) + }, 500) }, []) const testFeishuLogin = async () => { - if (!window.tt) { - alert('tt 对象不存在,无法测试') + const appId = 'cli_a8033d607cba500d' + + // 优先使用 tt 对象 + if (window.tt && typeof window.tt.requestAuthCode === 'function') { + console.log('🔧 使用 tt.requestAuthCode') + window.tt.requestAuthCode({ + appId: appId, + success: (res: any) => { + alert('✅ 获取授权码成功: ' + res.code?.substring(0, 30)) + console.log('授权码:', res) + }, + fail: (error: any) => { + alert('❌ 获取授权码失败: ' + JSON.stringify(error)) + console.error('错误:', error) + }, + }) return } - const appId = 'cli_a8033d607cba500d' + // 尝试使用 h5sdk + const h5sdk = (window as any).h5sdk + if (h5sdk) { + console.log('🔧 尝试使用 h5sdk') + try { + if (typeof h5sdk.requestAuthCode === 'function') { + h5sdk.requestAuthCode({ + appId: appId, + success: (res: any) => { + alert('✅ h5sdk 获取授权码成功: ' + res.code?.substring(0, 30)) + console.log('授权码:', res) + }, + fail: (error: any) => { + alert('❌ h5sdk 获取授权码失败: ' + JSON.stringify(error)) + console.error('错误:', error) + }, + }) + return + } + } catch (e) { + console.error('h5sdk 调用失败:', e) + } + } - window.tt.requestAuthCode({ - appId: appId, - success: (res: any) => { - alert('✅ 获取授权码成功: ' + res.code?.substring(0, 30)) - console.log('授权码:', res) - }, - fail: (error: any) => { - alert('❌ 获取授权码失败: ' + JSON.stringify(error)) - console.error('错误:', error) - }, - }) + // 尝试使用 bridge + const bridge = (window as any).bridge + if (bridge) { + console.log('🔧 尝试使用 bridge') + try { + if (typeof bridge.requestAuthCode === 'function') { + bridge.requestAuthCode({ + appId: appId, + success: (res: any) => { + alert('✅ bridge 获取授权码成功: ' + res.code?.substring(0, 30)) + console.log('授权码:', res) + }, + fail: (error: any) => { + alert('❌ bridge 获取授权码失败: ' + JSON.stringify(error)) + console.error('错误:', error) + }, + }) + return + } + } catch (e) { + console.error('bridge 调用失败:', e) + } + } + + // 如果都没有,显示详细错误 + alert('❌ 未找到可用的飞书 API\n\n' + + 'window.tt: ' + !!window.tt + '\n' + + 'window.h5sdk: ' + !!(window as any).h5sdk + '\n' + + 'window.bridge: ' + !!(window as any).bridge + '\n' + + 'window.ttjsBridge: ' + !!window.ttjsBridge + ) } return (