本文分享在BPM-Table上配置操作日志的经验.最终效果图如下:
需求背景:
系统中已有表RV_XIANGMU(P1项目表),并已有相应视图.
步骤1:新增日志表,表名为LOG_RV_XIANGMU.如下图:
步骤2:新增log_table函数.
函数内容如下:
//入参0:视图自动KEY(用于查找翻译信息) //入参1:旧VO(无值表示新增) //入参2:新VO(无值表示删除) import com.riversoft.platform.po.VwUrl; import com.riversoft.core.db.SequenceService; import java.util.*; //获取视图 VwUrl url = orm.findByPk(VwUrl.class.getName(),args[0]); if(url==null){ throw new Exception("找不到视图["+args[0]+"],请联系管理员."); } //查找实际视图 Map map = null; if("dyn".equals(url.getViewClass())){ //主表视图 map = orm.findByPk("VwDynTable",args[0]); }else if("sub".equals(url.getViewClass())){ //子表视图 map = orm.findByPk("VwSubTable",args[0]); }else{ //错误视图 throw new Exception("视图配置出错,无法登记日志."); } String targetTable = map.get("name"); String logTable = "LOG_"+targetTable; Integer mode ; if(args[1]==null){ mode = 1;//新增 }else if(args[2]==null){ mode = 3;//删除 }else{ mode = 2;//修改 } //获取业务表主键 List keys = new ArrayList(); for(Map column:map.get("columns")){ if(column.get("updatePri")==null){//主键 keys.add(column.get("name")); } } StringBuffer sql = new StringBuffer(); sql.append("insert into ").append(logTable).append(" ("); //业务主键 if(true){ StringBuffer buff = new StringBuffer(); for(Object field:keys){ buff.append(",").append(field); } sql.append(buff.substring(1)); } sql.append(",OPR_MODE,OPR_USER,OPR_TIME,FIELD_VAL,FIELD_NAME,OLD_VAL,OLD_NAME,NEW_VAL,NEW_NAME,BATCH_ID) values ("); //业务主键 if(true){ StringBuffer buff = new StringBuffer(); for(Object field:keys){ buff.append(",").append("?"); } sql.append(buff.substring(1)); } sql.append(",?,?,?,?,?,?,?,?,?,?)"); Long batchId = SequenceService.getInstance().next("LOG"); Map oldVO = args[1]; Map newVO = args[2]; //循环设值 for(Map column:map.get("columns")){ String name = column.get("name"); if(mode==1&&newVO.get(name)==null){ continue; }else if(mode==3&&oldVO.get(name)==null){ continue; }else if(mode==2){ log.debug("["+name+"]-->"); if(oldVO.get(name)==newVO.get(name)){ continue; } } Map vo = (newVO!=null?newVO:oldVO); List objs = new ArrayList(); for(String field:keys){//设置业务主键 objs.add(vo.get(field)); } //OPR_MODE objs.add(mode); //OPR_USER objs.add(session.get("USER").getUid()); //OPR_TIME objs.add(new Date()); //FIELD_VAL objs.add(name); //FIELD_NAME objs.add(column.get("busiName")); //OLD if(oldVO==null||oldVO.get(name)==null){ objs.add(null); objs.add(null); }else{ objs.add(oldVO.get(name)); objs.add(cm.widget(column.get("widget"),oldVO.get(name))); } //NEW if(newVO==null||newVO.get(name)==null){ objs.add(null); objs.add(null); }else{ objs.add(newVO.get(name)); objs.add(cm.widget(column.get("widget"),newVO.get(name))); } //BATCH_ID objs.add(batchId); db.exec(sql.toString(),objs.toArray()); }
步骤3:编辑P1项目表视图,在触发器中调用log_table函数.如下图:
前置处理器中代码:
if(mode==2){//保存旧VO,方便登记日志 variable.put("old_vo",db.findByPk(vo)); }else if(mode==3){ variable.put("old_vo",vo); }
后置处理器中代码:
if(mode==3){ //删除主表时,联动删除所有子表数据 db.exec("delete from RV_MINGXI where MX_XIANGMU_ID = ?",vo.get("XM_ID")); } Object oldVO = (mode==1?null:variable.get("old_vo"));//新增时旧值为空 Object newVO = (mode==3?null:vo);//删除时新值为空 cm.invoke("log_table","hoHoybJfa2X",oldVO,newVO);
至此日志登记功能已经完成.可以在"动态表管理"菜单里面,选择"预览数据",即可查看每次被登记的日志详细信息.
接下来,将新增一个日志表界面,并作为tab标签关联到P1项目表界面中.
步骤4:新增LOG_RV_XIANGMU表界面.
步骤5:最后,在P1主表的"子表信息"里,将已设置的日志视图关联进来.
最终效果可以查看本文开头的效果图.
(完)
需要获取创河软件或Rivev软件(Platform或SDK)的相关资料,请联系riversoft(at)126.com.
相关推荐
本资料"操作日志系统设计"将探讨设计这样一个系统的各个方面,帮助开发者理解和构建自己的操作日志系统。 首先,我们需要理解操作日志的类型。操作日志通常分为两类:用户操作日志和系统操作日志。用户操作日志记录...
在IT行业中,操作日志系统的设计是至关重要的,它能够帮助我们记录并分析系统的操作行为,为故障排查、性能优化、安全审计等提供关键数据。本文将深入探讨如何设计一个真正通用的操作日志系统,使其具备高效性、可...
### 真正通用的操作日志系统设计 #### 一、引言 操作日志系统在现代软件开发中扮演着至关重要的角色。它不仅能够帮助开发者追踪系统的操作历史,还能在出现问题时提供宝贵的信息以便进行故障排查。然而,传统的日志...
java aop 用户操作日志 在每个action\controller 上加上注解 就可以了 例如 @Log(“添加用户”) 日志包含(请求时间,请求ip,请求类名 ,请求方法,请求参数,请求异常)
在MVC(Model-View-Controller)架构中,记录操作日志是一项重要的功能,它能够帮助开发者追踪系统的行为,诊断问题,以及满足审计和合规需求。以下是对这一主题的详细阐述: 1. **MVC架构简介** MVC是一种设计...
在本例中,关注点就是“操作日志”。AOP通过定义切点(Pointcut)来标识需要拦截的方法,然后创建一个通知(Advice),在切点方法执行前后插入额外的操作,如记录日志。Spring提供了两种主要的通知类型:前置通知...
其中,后台操作日志是监控系统运行、维护数据安全、追踪异常行为的关键组成部分。本篇将深入探讨“后台管理插件”,特别关注“后台操作日志.zip”这一主题,旨在为开发者提供详尽的理论知识与实践指南。 一、后台...
"操作日志队列"是一个专门用于处理日志记录的技术概念,尤其在高并发和大数据量的场景下显得尤为重要。这篇博客可能详细阐述了如何使用队列来实现高效的操作日志管理。 首先,队列是一种先进先出(FIFO)的数据结构...
该系统应用于一个大型企业的日志管理,包括日志记录、日志类型管理和日志与类型的关联关系管理。 场景: 该企业拥有多个业务系统,每天会产生大量的日志数据。由于日志数据量庞大,人工处理和管理这些数据非常困难...
在提供的`系统日志操作类.chm`帮助文档中,很可能包含了关于如何设计和实现这样一个日志操作类的详细信息,包括具体的代码示例和使用指南。这将是你理解和使用C#系统日志操作的一个宝贵资源。 总的来说,掌握C#的...
6. **日志显示**:除了将日志写入文件,你还可以设计一个用户界面(UI)来实时显示日志信息,便于监控程序状态。 7. **日志库和工具**:有一些社区开发的LabVIEW工具,如LVLogger,提供了更高级的日志功能,如网络...
《eventlog日志设计文档》主要探讨了在IT系统中如何设计和实现高效且可靠的日志模块,以满足开发人员的诊断和调试需求。以下是该文档的关键知识点: 1. **日志模块的目的**:日志模块的主要目标是为开发人员提供...
日志是程序运行过程中的事件记录,包括但不限于错误信息、警告消息、调试信息、用户操作记录等。这些信息有助于在出现问题时快速定位故障源,从而提高系统的可维护性和稳定性。 Java中常见的日志框架有Log4j、...
"SQL Server误操作日志还原工具"就是为了解决这类问题而设计的。它允许用户在出现误操作后,通过日志回滚来恢复到误操作前的状态,以最大程度地减少数据损失。 SQL Server的日志记录了所有事务的详细历史,包括对...
压缩包内的"写日志操作"文件可能是这个C++日志操作程序的源代码,可以查看并学习其中的设计思路和实现细节。通过阅读源代码,可以更深入地理解上述知识点,并能根据实际项目需求进行定制和优化。
首先,`Logger.php`是日志记录器的接口,定义了日志记录的基本操作,如`writeLog()`。这个接口是所有具体日志记录器(例如`FileLog.php`和`DatabaseLog.php`)需要实现的,确保它们都有相同的行为,即记录日志。 `...
这有助于调试和性能分析,同时也能提供操作日志供日后参考。 **Spring AOP**: 在Spring框架中,动态代理用于实现AOP,它是一种编程范式,旨在将关注点分离,比如日志、事务管理等横切关注点。Spring支持JDK动态...
在IT行业中,日志操作是软件开发中必不可少的一部分,它帮助开发者追踪程序运行的状态,调试错误,以及进行性能分析。本项目聚焦于C++的日志处理,提供了在Xcode和Visual Studio(VC)环境下使用的日志产生类。下面...
在本案例中,我们将关注的是"操作日志"和"缓存模块"。 操作日志模块: 操作日志是软件系统中一个至关重要的组件,它记录了应用程序运行过程中的各种操作和事件,包括但不限于错误、警告、信息和调试消息。通过使用...