YII2 实现后台操作记录日志(转)

一、连接linux服务器,创建数据文件

  php yii migrate/create user_log

  

二、修改数据文件

console/migrations/m150721_032220_admin_log.php

<?php

use yii\db\Schema;
use yii\db\Migration;

class m150721_032220_admin_log extends Migration
{
    public function up()
    {
        $tableOptions = null;
        if ($this->db->driverName === ‘mysql‘) {
            $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE=InnoDB COMMENT="后台操作记录"‘;
        }

        $this->createTable(‘{{%admin_log}}‘, [
            //‘name‘=>Schema::TYPE_STRING.‘(200) PRIMARY KEY NOT NULL‘,
            ‘id‘=>Schema::TYPE_PK,
            ‘admin_id‘=>Schema::TYPE_INTEGER.‘(10) UNSIGNED NOT NULL COMMENT "操作用户ID"‘,
            ‘admin_name‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "操作用户名"‘,
            ‘addtime‘=>Schema::TYPE_INTEGER.‘(10) NOT NULL COMMENT "记录时间"‘,
            ‘admin_ip‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "操作用户IP"‘,
            ‘admin_agent‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "操作用户浏览器代理商"‘,
            ‘title‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "记录描述"‘,
            ‘model‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "操作模块(例:文章)"‘,
            ‘type‘=>Schema::TYPE_STRING.‘(200) NOT NULL COMMENT "操作类型(例:添加)"‘,
            ‘handle_id‘=>Schema::TYPE_INTEGER.‘(10) NOT NULL COMMENT "操作对象ID"‘,
            ‘result‘=>Schema::TYPE_TEXT.‘ NOT NULL COMMENT "操作结果"‘,
            ‘describe‘=>Schema::TYPE_TEXT.‘ NOT NULL COMMENT "备注"‘,

        ], $tableOptions);
    }

    public function down()
    {
        $this->dropTable(‘{{%admin_log}}‘);
    }
}

  

三、根据数据文件生成数据表

  php yii migrate

  

四、创建操作记录的控制器、模型、视图

  控制器

<?php

namespace backend\controllers;

use backend\components\BaseController;
use common\models\AdminLog;
use yii;
use yii\data\ActiveDataProvider;

class AdminLogController extends BaseController
{
    public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            ‘query‘ => AdminLog::find(),
            ‘sort‘ => [
                ‘defaultOrder‘ => [
                    ‘addtime‘ => SORT_DESC
                ]
            ],
        ]);
        return $this->render(‘index‘,[
            ‘dataProvider‘ => $dataProvider
        ]);
    }

    public function actionView($id){
       return $this->render(‘view‘,[
           ‘model‘=>AdminLog::findOne($id),
       ]);
    }

}

  模型

<?php

namespace common\models;

use Yii;

/**
 * This is the model class for table "{{%article}}".
 **/
class AdminLog extends \yii\db\ActiveRecord
{

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return ‘{{%admin_log}}‘;
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            ‘id‘=>‘操作记录ID‘,
            ‘title‘=>‘操作记录描述‘,
            ‘addtime‘=>‘记录时间‘,
            ‘admin_name‘=>‘操作人姓名‘,
            ‘admin_ip‘=>‘操作人IP地址‘,
            ‘admin_agent‘=>‘操作人浏览器代理商‘,
            ‘controller‘=>‘操作控制器名称‘,
            ‘action‘=>‘操作类型‘,
            ‘objId‘=>‘操作数据编号‘,
            ‘result‘=>‘操作结果‘,
        ];
    }

    public static function saveLog($controller ,$action,$result,$objId){
        $model = new self;
        $model->admin_ip = Yii::$app->request->userIP;
        $headers = Yii::$app->request->headers;
        $model->addtime = time();
        if ($headers->has(‘User-Agent‘)) {
            $model->admin_agent =  $headers->get(‘User-Agent‘);
        }
        $model->admin_id = Yii::$app->user->identity->id;
        $model->admin_name = Yii::$app->user->identity->email;

        $controllers = [‘article‘,‘video‘,‘collection‘,‘collection-album‘,‘category‘,‘banner‘,‘exchange‘,‘user‘,‘admin‘];
        if(!in_array(strtolower($controller),$controllers)) $controller = ‘‘;
        $actions = [‘create‘,‘update‘,‘delete‘,‘login‘,‘logout‘];
        if(!in_array(strtolower($action),$actions))$action = ‘‘;

        $model->controller = $controller;
        $model->action = $action;
        $model->result = $result;
        $model->objId = $objId;
        $model->title =  $model->admin_name.‘ ‘.$model->action.‘ ‘.$model->controller;
        $model->save(false);

    }
}

  视图

index视图

<?php

use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = ‘操作记录‘;
$this->params[‘breadcrumbs‘][] = $this->title;
?>
<div class="handle-index">

    <?= GridView::widget([
        ‘dataProvider‘ => $dataProvider,
        ‘columns‘ => [
            ‘title‘,
            [
                ‘attribute‘=>‘addtime‘,
                ‘value‘=>function($model){
                    return date(‘Y-m-d H:i:s‘,$model->addtime);
                },
            ],
            [‘class‘ => ‘yii\grid\ActionColumn‘,‘template‘=>‘{view}‘]
        ],
        ‘tableOptions‘=>[‘class‘ => ‘table table-striped‘]
    ]); ?>

</div>

  

view视图

<?php

use yii\widgets\DetailView;

/* @var $this yii\web\View */
/* @var $model backend\models\Admin */

$this->title = ‘操作记录: ‘.$model->title;
$this->params[‘breadcrumbs‘][] = [‘label‘ => ‘操作记录‘, ‘url‘ => [‘index‘]];
$this->params[‘breadcrumbs‘][] = $this->title;
?>
<div class="admin-view">

    <?= DetailView::widget([
        ‘model‘ => $model,
        ‘attributes‘ => [
            ‘id‘,
            ‘admin_name‘,
            ‘addtime:datetime‘,
            ‘admin_ip‘,
            ‘admin_agent‘,
            ‘controller‘,
            ‘action‘,
            ‘objId‘,
            ‘result‘
        ],
    ]) ?>

</div>

  五、实现记录添加

控制器中调用

public function actionCreate()
    {
        $model = new Banner();
        $model->status=Banner::STATUS_DISPLAY;
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            //保存操作记录
            \common\models\AdminLog::saveLog(‘banner‘,‘create‘,$model->searchById($model->primaryKey),$model->primaryKey);

            Yii::$app->session->setFlash(‘success‘,‘Banner【‘.$model->title.‘】发布成功‘);
            return $this->redirect([‘index‘]);
        } else {
            return $this->render(‘create‘, [
                ‘model‘ => $model,
            ]);
        }
    }

public function searchById($id){
    if (($model = Banner::findOne($id)) !== null) {
        return json_encode($model->toArray());
    } else {
        throw new \yii\web\NotFoundHttpException(‘The requested page does not exist.‘);
    }
}

  

时间: 2024-11-05 17:22:35

YII2 实现后台操作记录日志(转)的相关文章

asp.net后台操作javascript:confirm返回值

在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. (一)asp.net用StringBuilder控制后台操作javascript:confirm返回值,此方法比较烦琐1.后台启动事件 StringBuilder sb = new StringBuilder();        sb.Append("<script language='java

opencart后台操作--第一节 多语言篇---中文语言包

第二章  opencart后台操作 第一节多语言篇---中文语言包 一.下载语言包 1.当然还是需要在官网上面下载语言包,优点就不需要小编啰嗦了.网址呢?还是原来的配方还是原来我味道,http://www.opencart.com ,这里我们就不上首页图了,直接上模版插件图了,打开首页点击菜单 Extensions 进入插件下载页面. 看网站的左边有几个选择菜单,这里我们需要针对我们的版本进行相应的下载,这里我们只需要按照小编的选择进行吧, 这里我选择第一个2.0中文包就可以了,点击进去拉到最下

C#先执行一段sql等后台操作后再提示是否后续操作confrim

应用场景:例如选择一个单据号打击打印后先去数据库检索是否有打打印过,如果有则提示,已打印,是否再打 如果没有则不提示,直接进行打印. 实现原理:多做一个隐藏按钮去实现打印功能,页面上的打印按钮则进行数据库的后台操作,跟据取出的数据 可以在后台直接调用打印,或用脚本调用前台confirm 代码Demo: 后台: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sys

Windows Auzre 微软的云计算产品的后台操作界面

Windows Auzre 微软的云计算产品的后台操作界面,试用期,相比于阿里云后台操作不是人. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmFvbGEyMDAx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmFvbGEyMDAx/font/5a

html表格动态添加删除行(有后台操作)

<HTML> <TITLE>Form Object example</TITLE> <HEAD> <script language="javascript"> function delrow1() { var oElement=event.srcElement; while(oElement.tagName!="TR") { oElement=oElement.parentElement; } var oT

Windows Auzre 微软云计算产品后台操作界面

Windows Auzre 微软云计算产品后台操作界面,试用了一段时间,后台操作相比阿里云还是不够人性化.

crm 系统项目(二) admin 后台操作表格

crm 系统项目(二) admin 后台操作表格 1. app下创建 templates  运行的时候 先找全局的templates——> 按照app的注册顺序找templates中的文件 2. app下在创建一个urls.py include() 3. 创建超级用户 python manage.py createsuperuser 邮箱可以忽略,密码默认为8位 4. 在admin中注册model from django.contrib import admin from crm import

模仿图书系统,实现前台和后台操作

首先将用户名密码封装到一个类中,另一个类保存图书信息. package com.jereh4; import java.util.ArrayList; import java.util.List; class Book{ private List bookList ; public List getList(){ bookList = new ArrayList(); bookList.add(10001); bookList.add("天空"); bookList.add("

asp.net mvc后台操作之读写xml控制首页动态页面开关显示

一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制功能,也需要在前台取消不合时宜的页面的展示.后台效果图: 二.问题分析 要想控制页面开关显示,就得有存储开关信息的介质,将在后台产生的操作记录下来,并在浏览者加载首页之时能读取操作记录并达到控制页面开关的目的.因此,考虑两种介质储存开关记录信息,一是用数据库mysql,二是用xml.考虑到这对数据库