之前在网上看到的一个管理员操作详情的设计,也想在自己的博客中加上一个,就参考着加上了,效果如下:
实现起来,需要加上几张表,作为数据的存储
这样表的设计就完成了,但是所有的工作才只能算是完成了一半,表的作用是信息的存储,需要php的逻辑进行向表中添加数据的操作:
/**
* 记录新增的字段的值
*/
protected function _adding($table_name,$pk){
//将取得的信息插入到对应的表中
$m_tables = \M('Tables');
//取得表的id
$table_id = $m_tables->where(array('tab_name'=>array('eq',\C('DB_PREFIX').ucfirst($table_name))))->getfield('tab_id') + 0;
if(! $table_id){
die("传递的表名有错误!");
}
$m_admin_log = \M('AdminLog');
$source['admin_id'] = \session('user.admin_id') + 0;
$source['tab_id'] = $table_id;
$source['type'] = 1;
$source['dt'] = time();
//将记录信息插入到记录主表中
$log_id = $m_admin_log->add($source);
//将得到的主键的id放入到附表中,只存一个ac_key即可
$m_admin_action = \M('AdminAction');
$m_admin_action->add(array('log_id'=>$log_id,'pk_id'=>$pk));
}
/**
* 记录更新时的记录方法
*/
protected function _updateStart($table_name,$pk){
//将取得的信息插入到对应的表中
$m_tables = \M('Tables');
//取得表的id
$table_id = $m_tables->where(array('tab_name'=>array('eq',\C('DB_PREFIX').ucfirst($table_name))))->getfield('tab_id') + 0;
$pk_name = $m_tables->where(array('tab_name'=>array('eq',\C('DB_PREFIX').ucfirst($table_name))))->getfield('pk_name');
if(! $table_id){
die("传递的表名有错误!");
}
//需要记录表中的所有的数据信息,在插入之后使用循环每个字段进行对比,找出不同的值,使用数组记录
$this->_pk = $pk;
$this->_content = \M($table_name)->where(array($pk_name=>array('eq',$pk)))->find();
$m_admin_log = \M('AdminLog');
$source['admin_id'] = \session('user.admin_id') + 0;
$source['tab_id'] = $table_id;
$source['type'] = 2;
$source['dt'] = time();
//将记录信息插入到记录主表中
$this->log_id = $m_admin_log->add($source);
}
/**
* 记录更新完成后,修改的字段及修改的值
*/
public function _updateStop($table_name){
//将取得的信息插入到对应的表中
$m_tables = \M('Tables');
//取得对应的字段
$pk_name = $m_tables->where(array('tab_name'=>array('eq',\C('DB_PREFIX').ucfirst($table_name))))->getfield('pk_name');
//需要记录表中的所有的数据信息,在插入之后使用循环每个字段进行对比,找出不同的值,使用数组记录
$new_content = \M($table_name)->where(array($pk_name=>array('eq',$this->_pk)))->find();
//空数组,装纳修改了的字段及值
$temp_arr = array_diff_assoc($new_content,$this->_content);
//将取得的信息插入到记录信息表
$m_admin_action = \M('AdminAction');
foreach($temp_arr as $k=>$v){
$data['pk_id'] = $this->_pk;
if($k == 'update_at'){
continue;
}else{
$data['ac_key'] = $k;
}
$data['new_value'] = $v;
$data['old_value'] = $this->_content[$k];
$data['log_id'] = $this->log_id;
$m_admin_action->add($data);
}
}
/**
* 记录删除的字段
*/
protected function _deleting($table_name,$pk){
//将取得的信息插入到对应的表中
$m_tables = \M('Tables');
//取得表的id
$table_id = $m_tables->where(array('tab_name'=>array('eq',\C('DB_PREFIX').ucfirst($table_name))))->getfield('tab_id') + 0;
if(! $table_id){
die("传递的表名有错误!");
}
$m_admin_log = \M('AdminLog');
$source['admin_id'] = \session('user.admin_id') + 0;
$source['tab_id'] = $table_id;
$source['type'] = 3;
$source['dt'] = time();
//将记录信息插入到记录主表中
$log_id = $m_admin_log->add($source);
//将得到的主键的id放入到附表中,只存一个ac_key即可
$m_admin_action = \M('AdminAction');
$m_admin_action->add(array('log_id'=>$log_id,'pk_id'=>$pk));
}
这是在 后台的CommonController中 我添加的方法,用来完成记录信息:
这样在使用的时候,只需要传递表名称以及受影响的数据的主键id就可以完成了:
数据的添加: $this->_adding('Blog',$blog_id);
数据的更新: $this->_updateStart('Blog',$blog_id); $this->_updateStop('Blog');
数据的删除: $this->_deleting('Blog',$blog_id);