权限管理

This commit is contained in:
wuyanwen 2019-12-11 21:00:14 +08:00
parent 22064c6178
commit 6624a0cc6b
15 changed files with 525 additions and 150 deletions

View File

@ -1 +1,14 @@
<?php
namespace catchAdmin\permissions;
use think\Middleware;
class PermissionsMiddleware
{
public function handle($request, \Closure $next)
{
// toad
return $next($request);
}
}

View File

@ -1 +1,162 @@
<?php
namespace catchAdmin\permissions\controller;
use app\Request;
use catcher\base\CatchController;
use catcher\CatchForm;
use catcher\CatchResponse;
use catcher\exceptions\FailedException;
use catcher\Tree;
use catchAdmin\permissions\model\Permissions as Permission;
class Permissions extends CatchController
{
protected $permissions;
public function __construct(Permission $permissions)
{
$this->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));
}
}

View File

@ -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('<div id="permissions"></div>', '权限');
$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())));
}
}

View File

@ -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 ))

View File

@ -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'=>'排序字段'])

View File

@ -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);
}
}

View File

@ -1,17 +1,18 @@
<?php
namespace catchAdmin\permissions\model;
use catcher\base\BaseModel;
use catcher\base\CatchModel;
class Permissions extends BaseModel
class Permissions extends CatchModel
{
protected $name = 'permissions';
protected $field = [
'id', //
'name', // 菜单名称
'permission_name', // 菜单名称
'parent_id', // 父级ID
'route', // 路由
'method', // 请求方法
'permission_mark', // 权限标识
'type', // 1 菜单 2 按钮
'sort', // 排序字段
@ -21,6 +22,29 @@ class Permissions extends BaseModel
];
public const MENU_TYPE = 1;
public const BTN_TYPE = 2;
public const GET = 'get';
public const POST = 'post';
public const PUT = 'put';
public const DELETE = 'delete';
public function getList($search)
{
return $this->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');

View File

@ -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);
}
}

View File

@ -1,4 +1,10 @@
<?php
// 角色
$router->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');

View File

@ -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});
}

View File

@ -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});
}

View File

@ -17,11 +17,11 @@
</div>
{/block}
{block name="table"}
<table class="layui-table" id="tableRole"></table>
<table class="layui-table" id="tablePermission" lay-filter="tablePermission"></table>
<!-- 表格操作列 -->
<script type="text/html" id="tableBarAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="add">新增子角色</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="add">新增子菜单</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
{/block}
@ -53,22 +53,33 @@
}
}
},
elem: '#tableRole',
elem: '#tablePermission',
cellMinWidth: 100,
cols: [
{type: 'numbers', title: '#'},
{field: 'role_name', title: '角色名称', minWidth: 100},
{field: 'description', title: '角色描述'},
{field: 'permission_name', title: '菜单名称', minWidth: 200},
{field: 'route', title: '菜单路由', templet: function (d) {
return escapeChars(d.route);
}
},
{field: 'method', title: '请求方法', width: 90},
{field: 'permission_mark', title: '权限标识'},
{field: 'type', title: '菜单类型', templet: function (d) {
return d.type == 1 ? '<button class="layui-btn layui-btn-primary layui-btn-xs">菜单</button>' :
'<button class="layui-btn layui-btn-primary layui-btn-xs">按钮</button>'
}, width: 90, align: 'center'
},
{field: 'sort', title: '排序', width:60, align: 'center'},
{
field: 'created_at', sort: true, templet: function (d) {
return util.toDateString(d.created_at);
}, title: '创建时间', maxWidth: 100
},
{templet: '#tableBarAuth', title: '操作', align: 'center', minWidth: 120}
{templet: '#tableBarAuth', title: '操作', align: 'center', minWidth: 150}
],
reqData: function(data, callback) {
// 在这里写ajax请求通过callback方法回调数据
$.get('{:url("roles")}', function (res) {
$.get('{:url("permissions")}', function (res) {
callback(res.data); // 参数是数组类型
});
}
@ -78,9 +89,17 @@
$('#btnAddAuth').click(function () {
showEditModel();
});
function escapeChars(str) {
str = str.replace(/&/g, '&amp;');
str = str.replace(/</g, '&lt;');
str = str.replace(/>/g, '&gt;');
str = str.replace(/'/g, '&acute;');
str = str.replace(/"/g, '&quot;');
str = str.replace(/\|/g, '&brvbar;');
return str;
}
// 工具条点击事件
treeTable.on('tool(tableRole)', function (obj) {
treeTable.on('tool(tablePermission)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') { // 修改
@ -91,15 +110,19 @@
showEditModel(data, true);
}
});
treeTable.on('row(tablePermission)', function(obj){
console.log(obj.value); //得到修改后的值
console.log(obj.field); //当前编辑的字段名
console.log(obj.data); //所在行的所有相关数据
});
// 删除
function doDel(obj) {
layer.confirm('确定要删除“' + obj.data.role_name + '”吗?', {
layer.confirm('确定要删除“' + obj.data.permission_name + '”吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (index) {
layer.close(index);
admin.req('/role/'+ obj.data.id, {}, function (response) {
admin.req('/permission/'+ obj.data.id, {}, function (response) {
if (response.code === 10000) {
layer.msg(response.msg, {icon: 1});
obj.del()
@ -112,24 +135,23 @@
// 显示表单弹窗
// 显示表单弹窗
function showEditModel(mRole, addRole = false) {
function showEditModel(permission, addPermission= false) {
var layIndex = admin.open({
title: addRole ? '新增子角色' : ((mRole ? '修改' : '添加') + '角色'),
url: addRole ? '/role/create' + '?id='+mRole.id : (mRole ? '/role/'+mRole.id + '/edit': '/role/create'),
data: addRole ? '' : mRole, // 传递数据到表单页面
title: addPermission ? '新增子菜单' : ((permission ? '修改' : '添加') + '菜单'),
url: addPermission ? '/permission/create' + '?id='+permission.id : (permission ? '/permission/'+permission.id + '/edit': '/permission/create'),
data: addPermission ? '' : permission, // 传递数据到表单页面
end: function () {
if (admin.getLayerData(layIndex, 'formOk')) { // 判断表单操作成功标识
if (addRole) {
if (addPermission) {
treeTb.reload();
setTimeout(function () {
treeTb.expand(mRole.id)
treeTb.expand(permission.id)
}, 200)
} else {
if (mRole) {
if (permission) {
treeTb.reload();
setTimeout(function () {
treeTb.expand(mRole.id)
treeTb.expand(permission.id)
}, 200)
} else {
treeTb.reload(); // 成功刷新表格

View File

@ -1 +1,40 @@
{$form|raw}
<script>
layui.use(['layer', 'form', 'admin', 'formX', 'authtree'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var admin = layui.admin;
var authtree = layui.authtree;
var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可
// 回显数据
form.val('role', mUser);
// 表单提交事件
form.on('submit(submitRole)', function (data) {
admin.req('{:url("role")}', 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'); // 关闭页面层弹窗
} else {
layer.msg(response.msg, {icon: 2});
}
}, 'post');
return false;
});
admin.req('{:url("permissions")}',{}, function (response) {
var inst1 = authtree.render('#permissions', response.data,{
inputname: 'authids[]',
layfilter: 'lay-check-auth',
autowidth: true,
nameKey: 'permission_name',
valueKey: 'id',
childKey: 'children',
collapseLeafNode: true,
theme: 'auth-skin-default',
});
})
});
</script>

View File

@ -1,10 +1,25 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
{$form|raw}
<script>
layui.use(['layer', 'form', 'admin', 'formX'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var admin = layui.admin;
var mUser = admin.getLayerData('#role'); // 列表页面传递的数据,#modelUserForm这个只要写弹窗内任意一个元素的id即可
// 回显数据
form.val('role', mUser);
// 表单提交事件
form.on('submit(submitRole)', function (data) {
admin.req('role/'+ "{$role_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'); // 关闭页面层弹窗
} else {
layer.msg(response.msg, {icon: 2});
}
}, 'put');
return false;
});
});
</script>

View File

@ -3,61 +3,76 @@
{block name="search"}
<div class="layui-form toolbar">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label w-auto">搜索:</label>
<!--<div class="layui-inline">
<div class="layui-input-inline mr0">
<input id="edtSearchAuth" class="layui-input" type="text" placeholder="输入关键字"/>
<input id="edtSearchAuth" class="layui-input" type="text" placeholder="输入角色名称"/>
</div>
</div>
<div class="layui-inline">
<button id="btnSearchAuth" class="layui-btn icon-btn"><i class="layui-icon">&#xe615;</i>搜索
</button>
</button>-->
<button id="btnAddAuth" class="layui-btn icon-btn"><i class="layui-icon">&#xe654;</i>添加</button>
<button id="btnExpandAuth" class="layui-btn icon-btn">全部展开</button>
</div>
<div class="layui-inline">
<button id="btnFoldAuth" class="layui-btn icon-btn">全部折叠</button>
</div>
<!--</div>-->
</div>
</div>
{/block}
{block name="table"}
<table class="layui-table" id="tableRole" lay-filter="tableAuth"></table>
<table class="layui-table" id="tableRole"></table>
<!-- 表格操作列 -->
<script type="text/html" id="tableBarAuth">
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>
<a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="add">新增子角色</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
{/block}
{block name="script"}
<script>
layui.use(['layer', 'form', 'table', 'admin', 'treetable'], function () {
layui.use(['layer', 'form', 'table', 'admin', 'util', 'treeTable'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var util = layui.util;
var admin = layui.admin;
var treetable = layui.treetable;
var treeTable = layui.treeTable;
// 渲染表格
function renderTable() {
treetable.render({
treeColIndex: 1,
treeSpid: -1,
treeIdName: 'authorityId',
treePidName: 'parentId',
elem: '#tableRole',
url: '{:url("roles")}',
cellMinWidth: 100,
cols: [[
{type: 'id', title: '#', field: 'id'},
{field: 'name', title: '角色名称', minWidth: 200},
{templet: '#tableBarAuth', title: '操作', align: 'center', minWidth: 120}
]]
});
}
renderTable();
var treeTb = treeTable.render({
tree: {
arrowType: 'arrow2',
iconIndex: 1, // 折叠图标显示在第几列
idName: 'id', // 自定义id字段的名称
childName: 'children', // 自定义标识是否还有子节点的字段名称
pidName: 'parent_id',
isPidData: true,
getIcon: function(d) { // 自定义图标
// d是当前行的数据
if (d.children.length) { // 判断是否有子集
return '<i class="ew-tree-icon ew-tree-icon-folder"></i>';
} else {
return '<i class="ew-tree-icon ew-tree-icon-file"></i>';
}
}
},
elem: '#tableRole',
cellMinWidth: 100,
cols: [
{type: 'numbers', title: '#'},
{field: 'role_name', title: '角色名称', minWidth: 100},
{field: 'description', title: '角色描述'},
{
field: 'created_at', sort: true, templet: function (d) {
return util.toDateString(d.created_at);
}, title: '创建时间', maxWidth: 100
},
{templet: '#tableBarAuth', title: '操作', align: 'center', minWidth: 120}
],
reqData: function(data, callback) {
// 在这里写ajax请求通过callback方法回调数据
$.get('{:url("roles")}', function (res) {
callback(res.data); // 参数是数组类型
});
}
});
// 添加按钮点击事件
$('#btnAddAuth').click(function () {
@ -65,48 +80,62 @@
});
// 工具条点击事件
table.on('tool(tableAuth)', function (obj) {
treeTable.on('tool(tableRole)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') { // 修改
showEditModel(data);
} else if (layEvent === 'del') { // 删除
doDel(data.authorityId, data.authorityName);
doDel(obj);
} else {
showEditModel(data, true);
}
});
// 删除
function doDel(authorityId, authorityName) {
layer.confirm('确定要删除“' + authorityName + '”吗?', {
function doDel(obj) {
layer.confirm('确定要删除“' + obj.data.role_name + '”吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (index) {
layer.close(index);
layer.load(2);
$.get('../../json/ok.json', {
authorityId: authorityId
}, function (res) {
layer.closeAll('loading');
if (res.code == 200) {
layer.msg(res.msg, {icon: 1});
renderTable();
admin.req('/role/'+ obj.data.id, {}, function (response) {
if (response.code === 10000) {
layer.msg(response.msg, {icon: 1});
obj.del()
} else {
layer.msg(res.msg, {icon: 2});
layer.msg(response.msg, {icon: 2});
}
}, 'json');
}, 'delete');
});
}
// 显示表单弹窗
// 显示表单弹窗
function showEditModel(mRole) {
function showEditModel(mRole, addRole = false) {
var layIndex = admin.open({
title: (mRole ? '修改' : '添加') + '用户',
url: mRole ? '/role/'+mRole.id + '/edit':'/role/create',
data: mRole, // 传递数据到表单页面
title: addRole ? '新增子角色' : ((mRole ? '修改' : '添加') + '角色'),
url: addRole ? '/role/create' + '?id='+mRole.id : (mRole ? '/role/'+mRole.id + '/edit': '/role/create'),
data: addRole ? '' : mRole, // 传递数据到表单页面
area: '800px',
end: function () {
if (admin.getLayerData(layIndex, 'formOk')) { // 判断表单操作成功标识
insTb.reload(); // 成功刷新表格
if (addRole) {
treeTb.reload();
setTimeout(function () {
treeTb.expand(mRole.id)
}, 200)
} else {
if (mRole) {
treeTb.reload();
setTimeout(function () {
treeTb.expand(mRole.id)
}, 200)
} else {
treeTb.reload(); // 成功刷新表格
}
}
}
},
success: function (layero, dIndex) {
@ -145,15 +174,6 @@
treetable.expandAll('#tableAuth');
}
});
$('#btnExpandAuth').click(function () {
treetable.expandAll('#tableAuth');
});
$('#btnFoldAuth').click(function () {
treetable.foldAll('#tableAuth');
});
});
</script>
{/block}