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

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.mfbz.cn/a/612243.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘(二)数据预处理

前言 基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 数据挖掘&#xff08;一&#xff09;数据类型与统计 2、数据预处理 2.1数据清理 缺失值处理&#xff1a; from sklearn.impute import SimpleImputer# 创建一个SimpleImputer对象&#xff0c;指定缺失值的处理策略…

day07beef-xss之根据beef-xss获取cookies

1.安装 apt-get update apt-get install beef-xss 若报错运行不了尝试 apt remove ruby apt remove beef-xss apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine apt-get install beef-xss 2.运行 beef-xss 运行成功会自动弹出浏览框。 攻…

WM Transaction Code 仓库管理模块事务代码大全

1.1 LE-WM 仓库管理 Warehouse Management 仓库管理事务码 描述 LB01 Create Transfer Requirement 创建转储需求 LB02 Change transfer requirement 修改转储需求 LB03 Display Transfer Requirement 显示转储需求 LB10 TRs for Storage Type 按仓储类型的转储请求 …

一次完整的GC流程

Java堆中内存区分 Java的堆由新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;组成。新生代存放新分配的对象&#xff0c;老年代存放长期存在的对象。 新生代&#xff08;Young&#xff09;由年轻区&#xff08;Eden&a…

uniapp开发微信小程序,选择地理位置uni.chooseLocation

<view click"toCommunity">点击选择位置</view>toCommunity() {const that thisuni.getSetting({success: (res) > {const status res.authSetting// 如果当前设置是&#xff1a;不允许&#xff0c;则需要弹框提醒客户&#xff0c;需要前往设置页面…

linux开发笔记(buildroot 增加自己的开发板支持文件)

1、该笔记参考了mangopi r3的buildroot。某宝上卖的LC-PI-200S提供的buildroot就是这个。已经上传到我的资源中&#xff0c;可以下载看看。 2、首先在buildroot目录输入make menuconfig打开buildroot配置。 进入build options查看 可以看到第二行就是buildroot配置的保存位置…

STM32_HAL_RTC_中断实现闹钟

1STM32设置 在STM32Cude中设置RTC//具体设置看先前发的文章 再打开闹钟中断&#xff08;如下图&#xff09; 2代码思路 2.1启动闹钟&#xff08;HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,FORMAT_BCD)&#xff09; 2.2设置回调函数&#xff08;void HAL_RTC_AlarmAEventC…

指针(脑图梳理)

今天让我们来梳理一下指针都有哪些概念吧 这个脑图是整理的一些指针相关知识的概念&#xff0c;希望对大家有帮助

uni-app(二):本地插件使用(Android)

本地插件使用 项目创建等参考1.下载并引用本地插件2.注意插件配置3.制作自定义基座4.编写调用代码5.运行 项目创建等参考 https://lprosper.blog.csdn.net/article/details/138655526 1.下载并引用本地插件 2.注意插件配置 3.制作自定义基座 4.编写调用代码 <template>…

leetcode刷题——设计循环链表

题目要求我们设计循环队列&#xff0c;其特点是容量固定&#xff0c;队列循环&#xff0c;如图所示&#xff1a; 这里的队列我们以链表队列举例&#xff0c;对于循环&#xff0c;只需要把尾节点的指针指向头节点。重点是队列的容量固定&#xff1a;如何确定队列是否已满和空&am…

ExcelVBA取序号与合计之间的数据

今天有人提出这样一个问题&#xff0c; ExcelVBA取序号与合计之间的数据 数据如下: 分析一下&#xff0c;问题关键&#xff1a; 问题&#xff1a;1.我要在“序号”两字后面开始取数&#xff0c;因为序号是合并的&#xff0c;所以。。。2.我要取合计前面的数据&#xff0c;所以要…

WebRTC 的核心:RTCPeerConnection

WebRTC 的核心&#xff1a;RTCPeerConnection WebRTC 的核心&#xff1a;RTCPeerConnection创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE什么是 Candidate&#xff1f;收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换远端…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

攻防世界(CTF)~web-supersqli(详细解题思路)

题目介绍 题目描述“随便注” 先看一下是否存在注入 判断闭合方式 输入1’ and 11-- -正常回显 输入1and 12-- -无回显,确认是单引号闭合 看一下列数 输入1 order by 2-- - 有回显 输入1 order by 3-- - 报错&#xff0c;由此判断两列 使用union联合注入发现select被过滤了&a…

【学习AI-相关路程-工具使用-自我学习-Ubuntucudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 &#xff08;2&#xff09;】 1、前言2、环境说明3、总结说明4、工具安装0、验证cuda1、软件下载2、插件安装 5、软件设置与编程练习1、创建目录2、编译软件进入目录&创建两个文件3、编写配置文…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…

2024 年最新使用 ntwork 框架搭建企业微信机器人详细教程

NTWORK 概述 基于 PC 企业微信的 api 接口&#xff0c;支持收发文本、群、名片、图片、文件、视频、链接卡片等。 下载安装 ntwork pip install ntwork国内源安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ntwork企业微信版本下载 官方下载&#xff1a;h…

大模型prompt实例:知识库信息质量校验模块

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

移动应用开发实验四AlarmManager实现闹钟提醒

实验目的和要求 在Android Studio中&#xff0c;通过AlarmManager实现闹钟提醒。 点击“SET ALARM”后&#xff0c;采用Toast方式提示用于设定的闹钟成功&#xff0c;并包含设定的闹钟启用时间。 当闹钟生效时&#xff0c;采用AlertDialog实现闹钟题型&#xff0c;并通过Ale…

Linux 进程信号【信号产生】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 信号概念 1. 生活角度的信号 2…