将普通表格转化为树状表格
DROP TABLE IF EXISTS `bro_treetable_example`;
CREATE TABLE `bro_treetable_example` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`pid` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '名称',
`create_time` int UNSIGNED NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '树状表格示例表' ROW_FORMAT = Dynamic;
<!-- 树状表格必看 --> <!-- 1. 不需要分页,所以第19行实现了隐藏分页组件 --> <!-- 2. 为了显示需要,通常将 `树状` 字段设置为第一个字段,并且该字段对齐方式为 `left`,请参考第42行 --> <!-- 3. 请注意第13行,其中的 unfold 可以在表头增加一个 `展开/收缩` 树状表格的按钮 --> <!-- 4. 本文件内,除以上注意事项外,树状表格与普通表格无差别 -->
<!-- 1. 不需要分页,所以第19行实现了隐藏分页组件 -->
<Table ref="tableRef" :pagination="false" />
<!-- 2. 为了显示需要,通常将 `树状` 字段设置为第一个字段,并且该字段对齐方式为 `left`,请参考第42行 -->
{ label: t('treetable.name'), prop: 'name', align: 'left', operatorPlaceholder: t('Fuzzy query'), operator: 'LIKE', sortable: false },
<!-- 3. 请注意第13行,其中的 unfold 可以在表头增加一个 `展开/收缩` 树状表格的按钮 -->
<TableHeader :buttons="['refresh', 'add', 'edit', 'delete', 'unfold':"必须增加的tab栏展开", 'comSearch', 'quickSearch', 'columnDisplay']" :quick-search-placeholder="t('Quick search placeholder', { fields: t('examples.treetable.quick Search Fields') })" />
<!-- 树状表格必看 --> <!-- 1. 29-40行的远程下拉组件用于选择上级,它只是一个普通的远程下拉,只是设置了额外的 isTree 属性 --> <!-- 2. 76-89行的表单验证规则用于禁止上级为当前数据 --> <!-- 3. 本文件内,除以上注意事项外,树状表格表单与普通表格的表单无差别 -->
<!-- 1. 29-40行的远程下拉组件用于选择上级,它只是一个普通的远程下拉,只是设置了额外的 isTree 属性 -->
<FormItem
type="remoteSelect"
prop="pid"
:label="t('examples.treetable.pid')"
v-model="baTable.form.items!.pid"
:placeholder="t('Click select')"
:input-attr="{
params: { isTree: true },
field: 'name',
'remote-url': baTable.api.actionUrl.get('index'),
}"
/>
<!-- 2. 76-89行的表单验证规则用于禁止上级为当前数据 -->
pid: [
{
validator: (rule: any, val: string, callback: Function) => {
if (!val) {
return callback()
}
if (parseInt(val) == parseInt(baTable.form.items!.id)) {
return callback(new Error(t('auth.menu.The superior menu rule cannot be the rule itself')))
}
return callback()
},
trigger: 'blur',
},
],
/**
* 重写查看方法
* @throws Throwable
*/
public function index(): void
{
$this->request->filter(['strip_tags', 'trim']);
list($where, $alias) = $this->queryBuilder();
$res = $this->model
->field($this->indexField)
->alias($alias)
->where($where)
->select()
->toArray();
/**
* 树状表格必看注释一
* 1. 获取表格数据(没有分页,所以简化了以上的数据查询代码)
* 2. 递归的根据指定字段组装 children 数组,此时直接给前端,表格就可以正常的渲染为树状了,一个方法搞定
*/
$res = $this->tree->assembleChild($res);
if ($this->request->param('select')) {
/**
* 树状表格必看注释二
* 1. 在远程 select 中,数据要成树状显示,需要对数据做一些改动
* 2. 通过已组装好 children 的数据,建立`树枝`结构,并最终合并为一个二维数组方便渲染
* 3. 简单讲就是把组装好 children 的数据,给以下这两个方法即可
*/
$res = $this->tree->assembleTree($this->tree->getTreeArray($res));
}
$this->success('', [
'list' => $res,
'remark' => get_route_remark(),
]);
}