主题
角色表单
后端
INFO
在线案例角色 CURD
php
namespace Modules\Common\Tables;
use CatchForm\Components\Rules\Control;
use CatchForm\Form;
use CatchForm\Table\Table;
use Modules\Permissions\Enums\DataRange;
use Modules\Permissions\Enums\MenuType;
use Modules\Permissions\Models\Departments;
use Modules\Permissions\Models\Roles;
class Role extends Dynamic
{
public function table()
{
return Table::make('permissions/roles')->columns(function (Table $table) {
$table->column('角色名称', 'role_name');
$table->column('角色标识', 'identify');
// 角色描述
$table->column('角色描述', 'description');
// 创建时间
$table->column('创建时间', 'created_at');
$table->column('操作')->type('operate');
})->dialog(800)->rowKey()
->search(function (Table $table){
$table->input('角色名称', 'roles.role_name');
$table->input('角色标识', 'identify');
});
}
protected function form()
{
return Form::make(function (Form $form) {
$form->treeSelect('parent_id', '父级角色')->data(
Roles::query()->get(['id as value', 'role_name as label', 'parent_id'])->toTree(id: 'value')->toArray()
)->class('w-full')->emitChange()->checkStrictly(true);
$form->text('role_name', '角色名称ssss')->maxlength(30)->showWordLimit()->required();
$form->text('identify', '角色标识')->maxlength(30)->showWordLimit()->required();
$form->textarea('description', '角色描述')->maxlength(200)->showWordLimit();
$form->select('data_range', '数据权限')->options(DataRange::class)
->whenEqual(DataRange::Personal_Choose->value(), function (Control $control){
$control->hide('departments');
});
$form->treeSelect('departments', '自定义权限')->data(
Departments::query()->get()->toTree()->toArray()
)->toProps([
'label' => 'department_name',
'value' => 'id'
])->showCheckbox()->required()->multiple()->valueKey('id');
$form->custom('permissions', '权限')->type('div')
->subs(function (Form $form){
$form->tree('permissions', '')->data([])->toProps([
'label' => 'permission_name',
'value' => 'id'
])->showCheckbox()->loadData('permissionsOption', 'props.data')->class('w-full');
})->class(['w-full h-40 pt-2 pl-2 overflow-auto border border-gray-300 rounded']);
/**
$form->tree('permissions', '权限')->data(
\Modules\Permissions\Models\Permissions::query()->get(['id', 'permission_name', 'parent_id'])->toTree()
)->toProps([
'label' => 'permission_name',
'value' => 'id'
])->showCheckbox(true);*/
});
}
}
前端
列表
vue
// index.vue
<template>
<div v-loading="loading" class="min-h-96">
<catch-table :paginate="false" v-bind="table" v-if="!loading">
<template #dialog="row">
<Create :config="{ ...form, primary: row?.id }" />
</template>
</catch-table>
</div>
</template>
<script lang="ts" setup>
import Create from './create.vue'
import { useDymaic } from '@/composables/useDymaic'
const { table, form, loading } = useDymaic('dynamic/role')
</script>
表单
vue
// create.vue
<template>
<!--<form-create v-model="formData" :rule="rule" v-model:api="formApi" :option="options" ref="form"> </form-create>-->
<catch-form ref="formRef" :config="config" :beforeSubmit="beforeSubmit" :afterSubmit="afterSubmit" />
</template>
<script lang="ts" setup>
// @ts-nocheck
import http from '@/support/http'
import { onMounted, ref, beforeMount, watch } from 'vue'
defineProps({
config: Object
})
const formRef = ref()
const form = formRef.value?.getForm()
// 监听模块组件的 change 事件
const changeEvent = () => {
const form = formRef.value.getForm()
form.on('change', (field, value) => {
if (field === 'parent_id') {
getPermissions(value)
}
})
getPermissions()
}
// 提交前的钩子
const beforeSubmit = (formData) => {
formData.parent_id = formData.parent_id[0]
return formData
}
// 提交后的钩子
const afterSubmit = () => {
formRef.value.resetExceptFields('type')
formRef.value.setFieldValue('type', 1)
}
const getPermissions = async (value: number = 0) => {
const form = formRef.value.getForm()
if (value) {
http.get('permissions/roles/' + value, { from: 'parent_role' }).then((r) => {
form.setData('permissionsOption', r.data.data.permissions)
})
} else {
http.get('permissions/permissions', { from: 'role' }).then((r) => {
form.setData('permissionsOption', r.data.data)
})
}
}
onMounted(() => {
changeEvent()
})
</script>