问题:
解决方案:
useRef 替代 useState 来跟踪处理状态isProcessing 从 useEffect 依赖数组修改文件:
web/apps/lq_label/src/components/oauth-callback/oauth-callback.tsx关键代码:
const isProcessingRef = useRef(false);
useEffect(() => {
if (isProcessingRef.current) {
console.log('Already processing, skipping duplicate call');
return;
}
const processCallback = async () => {
isProcessingRef.current = true;
// ... 处理逻辑
};
processCallback();
}, [searchParams, navigate, setAuth]); // 不包含 isProcessing
改进:
修改文件:
web/apps/lq_label/src/services/api.ts处理逻辑:
Token 过期(error_type === 'token_expired'):
其他 401 错误(无效凭证等):
设计改进:
修改文件:
web/apps/lq_label/src/components/login-form/login-form.tsxweb/apps/lq_label/src/components/login-form/login-form.module.scss新设计特点:
左侧品牌区域:
右侧登录区域:
视觉细节:
新布局:
┌─────────────────────────────────────────────────────────────┐
│ │ │
│ [背景图案] │ 欢迎回来 │
│ │ 登录您的账号以继续使用标注平台 │
│ [标 Logo] │ │
│ 标注平台 │ [使用 SSO 登录] │
│ 高效、智能的数据标注... │ │
│ │ ─── 或使用账号密码 ─── │
│ ┌────┬────┐ │ │
│ │高效│团队│ │ 用户名: [____________] │
│ │标注│协作│ │ 密码: [____________] │
│ ├────┼────┤ │ │
│ │实时│安全│ │ [登录] │
│ │同步│可靠│ │ │
│ └────┴────┘ │ 还没有账号?立即注册 │
│ │ │
└─────────────────────────────────────────────────────────────┘
左侧 (2/3) 右侧 (1/3)
http://localhost:4200/login测试 Token 过期:
测试无效 Token:
桌面端:
http://localhost:4200/login移动端:
backend/config.yaml)oauth:
enabled: true
base_url: "http://192.168.92.61:8000"
client_id: "sRyfcQwNVoFimigzuuZxhqd36fPkVN5G"
client_secret: "96RuKb4obAn9bQ9i5NtINiKBMvF_9uuCR7eNzD9dWQMbOWZaV3P593-8yLOqzWRd"
redirect_uri: "http://localhost:4200/auth/callback"
scope: "profile email"
authorize_endpoint: "/oauth/login"
token_endpoint: "/oauth/token"
userinfo_endpoint: "/oauth/userinfo"
更新日期: 2024-01-22
状态: ✅ 完成
版本: 1.0