下拉选择框 多级联动动态显示实例 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写的比较麻烦一点其他都还好。嘻嘻!我也是才入行一年的菜鸡请大佬多多指教。