您好,欢迎来到 猿书

非常简单的方法在你的后台添加《系统管理员操作日志》的功能

易大师 2016-04-03 7517次浏览 45条评论 5 打赏作者 2 1
出于监控多用户操作后台的目的,往往需要把各个管理员操作了什么记录下来。这个功能用yii2来实现简直是太简单了!下边上代码~ 此demo基于advanced,具体功能可以参考demo 帐号demo 密码111111 在backend目录创建components/AdminLog.php <?ph...

出于监控多用户操作后台的目的,往往需要把各个管理员操作了什么记录下来。这个功能用yii2来实现简直是太简单了!下边上代码~

此demo基于advanced,具体功能可以参考demo 帐号demo 密码111111

在backend目录创建components/AdminLog.php

<?php

namespace backend\components;

use Yii;
use yii\helpers\Url;

class AdminLog
{
    public static function write($event)
    {
        // 排除日志表自身,没有主键的表不记录(没想到怎么记录。。每个表尽量都有主键吧,不一定非是自增id)
        if($event->sender instanceof \common\models\AdminLog || !$event->sender->primaryKey()) {
            return;
        }
        // 显示详情有待优化,不过基本功能完整齐全
        if ($event->name == ActiveRecord::EVENT_AFTER_INSERT) {
            $description = "%s新增了表%s %s:%s的%s";
        } elseif($event->name == ActiveRecord::EVENT_AFTER_UPDATE) {
            $description = "%s修改了表%s %s:%s的%s";
        } else {
            $description = "%s删除了表%s %s:%s%s";
        }
        if (!empty($event->changedAttributes)) {
            $desc = '';
            foreach($event->changedAttributes as $name => $value) {
                $desc .= $name . ' : ' . $value . '=>' . $event->sender->getAttribute($name) . ',';
            }
            $desc = substr($desc, 0, -1);
        } else {
            $desc = '';
        }
        $userName = Yii::$app->user->identity->username;
        $tableName = $event->sender->tableSchema->name;
        $description = sprintf($description, $userName, $tableName, $event->sender->primaryKey()[0], $event->sender->getPrimaryKey(), $desc);

        $route = Url::to();
        $userId = Yii::$app->user->id;
        $ip = ip2long(Yii::$app->request->userIP);
        $data = [
            'route' => $route,
            'description' => $description,
            'user_id' => $userId,
            'ip' => $ip
        ];
        $model = new common\models\AdminLog();
        $model->setAttributes($data);
        $model->save();
    }
}

在backend/config/main.php添加

'on beforeRequest' => function($event) {
        \yii\base\Event::on(\yii\db\BaseActiveRecord::className(), \yii\db\BaseActiveRecord::EVENT_AFTER_INSERT, ['backend\components\AdminLog', 'write']);
        \yii\base\Event::on(\yii\db\BaseActiveRecord::className(), \yii\db\BaseActiveRecord::EVENT_AFTER_UPDATE, ['backend\components\AdminLog', 'write']);
        \yii\base\Event::on(\yii\db\BaseActiveRecord::className(), \yii\db\BaseActiveRecord::EVENT_AFTER_DELETE, ['backend\components\AdminLog', 'write']);
    },

mysql中创建admin_log表

CREATE TABLE `admin_log` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `route` varchar(255) NOT NULL DEFAULT '',
  `description` text,
  `created_at` int(10) NOT NULL,
  `user_id` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

用gii生成AdminLog模型

php yii gii/model --ns=common\\models --modelClass=AdminLog --tableName=admin_log
0

45 条评论

  • sadasd 发表于 2016-08-09 15:57

    这个不能用啊,乱抄一气。讨厌

    回复于 2016-08-09 17:16 回复

    哥啊。。这个是我原创好不好。源码在这放着,怎么不能用啊

  • james123 发表于 2016-09-10 18:18

    你这个只能记录update的操作,用户如果是insert跟delete都没发记录的。我尝试 了添加了一个insert,一下子就死循环插了五六百条。

    回复于 2016-09-10 19:02 回复

    \yii\db\BaseActiveRecord::EVENT_AFTER_UPDATE只记录了update,insert delete有对应的事件,很容易扩展吧

    回复于 2016-09-10 23:36 回复

    @易大师 已经自己扩展开来了。insert事件日志死循环的问题是本来记录日志的方法也是insert。所以只要判断下event里面的字段是否是存取日志的字段,如果是就直接return.避免死循环。

    回复于 2016-09-26 19:52 回复

    @james123 请问该怎么判断防止死循环啊??

    回复于 2016-10-30 16:42 回复
    回复于 2016-12-14 14:57 回复

    333333@Smile

    回复于 2016-12-14 14:57 回复
  • naivejie 发表于 2016-09-23 11:57

    亲,麻烦把insert,delete也贡献出来吧。感谢。

  • 易大师 发表于 2016-10-21 11:06

    晚点更新一下

    回复于 2016-11-08 00:14 回复

    已更新

    回复于 2016-11-29 15:39 回复

    我是刚刚用的更新版,好的

    回复于 2016-12-01 14:12 回复

    @易大师 还打算修复吗,

    回复于 2016-12-01 16:47 回复

    @乱码节奏 什么东西?不是已经更新了插入和删除

    回复于 2016-12-14 14:57 回复
    回复于 2016-12-14 14:57 回复

    @demo asdfasfasfasf

  • 乱码节奏 发表于 2016-11-29 15:37

    我的也是,直接插入了,900多条记录,东西很不错,期望尽快能修复

  • demo 发表于 2016-12-29 14:11

    ![`php 0000

    
    
  • master 发表于 2017-01-15 20:26

    666啊,yii的事件处理很强大啊,我看到了原来不会用,现在懂了一些,多谢分享。

  • 排排 发表于 2017-02-23 14:48

    我靠这个一直触发不了 在 backend/config/main.php db和components添加 都不触发

    回复于 2017-02-23 15:11 回复

    db和components添加?什么意思

    回复于 2017-02-23 15:44 回复

    @易大师 你说在backend/config/main.php添加, 没说具体在哪添加? 我是尝试了很多地方都不能调取

    回复于 2017-02-23 17:10 回复

    @排排 加到最后层

    回复于 2017-02-23 17:10 回复

    @排排 最外层

  • 暮冬-Gentle° 发表于 2017-03-02 16:11

    大神 为什么common\models\AdminLog 会报错 一定要放在backend\components\common\models里面

  • demo 发表于 2017-04-01 15:51

    update,insert 都可以纪录操作日志,delete删除操作则不会进入write 这个方法,无法添加操作日志。 backend/config/main 已增加EVENT_AFTER_DELETE事件