编写表字段
node表
Schema::create('nodes', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name',50)->comment('节点名称');
$table->string('route_name',100)->nullable()->default('')->comment('路由别名,权限认证标识');
$table->unsignedInteger('pid')->default(0)->comment('上级ID');
$table->enum('is_menu',['0','1'])->default('0')->comment('是否为菜单0否,1是');
$table->timestamps();
$table->softDeletes();
});
roles角色表
Schema::create('roles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name','20')->comment('角色名称');
$table->timestamps();
// 软删除
$table->softDeletes();
});
role_node中间表
Schema::create('role_node', function (Blueprint $table) {
// 角色ID
$table->unsignedInteger('role_id')->default(0)->comment('角色ID');
// 节点ID
$table->unsignedInteger('node_id')->default(0)->comment('节点ID');
});
创建模型层
php artisan make:model Admin\Role
php artisan make:model Admin\Node
编写Node模型层方法
// 修改器 route_name RouteName set字段名Attribute 字段名首字母大写,遇下划线后字母大写
public function setRouteNameAttribute($value) {
// 如果字段值为null,则设置为空字符串 修改和添加时生效 create 或 update
$this->attributes['route_name'] = empty($value) ? '' : $value;
}
访问器menu
// 访问器 menu Menu
public function getMenuAttribute() {
return $this->is_menu == '1' ? '<span class="label label-success radius">是</span>' : '<span class="label label-danger radius">否</span>';
}
获取全部数据
// 获取全部的数据
public function getAllList() {
$data = self::get()->toArray();
return $this->treeLevel($data);
}
获取层级关系
/**
* 获取层级的数据
* @param $allow_node 用户有的权限
* @return array
*/
public function treeData($allow_node) {
$query = Node::where('is_menu', '1');
if (is_array($allow_node)) {
$query->whereIn('id', array_keys($allow_node));
}
$menuData = $query->get()->toArray();
return $this->subTree($menuData);
}
编写Role模型层方法
// 角色与权限 多对多
public function nodes() {
// 参1 关联模型
// 参2 中间表的表名,没有前缀
// 参3 本模型对应的外键ID
// 参4 关联模型对应的外键ID
return $this->belongsToMany(Node::class,'role_node','role_id','node_id');
}
创建控制器
php artisan make:controller RoleController --resource
php artisan make:controller NodeController --resource
编写RoleController 方法
节点列表
/**
* 节点列表
*/
public function index() {
// 获取所有的节点 返回是数组
$data =(new Node)->getAllList();
return view('admin.node.index', compact('data'));
}
添加
public function create() {
// 获取所有的顶部
$data = Node::where('pid', 0)->get();
return view('admin.node.create', compact('data'));
}
添加处理
public function store(Request $request) {
// 表单验证
// try() catch()
// 入库
/*$data = $request->except('_token');
$data['route_name'] = empty()*/
Node::create($request->except('_token'));
return ['status' => 0, 'msg' => '添加权限成功'];
}
编写RoleController方法
列表
/**
* 列表
*/
public function index(Request $request) {
// 获取搜索框
$name = $request->get('name', '');
// 分页 搜索
// 参数1, 变量值存在。则执行 参数2--->匿名函数
$data = Role::when($name, function ($query) use ($name) {
$query->where('name', 'like', "%{
$name}%");
})->paginate($this->pagesize);
return view('admin.role.index', compact('data', 'name'));
}
添加显示
/**
* 添加显示
*/
public function create() {
return view('admin.role.create');
}
添加处理
/**
* 添加处理
*/
public function store(Request $request) {
// 异常处理
try {
$this->validate($request, [
'name' => 'required|unique:roles,name'
]);
} catch (\Exception $e) {
return ['status' => 1000, 'msg' => '验证不通过'];
}
// 接受 all 接受所有的数据
Role::create($request->only('name'));
return ['status' => 0, 'msg' => '添加角色成功'];
}
修改显示
/**
* 修改显示
*/
public function edit(int $id) {
$model = Role::find($id);
return view('admin.role.edit', compact('model'));
}
修改处理
/**
* 修改处理
*/
public function update(Request $request, int $id) {
// 异常处理
try {
$this->validate($request, [
// unique:表名,唯一字段,[排除行的值,以那个字段来排除]
// 排除id=3的哪行名为name的字段值
'name' => 'required|unique:roles,name,' . $id . ',id'
]);
} catch (\Exception $e) {
return ['status' => 1000, 'msg' => '验证不通过'];
}
// 修改角色入库
//Role::where('id', $id)->update($request->only(['name']));
Role::where([['id', '=', $id]])->update($request->only(['name']));
return ['status' => 0, 'msg' => '修改用户成功'];
}
给角色分配权限
public function node(Role $role) {
//dump($role->nodes->toArray());
//dump($role->nodes()->pluck('name','id')->toArray());
// 读取出所有的权限
$nodeAll = (new Node())->getAllList();
// 读取当前角色所拥有的权限
$nodes = $role->nodes()->pluck('id')->toArray();
return view('admin.role.node',compact('role','nodeAll','nodes'));
}
分配处理
public function nodeSave(Request $request,Role $role) {
// 关联模型的数据同步
$role->nodes()->sync($request->get('node'));
return redirect(route('admin.role.node',$role));
}
编写路由
// 角色管理
// 分配权限
Route::get('role/node/{role}', 'RoleController@node')->name('role.node');
Route::post('role/node/{role}', 'RoleController@nodeSave')->name('role.node');
// 资源路由 /admin/role/xxx
Route::resource('role', 'RoleController');
// 节点管理
Route::resource('node', 'NodeController');
其中用到的视图层,可以自己写,我这里用的H-ui里的视图,可以供大家测试一下!
role中的视图
index
@extends