1.后台用户数据表
DROP TABLE IF EXISTS `adminuser`;
CREATE TABLE `adminuser` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
`logtime` int(11) DEFAULT NULL,
`logip` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
2.记录数据表
DROP TABLE IF EXISTS `journal`;
CREATE TABLE `journal` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(100) DEFAULT NULL COMMENT '用户',
`operation` varchar(100) DEFAULT NULL COMMENT '操作',
`logtime` varchar(11) DEFAULT NULL COMMENT '操作时间',
`logip` varchar(20) DEFAULT NULL COMMENT '操作ip',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
3.登陆模型代码
<?php
namespace backend\models;
use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
class Adminuser extends ActiveRecord{
public $username;
public $password;
public $verifyCode;
private $_user;
public function rules(){
return [
['username','required','message'=>'用户名不能为空','on'=>['login']],
['password','required','message'=>'密码不能为空','on'=>['login']],
['username','isusername','on'=>['login']],
['password','ispassword','on'=>['login']],
['verifyCode', 'captcha','message'=>'验证码输入错误','on'=>['login']],
];
}
// 验证用户名
public function isusername(){
if(!$this->hasErrors()){
$data=self::find()->where('username=:username',[':username'=>$this->username])->one();
//$data=self::find()->where('user=:user and pass=:pass',[":user"=>$this->user,":pass"=>md5($this->pass)])->one();
if(is_null($data)){
$this->addError('username','无此用户');
}
}
}
// 验证密码
public function ispassword(){
if(!$this->hasErrors()){
$data=self::find()->where('password=:password',[":password"=>md5($this->password)])->one();
if(is_null($data)){
$this->addError('password','密码错误');
}
}
}
public function login($data)
{
// 指定验证场景
$this->scenario='login';
if ($this->load($data) && $this->validate()) {
// 定义缓存的时间
$lifetime=24*3600;
$session=Yii::$app->session;
// 设置session的过期时间
$session['timeout']=$lifetime;
$session['admin']=[
'admin_user'=>$this->username,
'islogin'=>1
];
// 登录成功后记录登录的时间和登录的ip
$this->updateAll(['logtime'=>time(), 'logip'=>Yii::$app->request->userIP], 'username=:username',[':username'=>$this->username]);
return 1;
} else {
return 0;
}
}
}
?>
4.登陆控制器代码
<?php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use yii\helpers\Url;
use backend\models\Adminuser;
use common\controllers\Logs;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
/**
* {@inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
//验证码
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'backColor'=>0xffffff,//背景颜色
'maxLength' => 6, //最大显示个数
'minLength' => 5,//最少显示个数
'padding' => 2,//间距
'height'=>34,//高度
'width' => 146, //宽度
'foreColor'=>0x000000, //字体颜色
'offset'=>4, //设置字符偏移量 有效果
],
];
}
/**
* Displays homepage.
*
* @return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Login action.
*
* @return string
*/
public function actionLogin()
{
$this->layout = false;
$model=new Adminuser();
if (Yii::$app->session['admin']['admin_user']) {
return $this->goHome();
}
// $model = new LoginForm();
if (Yii::$app->request->isPost) {
$post=Yii::$app->request->post();
$res=$model->login($post);
if($res){
Logs::add(Yii::$app->session['admin']['admin_user'],'登陆后台',Yii::$app->request->userIP);
return $this->redirect(Url::to(['index/index']));
}else{
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
} else {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logout action.
*
* @return string
*/
public function actionLogout()
{
// 清空session
Yii::$app->session->removeAll();
// 判断session是否清空
if(!isset(Yii::$app->session['admin']['admin_user'])){
$this->redirect(['site/login']);
Yii::$app->end();
}
// 从那个页面过来,返回到那个页面
$this->goback();
//return $this->goHome();
}
}
5.视图代码
<?php
use yii\helpers\Url;
use yii\widgets\ActiveForm;
use backend\assets\AppAsset;
use yii\helpers\Html;
use yii\captcha\Captcha;
$this->registerJsFile('/backend/web/log/js/jquery.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/js/bootstrap.min.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/js/swiper.min.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/js/main.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/js/wow.min.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/js/mdui.min.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerJsFile('/backend/web/log/layer/layer.js', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/bootstrap.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/main.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/swiper.min.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/font-awesome.min.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/animate.min.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/css/mdui.min.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
$this->registerCssFile('/backend/web/log/layer/mobile/need/layer.css', ['depends' => backend\assets\AppAsset::className(), "position"=> $this::POS_END]);
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $this->registerCsrfMetaTags() ?>
<title>后台登陆</title>
<?php $this->head() ?>
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
</head>
<body>
<?php $this->beginBody() ?>
<div class="log" style="background: url(/backend/web/log/img/login-bg.jpg);background-position: center;background-repeat: no-repeat;background-size: cover;">
<div class="con_log">
<div class="main">
<div class="main_left">
<div class="tit">登陆</div>
<?php
$form=ActiveForm::begin([
'options'=>[
'style'=>['width'=>'400px']
],
'fieldConfig'=>[
'template'=>'{input}'
]
]);
?>
<div class="form-group">
<?=$form->field($model,'username')->textInput(['class'=>'form-control col-md-12','id'=>'inputSuccess1','placeholder'=>'用户名'])?>
</div>
<div class="form-group">
<?=$form->field($model,'password')->passwordInput(['class'=>'form-control col-md-12','id'=>'inputSuccess2','placeholder'=>'密码'])?>
</div>
<div class="form-group form_con">
<!-- <input type="text" class="form-control col-md-12" id="inputSuccess3" aria-describedby="helpBlock2" placeholder="验证码"> -->
<!-- <div class="code"> -->
<?= $form->field($model, 'verifyCode')->widget('yii\captcha\Captcha', [
'captchaAction'=>'site/captcha',
'options' => [
'placeholder' => '输入验证码',
],
'template' => '<div class="row"><div class="col-lg-6">{input}</div><div style="margin-left:40px;margin-top:10px;" class="col-lg-3">{image}</div></div>',
])?>
<!-- </div> -->
</div>
<div class="form-group">
<input type="submit" class="btn btn-default btn-info" onclick="return fun()" value="登陆">
</div>
<?php
ActiveForm::end();
?>
</div>
</div>
</div>
</div>
<?php $this->beginBlock('script') ?>
function fun(){
$name=$('#inputSuccess1').val();
$pass=$('#inputSuccess2').val();
$code=$('#inputSuccess3').val();
if($name==''){
layer.msg('请填写用户名', {icon: 0});
$('#inputSuccess1').focus();
return false;
}
if($pass==''){
layer.msg('请填写密码',{icon:0});
$('#inputSuccess2').focus();
return false;
}
if($code==''){
layer.msg('请填写验证码',{icon:0});
$('#inputSuccess3').focus();
return false;
}
}
<?php $this->endBlock() ?>
<?php $this->registerJs($this->blocks['script'], \yii\web\View::POS_END); ?>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
6.添加记录模型
<?php
namespace common\models;
use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
class LogForm extends ActiveRecord{
// public $user;
// public $operation;
// public $logip;
// public $logtime;
public static function tableName(){
return 'journal';
}
public function rules()
{
return [
[['user', 'operation', 'logip', 'logtime'], 'required', 'message'=>'{attribute}不能为空'],
];
}
}
?>
7.添加记录控制器
<?php
namespace common\controllers;
use Yii;
use yii\web\Controller;
use common\models\LogForm;
class Logs extends Controller{
//我们是静态调用所以要加static
public static function add($user='无',$operation='无',$logip='无'){
$logtime=time();
$model=new LogForm();
$model->user=$user;
$model->operation=$operation;
$model->logip=$logip;
$model->logtime=$logtime;
$model->save();
}
}
?>
8.调用日志记录方法
//引入
use common\controllers\Logs;
//调用
Logs::add(Yii::$app->session['admin']['admin_user'],'登陆后台',Yii::$app->request->userIP);