多级联动查询的实现

一、实现效果

 注:机构是三级联动,职位类型和职位名称是两级联动,根据这些条件进行查询,只要其中一个没有选择,就点击查询,就会进行提示,如下图所示

二、实现思路

1.多级联动的实现

以职位类型和职位名称的二级联动为例子

首先先将职位类型和职位名称查询出来,用变量进行存储

/*查询职位类型信息 接口调用成功*/
    loadPositionTypeName(){
      this.$request.get('/positionTypes/selectAll').then(res => {
        if (res.code === '200') {
          console.log(res)
          this.positionTypeNameData= res.data
        } else {
          console.log(res.msgs)
          this.$message.error(res.msg)
        }
      })
    },
    loadPositionNameData(){
      this.$request.get('/Positions/selectAll').then(res => {
        if (res.code === '200') {
          console.log(res)
          this.positionNameData= res.data
        } else {

          this.$message.error(res.msg)
        }
      })
    },

接着实现根据职位类型动态加载职位类型

   // 根据职位类型加载职位名称
    loadPositions() {
      console.log("调用了该方法")
      const positionTypeId = this.form.positionTypeId;
      console.log("我是ID"+positionTypeId)

      // 清空职位名称数据
      this.positionNameData = [];

      // 等待 Vue 更新 DOM 后,再发送请求
      this.$nextTick(() => {
        // 发送请求获取该职位类型下的职位列表
        this.$request.get(`/Positions/names/${positionTypeId}`).then(res => {
          if (res.code === '200') {
            console.log("我调用啦啦啦啦啦啦")
            this.positionNameData = res.data;  // 更新职位名称数据
            console.log(res)
          } else {
            this.$message.error(res.msg);
          }
        }).catch(error => {
          this.$message.error('获取职位名称数据失败');
          console.error(error);
        });
      });
    },

首先清空职位名称的数据,获取选择的职位类型的id,发送请求,根据该职位类型的id,获取该id下的职位名称,重新赋值给职位名称,所以这里需要一个接口,能够根据职位类型id,来获取到该id下的职位名称。

2.实现查询
 load(pageNum) {  // 分页查询
      if (pageNum) this.pageNum = pageNum;
      // 检查是否所有条件都已填写
      if (!this.allConditionsFilled()) {
        this.$message.warning('请填写所有查询条件');
        return;
      }
      this.$request.get('/employee/selectPage', {
        params: {
          pageNum: this.pageNum,
          pageSize: this.pageSize,
          levelThreeId: this.form.levelThreeId,
          positionTypeId: this.form.positionTypeId,
          positionNameId: this.form.positionNameId
        }
      }).then(res => {
        console.log("+++++++++++++++++++++++++++++++++++++")
        // console.log(res)
        this.tableData = res.data?.list;
        this.total = res.data?.total;
      });
    },

完成数据的渲染的后,进行查询,查询只要获取到当前的职位类型的id和职位名称的id,将接口所需的参数一一获取,发送请求,即可完成接口的查询

三、完整代码

<template>
  <div>
    <div class="search" style = "height:400px;">
<!--      <el-input placeholder="请输入账号查询" style="width: 200px" v-model="username"></el-input>

      <el-button type="warning" plain style="margin-left: 10px" @click="reset">重置</el-button>-->
        <el-form :model="form" label-width="100px" style="margin-top: 50px" :rules="rules" ref="formRef">
          <el-form-item prop="LevelOneName" label="一级机构" >
            <el-select v-model="levelOneName" placeholder="请选择一级机构"  >
              <el-option v-for="item in departmentData " :label="item.name" :value="item.id "  :key="item.id"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item prop="LevelTwoName" label="二级机构" >
            <el-select v-model="levelTwoName" placeholder="请选择二级机构"  >
              <el-option v-for="item in levelTwo " :label="item.name" :value="item.id" :key="item.id"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item prop="LevelOneName" label="三级机构" >
            <el-select v-model="form.levelThreeId" placeholder="请选择三级机构" @change=" handleLevelThreeChange(form.levelThreeId)" :disabled="isEditing" >
              <el-option v-for="item in levelThree " :label="item.name" :value="item.id" :key="item.id"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item prop="positionTypeName" label="职位类型" >
            <el-select v-model="form.positionTypeId" placeholder="请选择职位类型" @change="loadPositions" >
              <el-option v-for="item in  positionTypeNameData " :label="item.name" :value="item.id " :key="item.id"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item prop="positionId" label="职位名称">
            <el-select v-model="form.positionNameId" placeholder="请选择职位名称">
              <el-option v-for="item in  positionNameData " :label="item.name" :value="item.id " :key="item.id"></el-option>
            </el-select>
          </el-form-item>
        </el-form>
<!--        <div slot="footer" class="dialog-footer">
          <el-button @click="fromVisible = false">取 消</el-button>
          <el-button type="primary" @click="save">确 定</el-button>
        </div>-->
<!--      <el-input placeholder="请输入账号查询" style="width: 200px" v-model="username"></el-input>-->
      <el-button type="info" plain style="margin-left: 250px" @click="load(1) ">查询</el-button>


    </div>

    <div class="table">
      <el-table :data="tableData" strip @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" align="center"></el-table-column>
        <el-table-column prop="id" label="序号" width="70" align="center" sortable></el-table-column>
        <el-table-column label="头像">
          <template v-slot="scope">
            <div style="display: flex; align-items: center">
              <el-image style="width: 40px; height: 40px; border-radius: 50%" v-if="scope.row.avatar"
                        :src="scope.row.avatar" :preview-src-list="[scope.row.avatar]"></el-image>
            </div>
          </template>
        </el-table-column>
<!--        <el-table-column prop="username" label="账号"></el-table-column>-->
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
<!--        <el-table-column prop="phone" label="电话"></el-table-column>-->
<!--        <el-table-column prop="email" label="邮箱" ></el-table-column>-->
<!--        <el-table-column prop="role" label="角色"></el-table-column>-->
        <el-table-column prop="level" label="身份"></el-table-column>
        <el-table-column prop="levelThreeName" label="部门"></el-table-column>
        <el-table-column prop="positionTypeName" label="职位类型"></el-table-column>
        <el-table-column prop="positionName" label="职位名称"></el-table-column>
        <!--  操作/包括删除 编辑      -->
        <el-table-column label="操作" align="center" width="250">
          <template v-slot="scope">
            <el-button size="mini" type="primary" plain @click="handleEdit(scope.row)">编辑</el-button>
            <el-button size="mini" type="primary" plain @click="display(scope.row)">查看</el-button>
            <el-button size="mini" type="danger" plain @click="del(scope.row.id)">删除</el-button>

          </template>
        </el-table-column>
      </el-table>
      <!--          设置分页-->
      <div class="pagination">
        <el-pagination
            background
            @current-change="handleCurrentChange"
            :current-page="pageNum"
            :page-sizes="[5, 10, 20]"
            :page-size="pageSize"
            layout="total, prev, pager, next"
            :total="total">
        </el-pagination>
      </div>
    </div>



  </div>
</template>

<script>
import department from "@/views/manager/Department.vue";

export default {
  //在视频讲解中,这里定义为User,我把它改成Employee
  name: "Employee",
  data() {
    return {
      tableData: [],  // 所有的数据
      pageNum: 1,   // 当前的页码
      pageSize: 10,  // 每页显示的个数
      total: 0,
      username: null,
      fromVisible: false,
      Vision:false,//查看弹窗
      form: {},
      user: JSON.parse(localStorage.getItem('xm-user') || '{}'),
      rules: {
        username: [
          {required: true, message: '请输入账号', trigger: 'blur'},
        ]
      },
      ids: [],
      departmentData:[],
      levelTwo:[],
      levelThree:[],
      positionTypeNameData:[],
      positionNameData:[],
      levelOneName:null,
      levelTwoName:null,
      levelThreeId:null,
      positionTypeId:null,
      positionId:null,


    }
  },
  created() {
    // this.load(1)
    this.loadLevelOne()
    this.loadlevelTwo()
    this.loadlevelThree()
    this.loadPositionTypeName()
    this.loadPositionNameData()
    // this.loadPositions()
    /*this.Test()
    this. allConditionsFilled()*/
    /*this.loadPositionTypeName()*/

  },
  methods: {

    /*查询职位类型信息 接口调用成功*/
    loadPositionTypeName(){
      this.$request.get('/positionTypes/selectAll').then(res => {
        if (res.code === '200') {
          console.log(res)
          this.positionTypeNameData= res.data
        } else {
          console.log(res.msgs)
          this.$message.error(res.msg)
        }
      })
    },
    loadPositionNameData(){
      this.$request.get('/Positions/selectAll').then(res => {
        if (res.code === '200') {
          console.log(res)
          this.positionNameData= res.data
        } else {

          this.$message.error(res.msg)
        }
      })
    },
    /*查询一级机构的信息*/
    loadLevelOne(){
      this.$request.get('/levelOne/selectAll').then(res => {
        if (res.code === '200') {
          // console.log(res)
          this.departmentData = res.data
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    // 根据职位类型加载职位名称
    loadPositions() {
      console.log("调用了该方法")
      const positionTypeId = this.form.positionTypeId;
      console.log("我是ID"+positionTypeId)

      // 清空职位名称数据
      this.positionNameData = [];

      // 等待 Vue 更新 DOM 后,再发送请求
      this.$nextTick(() => {
        // 发送请求获取该职位类型下的职位列表
        this.$request.get(`/Positions/names/${positionTypeId}`).then(res => {
          if (res.code === '200') {
            console.log("我调用啦啦啦啦啦啦")
            this.positionNameData = res.data;  // 更新职位名称数据
            console.log(res)
          } else {
            this.$message.error(res.msg);
          }
        }).catch(error => {
          this.$message.error('获取职位名称数据失败');
          console.error(error);
        });
      });
    },
    /*查询二级机构信息*/
    loadlevelTwo(){
      this.$request.get('/levelTwo/selectAll').then(res => {
        if (res.code === '200') {
          this.levelTwo = res.data
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    loadlevelThree(){
      this.$request.get('/levelThree/selectAll').then(res => {
        if (res.code === '200') {
          this.levelThree = res.data
        } else {
          this.$message.error(res.msg)
        }
      })
    },
    handleAdd() {   // 新增数据
      this.form = {}  // 新增数据的时候清空数据
      this.fromVisible = true   // 打开弹窗
    },
    handleEdit(row) {   // 编辑数据
      console.log("-----------------")
      console.log(row)
      this.form = JSON.parse(JSON.stringify(row))  // 给form对象赋值  注意要深拷贝数据
      this.isEditing = true;  // 设置为编辑状态
      this.fromVisible = true   // 打开弹窗
    },
    // 判断字段是否被禁用
    isFieldDisabled(field) {
      return this.disabledFields.includes(field);
    },
    display(row){
      this.form = JSON.parse(JSON.stringify(row))  // 给form对象赋值  注意要深拷贝数据
      this.Vision = true
    },

    handleSelectionChange(rows) {   // 当前选中的所有的行数据
      this.ids = rows.map(v => v.id)
    },
// 检查是否所有条件都已填写
    allConditionsFilled() {
      return this.form.levelThreeId  &&
      this.form.positionTypeId &&
      this.form.positionNameId ;
},
    load(pageNum) {  // 分页查询
      if (pageNum) this.pageNum = pageNum;
      // 检查是否所有条件都已填写
      if (!this.allConditionsFilled()) {
        this.$message.warning('请填写所有查询条件');
        return;
      }
      this.$request.get('/employee/selectPage', {
        params: {
          pageNum: this.pageNum,
          pageSize: this.pageSize,
          levelThreeId: this.form.levelThreeId,
          positionTypeId: this.form.positionTypeId,
          positionNameId: this.form.positionNameId
        }
      }).then(res => {
        console.log("+++++++++++++++++++++++++++++++++++++")
        // console.log(res)
        this.tableData = res.data?.list;
        this.total = res.data?.total;
      });
    },

    reset() {
      this.username = null
      this.load(1)
    },
    handleCurrentChange(pageNum) {
      this.load(pageNum)
    },

  }
}
</script>

<style scoped>

</style>

注:新手小白,代码思路,起名等可能不规范,望谅解,谢谢指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值