Yii2-admin的详细使用教程1

网上很多说用composer安装,但是其实国内的环境和网速大家懂的,所以还是下载安装比较快

1.下载地址:
https://github.com/mdmsoft/yii2-admin/releases

2.解压这个下载的包到vendor/mdm/目录下,如果没有mdm目录就新建一个

3.配置backend/config/main.php

<?php
params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'aliases' => [
        '@mdm/admin' => '@vendor/mdm/yii2-admin-2.11',
        'layout' => 'left-menu',
        // for example: '@mdm/admin' => '@app/extensions/mdm/yii2-admin-2.0.0',
        //...
    ],    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [],
    'modules' => [
        'admin' => [
            'class' => 'mdm\admin\Module',
            'layout' => 'left-menu',//yii2-admin的导航菜单
        ]

    ],
    'components' => [
        /*'authManager' => [
            'class' => 'yii\rbac\DbManager',//'yii\rbac\PhpManager', // or use        ],*/
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // 使用数据库管理配置文件
        ],
        'request' => [
            'csrfParam' => '_csrf-backend',
        ],
        'user' => [
            'identityClass' => 'backend\models\Adminuser',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'admin/*',
            'some-controller/some-action',
            // The actions listed here will be allowed to everyone including guests.
            // So, 'admin/*' should not appear here in the production, of course.
            // But in the earlier stages of your development, you may probably want to
            // add a lot of actions here until you finally completed setting up rbac,
            // otherwise you may not even take a first step.
        ]
    ],
    'params' =>params,
];

4.配置common/config/main.php

<?php
return [
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // 使用数据库管理配置文件
        ],
    ],
];

5.创建相应的数据库表
在控制台中输入以下命令:

yii migrate --migrationPath=migrations
yii migrate --migrationPath=@yii/rbac/migrations
安装到此完成。
访问http#//localhost/path/to/index.php?r=admin可以看到yii2-admin的管理界面

6.配置访问权限示例
以节点terms(一个自定义的节点)为例,节点terms下共有index,view,create,update,delete五个子节点。
配置目标:
未登录用户仅能访问index节点
一般登录用户能访问index,view,create三个节点
管理员能访问所有节点

步骤一:添加可分配列表

打开yii2-admin路由列表页,点击可用输入框后面的刷新图标将列出当前网站所有可用的路由列表,选中terms各节点路由表添加至右侧可分配路由列表中。

步骤二:添加权限

权限列表=>新增权限,填好名称提交后,添加对应的路由规则即可。
可用列表中除了路由列表还有已经添加了的权限列表,一个权限可以包含另一个权限。

步骤三:添加角色

角色列表=》新增角色,分别添加管理员、一般用户、未登录用户,将对应的权限分配给角色。

步骤四:分配角色

分配界面列出来的用户名是当前系统中已注册的用户。现注册了admin和user账号用于演示。
点击账号后边的眼睛图案,进行权限分配。
按需要,给予相应的权限。

步骤五:配置网站默认访问权限

上面四步配置完成后,我们访问terms各节点测试结果:
以一般用户身份登录时,可以浏览、添加信息,要更新、删除信息时会提示无权操作。符合预期。

以管理员身份登录时,可进行所有操作。符合预期。
但是如果不登录,在访问terms首页时会跳转到登录页面。预期结果是未登录时能访问terms首页。
就是说当前系统默认不认可我们配置给未登录用户的权限。
只需要在配置文件中加一行指定默认规则的代码即可:

    'authManager'=> [
        'class' => 'yii\rbac\DbManager',
        'defaultRoles' => ['未登录用户'],//添加此行代码,指定默认规则为 '未登录用户'
    ],

未登录时再访问terms/index节点就能正常显示了,点别的操作时会跳到登录页面,因为未登录时仅有访问首页的权限。

除了在authManager中配置默认权限,在as access中也可以配置允许所有人访问的节点。

'as access' => [
    'allowActions' => [//下面列出的节点,所有人都可以访问,针对未登录用户的配置也可以移至这里
        'admin/*',
        'site/*',
        ]
]

参考链接:
https://www.kancloud.cn/curder/yii/247759
https://www.yiichina.com/tutorial/571

yii2对接支付宝

主要遇到三个问题:

1 如何引入支付宝的php库

1.1 把下载下来的文件放入web目录下的ali文件夹,然后控制器引入

require_once(“ali/pagepay/service/AlipayTradeService.php”);
require_once(“ali/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php”);

1.2.config配置文件可以直接写在config/params.php里,控制器里用

$config = Yii::$app->params["config"];引用配置文件

<?php
    //config/params.php
return [
    'adminEmail' => 'nbllq@qq.com',
    //'alldata' => 'test'
    "config" => [   
        //应用ID,您的APPID。
        'app_id' => "your id",

        //商户私钥
        'merchant_private_key' => "your key",

        //异步通知地址
        'notify_url' => "外网地址",

        //同步跳转
        'return_url' => "本地地址",

        //编码格式
        'charset' => "UTF-8",

        //签名方式
        'sign_type'=>"RSA2",

        //支付宝网关
        'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",

        //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        'alipay_public_key' => "your key",
]
];

1.3 $aop = new \AlipayTradeService($config); 注意前面的\,如果不加会报错

2. 页面传递给支付宝乱码

解决方法:控制器对应的php文件编码格式改成无bom的utf-8

3.官方的return_url.php验签成功,但是移植到控制器中验签失败

主要是yii2框架的url路由规则影响的,其他框架可能不会有这个问题
解决方法:开启url美化或者把传递的参数中r=对应的控制器参数去掉后再传递,参考代码:

    public function actionAlireturnurl()
    {   
        header("Content-Type: text/html;charset=utf-8");

        arr = Yii::app->request->get();
        rc=array_shift(arr); //!!!!去除r控制器参数,不然验sign会失败!!!!!!花了我一天时间找这个bug,fuck!
        //alipaySevice = new \AlipayTradeService(Yii::app->params["config"]); 
        //result =alipaySevice->check(arr);config = Yii::app->params["config"];aop = new \AlipayTradeService(config);result = aop->check(arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
        4、验证app_id是否为该商户本身。
    */

    //  print_r(arr2);
        if(result) {//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

            //商户订单号
            out_trade_no = htmlspecialchars(_GET['out_trade_no']);

            //支付宝交易号
            trade_no = htmlspecialchars(_GET['trade_no']);

            //交易金额
            total_amount =htmlspecialchars(_GET['total_amount']);

            echo "ok";

            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——


            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }
        else {
            //验证失败
            echo "fail";
        }

    }

yii2验证码

yii2自带验证码功能,配置一下就好了,这篇文章以登录页面为例,登录界面加入验证码可以防止暴力破解登录密码。
主要修改三个文件:LoginForm.php,siteController.php,login.php,
三个文件里面都引入下面类
use yii\captcha\CaptchaAction;
use yii\captcha\Captcha;

1.修改模型LoginForm类:

public $verifyCode;//给model增加一个属性 
public function rules()
    {
        return [
            // username and password are both required
            [['username', 'password','verifyCode'], 'required'],
            // rememberMe must be a boolean value
            ['rememberMe', 'boolean'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
            ['verifyCode', 'captcha'],
        ];
    }
public function attributeLabels() 
    { 
         return [ 
                   // 'verifyCode' => 'Verification Code', 
                   'username' => '用户名',
                   'password'=>'密码',
                   'verifyCode' => '验证码',
            ]; 
    } 

2.修改SiteController.php

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'signup','login'],
                'rules' => [
                    [
                        'actions' => ['signup','login','captcha'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            /*'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],*/
            'captcha' => [
                                    'class' => 'yii\captcha\CaptchaAction',
                                    'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
                                    'backColor'=>0x000000,//背景颜色
                                    'maxLength' => 6, //最大显示个数
                                    'minLength' => 5,//最少显示个数
                                    'padding' => 5,//间距
                                    'height'=>40,//高度
                                    'width' => 130,  //宽度  
                                    'foreColor'=>0xffffff,     //字体颜色
                                    'offset'=>4,        //设置字符偏移量 有效果
                                    //'controller'=>'login',        //拥有这个动作的controller
                            ],
        ];
    }

3.修改view里的login.php

use yii\captcha\Captcha;
<?= form->field(model, 'verifyCode')->widget(Captcha::className()) ?>

搞定!注册页面加入验证码可以防止恶意注册,原理一样,有兴趣的读者可以自行搞定!

yii2汉化及时区设置

修改common/main-local.php:

<?php
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=',
            'username' => '',
            'password' => '',
            'charset' => 'utf8',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@common/mail',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            //'useFileTransport' => true,
             'useFileTransport' =>false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
             'transport' => [  
                'class' => 'Swift_SmtpTransport',  
                'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
                'username' => '7138784@qq.com',  
                'password' => '',  
                'port' => '465',  
                'encryption' => 'ssl',

                ],   
        ],
    ],
     'language' => 'zh-CN',//启用国际化支持
    'sourceLanguage' => 'zh-CN',//源代码采用中文
    'timeZone' => 'Asia/Shanghai', //设置时区
];

yii2 关联查询

假设有两张表通过id关联,现在想在查询结果里面展示两张表的对应字段,并支持搜索排序功能

前置条件:

gii自动生成的两表的model中有关联关系函数,类似:

 /**
     * @return \yii\db\ActiveQuery
     */
    public function getTest()
    {
        return $this->hasMany(Test::className(), ['DP_ID' => 'dpId']);
    }

第一步,在model和searchmodel里面添加对应的字段名

public $name
并且在rules里面也加上对应规则

第二步,修改searchmodel里面的search($params)函数

添加如下代码

$query->joinWith(['test']);
        $query->select("test_detail.*, test.NAME");
        $query->andFilterWhere(['test.DP_ID' => $this->dpId]);


        $query->andFilterWhere([
            // other params
            'NAME' => $this->NAME,
        ]);

第三步 排序处理

在searchmodel里面的search($params)函数里添加如下代码:

$dataProvider->setSort([
        'attributes' => [
            /* 其它字段不要动 */    
            /*  下面这段是加入的 */
            /*=============*/
            'NAME' => [
                'asc' => ['test.NAME' => SORT_ASC],
                'desc' => ['test.NAME' => SORT_DESC],
                'label' => 'NAME'
            ],
            /*=============*/
        ]
    ]); 

第四步,修改index视图

 <?= GridView::widget([
        'dataProvider' => dataProvider,
        'filterModel' =>searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'dpId',
            ['label'=>'名称',  'attribute' => 'NAME',  'value' => 'NAME' ],//<=====加入这

yii2-restful-api-study8-api频次,版本,返回格式,错误处理

api访问频率限制
1.修改需要限制频率的用户model类,使其继承RateLimitInterface接口,
use yii\filters\RateLimitInterface;
2.实现该接口需要实现的3个方法

//频率限制
    public function getRateLimit(request,action){
        return [2,1];//每秒请求2 times
    }

    public function loadAllowance(request,action){
        return [this->allowance,this->allowance_updated_at];
    }

    public function saveAllowance(request,action,allowance,timestamp){
        this->allowance =allowance;
        this->allowance_updated_at =timestamp;
        $this->save();
    }

3.修改控制器的behaviors(好像不加这一步也可以实现频率限制)

//频率限制
        $behaviors['rateLimiter']=[
            'class'=>RateLimiter::className(),
            'enableRateLimitHeaders'=>true,
        ];

版本控制

1.利用yii2系统自带的gii工具生成module,系统的目录结构参考api/modules/v2/controllers/
2.修改config/main.php文件,添加module,添加route

'modules' => [
        'v2' => [
            'class' => 'api\modules\v2\Module',
        ],
    ],
 ...
 [
                    'class' => 'yii\rest\UrlRule', 
                     'controller' => ['v2/test'], //版本2,test为控制器名称
                     'pluralize'=>false,//url不带复数
]   

返回数据格式化

1.可以在config/main.php里面定义response

'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function (event) {response = event->sender;response-> format = yii\web\Response::FORMAT_JSON; //定义所有控制器的返回数据格式


            },
        ]

2.也可以在单个控制器里面设定该控制器的返回格式化的数据

ps:格式响应:定义当前控制器的返回数据格式:(如果main.php和里面的behaviors同时定义了,则以里面定义为主)

      //  $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML;//Response::FORMAT_XML;Response::FORMAT_JSON;

返回数据自定义错误数据格式

修改config/main.php,在beforeSend里添加如下代码:

$response-> format = yii\web\Response::FORMAT_JSON;//自定义返回的数据类型必须和这里的定义一致,不然会报错
$response->statusCode = 200;//自定义返回错误码,方便前端统一用json格式处理数据
                $obj = 
                [
                    'success'=>$response->isSuccessful,
                    'code'=>$response->getStatusCode(),
                    'data'=>$response->data,
                    'message'=>$response->statusText
                ];
                $response-> data = $obj;

yii2-restful-api-study7-api权限管理rbac

原理:利用yii2-admin来管理api权限

1 安装yii2-admin

pre-install composer
$ composer config -g repo.packagist composer https://packagist.phpcomposer.com
$ composer require mdmsoft/yii2-admin "~2.0"

2 配置backend/config/main.php

<?php
params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [
        'admin' => [
            'class' => 'mdm\admin\Module',
        ]
                ],
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-backend',
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
         'authManager' => [
            'class' => 'yii\rbac\PhpManager', // or use 'yii\rbac\DbManager'
        ]
    ],
    'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            'site/*',
            'admin/*',
            'some-controller/some-action',
        ]

    ],

    'params' =>params,
];


3 访问 yourpath/index.php?r=admin

或者index.php?r=admin%2Froute (ps: 访问encodeURIComponent后的url,直接admin/route会有问题)

4 利用 AdminLTE 渲染后台模板,优化用户体验

4.1 进入 cmd,切换到 advanced 目录,输入

composer require dmstr/yii2-adminlte-asset "2.*"

4.2 复制 vendor/dmstr/yii2-adminlte-asset/example-views/yiisoft/yii2-app里面的两个文件夹 到 backend/views/,覆盖views下的对应文件夹(自己写的先备份,这里只覆盖系统生成的)

再访问 http://localhost/path/to/index.php?r=admin 看效果

4.3 自己记控制器命令总不如点击链接来得方便,所以可以配置下左侧菜单,

修改backend\views\layouts\left.php

 [
                        'label' => '权限管理',
                        'icon' => 'share',
                        'url' => '#',
                        'items' => [
                            ['label' => '权限', 'icon' => 'file-code-o', 'url' => ['/admin/permission'],],
                            ['label' => '角色', 'icon' => 'dashboard', 'url' => ['/admin/role'],],
                            ['label' => '分配', 'icon' => 'dashboard', 'url' => ['/admin/assignment'], ],
                            ['label' => '菜单', 'icon' => 'dashboard', 'url' => ['/admin/menu'], ],
                            ['label' => '路由', 'icon' => 'dashboard', 'url' => ['/admin/route'],],
                        ],
                    ],

进入 cmd,切换到 advanced 目录,输入
yii migrate --migrationPath=@mdm/admin/migrations
成功执行以后查看数据库会发现里面多了张menu表

5 配置用数据库表来存储rbac数据

5.1 修改backend/config/main.php

 'authManager' => [
            'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'
        ]

修改common/config/main-local.php,components里加入上面代码

5.2 执行

yii migrate --migrationPath=@yii/rbac/migrations
成功执行以后查看数据库会发现里面多了四张auth开头的授权表

配置这块就先到这里,接下来学习怎么使用这么强大的权限分配工具
思路:先从route里把要设置的function拉到一个权限池子里;然后新建permission,用来打包池子里的function;接着给用户分配权限包

5.3 api的权限分配分两种情况

5.3.1 控制系统生成的function(比如view,index,delete,modify)

在控制器里加上如下函数checkAccess:

//rbac情况一:系统生成的方法,testview,test为打包好route的permission名称
    public function checkAccess(action,model=null,params=[])
    {
        if(action==="view"){
            if(\Yii::app->user->can('testview')){
                return true;
            }
        }

        if(action==="view"||action==="update"||action==="delete"||action==="create"||action==="index"){
            if(\Yii::$app->user->can('test')){
                return true;
            }
        }

        throw new ForbiddenHttpException("sorry , no authority!");
    }

5.3.2 控制自定义或者重写的function

就在每个定义的function前面加上判断,比如:

//rbac情况二:自定义的方法或者重写的方法,fun为打包好route的permission名称
    public function actionFun(){
        if(!\Yii::$app->user->can('fun')){
            throw new ForbiddenHttpException("sorry , no authority!");
        }
        return "ok";
    }

yii2框架前后台用户认证分离

1.修改backend/config/main.php

            'user' => [
                'identityClass' => 'common\models\Adminuser',//认证类
                'enableAutoLogin' => true,
                'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
            ],
            'session' => [//不影响前端登录
                // this is the name of the session cookie used for login on the backend
                'name' => 'advanced-backend',
                'savePath'=>sys_get_temp_dir(),
            ],
            'request'=>[
                'cookieValidationKey'=>'sdfsfwef',
                'csrfParam'=>'_adminCSRF',
            ],

2 新建AdminLoginForm.php 参考LoginForm.php

3 修改backend/controllers/SiteController.php里面LoginForm替换成AdminLoginForm

4 参考User.php修改Adminuser.php,去掉状态

public static function tableName()
    {
        return '{{%adminuser}}';
    }

yii2 gii Forbidden (#403)解决方案

Forbidden (#403)
You are not allowed to access this page.

/opt/lampp/htdocs/amyflash/blogdemo2/vendor/yiisoft/yii2-gii# vim Module.php
public $allowedIPs = ['127.0.0.1', '::1','your ip'];

这样在 allowedIPs 数组里面的IP全部可以访问了

yii2页面引入js及获取下拉列表的值

1.advanced\backend\web目录下新建js文件夹用来放js文件

//myjs.js
(function(){('.link').change(function(){
        getSalutationValue(this.value); 
    });
   function getSalutationValue(value) {

      if(value == 1){
       ("#abc").html('ok');
      //("#abc").hide();
      }
      if(value == 2){
       ("#abc").html('nopass');
     //("#abc").show();
      }
      if(value == 'Unspecified'){
        $("#abc").html('nothing');
      }
  }

});

2.修改advanced\backend\assets\AppAsset.php,添加自定义的js文件的路径,我这就是js/myjs.js

<?php

namespace backend\assets;

use yii\web\AssetBundle;

/**
 * Main backend application asset bundle.
 */
class AppAsset extends AssetBundle
{
    public basePath = '@webroot';
    publicbaseUrl = '@web';
    public css = [
        'css/site.css',
    ];
    publicjs = [
    'js/myjs.js'
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

3.打开要引入js的views里面的某个页面,在title定义后加入AppAsset::register($this);

4. 下拉列表需要定义一个名字,用来被js控制

<?= form->field(model,'status')->dropDownList([1=>'ok',2=>'nopass'],['class'=>'form-control link','prompt'=>'choose'
]);?>

这里是form-control link

整个视图页面代码如下:

<?php

/* @var this yii\web\View */
/* @varform yii\bootstrap\ActiveForm */
/* @var model \common\models\LoginForm */

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use backend\assets\AppAsset;this->title = 'Login';
this->params['breadcrumbs'][] =this->title;
AppAsset::register(this);
?>

<div class="site-login">
    <h1><?= Html::encode(this->title) ?></h1>

    <p>Please fill out the following fields to login:</p>

    <div class="row">
        <div class="col-lg-5">
            <?php form = ActiveForm::begin(['id' => 'login-form']); ?>

 <?=form->field($model,'status')->dropDownList([1=>'ok',2=>'nopass'],['class'=>'form-control link','prompt'=>'choose'
]);?>

<div id="abc">1q2w3e4r</div>
            <?php ActiveForm::end(); ?>
        </div>
    </div>
</div>