This commit is contained in:
wuyanwen
2019-12-09 16:22:00 +08:00
parent e6b443043a
commit dfa045726b
16 changed files with 383 additions and 122 deletions

View File

@@ -84,7 +84,7 @@
<a><i class="layui-icon layui-icon-set"></i>&emsp;<cite>权限管理</cite></a>
<dl class="layui-nav-child">
<dd><a lay-href="{:url('user')}">用户管理</a></dd>
<dd><a lay-href="page/system/role.html">角色管理</a></dd>
<dd><a lay-href="{:url('role')}">角色管理</a></dd>
<dd><a lay-href="page/system/authorities.html">菜单管理</a></dd>
<dd><a lay-href="page/system/loginRecord.html">登录日志</a></dd>
</dl>

View File

@@ -1 +1,79 @@
<?php
namespace catchAdmin\permissions\controller;
use app\Request;
use catcher\base\BaseController;
use catcher\CatchForm;
use catcher\CatchResponse;
class Roles extends BaseController
{
protected $role;
public function __construct(\catchAdmin\permissions\model\Roles $role)
{
$this->role = $role;
}
/**
*
* @time 2019年12月09日
* @throws \Exception
* @return string
*/
public function index()
{
return $this->fetch();
}
public function roles()
{
}
public function create()
{
$form = new CatchForm();
$form->formId('roles');
$form->text('name', '角色名称');
$form->formBtn('submitRoles');
return $this->fetch([
'form' => $form->render()
]);
}
public function save()
{}
public function read($id)
{
}
public function edit($id)
{
$form = new CatchForm();
$form->formId('roles');
$form->text('name', '角色名称');
$form->formBtn('submitRoles');
return $this->fetch([
'form' => $form->render()
]);
}
public function update($id, UpdateRequest $request)
{
}
public function delete($id)
{
return CatchResponse::success($this->role->deleteBy($id));
}
public function list(Request $request)
{
return CatchResponse::paginate($this->role->getList($request->param()));
}
}

View File

@@ -28,7 +28,7 @@ class Permissions extends Migrator
*/
public function change()
{
$table = $this->table('roles',['engine'=>'Innodb', 'comment' => '菜单表', 'signed' => false]);
$table = $this->table('permissions',['engine'=>'Innodb', 'comment' => '菜单表', 'signed' => false]);
$table->addColumn('name', 'string',['limit' => 15,'default'=>'','comment'=>'菜单名称'])
->addColumn('parent_id', 'integer',['default'=>0,'comment'=>'父级ID', 'signed' => false])
->addColumn('route', 'string', ['default' => '', 'comment' => '路由', 'limit' => 50])

View File

@@ -1,7 +1,7 @@
<?php
namespace catchAdmin\permissions\model;
trait UserTrait
trait HasRolesTrait
{
/**
*

View File

@@ -0,0 +1,28 @@
<?php
namespace catchAdmin\permissions\model;
use catcher\base\BaseModel;
class Permissions extends BaseModel
{
protected $name = 'permissions';
protected $field = [
'id', //
'name', // 菜单名称
'parent_id', // 父级ID
'route', // 路由
'permission_mark', // 权限标识
'type', // 1 菜单 2 按钮
'sort', // 排序字段
'created_at', // 创建时间
'updated_at', // 更新时间
'deleted_at', // 删除状态null 未删除 timestamp 已删除
];
public function roles(): \think\model\relation\BelongsToMany
{
return $this->belongsToMany(Roles::class, 'role_has_permissions');
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace catchAdmin\permissions\model;
use catchAdmin\user\model\Users;
use catcher\base\BaseModel;
class Roles extends BaseModel
{
protected $name = 'roles';
protected $field = [
'id', //
'name', // 角色名
'parent_id', // 父级ID
'description', // 角色备注
'created_at', // 创建时间
'updated_at', // 更新时间
'deleted_at', // 删除状态0未删除 >0 已删除
];
public function getList($search)
{
return $this->when($search['name'] ?? false, function ($query) use ($search){
$query->whereLike('name', $search['name']);
})->paginate($search['limit'] ?? $this->limit);
}
/**
*
* @time 2019年12月08日
* @return \think\model\relation\BelongsToMany
*/
public function users(): \think\model\relation\BelongsToMany
{
return $this->belongsToMany(Users::class, 'user_has_roles');
}
/**
*
* @time 2019年12月09日
* @return \think\model\relation\BelongsToMany
*/
public function permissions(): \think\model\relation\BelongsToMany
{
return $this->belongsToMany(Permissions::class, 'role_has_permissions', 'role_id', 'permission_id');
}
/**
*
* @time 2019年12月08日
* @param $rid
* @return mixed
*/
public function getRoles($rid)
{
return $this->findBy($rid)->permissions()->get();
}
/**
*
* @time 2019年12月08日
* @param $rid
* @param array $roles
* @return mixed
*/
public function attach($rid, array $roles)
{
return $this->findBy($rid)->permissions()->attach($roles);
}
/**
*
* @time 2019年12月08日
* @param $rid
* @param array $roles
* @return mixed
*/
public function detach($rid, array $roles)
{
return $this->findBy($rid)->permissions()->detach($roles);
}
}

View File

@@ -1 +1,4 @@
<?php
$router->resource('role', '\catchAdmin\permissions\controller\Roles');
// 用户列表
$router->get('roles', '\catchAdmin\permissions\controller\Roles/list');

View File

@@ -1,10 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
{$form|raw}

View File

@@ -1,10 +1,159 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{extend name="../../../view/layout"}
{block name="title"}角色管理{/block}
{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-input-inline mr0">
<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 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>
{/block}
{block name="table"}
<table class="layui-table" id="tableRole" lay-filter="tableAuth"></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-danger layui-btn-xs" lay-event="del">删除</a>
</script>
{/block}
{block name="script"}
<script>
layui.use(['layer', 'form', 'table', 'admin', 'treetable'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var admin = layui.admin;
var treetable = layui.treetable;
</body>
</html>
// 渲染表格
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();
// 添加按钮点击事件
$('#btnAddAuth').click(function () {
showEditModel();
});
// 工具条点击事件
table.on('tool(tableAuth)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') { // 修改
showEditModel(data);
} else if (layEvent === 'del') { // 删除
doDel(data.authorityId, data.authorityName);
}
});
// 删除
function doDel(authorityId, authorityName) {
layer.confirm('确定要删除“' + authorityName + '”吗?', {
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();
} else {
layer.msg(res.msg, {icon: 2});
}
}, 'json');
});
}
// 显示表单弹窗
// 显示表单弹窗
function showEditModel(mRole) {
var layIndex = admin.open({
title: (mRole ? '修改' : '添加') + '用户',
url: mRole ? '/role/'+mRole.id + '/edit':'/role/create',
data: mRole, // 传递数据到表单页面
end: function () {
if (admin.getLayerData(layIndex, 'formOk')) { // 判断表单操作成功标识
insTb.reload(); // 成功刷新表格
}
},
success: function (layero, dIndex) {
// 弹窗超出范围不出现滚动条
$(layero).children('.layui-layer-content').css('overflow', 'visible');
}
});
}
// 搜索按钮点击事件
$('#btnSearchAuth').click(function () {
$('#edtSearchAuth').removeClass('layui-form-danger');
var keyword = $('#edtSearchAuth').val();
var $tds = $('#tableAuth').next('.treeTable').find('.layui-table-body tbody tr td');
$tds.css('background-color', 'transparent');
if (!keyword) {
layer.tips('请输入关键字', '#edtSearchAuth', {tips: [1, '#ff4c4c']});
$('#edtSearchAuth').addClass('layui-form-danger');
$('#edtSearchAuth').focus();
return;
}
var searchCount = 0;
$tds.each(function () {
if ($(this).text().indexOf(keyword) >= 0) {
$(this).css('background-color', '#FAE6A0');
if (searchCount == 0) {
$('body,html').stop(true);
$('body,html').animate({scrollTop: $(this).offset().top - 150}, 500);
}
searchCount++;
}
});
if (searchCount == 0) {
layer.msg("没有匹配结果", {icon: 5, anim: 6});
} else {
treetable.expandAll('#tableAuth');
}
});
$('#btnExpandAuth').click(function () {
treetable.expandAll('#tableAuth');
});
$('#btnFoldAuth').click(function () {
treetable.foldAll('#tableAuth');
});
});
</script>
{/block}

View File

@@ -1,10 +1,13 @@
<?php
namespace catchAdmin\user\model;
use catchAdmin\permissions\model\HasRolesTrait;
use catcher\base\BaseModel;
class Users extends BaseModel
{
use HasRolesTrait;
protected $name = 'users';
protected $field = [
@@ -33,7 +36,15 @@ class Users extends BaseModel
return password_hash($value, PASSWORD_DEFAULT);
}
public function getList($search)
/**
* 用户列表
*
* @time 2019年12月08日
* @param $search
* @throws \think\db\exception\DbException
* @return \think\Paginator
*/
public function getList($search): \think\Paginator
{
return (($search['trash'] ?? false) ? static::onlyTrashed() : $this)->when($search['username'] ?? false, function ($query) use ($search){
return $query->whereLike('username', $search['username']);