You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-Flask/iti/applications/routes/sys/log.py

81 lines
2.4 KiB
Python

from apiflask import APIBlueprint
from iti.applications.common.utils import page_schema, page, success
from iti.applications.models import SysLog, LogSchema
from .schemas.log import LogQuery, LogBatchDeleteRequest
from iti.applications.common import ModelFilter
from flask_jwt_extended import jwt_required
from iti.applications.extensions import db
from sqlalchemy import select, delete
from iti.applications.common import permission
bp = APIBlueprint("sys_log", __name__, url_prefix="/log", tag="系统.日志管理")
@bp.get("/page")
@jwt_required()
@bp.doc(security="JWT")
@permission("system:log:list")
@bp.input(LogQuery.Schema, location="query")
@bp.output(page_schema(LogSchema))
def page_log(query_data: LogQuery):
"""
分页查询日志
"""
query = select(SysLog).order_by(SysLog.created_at.desc())
if query_data.keyword:
kw = ModelFilter.escape_like(query_data.keyword)
query = query.filter(
SysLog.name.like(f"%{kw}%")
| SysLog.desc.like(f"%{kw}%")
| SysLog.path.like(f"%{kw}%")
| SysLog.ip.like(f"%{kw}%")
)
else:
if query_data.type:
query = query.filter(SysLog.type == query_data.type)
if query_data.createdAt and len(query_data.createdAt) >= 2:
query = query.filter(
SysLog.created_at.between(
query_data.createdAt[0], query_data.createdAt[1]
)
)
ret = db.paginate(query, page=query_data.page, per_page=query_data.size)
return page(ret)
@bp.delete("/<string:id>")
@jwt_required()
@bp.doc(security="JWT")
@permission("system:log:delete")
def delete_log(id: str):
"""
删除日志
"""
db.session.execute(delete(SysLog).filter_by(id=id))
db.session.commit()
return success()
@bp.delete("/batch")
@jwt_required()
@bp.doc(security="JWT")
@permission("system:log:delete")
@bp.input(LogBatchDeleteRequest.Schema, location="query")
def batch_delete_log(query_data: LogBatchDeleteRequest):
"""
批量删除日志
"""
delete_stmt = delete(SysLog)
conditions = []
if query_data.ids and len(query_data.ids) > 0:
conditions.append(SysLog.id.in_(query_data.ids))
if query_data.type:
conditions.append(SysLog.type == query_data.type)
if conditions:
delete_stmt = delete_stmt.where(*conditions)
db.session.execute(delete_stmt)
db.session.commit()
return success()