monitor.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """监控模块接口(操作日志等)"""
  2. from __future__ import annotations
  3. from fastapi import APIRouter, Depends
  4. from sqlalchemy.orm import Session
  5. from app.core.database import get_db
  6. from app.core.menu_guard import require_admin_or_super_admin
  7. from app.core.response import error_response, success_response
  8. from app.crud.monitor.oper_log import get_oper_log, list_oper_logs
  9. from app.schemas.monitor.operlog import OperLogDetailBody, OperLogListBody
  10. router = APIRouter(prefix="/web/monitor", tags=["系统监控"])
  11. def _user_info(user: dict) -> dict:
  12. dept_id = (user.get("region_id") or user.get("dept_id") or "").strip()
  13. return {
  14. "user_id": (user.get("user_id") or user.get("id") or "").strip(),
  15. "role": (user.get("role") or "").strip(),
  16. "tenant_no": (user.get("tenant_no") or "").strip(),
  17. "dept_id": dept_id,
  18. "region_id": dept_id,
  19. }
  20. @router.post("/operlog/list")
  21. def operlog_list(
  22. body: OperLogListBody = None,
  23. user: dict = Depends(require_admin_or_super_admin),
  24. db: Session = Depends(get_db),
  25. ):
  26. """操作日志分页列表(基于 API 请求日志适配 RuoYi OperLog 结构)"""
  27. try:
  28. page = body.page if body else 1
  29. page_size = body.page_size if body else 10
  30. info = _user_info(user)
  31. rows, total = list_oper_logs(
  32. db,
  33. page=page,
  34. page_size=page_size,
  35. title=body.title if body else None,
  36. business_type=body.business_type if body else None,
  37. business_id=body.business_id if body else None,
  38. business_title=body.business_title if body else None,
  39. oper_name=body.oper_name if body else None,
  40. status=body.status if body else None,
  41. user_info=info,
  42. tenant_no=info.get("tenant_no"),
  43. )
  44. total_pages = (total + page_size - 1) // page_size if page_size else 0
  45. return success_response(
  46. {
  47. "rows": rows,
  48. "list": rows,
  49. "total": total,
  50. "page": page,
  51. "pageSize": page_size,
  52. "totalPages": total_pages,
  53. }
  54. )
  55. except Exception as e:
  56. return error_response(500, str(e))
  57. @router.post("/operlog/detail")
  58. def operlog_detail(
  59. body: OperLogDetailBody,
  60. user: dict = Depends(require_admin_or_super_admin),
  61. db: Session = Depends(get_db),
  62. ):
  63. """操作日志详情"""
  64. try:
  65. info = _user_info(user)
  66. row = get_oper_log(db, body.id, user_info=info, tenant_no=info.get("tenant_no"))
  67. if not row:
  68. return error_response(404, "操作日志不存在")
  69. return success_response(row)
  70. except Exception as e:
  71. return error_response(500, str(e))