Files
v6ole 848f804169 PingWatch 网络设备离线监控系统
- FastAPI 后端 + Vue 3 前端
- Docker Compose 一键部署
- Casdoor OAuth 认证集成
- LogHive 集中式日志
- 设备批量 CSV 导入/导出
- WebSocket 实时状态推送
- 企业微信告警通知
- fping 高性能并发 Ping 检测

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 15:02:04 +08:00

58 lines
1.7 KiB
Python

"""用户管理 API(管理员)"""
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.deps import get_db
from app.core.auth import get_current_user, require_admin
from app.models.user import User, UserRoleEnum
router = APIRouter(prefix="/api/users", tags=["用户管理"])
@router.get("")
async def list_users(
db: AsyncSession = Depends(get_db),
admin: User = Depends(require_admin),
):
"""获取所有用户"""
result = await db.execute(select(User).order_by(User.id))
users = result.scalars().all()
return [
{
"id": u.id,
"username": u.username,
"display_name": u.display_name,
"role": u.role.value,
"is_active": u.is_active,
"last_login_at": u.last_login_at,
"created_at": u.created_at,
}
for u in users
]
class UpdateUserRoleRequest(BaseModel):
role: str # "admin" or "viewer"
@router.put("/{user_id}/role")
async def update_user_role(
user_id: int,
data: UpdateUserRoleRequest,
db: AsyncSession = Depends(get_db),
admin: User = Depends(require_admin),
):
"""更新用户角色"""
if data.role not in ("admin", "viewer"):
raise HTTPException(status_code=400, detail="无效角色")
if user_id == admin.id:
raise HTTPException(status_code=400, detail="不能修改自己的角色")
new_role = UserRoleEnum.admin if data.role == "admin" else UserRoleEnum.viewer
await db.execute(update(User).where(User.id == user_id).values(role=new_role))
await db.commit()
return {"message": "更新成功"}