浅谈管理系统操作日志设计(附操作日志类)

开发 前端 项目管理
打个比方,用户需要购买一样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是一系列的业务,如:生成订单 → 生成商品快照 → 发送一条站内信 → 删除购物车里对应宝贝。

管理系统的操作日志如何做成通用的模块一直是个让我头疼的问题,不过看了博客园里的某篇文章后,现在基本解决了。

相关文章链接:《系统操作日志设计

在开始做之前,必须把两个日志分清楚,那就是普通操作日志和业务操作日志,这两者有何区别?

在我理解,普通操作日志就是单表的操作记录,而业务操作日志则就是一系列的普通操作日志的集合。

打个比方,用户需要购买一样宝贝,已经到了下单那步,下单就是个业务,这个业务背后就是一系列的业务,如:生成订单 → 生成商品快照 → 发送一条站内信 → 删除购物车里对应宝贝。

这样一个下单操作就包含了4部分,可以把这4部分看成是4张表,分别对这4张表进行对应的操作,就实现了业务。

但今天我要讲的不是业务操作日志,因为不同项目的业务不尽相同,所以它无法做成通用模块,而我要讲的,就是普通操作日志。

上面解释了一大段,下面干货就要亮相了,先洗把脸清醒下。

首先,哪些地方需要记录操作日志?执行insert、update、delete这3个操作的时候,就需要进行日志,而日志执行的先后顺序如下

 

顺序清楚后,就来看下我写的一份日志操作类吧,***版随便谢谢的,重复代码有点多,还未来得及优化。

  1. class LOG{  
  2.     protected $primaryid;  
  3.     protected $tbid;  
  4.     protected $tbname;  
  5.     protected $keys;  
  6.     protected $values;  
  7.     /**  
  8.      * 参数说明  
  9.      * int              $tbid       查询指定表的id  
  10.      * string           $tbname     数据库表名  
  11.      */ 
  12.     public function insert($tbid$tbname){  
  13.         global $db;  
  14.         //查询表注释  
  15.         $db->query('show table status where name = "'.$tbname.'"');  
  16.         $tb = $db->fetch();  
  17.         //插入日志主表  
  18.         $returnid = $db->insert(0, 2, 'tb_log'array(  
  19.             'adminid = '.$_SESSION['admin']['id'],  
  20.             'type = 1',  
  21.             'tableid = '.$tbid,  
  22.             'tablename = "'.$tbname.'"',  
  23.             'comment = "'.$tb['Comment'].'"',  
  24.             'dt = now()' 
  25.         ));  
  26.         //查询字段注释  
  27.         $db->query('show full columns from '.$tbname);  
  28.         $tb = $db->fetchAll();  
  29.         foreach($tb as $v){  
  30.             $commentArray[$v['Field']] = $v['Comment'];  
  31.         }  
  32.         //查询所有字段信息,插入日志从表  
  33.         $rs = $db->select(0, 1, $tbname'*''and tbid = '.$tbid);  
  34.         $keys = array_keys($rs);  
  35.         $values = array_values($rs);  
  36.         for($i = 0; $i < count($keys); $i++){  
  37.             $db->insert(0, 0, 'tb_log_content'array(  
  38.                 'logid = '.$returnid,  
  39.                 'tbkey = "'.$keys[$i].'"',  
  40.                 'tbvalue = "'.$values[$i].'"',  
  41.                 'comment = "'.$commentArray[$keys[$i]].'"' 
  42.             ));  
  43.         }  
  44.     }  
  45.     public function updateStart($tbid$tbname){  
  46.         global $db;  
  47.         //查询表注释  
  48.         $db->query('show table status where name = "'.$tbname.'"');  
  49.         $tb = $db->fetch();  
  50.         //插入日志主表  
  51.         $returnid = $db->insert(0, 2, 'tb_log'array(  
  52.             'adminid = '.$_SESSION['admin']['id'],  
  53.             'type = 2',  
  54.             'tableid = '.$tbid,  
  55.             'tablename = "'.$tbname.'"',  
  56.             'comment = "'.$tb['Comment'].'"',  
  57.             'dt = now()' 
  58.         ));  
  59.         //查询修改前数据信息  
  60.         $rs = $db->select(0, 1, $tbname'*''and tbid = '.$tbid);  
  61.         $keys = array_keys($rs);  
  62.         $values = array_values($rs);  
  63.         $this->primaryid = $returnid;  
  64.         $this->tbid = $tbid;  
  65.         $this->tbname = $tbname;  
  66.         $this->keys = $keys;  
  67.         $this->values = $values;  
  68.     }  
  69.     public function updateEnd(){  
  70.         global $db;  
  71.         //查询字段注释  
  72.         $db->query('show full columns from '.$this->tbname);  
  73.         $tb = $db->fetchAll();  
  74.         foreach($tb as $v){  
  75.             $commentArray[$v['Field']] = $v['Comment'];  
  76.         }  
  77.         //查询修改后数据信息  
  78.         $rs = $db->select(0, 1, $this->tbname, '*''and tbid = '.$this->tbid);  
  79.         $currentvalues = array_values($rs);  
  80.         //前后信息进行比较  
  81.         for($i = 0; $i < count($currentvalues); $i++){  
  82.             if($this->values[$i] !== $currentvalues[$i]){  
  83.                 $db->insert(0, 0, 'tb_log_content'array(  
  84.                     'logid = '.$this->primaryid,  
  85.                     'tbkey = "'.$this->keys[$i].'"',  
  86.                     'tbvalue = "'.$this->values[$i].'"',  
  87.                     'currenttbvalue = "'.$currentvalues[$i].'"',  
  88.                     'comment = "'.$commentArray[$this->keys[$i]].'"' 
  89.                 ));  
  90.             }  
  91.         }  
  92.     }  
  93.     public function delete($tbid$tbname){  
  94.         global $db;  
  95.         //查询表注释  
  96.         $db->query('show table status where name = "'.$tbname.'"');  
  97.         $tb = $db->fetch();  
  98.         //插入日志主表  
  99.         $returnid = $db->insert(0, 2, 'tb_log'array(  
  100.             'adminid = '.$_SESSION['admin']['id'],  
  101.             'type = 3',  
  102.             'tableid = '.$tbid,  
  103.             'tablename = "'.$tbname.'"',  
  104.             'comment = "'.$tb['Comment'].'"',  
  105.             'dt = now()' 
  106.         ));  
  107.         //查询字段注释  
  108.         $db->query('show full columns from '.$tbname);  
  109.         $tb = $db->fetchAll();  
  110.         foreach($tb as $v){  
  111.             $commentArray[$v['Field']] = $v['Comment'];  
  112.         }  
  113.         //查询所有字段信息,插入日志从表  
  114.         $rs = $db->select(0, 1, $tbname'*''and tbid = '.$tbid);  
  115.         $keys = array_keys($rs);  
  116.         $values = array_values($rs);  
  117.         for($i = 0; $i < count($keys); $i++){  
  118.             $db->insert(0, 0, 'tb_log_content'array(  
  119.                 'logid = '.$returnid,  
  120.                 'tbkey = "'.$keys[$i].'"',  
  121.                 'tbvalue = "'.$values[$i].'"',  
  122.                 'comment = "'.$commentArray[$keys[$i]].'"' 
  123.             ));  
  124.         }  
  125.     }  

使用前,需要引入数据库操作类,这是我之前写的一份,可参考《全新的PDO数据库操作类(仅适用Mysql)》。

引入之后,就可以开始使用了。

select

  1. $log->insert(82, 'tb_member'); 

update

  1. $log->updateStart(82, 'tb_member');   
  2. //中间放更新操作代码   
  3. $log->updateEnd(); 

delete

  1. $log->delete(82, 'tb_member'); 

可以看到,一共只需要两个参数即可,分别是表ID(主键)和表名称。

另外需要强调一点,表注释和字段注释一定要完整,因为记录的信息包含注释,目的就是为了查阅的时候能清楚哪个字段是干什么用的。

下面就看下成品吧

***把表结构分享下,一共2张表,一张主表一张从表,主表记录操作表及操作人等信息,从表记录操作的表字段信息。

  1. -- ----------------------------   
  2. -- Table structure for `tb_log`   
  3. -- ----------------------------   
  4. CREATE TABLE `tb_log` (   
  5.   `tbid` bigint(20) NOT NULL AUTO_INCREMENT,   
  6.   `adminid` bigint(20) DEFAULT NULL COMMENT '管理员id',   
  7.   `type` tinyint(4) DEFAULT '1' COMMENT '操作类型:1新增2修改3删除',   
  8.   `tableid` bigint(20) DEFAULT NULL,   
  9.   `tablename` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '表名',   
  10.   `comment` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   
  11.   `dt` datetime DEFAULT NULL,   
  12.   PRIMARY KEY (`tbid`)   
  13. ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;   
  14.     
  15. -- ----------------------------   
  16. -- Table structure for `tb_log_content`   
  17. -- ----------------------------   
  18. CREATE TABLE `tb_log_content` (   
  19.   `tbid` bigint(20) NOT NULL AUTO_INCREMENT,   
  20.   `logid` bigint(20) DEFAULT NULL,   
  21.   `tbkey` longtext COLLATE utf8_unicode_ci,   
  22.   `tbvalue` longtext COLLATE utf8_unicode_ci,   
  23.   `currenttbvalue` longtext COLLATE utf8_unicode_ci,   
  24.   `comment` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,   
  25.   PRIMARY KEY (`tbid`)   
  26. ) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

原文链接:http://www.cnblogs.com/hooray/archive/2012/09/05/2672133.html

【编辑推荐】

  1. ASP.NET MVC3 的一个OutputCache问题
  2. Winform开发框架之系统登录实现
  3. JavaScript项目优化总结
  4. 项目模块开发——切dvd库
  5. 如何掌握程序语言
责任编辑:张伟 来源: 胡尐睿的博客
相关推荐

2024-01-04 07:55:32

系统操作日志接口

2009-12-11 17:55:59

Linux操作系统

2019-07-04 10:17:52

操作日志系统

2024-04-25 08:24:51

C#系统操作日志

2012-06-01 09:57:54

Linux服务器Linux操作系统

2011-07-25 09:39:10

Linux服务器操作系统

2019-12-17 18:04:09

操作系统Linux中央处理器

2010-05-28 18:16:43

MySQL 操作日志

2020-08-31 07:00:00

Android安卓日志分析

2010-04-15 15:32:59

Oracle操作日志

2023-03-06 11:36:13

SpingBoot注解

2023-12-17 14:36:05

2023-10-31 18:42:21

2009-07-14 18:35:53

MyEclipse实用

2009-09-08 15:19:52

Linq Where操

2012-08-29 13:39:29

2022-05-31 08:04:30

前端设计模式

2023-11-06 01:17:25

主机容器选项

2023-02-10 09:40:26

systemd日志

2011-02-21 13:40:17

点赞
收藏

51CTO技术栈公众号