diff --git a/catchAdmin/permissions/PermissionsMiddleware.php b/catchAdmin/permissions/PermissionsMiddleware.php index b3d9bbc..af032cf 100644 --- a/catchAdmin/permissions/PermissionsMiddleware.php +++ b/catchAdmin/permissions/PermissionsMiddleware.php @@ -1 +1,14 @@ permissions = $permissions; + } + + /** + * + * @time 2019年12月11日 + * @throws \Exception + * @return string + */ + public function index() + { + return $this->fetch(); + } + + /** + * + * @time 2019年12月11日 + * @param Request $request + * @return \think\response\Json + */ + public function list(Request $request) + { + return CatchResponse::success(Tree::done($this->permissions->getList($request->param()))); + } + + /** + * + * @time 2019年12月11日 + * @throws \Exception + * @return string + */ + public function create() + { + $form = new CatchForm(); + + $form->formId('permission'); + $form->text('permission_name', '菜单名称', true)->verify('required')->placeholder('请输入菜单名称'); + $form->hidden('parent_id')->default(\request()->param('id') ?? 0); + $form->text('route', '路由')->placeholder('请输入路由'); + $form->radio('method', '请求方法', true)->default(Permission::GET)->options([ + ['value' => Permission::GET, 'title' => 'get'], + ['value' => Permission::POST, 'title' => 'post'], + ['value' => Permission::PUT, 'title' => 'put'], + ['value' => Permission::DELETE, 'title' => 'delete'], + ]); + $form->text('permission_mark', '权限标识', true)->verify('required')->placeholder('请输入权限标识controller:action'); + $form->radio('type', '类型', true)->default(Permission::BTN_TYPE)->options([ + ['value' => Permission::MENU_TYPE, 'title' => '菜单'], + ['value' => Permission::BTN_TYPE, 'title' => '按钮'], + ]); + $form->text('sort', '排序')->verify('numberX')->default(1)->placeholder('倒叙排序'); + $form->formBtn('submitPermission'); + + return $this->fetch(['form' => $form->render()]); + } + + /** + * + * @time 2019年12月11日 + * @param Request $request + * @return \think\response\Json + */ + public function save(Request $request) + { + return CatchResponse::success($this->permissions->storeBy($request->param())); + } + + public function read() + {} + + /** + * + * @time 2019年12月11日 + * @param $id + * @throws \Exception + * @return string + */ + public function edit($id) + { + $permission = $this->permissions->findBy($id); + + $form = new CatchForm(); + $form->formId('permission'); + $form->text('permission_name', '菜单名称', true) + ->default($permission->permission_name) + ->verify('required') + ->placeholder('请输入菜单名称'); + $form->hidden('parent_id')->default($permission->parent_id); + $form->text('route', '路由')->default($permission->route)->placeholder('请输入路由'); + $form->radio('method', '请求方法', true)->default($permission->method)->options([ + ['value' => Permission::GET, 'title' => 'get'], + ['value' => Permission::POST, 'title' => 'post'], + ['value' => Permission::PUT, 'title' => 'put'], + ['value' => Permission::DELETE, 'title' => 'delete'], + ]); + $form->text('permission_mark', '权限标识', true) + ->default($permission->permission_mark) + ->verify('required')->placeholder('请输入权限标识controller:action'); + $form->radio('type', '类型', true)->default($permission->type)->options([ + ['value' => Permission::MENU_TYPE, 'title' => '菜单'], + ['value' => Permission::BTN_TYPE, 'title' => '按钮'], + ]); + $form->text('sort', '排序')->verify('numberX')->default($permission->sort)->placeholder('倒叙排序'); + $form->formBtn('submitPermission'); + + return $this->fetch([ + 'form' => $form->render(), + 'permission_id' => $permission->id, + ]); + } + + /** + * + * @time 2019年12月11日 + * @param $id + * @param Request $request + * @return \think\response\Json + */ + public function update($id, Request $request) + { + return CatchResponse::success($this->permissions->updateBy($id, $request->param())); + } + + /** + * + * @time 2019年12月11日 + * @param $id + * @throws FailedException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @return \think\response\Json + */ + public function delete($id) + { + if ($this->permissions->where('parent_id', $id)->find()) { + throw new FailedException('存在子菜单,无法删除'); + } + + return CatchResponse::success($this->permissions->deleteBy($id)); + } +} + + diff --git a/catchAdmin/permissions/controller/Roles.php b/catchAdmin/permissions/controller/Roles.php index 02b4c0a..b6a0228 100644 --- a/catchAdmin/permissions/controller/Roles.php +++ b/catchAdmin/permissions/controller/Roles.php @@ -2,11 +2,13 @@ namespace catchAdmin\permissions\controller; use app\Request; -use catcher\base\BaseController; +use catcher\base\CatchController; use catcher\CatchForm; use catcher\CatchResponse; +use catcher\exceptions\FailedException; +use catcher\Tree; -class Roles extends BaseController +class Roles extends CatchController { protected $role; @@ -26,54 +28,109 @@ class Roles extends BaseController return $this->fetch(); } - public function roles() - { - - } - + /** + * + * @time 2019年12月11日 + * @throws \Exception + * @return string + */ public function create() { $form = new CatchForm(); - $form->formId('roles'); - $form->text('name', '角色名称'); - $form->formBtn('submitRoles'); + $form->formId('role'); + $form->text('role_name', '角色名称', true)->verify('required')->placeholder('请输入角色名称'); + $form->hidden('parent_id')->default(\request()->param('id') ?? 0); + $form->textarea('description', '角色描述')->placeholder('请输入角色描述'); + $form->dom('
', '权限'); + $form->formBtn('submitRole'); return $this->fetch([ 'form' => $form->render() ]); } - public function save() - {} + /** + * + * @time 2019年12月11日 + * @param Request $request + * @return \think\response\Json + */ + public function save(Request $request) + { + // 添加角色 + dd($request->param('roleids')); + return CatchResponse::success($this->role->storeBy($request->param())); + } public function read($id) { } + /** + * + * @time 2019年12月11日 + * @param $id + * @throws \Exception + * @return string + */ public function edit($id) { + $role = $this->role->findBy($id); + $form = new CatchForm(); - $form->formId('roles'); - $form->text('name', '角色名称'); - $form->formBtn('submitRoles'); + $form->formId('role'); + $form->hidden('parent_id')->default($role->parent_id); + $form->text('role_name', '角色名称', true)->default($role->name)->verify('required')->placeholder('请输入角色名称'); + $form->textarea('description', '角色描述')->default($role->description)->placeholder('请输入角色描述'); + $form->formBtn('submitRole'); return $this->fetch([ - 'form' => $form->render() + 'form' => $form->render(), + 'role_id' => $role->id, ]); } - public function update($id, UpdateRequest $request) + /** + * + * @time 2019年12月11日 + * @param $id + * @param Request $request + * @return \think\response\Json + */ + public function update($id, Request $request) { + return CatchResponse::success($this->role->updateBy($id, $request->param())); } + /** + * + * @time 2019年12月11日 + * @param $id + * @throws FailedException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @return \think\response\Json + */ public function delete($id) { + if ($this->role->where('parent_id', $id)->find()) { + throw new FailedException('存在子角色,无法删除'); + } + + // 删除权限 return CatchResponse::success($this->role->deleteBy($id)); } + /** + * + * @time 2019年12月11日 + * @param Request $request + * @return \think\response\Json + */ public function list(Request $request) { - return CatchResponse::paginate($this->role->getList($request->param())); + return CatchResponse::success(Tree::done($this->role->getList($request->param()))); } } \ No newline at end of file diff --git a/catchAdmin/permissions/database/migrations/20191208125722_roles.php b/catchAdmin/permissions/database/migrations/20191208125722_roles.php index 8640dad..a794623 100644 --- a/catchAdmin/permissions/database/migrations/20191208125722_roles.php +++ b/catchAdmin/permissions/database/migrations/20191208125722_roles.php @@ -29,7 +29,7 @@ class Roles extends Migrator public function change() { $table = $this->table('roles',['engine'=>'Innodb', 'comment' => '角色表', 'signed' => false]); - $table->addColumn('name', 'string',['limit' => 15,'default'=>'','comment'=>'角色名']) + $table->addColumn('role_name', 'string',['limit' => 15,'default'=>'','comment'=>'角色名']) ->addColumn('parent_id', 'integer',['default'=>0,'comment'=>'父级ID', 'signed' => false]) ->addColumn('description', 'string',['default'=> '','comment'=>'角色备注']) ->addColumn('created_at', 'integer', array('default'=>0,'comment'=>'创建时间', 'signed' => false )) diff --git a/catchAdmin/permissions/database/migrations/20191208125726_permissions.php b/catchAdmin/permissions/database/migrations/20191208125726_permissions.php index 5db13c9..e2ed573 100644 --- a/catchAdmin/permissions/database/migrations/20191208125726_permissions.php +++ b/catchAdmin/permissions/database/migrations/20191208125726_permissions.php @@ -29,9 +29,10 @@ class Permissions extends Migrator public function change() { $table = $this->table('permissions',['engine'=>'Innodb', 'comment' => '菜单表', 'signed' => false]); - $table->addColumn('name', 'string',['limit' => 15,'default'=>'','comment'=>'菜单名称']) + $table->addColumn('permission_name', 'string',['limit' => 15,'default'=>'','comment'=>'菜单名称']) ->addColumn('parent_id', 'integer',['default'=>0,'comment'=>'父级ID', 'signed' => false]) ->addColumn('route', 'string', ['default' => '', 'comment' => '路由', 'limit' => 50]) + ->addColumn('method', 'string', ['default' => 'get', 'comment' => '路由请求方法', 'limit' => 15]) ->addColumn('permission_mark', 'string', ['null' => false, 'comment' => '权限标识', 'limit' => 50]) ->addColumn('type', 'integer',['limit' => \Phinx\Db\Adapter\MysqlAdapter::INT_TINY,'default'=> 1,'comment'=>'1 菜单 2 按钮']) ->addColumn('sort', 'integer',['default'=> 0,'comment'=>'排序字段']) diff --git a/catchAdmin/permissions/model/HasRolesTrait.php b/catchAdmin/permissions/model/HasRolesTrait.php index 03ec27b..9667d09 100644 --- a/catchAdmin/permissions/model/HasRolesTrait.php +++ b/catchAdmin/permissions/model/HasRolesTrait.php @@ -10,41 +10,42 @@ trait HasRolesTrait */ public function roles() { - return $this->belongsToMany(Roles::class, 'user_has_roles', 'user_id', 'role_id'); + return $this->belongsToMany(Roles::class, 'user_has_roles', 'role_id', 'uid'); } /** * * @time 2019年12月08日 - * @param $uid * @return mixed */ - public function getRoles($uid) + public function getRoles() { - return $this->findBy($uid)->roles()->get(); + return $this->roles()->select(); } /** * * @time 2019年12月08日 - * @param $uid * @param array $roles * @return mixed */ - public function attach($uid, array $roles) + public function attach(array $roles) { - return $this->findBy($uid)->roles()->attach($roles); + return $this->roles()->attach($roles); } /** * * @time 2019年12月08日 - * @param $uid * @param array $roles * @return mixed */ - public function detach($uid, array $roles) + public function detach(array $roles = []) { - return $this->findBy($uid)->roles()->detach($roles); + if (empty($roles)) { + return $this->roles()->detach(); + } + + return $this->roles()->detach($roles); } } \ No newline at end of file diff --git a/catchAdmin/permissions/model/Permissions.php b/catchAdmin/permissions/model/Permissions.php index 8178244..464d463 100644 --- a/catchAdmin/permissions/model/Permissions.php +++ b/catchAdmin/permissions/model/Permissions.php @@ -1,17 +1,18 @@ when($search['name'] ?? false, function ($query) use ($search){ + $query->whereLike('name', $search['name']); + }) + ->when($search['id'] ?? false, function ($query) use ($search){ + $query->where('parent_id', $search['id']) + ->whereOr('id', $search['id']); + }) + ->order('sort', 'desc') + ->order('id', 'desc') + ->select() + ->toArray(); + } + public function roles(): \think\model\relation\BelongsToMany { return $this->belongsToMany(Roles::class, 'role_has_permissions'); diff --git a/catchAdmin/permissions/model/Roles.php b/catchAdmin/permissions/model/Roles.php index f17b2ea..10e04fe 100644 --- a/catchAdmin/permissions/model/Roles.php +++ b/catchAdmin/permissions/model/Roles.php @@ -2,15 +2,15 @@ namespace catchAdmin\permissions\model; use catchAdmin\user\model\Users; -use catcher\base\BaseModel; +use catcher\base\CatchModel; -class Roles extends BaseModel +class Roles extends CatchModel { protected $name = 'roles'; protected $field = [ 'id', // - 'name', // 角色名 + 'role_name', // 角色名 'parent_id', // 父级ID 'description', // 角色备注 'created_at', // 创建时间 @@ -19,11 +19,18 @@ class Roles extends BaseModel ]; - public function getList($search) + public function getList($search = []) { return $this->when($search['name'] ?? false, function ($query) use ($search){ - $query->whereLike('name', $search['name']); - })->paginate($search['limit'] ?? $this->limit); + $query->whereLike('name', $search['name']); + }) + ->when($search['id'] ?? false, function ($query) use ($search){ + $query->where('parent_id', $search['id']) + ->whereOr('id', $search['id']); + }) + ->order('id', 'desc') + ->select() + ->toArray(); } /** @@ -43,7 +50,7 @@ class Roles extends BaseModel */ public function permissions(): \think\model\relation\BelongsToMany { - return $this->belongsToMany(Permissions::class, 'role_has_permissions', 'role_id', 'permission_id'); + return $this->belongsToMany(Permissions::class, 'role_has_permissions', 'permission_id', 'role_id'); } /** @@ -54,30 +61,37 @@ class Roles extends BaseModel */ public function getRoles($rid) { - return $this->findBy($rid)->permissions()->get(); + return $this->permissions()->select(); } /** * * @time 2019年12月08日 - * @param $rid * @param array $roles * @return mixed + * @throws \think\db\exception\DbException */ - public function attach($rid, array $roles) + public function attach(array $roles) { - return $this->findBy($rid)->permissions()->attach($roles); + if (empty($roles)) { + return true; + } + + return $this->permissions()->attach($roles); } /** * * @time 2019年12月08日 - * @param $rid * @param array $roles * @return mixed */ - public function detach($rid, array $roles) + public function detach(array $roles = []) { - return $this->findBy($rid)->permissions()->detach($roles); + if (empty($roles)) { + return $this->permissions()->detach(); + } + + return $this->permissions()->detach($roles); } } \ No newline at end of file diff --git a/catchAdmin/permissions/route.php b/catchAdmin/permissions/route.php index 1aab024..f92c20a 100644 --- a/catchAdmin/permissions/route.php +++ b/catchAdmin/permissions/route.php @@ -1,4 +1,10 @@ resource('role', '\catchAdmin\permissions\controller\Roles'); -// 用户列表 +// 角色列表 $router->get('roles', '\catchAdmin\permissions\controller\Roles/list'); + +// 权限 +$router->resource('permission', '\catchAdmin\permissions\controller\Permissions'); +// 权限列表 +$router->get('permissions', '\catchAdmin\permissions\controller\Permissions/list'); \ No newline at end of file diff --git a/catchAdmin/permissions/view/permissions/create.html b/catchAdmin/permissions/view/permissions/create.html index 2709599..7b94774 100644 --- a/catchAdmin/permissions/view/permissions/create.html +++ b/catchAdmin/permissions/view/permissions/create.html @@ -5,17 +5,18 @@ var layer = layui.layer; var form = layui.form; var admin = layui.admin; - var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + var mUser = admin.getLayerData('#permission'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + form.render(); // 回显数据 form.val('role', mUser); // 表单提交事件 - form.on('submit(submitRole)', function (data) { - admin.req('{:url("role")}', data.field, function (response) { + form.on('submit(submitPermission)', function (data) { + admin.req('{:url("permission")}', data.field, function (response) { layer.closeAll('loading'); if (response.code === 10000) { layer.msg(response.msg, {icon: 1}); - admin.putLayerData('formOk', true, '#role'); // 设置操作成功的标识,#modelUserForm这个只要写弹窗内任意一个元素的id即可 - admin.closeDialog('#role'); // 关闭页面层弹窗 + admin.putLayerData('formOk', true, '#permission'); // 设置操作成功的标识,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + admin.closeDialog('#permission'); // 关闭页面层弹窗 } else { layer.msg(response.msg, {icon: 2}); } diff --git a/catchAdmin/permissions/view/permissions/edit.html b/catchAdmin/permissions/view/permissions/edit.html index d8669bc..6148f3f 100644 --- a/catchAdmin/permissions/view/permissions/edit.html +++ b/catchAdmin/permissions/view/permissions/edit.html @@ -5,16 +5,17 @@ var layer = layui.layer; var form = layui.form; var admin = layui.admin; - var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + var mUser = admin.getLayerData('#permission'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + form.render(); // 回显数据 - form.val('role', mUser); + form.val('permission', mUser); // 表单提交事件 - form.on('submit(submitRole)', function (data) { - admin.req('role/'+ "{$role_id}", data.field, function (response) { + form.on('submit(submitPermission)', function (data) { + admin.req('permission/'+ "{$permission_id}", data.field, function (response) { if (response.code === 10000) { layer.msg(response.msg, {icon: 1}); - admin.putLayerData('formOk', true, '#role'); // 设置操作成功的标识,#modelUserForm这个只要写弹窗内任意一个元素的id即可 - admin.closeDialog('#role'); // 关闭页面层弹窗 + admin.putLayerData('formOk', true, '#permission'); // 设置操作成功的标识,#modelUserForm这个只要写弹窗内任意一个元素的id即可 + admin.closeDialog('#permission'); // 关闭页面层弹窗 } else { layer.msg(response.msg, {icon: 2}); } diff --git a/catchAdmin/permissions/view/permissions/index.html b/catchAdmin/permissions/view/permissions/index.html index 938e029..77ec12b 100644 --- a/catchAdmin/permissions/view/permissions/index.html +++ b/catchAdmin/permissions/view/permissions/index.html @@ -17,11 +17,11 @@ {/block} {block name="table"} -