(四十四)数据字典-树状treeview树的实现

2023-10-31

数据字典-treeview树的实现


什么是数据字典?

顾名思义数据字典=数据+字典 ,字典是用来查询东西的,所以数据字典就是描述数据信息的集合.数据字典是一种通用的程序设计方法,程序中有很多主体,每个主体的都有很多属性,每种属性都有很多取值并且不断变化.

使用数据字典的优点: 1.简化了主体类的业务逻辑 2.高了系统的灵活性、通用性,减少了主体和属性的耦合度 3.使数据库表结构和程序结构条理上更清楚,更容易理解

数据字典表设计

1.二级数据字典设计方案 ,第一级:数据字典目录 第二级:数据字典明细

2.层次表设计,多级字典的设计


使用多级字典的设计使用树状结构


bootstrap-treeview插件

1.下载js插件

下载路径:https://www.jq22.com/jquery-info10461

官网路径:https://www.npmjs.com/package/bootstrap-treeview

2.引入项目中

<link rel="stylesheet" href="/static/js/plugins/bootstrap-treeview/bootstrap-treeview.min.css">
    <script src="/static/js/plugins/bootstrap-treeview/bootstrap-treeview.min.js"></script>

3.定义树状结构标签,对应好样式的id

4.加载树状结构数据

5.查询目录树中的数据,后台

观察结构

  • bootstrap-treeview格式
[
    //无子节点
    {
        text:"xxx"
    },
    //带子节点
    {
        text:"yyy",
        nodes:[
            {
                text:"yyy子节点"
            },
            {
                text:"yyy子节点"
            }
        ]
    }
]
  • 数据字典表结构数据

在这里插入图片描述

[
    {
        id:1,
        name:"业务",
        sn:"business",
        intro:"..."
        parent_id:null,
        parent_name:null,
        children:[
            {
        		id:2,
                name:"车险",
                sn:"",
                intro:"..."
                parent_id:1,
                parent_name:"业务",
    		},{
                id:3,
                name:"财产险",
                sn:"",
                intro:"..."
                parent_id:1,
                parent_name:"业务",
            }      
        ]
    }
]
观察表结构,进行数据查询
    bootstrap-treeview数据结构,带有明显的层级结构,通过观察结构基本一致,区别在于
    treeview属性 text 跟 nodes  数据字典表数据是name,children

按照bootstrap-treeview插件要求,对数进行处理,实现树状结构,所以我们需要思考的是将表结构的name和children替换成插件结构中的text 跟 nodes

  1. 我们可以直接将表名中的替换成bootstrap-treeview数据结构中的属性即可,但是后期改的话会很麻烦(不推荐)

  2. 使用Map方式替换(推荐)

思考:如何进行转换?

方案二: 使用Map替换,进行数据改造
    1.使用JSON.toString()把集合对象变成JSON格式字符串
    2.再利用字符串的replaceAll的替换方法,将name替换成text,children替换为nodes
    3.替换完后,把json格式字符串转回集合对象
      //参数1:list集合json格式字符串,参数2:集合泛型
      通过JSON.parseArray(str,Map.class) 

思路:

  • 通过观察,父节点(parent_id)都为null,可以通过查询顶级目录parent_id=null的数据
  • 通过遍历所有数据拿到根节点,查询所有(儿子)子节点
  • 进行数据转换
  • 页面的treeview插件用到属性 text 跟 nodes,而查询出来的数据是name,children

实现部分代码

  • SystemDictionaryController控制器
@Controller
@RequestMapping("/systemDictionary")
public class SystemDictionaryController {

    @Autowired
    private ISystemDictionaryService systemDictionaryService;

    //处理分页查询页面请求
    @RequestMapping("/list")
    public String list(@ModelAttribute("qo") SystemDictionaryQueryObject qo, Model model){
        PageInfo<SystemDictionary> pageInfo = systemDictionaryService.query(qo);
        model.addAttribute("pageInfo",pageInfo);
        return "systemDictionary/list";
    }


//获取树状结构数据 异步
    @RequestMapping("/treeData")
    @ResponseBody
    public List<Map> treeData(){
        return systemDictionaryService.queryTreeData();
    }

}
  • ISystemDictionaryService实现接口
//查询树状结构的数据
List<Map> queryTreeData();
  • SystemDictionaryServiceImp接口实现类
@Override
    public List<Map> queryData() {
        //查询parent_id为null的父节点
        //查询所有数据
        List<SystemDictionary> all = systemDictionaryMapper.selectAll();
        ArrayList<SystemDictionary> list = new ArrayList<>(); //存储节点
        //遍历所有数据
        for (SystemDictionary systemDictionary : all) {
            //判断parent_id是否为空
            if (systemDictionary.getParentId() == null) {
                //如果是空,那就加进list集合,拿到根节点
                list.add(systemDictionary);
                //拿到二级节点,这样只能拿到二级
               // systemDictionary.setChildren(findChildren(all,systemDictionary.getId()));
            }
            //想要要全部 下级节点,需要进行不断的拿自己节点,可以使用递归,定义一个方法
            allChildren(all,list);        

        }
        //数据转换.把list集合转成JSON格式的字符串
        String str = JSON.toJSONString(list);
        //转成字符串,name,children
        str=str.replaceAll("name","text").replaceAll("children","nodes");
        //替换后,转成Map集合
        List<Map> maps = JSON.parseArray(str, Map.class);
        return maps;
    }

-----------------------------------------------------------------------------
    //找子节点的方法,把子节点添加到父节点中
    public List<SystemDictionary> findChildren(List<SystemDictionary> all ,Long parentId) {
        ArrayList<SystemDictionary> list = new ArrayList<>(); //存储节点
        //遍历所有数据
        for (SystemDictionary children : all) {
            //判断如果自己拿到的parentId,等于我传入跟节点的id,那就加进list集合中
            if (children.getParentId()==parentId){
                list.add(children);
            }
        }
        return list;
    }

-------------------------------------------------------------------------------
    /**
     * 参数一:全部数据 ,参数二:全部儿子对象集合
     * @param all
     * @param children
     */
    private void allChildren(List<SystemDictionary> all, List<SystemDictionary> children) {
        //对儿子进行判断,为空就不拿了
        if (children==null ||children.size()==0){
            return;
        }

        //如果还有儿子, 那就调用找儿子的方法,找到子节点(儿子)
        for (SystemDictionary child : children) {
            child.setChildren(findChildren(all,child.getId()));

            //儿子的儿子....
            //递归
            allChildren(all,child.getChildren());
        }
    }
  • list页面实现
<script>
        $(function () {
            var tree;  //抽出tree,存的是一个jQuery对象
            $.get("/systemDictionary/treeData", function (data) {
                tree = $('#treeview-searchable').treeview({
                    color: "#428bca",
                    //levels: 1,
                    data: [{text: "数据字典", nodes: data}],
                    onNodeSelected: function (event, node) { //节点选中触发事件
                        if (node.id == undefined) {
                            return;
                        }
                        //console.log(node);
                        //拿到node.id是用来查询数据库的数据,拿到nodeId是为了点击查询后,进行下一步回显
                        window.location.href = '/systemDictionary/list?parentId=' + node.id + '&nodeId=' + node.nodeId;
                    }
                });

                //选中当前节点,点击的节点
                tree.treeview('selectNode', [${qo.nodeId}, {silent: true}]);
                //展开给点节点
                tree.treeview('expandNode', [${qo.nodeId}, {silent: true}]);
                //如果只是点击当前节点并展开,也只是展开一层,我们需要点击下一层怎么办?


                if ('${qo.nodeId}' != 0) {
                    var node = tree.treeview('getNode', ${qo.nodeId}); //返回当前节点的id

                    while (node.parentId) {
                        var parent = tree.treeview('getParent', node);//返回当前给定节点的父节点
                        tree.treeview('expandNode', [parent, {silent: true}]); //展开当前节点
                        node = tree.treeview('getNode', node.parentId); //返回当前节点的id
                    }

                }
            });
 });
    </script>

最后展示效果
在这里插入图片描述

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

(四十四)数据字典-树状treeview树的实现 的相关文章

  • 使用 .NET 2.0 解析 JSON

    想要改进这篇文章吗 提供此问题的详细答案 包括引用和解释为什么你的答案是正确的 不够详细的答案可能会被编辑或删除 我有一个用 C 编写的应用程序 带有 NET Framework 2 0 版本 不幸的是 我无法选择更新到较新版本的 NET
  • 如何在JUnit测试中将MockWebServer端口设置为WebClient?

    我在用着spring boot with WebClient 它被自动装配为一个 bean 问题 写一个junit集成测试 我必须使用okhttpMockWebServer 该模拟始终在随机端口上启动 例如localhost 14321 N
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • 如何使用java避免Mysql数据库中的“数据因列被截断”?

    在我的 Java 程序中 Hibernate Bean 类定义一列 例如 TimtableVO java Column name REPEAT DAYS private WeekdayType repeatDays hear Weekday
  • 嵌套枚举是静态的吗?

    读书时这个问题 https stackoverflow com questions 25011061 why can enum implementations not access private fields in the enum cl
  • Stream#limit 返回的元素是否可以少于预期?

    如果流s下面至少有n元素 流在什么情况下sLimit可能少于n元素 如果有的话 Stream sLimit s limit n 提问原因 在这个答案 https stackoverflow com a 28082107 829571 我读到
  • 如何使用 JAVA 和 ADB 命令检查 Appium 中键盘是否打开

    我正在尝试检查 Android 默认键盘是否打开 我没有找到任何可以在 Appium 中使用 JAVA 和 ADB 命令检查键盘的内容 我发现这个 ADB 命令可以检查键盘是否打开 adb shell dumpsys input metho
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • 当另一个线程发生事情时从主线程获取数据?

    目前我有一个线程正在运行一个侦听连接的套接字 当它收到连接时 它需要上传在主线程中收集的数据 即从主线程获取数据 但是 我传递了对象的实例 但它从未使用等待连接时收集的数据进行更新 有没有正确的方法来做到这一点 我用谷歌搜索了一下 似乎找不
  • Jar Manifest 文件的使用混乱

    我正在阅读使用 jar 工具打包 java 应用程序 我注意到 META INF 目录下创建了一个清单文件 对于一个简单的应用程序来说 感觉它没有任何作用 我在 stackoverflow 上搜索以了解 Manifest 文件的用法 我碰到
  • Google App Engine数据存储区字符串编码问题

    你好 我正在使用 Google App Engine 进行一个项目 并且需要存储一些字符串 我正在使用 Java 和JDOHelper getPersistenceManagerFactory transactions optional 在
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • spring-boot-starter-web 2.4.4 导入 spring-web 和 spring-webmvc 版本 4.3.12 在 pom 中列为 5.3.5

    我正在使用spring boot starter web我的项目中的版本2 4 4 当我查看其内容时 它清楚地列出了 spring web 和 spring webmvc 5 3 5 版本 但是 由于某种原因 我可以看到这个 spring
  • 将 JSON 文件拆分为单独的文件

    我有一个大的 JSON 文件 它是对象的对象 我想将其拆分为对象键后的单独文件名 是否可以使用 jq 或任何其他现成工具来实现这一目标 原始 JSON 格式如下 item1 item2 鉴于此输入 我想生成文件 item1 json ite
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • JBoss 5 截断 base64 cookie 字符串的尾部 =

    从 JBoss 4 升级到 JBoss 5 后 我注意到最烦人的回归 它截断 base64 cookie 值的尾部等号 我花了很长时间才明白问题不是我的代码而是 JBoss 的 我用 google 搜索了一下 发现这是一个已知的问题issu
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • 用于从链表中删除元素的大 O 表示法[重复]

    这个问题在这里已经有答案了 我正在阅读有关链接列表的内容 我发现 从链表中删除所需的元素需要 O n 运行时间 其中 n 是元素的数量 列表中的元素 http www cs mcgill ca dprecup courses IntroCS
  • Java applet 是否会违反同源策略

    我需要请求一些东西并从其他域获取信息 我知道由于同源政策 javascript 无法做到这一点 我的另一个选择是通过我的服务器发出代理请求 我不希望请求来自我的服务器的 IP 也不想为我的服务器创建额外的负载 并且希望客户端这样做 是否可以

随机推荐

  • 本地ubuntu22.04装cuda11.7+torch2.0.1流程记录

    想要更新cuda11 7 需要的驱动最低版本515 65 01 而我的电脑原驱动为470 需要更新 1 卸载原驱动 使用了命令 sudo apt get purge nvidia sudo apt get autoremove 用以下命令检
  • MATLAB矩阵乘法14例

    MATLAB矩阵乘法14例 简介 矩阵乘法是线性代数中的基本运算之一 也是MATLAB中的重要运算 矩阵乘法的结果是两个矩阵的乘积 其中一个矩阵的列数等于另一个矩阵的行数 在这篇文章中 我们将介绍20个MATLAB矩阵乘法的例子 帮助您更好
  • 什么是自动化测试框架?我们该如何搭建自动化测试框架?

    无论是在自动化测试实践 还是日常交流中 经常听到一个词 框架 之前学习自动化测试的过程中 一直对 框架 这个词知其然不知其所以然 最近看了很多自动化相关的资料 加上自己的一些实践 算是对 框架 有了一些理解 这篇博客 就聊聊自动化框架的一些
  • 根因定位FluxRank论文通过核密度估计(KDE)获得变化量部分

    II CHANGE QUANTIFICATION CHANGE QUANTIFICATION说明 A 变化开始时间 B 变化程度 论文 FluxRank A Widely Deployable Framework to Automatica
  • Mybatis之分页插件PageHelper工作原理

    前言 数据分页功能是软件系统中必备的功能 在持久层使用mybatis的情况下 pageHelper来实现后台分页则是我们常用的一个选择 所以本文专门介绍下 需要的依赖
  • Spring Boot 实现用户行为记录的四种方式

    目录 一 需求背景 二 需要的pom依赖 三 AOP切面编程实现 四 Interceptor拦截器实现 五 Filter过滤器实现 六 ArgumentResolver 七 拓展部分 八 参考文献 一 需求背景 根据产品经理要求 需要对用户
  • npx mkdirp命令

    npx是什么 npx 是 npm v5 2 0引入的一条命令 更方便开发者使用包内提供的命令行工具 ep1 npm原方式 npm install g create react app create react app my app npx方
  • 行为型模式-状态模式(State)

    概述 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 定义 状态模式的核心理念就是将不同状态对应的行为封装到状态中 在状态变化时改变依赖状态对象的行为 那种在一个方法内对状态进行多重判断的方式 虽然可以根据不同的状态
  • Android系统启动流程(八)——Launcher启动

    1 概述 Launcher是Android的桌面应用 也是一个系统初始化完成之后自动拉起的应用 Launcher会在SystemServer进程初始化完成之后 在ActivityManagerService的systemReady方法中开始
  • 图算法(二十五):子图匹配(Subgraph Matching)【基本的图查询操作,意在发掘图重要的子结构】【适用场景:社交网络分析、群体发现、异常检测】【在一个给定的大图里找到与给定小图同构的子图】

    一 概述 子图匹配 subgraph matching 算法的目的是在一个给定的大图里面找到与一个给定小图同构的子图 这是一种基本的图查询操作 意在发掘图重要的子结构 适用场景 子图匹配 subgraph matching 算法适用于社交网
  • Routh-Hurwitz Criterion 劳斯稳定判据

    Routh Hurwitz Criterion 为什么仅仅要有一个极点在右半平面 那么系统就不会稳定 比如H s 1 s 1 1 s 3 1 s 2 这里有个极点s 2 在有半平面 通过laplace 反变换能够知道 当时间足够长的时候 A
  • [Unity]Crest Ocean System增加海面透明度

    原因 插件没有设置海面透明度的功能 修改shader可以修改透明度 解决方案 关键代码 Shader Ocean shader Shader Crest Ocean SubShader Pass half4 Frag const Varyi
  • FreeSwitch模式:Inbound和Outbound的区别

    14 Inbound和Outbound Outbound模式相较于嵌入式语言相比更强大 适合控制单腿的呼叫 实现复杂的IVR应用 而Inbound更适合接收所有的事件 与多条腿进行交互 进行更复杂的呼叫控制 其中 在Outbound模式中
  • 面试系列之线程篇

    线程和进程 进程是资源分配和调度的最小独立单元 线程是CPU调度的基本单元 一个进程可以包含多个线程 多个线程共享该进程的资源 线程可以看作是轻量级的进程 进程间通信的方式 volatile synchronized wait notify
  • 字符串学习&总结(感觉主要是总结模板)

    目录 前言 一 哈希 导读 HASH模板 哈希 双哈希 hash应用 hash牛逼克拉斯 0 核心操作 求子串哈希值 1 字符串匹配 2 允许k次失配的字符串匹配 3 最长回文子串 hash操作简单 可解决的问题有点多啊 nice 4 最长
  • 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

    RPC Remote Procedure Call 服务 也即远程过程调用 在互联网企业技术架构中占据了举足轻重的地位 尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下 RPC 更扮演了重要角色 Google 开源了 gRPC F
  • Grpc demo java 实现

    环境 JDK8 Maven3 6 3 我的 Grpc java demo https github com 999bug grpc java 记得star 搭建步骤 1 利用代码编译器创建maven 项目 2 添加依赖坐标
  • python自动化之models 进阶操作二

    PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET def all self 获取所有的数据对象 def filter self args kwargs 条件查询 条
  • hive--分组排序函数

    分组排序 最主要的区别就是如果两个分数相同 排名是否同列以及排名是否相同 这个方法仅在mysql8 0以后 hive或其他数据库支持 直接看图 原始表 原表如上 想要的结果如下 从图中可以发现 row number函数 如果并列但名次反而不
  • (四十四)数据字典-树状treeview树的实现

    数据字典 treeview树的实现 什么是数据字典 顾名思义数据字典 数据 字典 字典是用来查询东西的 所以数据字典就是描述数据信息的集合 数据字典是一种通用的程序设计方法 程序中有很多主体 每个主体的都有很多属性 每种属性都有很多取值并且