第三十四节:用户新增编辑弹窗增加 el‑tree‑select 部门选择器

第三十四节:用户新增编辑弹窗增加 el‑tree‑select 部门选择器

目标:在用户弹窗里实现下拉树形选择部门,新增 / 编辑用户可以绑定部门 deptId,提交保存到接口。

技术点:el-tree-select,下拉框内嵌树形组件。

1、修改用户弹窗组件 UserDialog.vue

src/views/system/user/components/UserDialog.vue

复制代码
<template>
  <el-dialog
    v-model="dialogVisible"
    :title="isEdit ? '编辑用户' : '新增用户'"
    width="520px"
    @close="handleClose"
  >
    <el-form ref="formRef" :model="formData" :rules="formRules" label-width="90px">
      <el-form-item label="用户名" prop="username">
        <el-input v-model="formData.username" placeholder="请输入用户名" />
      </el-form-item>
      <el-form-item label="昵称" prop="nickName">
        <el-input v-model="formData.nickName" placeholder="请输入昵称" />
      </el-form-item>
      <el-form-item label="手机号" prop="phone">
        <el-input v-model="formData.phone" placeholder="请输入手机号" />
      </el-form-item>
      <!-- 新增:部门树形选择器 -->
      <el-form-item label="归属部门" prop="deptId">
        <el-tree-select
          v-model="formData.deptId"
          :data="deptTreeData"
          placeholder="请选择部门"
          node-key="id"
          :props="{ label:'deptName', children:'children' }"
          check-strictly
          style="width:100%"
        />
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button @click="dialogVisible = false">取消</el-button>
      <el-button type="primary" @click="submitForm">确定</el-button>
    </template>
  </el-dialog>
</template>

<script setup>
import { ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { getDeptTree } from '@/api/dept'

const props = defineProps({
  visible: { type: Boolean, default: false },
  rowData: { type: Object, default: null }
})
const emit = defineEmits(['update:visible', 'success'])

const dialogVisible = ref(false)
const formRef = ref(null)
const isEdit = ref(false)
//部门树数据
const deptTreeData = ref([])

const formData = ref({
  id: null,
  username: '',
  nickName: '',
  phone: '',
  deptId: null
})

const formRules = ref({
  username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
  nickName: [{ required: true, message: '请输入昵称', trigger: 'blur' }]
})

watch(() => props.visible, async val => {
  dialogVisible.value = val
  if (val) {
    //弹窗打开加载部门树
    const res = await getDeptTree()
    deptTreeData.value = res.data
    openDialog()
  }
})

function openDialog() {
  formRef.value?.resetFields()
  if (props.rowData) {
    //编辑回显
    isEdit.value = true
    formData.value = { ...props.rowData }
  } else {
    //新增清空
    isEdit.value = false
    formData.value = {
      id: null,
      username: '',
      nickName: '',
      phone: '',
      deptId: null
    }
  }
}

async function submitForm() {
  await formRef.value.validate()
  emit('success', { form: formData.value, isEdit: isEdit.value })
  dialogVisible.value = false
}

function handleClose() {
  emit('update:visible', false)
}
</script>

重点属性说明

  • node-key="id":树节点唯一标识,必须配置
  • check‑strictly:父子节点互不关联,选子节点不会自动选中父节点,业务更符合部门选择
  • v‑model="formData.deptId":绑定选中部门 id,提交表单一起传给后端

2、mock 接口确认

新增用户接口 /api/user/add、编辑接口 /api/user/update 接收 deptId 参数即可,mock 只打印 body,不需要额外处理。

测试步骤

  1. 打开新增用户弹窗,下拉框可以展开部门树,能选择总公司、研发部、市场部。
  2. 选择部门,提交表单,控制台 mock 可以看到提交数据携带deptId
  3. 编辑已有用户,打开弹窗,自动回显该用户所属部门。
  4. 保存完成回到用户列表,左侧部门树点击,依然可以按部门筛选表格。

当前模块完成:

用户管理:查询、新增编辑弹窗(带部门树选择)、删除、批量删除、左侧部门树筛选、excel 导入导出、按钮权限。

相关推荐
程序员老赵1 小时前
Docker 部署 go2rtc:轻松搭建摄像头多协议流媒体平台
前端·docker·直播
巴勒个啦1 小时前
如何设计一个高可复用的前端组件库:从API设计到文档自动化
javascript
酷酷的逗逗乐1 小时前
前端转 Agent 开发 · 第三节:LangChain 提示词模板
前端
Cache技术分享1 小时前
516. Java 方法句柄 - 转换(进阶篇·下)
前端·后端
妙码生花1 小时前
全网 8k star 的 BuildAdmin 正式发布 Golang 版本,这次我们在CRUD赛道杀死了比赛。
前端·后端·ai编程
写代码像蔡徐抻1 小时前
三年了,AI为何还没有抢走程序员饭碗?
前端·后端·面试
梦曦i1 小时前
unix-router v0.1.0 首发:uni-app x 的 vue-router 风格路由库
前端·uni-app
mONESY1 小时前
一句话是怎么被大模型记住的?——拆解 LangChain.js 消息从诞生到落盘的完整旅程
javascript
Linsk1 小时前
妙用:focus解决0到auto高度过渡的边界场景
前端·css