diff --git a/ruoyi-fastapi-backend/module_admin/controller/log_controller.py b/ruoyi-fastapi-backend/module_admin/controller/log_controller.py index 59bce15..328d5c2 100644 --- a/ruoyi-fastapi-backend/module_admin/controller/log_controller.py +++ b/ruoyi-fastapi-backend/module_admin/controller/log_controller.py @@ -1,30 +1,47 @@ -from fastapi import APIRouter -from fastapi import Depends +from fastapi import APIRouter, Depends, Request +from sqlalchemy.ext.asyncio import AsyncSession +from config.enums import BusinessType from config.get_db import get_db -from module_admin.service.login_service import LoginService -from module_admin.service.log_service import * -from module_admin.aspect.interface_auth import CheckUserInterfaceAuth from module_admin.annotation.log_annotation import log_decorator -from config.enums import BusinessType -from utils.response_util import * -from utils.log_util import * -from utils.page_util import * +from module_admin.aspect.interface_auth import CheckUserInterfaceAuth +from module_admin.entity.vo.log_vo import ( + DeleteLoginLogModel, + DeleteOperLogModel, + LoginLogPageQueryModel, + OperLogPageQueryModel, + UnlockUser, +) +from module_admin.service.log_service import LoginLogService, OperationLogService +from module_admin.service.login_service import LoginService from utils.common_util import bytes2file_response +from utils.log_util import logger +from utils.page_util import PageResponseModel +from utils.response_util import ResponseUtil logController = APIRouter(prefix='/monitor', dependencies=[Depends(LoginService.get_current_user)]) -@logController.get("/operlog/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:list'))]) -async def get_system_operation_log_list(request: Request, operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)): +@logController.get( + '/operlog/list', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:list'))], +) +async def get_system_operation_log_list( + request: Request, + operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): # 获取分页数据 - operation_log_page_query_result = await OperationLogService.get_operation_log_list_services(query_db, operation_log_page_query, is_page=True) + operation_log_page_query_result = await OperationLogService.get_operation_log_list_services( + query_db, operation_log_page_query, is_page=True + ) logger.info('获取成功') return ResponseUtil.success(model_content=operation_log_page_query_result) -@logController.delete("/operlog/clean", dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) +@logController.delete('/operlog/clean', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) @log_decorator(title='操作日志管理', business_type=BusinessType.CLEAN) async def clear_system_operation_log(request: Request, query_db: AsyncSession = Depends(get_db)): clear_operation_log_result = await OperationLogService.clear_operation_log_services(query_db) @@ -33,37 +50,57 @@ async def clear_system_operation_log(request: Request, query_db: AsyncSession = return ResponseUtil.success(msg=clear_operation_log_result.message) -@logController.delete("/operlog/{oper_ids}", dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) +@logController.delete('/operlog/{oper_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:remove'))]) @log_decorator(title='操作日志管理', business_type=BusinessType.DELETE) async def delete_system_operation_log(request: Request, oper_ids: str, query_db: AsyncSession = Depends(get_db)): delete_operation_log = DeleteOperLogModel(operIds=oper_ids) - delete_operation_log_result = await OperationLogService.delete_operation_log_services(query_db, delete_operation_log) + delete_operation_log_result = await OperationLogService.delete_operation_log_services( + query_db, delete_operation_log + ) logger.info(delete_operation_log_result.message) return ResponseUtil.success(msg=delete_operation_log_result.message) -@logController.post("/operlog/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:export'))]) +@logController.post('/operlog/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:operlog:export'))]) @log_decorator(title='操作日志管理', business_type=BusinessType.EXPORT) -async def export_system_operation_log_list(request: Request, operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)): +async def export_system_operation_log_list( + request: Request, + operation_log_page_query: OperLogPageQueryModel = Depends(OperLogPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): # 获取全量数据 - operation_log_query_result = await OperationLogService.get_operation_log_list_services(query_db, operation_log_page_query, is_page=False) - operation_log_export_result = await OperationLogService.export_operation_log_list_services(request, operation_log_query_result) + operation_log_query_result = await OperationLogService.get_operation_log_list_services( + query_db, operation_log_page_query, is_page=False + ) + operation_log_export_result = await OperationLogService.export_operation_log_list_services( + request, operation_log_query_result + ) logger.info('导出成功') return ResponseUtil.streaming(data=bytes2file_response(operation_log_export_result)) -@logController.get("/logininfor/list", response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:list'))]) -async def get_system_login_log_list(request: Request, login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_query), query_db: AsyncSession = Depends(get_db)): +@logController.get( + '/logininfor/list', + response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:list'))], +) +async def get_system_login_log_list( + request: Request, + login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): # 获取分页数据 - login_log_page_query_result = await LoginLogService.get_login_log_list_services(query_db, login_log_page_query, is_page=True) + login_log_page_query_result = await LoginLogService.get_login_log_list_services( + query_db, login_log_page_query, is_page=True + ) logger.info('获取成功') return ResponseUtil.success(model_content=login_log_page_query_result) -@logController.delete("/logininfor/clean", dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) +@logController.delete('/logininfor/clean', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) @log_decorator(title='登录日志管理', business_type=BusinessType.CLEAN) async def clear_system_login_log(request: Request, query_db: AsyncSession = Depends(get_db)): clear_login_log_result = await LoginLogService.clear_login_log_services(query_db) @@ -72,7 +109,9 @@ async def clear_system_login_log(request: Request, query_db: AsyncSession = Depe return ResponseUtil.success(msg=clear_login_log_result.message) -@logController.delete("/logininfor/{info_ids}", dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))]) +@logController.delete( + '/logininfor/{info_ids}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:remove'))] +) @log_decorator(title='登录日志管理', business_type=BusinessType.DELETE) async def delete_system_login_log(request: Request, info_ids: str, query_db: AsyncSession = Depends(get_db)): delete_login_log = DeleteLoginLogModel(infoIds=info_ids) @@ -82,9 +121,11 @@ async def delete_system_login_log(request: Request, info_ids: str, query_db: Asy return ResponseUtil.success(msg=delete_login_log_result.message) -@logController.get("/logininfor/unlock/{user_name}", dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:unlock'))]) +@logController.get( + '/logininfor/unlock/{user_name}', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:unlock'))] +) @log_decorator(title='登录日志管理', business_type=BusinessType.OTHER) -async def clear_system_login_log(request: Request, user_name: str, query_db: AsyncSession = Depends(get_db)): +async def unlock_system_user(request: Request, user_name: str, query_db: AsyncSession = Depends(get_db)): unlock_user = UnlockUser(userName=user_name) unlock_user_result = await LoginLogService.unlock_user_services(request, unlock_user) logger.info(unlock_user_result.message) @@ -92,11 +133,17 @@ async def clear_system_login_log(request: Request, user_name: str, query_db: Asy return ResponseUtil.success(msg=unlock_user_result.message) -@logController.post("/logininfor/export", dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:export'))]) +@logController.post('/logininfor/export', dependencies=[Depends(CheckUserInterfaceAuth('monitor:logininfor:export'))]) @log_decorator(title='登录日志管理', business_type=BusinessType.EXPORT) -async def export_system_login_log_list(request: Request, login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_form), query_db: AsyncSession = Depends(get_db)): +async def export_system_login_log_list( + request: Request, + login_log_page_query: LoginLogPageQueryModel = Depends(LoginLogPageQueryModel.as_form), + query_db: AsyncSession = Depends(get_db), +): # 获取全量数据 - login_log_query_result = await LoginLogService.get_login_log_list_services(query_db, login_log_page_query, is_page=False) + login_log_query_result = await LoginLogService.get_login_log_list_services( + query_db, login_log_page_query, is_page=False + ) login_log_export_result = await LoginLogService.export_login_log_list_services(login_log_query_result) logger.info('导出成功') diff --git a/ruoyi-fastapi-backend/module_admin/dao/log_dao.py b/ruoyi-fastapi-backend/module_admin/dao/log_dao.py index 5161bea..547aca9 100644 --- a/ruoyi-fastapi-backend/module_admin/dao/log_dao.py +++ b/ruoyi-fastapi-backend/module_admin/dao/log_dao.py @@ -1,10 +1,10 @@ -from sqlalchemy import select, update, delete, asc, desc +from datetime import datetime, time +from sqlalchemy import asc, delete, desc, select from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.do.log_do import SysOperLog, SysLogininfor -from module_admin.entity.vo.log_vo import * -from utils.page_util import PageUtil +from module_admin.entity.do.log_do import SysLogininfor, SysOperLog +from module_admin.entity.vo.log_vo import LogininforModel, LoginLogPageQueryModel, OperLogModel, OperLogPageQueryModel from utils.common_util import SnakeCaseUtil -from datetime import datetime, time +from utils.page_util import PageUtil class OperationLogDao: @@ -25,20 +25,27 @@ class OperationLogDao: order_by_column = asc(getattr(SysOperLog, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None)) elif query_object.is_asc == 'descending': order_by_column = desc( - getattr(SysOperLog, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None)) + getattr(SysOperLog, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) else: order_by_column = desc(SysOperLog.oper_time) - query = select(SysOperLog) \ - .where(SysOperLog.title.like(f'%{query_object.title}%') if query_object.title else True, - SysOperLog.oper_name.like(f'%{query_object.oper_name}%') if query_object.oper_name else True, - SysOperLog.business_type == query_object.business_type if query_object.business_type else True, - SysOperLog.status == query_object.status if query_object.status else True, - SysOperLog.oper_time.between( - datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.begin_time and query_object.end_time else True) \ - .distinct() \ + query = ( + select(SysOperLog) + .where( + SysOperLog.title.like(f'%{query_object.title}%') if query_object.title else True, + SysOperLog.oper_name.like(f'%{query_object.oper_name}%') if query_object.oper_name else True, + SysOperLog.business_type == query_object.business_type if query_object.business_type else True, + SysOperLog.status == query_object.status if query_object.status else True, + SysOperLog.oper_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() .order_by(order_by_column) + ) operation_log_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return operation_log_list @@ -65,10 +72,7 @@ class OperationLogDao: :param operation_log: 操作日志对象 :return: """ - await db.execute( - delete(SysOperLog) - .where(SysOperLog.oper_id.in_([operation_log.oper_id])) - ) + await db.execute(delete(SysOperLog).where(SysOperLog.oper_id.in_([operation_log.oper_id]))) @classmethod async def clear_operation_log_dao(cls, db: AsyncSession): @@ -77,9 +81,7 @@ class OperationLogDao: :param db: orm对象 :return: """ - await db.execute( - delete(SysOperLog) - ) + await db.execute(delete(SysOperLog)) class LoginLogDao: @@ -98,22 +100,30 @@ class LoginLogDao: """ if query_object.is_asc == 'ascending': order_by_column = asc( - getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None)) + getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) elif query_object.is_asc == 'descending': order_by_column = desc( - getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None)) + getattr(SysLogininfor, SnakeCaseUtil.camel_to_snake(query_object.order_by_column), None) + ) else: order_by_column = desc(SysLogininfor.login_time) - query = select(SysLogininfor) \ - .where(SysLogininfor.ipaddr.like(f'%{query_object.ipaddr}%') if query_object.ipaddr else True, - SysLogininfor.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, - SysLogininfor.status == query_object.status if query_object.status else True, - SysLogininfor.login_time.between( - datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), - datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59))) - if query_object.begin_time and query_object.end_time else True) \ - .distinct() \ + query = ( + select(SysLogininfor) + .where( + SysLogininfor.ipaddr.like(f'%{query_object.ipaddr}%') if query_object.ipaddr else True, + SysLogininfor.user_name.like(f'%{query_object.user_name}%') if query_object.user_name else True, + SysLogininfor.status == query_object.status if query_object.status else True, + SysLogininfor.login_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), + ) + if query_object.begin_time and query_object.end_time + else True, + ) + .distinct() .order_by(order_by_column) + ) login_log_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) return login_log_list @@ -140,10 +150,7 @@ class LoginLogDao: :param login_log: 登录日志对象 :return: """ - await db.execute( - delete(SysLogininfor) - .where(SysLogininfor.info_id.in_([login_log.info_id])) - ) + await db.execute(delete(SysLogininfor).where(SysLogininfor.info_id.in_([login_log.info_id]))) @classmethod async def clear_login_log_dao(cls, db: AsyncSession): @@ -152,6 +159,4 @@ class LoginLogDao: :param db: orm对象 :return: """ - await db.execute( - delete(SysLogininfor) - ) + await db.execute(delete(SysLogininfor)) diff --git a/ruoyi-fastapi-backend/module_admin/entity/do/log_do.py b/ruoyi-fastapi-backend/module_admin/entity/do/log_do.py index 19d2b18..f915207 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/do/log_do.py +++ b/ruoyi-fastapi-backend/module_admin/entity/do/log_do.py @@ -1,12 +1,13 @@ -from sqlalchemy import Column, Integer, String, DateTime, Text, BigInteger, Index -from config.database import Base from datetime import datetime +from sqlalchemy import BigInteger, Column, DateTime, Index, Integer, String +from config.database import Base class SysLogininfor(Base): """ 系统访问记录 """ + __tablename__ = 'sys_logininfor' info_id = Column(Integer, primary_key=True, autoincrement=True, comment='访问ID') @@ -15,7 +16,9 @@ class SysLogininfor(Base): login_location = Column(String(255, collation='utf8_general_ci'), nullable=True, default='', comment='登录地点') browser = Column(String(50, collation='utf8_general_ci'), nullable=True, default='', comment='浏览器类型') os = Column(String(50, collation='utf8_general_ci'), nullable=True, default='', comment='操作系统') - status = Column(String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='登录状态(0成功 1失败)') + status = Column( + String(1, collation='utf8_general_ci'), nullable=True, default='0', comment='登录状态(0成功 1失败)' + ) msg = Column(String(255, collation='utf8_general_ci'), nullable=True, default='', comment='提示消息') login_time = Column(DateTime, nullable=True, default=datetime.now(), comment='访问时间') @@ -27,6 +30,7 @@ class SysOperLog(Base): """ 操作日志记录 """ + __tablename__ = 'sys_oper_log' oper_id = Column(BigInteger, primary_key=True, autoincrement=True, comment='日志主键') diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/log_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/log_vo.py index 0d47af9..1866513 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/log_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/log_vo.py @@ -1,22 +1,29 @@ +from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel -from typing import Union, Optional, List, Literal -from datetime import datetime -from module_admin.annotation.pydantic_annotation import as_query, as_form +from typing import Literal, Optional +from module_admin.annotation.pydantic_annotation import as_form, as_query class OperLogModel(BaseModel): """ 操作日志表对应pydantic模型 """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) oper_id: Optional[int] = Field(default=None, description='日志主键') title: Optional[str] = Field(default=None, description='模块标题') - business_type: Optional[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']] = Field(default=None, description='业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据)') + business_type: Optional[Literal[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']] = ( + Field( + default=None, description='业务类型(0其它 1新增 2修改 3删除 4授权 5导出 6导入 7强退 8生成代码 9清空数据)' + ) + ) method: Optional[str] = Field(default=None, description='方法名称') request_method: Optional[str] = Field(default=None, description='请求方式') - operator_type: Optional[Literal[0, 1, 2]] = Field(default=None, description='操作类别(0其它 1后台用户 2手机端用户)') + operator_type: Optional[Literal[0, 1, 2]] = Field( + default=None, description='操作类别(0其它 1后台用户 2手机端用户)' + ) oper_name: Optional[str] = Field(default=None, description='操作人员') dept_name: Optional[str] = Field(default=None, description='部门名称') oper_url: Optional[str] = Field(default=None, description='请求URL') @@ -34,6 +41,7 @@ class LogininforModel(BaseModel): """ 登录日志表对应pydantic模型 """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) info_id: Optional[int] = Field(default=None, description='访问ID') @@ -51,8 +59,11 @@ class OperLogQueryModel(OperLogModel): """ 操作日志管理不分页查询模型 """ + order_by_column: Optional[str] = Field(default=None, description='排序的字段名称') - is_asc: Optional[Literal['ascending', 'descending']] = Field(default=None, description='排序方式(ascending升序 descending降序)') + is_asc: Optional[Literal['ascending', 'descending']] = Field( + default=None, description='排序方式(ascending升序 descending降序)' + ) begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') @@ -63,6 +74,7 @@ class OperLogPageQueryModel(OperLogQueryModel): """ 操作日志管理分页查询模型 """ + page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') @@ -71,6 +83,7 @@ class DeleteOperLogModel(BaseModel): """ 删除操作日志模型 """ + model_config = ConfigDict(alias_generator=to_camel) oper_ids: str = Field(description='需要删除的日志主键') @@ -80,19 +93,22 @@ class LoginLogQueryModel(LogininforModel): """ 登录日志管理不分页查询模型 """ + order_by_column: Optional[str] = Field(default=None, description='排序的字段名称') - is_asc: Optional[Literal['ascending', 'descending']] = Field(default=None, description='排序方式(ascending升序 descending降序)') + is_asc: Optional[Literal['ascending', 'descending']] = Field( + default=None, description='排序方式(ascending升序 descending降序)' + ) begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') - @as_query @as_form class LoginLogPageQueryModel(LoginLogQueryModel): """ 登录日志管理分页查询模型 """ + page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') @@ -101,6 +117,7 @@ class DeleteLoginLogModel(BaseModel): """ 删除登录日志模型 """ + model_config = ConfigDict(alias_generator=to_camel) info_ids: str = Field(description='需要删除的访问ID') @@ -110,6 +127,7 @@ class UnlockUser(BaseModel): """ 解锁用户模型 """ + model_config = ConfigDict(alias_generator=to_camel) user_name: str = Field(description='用户名称') diff --git a/ruoyi-fastapi-backend/module_admin/service/log_service.py b/ruoyi-fastapi-backend/module_admin/service/log_service.py index 51b57c2..0ac8464 100644 --- a/ruoyi-fastapi-backend/module_admin/service/log_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/log_service.py @@ -1,8 +1,20 @@ -from module_admin.dao.log_dao import * -from module_admin.service.dict_service import Request, DictDataService -from module_admin.entity.vo.common_vo import CrudResponseModel +from fastapi import Request +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List from exceptions.exception import ServiceException -from utils.common_util import export_list2excel, CamelCaseUtil +from module_admin.dao.log_dao import LoginLogDao, OperationLogDao +from module_admin.entity.vo.common_vo import CrudResponseModel +from module_admin.entity.vo.log_vo import ( + DeleteLoginLogModel, + DeleteOperLogModel, + LogininforModel, + LoginLogPageQueryModel, + OperLogModel, + OperLogPageQueryModel, + UnlockUser, +) +from module_admin.service.dict_service import DictDataService +from utils.common_util import export_list2excel class OperationLogService: @@ -11,7 +23,9 @@ class OperationLogService: """ @classmethod - async def get_operation_log_list_services(cls, query_db: AsyncSession, query_object: OperLogPageQueryModel, is_page: bool = False): + async def get_operation_log_list_services( + cls, query_db: AsyncSession, query_object: OperLogPageQueryModel, is_page: bool = False + ): """ 获取操作日志列表信息service :param query_db: orm对象 @@ -85,27 +99,31 @@ class OperationLogService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "operId": "日志编号", - "title": "系统模块", - "businessType": "操作类型", - "method": "方法名称", - "requestMethod": "请求方式", - "operName": "操作人员", - "deptName": "部门名称", - "operUrl": "请求URL", - "operIp": "操作地址", - "operLocation": "操作地点", - "operParam": "请求参数", - "jsonResult": "返回参数", - "status": "操作状态", - "error_msg": "错误消息", - "operTime": "操作日期", - "costTime": "消耗时间(毫秒)" + 'operId': '日志编号', + 'title': '系统模块', + 'businessType': '操作类型', + 'method': '方法名称', + 'requestMethod': '请求方式', + 'operName': '操作人员', + 'deptName': '部门名称', + 'operUrl': '请求URL', + 'operIp': '操作地址', + 'operLocation': '操作地点', + 'operParam': '请求参数', + 'jsonResult': '返回参数', + 'status': '操作状态', + 'error_msg': '错误消息', + 'operTime': '操作日期', + 'costTime': '消耗时间(毫秒)', } data = operation_log_list - operation_type_list = await DictDataService.query_dict_data_list_from_cache_services(request.app.state.redis, dict_type='sys_oper_type') - operation_type_option = [dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in operation_type_list] + operation_type_list = await DictDataService.query_dict_data_list_from_cache_services( + request.app.state.redis, dict_type='sys_oper_type' + ) + operation_type_option = [ + dict(label=item.get('dictLabel'), value=item.get('dictValue')) for item in operation_type_list + ] operation_type_option_dict = {item.get('value'): item for item in operation_type_option} for item in data: @@ -116,7 +134,9 @@ class OperationLogService: if str(item.get('businessType')) in operation_type_option_dict.keys(): item['businessType'] = operation_type_option_dict.get(str(item.get('businessType'))).get('label') - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data @@ -128,7 +148,9 @@ class LoginLogService: """ @classmethod - async def get_login_log_list_services(cls, query_db: AsyncSession, query_object: LoginLogPageQueryModel, is_page: bool = False): + async def get_login_log_list_services( + cls, query_db: AsyncSession, query_object: LoginLogPageQueryModel, is_page: bool = False + ): """ 获取登录日志列表信息service :param query_db: orm对象 @@ -194,9 +216,9 @@ class LoginLogService: @classmethod async def unlock_user_services(cls, request: Request, unlock_user: UnlockUser): - locked_user = await request.app.state.redis.get(f"account_lock:{unlock_user.user_name}") + locked_user = await request.app.state.redis.get(f'account_lock:{unlock_user.user_name}') if locked_user: - await request.app.state.redis.delete(f"account_lock:{unlock_user.user_name}") + await request.app.state.redis.delete(f'account_lock:{unlock_user.user_name}') return CrudResponseModel(is_success=True, message='解锁成功') else: raise ServiceException(message='该用户未锁定') @@ -210,15 +232,15 @@ class LoginLogService: """ # 创建一个映射字典,将英文键映射到中文键 mapping_dict = { - "infoId": "访问编号", - "userName": "用户名称", - "ipaddr": "登录地址", - "loginLocation": "登录地点", - "browser": "浏览器", - "os": "操作系统", - "status": "登录状态", - "msg": "操作信息", - "loginTime": "登录日期" + 'infoId': '访问编号', + 'userName': '用户名称', + 'ipaddr': '登录地址', + 'loginLocation': '登录地点', + 'browser': '浏览器', + 'os': '操作系统', + 'status': '登录状态', + 'msg': '操作信息', + 'loginTime': '登录日期', } data = login_log_list @@ -228,7 +250,9 @@ class LoginLogService: item['status'] = '成功' else: item['status'] = '失败' - new_data = [{mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data] + new_data = [ + {mapping_dict.get(key): value for key, value in item.items() if mapping_dict.get(key)} for item in data + ] binary_data = export_list2excel(new_data) return binary_data