操作日志记录设计一、显示层:1、功能描述:在页面加载完成后,利用JS记录需要记录的值到对应的隐藏域中。当页面操作成功后利用JS对表单数据进行比对,记录改动过的内容并保存到隐藏域中,供后台调用。2、日志数据:提交日志的数据格式为JSON格式,其中operType代表操作类型:add代表添加,update代表更新,del代表删除,primary_key代表数据主键;log代表日志信息;2.1、JSON格式定义A、方法一:.添加数据时,添加多表,多记录时的格式{operType:add,businessName:value,log:[{primarykey_propertyname@TABLENAME:value,primarykey_propertyname@TABLENAME:value2,...},{...}]}(注:TABLENAME要大写,primarykey_propertyname小写(与数据库中的字段对应以下类同)方法二:如果进行日志时,需后台向前台添加的值太多,可以直接在后台按照如下方式添加添加businessName:模块名称,url:添加操作的路径addLogData:以listMapString,Object的形式存放主键值调用方法:logOperationService.resolveAddOper(url,businessName,addLogData);@AutowiredprivateLogOperationServicelogOperationService;publicListSchedulegetSchedule(Stringdata){StringbusinessName=编更管理;Stringurl=makemore/addSchedule;String[]insertSche=data.split(#);ListMapString,ObjectaddLogData=newArrayListMapString,Object();for(inti=0;iinsertSche.length;i++){MapString,Objectmap=newHashMapString,Object();String[]insert=insertSche[i].split(,);if(!.equals(insert[0])&&!.equals(insert[1])&&!.equals(insert[2])){map.put(schedule_code@DP10_SCHEDULE,insert[0]);map.put(bussiness_day@DP10_SCHEDULE,insert[2]);map.put(inner_code@DP10_SCHEDULE,insert[1]);addLogData.add(map);}logOperationService.resolveAddOper(url,businessName,addLogData);}2.B、更新数据进,更新多表,多记录时的格式{operType:update,businessName:value,log:[{property_name@TABLENAME:[old,new]},{..}]}C、删除数据时,多表,多记录时{operType:add,businessName:value,log:[{primarykey_propertyname@TABLENAME:value,primarykey_propertyname2@TABLENAME:value2,...},{...}]}3.、javascript方法定义(文件名:logOperation.js)3.1方法名称:setOldPropertyGroup([{},{}])功能描述:此方法用于数据更新时,把前端的初始值传递进来。数据格式为:“{}”代表每条件记录,然后把他们放在数组“[]”中。3.2方法名称:compareInputVal()功能描述:此方法用于数据更新时,用户提交数据时应调用的方法。用于与初始数据进行比对。分析出用户变更的内容。返回值:JSON格式字符串3.3方法名称:setNewPropertyGroup([{},{}])功能描述:更新时,在提交之前调用把改动过后的数据传递进来,数据格式为:“{}”代表每条件记录,然后把他们放在数组“[]”中更新信息写在[{},{}...]实例:初始进存入[{“username”:”zg”,”age”:”20”primaryKey:{property_name@TABLENAME:”西九龙”,property_name@TABLENAME:”20”},}],其中”primaryKey”放的是主键键值对更新完成后存入[{“username”:”ww”,”age”:”25”,primaryKey:{property_name@TABLENAME:”西九龙”,property_name@TABLENAME:”20”},}]其中”primaryKey”放的是更新所在行主键键值对3.4方法名称:getPrimaryKeyValue(primaryKeyJSON)功能描述:此方法用于添加时调于,主要用于设置添加的记录的主键值参数:JSON格式的数据。格式为由多个JSON对象组成的数组,每个JSON对象为一条记录:[{column1@TABLENAME1:value,column2@TABLENAME2:value},{...},...]格式中的“column”代表数据表的主键的属性名称。“value”代表主皱起主键值返回值:JSON字符串3.5方法调用实例:log=newLog(“业务名称”);log是唯一标示在构建对象时把业务名称当作参数传入。然后根据需要调用下列方法3.5.1添加数据时的单记录添加方法调用:提交数据时调用getAddPrimaryKeyValue([{“primaryKey@TABLENAME”:”1”,”primaryKey@TABLENAME”:”2”}]);最后把返回值赋值给addLogData提交3.5.21.添加数据时的多表多记录时的调用:提交数据时调用getAddPrimaryKeyValue([{“tb1_id@TABLENAME”:”1”,”tb2_id@TABLENAME”:”1”},{“id@TABLENAME2”:”2”,”tb2_id@TABLENAME2”:”2”},...]);最后把返回值赋值给addLogData提交3.5.3删除时调用请参照上述的添加调用。只是方法调用getDelPrimaryKeyValue([{“id@TABLENAME”:”1”,”id2@TABLENAME”:”2”}]);3.5.4更新数据时,其中每个“{}”代表一条记录加载数据完成后调用(更新前)setOldPropertyGroup([{},{}]);然后提交数据时调用(更新后)setNewPropertyGroup([{},{}])compareInputVal();最后把返回值赋值给logData提交4:将操作记录传递到后台的实例必须在操作成功后,进行日志操作如:if(msg==”操作成功”){$.ajax(url:projectName+/sys/operatorLog,Data:{urlData:操作时的路径(更新,增加,删除的路径),logData:操作记录(更新:logData,新增和删除:addLogData)}注:url为固定的路径二、服务层1、功能描述:解析提交的JSON日志数据,把其中的内容拆分进行存储。2、方法定义publicvoidsaveLog(Stringurl,StringlogData,StringofficeNo,StringinnerCode,StringoperatorNo);存储日志记录;privateMapString,ObjectresolveUpdateOper(Stringurl,JSONObjectjsonObj)解析更新时的日志数据,返回旧值与新值privateMapString,ObjectresolveAddOrDelOper(Stringurl,JSONObjectjsonObj)解析添加或删除时的日志数据,返回添加值,存储在key值为“NEW_VALUE”中4、过程描述:把用户提交的数据,通过sping的拦截器进行URL拦截,之后通过URL与之关连的table找到提交的页面属性与字段的对应关系,通过合理的解析存储在表的相应字段中。三、数据层1.功能描述:通过服务层的处理把结果存储在日志记录表中。列名添加更新删除OPERATE_ITEM[{colname@TABLENAME,colname2@TABLENAME,...},{}][{colname@TABLENAME,colname2@TABLENAME,...},{}][{colname@TABLENAME,colname2@TABLENAME,...},{}]OLD_VALUE[{},{},...]NEW_VALUE[{},{},...][{},{},...][{},{},...]OPERATE_TYPE添加更新删除LOG_CONTEXT提交的日志内容提交的日志内容提交的日志内容OPERATE_OBJECTtableName1,tableName2...tableName1,tableName2...tableName1,tableName2...OPERATE_COLUMN_TEXT[{},{},...][{},{},...][{},{},...]日志添加方法2日志添加方法2同方法1一样,在1基础上进行了完善,除去了在前台js,jsp中添加代码这个繁琐的过程,其代码如下图图中我们可以看到,这是一个添加任务操作,task这个实体有20多个参数,我们要添加日志只需要编写以下行代码即可完成添加操作//主键idSetObjectprimaryKey=newHashSetObject();primaryKey.add(taskId);//比较不同ObjectCompareResultcompResult=operationLogService.Compare(null,task,true,primaryKey);第一个参数为原来的实体,由于是添加操作,写成null,如果是更新操作需要通过主键(taskId)将原来的数据从库中查出来,第二个参数为需要添加/更新的实体,即数据发生了变化的实体(某些参数发生了变化)第三个参数为是否转换名字,这里默认要填true如果你的实体是model,即由mybatis3插件生成的实体(model,mapper,xml),这就要写成true如果你的实体是dto(例:officeDto,common下dto包中),这就要写成false,详询宋健第4个参数为主键//放入结果集,并记录MapString,ObjectCompareResultCompareResultMap=newHashMapString,ObjectCompareResult();CompareResultMap.put(DC10_TIMERTASK,compResult);operationLogService.recordOperation(getUserContext(),添加任务,/task/add,SysConstant.OPER_LOG.ADD,CompareResultMap);CompareResultMap中的keyvalue对应规则Key为table名字,一定要大写Value为talbe中实体的对比结果(ObjectCompareResult)TaskController中的添加操作为具体例实,可以参考,不清楚详询宋健