33b4c734aa
后端: - 新增认证(auth)、任务(tasks)、映射(mappings)、对账(reconciliation)、异常(exceptions)、导出(exports) API - 新增核心模块: database, security, permissions, tenant, exceptions, error_handlers - 新增数据模型: user, company, reconciliation_task, field_mapping, uploaded_file 等 - 新增服务层: ai_recognizer, file_parser, file_storage, mapping, reconciliation 等 - 添加数据库迁移脚本 前端: - 新增登录页面和仪表盘页面 - 新增任务列表、任务详情、字段映射页面 - 新增异常处理页面和规则设置页面 - 新增 API 代理路由 /api/[...path] - 新增 UI 组件库 (button, card, dialog, input, table 等) - 新增 auth 组件 (ProtectedRoute, PermissionGate) - 新增 layout 组件 (Header, Sidebar) - 新增 mapping 组件 (FieldMappingTable, AISuggestionPanel) - 新增 API 客户端和 hooks (useAsync, useToast, usePermission 等) - 新增状态管理 (auth-store, company-store, ui-store) - 集成 Tailwind CSS 和 shadcn/ui 组件库 其他: - 添加 Alembic 数据库迁移配置 - 添加初始化示例数据脚本 - 更新项目文档
71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from fastapi.security import OAuth2PasswordRequestForm
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.core.database import get_db
|
|
from app.models.user import User
|
|
from app.schemas.user import Token, UserCreate, UserLogin, UserResponse
|
|
from app.services.auth import AuthService, auth_service
|
|
|
|
router = APIRouter(prefix="/api/auth", tags=["auth"])
|
|
|
|
|
|
@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
|
|
async def register(
|
|
user_data: UserCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""
|
|
注册新用户
|
|
"""
|
|
user = await auth_service.register_user(db, user_data)
|
|
return user
|
|
|
|
|
|
@router.post("/login", response_model=dict)
|
|
async def login(
|
|
login_data: UserLogin,
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""
|
|
用户登录
|
|
"""
|
|
user, access_token = await auth_service.authenticate_user(db, login_data)
|
|
|
|
return {
|
|
"access_token": access_token,
|
|
"token_type": "bearer",
|
|
"user": UserResponse.model_validate(user)
|
|
}
|
|
|
|
|
|
@router.post("/logout")
|
|
async def logout(
|
|
current_user: User = Depends(auth_service.get_current_user),
|
|
):
|
|
"""
|
|
用户登出(客户端需清除 Token)
|
|
"""
|
|
return {"message": "登出成功"}
|
|
|
|
|
|
@router.get("/me", response_model=UserResponse)
|
|
async def get_current_user_info(
|
|
current_user: User = Depends(auth_service.get_current_user),
|
|
):
|
|
"""
|
|
获取当前用户信息
|
|
"""
|
|
return current_user
|
|
|
|
|
|
@router.post("/refresh", response_model=Token)
|
|
async def refresh_token(
|
|
current_user: User = Depends(auth_service.get_current_user),
|
|
):
|
|
"""
|
|
刷新 Token
|
|
"""
|
|
from app.core.security import create_access_token
|
|
access_token = create_access_token(data={"sub": str(current_user.id), "email": current_user.email})
|
|
return Token(access_token=access_token) |