权限管理

This commit is contained in:
wuyanwen 2019-12-12 09:13:29 +08:00
parent ecae3e90f1
commit 7a6628a95f
9 changed files with 91 additions and 20 deletions

View File

@ -155,6 +155,8 @@ class Permissions extends CatchController
throw new FailedException('存在子菜单,无法删除'); throw new FailedException('存在子菜单,无法删除');
} }
$this->permissions->findBy($id)->roles()->detach();
return CatchResponse::success($this->permissions->deleteBy($id)); return CatchResponse::success($this->permissions->deleteBy($id));
} }
} }

View File

@ -7,6 +7,7 @@ use catcher\CatchForm;
use catcher\CatchResponse; use catcher\CatchResponse;
use catcher\exceptions\FailedException; use catcher\exceptions\FailedException;
use catcher\Tree; use catcher\Tree;
use think\response\Json;
class Roles extends CatchController class Roles extends CatchController
{ {
@ -53,13 +54,18 @@ class Roles extends CatchController
* *
* @time 2019年12月11日 * @time 2019年12月11日
* @param Request $request * @param Request $request
* @return \think\response\Json * @return Json
* @throws \think\db\exception\DbException
*/ */
public function save(Request $request) public function save(Request $request)
{ {
$this->role->storeBy($request->param());
if (!empty($request->param('permissionids'))) {
$this->role->attach($request->param('permissionids'));
}
// 添加角色 // 添加角色
dd($request->param('roleids')); return CatchResponse::success();
return CatchResponse::success($this->role->storeBy($request->param()));
} }
public function read($id) public function read($id)
@ -83,6 +89,7 @@ class Roles extends CatchController
$form->hidden('parent_id')->default($role->parent_id); $form->hidden('parent_id')->default($role->parent_id);
$form->text('role_name', '角色名称', true)->default($role->name)->verify('required')->placeholder('请输入角色名称'); $form->text('role_name', '角色名称', true)->default($role->name)->verify('required')->placeholder('请输入角色名称');
$form->textarea('description', '角色描述')->default($role->description)->placeholder('请输入角色描述'); $form->textarea('description', '角色描述')->default($role->description)->placeholder('请输入角色描述');
$form->dom('<div id="permissions"></div>', '权限');
$form->formBtn('submitRole'); $form->formBtn('submitRole');
return $this->fetch([ return $this->fetch([
@ -96,11 +103,22 @@ class Roles extends CatchController
* @time 2019年12月11日 * @time 2019年12月11日
* @param $id * @param $id
* @param Request $request * @param Request $request
* @return \think\response\Json * @return Json
* @throws \think\db\exception\DbException
*/ */
public function update($id, Request $request) public function update($id, Request $request)
{ {
return CatchResponse::success($this->role->updateBy($id, $request->param())); $this->role->updateBy($id, $request->param());
$role = $this->role->findBy($id);
$role->detach();
if (!empty($request->param('permissionids'))) {
$role->attach($request->param('permissionids'));
}
return CatchResponse::success();
} }
/** /**
@ -111,26 +129,57 @@ class Roles extends CatchController
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
* @return \think\response\Json * @return Json
*/ */
public function delete($id) public function delete($id)
{ {
if ($this->role->where('parent_id', $id)->find()) { if ($this->role->where('parent_id', $id)->find()) {
throw new FailedException('存在子角色,无法删除'); throw new FailedException('存在子角色,无法删除');
} }
$role = $this->role->findBy($id);
// 删除权限 // 删除权限
return CatchResponse::success($this->role->deleteBy($id)); $role->detach();
// 删除用户关联
$role->users()->detach();
// 删除
$this->role->deleteBy($id);
return CatchResponse::success();
} }
/** /**
* *
* @time 2019年12月11日 * @time 2019年12月11日
* @param Request $request * @param Request $request
* @return \think\response\Json * @return Json
*/ */
public function list(Request $request) public function list(Request $request)
{ {
return CatchResponse::success(Tree::done($this->role->getList($request->param()))); return CatchResponse::success(Tree::done($this->role->getList($request->param())));
} }
/**
*
* @time 2019年12月11日
* @param Request $request
* @param \catchAdmin\permissions\model\Permissions $permission
* @return Json
*/
public function getPermissions(Request $request, \catchAdmin\permissions\model\Permissions $permission): Json
{
$permissions = Tree::done($permission->getList());
$permissionIds = [];
if ($request->param('role_id')) {
$roleHasPermissions = $this->role->findBy($request->param('role_id'))->getPermissions();
foreach ($roleHasPermissions as $_permission) {
$permissionIds[] = $_permission->pivot->permission_id;
}
}
return CatchResponse::success([
'permissions' => $permissions,
'hasPermissions' => $permissionIds,
]);
}
} }

View File

@ -31,6 +31,10 @@ trait HasRolesTrait
*/ */
public function attach(array $roles) public function attach(array $roles)
{ {
if (empty($roles)) {
return true;
}
return $this->roles()->attach($roles); return $this->roles()->attach($roles);
} }

View File

@ -30,7 +30,7 @@ class Permissions extends CatchModel
public const PUT = 'put'; public const PUT = 'put';
public const DELETE = 'delete'; public const DELETE = 'delete';
public function getList($search) public function getList($search = [])
{ {
return $this->when($search['name'] ?? false, function ($query) use ($search){ return $this->when($search['name'] ?? false, function ($query) use ($search){
$query->whereLike('name', $search['name']); $query->whereLike('name', $search['name']);
@ -47,6 +47,6 @@ class Permissions extends CatchModel
public function roles(): \think\model\relation\BelongsToMany public function roles(): \think\model\relation\BelongsToMany
{ {
return $this->belongsToMany(Roles::class, 'role_has_permissions'); return $this->belongsToMany(Roles::class, 'role_has_permissions', 'role_id', 'permission_id');
} }
} }

View File

@ -40,7 +40,7 @@ class Roles extends CatchModel
*/ */
public function users(): \think\model\relation\BelongsToMany public function users(): \think\model\relation\BelongsToMany
{ {
return $this->belongsToMany(Users::class, 'user_has_roles'); return $this->belongsToMany(Users::class, 'user_has_roles', 'uid', 'role_id');
} }
/** /**
@ -56,10 +56,9 @@ class Roles extends CatchModel
/** /**
* *
* @time 2019年12月08日 * @time 2019年12月08日
* @param $rid
* @return mixed * @return mixed
*/ */
public function getRoles($rid) public function getPermissions()
{ {
return $this->permissions()->select(); return $this->permissions()->select();
} }

View File

@ -3,8 +3,9 @@
$router->resource('role', '\catchAdmin\permissions\controller\Roles'); $router->resource('role', '\catchAdmin\permissions\controller\Roles');
// 角色列表 // 角色列表
$router->get('roles', '\catchAdmin\permissions\controller\Roles/list'); $router->get('roles', '\catchAdmin\permissions\controller\Roles/list');
$router->get('/role/get/permissions', '\catchAdmin\permissions\controller\Roles/getPermissions');
// 权限 // 权限
$router->resource('permission', '\catchAdmin\permissions\controller\Permissions'); $router->resource('permission', '\catchAdmin\permissions\controller\Permissions');
// 权限列表 // 权限列表
$router->get('permissions', '\catchAdmin\permissions\controller\Permissions/list'); $router->get('permissions', '\catchAdmin\permissions\controller\Permissions/list');

View File

@ -23,9 +23,9 @@
}, 'post'); }, 'post');
return false; return false;
}); });
admin.req('{:url("permissions")}',{}, function (response) { admin.req('{:url("/role/get/permissions")}',{}, function (response) {
var inst1 = authtree.render('#permissions', response.data,{ authtree.render('#permissions', response.data.permissions,{
inputname: 'authids[]', inputname: 'permissionids[]',
layfilter: 'lay-check-auth', layfilter: 'lay-check-auth',
autowidth: true, autowidth: true,
nameKey: 'permission_name', nameKey: 'permission_name',

View File

@ -1,13 +1,29 @@
{$form|raw} {$form|raw}
<script> <script>
layui.use(['layer', 'form', 'admin', 'formX'], function () { layui.use(['layer', 'form', 'admin', 'formX', 'authtree'], function () {
var $ = layui.jquery; var $ = layui.jquery;
var layer = layui.layer; var layer = layui.layer;
var form = layui.form; var form = layui.form;
var admin = layui.admin; var admin = layui.admin;
var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可 var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可
var authtree = layui.authtree;
// 回显数据 // 回显数据
form.val('role', mUser); form.val('role', mUser);
admin.req('{:url("/role/get/permissions")}',{role_id:"{$role_id}"}, function (response) {
console.log(response.data)
authtree.render('#permissions', response.data.permissions,{
inputname: 'permissionids[]',
layfilter: 'lay-check-auth',
autowidth: true,
nameKey: 'permission_name',
valueKey: 'id',
childKey: 'children',
collapseLeafNode: true,
theme: 'auth-skin-default',
checkedKey: response.data.hasPermissions
});
})
// 表单提交事件 // 表单提交事件
form.on('submit(submitRole)', function (data) { form.on('submit(submitRole)', function (data) {
admin.req('role/'+ "{$role_id}", data.field, function (response) { admin.req('role/'+ "{$role_id}", data.field, function (response) {

View File

@ -117,7 +117,7 @@
title: addRole ? '新增子角色' : ((mRole ? '修改' : '添加') + '角色'), title: addRole ? '新增子角色' : ((mRole ? '修改' : '添加') + '角色'),
url: addRole ? '/role/create' + '?id='+mRole.id : (mRole ? '/role/'+mRole.id + '/edit': '/role/create'), url: addRole ? '/role/create' + '?id='+mRole.id : (mRole ? '/role/'+mRole.id + '/edit': '/role/create'),
data: addRole ? '' : mRole, // 传递数据到表单页面 data: addRole ? '' : mRole, // 传递数据到表单页面
area: '800px', area: '700px',
end: function () { end: function () {
if (admin.getLayerData(layIndex, 'formOk')) { // 判断表单操作成功标识 if (admin.getLayerData(layIndex, 'formOk')) { // 判断表单操作成功标识
if (addRole) { if (addRole) {