style: 使用ruff格式化日志管理模块,优化导入
This commit is contained in:
@@ -1,30 +1,47 @@
|
||||
from fastapi import APIRouter
|
||||
from fastapi import Depends
|
||||
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 fastapi import APIRouter, Depends, Request
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from config.enums import BusinessType
|
||||
from utils.response_util import *
|
||||
from utils.log_util import *
|
||||
from utils.page_util import *
|
||||
from config.get_db import get_db
|
||||
from module_admin.annotation.log_annotation import log_decorator
|
||||
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('导出成功')
|
||||
|
||||
|
@@ -1,10 +1,10 @@
|
||||
from sqlalchemy import select, update, delete, asc, desc
|
||||
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 utils.common_util import SnakeCaseUtil
|
||||
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 SysLogininfor, SysOperLog
|
||||
from module_admin.entity.vo.log_vo import LogininforModel, LoginLogPageQueryModel, OperLogModel, OperLogPageQueryModel
|
||||
from utils.common_util import SnakeCaseUtil
|
||||
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))
|
||||
|
@@ -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='日志主键')
|
||||
|
@@ -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='用户名称')
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user