Lumen企业站内容管理实战 - 角色管理

角色管理

先做路由,增删改查

    // 角色
    $router->get('/role/list', 'RoleController@lists'); // 角色列表
    $router->addRoute(['GET', 'POST'],'/role/add', 'RoleController@add'); // 添加角色
    $router->addRoute(['GET', 'POST'],'/role/edit/{id:[1-9]+}', 'RoleController@edit'); // 编辑角色
    $router->post('/role/del', 'RoleController@del'); // 删除角色

在角色模型中,写个list()方法

<?php


namespace App\Models;


use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public static function lists()
    {
        return Role::get();
    }
}

在控制器中,写个lists()方法

<?php


namespace App\Http\Controllers\Admin;


use App\Http\Controllers\Controller;
use App\Models\Role;

class RoleController extends Controller
{
    public function lists()
    {

        $data['role'] = Role::lists();
        return view('admin.role.list', $data);
    }

}

在角色视图下新建一个list.blade.php文件,效果如下

 添加角色

角色模型里添加add()方法

public function permissions()
    {
        return $this->belongsToMany(Permission::class, 'role_permissions', 'role_id', 'permission_id');
    }

    public static function add(array $roleData, array $permissionData)
    {

        try {

            DB::transaction(function () use ($roleData, $permissionData) {
                // 保存角色信息
                $role = new Role();
                $role->role_name = $roleData['role_name'];
                $role->save();

                $role->permissions()->attach(array_values($permissionData));
            });

        } catch (\Exception $e) {
            Log::error('添加角色信息失败,失败信息:' . $e->getMessage());
            return false;
        }

        return true;
    }

 首先使用多对多关联,因为角色和权限是多对多关系,我们使用belongsToMany()方法,第一个参数指定是权限表,第二个参数是关联关系的表名,你看,这个模型是role模型,要关联permission模型,一定要通过角色-权限模型即role_permission模型,第三个参数是role模型在关联模型中的外键,第四个参数permission模型在关联关系中的外键。

这里要使用事务,插入角色失败或者角色-权限关系失败都要数据回滚。插入角色-权限关系数据的时候,我这里使用了attach(),如果对这个不了解,可以看文档。如果插入报错,我这里也记录了错误信息。前边所讲所有的模型中,在增删改操作的时候,如果失败,都应该保存失败信息。

控制其中写一个add()方法

public function add(Request $request)
    {

        if ($request->post()) {
            // todo 验证数据;验证角色名是否重复
            Role::add($request->input(), $request->input('id'));
            return $this->response->responseJSON();
        }

        $data['menus'] = Menu::lists(); // 根据菜单查找权限
        return view('admin.role.add', $data);
    }

我们插入一条信息看看

 

 

添加成功。

在看看编辑。在模型层写一个edit()方法。添加的时候,我们使用的是attach(),更新的时候我们使用sync(),为什么呢?这个区别比较大,attach就是纯粹的新增数据,sync就不一样了,sync 方法接收一个数组以替换中间表的记录。中间表记录中,所有未在数组中的记录都将会被移除。所以该操作结束后,只有给出数组的 ID 会被保留在中间表中。

public static function edit(Role $role, array $permissionData)
    {
        try {

            $role->permissions()->sync(array_values($permissionData));

        } catch (\Exception $e) {
            Log::error('添加角色信息失败,失败信息:' . $e->getMessage());
            return false;
        }

        return true;

    }

 在控制器中,写一个edit()方法

public function edit(int $id, Request $request)
    {

        $role = Role::with('permissions')->where('id', $id)->first();
        // todo 如果数据不存在,跳转到错误页面

        if ($request->post()) {
            // todo 验证数据;验证角色名是否重复
            Role::edit($role, $request->input('id'));
            return $this->response->responseJSON();
        }

        // 获取该角色下的所有的权限ID,然后放到数组中,便于在视图中判断权限是不是被选中
        $permission = [];
        foreach ($role->permissions as $item) {
            array_push($permission, $item->pivot->permission_id);
        }

        $data['menus'] = Menu::lists(); // 根据菜单查找权限
        $data['role'] = $role;
        $data['permission'] = $permission;

        return view('admin.role.edit', $data);
    }

视图我直接改好了,代码代码太多,我就不粘贴出来了,直接看效果。

看,是全部选中状态,我们改成一部分选中,一部分不选中,修改下看看

 

没有问题,你看看,使用laravel/lumen是不是减轻了很多工作?

 最后是删除,在角色模型中,写一个del()方法

    public static function del(Role $role)
    {
        $role->delete();
        $role->permissions()->detach();
    }

控制器中新增一个del方法

public function del(Request $request)
    {
        // todo 验证数据,必须是数组

        try {

            DB::transaction(function () use ($request) {
                // 查询出所有要删除的角色。
                $roles = Role::whereIn('id', $request->input('ids'))->get();

                foreach ($roles as $role) {
                    // 删除角色
                    Role::del($role);
                }
            });


        } catch (\Exception $e) {
            Log::error("删除角色失败,{$e->getMessage()}");
            $this->response->setMsg(500, '删除角色失败');
            return $this->response->responseJSON();
        }

        return $this->response->responseJSON();
    }

 我们看看数据中的数据

 

 然后我们删除

 

 角色-权限数据全部删除

完。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangpeng52758

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值