
如何使管理系统的操作日志成为通用模块一直是我的头疼问题,但是在阅读博客园中的一篇文章之后,现在基本上已经解决了.
相关文章链接: “系统操作日志设计”
在开始之前,必须将两个日志分开,即普通操作日志和业务操作日志. 两者有什么区别?
在我的理解中,普通操作日志是单表操作记录,而业务操作日志是一系列普通操作日志的集合.
例如,用户需要购买婴儿,并已达到下订单的步骤. 订购是一项业务. 该业务的背后是一系列业务,例如:
生成订单→生成产品快照→发送内部消息→在购物车中删除相应的婴儿

此订购操作包含4个部分. 您可以将这4个部分视为4个表,并对这4个表执行相应的操作以实现业务.
但是今天我不是在谈论业务操作日志. 由于不同项目的业务不相同,因此无法将其制成通用模块. 我要说的是普通的操作日志.
上面解释了很大一部分. 以下干货即将揭幕. 先洗脸.
......
首先,要在哪里记录操作日志?在执行插入,更新和删除这三个操作时,您需要记录日志,并且日志执行的顺序如下
插入

插入后执行
更新
在更新前后执行,获取操作前的操作前数据,获取操作后的操作后数据
删除
在删除之前执行
清除命令后,让我们看一下我编写的日志操作类. 第一个版本是随便写的. 有很多重复的代码,将来必须对其进行优化.

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)”.
介绍后,您可以开始使用它.
选择
$log->insert(82, 'tb_member');
更新

$log->updateStart(82, 'tb_member'); //中间放更新操作代码 $log->updateEnd();
删除
$log->delete(82, 'tb_member');
您会看到只需要两个参数,即表ID(主键)和表名.
需要强调的另一点. 表注释和字段注释必须完整,因为记录的信息包含注释,目的是能够知道在查询哪个字段时将使用什么字段.
让我们看一下成品.


最后,共享表结构,共有2个表,一个主表和一个从表操作系统日志分类,主表记录操作表和操作员信息操作系统日志分类,从表记录操作表字段信息.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-271802-1.html
最后那一下手势萌死我了~