淺談管理系統操做日誌設計(附操做日誌類)(轉)

管理系統的操做日誌如何作成通用的模塊一直是個讓我頭疼的問題,不過看了博客園裏的某篇文章後,如今基本解決了。php

  相關文章連接:《系統操做日誌設計html

  在開始作以前,必須把兩個日誌分清楚,那就是普通操做日誌和業務操做日誌,這二者有何區別?sql

  在我理解,普通操做日誌就是單表的操做記錄,而業務操做日誌則就是一系列的普通操做日誌的集合。數據庫

  打個比方,用戶須要購買同樣寶貝,已經到了下單那步,下單就是個業務,這個業務背後就是一系列的業務,如:fetch

  生成訂單 → 生成商品快照 → 發送一條站內信 → 刪除購物車裏對應寶貝優化

  這樣一個下單操做就包含了4部分,能夠把這4部分當作是4張表,分別對這4張表進行對應的操做,就實現了業務。this

  但今天我要講的不是業務操做日誌,由於不一樣項目的業務不盡相同,因此它沒法作成通用模塊,而我要講的,就是普通操做日誌。spa

  上面解釋了一大段,下面乾貨就要亮相了,先洗把臉清醒下。設計

  ……日誌

  首先,哪些地方須要記錄操做日誌?執行insert、update、delete這3個操做的時候,就須要進行日誌,而日誌執行的前後順序以下

 

insert 在insert後執行
update 在update先後都要執行,操做前獲取操做前數據,操做後獲取操做後數據
delete 在delete前執行

  順序清楚後,就來看下我寫的一份日誌操做類吧,初版隨便寫寫的,重複代碼有點多,還將來得及優化。

 

class LOG{
    protected $primaryid;
    protected $tbid;
    protected $tbname;
    protected $keys;
    protected $values;
    /**
     * 參數說明
     * int              $tbid       查詢指定表的id
     * string           $tbname     數據庫表名
     */
    public function insert($tbid, $tbname){
        global $db;
        //查詢表註釋
        $db->query('show table status where name = "'.$tbname.'"');
        $tb = $db->fetch();
        //插入日誌主表
        $returnid = $db->insert(0, 2, 'tb_log', array(
            'adminid = '.$_SESSION['admin']['id'],
            'type = 1',
            'tableid = '.$tbid,
            'tablename = "'.$tbname.'"',
            'comment = "'.$tb['Comment'].'"',
            'dt = now()'
        ));
        //查詢字段註釋
        $db->query('show full columns from '.$tbname);
        $tb = $db->fetchAll();
        foreach($tb as $v){
            $commentArray[$v['Field']] = $v['Comment'];
        }
        //查詢全部字段信息,插入日誌從表
        $rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);
        $keys = array_keys($rs);
        $values = array_values($rs);
        for($i = 0; $i < count($keys); $i++){
            $db->insert(0, 0, 'tb_log_content', array(
                'logid = '.$returnid,
                'tbkey = "'.$keys[$i].'"',
                'tbvalue = "'.$values[$i].'"',
                'comment = "'.$commentArray[$keys[$i]].'"'
            ));
        }
    }
    public function updateStart($tbid, $tbname){
        global $db;
        //查詢表註釋
        $db->query('show table status where name = "'.$tbname.'"');
        $tb = $db->fetch();
        //插入日誌主表
        $returnid = $db->insert(0, 2, 'tb_log', array(
            'adminid = '.$_SESSION['admin']['id'],
            'type = 2',
            'tableid = '.$tbid,
            'tablename = "'.$tbname.'"',
            'comment = "'.$tb['Comment'].'"',
            'dt = now()'
        ));
        //查詢修改前數據信息
        $rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);
        $keys = array_keys($rs);
        $values = array_values($rs);
        $this->primaryid = $returnid;
        $this->tbid = $tbid;
        $this->tbname = $tbname;
        $this->keys = $keys;
        $this->values = $values;
    }
    public function updateEnd(){
        global $db;
        //查詢字段註釋
        $db->query('show full columns from '.$this->tbname);
        $tb = $db->fetchAll();
        foreach($tb as $v){
            $commentArray[$v['Field']] = $v['Comment'];
        }
        //查詢修改後數據信息
        $rs = $db->select(0, 1, $this->tbname, '*', 'and tbid = '.$this->tbid);
        $currentvalues = array_values($rs);
        //先後信息進行比較
        for($i = 0; $i < count($currentvalues); $i++){
            if($this->values[$i] !== $currentvalues[$i]){
                $db->insert(0, 0, 'tb_log_content', array(
                    'logid = '.$this->primaryid,
                    'tbkey = "'.$this->keys[$i].'"',
                    'tbvalue = "'.$this->values[$i].'"',
                    'currenttbvalue = "'.$currentvalues[$i].'"',
                    'comment = "'.$commentArray[$this->keys[$i]].'"'
                ));
            }
        }
    }
    public function delete($tbid, $tbname){
        global $db;
        //查詢表註釋
        $db->query('show table status where name = "'.$tbname.'"');
        $tb = $db->fetch();
        //插入日誌主表
        $returnid = $db->insert(0, 2, 'tb_log', array(
            'adminid = '.$_SESSION['admin']['id'],
            'type = 3',
            'tableid = '.$tbid,
            'tablename = "'.$tbname.'"',
            'comment = "'.$tb['Comment'].'"',
            'dt = now()'
        ));
        //查詢字段註釋
        $db->query('show full columns from '.$tbname);
        $tb = $db->fetchAll();
        foreach($tb as $v){
            $commentArray[$v['Field']] = $v['Comment'];
        }
        //查詢全部字段信息,插入日誌從表
        $rs = $db->select(0, 1, $tbname, '*', 'and tbid = '.$tbid);
        $keys = array_keys($rs);
        $values = array_values($rs);
        for($i = 0; $i < count($keys); $i++){
            $db->insert(0, 0, 'tb_log_content', array(
                'logid = '.$returnid,
                'tbkey = "'.$keys[$i].'"',
                'tbvalue = "'.$values[$i].'"',
                'comment = "'.$commentArray[$keys[$i]].'"'
            ));
        }
    }
}

  

使用前,須要引入數據庫操做類,這是我以前寫的一份,可參考《全新的PDO數據庫操做類(僅適用Mysql)》。

  引入以後,就能夠開始使用了。

  select

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

  update

1
2
3
$log ->updateStart(82,  'tb_member' );
//中間放更新操做代碼
$log ->updateEnd();

  delete

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

  能夠看到,一共只須要兩個參數便可,分別是表ID(主鍵)和表名稱。

  另外須要強調一點,表註釋和字段註釋必定要完整,由於記錄的信息包含註釋,目的就是爲了查閱的時候能清楚哪一個字段是幹什麼用的。

  下面就看下成品吧

  最後把表結構分享下,一共2張表,一張主表一張從表,主表記錄操做表及操做人等信息,從表記錄操做的表字段信息。

 

-- ----------------------------
-- Table structure for `tb_log`
-- ----------------------------
CREATE TABLE `tb_log` (
  `tbid` bigint(20) NOT NULL AUTO_INCREMENT,
  `adminid` bigint(20) DEFAULT NULL COMMENT '管理員id',
  `type` tinyint(4) DEFAULT '1' COMMENT '操做類型:1新增2修改3刪除',
  `tableid` bigint(20) DEFAULT NULL,
  `tablename` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '表名',
  `comment` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `dt` datetime DEFAULT NULL,
  PRIMARY KEY (`tbid`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
-- ----------------------------
-- Table structure for `tb_log_content`
-- ----------------------------
CREATE TABLE `tb_log_content` (
  `tbid` bigint(20) NOT NULL AUTO_INCREMENT,
  `logid` bigint(20) DEFAULT NULL,
  `tbkey` longtext COLLATE utf8_unicode_ci,
  `tbvalue` longtext COLLATE utf8_unicode_ci,
  `currenttbvalue` longtext COLLATE utf8_unicode_ci,
  `comment` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`tbid`)
) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
相關文章
相關標籤/搜索