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("/") @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()