fix: 修复斗鱼Cookie导出422路由冲突 & 优化登录密码错误提示

- cookies.py: 将 GET /export 路由移至 GET /{task_id} 之前,避免
  动态路径 task_id:int 误匹配 'export' 导致 422 校验错误
- LoginPage.tsx: 密码错误(401)时清空密码框并自动聚焦,方便快速重试
- database.py/migrations/env.py: 应用内嵌调用 alembic 时跳过 fileConfig,
  避免覆盖 uvicorn 日志配置导致启动日志丢失
- client.ts: 401 拦截排除 /auth/login,避免登录失败时误跳转吞掉错误提示
This commit is contained in:
yml2213
2026-07-30 13:04:40 +08:00
parent 8de269f958
commit 72cf0e5fef
5 changed files with 58 additions and 38 deletions
+3 -1
View File
@@ -10,7 +10,9 @@ const api = axios.create({
api.interceptors.response.use(
(response) => response.data,
(error) => {
if (error.response?.status === 401) {
// 仅在“已登录后 token 失效”时清除登录态并跳转登录页。
// 登录接口本身返回 401(用户名/密码错误)时不应跳转,否则会吞掉错误提示。
if (error.response?.status === 401 && error.config?.url !== '/auth/login') {
localStorage.removeItem('user');
window.location.href = '/login';
}
+13 -4
View File
@@ -1,5 +1,6 @@
import { useState } from 'react';
import { useRef, useState } from 'react';
import { Card, Form, Input, Button, Typography } from 'antd';
import type { InputRef } from 'antd';
import { message } from '../utils/antdMessage';
import { LockOutlined, UserOutlined } from '@ant-design/icons';
import { useNavigate } from 'react-router-dom';
@@ -13,6 +14,8 @@ const { Title, Text } = Typography;
export default function LoginPage({ onLogin }: { onLogin?: () => void }) {
const [loading, setLoading] = useState(false);
const [form] = Form.useForm();
const passwordRef = useRef<InputRef>(null);
const navigate = useNavigate();
const { isDark } = useTheme();
const appInfo = useAppInfo();
@@ -33,7 +36,13 @@ export default function LoginPage({ onLogin }: { onLogin?: () => void }) {
onLogin?.(); // 触发 App 重渲染
navigate('/', { replace: true });
} catch (e: unknown) {
message.error(getErrorMessage(e) || '登录失败');
const msg = getErrorMessage(e) || '登录失败';
message.error(msg);
// 密码错误(401)时清空密码并自动聚焦,方便快速重试
if (msg.includes('密码') || msg.includes('用户名')) {
form.setFieldValue('password', '');
passwordRef.current?.focus();
}
} finally {
setLoading(false);
}
@@ -62,12 +71,12 @@ export default function LoginPage({ onLogin }: { onLogin?: () => void }) {
}}>
{versionText}
</Text>
<Form onFinish={onFinish} size="large">
<Form form={form} onFinish={onFinish} size="large">
<Form.Item name="username" rules={[{ required: true, message: '请输入用户名' }]}>
<Input prefix={<UserOutlined />} placeholder="用户名" />
</Form.Item>
<Form.Item name="password" rules={[{ required: true, message: '请输入密码' }]}>
<Input.Password prefix={<LockOutlined />} placeholder="密码" />
<Input.Password prefix={<LockOutlined />} placeholder="密码" ref={passwordRef} />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" loading={loading} block>