[T系统]手帐04:无痕记录系统相关"导出"的日志

本文介绍了一种在导出操作完成后记录详细日志的方法,包括导出者的相关信息、导出时间及URL等内容。通过在导出成功后发送请求保存导出日志,实现了对导出行为的有效追踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

● 开发环境: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();
    }
}
内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值