Procházet zdrojové kódy

优化登录日志排序

SpringSunYY před 5 měsíci
rodič
revize
512c53b106

+ 6 - 2
ruoyi_system/domain/entity.py

@@ -253,7 +253,7 @@ class SysLogininfor(AuditEntity):
     # 用户账号
     user_name: Annotated[
         Optional[str],
-        Field(default=None,vo=VoAccess(query=True))
+        Field(default=None,vo=VoAccess(query=True,sort=True))
     ]
     
     # 登录状态(0成功 1失败)
@@ -278,7 +278,11 @@ class SysLogininfor(AuditEntity):
     os: Optional[str] = None
     
     # 登录时间
-    login_time: Annotated[Optional[datetime],Field(default_factory=datetime.now)] = None
+    login_time: Annotated[
+        Optional[datetime],
+        BeforeValidator(to_datetime()),
+        Field(default=None,vo=VoAccess(query=True,sort=True))
+    ]
     
     # 提示消息
     msg: Optional[str] = None

+ 25 - 0
ruoyi_system/mapper/sys_logininfor.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 # @Author  : YY
 
+import re
 from typing import List
 from flask import g
 from sqlalchemy import delete, insert, select
@@ -74,6 +75,7 @@ class SysLogininforMapper:
                 criterions.append(SysLogininforPo.create_time <= extra.end_time)
         stmt = select(*cls.default_columns) \
             .where(*criterions)
+        stmt = cls._apply_sorting(stmt)
         if "criterian_meta" in g and g.criterian_meta.page:
             g.criterian_meta.page.stmt = stmt
         
@@ -81,6 +83,29 @@ class SysLogininforMapper:
         return [cls.default_columns.cast(row, SysLogininfor) for row in rows]
 
     @classmethod
+    def _apply_sorting(cls, stmt):
+        sort = getattr(getattr(g, "criterian_meta", None), "sort", None)
+        order_columns = []
+        if sort and sort.order_by_column:
+            for alias in sort.order_by_column:
+                field_name = cls._camel_to_snake(alias)
+                column = getattr(SysLogininforPo, field_name, None)
+                if not column:
+                    continue
+                if sort.is_asc == "asc":
+                    order_columns.append(column.asc())
+                else:
+                    order_columns.append(column.desc())
+        if not order_columns:
+            order_columns.append(SysLogininforPo.login_time.desc())
+        return stmt.order_by(*order_columns)
+
+    @staticmethod
+    def _camel_to_snake(value:str) -> str:
+        s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', value)
+        return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
+
+    @classmethod
     @Transactional(db.session)
     def delete_logininfor_by_ids(cls, ids: List[int]) -> int:
         """