package com.xiaopeng.operation.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.xiaopeng.api.model.operation.XpAdminOperationLog; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.utils.WebUtils; import com.xiaopeng.common.core.web.domain.AjaxResult; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.common.log.annotation.AdminOperationLog; import com.xiaopeng.common.log.enums.AdminBusinessType; import com.xiaopeng.common.log.enums.AdminOperationType; import com.xiaopeng.common.security.annotation.InnerAuth; import com.xiaopeng.common.security.annotation.Logical; import com.xiaopeng.common.security.annotation.RequiresPermissions; import com.xiaopeng.operation.exportExcle.XpAdminOperationLogExportExcel; import com.xiaopeng.operation.query.AdminOperationLogPageQuery; import com.xiaopeng.operation.service.IXpAdminOperationLogService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 管理后台操作记录 */ @RestController @RequestMapping({""}) @Api(tags = "管理后台-操作记录") public class XpAdminOperationLogController { private static final DateTimeFormatter EXPORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Resource private IXpAdminOperationLogService adminOperationLogService; // @RequiresPermissions(value = {"/adminOperationLog/list", "/operationLog/list"}, logical = Logical.OR) @GetMapping("/api/v1/adminOperationLog/list") @ApiOperation(value = "管理后台操作记录分页列表", tags = {"管理后台-操作记录"}) public AjaxResult> list(AdminOperationLogPageQuery query) { return AjaxResult.success(adminOperationLogService.pageList(query)); } @PostMapping("/api/v1/adminOperationLog/exportExcel") @ApiOperation(value = "管理后台操作记录导出", tags = {"管理后台-操作记录"}) @AdminOperationLog( businessType = AdminBusinessType.SYSTEM, operationType = AdminOperationType.EXPORT, content = "导出管理后台操作记录", appendRequestData = true ) public void exportExcel(@RequestBody AdminOperationLogPageQuery query) { List list = adminOperationLogService.exportList(query); List exportList = list == null ? new ArrayList<>() : list.stream() .map(this::toExportRow) .collect(Collectors.toList()); HttpServletResponse response = WebUtils.response(); if (response == null) { throw new ServiceException("导出失败:未获取到响应对象"); } response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); try { String fileName = URLEncoder.encode("管理后台操作记录.xls", "utf-8"); response.setHeader("Content-dispodition", "attachment;filename=" + fileName); try (Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpAdminOperationLogExportExcel.class, exportList); ServletOutputStream outputStream = response.getOutputStream()) { workbook.write(outputStream); } } catch (IOException e) { throw new ServiceException("管理后台操作记录导出失败"); } } @RequiresPermissions(value = {"/adminOperationLog/list", "/operationLog/list"}, logical = Logical.OR) @GetMapping("/businessTypeList") @ApiOperation(value = "管理后台操作记录业务类型列表", tags = {"管理后台-操作记录"}) public AjaxResult>> businessTypeList() { List> list = Arrays.stream(AdminBusinessType.values()) .filter(type -> type != AdminBusinessType.OTHER) .sorted(Comparator.comparingInt(AdminBusinessType::getCode)) .map(type -> { Map item = new LinkedHashMap<>(); item.put("code", type.getCode()); item.put("desc", type.getDesc()); item.put("name", type.name()); return item; }) .collect(Collectors.toList()); return AjaxResult.success(list); } // @InnerAuth @PostMapping("/logan/adminOperationLog/saveLog") public R saveLog(@RequestBody XpAdminOperationLog adminOperationLog) { if (adminOperationLog == null || Integer.valueOf(AdminBusinessType.OTHER.getCode()).equals(adminOperationLog.getBusinessType()) || Integer.valueOf(AdminOperationType.OTHER.getCode()).equals(adminOperationLog.getOperationType())) { return R.ok(false); } if (adminOperationLog.getOperationTime() == null) { adminOperationLog.setOperationTime(LocalDateTime.now()); } adminOperationLog.setCreateTime(LocalDateTime.now()); return R.ok(adminOperationLogService.save(adminOperationLog)); } private XpAdminOperationLogExportExcel toExportRow(XpAdminOperationLog log) { XpAdminOperationLogExportExcel row = new XpAdminOperationLogExportExcel(); row.setBusinessTypeName(log.getBusinessTypeName()); row.setOperationTypeName(log.getOperationTypeName()); row.setOperatorName(log.getOperatorName()); row.setOperatorAccount(log.getOperatorAccount()); row.setOperationContent(log.getOperationContent()); row.setOperationIp(log.getOperationIp()); row.setRequestUri(log.getRequestUri()); row.setRequestMethod(log.getRequestMethod()); row.setStatusName(Integer.valueOf(0).equals(log.getStatus()) ? "成功" : "失败"); row.setErrorMsg(log.getErrorMsg()); row.setOperationTime(log.getOperationTime() == null ? null : EXPORT_TIME_FORMATTER.format(log.getOperationTime())); return row; } }