下拉选择框 多级联动动态显示实例 Ajax+redis+mysql+java后台

下拉选择框 多级联动动态显示实例 Ajax+redis+mysql+java后台

我的实现思路是:前台在选择一级下拉框就发一次Ajax请求到后台,后台把查询结果放到一个map容器里面返回,并存到缓存中。 前台在请求成功后回填下拉框,选择二级或其他下级不用再发请求,直接再前端全局变量容器里面去获取就行了,拿到数据直接进行onchang里面的回填方法。
HTML 代码部分

<div class="clearfix" style="margin-bottom: 10px;">
						<label for="" class="wr105 f-ib">设备类型:</label>
						<select name="" id="deviceTypeid" onclick="configSelect('deviceType')" onchange="subdeviceConfig('deviceType')" class="u-input input6">

						</select> 
						<label for="" class="wr105 f-ib">设备子类型:</label>
						<select name="" id="devicesubType" class="u-input input6">

						</select> 
					</div>
					<div class="clearfix" style="margin-bottom: 10px;">
						<label for="" class="wr105 f-ib">厂商:</label>
						<select name="" id="deviceManufacturer" onclick="configSelect('deviceManufacturer')" onchange="subdeviceConfig('deviceManufacturer')" class="u-input input6">

						</select> 
						<label for="" class="wr105 f-ib">型号:</label>
						<select name="" id="manufacturerModelCn" onchange="subdeviceConfig('manufacturerModelCn')" class="u-input input6">

						</select> 
						<label for="" class="wr105 f-ib">版本:</label>
						<select  disabled="true"  id="modeVersion" class="u-input input6">

						</select> 
					</div>
					<div class="clearfix">
						<div class="f-fl f-mr15">
							<label for="" class="wr105 f-ib">归属专业:</label>
							   <select name="" id="belongedMajor" onclick="configSelect('belongedMajor')" onchange="subdeviceConfig('belongedMajor')" class="u-input input6">

							   </select>                      
							<span class="s-tip lt80"></span>
						</div>
						<div class="f-fl f-mr15">
							<label for="" class="wr105 f-ib">归属业务系统:</label>
							   <select name="" id="belongedbusiness" class="u-input input6">

							   </select>                      
							<span class="s-tip lt80"></span>
						</div>
					</div>

在这里插入图片描述
在select里面加一个点击事件οnclick=“configSelect(‘deviceType’)”,里面传递一个参数,用来区分下拉框的类别,Ajax请求将该参数传到后台也用来做后台的区分及作为缓存key。

js 部分

Ajax 请求

//全局变量存放设备类型下拉框数据
var deviceData = null;
 //加载联动下拉框
 function configSelect(selectvalue){
    var selectparam ={};
    //当作参数传到后台
     selectparam.value =selectvalue;
     $.ajax({
         type : "POST",
         url : localStorage.getItem("route")+"/unKnowDevice/deviceTypeSelect",
         cache : false, // 禁用缓存
         data : JSON.stringify(selectparam), // 传入组装的参数
         contentType: 'application/json',
         dataType : "json",
         beforeSend: function (xhr) {
             xhr.setRequestHeader("Authorization", "Bearer" + localStorage.getItem("token"));
         },
         success : function(res) {
             //用全局变量当容器存放数据
             deviceData = res.data;
             var obj  = res.data;
             var resultlist = new Array();
             var i= 0;
             for(var key in obj){
                 resultlist[i]  = key;
                 i++;
             }
             //回填下拉框
             backfillselectvalue(selectvalue,resultlist);
        },
         error : function(response){
             console.log(response);
         }
     });
     
 **请求成功后下拉框回填:**
//请求成功后回填下拉框
 function backfillselectvalue(selectvalue,resultlist) {
     //设备类型
     if(selectvalue=="deviceType"){
         //下拉框回填
         if($("#deviceTypeid option").length<resultlist.length){
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option   selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceTypeid");
                 }else {
                     $("<option   value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceTypeid");
                 }


             }
         }
         if($("#deviceTypeid option").length>resultlist.length){
             $("#deviceTypeid option").remove();
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option  selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceTypeid");
                 }else {
                     $("<option value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceTypeid");
                 }

             }
         }
     }

     //厂家型号
     if(selectvalue=="belongedMajor"){
         console.log(resultlist);
         //下拉框回填
         if($("#belongedMajor option").length<resultlist.length){
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option   selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#belongedMajor");
                 }else {
                     $("<option   value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#belongedMajor");
                 }


             }
         }
         if($("#belongedMajor option").length>resultlist.length){
             $("#belongedMajor option").remove();
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option  selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#belongedMajor");
                 }else {
                     $("<option value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#belongedMajor");
                 }

             }
         }
     }

     //归属专业
     if(selectvalue=="deviceManufacturer"){
         console.log(resultlist);
         //下拉框回填
         if($("#deviceManufacturer option").length<resultlist.length){
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option   selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceManufacturer");
                 }else {
                     $("<option   value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceManufacturer");
                 }


             }
         }
         if($("#deviceManufacturer option").length>resultlist.length){
             $("#deviceManufacturer option").remove();
             //下拉框回填
             for(var k=0;k<resultlist.length;k++){

                 if(k<1){
                     $("<option  selected=\"selected\" value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceManufacturer");
                 }else {
                     $("<option value='"+resultlist[k]+"'>"+  resultlist[k] +"</option>").appendTo("#deviceManufacturer");
                 }

             }
         }
     }
 }

一级框选择后 二级框回填联动:

var manufacturermodel = null;
 //加载子目录 下拉选择框
 function subdeviceConfig(type) {
     //设备类型
     if (type == "deviceType") {
         var subdeviceKey = $('#deviceTypeid  option:selected').val();
         var devicesubType = deviceData[subdeviceKey];
         //下拉框回填
         if ($("#devicesubType option").length == 0) {
             for (var k = 0; k < devicesubType.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + devicesubType[k] + "'>" + devicesubType[k] + "</option>").appendTo("#devicesubType");
                 } else {
                     $("<option   value='" + devicesubType[k] + "'>" + devicesubType[k] + "</option>").appendTo("#devicesubType");
                 }
             }
         }
         if ($("#devicesubType option").length > 0) {
             //清空下拉框
             $("#devicesubType option").remove();
             //下拉框回填
             for (var k = 0; k < devicesubType.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + devicesubType[k] + "'>" + devicesubType[k] + "</option>").appendTo("#devicesubType");
                 } else {
                     $("<option   value='" + devicesubType[k] + "'>" + devicesubType[k] + "</option>").appendTo("#devicesubType");
                 }


             }
         }
     }

     //归属专业
     if (type == "belongedMajor") {
         var belongedKey = $('#belongedMajor  option:selected').val();
         var belongedsubType = deviceData[belongedKey];
         //下拉框回填
         if ($("#belongedbusiness option").length == 0) {
             for (var k = 0; k < belongedsubType.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + belongedsubType[k] + "'>" + belongedsubType[k] + "</option>").appendTo("#belongedbusiness");
                 } else {
                     $("<option   value='" + belongedsubType[k] + "'>" + belongedsubType[k] + "</option>").appendTo("#belongedbusiness");
                 }
             }
         }
         if ($("#belongedbusiness option").length > 0) {
             //清空下拉框
             $("#belongedbusiness option").remove();
             //下拉框回填
             for (var k = 0; k < belongedsubType.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + belongedsubType[k] + "'>" + belongedsubType[k] + "</option>").appendTo("#belongedbusiness");
                 } else {
                     $("<option   value='" + belongedsubType[k] + "'>" + belongedsubType[k] + "</option>").appendTo("#belongedbusiness");
                 }


             }
         }

     }

     //厂家型号
     if (type == "deviceManufacturer") {
         var ManufacturerKey = $('#deviceManufacturer  option:selected').val();
         manufacturermodel = deviceData[ManufacturerKey];
         //下拉框回填
         if ($("#manufacturerModelCn option").length == 0) {
             for (var k = 0; k < manufacturermodel.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option disabled=\"true\"  selected=\"selected\" value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 } else {
                     $("<option   value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option  disabled=\"true\"  value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 }

             }
         }
         if ($("#manufacturerModelCn option").length > 0) {
             //清空下拉框
             $("#manufacturerModelCn option").remove();
             $("#modeVersion option").remove();
             //下拉框回填
             for (var k = 0; k < manufacturermodel.length; k++) {

                 if (k < 1) {
                     $("<option   selected=\"selected\" value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option  disabled=\"true\" selected=\"selected\" value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 } else {
                     $("<option   value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option disabled=\"true\" value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 }
             }
         }
     }
     if (type == "manufacturerModelCn") {
         if ($("#manufacturerModelCn option").length > 0) {
             //获取被选择的option的值
             var  selectvalue = $("#manufacturerModelCn option:selected").val();
             //清空下拉框
             $("#manufacturerModelCn option").remove();
             $("#modeVersion option").remove();
             //下拉框回填
             for (var k = 0; k < manufacturermodel.length; k++) {

                 if (selectvalue == manufacturermodel[k].manufacturermodelcn) {
                     $("<option   selected=\"selected\" value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option  disabled=\"true\" selected=\"selected\" value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 } else {
                     $("<option   value='" + manufacturermodel[k].manufacturermodelcn + "'>" + manufacturermodel[k].manufacturermodelcn + "</option>").appendTo("#manufacturerModelCn");
                     $("<option disabled=\"true\" value='" + manufacturermodel[k].modeversion + "'>" + manufacturermodel[k].modeversion + "</option>").appendTo("#modeVersion");
                 }
             }
         }
     }
 }

java后台:

Controller层:

 /**
     * 下拉框多级联动
     *
     * @param valuekey
     * @param
     * @return
     */
    @PostMapping(value = "/deviceTypeSelect")
    public CommonResult deviceTypeSelect(@RequestBody Map valuekey){
        if (!valuekey.isEmpty()){
            Map resultMap = iUnKnowDeviceService.deviceTypeSelect(valuekey.get("value").toString());

            return CommonResult.success(resultMap, ResultCode.SUCCESS.getMessage());

        }else {
            return CommonResult.failed(ResultCode.FAILED.getMessage());
        }


    }

service 层:
这里需要主要采用的思想就是先查一级框里面的数据,然后变量查询结果在去一一对应的查关联的二级联动对象。我这里采用的是一次请求把所有的数据查出来拼装好放到一个容器对象里面,再放到缓存里面和返回个前台;

/**
     * 下拉联动
     *
     * @param value
     * @return
     */
  

```java
  Map<String, Object> deviceTypeSelect(String value);
  
  **实现层:**  
    @Autowired
    DeviceTypeMapper deviceTypeMapper;
    @Autowired
    DeviceSubTypeMapper deviceSubTypeMapper;
    @Autowired
    BelongedMajorMapper belongedMajorMapper;
    @Autowired
    BelongedBusinessSysMapper belongedBusinessSysMapper;
    @Autowired
    DeviceManufacturerMapper deviceManufacturerMapper;
    @Autowired
    DeviceManufacturerModelMapper deviceManufacturerModelMapper;
    @Autowired
    IRedisHelper iRedisHelper;
   @Override
    public Map<String, Object> deviceTypeSelect(String value) {

        //设备类型联动
        if (value.equals("deviceType")){
            //设备类型查询结果容器map
            Map<String,Object>  deviceMap = new HashMap<>();
            //检测缓存里面是否有
            if (iRedisHelper.getValue("deviceType")!= null){
                System.out.println("从缓存取数据");
                deviceMap = (Map<String,Object>)iRedisHelper.getValue("deviceType");
            }else {//缓存没有去数据库查
                List<DeviceType> deviceTypeList = deviceTypeMapper.getDeviceTypeList();
                Iterator deviceIterator = deviceTypeList.iterator();
                //遍历获取联动一级对象
                while(deviceIterator.hasNext()) {
                    DeviceType deviceType = (DeviceType)deviceIterator.next();
                    //遍历查询二级联动对象
                    List<DeviceSubType> deviceSubTypeList  = deviceSubTypeMapper.getsubTypeList(deviceType.getId());
                    List<String> deviceSubTypeCnList = new ArrayList<>();

                    Iterator subdeviceIterator = deviceSubTypeList.iterator();
                    while(subdeviceIterator.hasNext()) {
                        deviceSubTypeCnList.add(((DeviceSubType)subdeviceIterator.next()).getDevicesubtypecn());
                    }
                    deviceMap.put(deviceType.getDevicetypename(),deviceSubTypeCnList);
                    //iRedisHelper.hashGet("deviceType");

                }
                //把数据库查询的结果 放到缓存中
                iRedisHelper.valuePut("deviceType",deviceMap);
            }

            //System.out.println(deviceMap);
            return deviceMap;
        }
        //归属专业联动
        if (value.equals("belongedMajor")){
            //归属专业查询结果容器map
            Map<String,Object>  belongedMajorMap = new HashMap<>();
            //检测缓存里面是否有
            if (iRedisHelper.getValue("belongedMajor")!= null){
                System.out.println("从缓存取数据");
                belongedMajorMap = (Map<String,Object>)iRedisHelper.getValue("belongedMajor");
            }else {//缓存没有去数据库查
                List<BelongedMajor> belongedMajorList = belongedMajorMapper.getbelongedMajorList();
                Iterator belongedMajorIterator = belongedMajorList.iterator();
                //遍历获取联动一级对象
                while(belongedMajorIterator.hasNext()) {
                    BelongedMajor belongedMajor = (BelongedMajor)belongedMajorIterator.next();
                    //遍历查询二级联动对象
                    List<BelongedBusinessSys> belongedBusinessSysList  = belongedBusinessSysMapper.getsubbelongedMajorList(belongedMajor.getId());
                    //存放查询出来的businessSysCn
                    List<String> belongedBusinessCnList = new ArrayList<>();

                    Iterator belongedBusinessSysIterator = belongedBusinessSysList.iterator();
                    while(belongedBusinessSysIterator.hasNext()) {
                        belongedBusinessCnList.add(((BelongedBusinessSys)belongedBusinessSysIterator.next()).getBusinesssyscn());
                    }
                    belongedMajorMap.put(belongedMajor.getMajorcn(),belongedBusinessCnList);

                    //把数据库查询的结果 放到缓存中

                }
                iRedisHelper.valuePut("belongedMajor",belongedMajorMap);
            }

            //System.out.println(belongedMajorMap);
            return belongedMajorMap;
        }

        //厂家型号联动
        if (value.equals("deviceManufacturer")){
            //厂家型号结果容器map
            Map<String,Object>  deviceManufacturerMap = new HashMap<>();
            //检测缓存里面是否有
            if (iRedisHelper.getValue("deviceManufacturer")!= null){
                System.out.println("从缓存取数据");
                deviceManufacturerMap = (Map<String,Object>)iRedisHelper.getValue("deviceManufacturer");
            }else {//缓存没有去数据库查
                List<DeviceManufacturer> deviceManufacturerList = deviceManufacturerMapper.getdeviceManufacturerList();
                Iterator deviceManufacturerIterator = deviceManufacturerList.iterator();
                //遍历获取联动一级对象
                while(deviceManufacturerIterator.hasNext()) {
                    DeviceManufacturer deviceManufacturer = (DeviceManufacturer)deviceManufacturerIterator.next();
                    //遍历查询二级联动对象
                    List<DeviceManufacturerModel> deviceManufacturerModelList  = deviceManufacturerModelMapper.getdeviceManufacturerModelList(deviceManufacturer.getId());
                    //存放查询出来的businessSysCn
                    List<DeviceManufacturerModel> ModelList = new ArrayList<>();

                    Iterator deviceManufacturerModelIterator = deviceManufacturerModelList.iterator();
                    while(deviceManufacturerModelIterator.hasNext()) {
                        ModelList.add((DeviceManufacturerModel)deviceManufacturerModelIterator.next());
                    }
                    deviceManufacturerMap.put(deviceManufacturer.getManufacturercn(),ModelList);

                    //把数据库查询的结果 放到缓存中

                }
                iRedisHelper.valuePut("deviceManufacturer",deviceManufacturerMap);
            }

            //System.out.println(deviceManufacturerMap);
            return deviceManufacturerMap;
        }
        Map<String,Object>  ERRmap = new HashMap<>();
        ERRmap.put("ERR","系统有误请跟管理员联系");
        return  ERRmap;
    }
    
    

剩下的mapper 和sql 我就不详细说了 大都是很简单的查询了 。
我在这里只是想和大家分享一下我实践实现这个联动的方式,当然这个可能不是很好的实现方式,只是给大家提供一个思路,和大家探讨下;个人感觉这样搞就是回填的js写的比较麻烦一点其他都还好。嘻嘻!我也是才入行一年的菜鸡请大佬多多指教。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值