关于管理系统操作日志的设计(包括操作日志)

电脑杂谈  发布时间:2020-07-07 14:16:22  来源:网络整理

操作日志管理_日志创建分类_操作系统日志分类

如何使管理系统的操作日志成为通用模块一直是我的头疼问题,但是在阅读博客园中的一篇文章之后,现在基本上已经解决了.

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

在开始之前,必须将两个日志分开,即普通操作日志和业务操作日志. 两者有什么区别?

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

例如,用户需要购买婴儿,并已达到下订单的步骤. 订购是一项业务. 该业务的背后是一系列业务,例如:

生成订单→生成产品快照→发送内部消息→在购物车中删除相应的婴儿

日志创建分类_操作日志管理_操作系统日志分类

此订购操作包含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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 卜宇凡
        卜宇凡

        最后那一下手势萌死我了~

      热点图片
      拼命载入中...