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

152
app/schemas/allocation.py Normal file
View File

@@ -0,0 +1,152 @@
"""
资产分配相关的Pydantic Schema
"""
from typing import Optional, List, Dict, Any
from datetime import datetime, date
from decimal import Decimal
from pydantic import BaseModel, Field
# ===== 分配单Schema =====
class AllocationOrderBase(BaseModel):
"""分配单基础Schema"""
order_type: str = Field(..., description="单据类型(allocation/transfer/recovery/maintenance/scrap)")
title: str = Field(..., min_length=1, max_length=200, description="标题")
source_organization_id: Optional[int] = Field(None, gt=0, description="调出网点ID")
target_organization_id: int = Field(..., gt=0, description="调入网点ID")
expect_execute_date: Optional[date] = Field(None, description="预计执行日期")
remark: Optional[str] = Field(None, description="备注")
class AllocationOrderCreate(AllocationOrderBase):
"""创建分配单Schema"""
asset_ids: List[int] = Field(..., min_items=1, description="资产ID列表")
class AllocationOrderUpdate(BaseModel):
"""更新分配单Schema"""
title: Optional[str] = Field(None, min_length=1, max_length=200)
expect_execute_date: Optional[date] = None
remark: Optional[str] = None
class AllocationOrderApproval(BaseModel):
"""分配单审批Schema"""
approval_status: str = Field(..., description="审批状态(approved/rejected)")
approval_remark: Optional[str] = Field(None, description="审批备注")
class AllocationOrderExecute(BaseModel):
"""分配单执行Schema"""
remark: Optional[str] = Field(None, description="执行备注")
class AllocationOrderInDB(BaseModel):
"""数据库中的分配单Schema"""
id: int
order_code: str
order_type: str
title: str
source_organization_id: Optional[int]
target_organization_id: int
applicant_id: int
approver_id: Optional[int]
approval_status: str
approval_time: Optional[datetime]
approval_remark: Optional[str]
expect_execute_date: Optional[date]
actual_execute_date: Optional[date]
executor_id: Optional[int]
execute_status: str
remark: Optional[str]
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class AllocationOrderResponse(AllocationOrderInDB):
"""分配单响应Schema"""
pass
class AllocationOrderWithRelations(AllocationOrderResponse):
"""带关联信息的分配单响应Schema"""
source_organization: Optional[Dict[str, Any]] = None
target_organization: Optional[Dict[str, Any]] = None
applicant: Optional[Dict[str, Any]] = None
approver: Optional[Dict[str, Any]] = None
executor: Optional[Dict[str, Any]] = None
items: Optional[List[Dict[str, Any]]] = None
class AllocationOrderListResponse(BaseModel):
"""分配单列表响应Schema"""
total: int
page: int
page_size: int
total_pages: int
items: List[AllocationOrderWithRelations]
# ===== 分配单明细Schema =====
class AllocationItemBase(BaseModel):
"""分配单明细基础Schema"""
asset_id: int = Field(..., gt=0, description="资产ID")
remark: Optional[str] = Field(None, description="备注")
class AllocationItemInDB(BaseModel):
"""数据库中的分配单明细Schema"""
id: int
order_id: int
asset_id: int
asset_code: str
asset_name: str
from_organization_id: Optional[int]
to_organization_id: Optional[int]
from_status: Optional[str]
to_status: Optional[str]
execute_status: str
execute_time: Optional[datetime]
failure_reason: Optional[str]
remark: Optional[str]
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class AllocationItemResponse(AllocationItemInDB):
"""分配单明细响应Schema"""
pass
# ===== 查询参数Schema =====
class AllocationOrderQueryParams(BaseModel):
"""分配单查询参数"""
order_type: Optional[str] = Field(None, description="单据类型")
approval_status: Optional[str] = Field(None, description="审批状态")
execute_status: Optional[str] = Field(None, description="执行状态")
applicant_id: Optional[int] = Field(None, gt=0, description="申请人ID")
target_organization_id: Optional[int] = Field(None, gt=0, description="目标网点ID")
keyword: Optional[str] = Field(None, description="搜索关键词")
page: int = Field(default=1, ge=1, description="页码")
page_size: int = Field(default=20, ge=1, le=100, description="每页数量")
# ===== 统计Schema =====
class AllocationOrderStatistics(BaseModel):
"""分配单统计Schema"""
total: int = Field(..., description="总数")
pending: int = Field(..., description="待审批数")
approved: int = Field(..., description="已审批数")
rejected: int = Field(..., description="已拒绝数")
executing: int = Field(..., description="执行中数")
completed: int = Field(..., description="已完成数")