本文分享在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.
相关推荐
通用的操作日志设计
操作日志系统通用设计,是付费下载的资料,授权传播,大家可以参考下。下载后即授权转载,可以发给需要的盆友
真正通用的操作日志系统设计,这个是以前看到的资料,觉得不错。此文档版权属于作者本人“加伊”。
java aop 用户操作日志 在每个action\controller 上加上注解 就可以了 例如 @Log(“添加用户”) 日志包含(请求时间,请求ip,请求类名 ,请求方法,请求参数,请求异常)
该系统应用于一个大型企业的日志管理,包括日志记录、日志类型管理和日志与类型的关联关系管理。 场景: 该企业拥有多个业务系统,每天会产生大量的日志数据。由于日志数据量庞大,人工处理和管理这些数据非常困难...
在 日志 管 理系统的设计和实现中首先分析了日志管理系统实现的常用技术,还详细 分析了日志格式一Windows操作系统事件日志、UNIX系统日志和通用防火墙日志。系统 通过采集、筛选分析法、特征匹配分析法、统计网络...
MIS系统操作日志的设计与实现,主要讲了日志的新增。插入到日志文件中。并对其进行有效的管理。
PHP实现工厂模式设计日志记录器,客户可通过修改配置文件灵活地改变日志记录方式
~~~~~~~操作系统课程设计实习报告: 1)FIFO时间片轮转实现线程调度; 2)消息缓冲队列实现进程间的通信; 3)简单的文件系统实现。 tc2.0+vc6.0环境编译通过~~~~
主要介绍了详解基于SpringBoot使用AOP技术实现操作日志管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文设计的系统管理功能模块采用了多用户多角色管理机制,确保不同的用户登录系统后能够操作属于自己权限范围内的功能。系统功能管理模块主要由用户管理子模块、角色管理子模块、角色设置管理子模块、权限管理子模块...
传统意义上的人工日志管理有诸多缺点。比如效率低,耗费时间,重复的操作太多,数据信息常会出现遗漏或者错误。而工作日志管理系统则可以避免以上诸多问题,提高工作效率,满足工作人员的相关需求。
本文将介绍如何使用触发器,把DML(数据操作语言)对数据库中的特定数据表的改动记录下来。因为我们要写入文件系统,安全权限开始有影响了。所以,执行插入操作的用户必须具备该文本文件的读写权限。因此,设计一个C...
软件系统都有详细的日志文件记录系统运行情况,描述了一种基于面向对象的并且采用多线程设计的...的设计与实现,日志管理模块将软件系统中记录日志的操作提取出来形成了独立的模块,降低了系统的耦合度,提高了复用性。
在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的...
操作系统和许多程序会产生各种错误信息、警告信息和其他的提示信息,这种信息会记录到日志里面。系统日志里面有很多东西可以被我们进行分析,所以我们需要对产生的日志进行分析。本次的任务是统计出apache访问日志中...
2. 总体设计 2.1 Hadoop插件安装及部署 第一步:Hadoop环境部署和源数据准备 安装好VMware(查看) 第二步:使用python开发的mapper reducer进行数据处理。 第三步:创建hive数据库,将处理的数据导入hive数据库 ...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
Android系统日志监控系统设计与实现,王军博,王勃,Android操作系统在智能手机操作系统中占70%以上,,相应Android手机病毒等恶意代码的数据危害巨大,严重影响移动互联网安全。Android系统日�