级联菜单的动态实现(数据库绑定)

2023-11-17

效果预览

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

数据库设计
第一类型:
第一类型

第二类型:
第二类型

第三类型:
第三类型

Controller层代码

@RequestMapping("/noFilterGetAllInfo")
public void noFilterGetAllInfo(Integer firstSelected,Integer secondSelected,HttpServletRequest request , HttpServletResponse response){
    Map<String, Object> resultMap = new  HashMap<String, Object>();
    GoodsTypeFirst first = new GoodsTypeFirst();
    try {
        //第一类型
        List<GoodsTypeFirst> firstList = goodsTypeFirstService.getEntity(first);
        resultMap.put("firstList", firstList);
        if (firstList.size()>0) {
            GoodsTypeSecond second = new GoodsTypeSecond();
            if(null != firstSelected){
                //firstSelected为对应的GoodsTypeFirst.id
                second.setGoodsTypeFirstId(firstSelected);
            }else{
                second.setGoodsTypeFirstId(firstList.get(0).getId());
            }
            //第二类型
            List<GoodsTypeSecond> secondList = goodsTypeSecondService.getEntity(second);
            resultMap.put("secondList", secondList);
            if(secondList.size()>0){
                GoodsTypeThird third = new GoodsTypeThird();
                if(null != secondSelected){
                    //secondSelected为对应的GoodsTypeSecond.id
                    third.setGoodsTypeSecondId(secondSelected);
                }else{
                    third.setGoodsTypeSecondId(secondList.get(0).getId());
                }
                //第三类型
                List<GoodsTypeThird> thirdList = goodsTypeThirdService.getEntity(third);
                resultMap.put("thirdList", thirdList);
            }
        }
        resultMap.put(Constants.CODE, Constants.CODE_VALUE_SUCCESS);
    } catch (BaseServiceException e) {
        ExceptionHandler.handle(logger, e, "关联关系,查询资源出错!!!");
        resultMap.put(Constants.CODE, Constants.CODE_VALUE_FAILURE);
    }
    //工具类,用于将map转换为JSON数据
    JSONUtil.writeJSONString(response, resultMap);
}

JS代码

$(function(){
    //访问数据库,得到(默认选中第一项下的)三级菜单详情
    $.ajax({
        type : "POST",
        url : "admmodular/inventory/noFilterGetAllInfo.do",
        success : function(result) {
            //循环遍历得到的模块名称,动态添加到html中
            var results = eval("("+result+ ")");

            //第一类型下拉列表,onchange="changeFirst()"表示改变选项,这样将会动态改变后级菜单的值
            var firstList = '<select name="select1" id="select1" onchange="changeFirst()">';
            for (var i = 0; i < results.firstList.length; i++) {
                firstList +='<option name="firstType" value="'+results.firstList[i].id+'" >'+results.firstList[i].typeName+'</option>'
            }
            firstList +='</select>'

            //第二类型下拉列表,onchange="changeSecond()"表示改变选项,这样将会动态改变后级菜单的值
            var secondList = '<select name="select2" id="select2" onchange="changeSecond()">';
            for (var i = 0; i < results.secondList.length; i++) {
                secondList +='<option name="secondType" value="'+results.secondList[i].id+'" >'+results.secondList[i].typeName+'</option>'
            }
            secondList +='</select>'

            //第三类型下拉列表,最后一级菜单,改变选项不会影响其它地方
            var thirdList = '<select name="select3" id="select3">';
            for (var i = 0; i < results.thirdList.length; i++) {
                thirdList +='<option name="thirdType" value="'+results.thirdList[i].id+'" >'+results.thirdList[i].typeName+'</option>'
            }
            thirdList +='</select>'
        }
        //点击按钮时,将菜单显示在弹出窗口中
        $('#add').on('click',function(){
                layer.open({
                  type: 1,
                  title:"增加入库条目",
                  skin: 'demo-class', //加上边框
                  area: ['500px', '280px'], //宽高
                  content: '<form id="inventoryAdddialog" name="" method="post">'+
                                '<label for="type">' +
                                    '<span>类型</span>' +
                                    firstList + secondList +thirdList +
                                '</label>' + 
                                  '<label for="number">' +
                                   '<span>数量</span>' +
                                   '<input id="number" name="number" type="text">' +
                                 '</label>' + 
                           '</form>',
                })
        })
    })
})
//改变第一类型时,改变第二类型列表和第三类型列表
function changeFirst(){
    //第一类型选中项
    var firstSelected =  $('#select1 option:selected').val();
    //若第一类型选中项不为第一个,则没有第二类型与第三类型而多一个输入框,需要移除选择框,增加输入框
    if(firstSelected != 1){
        $("#select2").remove();
        $("#select3").remove();
        if($("#itemName").val() == undefined){
            var input1 = '<div id="itemNameBox" style="float:right;">物品名称<input id="itemName" name="itemName"></input></div>';
            $("#select1").after(input1);
        }
    }else{
        //若第一类型选中项为第一个,则需要移除输入框,增加选择框
        $("#itemNameBox").remove();
         var select23 = '<select name="select2" id="select2" onchange="changeSecond()"></select><select name="select3" id="select3"></select>';
         $("#select1").after(select23);
         //获得当前选中项的下级菜单
        $.ajax({
               type: "POST",
               url: "admmodular/inventory/noFilterGetAllInfo.do",
               data: "firstSelected="+firstSelected,
               success: function(result){
                   var results = eval("(" +result+ ")");
//                 $("#select2").find("option").remove();
                  if (results.code == 1) {
                        var html;
                        if (results.secondList.length>0) {
                            for (var i = 0; i < results.secondList.length; i++) {
                                html+='<option value="'+results.secondList[i].id+'">'+results.secondList[i].typeName+'</option>'
                            }
                               $("#select2").append(html)
                        }else{
                           $("#select2").append("<option value='0'>请选择</option>")
                        }
                    }else{
                           $("#select2").append("<option value='0'>请选择</option>")
                    }
                    //移除第三类型的值,再加入新的值
                  $("#select3").find("option").remove();
                  if (results.code == 1) {
                        /*不写null时,会直接使用上面的html,不会覆盖,即重新定义不会覆盖*/
                        var html = null;
                        if (null != results.thirdList && results.thirdList.length>0) {
                            for (var i = 0; i < results.thirdList.length; i++) {
                                html+='<option value="'+results.thirdList[i].id+'">'+results.thirdList[i].typeName+'</option>'
                            }
                               $("#select3").append(html)
                        }else{
                           $("#select3").append("<option value='0'>请选择</option>")
                        }
                    }else{
                           $("#select3").append("<option value='0'>请选择</option>")
                    }
                }
            });
    }
}
//改变第二类型时,修改第三类型的值
function changeSecond(){
    //选中项所对应的typeCode
    var firstSelected =  $('#select1 option:selected').val();
    var secondSelected =  $('#select2 option:selected').val();
    //查询出对应的资源
    $.ajax({
           type: "POST",
           url: "admmodular/inventory/noFilterGetAllInfo.do",
           data: "firstSelected="+firstSelected+"&secondSelected="+secondSelected,
           success: function(result){
               var results = eval("(" +result+ ")");
               //移除第三类型的值,并加入新的值
              $("#select3").find("option").remove();
              if (results.code == 1) {
                    /*不写null时,会直接使用上面的html,不会覆盖,即重新定义不会覆盖*/
                    var html = null;
                    if (null != results.thirdList && results.thirdList.length>0) {
                        for (var i = 0; i < results.thirdList.length; i++) {
                            html+='<option value="'+results.thirdList[i].id+'">'+results.thirdList[i].typeName+'</option>'
                        }
                           $("#select3").append(html);

                    }else{
                       $("#select3").append("<option value='0'>请选择</option>");
                    }
                }else{
                       $("#select3").append("<option value='0'>请选择</option>");
                }
            }
    })
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

级联菜单的动态实现(数据库绑定) 的相关文章

随机推荐

  • Cocos2d-x学习笔记(二) 永远的HelloWorld

    HelloCpp是Cocos2d x自带的一个工程 它演示了Cocos2d x最基本的使用方法和流程 先看一下它的基本构成 win32目录中包含了对应平台的代码 而Classes目录中包含了我们自己的实现代码 编译运行的结果如下图 main
  • mybatis中操作json类型数据

    mysql使用json类型字段保存数据 使用mybatis进行新增 查询操作 实现字段映射转换 自定义TypeHandler package com xxx xxx handler import java io IOException im
  • 七、IDEA的maven项目的netty包的导入(其他jar同)

    在这之前要有搭建好maven的环境 可以参考上一篇 1 2 选择Modules 3 4 等待一会选择 Download to可以不用勾选 下载的jar会放在本地的jar仓库里 如果勾选了则会在该项目下创建一个lib文件 并且将包放里面 5
  • 生成对抗网络(GANs)系列:KL散度和JS散度

    1 香农信息量 信息熵和交叉熵 只考虑连续型随机变量的情况 设p为随机变量X的概率分布 即p x 为随机变量X在X x处的概率密度函数值 随机变量X在x处的香农信息量定义为 其中对数以2为底 这时香农信息量的单位为比特 香农信息量用于刻画消
  • 【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结

    欢迎各位看官 目录 1 栈的定义 2 栈的基本操作 2 1创建 2 2销毁 2 3插入Push 2 4删除Pop 2 5获得栈顶元素GetTop 2 6判空 2 7清空栈 3 C语言实现栈 4 顺序栈 4 1数组实现顺序栈 4 2链表实现顺
  • 【毕业设计】单片机 图像分类 智能识别机器人 - 物联网 深度学习 AI

    文章目录 0 前言 1 项目背景 2 在 Arduino IDE 上安装 ESP32 Cam 3 用 BLINK 测试电路板 4 测试 WiFi 5 测试相机 6 运行你的网络服务器 7 水果与蔬菜 图像分类 8 结论 9 最后 0 前言
  • Element Ruoyi 若依跳转后没有滚动条

    Vue Element Ruoyi 若依跳转后页面没有滚动条的解决办法 页面 路由跳转后 body 的内联样式变成 overflow hidden 在src main js中增加一下代码 解决bug 页面 路由跳转后 滚动条消失 页面无法滚
  • DI/IOC

    控制反转 依赖注入 主要说的是通过java的反射机制将xml文件解析 主动解释依赖关系 并实例化相关bean package com bjsxt spring import java lang reflect Method import j
  • 智能合约转java_第四章 自定义sol合约转化java代码,并实现调用

    鉴于笔者以前各大博客教程都有很多人提问 早期建立一个技术交流群 里面技术体系可能比较杂 想了解相关区块链开发 技术提问 请加QQ群 538327407 准备工作 1 官方参考说明文档 2 已经在ubuntu 上搭建好FISCO BCOS 底
  • 快慢指针之练习【2】

    学习安排根据 代码随想录 leetcode 283 移动零 思路 1 直接从大到小排序 不可 需保持原来的相对顺序 2 快慢指针 如何将0移位 gt 快慢指针 赋值 代码 class Solution public void moveZer
  • Java设计模式

    一 采用设计模式的目的 二 设计模式的七大设计原则 三 常见的设计模式
  • 通过命令行开启和关闭oracle

    1 启动oracle10g 建一个以bat结尾的文件 内容为 net start OracleServiceORCL net start OracleORADB10gTNSListener 2 关闭oracle10g 建一个以bat结尾的文
  • 西门子PLC中如何解决流量累积问题

    现在上位机系统中很多要求具备流量计的流量累计功能 由此引出的几个问题 期望与大家分享 问题1 自行编写流量累计程序 自行编写流量累计程序的原理 其实就是积分的最原始算法概念 把单位小间隔时间内的瞬时流量乘以单位间隔时间 得到单位小间隔时间内
  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • layout注意事项_注意事项

    layout注意事项 In the post we will look at how you can orchestrate real time customer journeys with Adobe s Journey Orchestr
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • from: can't read /var/mail/xxx 解决方法

    在执行一个发包脚本的时候 遇到了如下问题 from can t read var mail scapy all 原因 脚本是没有问题的 但它并不是可以被python执行的可执行文件 解决方法 1 使用python 脚本名字 命令执行脚本 2
  • k210自学快速入门(附网址)

    一 获得下载工具IDE https dl sipeed com MAIX MaixPy ide 安装和配置见该博客 http t csdn cn 464lj 二 下载固件 1 用于程序的执行下载站 Sipeed 注意 minimum是最小版
  • sqlalchemy create_engine关于连接池的几个参数

    pool size 设置连接池中 保持的连接数 初始化时 并不产生连接 只有慢慢需要连接时 才会产生连接 例如我们的连接数设置成pool size 10 如果我们的并发量一直最高是5 那么我们的连接池里的连接数也就是5 当我们有一次并发量达
  • 级联菜单的动态实现(数据库绑定)

    效果预览 数据库设计 第一类型 第二类型 第三类型 Controller层代码 RequestMapping noFilterGetAllInfo public void noFilterGetAllInfo Integer firstSe