记录一个部门及部门人员选择的功能,效果如下:
组件用到了uni-ui的级联选择uni-data-picker
开发文档:uni-app官网
组件要求的数据格式如下:
后端使用的是fastadmin,需要用到fastadmin自带的tree类生成部门树 ,后端代码如下:
/*** 获取部门及员工数据(树形结构)适用于uni-ui的uni-data-picker*/public function getDepartmentAndStaff(){// 获取所有部门(含层级关系)$departments = Db::name('wecom_department')->field('id, name, parent_id')->order('id ASC')->select();// 构建部门树$tree = new Tree();$tree->init($departments,'parent_id',' ');$treeList = $tree->getTreeList($tree->getTreeArray(210), 'name'); // 从顶级部门开始// 处理每个部门下的员工$result = [];foreach ($treeList as $dept) {$deptData = ['text' => $dept['name'], // 前端显示名称'value' => 'dept_' . $dept['id'], // 部门唯一标识'children' => [], // 子节点(员工或子部门)// 保留元数据(可选,前端如需区分部门/员工可使用)'meta' => ['type' => 'department','id' => $dept['id']]];// 查询部门下的员工(假设部门ID字段为department,需根据实际表结构调整)$staffList = Db::name('wecom_staff')->where('department', $dept['id']) // 员工表中部门关联字段->field('id, name')->order('id ASC')->select(); // 转换为数组// 转换员工数据格式$deptData['children'] = array_map(function ($staff) {return ['text' => $staff['name'], // 员工显示名称'value' => 'staff_' . $staff['id'], // 员工唯一标识'isLeaf' => true, // 标记为叶子节点(无子节点)'meta' => ['type' => 'employee','id' => $staff['id']]];}, $staffList);$result[] = $deptData;}$this->success('获取成功', $result);}
注意的点:tree->init()要传三个参数,特别是第二第三个参数,第二个参数应该为父id的字段名,第三个是空格占位符,默认是 在html会正常识别,但是小程序不行,所以要自己定义占位符。
tree类文件的注释也写的非常 清晰了。
设置了自定义占位符和默认的区别。
前端页面的调用,截取了部分:
<template><!-- 借用信息表单 --><view class="form-section"><view class="form-item"><text class="label">所属部门</text><uni-data-picker :localdata="departmentData" popup-title="请选择班级" @change="onchange"@nodeclick="onnodeclick"></uni-data-picker></view></view>
</template><script setup>import {ref,computed} from 'vue'import request from '@/utils/http2.js'const departmentData = ref([])onMounted(() => {// 加载部门树request({url: '/api/wecomapi/getDepartmentAndStaff',method: 'GET'}).then(res=>{if (res.code) {departmentData.value = res.data;}})})</script>