若依生成树表和下拉框选择树表结构(在其他页面使用该下拉框输入)

news2025/1/12 3:06:53

1.数据库表设计

  • 生成树结构的主要列是id列和parent_id列,后者指向他的父级
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a945bf568f9d45c98cd96407fbb0f3d3.png

2.来到前端代码生成器页面

  • 导入你刚刚写出该格式的数据库表
    在这里插入图片描述

3.点击编辑,来到字段

  • 祖籍列表是为了好找到直接父类,不属于代码生成器方法,需要后台编写
    在这里插入图片描述

4.改变生成结构为树表结构

在这里插入图片描述

5.提交然后生成代码并复制到对应目录当中

6.修改serviceImpl当中插入修改方法

    /**
     * 新增原料
     *
     * @param tIngredient 原料
     * @return 结果
     */
    @Override
    public int insertTIngredient(TIngredient tIngredient) {
        TIngredient info = tIngredientMapper.selectTIngredientById(tIngredient.getParentId());
        // 如果父节点不为正常状态,则不允许新增子节点
        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
            throw new ServiceException("原料类型停用,不允许新增");
        }
        tIngredient.setAncestors(info.getAncestors() + "," + tIngredient.getParentId());
        tIngredient.setCreateTime(DateUtils.getNowDate());
        return tIngredientMapper.insertTIngredient(tIngredient);
    }

    /**
     * 修改原料
     *
     * @param tIngredient 原料
     * @return 结果
     */
    @Override
    public int updateTIngredient(TIngredient tIngredient) {
        TIngredient newParentDept = tIngredientMapper.selectTIngredientById(tIngredient.getParentId());
        TIngredient oldDept = tIngredientMapper.selectTIngredientById(tIngredient.getId());
        if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) {
            String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getId();
            String oldAncestors = oldDept.getAncestors();
            tIngredient.setAncestors(newAncestors);
            updateDeptChildren(tIngredient.getId(), newAncestors, oldAncestors);
        }
        tIngredient.setUpdateTime(DateUtils.getNowDate());
        int result = tIngredientMapper.updateTIngredient(tIngredient);
        if (UserConstants.DEPT_NORMAL.equals(tIngredient.getStatus()) && StringUtils.isNotEmpty(tIngredient.getAncestors())
                && !StringUtils.equals("0", tIngredient.getAncestors())) {
            // 如果该部门是启用状态,则启用该部门的所有上级部门
            updateParentDeptStatusNormal(tIngredient);
        }

        return result;
    }

  • 用到了两个额外对数操作方法,联动子父级菜单的修改
    /**
     * 修改该部门的父级部门状态
     *
     * @param tIngredient 当前部门
     */
    private void updateParentDeptStatusNormal(TIngredient tIngredient) {
        String ancestors = tIngredient.getAncestors();
        Long[] deptIds = Convert.toLongArray(ancestors);
        tIngredientMapper.enableTIngredientByIds(deptIds);
    }

    /**
     * 修改子元素关系
     *
     * @param deptId       被修改的部门ID
     * @param newAncestors 新的父ID集合
     * @param oldAncestors 旧的父ID集合
     */
    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
        List<TIngredient> children = tIngredientMapper.selectChildrenTIngredientById(deptId);
        for (TIngredient child : children) {
            child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
        }
        if (children.size() > 0) {
            tIngredientMapper.updateTIngredientChildren(children);
        }
    }

生成完毕,额外处理自己表中数据也是在新增或者修改当中写

来到想要使用的前端页面(其他页面使用)

1.导入依赖

  • 第一个依赖是生成树的请求
  • 第二个组件是vue.js的树形选择组件
  • 第三个是树形组件的css样式
import { listIngredient } from "@/api/bases/ingredient";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";

2.注册树形组件

  components: {
    Treeselect
  },

在这里插入图片描述

3.要使用的核心方法

    /** 查询原料下拉树结构 */
    getTreeselect () {
      listIngredient().then(response => {
        this.ingredientOptions = [];
        const data = { id: 0, ingredientName: '顶级节点', children: [] };
        data.children = this.handleTree(response.data, "id", "parentId");
        this.ingredientOptions.push(data);
      });
    },
    /** 转换原料数据结构 */
    normalizer (node) {
      if (node.children && !node.children.length) {
        delete node.children;
      }
      return {
        id: node.id,
        label: node.ingredientName,
        children: node.children
      };
    },

4调用方法,我是通过新增按钮来实现的

    /** 新增原料操作 */
    handleAddIngredientVO () {
      this.reset();
      this.getTreeselect();
      this.openAddIngredientVO = true;
      this.titleAddIngredientVO = "添加产品原料";
    },

5.调用方法的下拉框表单

            <!-- 新增或者修改原料 -->
            <el-dialog
              :title="titleAddIngredientVO"
              :visible.sync="openAddIngredientVO"
              width="500px"
              append-to-body
            >
              <el-form
                ref="formVO"
                :model="formVO"
                :rules="rules"
                label-width="80px"
              >
                <el-form-item
                  label="产品编码"
                  prop="breedId"
                >
                  <el-input
                    v-model="formVO.breedId"
                    placeholder="请输入产品编码"
                  />
                </el-form-item>
                <el-form-item
                  label="父级"
                  prop="materialId"
                >
                  <treeselect
                    v-model="formVO.materialId"
                    :options="ingredientOptions"
                    :normalizer="normalizer"
                    :disable-branch-nodes="true"
                    placeholder="请选择原料"
                  />
                </el-form-item>
                <el-form-item
                  label="kg/每米"
                  prop="remark"
                >
                  <el-input
                    v-model="formVO.remark"
                    placeholder="请输入每米多少千克"
                  />
                </el-form-item>
              </el-form>
              <div
                slot="footer"
                class="dialog-footer"
              >
                <el-button
                  type="primary"
                  @click="submitForm"
                >确 定</el-button>
                <el-button @click="cancel">取 消</el-button>
              </div>
            </el-dialog>

  • **重点**
    在这里插入图片描述

6.附treeselect组件常用属性

<treeselect
      :multiple="true"
      v-model="form.postIds"//多选id值可赋值可传给后台
      :options="postOptions"//下拉树桩多选框的数据
      :show-count="true"//展示下拉总数数据
      :flat="true"//设置平面模式(选中的标签不联动子节点和父节点)
      :limit="5"//展示多选的标签个数
      :limitText="count => `及其它${count}项`"//多选的超出文字展示方式
      :auto-deselect-descendants="true"//取消节点时,取消其接点的子节点(仅可在平面模式下使用)
      :auto-select-descendants="true"//选择节点时,取消其接点的子节点(仅可在平面模式下使用)
      placeholder="请选择区域"
     :disable-branch-nodes="true"//只能选择末级节点
    />

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1661267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode例题讲解:876.链表的中间结点

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;值为 3 。…

一篇详解Git版本控制工具

华子目录 版本控制集中化版本控制分布式版本控制 Git简史Git工作机制Git和代码托管中心局域网互联网 Git安装基础配置git的--local&#xff0c;--global&#xff0c;--system的区别 创建仓库方式1git init方式2git clone git网址 工作区&#xff0c;暂存区&#xff0c;本地仓库…

2023盘古石晋级赛 移动终端取证 WP

9. 根据容恨寒的安卓手机分析&#xff0c;MAC的开机密码是[答案&#xff1a;asdcz] 到这里火眼就寄了&#xff0c;盘古石 启动&#xff01; 10. 根据容恨寒的安卓手机分析&#xff0c;苹果手机的备份密码前4位是[答案&#xff1a;1234] 11. 根据魏文茵苹果手机分析&#xff0c…

基于JAVAEE的停车场管理系统(论文 + 源码)

【免费】基于JAVAEE的停车场管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89292324 基于JAVAEE的停车场管理系统 摘 要 如今&#xff0c;我国现代化发展迅速&#xff0c;人口比例急剧上升&#xff0c;在一些大型的商场&#xff0c;显得就格外拥挤&…

算法设计与分析 动态规划/回溯

1.最大子段和 int a[N]; int maxn(int n) {int tempa[0];int ans0;ansmax(temp,ans);for(int i1;i<n;i){if(temp>0){tempa[i];}else tempa[i];ansmax(temp,ans);}return ans; } int main() {int n,ans0;cin>>n;for(int i0;i<n;i) cin>>a[i];ansmaxn(n);co…

Spring添加注解读取和存储对象

5大注解 Controller 控制器 Service 服务 Repository 仓库 Componet 组件 Configuration 配置 五大类注解的使用 //他们都是放在同一个目录下&#xff0c;不同的类中 只不过这里粘贴到一起//控制器 Controller public class UserController {public void SayHello(){System.ou…

在新页面中跳转到指定 div容器位置

要在打开新的页面时跳转到指定 div&#xff0c;我们需要结合 HTML、JavaScript 和后端技术来实现。以下是两种常见的方法&#xff1a; 使用 URL 参数传递目标 div 信息 HTML (新页面): 在新页面的链接中&#xff0c;添加参数来指示目标 div 的 id&#xff0c;例如&#xff1a;…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制&#xff08;2&#xff09; 计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView&#xff0c;然后有好多行&#xff0c;再把要查询的行内容完整的传给 ad…

im8mm 网络卡死 Rx packets:1037578 errors:66 dropped:0 overruns:66 frame:0

1&#xff1a;网络接收数据包异常 2&#xff1a;问题复现 问题在进行网络数据包同吞吐量测试的时候出现的。同时发现&#xff0c;在使用iperf2测试时&#xff0c;是不会出现网络中断卡死的情况&#xff0c;使用 iperf3时才会出现此问题 指令(下面的指令运行在PC2上面&#xff…

Linux 安装JDK和Idea

安装JDK 下载安装包 下载地址&#xff1a; Java Downloads | Oracle (1) 使用xshell 上传JDK到虚拟机 (2) 移动JDK 包到/opt/environment cd ~ cd /opt sudo mkdir environment # 在 /opt下创建一个environment文件夹 ls# 复制JDK包dao /opt/environment下 cd 下载 ls jd…

聊天室项目思路

发起群聊&#xff1a; 从好友表选取人发送到服务器&#xff0c;服务器随机生成不重复的群号&#xff0c;存储在数据库&#xff0c;同时建立中间表&#xff0c;处理用户与群聊的关系 申请入群&#xff1a; 输入群号&#xff0c;发消息给服务器&#xff0c;服务器查询是否存在…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

【智能优化算法】矮猫鼬优化算法(Dwarf Mongoose Optimization Algorithm,DMHO)

矮猫鼬优化算法(Dwarf Mongoose Optimization Algorithm,DMHO)是期刊“COMPUTER METHODS IN APPLIED MECHANICS AND ENGINEERING”&#xff08;IF 7.3&#xff09;的2022年智能优化算法 01.引言 矮猫鼬优化算法(Dwarf Mongoose Optimization Algorithm,DMHO)模仿矮猫鼬的觅食行…

【Linux】Linux——Centos7安装Nginx

不需要安装包 1.安装依赖 #查看 C 环境是否安装gcc -v #查看 zlib 是否安装cat /usr/lib64/pkgconfig/zlib.pc #查看 pcre 是否安装pcre-config --version 2.安装C #安装C yum install gcc-c 3.安装pcre yum install -y pcre pcre-devel 4.安装zlib #安装 yum install -y zlib…

C++对象的拷贝构造函数

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。 拷贝(复制)构造函数:利用同类对象构造一个新的对象 ●1.函数名和类同名 (构造函数) ●2.没有返回值 (构造函数) ●3.第一个参数必…

【AIGC】重塑未来的科技巨轮

AIGC&#xff1a;重塑未来的科技巨轮 一、AIGC&#xff1a;从历史走来&#xff0c;向未来进发二、AIGC的三项核心技术三、AIGC的应用与未来 在当今科技飞速发展的时代&#xff0c;AI&#xff08;人工智能&#xff09;已经成为了一个无法忽视的热词。而与其紧密相连的AIGC&#…

配置OpenSSH/stelnet

其他远程连接工具&#xff1a;telent、realVNC、RSH、RCP等&#xff0c;SSH更加安全可靠 一、配置OpenSSH/stelnet 1.配置服务端 # vim /etc/ssh/sshd_config //修改ssh配置文件 Port 22 //监听端口 AddressFamily any //使用哪种地址簇&#xff0c;any包含v4、v6&#xff0c…

运行SpringBoot项目失败?异常显示Can‘t load IA 32-bit .dll on a AMD 64-bit platform,让我来看看~

原因是&#xff0c;我放入jdk的bin文件夹下的tcnative-1.dll文件是32位的&#xff0c;那么肯定是无法在AMD 64位平台上加载IA 32位.dll。但是网站上给出的都是32位呀&#xff0c;没有64位怎么办&#xff1a; 其实当我们把“tomcat-native-1.2.34-openssl-1.1.1o-win32-bin.zip”…

【C++】详细版 RAII技术的应用之智能指针(智能指针发展历程和简单模拟实现介绍)

目录 前言 一、智能指针有什么用&#xff1f; 二、什么是RAII(智能指针的底层思想)&#xff1f; 三、智能指针的发展历程以及模拟实现 1.auto_ptr&#xff08;C98&#xff09; 2.unique_ptr&#xff08;C11&#xff09; 3.shared_ptr&#xff08;C11&#xff09; 前言 C中…

Modown9.1主题无限制使用+Erphpdown17.1插件

Modown9.1主题无限制使用 1、Erphpdown17.1插件Modown9.1主题 2、送Modown主题详细教程。 1、Erphpdown插件和Modown主题无需激活 2、送的插件均无需激活 3、主题插件均不包更新 4、已亲测可以完美使用。 功能强大&#xff0c;适用于绝大多数虚拟资源站&#xff01;物超所值&a…