4
0
Fork 0

调整权限选择

master
vine_liutk 2022-09-21 13:33:03 +08:00
parent e07f55c655
commit bc66a76cc8
12 changed files with 12301 additions and 46 deletions

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.

12014
resources/dist/vue/vue.js vendored 100644

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

@ -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,
];
/**

View File

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

View File

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

View File

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

View File

@ -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'
]
];
/**