| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- """
- 管理员管理接口
- """
- from fastapi import APIRouter, Depends, Query, Request
- from sqlalchemy.orm import Session
- from pydantic import BaseModel
- from app.database import get_db
- from app.api.deps import get_current_admin
- from app.models.admin import Admin
- from app.core.security import get_password_hash, verify_password
- from datetime import datetime
- from app.utils.timezone import beijing_now
- router = APIRouter()
- class AdminCreate(BaseModel):
- """创建管理员请求"""
- username: str
- password: str
- real_name: str = None
- email: str = None
- role: str = "super_admin"
- class AdminUpdate(BaseModel):
- """更新管理员请求"""
- real_name: str = None
- email: str = None
- role: str = None
- class AdminPasswordReset(BaseModel):
- """重置密码请求"""
- new_password: str
- @router.get("")
- async def get_admins(
- page: int = Query(1, ge=1),
- page_size: int = Query(10, ge=1, le=100),
- keyword: str = Query(None, description="搜索关键词(用户名、邮箱)"),
- role: str = Query(None, description="角色筛选"),
- status: int = Query(None, description="状态筛选:1-正常,0-禁用"),
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """获取管理员列表"""
- offset = (page - 1) * page_size
-
- query = db.query(Admin).filter(Admin.is_deleted == 0)
- # 搜索
- if keyword:
- query = query.filter(
- (Admin.username.like(f"%{keyword}%")) |
- (Admin.email.like(f"%{keyword}%"))
- )
-
- # 筛选
- if role:
- query = query.filter(Admin.role == role)
- if status is not None:
- query = query.filter(Admin.status == status)
-
- # 排序
- query = query.order_by(Admin.created_at.desc())
-
- admins = query.offset(offset).limit(page_size).all()
- total = query.count()
-
- return {
- "code": 200,
- "msg": "成功",
- "data": [
- {
- "id": a.id,
- "username": a.username,
- "real_name": a.real_name,
- "email": a.email,
- "role": a.role,
- "status": a.status,
- "last_login_time": a.last_login_time.isoformat() if a.last_login_time else None,
- "last_login_ip": a.last_login_ip,
- "created_at": a.created_at.isoformat() if a.created_at else None,
- "updated_at": a.updated_at.isoformat() if a.updated_at else None
- }
- for a in admins
- ],
- "total": total,
- "page": page,
- "page_size": page_size
- }
- @router.post("")
- async def create_admin(
- req: AdminCreate,
- request: Request,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """创建管理员"""
- # 检查用户名是否存在
- existing = db.query(Admin).filter(Admin.username == req.username).first()
- if existing:
- return {"code": 400, "msg": "用户名已存在"}
- # 创建管理员
- admin = Admin(
- username=req.username,
- password=get_password_hash(req.password),
- real_name=req.real_name,
- email=req.email,
- # 系统只使用 super_admin 角色,强制写为 super_admin,避免外部传入其他值
- role='super_admin',
- status=1,
- created_at=beijing_now(),
- updated_at=beijing_now()
- )
- db.add(admin)
- # 刷新以获取ID
- db.flush()
- # 创建历史记录
- from app.utils.history import create_admin_history, create_operation_log
- create_admin_history(db, admin, "INSERT")
- # 记录操作日志
- client_ip = request.client.host if request.client else None
- create_operation_log(
- db=db,
- admin_id=current_admin.id,
- module="管理员管理",
- action="创建管理员",
- description=f"创建管理员账号:{req.username}",
- new_data={
- "username": req.username,
- "real_name": req.real_name,
- "email": req.email,
- "role": req.role
- },
- ip_address=client_ip
- )
- # 一次性提交所有更改
- db.commit()
- return {"code": 200, "msg": "创建成功", "data": {"id": admin.id}}
- @router.get("/{admin_id}")
- async def get_admin(
- admin_id: int,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """获取管理员详情"""
- admin = db.query(Admin).filter(Admin.id == admin_id).first()
- if not admin:
- return {"code": 404, "msg": "管理员不存在"}
-
- return {
- "code": 200,
- "msg": "成功",
- "data": {
- "id": admin.id,
- "username": admin.username,
- "real_name": admin.real_name,
- "email": admin.email,
- "role": admin.role,
- "status": admin.status,
- "last_login_time": admin.last_login_time.isoformat() if admin.last_login_time else None,
- "last_login_ip": admin.last_login_ip,
- "created_at": admin.created_at.isoformat() if admin.created_at else None,
- "updated_at": admin.updated_at.isoformat() if admin.updated_at else None
- }
- }
- @router.put("/{admin_id}")
- async def update_admin(
- admin_id: int,
- req: AdminUpdate,
- request: Request,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """更新管理员"""
- admin = db.query(Admin).filter(Admin.id == admin_id).first()
- if not admin:
- return {"code": 404, "msg": "管理员不存在"}
- # 不能修改自己的角色
- if current_admin.id == admin_id and req.role and req.role != admin.role:
- return {"code": 400, "msg": "不能修改自己的角色"}
- # 记录更新前的状态
- old_data = {
- "real_name": admin.real_name,
- "email": admin.email,
- "role": admin.role
- }
- # 更新字段
- if req.real_name is not None:
- admin.real_name = req.real_name
- if req.email is not None:
- admin.email = req.email
- if req.role is not None:
- # 系统只支持 super_admin,任何传入值都统一设置为 super_admin
- admin.role = 'super_admin'
- admin.updated_at = beijing_now()
- # 创建历史记录
- from app.utils.history import create_admin_history, create_operation_log
- create_admin_history(db, admin, "UPDATE")
- # 记录操作日志
- client_ip = request.client.host if request.client else None
- create_operation_log(
- db=db,
- admin_id=current_admin.id,
- module="管理员管理",
- action="更新管理员",
- description=f"更新管理员信息:{admin.username}",
- old_data=old_data,
- new_data={
- "real_name": admin.real_name,
- "email": admin.email,
- "role": admin.role
- },
- ip_address=client_ip
- )
- # 一次性提交所有更改
- db.commit()
- return {"code": 200, "msg": "更新成功"}
- @router.put("/{admin_id}/reset-password")
- async def reset_admin_password(
- admin_id: int,
- req: AdminPasswordReset,
- request: Request,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """重置管理员密码"""
- admin = db.query(Admin).filter(Admin.id == admin_id).first()
- if not admin:
- return {"code": 404, "msg": "管理员不存在"}
- # 更新密码
- admin.password = get_password_hash(req.new_password)
- admin.updated_at = beijing_now()
- # 记录操作日志
- from app.utils.history import create_operation_log
- client_ip = request.client.host if request.client else None
- create_operation_log(
- db=db,
- admin_id=current_admin.id,
- module="管理员管理",
- action="重置管理员密码",
- description=f"为管理员重置密码:{admin.username}",
- ip_address=client_ip
- )
- # 一次性提交所有更改
- db.commit()
- return {"code": 200, "msg": "密码重置成功"}
- @router.put("/{admin_id}/status")
- async def update_admin_status(
- admin_id: int,
- status: int = Query(..., description="状态:1-正常,0-禁用"),
- request: Request = None,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """启用/禁用管理员"""
- admin = db.query(Admin).filter(Admin.id == admin_id).first()
- if not admin:
- return {"code": 404, "msg": "管理员不存在"}
- # 不能禁用自己
- if current_admin.id == admin_id:
- return {"code": 400, "msg": "不能禁用自己"}
- old_status = admin.status
- admin.status = status
- admin.updated_at = beijing_now()
- # 记录操作日志
- from app.utils.history import create_operation_log
- client_ip = request.client.host if request and request.client else None
- status_text = "启用" if status == 1 else "禁用"
- create_operation_log(
- db=db,
- admin_id=current_admin.id,
- module="管理员管理",
- action="更新管理员状态",
- description=f"{status_text}管理员账号:{admin.username}",
- old_data={"status": old_status},
- new_data={"status": status},
- ip_address=client_ip
- )
- # 一次性提交所有更改
- db.commit()
- return {"code": 200, "msg": "状态更新成功"}
- @router.delete("/{admin_id}")
- async def delete_admin(
- admin_id: int,
- request: Request,
- db: Session = Depends(get_db),
- current_admin = Depends(get_current_admin)
- ):
- """删除管理员(软删除)"""
- admin = db.query(Admin).filter(Admin.id == admin_id, Admin.is_deleted == 0).first()
- if not admin:
- return {"code": 404, "msg": "管理员不存在"}
- # 不能删除自己
- if current_admin.id == admin_id:
- return {"code": 400, "msg": "不能删除自己"}
- admin.is_deleted = 1
- admin.updated_at = beijing_now()
- # 创建历史记录
- from app.utils.history import create_admin_history, create_operation_log
- create_admin_history(db, admin, "DELETE")
- # 记录操作日志
- client_ip = request.client.host if request.client else None
- create_operation_log(
- db=db,
- admin_id=current_admin.id,
- module="管理员管理",
- action="删除管理员",
- description=f"删除管理员账号:{admin.username}",
- old_data={
- "username": admin.username,
- "real_name": admin.real_name,
- "email": admin.email,
- "role": admin.role
- },
- ip_address=client_ip
- )
- # 一次性提交所有更改
- db.commit()
- return {"code": 200, "msg": "删除成功"}
|