RoleController.php 7.66 KB
<?php

namespace app\ht\modules\system\controllers;

use Yii;
use yii\base\Exception;
use yii\data\Pagination;
use yii\db\Query;
use app\ht\controllers\BaseController;
use app\ht\exts\rbac\DbManager;
use domain\system\AuthPermRepository;
use function implode;
use function trim;

/**
 * 角色管理控制器
 */
class RoleController extends BaseController
{
    /**
     * 列表
     */
    public function actionIndex()
    {
        $request = Yii::$app->request;

        /**
         * 组织SQL
         */
        $roleQuery = new Query();
        $roleQuery->select(['auth_role.*']);
        $roleQuery->from('auth_role');

        /**
         * 过滤
         */
        $get = [];
        $keyword = $request->get("keyword");
        if ($keyword) {
            $roleQuery->FilterWhere(['or',
                ['like','name', $keyword],
            ]);
        }
        $get['keyword'] = $keyword;

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

        /**
         * 数据整理
         */
        $data = [];
        $auth = Yii::$app->authManager;
        foreach ($roles as $role) {
            $perms = [];
            foreach ($auth->getPermsByRole($role['role_id']) as $perm) {
                $perms[] = $perm->name;
            }
            $perms = implode(',', $perms);
            $data[] = [
                'id'            => $role['role_id'],
                'name'          => $role['name'],
                'description'   => $role['description'],
                'perms'         => $perms,
            ];
        }

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

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

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

        if (empty($post)) {
            return;
        }

        $roleName = isset($post['name']) ? $post['name'] : '';
        $description = isset($post['description']) ? $post['description'] : '';
        $roleName = trim($roleName);
        $description = trim($description);

        $transaction = Yii::$app->db->beginTransaction();
        try {
            $auth = Yii::$app->authManager;
            $role = $auth->createRole($roleName);
            $role->description = $description;
            $addResult = $auth->addRole($role);
            if ($addResult) {
                $transaction->commit();
                Yii::$app->session->setFlash('success', '角色添加完成');
                // 重置缓存
                Yii::$app->authManager->invalidateCache();
            } else {
                $transaction->rollBack();
                Yii::$app->session->setFlash('danger', '角色添加失败,可能重名');
            }

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

            return $this->redirect(['/mall/role/create']);
        }

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

    /**
     * 更新界面
     */
    public function actionUpdate($id)
    {
        $role = Yii::$app->authManager->getRole($id);
        $supperRoleName = DbManager::SUPPER_ADMIN_NAME;
        return $this->render('update', [
            'role' => $role,
            'supperRoleName' => $supperRoleName
        ]);
    }

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

        $roleName = isset($post['name']) ? $post['name'] : '';
        $description = isset($post['description']) ? $post['description'] : '';
        $roleName = trim($roleName);
        $description = trim($description);
        $authManager = Yii::$app->authManager;
        $role = $authManager->getRole($id);
        $existRole = $authManager->getRoleByName($roleName);
        if ($role && $existRole && $role->roleId != $existRole->roleId) {
            Yii::$app->session->setFlash('danger', '角色名称已存在,请改其他名称');
            return $this->redirect(['index']);
        }

        $transaction = Yii::$app->db->beginTransaction();
        try {
            $role->name = $roleName;
            $role->description = $description;
            $authManager->updateRole($id, $role);

            $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']);
    }

    /**
     * 更新执行动作
     */
    public function actionDelete($id)
    {
        $role = Yii::$app->authManager->getRole($id);

        Yii::$app->authManager->removeRole($role);

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

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

    /**
     * 分配权限界面
     */
    public function actionSetPermission($id)
    {
        $auth = Yii::$app->authManager;
        $role = $auth->getRole($id);
        $selected = $auth->getPermsByRole($id);

        $modules = Yii::$app->modules;
        $permission = [];
        foreach ($modules as $name => $class) {
            $module = Yii::$app->getModule($name);
            if (!empty($module->params['perm'])) {
                $permission[$name] = $module->params['perm'];
            }
        }

        return $this->render('set_permission', [
            'role'       => $role,
            'permission' => $permission,
            'selected'   => $selected
        ]);
    }

    /**
     * 执行分配权限动作
     */
    public function actionDoSetPermission($id)
    {
        $post = Yii::$app->request->post();
        $auth = Yii::$app->authManager;
        $role = $auth->getRole($id);
        if (empty($post['permission'])) {
            // 删除角色所有权限
            $auth->setRolePerms($id);
            Yii::$app->session->setFlash('success', '权限设置完成');
            return $this->redirect(['index']);
        }

        $transaction = Yii::$app->db->beginTransaction();
        try {
            $perms = implode(',', $post['permission']);
            $auth->setRolePerms($id, $perms);
            $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']);
    }

    /**
     * @param $id
     * @return string
     */
    public function actionAssignPermission($id)
    {
        $auth = Yii::$app->authManager;
        $role = $auth->getRole($id);
        $selected = $auth->getPermsByRole($id);

        $confirmRouters = AuthPermRepository::getPermsRouters('perm_id >0');
        $modulesArr = AuthPermRepository::getGroupPermsRouters($confirmRouters);
        return $this->render('assign_permission', [
            'role'       => $role,
            'permission' => $modulesArr,
            'selected'   => $selected
        ]);
    }
}