修正了程序,优化了目录

This commit is contained in:
carry 2025-01-22 13:58:39 +08:00
parent bb314a2c6b
commit bf856af9f9
7 changed files with 26 additions and 20 deletions

View File

@ -1,10 +1,13 @@
from dotenv import load_dotenv
load_dotenv()
import logging import logging
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from config import JWT_CONFIG, LOGGING_CONFIG, SYSTEM_ADMIN_CONFIG from config import JWT_CONFIG, LOGGING_CONFIG, SYSTEM_ADMIN_CONFIG
from services.db import create_db_engine, init_db, close_db_connection from services.db import create_db_engine, init_db, close_db_connection
from routes.auth import auth_router from routes.auth import router as auth_router
from routes.users import users_router from routes.users import router as users_router
# 配置日志 # 配置日志
logging.basicConfig( logging.basicConfig(

View File

@ -2,9 +2,9 @@ from fastapi import APIRouter, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from schemas.auth import TokenResponse, LoginRequest, RefreshTokenRequest from schemas.auth import TokenResponse, LoginRequest, RefreshTokenRequest
from services.auth_service import create_tokens_response, verify_token, refresh_tokens from services.auth import create_tokens_response, verify_token, refresh_tokens
from services.user_services import authenticate_user from services.user import authenticate_user
from services.db import get_db from services.db import get_db_session
router = APIRouter(tags=["auth"]) router = APIRouter(tags=["auth"])
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@ -12,7 +12,7 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@router.post("/login", response_model=TokenResponse) @router.post("/login", response_model=TokenResponse)
async def login( async def login(
login_data: LoginRequest, login_data: LoginRequest,
session: AsyncSession = Depends(get_db) session: AsyncSession = Depends(get_db_session)
): ):
user = await authenticate_user(session, login_data.username, login_data.password) user = await authenticate_user(session, login_data.username, login_data.password)
if not user: if not user:

View File

@ -3,7 +3,7 @@ from fastapi.security import OAuth2PasswordBearer
from typing import Optional from typing import Optional
from schemas.auth import TokenPayload from schemas.auth import TokenPayload
from schemas.user import UserRole from schemas.user import UserRole
from services.auth_service import verify_token from services.auth import verify_token
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth/login") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="auth/login")

View File

@ -3,7 +3,7 @@ from typing import List, Optional
from schemas.auth import TokenPayload from schemas.auth import TokenPayload
from schemas.user import UserCreate, UserUpdate, UserResponse, UserRole from schemas.user import UserCreate, UserUpdate, UserResponse, UserRole
from routes.depends import get_current_user,get_current_admin from routes.depends import get_current_user,get_current_admin
from services.user_services import get_user_by_id,get_users,create_user,update_user,delete_user from services.user import get_users,create_user,update_user,delete_user#,get_user_by_id
from services.db import get_db_session from services.db import get_db_session
router = APIRouter(tags=["users"]) router = APIRouter(tags=["users"])
@ -15,12 +15,12 @@ async def get_users(
role: Optional[str] = None, role: Optional[str] = None,
current_user_token: TokenPayload = Depends(get_current_user) current_user_token: TokenPayload = Depends(get_current_user)
): ):
current_user = await get_user_by_id(current_user_token.id) # current_user = await get_user_by_id(current_user_token.id)
if current_user is None: # if current_user is None:
raise HTTPException( # raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, # status_code=status.HTTP_404_NOT_FOUND,
detail="User not found" # detail="User not found"
) # )
async with get_db_session() as session: async with get_db_session() as session:
skip = (page - 1) * limit skip = (page - 1) * limit
users = await get_users(session, skip=skip, limit=limit) users = await get_users(session, skip=skip, limit=limit)

View File

@ -1,10 +1,10 @@
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine, AsyncSession from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from ..models.user import Base, User, UserRole from models.user import Base, User, UserRole
from sqlalchemy import select from sqlalchemy import select
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from config import SYSTEM_ADMIN_CONFIG, DATABASE_CONFIG from config import SYSTEM_ADMIN_CONFIG, DATABASE_CONFIG
from user_services import get_password_hash from services.user import get_password_hash
from typing import AsyncGenerator from typing import AsyncGenerator
# 全局数据库引擎实例 # 全局数据库引擎实例
@ -44,8 +44,9 @@ async def init_db(engine: AsyncEngine):
# 创建所有表 # 创建所有表
await conn.run_sync(Base.metadata.create_all) await conn.run_sync(Base.metadata.create_all)
async with AsyncSession(engine) as session:
# 检查系统管理员是否存在 # 检查系统管理员是否存在
result = await conn.execute( result = await session.execute(
select(User).where(User.role == UserRole.SYSTEM_ADMIN) select(User).where(User.role == UserRole.SYSTEM_ADMIN)
) )
if not result.scalars().first(): if not result.scalars().first():
@ -56,8 +57,8 @@ async def init_db(engine: AsyncEngine):
role=UserRole.SYSTEM_ADMIN, role=UserRole.SYSTEM_ADMIN,
description=SYSTEM_ADMIN_CONFIG['description'] description=SYSTEM_ADMIN_CONFIG['description']
) )
conn.add(admin) session.add(admin)
await conn.commit() await session.commit()
async def close_db_connection(): async def close_db_connection():
"""关闭数据库连接""" """关闭数据库连接"""

View File

@ -7,7 +7,6 @@ from schemas.user import UserCreate, UserUpdate, UserResponse
# 创建一个密码上下文对象,指定使用 bcrypt 加密算法 # 创建一个密码上下文对象,指定使用 bcrypt 加密算法
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
async def create_user(session: AsyncSession, user_data: UserCreate) -> UserResponse: async def create_user(session: AsyncSession, user_data: UserCreate) -> UserResponse:
"""创建用户""" """创建用户"""
@ -60,6 +59,9 @@ def verify_password(plain_password: str, hashed_password: str) -> bool:
"""验证输入的明文密码是否与存储的哈希密码匹配""" """验证输入的明文密码是否与存储的哈希密码匹配"""
return pwd_context.verify(plain_password, hashed_password) return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password: str) -> str:
"""生成使用 bcrypt 的密码哈希"""
return pwd_context.hash(password)
async def authenticate_user(session: AsyncSession, username: str, password: str) -> Optional[UserResponse]: async def authenticate_user(session: AsyncSession, username: str, password: str) -> Optional[UserResponse]:
"""验证用户登录""" """验证用户登录"""