sys_logininfor.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # -*- coding: utf-8 -*-
  2. # @Author : YY
  3. import re
  4. from typing import List
  5. from flask import g
  6. from sqlalchemy import delete, insert, select
  7. from ruoyi_common.base.model import ExtraModel
  8. from ruoyi_common.sqlalchemy.model import ColumnEntityList
  9. from ruoyi_common.sqlalchemy.transaction import Transactional
  10. from ruoyi_system.domain.entity import SysLogininfor
  11. from ruoyi_admin.ext import db
  12. from ruoyi_system.domain.po import SysLogininforPo
  13. class SysLogininforMapper:
  14. """
  15. 登录日志的数据访问层
  16. """
  17. default_fields = {
  18. "info_id", "user_name", "ipaddr", "login_location", "browser", "os",
  19. "status", "msg", "login_time", "status"
  20. }
  21. default_columns = ColumnEntityList(SysLogininforPo, default_fields, False)
  22. @classmethod
  23. @Transactional(db.session)
  24. def insert_logininfor(cls, info: SysLogininfor) -> int:
  25. """
  26. 新增系统登录日志
  27. Args:
  28. info (SysLogininfor): 系统登录日志对象
  29. Returns:
  30. int: 新增记录的ID
  31. """
  32. fields = {
  33. "user_name", "status", "ipaddr", "login_location", "browser", "os",
  34. "msg", "login_time"
  35. }
  36. data = info.model_dump(
  37. include=fields, exclude_none=True, exclude_unset=True,
  38. )
  39. stmt = insert(SysLogininforPo).values(data)
  40. out = db.session.execute(stmt).inserted_primary_key
  41. return out[0] if out else 0
  42. @classmethod
  43. def select_logininfor_list(cls, info: SysLogininfor) -> List[SysLogininforPo]:
  44. """
  45. 查询系统登录日志集合
  46. Args:
  47. info (SysLogininfor): 系统登录日志对象
  48. Returns:
  49. List[SysLogininforPo]: 系统登录日志集合
  50. """
  51. criterions = []
  52. if info.ipaddr:
  53. criterions.append(SysLogininforPo.ipaddr.like(f"%{info.ipaddr}%"))
  54. if info.status:
  55. criterions.append(SysLogininforPo.status == info.status)
  56. if info.user_name:
  57. criterions.append(SysLogininforPo.user_name.like(f"%{info.user_name}%"))
  58. if "criterian_meta" in g and g.criterian_meta.extra:
  59. extra:ExtraModel = g.criterian_meta.extra
  60. if extra.start_time and extra.end_time:
  61. criterions.append(SysLogininforPo.create_time >= extra.start_time)
  62. criterions.append(SysLogininforPo.create_time <= extra.end_time)
  63. stmt = select(*cls.default_columns) \
  64. .where(*criterions)
  65. stmt = cls._apply_sorting(stmt)
  66. if "criterian_meta" in g and g.criterian_meta.page:
  67. g.criterian_meta.page.stmt = stmt
  68. rows = db.session.execute(stmt).all()
  69. return [cls.default_columns.cast(row, SysLogininfor) for row in rows]
  70. @classmethod
  71. def _apply_sorting(cls, stmt):
  72. sort = getattr(getattr(g, "criterian_meta", None), "sort", None)
  73. order_columns = []
  74. if sort and sort.order_by_column:
  75. for alias in sort.order_by_column:
  76. field_name = cls._camel_to_snake(alias)
  77. column = getattr(SysLogininforPo, field_name, None)
  78. if not column:
  79. continue
  80. if sort.is_asc == "asc":
  81. order_columns.append(column.asc())
  82. else:
  83. order_columns.append(column.desc())
  84. if not order_columns:
  85. order_columns.append(SysLogininforPo.login_time.desc())
  86. return stmt.order_by(*order_columns)
  87. @staticmethod
  88. def _camel_to_snake(value:str) -> str:
  89. s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', value)
  90. return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
  91. @classmethod
  92. @Transactional(db.session)
  93. def delete_logininfor_by_ids(cls, ids: List[int]) -> int:
  94. """
  95. 批量删除系统登录日志
  96. Args:
  97. ids (List[int]): 系统登录日志ID列表
  98. Returns:
  99. int: 删除的行数
  100. """
  101. stmt = delete(SysLogininforPo).where(SysLogininforPo.info_id.in_(ids))
  102. return db.session.execute(stmt).rowcount
  103. @classmethod
  104. @Transactional(db.session)
  105. def clean_logininfor(cls) -> int:
  106. """
  107. 清空系统登录日志
  108. Returns:
  109. int: 删除的行数
  110. """
  111. stmt = delete(SysLogininforPo)
  112. return db.session.execute(stmt).rowcount