feat: User Management

This commit is contained in:
fit2cloud-chenyw
2025-05-06 18:15:35 +08:00
parent 0179b3d371
commit 2de7ece73b
12 changed files with 530 additions and 18 deletions
+20 -2
View File
@@ -1,9 +1,27 @@
from fastapi import APIRouter, Depends, Request
from common.core.deps import CurrentUser
from apps.system.models.user import user_grid
from common.core.deps import CurrentUser, SessionDep
from common.core.pagination import Paginator
from common.core.schemas import PaginatedResponse, PaginationParams
router = APIRouter(tags=["user"], prefix="/user")
@router.get("/info")
async def user_info(current_user: CurrentUser):
return current_user.to_dict()
return current_user.to_dict()
@router.get("/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[user_grid])
async def pager(
session: SessionDep,
pageNum: int,
pageSize: int
):
pagination = PaginationParams(page=pageNum, size=pageSize)
paginator = Paginator(session)
filters = {}
return await paginator.get_paginated_response(
model=user_grid,
pagination=pagination,
**filters)
+5 -3
View File
@@ -1,12 +1,14 @@
from sqlmodel import Session, select
from ..models.user import sys_user
from ..models.user import sys_user, user_grid
from common.core.security import verify_md5pwd
def get_user_by_account(*, session: Session, account: str) -> sys_user | None:
statement = select(sys_user).where(sys_user.account == account)
#statement = select(sys_user).where(sys_user.account == account)
statement = select(user_grid.id, user_grid.account, user_grid.oid, user_grid.password).where(user_grid.account == account)
session_user = session.exec(statement).first()
return session_user
result_user = sys_user.model_validate(session_user)
return result_user
def authenticate(*, session: Session, account: str, password: str) -> sys_user | None:
db_user = get_user_by_account(session=session, account=account)
+11 -2
View File
@@ -1,7 +1,8 @@
from typing import Optional
from sqlmodel import SQLModel, Field
class sys_user(SQLModel, table=True):
class sys_user(SQLModel):
id: int = Field(primary_key=True, index=True)
account: str = Field(max_length=255, unique=True)
password: str = Field(max_length=255)
@@ -12,4 +13,12 @@ class sys_user(SQLModel, table=True):
"id": self.id,
"account": self.account,
"oid": self.oid
}
}
class user_grid(sys_user, table=True):
__tablename__ = "sys_user"
name: str
email: str
status: int
create_time: int
+7 -3
View File
@@ -5,12 +5,12 @@ from fastapi import Depends, HTTPException, status
# from fastapi.security import OAuth2PasswordBearer
from jwt.exceptions import InvalidTokenError
from pydantic import BaseModel, ValidationError
from sqlmodel import Session
from sqlmodel import Session, select
from common.core.schemas import TokenPayload, XOAuth2PasswordBearer
from common.core import security
from common.core.config import settings
from common.core.db import get_session
from apps.system.models.user import sys_user
from apps.system.models.user import sys_user, user_grid
reusable_oauth2 = XOAuth2PasswordBearer(
tokenUrl=f"{settings.API_V1_STR}/login/access-token"
)
@@ -32,7 +32,11 @@ async def get_current_user(session: SessionDep, token: TokenDep) -> sys_user:
status_code=status.HTTP_403_FORBIDDEN,
detail="Could not validate credentials",
)
user = session.get(sys_user, token_data.id)
statement = select(user_grid.id, user_grid.account, user_grid.oid, user_grid.password).where(user_grid.id == token_data.id)
session_user = session.exec(statement).first()
if not session_user:
raise HTTPException(status_code=404, detail="User not found")
user = sys_user.model_validate(session_user)
if not user:
raise HTTPException(status_code=404, detail="User not found")
""" if not user.is_active: