修正了程序,优化了目录
This commit is contained in:
parent
bb314a2c6b
commit
bf856af9f9
7
main.py
7
main.py
@ -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(
|
||||||
|
@ -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:
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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():
|
||||||
"""关闭数据库连接"""
|
"""关闭数据库连接"""
|
||||||
|
@ -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]:
|
||||||
"""验证用户登录"""
|
"""验证用户登录"""
|
Loading…
x
Reference in New Issue
Block a user