Yii2与layuiadmin整合3

28.建立获取用户数据模型  /modules/users/models/Users.php

<?php

namespace app\modules\users\models;

use Yii;
use yii\base\Model;

class Users extends Model {
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%user}}';
    }
    public static function getUsersList($params) {
        $bindValues = [];
        $where = " where 1 ";
        $sqlCount = "select count(*) as total from {{user}}";
        $sql = "select id,username,email,phone,status,created_at,updated_at from {{user}}";
        if(isset($params['page']) && intval($params['page']) >= 1) {
            $params['page'] = intval($params['page']);
        }else{
            $params['page'] = 1;
        }

        if(isset($params['limit']) && intval($params['limit']) >= 1) {
            $params['limit'] = intval($params['limit']);
        }else{
            $params['limit'] = 10;
        }

        $bindValues[':pagesize'] = $params['limit'];
        $bindValues[':startnum'] = $params['limit'] * ($params['page'] - 1);

        if(isset($params['username']) && $params['username']) {
            $where .= " and username = :username ";
            $bindValues[':username'] = $params['username'];
        }

        if(isset($params['email']) && $params['email']) {
            $where .= " and email = :email ";
            $bindValues[':email'] = $params['email'];
        }

        if(isset($params['phone']) && $params['phone']) {
            $where .= " and phone = :phone ";
            $bindValues[':phone'] = $params['phone'];
        }
        $sql .= $where;
        $sqlCount .= $where;
        $sql .= "order by id desc limit :startnum , :pagesize";
        $users = Yii::$app->db->createCommand($sql)
            ->bindValues($bindValues)
            ->queryAll();
        unset($bindValues[':pagesize']);
        unset($bindValues[':startnum']);
        $totalRes = Yii::$app->db->createCommand($sqlCount)
            ->bindValues($bindValues)
            ->queryOne();
        $data = ['dataList' => $users,'total' => $totalRes['total']];
        return $data;
    }
}

29.下载jq文件,放到 /web/assets/js/jquery.min.js

30. 在文件/assets/LayuiAsset.php中添加jquery.min.js

    public $js = [
        'assets/js/jquery.min.js',
        'assets/layuiadmin/layui/layui.js',
    ];

31. 优化用户口添加 /modules/users/controllers/UserController.php

   /**
     * 添加用户
     */
    public function actionCreate() {

        $model = new SignupForm();
        $model->setScenario('create');
        if ($model->load(Yii::$app->request->post())) {
            $username = $model->username;
            if ($user = $model->signup()) {
                Yii::$app ->session->setFlash('info','用户 [ ' . $username . ' ] 添加成功');
                unset($model);
                $model = new SignupForm();
                $model->setScenario('create');
            }else{
                Yii::$app ->session->setFlash('info','用户 [ ' . $username . ' ] 添加失败');
            }

        }
        if(Yii::$app->session->hasFlash('info')) {
            $info = Yii::$app->session->getFlash('info');
        }else{
            $info = '';
        }

        return $this->render('create',[
            'model' => $model,
            'info' => $info
        ]);
    }

32. 修改用户添加模板 /modules/users/views/user/create.php

<div id="bg" style="width: 100%;height: 100%;"></div>
<div class="layui-layout layui-layout-admin-empty">
    <div class="layui-body">
        <div class="layui-card">
            <div class="layui-card-header">
                添加用户 <?= $info;?>
            </div>
            <div class="layui-card-body">
                <?= $this->render('_form',[
                    'model'=>$model
                ])?>
            </div>
        </div>
    </div>
</div>

32.1.1 新建模板文件  /modules/users/views/user/_form.php

<?php
use app\widgets\ActiveForm;
use yii\helpers\Html;
$form = ActiveForm::begin();
?>
<?= $form->field($model, 'username')->textInput() ?>
<?= $form->field($model, 'email')->textInput()->label('邮箱') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'repassword')->passwordInput()->label('重复密码') ?>
<?= $form->field($model, 'phone')->textInput()->label('手机号码') ?>
<div class="layui-form-item">
    <div class="layui-input-block">
        <?= Html::submitButton('提交', ['class' => 'layui-btn', 'onsubmit' => '']) ?>
        <?= Html::a('返 回','/users/user',['class' => 'layui-btn']);?>
    </div>
</div>
<?php ActiveForm::end(); ?>

33.建立 文件 /widgets/ActiveForm.php

<?php

namespace app\widgets;

use Yii;
use yii\helpers\ArrayHelper;
use yii\base\Model;
class  ActiveForm extends \yii\widgets\ActiveForm
{
    public function init()
    {
        parent::init(); 
    }


    public $options = ['class' => 'layui-form'];

    public $fieldClass = 'app\widgets\ActiveField';

    public $fieldConfig = [
        'labelOptions' => ['class'=>'layui-form-label']
    ];


    public function field($model, $attribute, $options = [])
    {
        $config = $this->fieldConfig;
        if ($config instanceof \Closure) {
            $config = call_user_func($config, $model, $attribute);
        }
        if (!isset($config['class'])) {
            $config['class'] = $this->fieldClass;
        }
        return Yii::createObject(ArrayHelper::merge($config, [
            'model' => $model,
            'attribute' => $attribute,
            'form' => $this,
            'options'=>['class'=>'layui-form-item']
        ],$options));
    }
}

34. 建立 文件 /widgets/ActiveField.php

<?php

namespace app\widgets;
use yii\helpers\Html;

class ActiveField extends \yii\widgets\ActiveField
{
    public $inputOptions = ['class'=>'layui-input'];


    public $template = "{label}\n<div class=\"layui-input-inline\">{input}</div>\n{hint}\n{error}";


    public function error($options = [])
    {
        if ($options === false) {
            $this->parts['{error}'] = '';
            return $this;
        }
        $options = array_merge($this->errorOptions, $options);
        $this->parts['{error}'] = Html::error($this->model, $this->attribute, $options);

        return $this;
    }


    public function checkboxList($items, $options = [])
    {
        $this->template = "{label}\n<div class=\"layui-input-block\">{input}</div>\n{hint}\n{error}";
        return parent::checkboxList($items,$options);
    }


    public function textarea($options = ['class'=>'layui-textarea'])
    {
        $options = array_merge($this->inputOptions, $options);

        if ($this->form->validationStateOn === ActiveForm::VALIDATION_STATE_ON_INPUT) {
            $this->addErrorClassIfNeeded($options);
        }

        $this->addAriaAttributes($options);
        $this->adjustLabelFor($options);
        $this->parts['{input}'] = Html::activeTextarea($this->model, $this->attribute, $options);

        return $this;
    }

    /**
     * @param array $items
     * @param array $options
     * @return $this
     */
    public function dropDownList($items, $options = [])
    {
        $options = array_merge($this->inputOptions, $options);

        if ($this->form->validationStateOn === ActiveForm::VALIDATION_STATE_ON_INPUT) {
            $this->addErrorClassIfNeeded($options);
        }

        $this->addAriaAttributes($options);
        $this->adjustLabelFor($options);
        $this->parts['{input}'] = Html::activeDropDownList($this->model, $this->attribute, $items, $options);

        return $this;
    }


    /**
     * @param $items
     * @param array $options
     * @return $this
     */
    public function multipleDropDownList($items, $options = [])
    {
        $options = array_merge($this->inputOptions, $options, [
            "xm-select-search"=>true,
            "xm-select-search-type" => 'dl',
            'xm-select-height' => '36px'
        ]);

        if ($this->form->validationStateOn === ActiveForm::VALIDATION_STATE_ON_INPUT) {
            $this->addErrorClassIfNeeded($options);
        }

        $this->addAriaAttributes($options);
        $this->adjustLabelFor($options);
        $this->parts['{input}'] = Html::activeDropDownList($this->model, $this->attribute, $items, $options);

        return $this;
    }

}

35. 优化模型文件  /modules/users/models/SignupForm.php

<?php

namespace app\modules\users\models;

use app\models\User;
use Yii;
use yii\base\Model;

/**
 * LoginForm is the model behind the login form.
 *
 * @property-read User|null $user
 *
 */
class SignupForm extends Model
{
    public $username;
    public $password;
    public $email;
    public $phone;
    public $repassword;


    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            ['username', 'required'],
            ['username', 'filter', 'filter' => 'trim'],
            ['username','unique','targetClass' => '\app\models\User', 'message' => 'This username has already been taken.','on'=>['create']],
            ['username', 'string', 'min' => 5, 'max' => 255],
            // email
            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'email'],
            // phone
            ['phone', 'filter', 'filter' => 'trim'],

            // password is validated by validatePassword()
            [['password','repassword'], 'required','on'=>['create']],
            [['password','repassword'], 'string', 'min' => 6],
            ['repassword', 'compare', 'compareAttribute' => 'password','message'=>'两次输入的密码不一致!'],
            ['password', 'string', 'min' => 6],
        ];
    }

    /** 注册用户
     * @return User|null
     */
    public function signup()
    {
        if($this->validate()) {
            $user = new User();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->phone = $this->phone;
            $user->setPassword($this->password);
            $user->generateAuthKey();
            $user->save();
            if($user->save()) {
                return $user;
            }
        }
        return null;
    }

    public function findOne($id)
    {
        $user = User::findOne($id);
        $this->username = $user->username;
        $this->email = $user->email;
        $this->phone = $user->phone;
        return $this;
    }

    public function attributeLabels()
    {
        return [
            'username' => '用户名',
            'password' => '密码',
            'repassword' => '重复密码',
            'phone' => '手机号码'
        ];
    }


}

以上添加用户功能,可以正式访问操作了

36. 开发编辑用户功能,修改文件 /modules/users/controllers/UserController.php

    /**
     * 编辑用户
     */
    public function actionUpdate($id) {
        $model = (new SignupForm())->findOne($id);
        $username = $model->username;
        if($model->load(Yii::$app->request->post())){
            if($username != $model->username){
                if(User::findOne(['username' => $model->username]))
                {
                    $model->addError('username','用户名和其他用户重复');
                }
            }
            $user = User::findOne($id);
            $user->username = $model->username;
            $user->email = $model->email;
            $user->phone = $model->phone;
            if($model->password){
                $user->setPassword($model->password);
            }
            if($model->validate($model->activeAttributes(),false) && $user->save()){
                Yii::$app ->session->setFlash('info','用户 [ ' . $username . ' ] 修改成功');
            }else{
                Yii::$app ->session->setFlash('info','用户 [ ' . $username . ' ] 修改失败');
            }
        }
        if(Yii::$app->session->hasFlash('info')) {
            $info = Yii::$app->session->getFlash('info');
        }else{
            $info = '';
        }
        return $this->render('update',[
            'model' => $model,
            'info' => $info
        ]);
    }

此时可以修改用户信息了

37.开发删除功能 /modules/users/controllers/UserController.php
添加如下删除功能

    // 
    public function actionDelete()
    {
        $failure = [];
        $ids = Yii::$app->request->post()['ids'];
        if($ids) {
            foreach ($ids as $id) {
                $model = User::findOne($id);
                if(!$model->delete()){
                    array_push($failure,$model->username);
                }
            }
            if($failure) {
                Yii::$app ->session->setFlash('info','用户' .implode(',',$failure) .'删除失败');
            }
            if(Yii::$app->session->hasFlash('info')) {
                $info = Yii::$app->session->getFlash('info');
            }else{
                $info = '操作成功';
            }
            $data = ['code' => 0,'msg' => $info];
            $this->asJson($data);
        }
        return $this->redirect(['/site/login']);
    }
    

38.基于角色的存取控制开发,在文件/config/console.php 中配置

return [
    // ...
    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
        // ...
    ],
];

39. 在根目录执行以下脚本  

php ./yii migrate --migrationPath=@yii/rbac/migrations

40. 开发角色与权限列表,新建文件 /modules/system/controllers/RoleController.php
添加以下内容

<?php

namespace app\modules\system\controllers;

use app\controllers\BaseController;

/**
 * Default controller for the `system` module
 */
class RoleController extends BaseController
{
    /**
     * Renders the index view for the module
     * @return string
     */
    public function actionIndex()
    {
        return $this->render('index');
    }
}

41.建立对应的模板文件 /modules/system/views/Role/index.php


42.新建模型文件 /modules/system/models/Role.php

43.建立模板 /modules/system/views/Role/create.php

44. 建立模板 /modules/system/views/Role/_form.php

posted @ 2022-02-08 09:33  好记性还真不如烂笔头  阅读(133)  评论(0编辑  收藏  举报