● 开发环境:Eclipse+Tomcat+MySQL+SVN
● 系统架构:JQuery+Bootstrap+JFinal+Memcache
概述:项目后期无痕追加“导出”的日志,记录导出者,导出时间,导出URL等信息;
实现方法:因为导出的方法都是调用公共方法 exportAll,所以在导出方法回调后判断成功与否再发送一个请求保存 exportLog;
1:导出的页面先要有一个列名和对应字段的集合;
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@include file="/WEB-INF/jsp/include/header.inc"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="zh-CN">
<head>
<title>收费信息一览</title>
<script charset="utf-8" src="<%=contextPath%>/res/js/common/exportExcelNew.js"></script>
<script type="text/javascript">
//******************导出必须的 exportColumns ********************
var exportColumns = [];
exportColumns.push({name:'类型',value:'checkType',isdefault:1});
exportColumns.push({name:'订单号',value:'finOrderNO',isdefault:1});
exportColumns.push({name:'年份',value:'claYear',isdefault:1});
exportColumns.push({name:'季节',value:'seaName',isdefault:1});
//导出结果集和所选定的
function toExportAll(){
var _exportUrl = "exportCheckDetails";
//公共导出的方法
exportAll(_exportUrl,exportColumns);
}
</script>
</head>
<body class="bodycss">
<form class="form-horizontal" action="#" id="searchbar">
......
<a class="btn btn-primary" onclick="toExportAll()"><i class=""></i>导出结果集</a>
</form>
</body>
</html>
2:调用公共导出的 js方法的回调中发送请求,添加日志;
- exportExcelNew.js
/**
* 公共导出全部数据方法
* @param _exportUrl 导出方法请求地址
* @param _exportColumns 列对象[{name=姓名,value='name',isdict=0}]
* @param _params 导出选中是确定的唯一表示
* @param formId 传入的表单id,如果不指定则默认为'searchbar'
* @return
*/
function exportAll(_exportUrl,_exportColumns,formId,_exportDoubleColumns){
var queryFormId = formId ? formId : 'searchbar';
var queryParams;
var ser = $("#"+queryFormId).serializeObjs();
queryParams = $.param(ser);
//var queryParams=$("#"+queryFormId).serialize();
var param="page=1";
param+="&pagesize=3000";
param+="&"+queryParams;
if(_exportColumns.length>0){
$.each(_exportColumns,function(i,item){
param+='&exportColumnNames='+item.name;
param+='&exportColumns='+item.value;
param+='&exportColumnIsDict='+(item.isdict==1?1:0);
param+="&exportColIsDefault="+(item.isdefault==1?1:0);
});
}
if(_exportDoubleColumns && _exportDoubleColumns.length>0){
$.each(_exportDoubleColumns,function(i,item){
param+='&exportDoubleColumnNames='+item.name;
param+='&exportDoubleColumns='+item.value;
param+='&exportDoubleColumnIsDict='+(item.isdict==1?1:0);
});
}
$.ajax({
// 后台处理程序
url : _exportUrl,
// 数据发送方式
type : "post",
// 接受数据格式
dataType : "json",
// 要传递的数据
data : param,
beforeSend: function(){
exportLoadingShow();
},
complete: function(){
hideLoading();
},
// 回传函数
success : function(json){
//**************** 插入导出数据的log **************
insertExportLog(_exportUrl,json);
if(json){
if(json.jumpType){
$.xhModalAlert({context:'导出成功<br/><a href="'+contextPath+json.json+'">点击下载</a>',title:"导出"});
}else{
jsonReturnErrorMsg(json);
}
}
}
});
}
//*********************每次导出都会记录日志*********************
function insertExportLog(exportUrl,json){
var expUrl = "";
if(exportUrl.split("/").length >= 4){ //判断传入的相对路径是否齐全,若齐全,则用导出的url,否则手动拼接
expUrl = exportUrl;
}else{
expUrl = document.location.pathname.substr(0, document.location.pathname.lastIndexOf('/')) +"/"+ exportUrl;
}
var projectName = document.location.pathname.substring(0,document.location.pathname.substr(1).indexOf('/')+1);
var expResult = 0; //0:失败; 1:成功;
var expFailReason = "";
var expTitle = document.title;
if(json.jumpType){
expResult = 1;
}else{
expFailReason = json.returnMessage;
}
var param = "exportLog.expResult="+ expResult +"&exportLog.expFailReason="+ expFailReason
+"&exportLog.expTitle="+ expTitle +"&exportLog.expUrl="+ expUrl;
$.ajax({
// 后台处理程序
url : projectName + '/exportlog/insertExportLog',
// 数据发送方式
type : "get",
// 接受数据格式
dataType : "json",
// 要传递的数据
data : param
});
}
- ExportLogController
/**
* @ClassName: ExportLogController
* @Description: 导出的记录
* @author szg
* @date 2018-1-5 上午10:40:48
*
*/
@Before({LoginInterceptor.class,DateJurisdictionInterceptor.class})
@ControllerAnno(controllerkey="/exportlog")
public class ExportLogController extends MyController {
/**
* 每次导出都要记录log
*/
@DataSource(type=DataSourceMap.MASTER)
public void insertExportLog(){
try {
ExportLog exportLog = getModel(ExportLog.class);
exportLog.set("expTime", new Date());
Users currentUser = (Users) this.getUserInfo();
if(currentUser != null){
exportLog.set("expUserId", currentUser.getInt("userId"));
exportLog.set("expUserName", currentUser.getStr("userTrueName"));
}
Department currentDept = (Department) this.getDeptInfo();
if(currentDept != null){
exportLog.set("expDeptId", currentDept.getInt("deptId"));
exportLog.set("expDeptName", currentDept.getStr("deptName"));
}
ExportLog.dao.insertExportLog(exportLog);
this.renderJsonMsgResult(null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
tb_export_log
ExportLog
package com.xh.tms.resource.model;
import java.util.Date;
import com.xh.common.dbModel.ExXhModel;
import com.xh.global.annotation.ModelAnno;
import com.xh.global.model.XhModel;
import com.xh.tms.security.model.Department;
/**
*
* 类描述:导出日志实体
* @author szg
* 2018-1-5 上午10:15:00
*/
@SuppressWarnings("serial")
@ModelAnno(tableName="tb_export_log",primaryKey="expId", prefix = "exp")
public class ExportLog extends ExXhModel<ExportLog> {
public static final ExportLog dao = new ExportLog();
@Getter@Setter
private Integer expResult; //导出的结果 0:失败; 1:成功;
@Getter@Setter
private String expFailReason; //导出的失败的原因
@Getter@Setter
private String expTitle; //导出页面的title
@Getter@Setter
private String expUrl; //导出的url
/**
* 每次导出都添加日志
* @param exportLog
* @param userInfo
* @param deptInfo
* @return
*/
public void insertExportLog(ExportLog exportLog) throws Exception{
exportLog.save();
}
}