diff --git a/frontend/index.html b/frontend/index.html
index fbd9950..56e00a4 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -5,49 +5,9 @@
frontend
-
+
-
-
+
diff --git a/frontend/src/pages/login/index.tsx b/frontend/src/pages/login/index.tsx
index e38af2e..f24d405 100644
--- a/frontend/src/pages/login/index.tsx
+++ b/frontend/src/pages/login/index.tsx
@@ -79,6 +79,18 @@ export default function Login() {
console.log('在飞书中:', isInFeishu)
console.log('window.tt:', window.tt)
+ // 检查所有可能的飞书相关全局对象
+ const feishuObjects = {}
+ for (const key in window) {
+ if (key.toLowerCase().includes('tt') ||
+ key.toLowerCase().includes('lark') ||
+ key.toLowerCase().includes('feishu') ||
+ key.toLowerCase().includes('bridge')) {
+ feishuObjects[key] = typeof window[key]
+ }
+ }
+ console.log('🔍 飞书相关全局对象:', feishuObjects)
+
// 检查 URL 中是否来自飞书消息通知
const urlParams = new URLSearchParams(window.location.search)
const authCode = urlParams.get('auth_code')
@@ -110,20 +122,32 @@ export default function Login() {
setEnvironment('feishu')
handleFeishuAutoLogin()
} else if (isInFeishu) {
- // 飞书内环境,等待 tt 对象加载后尝试免登
- console.log('⏳ 在飞书内环境,等待 tt 对象加载...')
+ // 飞书内环境,tt 对象由飞书客户端自动注入
+ // 使用轮询等待 tt 对象可用(最多 10 秒)
+ console.log('⏳ 在飞书内环境,等待飞书客户端注入 tt 对象...')
setEnvironment('feishu')
- setLoading(false)
- // 给 tt 对象一些时间来加载(最多 2 秒)
- setTimeout(() => {
- if (window.tt) {
- console.log('✅ tt 对象已加载,开始免登')
+
+ let attempts = 0
+ const maxAttempts = 100 // 100 * 100ms = 10秒
+
+ const checkInterval = setInterval(() => {
+ attempts++
+ console.log(`🔍 检查 tt 对象 (${attempts}/${maxAttempts}):`, !!window.tt, typeof window.tt)
+
+ if (window.tt && typeof window.tt === 'object') {
+ clearInterval(checkInterval)
+ console.log('✅ tt 对象已由飞书客户端注入,开始免登')
handleFeishuAutoLogin()
- } else {
- console.log('⚠️ tt 对象仍未加载,显示二维码登录')
+ } else if (attempts >= maxAttempts) {
+ clearInterval(checkInterval)
+ console.error('❌ 等待 tt 对象超时,最后状态 window.tt:', window.tt, typeof window.tt)
+ console.error('❌ 请检查:1) 飞书开放平台是否正确配置 H5 应用地址 2) 页面是否从飞书应用入口进入')
+
+ // 不自动弹错误,而是显示飞书内登录界面
+ setLoading(false)
setShowQRCode(true)
}
- }, 2000)
+ }, 100)
} else {
// 飞书外:显示登录选项
console.log('📱 飞书外环境,显示登录选项')
@@ -135,8 +159,6 @@ export default function Login() {
// 飞书内静默授权
const handleFeishuAutoLogin = () => {
console.log('🚀 开始飞书免登')
- console.log('🔍 window.tt:', window.tt)
- console.log('🔍 window.tt 类型:', typeof window.tt)
// 从 URL 获取 company 参数(可能来自当前 URL 或 redirect URL)
const urlParams = new URLSearchParams(window.location.search)
@@ -153,60 +175,37 @@ export default function Login() {
}
}
- // 详细检查 tt 对象
- if (window.tt) {
- console.log('✅ tt 对象存在')
- console.log('🔍 tt 的所有属性:', Object.keys(window.tt))
- console.log('🔍 tt.requestAuthCode 类型:', typeof window.tt.requestAuthCode)
+ console.log('🔍 window.tt:', window.tt)
+ console.log('🔍 tt 的属性:', Object.keys(window.tt || {}))
- // 检查 requestAuthCode 是否存在
- if ('requestAuthCode' in window.tt) {
- console.log('✅ requestAuthCode 属性存在')
- console.log('🔍 类型:', typeof window.tt.requestAuthCode)
- } else {
- console.log('❌ requestAuthCode 属性不存在')
- }
- } else {
- console.log('❌ tt 对象不存在')
+ if (!window.tt) {
+ console.error('❌ tt 对象不存在')
setLoading(false)
- Toast.show('飞书 API 未加载,请刷新重试')
+ Toast.show('飞书环境异常,请刷新重试')
return
}
- // 等待一小段时间,确保 tt 完全初始化
- setTimeout(() => {
- console.log('⏰ 延迟后再次检查 tt:', !!window.tt)
+ // 调用 tt.requestAuthCode 获取授权码
+ try {
+ console.log('🔧 调用 tt.requestAuthCode')
- if (!window.tt) {
- setLoading(false)
- Toast.show('飞书 API 加载失败')
- return
- }
-
- // 尝试调用 requestAuthCode
- try {
- console.log('🔧 调用 tt.requestAuthCode,company:', companyParam)
-
- // 不传 appId,让飞书自动选择(后端会根据 company 参数处理)
- window.tt.requestAuthCode({
- success: (res: any) => {
- console.log('✅ 成功获取授权码:', res)
- console.log('✅ code:', res.code?.substring(0, 30))
- handleFeishuLogin(res.code)
- },
- fail: (error: any) => {
- console.error('❌ requestAuthCode 失败:', error)
- console.error('❌ 错误详情:', JSON.stringify(error))
- setLoading(false)
- Toast.show('免登失败:' + (error.errorMessage || error.errMsg || JSON.stringify(error)))
- },
- })
- } catch (e) {
- console.error('❌ 调用异常:', e)
- setLoading(false)
- Toast.show('免登失败,请使用其他方式登录')
- }
- }, 500)
+ // 不传 appId,让飞书自动选择(后端会根据 company 参数处理)
+ window.tt.requestAuthCode({
+ success: (res: any) => {
+ console.log('✅ 成功获取授权码:', res.code?.substring(0, 30))
+ handleFeishuLogin(res.code)
+ },
+ fail: (error: any) => {
+ console.error('❌ requestAuthCode 失败:', error)
+ setLoading(false)
+ Toast.show('免登失败:' + (error.errorMessage || error.errMsg || JSON.stringify(error)))
+ },
+ })
+ } catch (e) {
+ console.error('❌ 调用异常:', e)
+ setLoading(false)
+ Toast.show('免登失败,请重试')
+ }
}
// 跳转到飞书授权页面(飞书外扫码登录)