fix: 修复多个关键问题

- 修复前端路由守卫:未登录时不显示提示,直接跳转登录页
- 修复API拦截器:401错误不显示提示,直接跳转
- 增强验证码显示:图片尺寸从120x40增加到200x80
- 增大验证码字体:从28号增加到48号
- 优化验证码字符:排除易混淆的0和1
- 减少干扰线:从5条减少到3条,添加背景色优化
- 增强登录API日志:添加详细的调试日志
- 增强验证码生成和验证日志
- 优化异常处理和错误追踪

影响文件:
- src/router/index.ts
- src/api/request.ts
- app/services/auth_service.py
- app/api/v1/auth.py
- app/schemas/user.py

测试状态:
- 前端构建通过
- 后端语法检查通过
- 验证码显示效果优化完成

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-01-25 00:26:21 +08:00
commit e71181f0a3
150 changed files with 39549 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
"""
品牌和供应商相关的Pydantic Schema
"""
from typing import Optional
from datetime import datetime
from pydantic import BaseModel, Field, EmailStr
# ===== 品牌Schema =====
class BrandBase(BaseModel):
"""品牌基础Schema"""
brand_code: str = Field(..., min_length=1, max_length=50, description="品牌代码")
brand_name: str = Field(..., min_length=1, max_length=200, description="品牌名称")
logo_url: Optional[str] = Field(None, max_length=500, description="Logo URL")
website: Optional[str] = Field(None, max_length=500, description="官网地址")
sort_order: int = Field(default=0, description="排序")
class BrandCreate(BrandBase):
"""创建品牌Schema"""
pass
class BrandUpdate(BaseModel):
"""更新品牌Schema"""
brand_name: Optional[str] = Field(None, min_length=1, max_length=200)
logo_url: Optional[str] = Field(None, max_length=500)
website: Optional[str] = Field(None, max_length=500)
status: Optional[str] = Field(None, pattern="^(active|inactive)$")
sort_order: Optional[int] = None
class BrandInDB(BaseModel):
"""数据库中的品牌Schema"""
id: int
brand_code: str
brand_name: str
logo_url: Optional[str]
website: Optional[str]
status: str
sort_order: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class BrandResponse(BrandInDB):
"""品牌响应Schema"""
pass
# ===== 供应商Schema =====
class SupplierBase(BaseModel):
"""供应商基础Schema"""
supplier_code: str = Field(..., min_length=1, max_length=50, description="供应商代码")
supplier_name: str = Field(..., min_length=1, max_length=200, description="供应商名称")
contact_person: Optional[str] = Field(None, max_length=100, description="联系人")
contact_phone: Optional[str] = Field(None, max_length=20, description="联系电话")
email: Optional[EmailStr] = Field(None, description="邮箱")
address: Optional[str] = Field(None, max_length=500, description="地址")
credit_code: Optional[str] = Field(None, max_length=50, description="统一社会信用代码")
bank_name: Optional[str] = Field(None, max_length=200, description="开户银行")
bank_account: Optional[str] = Field(None, max_length=100, description="银行账号")
remark: Optional[str] = Field(None, description="备注")
class SupplierCreate(SupplierBase):
"""创建供应商Schema"""
pass
class SupplierUpdate(BaseModel):
"""更新供应商Schema"""
supplier_name: Optional[str] = Field(None, min_length=1, max_length=200)
contact_person: Optional[str] = Field(None, max_length=100)
contact_phone: Optional[str] = Field(None, max_length=20)
email: Optional[EmailStr] = None
address: Optional[str] = Field(None, max_length=500)
credit_code: Optional[str] = Field(None, max_length=50)
bank_name: Optional[str] = Field(None, max_length=200)
bank_account: Optional[str] = Field(None, max_length=100)
status: Optional[str] = Field(None, pattern="^(active|inactive)$")
remark: Optional[str] = None
class SupplierInDB(BaseModel):
"""数据库中的供应商Schema"""
id: int
supplier_code: str
supplier_name: str
contact_person: Optional[str]
contact_phone: Optional[str]
email: Optional[str]
address: Optional[str]
credit_code: Optional[str]
bank_name: Optional[str]
bank_account: Optional[str]
status: str
remark: Optional[str]
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class SupplierResponse(SupplierInDB):
"""供应商响应Schema"""
pass