BookSystem/backend/auth/apps/roles/urls.py
jayhgq 83d84254f5 feat: 增强用户、角色和权限管理功能
- 在用户、角色和权限的API中添加模糊查询支持
- 更新CRUD选项以支持查询参数的转换
- 优化前端管理页面,提升用户体验
- 删除不再使用的旧资产文件以减小包体积
2026-05-09 13:13:45 +08:00

120 lines
3.7 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from fastcrud import FastCRUD
from database import get_db
from models import Role, User
from schemas import RoleCreate, RoleResponse
from middleware import get_current_user
from utils.like_filter import ilike_contains
router = APIRouter(prefix="/roles", tags=["roles"])
# 创建FastCRUD实例
role_crud = FastCRUD(Role, RoleResponse)
@router.post("/", response_model=RoleResponse)
async def create_role(
role_data: RoleCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""创建角色"""
# 检查角色名是否已存在
from sqlalchemy import select
result = await db.execute(select(Role).filter(Role.name == role_data.name))
existing_role = result.scalar_one_or_none()
if existing_role:
raise HTTPException(status_code=400, detail="角色名已存在")
# 准备创建数据
create_data = role_data.model_dump()
# 使用FastCRUD创建角色
created_role = await role_crud.create(db, create_data)
return created_role
@router.get("/", response_model=list[RoleResponse])
async def get_roles(
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
name: str | None = Query(None, description="角色名称,模糊匹配"),
):
"""获取角色列表;支持按名称模糊查询"""
stmt = select(Role)
cond = ilike_contains(Role.name, name)
if cond is not None:
stmt = stmt.where(cond)
result = await db.execute(stmt)
rows = result.scalars().all()
return [RoleResponse.model_validate(r) for r in rows]
@router.get("/{role_id}", response_model=RoleResponse)
async def get_role(
role_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""获取单个角色"""
role = await role_crud.get(db, {"id": role_id})
if not role:
raise HTTPException(status_code=404, detail="角色不存在")
return role
@router.put("/{role_id}", response_model=RoleResponse)
async def update_role(
role_id: int,
role_data: RoleCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""更新角色"""
# 检查角色名是否被其他角色使用
from sqlalchemy import select
result = await db.execute(
select(Role).filter(Role.name == role_data.name, Role.id != role_id)
)
existing_role = result.scalar_one_or_none()
if existing_role:
raise HTTPException(status_code=400, detail="角色名已存在")
# 准备更新数据
update_data = role_data.model_dump()
# 使用FastCRUD更新角色
updated_role = await role_crud.update(db, {"id": role_id}, update_data)
if not updated_role:
raise HTTPException(status_code=404, detail="角色不存在")
return updated_role
@router.delete("/{role_id}")
async def delete_role(
role_id: int,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user),
):
"""删除角色"""
# 检查是否有用户使用此角色
from sqlalchemy import select
result = await db.execute(select(User).filter(User.role_id == role_id))
users = result.scalars().all()
if users:
raise HTTPException(
status_code=400, detail=f"该角色正在被 {len(users)} 个用户使用,无法删除"
)
# 使用FastCRUD删除角色
deleted = await role_crud.delete(db, {"id": role_id})
if not deleted:
raise HTTPException(status_code=404, detail="角色不存在")
return {"message": "角色删除成功"}