AccountController.php 10.3 KB
<?php

namespace app\ht\modules\system\controllers;

use Yii;
use yii\base\Exception;
use yii\web\NotFoundHttpException;
use yii\data\Pagination;
use app\ht\controllers\BaseController;
use common\models\SysUser           as SysUserModel;
use common\models\SysUserProfile    as SysUserProfileModel;
use function implode;
use function strpos;

/**
 * 管理->帐号管理
 * Class AccountController
 * @package app\ht\modules\system\controllers
 */
class AccountController extends BaseController
{
    /**
     * 帐号管理显示页面
     */
    public function actionIndex()
    {
        $request = Yii::$app->request;

        /**
         * 组织SQL
         */
        $userQuery = SysUserModel::find()
            ->leftJoin(SysUserProfileModel::tableName(), '`sys_user_profile`.`sys_user_id` = `sys_user`.`id`')
            ->orderBy('sys_user.id ASC');

        /**
         * 查询过滤处理
         */
        $get = [];

        /**
         * 过滤
         */
        $keyword = $request->get("keyword");
        $get = [];
        if ($keyword) {
            $userQuery->filterWhere(['or',
                ['like', 'username', $keyword],
                ['like', 'realname', $keyword],
            ]);
        }
        $get['keyword'] = $keyword;

        /**
         * 分页处理
         */
        $pageSize = $request->get("pageSize") ? (int) $request->get("pageSize") : 20;
        $pages = new Pagination(['totalCount' => $userQuery->count(), 'pageSize' => $pageSize]);
        $users = $userQuery->offset($pages->offset)->limit($pages->limit)->all();

        /**
         * 数据整理
         */
        $data = [];
        $auth = Yii::$app->authManager;
        foreach ($users as $user) {
            // 角色
            $roles = $auth->getRolesByUser($user->id);
            $rn = [];
            foreach ($roles as $role) {
                $rn[] = $role->name;
            }
            $roles = implode(',', $rn);
            $data[] = [
                'id'              => $user->id,
                'username'        => $user->username,
                'roles'           => $roles,
                'realname'        => $user->profile ? $user->profile->realname : '',
                'email'           => $user->profile ? $user->profile->email : '',
                'mobile'          => $user->profile ? $user->profile->mobile : '',
                'is_enable_label' => $user->is_enable ? '启用' : '禁用',
                'is_enable_opt'   => $user->is_enable ? '禁用' : '启用',
            ];
        }

        /**
         * 渲染模板
         */
        return $this->render('index', [
            'users' => $data,
            'pages' => $pages,
            'get'   => $get,
        ]);
    }

    /**
     * 新增界面
     */
    public function actionCreate()
    {
        return $this->render('create');
    }


    /**
     * 新增执行动作
     */
    public function actionDoAdd()
    {
        $post = Yii::$app->request->post();
        if (empty($post)) {
            return;
        }

        $password = isset($post['password']) ? $post['password'] : '';
        $passworConfirm = isset($post['password_confirm']) ? $post['password_confirm'] : '';
        $username = isset($post['username']) ? $post['username'] : '';
        $realname = isset($post['realname']) ? $post['realname'] : '';
        $email = isset($post['email']) ? $post['email'] : '';
        $mobile = isset($post['mobile']) ? $post['mobile'] : '';
        $is_enable = isset($post['is_enable']) ? 1 : 0;

        if ('' == $username || !(preg_match("/^[0-9a-zA-Z]{6,10}$/", $username))) {
            Yii::$app->session->setFlash('danger', '用户名不能是空格,并且必须是6~12位的英文或数字');
            return $this->redirect(['/system/account/create']);
        }
        if ('' == $realname) {
            Yii::$app->session->setFlash('danger', '名称不能是空格');
            return $this->redirect(['/system/account/create']);
        }
        // 用户名不允许有冒号
        if (strpos($username, ':') !== false) {
            Yii::$app->session->setFlash('danger', '用户名不能包含冒号,请重新输入');
            return $this->redirect(['/system/account/create']);
        }

        // 验证密码一致
        if ($password != $passworConfirm) {
            Yii::$app->session->setFlash('danger', '两次输入密码不一致,请重新输入');
            return $this->redirect(['/system/account/create']);
        }

        //验证用户名为唯一,只在当前商城唯一
        $user = SysUserModel::find()->where(['username' => $username])->one();
        if ($user) {
            Yii::$app->session->setFlash('danger', '该用户名已经存在,请重新输入');
            return $this->redirect(['/system/account/create']);
        }

        $transaction = Yii::$app->db->beginTransaction();
        try {
            $model = Yii::createObject(SysUserModel::className());
            $model->username = $username;
            $model->password = $password;
            $model->is_enable = $is_enable;
            $model->save();

            $profile = Yii::createObject(SysUserProfileModel::className());
            $profile->sys_user_id = $model->id;
            $profile->realname = $realname;
            $profile->email = $email;
            $profile->mobile = $mobile;

            $profile->save();

            $transaction->commit();
        } catch (Exception $e) {
            Yii::$app->session->setFlash('danger', '数据保存失败,请重新操作');
            $transaction->rollBack();

            return $this->redirect(['/system/account/create']);
        }

        Yii::$app->session->setFlash('success', '用户添加成功');

        return $this->redirect(['index']);
    }

    /**
     * 更新界面
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

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

    /**
     * 更新执行动作
     */
    public function actionDoUpdate($id)
    {
        $post = Yii::$app->request->post();
        if (empty($post)) {
            return;
        }

        $username = isset($post['username']) ? $post['username'] : '';
        $realname = isset($post['realname']) ? $post['realname'] : '';
        $email = isset($post['email']) ? $post['email'] : '';
        $mobile = isset($post['mobile']) ? $post['mobile'] : '';
        $is_enable = isset($post['is_enable']) ? 1 : 0;

        $model = $this->findModel($id);
        $username = trim($username);
        $realname = trim($realname);

        if ('' == $username || !(preg_match("/^[0-9a-zA-Z]{6,10}$/", $username))) {
            Yii::$app->session->setFlash('danger', '用户名不能是空格,并且必须是6~12位的英文或数字');
            return $this->redirect(['/system/account/update', 'id' => $model->id]);
        }
        if ('' == $realname) {
            Yii::$app->session->setFlash('danger', '名称不能是空格');
            return $this->redirect(['/system/account/update', 'id' => $model->id]);
        }
        // 用户名不允许有冒号
        if (strpos($username, ':') !== false) {
            Yii::$app->session->setFlash('danger', '用户名不能包含冒号,请重新输入');
            return $this->redirect(['/system/account/update', 'id' => $model->id]);
        }

        // 验证用户名为唯一
        if ($model->username != $username) {
            $user = SysUserModel::find()->where(['username' => $username])->one();
            if ($user) {
                Yii::$app->session->setFlash('danger', '该用户名已经存在,请重新输入');
                return $this->redirect(['/system/account/update', 'id' => $model->id]);
            }
        }

        $transaction = Yii::$app->db->beginTransaction();
        try {
            $model->username = $username;
            $model->is_enable = $is_enable;
            $model->save();

            if ($model->profile) {
                $profile = $model->profile;
            } else {
                $profile = Yii::createObject(SysUserProfileModel::className());
                $profile->sys_user_id = $model->id;
            }

            $profile->realname = $realname;
            $profile->email = $email;
            $profile->mobile = $mobile;
            $profile->save();

            $transaction->commit();
        } catch (Exception $e) {
            Yii::$app->session->setFlash('danger', '数据保存失败,请重新操作');
            $transaction->rollBack();

            return $this->redirect(['index']);
        }

        Yii::$app->session->setFlash('success', '用户更新成功');

        return $this->redirect(['index']);
    }

    /**
     * 根据主键查找模型
     */
    protected function findModel($id)
    {
        $user = Yii::createObject(SysUserModel::className());
        if (($model = $user::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('访问页面不存在');
        }
    }


    /**
     * 启用或禁用
     */
    public function actionEnable($id)
    {
        $model = $this->findModel($id);
        $model->is_enable = ($model->is_enable == 1) ? 0 : 1;
        $model->save();

        Yii::$app->session->setFlash('success', '用户更新成功');

        return $this->redirect(['index']);
    }

    /**
     * 设置角色界面
     */
    public function actionSetRole($id)
    {
        $model = $this->findModel($id);

        $auth = Yii::$app->authManager;

        $selectedRoles = $auth->getRolesByUser($id);
        $roles = $auth->getRoles();

       return $this->render('set_role', [
            'model'         => $model,
            'roles'         => $roles,
            'selectedRoles' => $selectedRoles
        ]);
    }

    /**
     * 执行设置角色动作
     */
    public function actionDoSetRole($id)
    {
        $auth = Yii::$app->authManager;
        $post = Yii::$app->request->post();

        // 解除所有角色
        $auth->revokeAll($id);

        if (!empty($post['roles'])) {
            foreach ($post['roles'] as $roleId) {
                $role = $auth->getRole($roleId);
                $auth->assign($role, $id);
            }
        }

        Yii::$app->session->setFlash('success', '角色添加完成');

        return $this->redirect(['index']);
    }
}