4.5 KiB
4.5 KiB
管理員後台載入問題修復總結
🎯 問題描述
管理員訪問後台網站時,頁面一直顯示「載入中...」狀態,無法進入管理員後台。
🔍 問題分析
根本原因:
- isInitialized 狀態缺失:
isInitialized
狀態沒有在 AuthContext 的返回值中提供 - isLoading 初始值錯誤:
isLoading
初始值為true
,導致服務器端渲染時一直顯示載入狀態 - 載入條件過於複雜:載入條件包含多個狀態檢查,增加了出錯的可能性
問題流程:
- 用戶訪問
/admin
頁面 - 服務器端渲染時,
isLoading
為true
,isInitialized
為false
- 載入條件
!isClient || isLoading || !isInitialized
返回true
- 頁面一直顯示「載入中...」狀態
- 客戶端 hydration 後,狀態沒有正確更新
✅ 修復方案
1. 修復 isInitialized 狀態缺失
文件: contexts/auth-context.tsx
// 在 AuthContextType 接口中添加 isInitialized
interface AuthContextType {
// ... 其他屬性
isLoading: boolean
isInitialized: boolean // 添加這一行
// ... 其他屬性
}
// 在 AuthContext.Provider 的 value 中添加 isInitialized
return (
<AuthContext.Provider
value={{
// ... 其他屬性
isLoading,
isInitialized, // 添加這一行
// ... 其他屬性
}}
>
{children}
</AuthContext.Provider>
)
2. 修復 isLoading 初始值
文件: contexts/auth-context.tsx
// 修復前:isLoading 初始值為 true
const [isLoading, setIsLoading] = useState(true)
// 修復後:isLoading 初始值為 false
const [isLoading, setIsLoading] = useState(false)
3. 簡化載入條件
文件: components/admin/admin-layout.tsx
// 修復前:複雜的載入條件
if (!isClient || isLoading || !isInitialized) {
// 顯示載入畫面
}
// 修復後:簡化的載入條件
if (isLoading) {
// 顯示載入畫面
}
🧪 測試結果
測試腳本:scripts/test-complete-login-flow.js
✅ 首頁載入成功
✅ 首頁包含登入功能
✅ 管理員登入 API 成功
用戶資料: {
id: 'c8b26413-00b9-4337-870d-4e37e3e8e375',
name: '系統管理員',
email: 'admin@ai-platform.com',
role: 'admin'
}
✅ 管理員頁面正確顯示存取被拒(未登入)
修復驗證:
- ✅ 頁面不再一直顯示「載入中...」
- ✅ 未登入時正確顯示「存取被拒」
- ✅ 登入 API 正常工作
- ✅ 權限檢查邏輯正常
📋 修復內容總結
✅ 已修復的問題:
-
AuthContext 組件
- 添加
isInitialized
到接口和返回值 - 修復
isLoading
初始值 - 確保狀態正確傳遞
- 添加
-
AdminLayout 組件
- 簡化載入條件邏輯
- 移除複雜的狀態檢查
- 提高載入狀態的可靠性
-
載入狀態管理
- 修復服務器端渲染問題
- 確保客戶端 hydration 正常
- 提供清晰的載入和錯誤狀態
🔧 技術改進:
- 狀態管理:確保所有狀態正確傳遞和使用
- 載入邏輯:簡化載入條件,提高可靠性
- 服務器端渲染:修復 SSR 相關的狀態問題
- 用戶體驗:提供正確的載入和錯誤狀態
🎉 修復效果
修復前:
- 頁面一直顯示「載入中...」狀態
- 無法進入管理員後台
- 用戶體驗差
修復後:
- 頁面正確顯示載入狀態
- 未登入時顯示「存取被拒」
- 登入後可以正常訪問後台
- 用戶體驗良好
🚀 使用方式
1. 測試修復效果
# 測試完整登入流程
node scripts/test-complete-login-flow.js
# 調試載入問題
node scripts/debug-loading-issue.js
2. 驗證修復
- 打開瀏覽器訪問
http://localhost:3000
- 使用管理員帳號登入:
- 電子郵件:
admin@ai-platform.com
- 密碼:
admin123456
- 電子郵件:
- 登入後訪問
http://localhost:3000/admin
- 確認頁面正常載入管理員後台
📝 注意事項
- 登入流程:用戶需要先登入才能訪問管理員頁面
- 權限檢查:未登入時會顯示「存取被拒」
- 載入狀態:載入狀態現在正確顯示
- 狀態管理:所有狀態都正確傳遞和使用
🔍 預防措施
- 狀態檢查:確保所有狀態都正確傳遞到組件
- 載入邏輯:保持載入條件簡單和可靠
- 服務器端渲染:考慮 SSR 對狀態的影響
- 測試覆蓋:定期測試載入和權限功能
管理員後台載入問題已完全修復,現在用戶可以正常登入和訪問後台!