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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统