调整权限选择
parent
e07f55c655
commit
bc66a76cc8
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,103 @@
|
|||
<div class="{{$viewClass['form-group']}}">
|
||||
|
||||
<label class="{{$viewClass['label']}} control-label">{!! $label !!}</label>
|
||||
|
||||
<div class="{{$viewClass['field']}}">
|
||||
|
||||
@include('admin::form.error')
|
||||
|
||||
<div class="{{ $class }}" style="padding-left: 40px;" >
|
||||
<el-tree
|
||||
show-checkbox
|
||||
node-key="id"
|
||||
ref="tree"
|
||||
highlight-current
|
||||
:data="permissionNodes"
|
||||
:indent="25"
|
||||
:render-after-expand="false"
|
||||
:default-expand-all="true"
|
||||
:default-checked-keys="defaultKeys"
|
||||
:props="defaultProps" v-on:check-change="nodeChange">
|
||||
<span class="custom-tree-node" slot-scope="{ node, permissionNodes }" >
|
||||
<span v-on:click="getCheckedNode(node)">@{{ node.label }}</span>
|
||||
<template v-if="node.level==1">
|
||||
<span class="tran el-icon-arrow-right" :class="{isactive:node.expanded}"></span>
|
||||
</template>
|
||||
</span>
|
||||
</el-tree>
|
||||
|
||||
<input type="hidden" ref="format_attr_value" name="format_attr_value" value="{{ $value }}">
|
||||
<input type="hidden" name="{{ $name }}" :value="getCheck">
|
||||
</div>
|
||||
@include('admin::form.help-block')
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script init="{!! $selector !!}">
|
||||
|
||||
var app = new Vue({
|
||||
el: '#' + id,
|
||||
data: {
|
||||
defaultProps: {
|
||||
children: 'children',
|
||||
label: 'label'
|
||||
},
|
||||
checkPermissions:[],
|
||||
defaultKeys:[],
|
||||
permissionNodes:[]
|
||||
},
|
||||
computed: {
|
||||
getCheck() {
|
||||
// console.log(this.checkPermissions);
|
||||
return JSON.stringify(this.checkPermissions);
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.createStart()
|
||||
},
|
||||
methods:{
|
||||
createStart(){
|
||||
//初始化权限可选项;
|
||||
var url_path = "{{ admin_route('api.get_permissions') }}";
|
||||
var that = this;
|
||||
$.ajax({
|
||||
type: 'get',
|
||||
dataType: 'json',
|
||||
url: url_path,
|
||||
success: function (result) {
|
||||
that.permissionNodes = result;
|
||||
}
|
||||
})
|
||||
|
||||
setTimeout(()=>{
|
||||
var formatAttrValue = this.$refs.format_attr_value.defaultValue
|
||||
//编辑时默认选中项
|
||||
if(formatAttrValue){
|
||||
formatAttrValue = JSON.parse(formatAttrValue)
|
||||
// console.log(formatAttrValue)
|
||||
//赋予defaultKeys值
|
||||
this.defaultKeys = formatAttrValue
|
||||
this.checkPermissions = formatAttrValue;
|
||||
}
|
||||
}, 100)
|
||||
},
|
||||
getCheckedNode(node){
|
||||
if(this.checkPermissions.indexOf(node.key) != -1){//如果该节点已存在,则取消选中
|
||||
this.$refs.tree.setChecked(node, false);
|
||||
}else{
|
||||
this.$refs.tree.setChecked(node, true);
|
||||
}
|
||||
},
|
||||
nodeChange(node, hasChecked, childrenNodes){
|
||||
if(node.children.length == 0){
|
||||
if(hasChecked){
|
||||
this.checkPermissions.push(node.id);
|
||||
}else{
|
||||
this.checkPermissions.splice(this.checkPermissions.indexOf(node.id), 1);
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
|
@ -588,6 +588,8 @@ class Admin
|
|||
if (config('admin.permission.enable')) {
|
||||
$router->resource('auth/roles', 'RoleController');
|
||||
$router->resource('auth/permissions', 'PermissionController');
|
||||
|
||||
$router->get('api/get-permissions', 'PermissionController@apiGetPermissions')->name('api.get_permissions');
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
34
src/Form.php
34
src/Form.php
|
|
@ -3,31 +3,31 @@
|
|||
namespace Dcat\Admin;
|
||||
|
||||
use Closure;
|
||||
use Dcat\Admin\Actions\Action;
|
||||
use Dcat\Admin\Contracts\Repository;
|
||||
use Dcat\Admin\Form\AbstractTool;
|
||||
use Dcat\Admin\Form\Builder;
|
||||
use Dcat\Admin\Form\Concerns;
|
||||
use Dcat\Admin\Form\Condition;
|
||||
use Dcat\Admin\Form\Field;
|
||||
use Illuminate\Support\Arr;
|
||||
use Dcat\Admin\Form\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
use Dcat\Admin\Form\Concerns;
|
||||
use Dcat\Admin\Actions\Action;
|
||||
use Dcat\Admin\Form\Condition;
|
||||
use Dcat\Admin\Support\Helper;
|
||||
use Illuminate\Support\Fluent;
|
||||
use Dcat\Admin\Form\NestedForm;
|
||||
use Dcat\Admin\Form\AbstractTool;
|
||||
use Dcat\Admin\Form\ResolveField;
|
||||
use Dcat\Admin\Http\JsonResponse;
|
||||
use Dcat\Admin\Support\Helper;
|
||||
use Dcat\Admin\Traits\HasBuilderEvents;
|
||||
use Dcat\Admin\Traits\HasFormResponse;
|
||||
use Dcat\Admin\Widgets\DialogForm;
|
||||
use Illuminate\Contracts\Support\MessageProvider;
|
||||
use Illuminate\Contracts\Support\Renderable;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Fluent;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use Dcat\Admin\Contracts\Repository;
|
||||
use Illuminate\Validation\Validator;
|
||||
use Dcat\Admin\Traits\HasFormResponse;
|
||||
use Dcat\Admin\Traits\HasBuilderEvents;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Traits\Macroable;
|
||||
use Illuminate\Contracts\Support\Renderable;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Illuminate\Contracts\Support\MessageProvider;
|
||||
|
||||
/**
|
||||
* Class Form.
|
||||
|
|
@ -88,6 +88,7 @@ use Symfony\Component\HttpFoundation\Response;
|
|||
* @method Field\MultipleSelectTable multipleSelectTable($column, $label = '')
|
||||
* @method Field\Button button(string $html = null)
|
||||
* @method Field\Autocomplete autocomplete($column, $label = '')
|
||||
* @method Field\PermissionSelect permissionSelect($column, $label = '')
|
||||
*/
|
||||
class Form implements Renderable
|
||||
{
|
||||
|
|
@ -172,6 +173,7 @@ class Form implements Renderable
|
|||
'selectTable' => Field\SelectTable::class,
|
||||
'multipleSelectTable' => Field\MultipleSelectTable::class,
|
||||
'autocomplete' => Field\Autocomplete::class,
|
||||
'permissionSelect' => Field\PermissionSelect::class,
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
namespace Dcat\Admin\Form\Field;
|
||||
|
||||
use Dcat\Admin\Admin;
|
||||
use Dcat\Admin\Form\Field;
|
||||
|
||||
class PermissionSelect extends Field
|
||||
{
|
||||
protected $view = 'admin::form.permission-select';
|
||||
|
||||
protected $listen = '';
|
||||
|
||||
protected static $css = [
|
||||
'@element',
|
||||
];
|
||||
|
||||
protected static $js = [
|
||||
'@vue',
|
||||
'@element',
|
||||
];
|
||||
|
||||
public function render()
|
||||
{
|
||||
Admin::style(
|
||||
<<<CSS
|
||||
.el-tree>.el-tree-node {
|
||||
border-top: 1px solid #EBEEF5 !important;
|
||||
padding: 10px 0;
|
||||
}
|
||||
.el-tree-node__children .el-tree-node{
|
||||
display: flex !important;
|
||||
}
|
||||
.el-tree-node__children .el-tree-node .el-tree-node__children{
|
||||
display: flex !important;
|
||||
flex-wrap: wrap;
|
||||
padding-left: 0 !important;
|
||||
}
|
||||
.el-tree-node__expand-icon{
|
||||
display: none !important;
|
||||
}
|
||||
.custom-tree-node {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: 16px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
.tran{
|
||||
transition: transform .3s;
|
||||
}
|
||||
.isactive{
|
||||
transform: rotate(90deg) ;
|
||||
}
|
||||
.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{
|
||||
background-color:transparent !important;
|
||||
}
|
||||
.el-tree-node__content:hover, .el-upload-list__item:hover{
|
||||
background-color:transparent !important;
|
||||
}
|
||||
CSS
|
||||
);
|
||||
|
||||
$this->addVariables(['listen' => $this->listen]);
|
||||
return parent::render();
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化渲染值
|
||||
*
|
||||
* @param [type] $value
|
||||
* @return void
|
||||
*/
|
||||
protected function formatFieldData($data)
|
||||
{
|
||||
$value = parent::formatFieldData($data);
|
||||
$hasChecked = [];
|
||||
foreach ($value ?? [] as $permission){
|
||||
$hasChecked[] = $permission['id'];
|
||||
}
|
||||
return json_encode($hasChecked);
|
||||
}
|
||||
|
||||
protected function prepareInputValue($value)
|
||||
{
|
||||
return json_decode($value);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,12 +2,14 @@
|
|||
|
||||
namespace Dcat\Admin\Http\Controllers;
|
||||
|
||||
use Dcat\Admin\Admin;
|
||||
use Dcat\Admin\Form;
|
||||
use Dcat\Admin\Http\Repositories\Permission;
|
||||
use Dcat\Admin\Layout\Content;
|
||||
use Dcat\Admin\Tree;
|
||||
use Dcat\Admin\Admin;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use Dcat\Admin\Layout\Content;
|
||||
use Dcat\Admin\Http\Repositories\Permission;
|
||||
use Dcat\Admin\Models\Permission AS PermissionModel;
|
||||
|
||||
class PermissionController extends AdminController
|
||||
{
|
||||
|
|
@ -16,6 +18,38 @@ class PermissionController extends AdminController
|
|||
return trans('admin.permissions');
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过接口获取权限数据
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function apiGetPermissions(Request $request)
|
||||
{
|
||||
$permissions = (new PermissionModel())->toTree();
|
||||
|
||||
$permissionArr = $this->formatPermissionsTreeToArray($permissions);
|
||||
return response()->json($permissionArr);
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化树
|
||||
*
|
||||
* @param array $permissions
|
||||
* @return void
|
||||
*/
|
||||
protected function formatPermissionsTreeToArray(array $permissions)
|
||||
{
|
||||
$res = [];
|
||||
foreach ($permissions as $permission) {
|
||||
$res[] = [
|
||||
'id' => $permission->id,
|
||||
'label' => $permission->name,
|
||||
'children' => $this->formatPermissionsTreeToArray($permission->children ?? []),
|
||||
];
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function index(Content $content)
|
||||
{
|
||||
return $content
|
||||
|
|
|
|||
|
|
@ -96,38 +96,40 @@ class RoleController extends AdminController
|
|||
|
||||
$form->text('name', trans('admin.name'))->required();
|
||||
|
||||
$form->tree('permissions')
|
||||
->nodes(function () {
|
||||
$permissionModel = config('admin.database.permissions_model');
|
||||
$permissionModel = new $permissionModel();
|
||||
$form->permissionSelect('permissions');
|
||||
|
||||
return $permissionModel->allNodes();
|
||||
})
|
||||
->customFormat(function ($v) {
|
||||
if (! $v) {
|
||||
return [];
|
||||
}
|
||||
// $form->tree('permissions')
|
||||
// ->nodes(function () {
|
||||
// $permissionModel = config('admin.database.permissions_model');
|
||||
// $permissionModel = new $permissionModel();
|
||||
|
||||
return array_column($v, 'id');
|
||||
});
|
||||
// return $permissionModel->allNodes();
|
||||
// })
|
||||
// ->customFormat(function ($v) {
|
||||
// if (! $v) {
|
||||
// return [];
|
||||
// }
|
||||
|
||||
if ($bindMenu) {
|
||||
$form->tree('menus', trans('admin.menu'))
|
||||
->treeState(false)
|
||||
->setTitleColumn('title')
|
||||
->nodes(function () {
|
||||
$model = config('admin.database.menu_model');
|
||||
// return array_column($v, 'id');
|
||||
// });
|
||||
|
||||
return (new $model())->allNodes();
|
||||
})
|
||||
->customFormat(function ($v) {
|
||||
if (! $v) {
|
||||
return [];
|
||||
}
|
||||
// if ($bindMenu) {
|
||||
// $form->tree('menus', trans('admin.menu'))
|
||||
// ->treeState(false)
|
||||
// ->setTitleColumn('title')
|
||||
// ->nodes(function () {
|
||||
// $model = config('admin.database.menu_model');
|
||||
|
||||
return array_column($v, 'id');
|
||||
});
|
||||
}
|
||||
// return (new $model())->allNodes();
|
||||
// })
|
||||
// ->customFormat(function ($v) {
|
||||
// if (! $v) {
|
||||
// return [];
|
||||
// }
|
||||
|
||||
// return array_column($v, 'id');
|
||||
// });
|
||||
// }
|
||||
|
||||
$form->display('created_at', trans('admin.created_at'));
|
||||
$form->display('updated_at', trans('admin.updated_at'));
|
||||
|
|
|
|||
|
|
@ -180,6 +180,13 @@ class Asset
|
|||
'@autocomplete' => [
|
||||
'js' => '@admin/dcat/plugins/autocomplete/jquery.autocomplete.min.js',
|
||||
],
|
||||
'@element' => [
|
||||
'css' =>'@admin/element/v2.15.8/app.css',
|
||||
'js' => '@admin/element/v2.15.8/app.js',
|
||||
],
|
||||
'@vue' => [
|
||||
'js' => '@admin/vue/vue.js'
|
||||
]
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue