java实现分类下拉树,点击时对应搜索---后端逻辑

一直想做分类下拉,然后选择后搜索的页面,正好做项目有了明确的需求,查找后发现el-tree的构件可满足需求,数据要求为:{ id:1,  label:name,  childer:[……]  }形式的,于是乎,开搞!

一、效果预览

点击后

二、实现步骤

1、数据库设计层面:

在设计数据库的分类表时,需要设置为层级结构的样式,指明父分类id和祖分类id,如此才可满足分类需求。

具体如下,比如我的书签分类表:markClass(以下只写出主要三列)

属性数据类型字段说明举例
markClassIdint书签分类的id1001
parentidint该分类的上级分类id(父id)1000
ancestorsstring该分类所有上属分类id(祖id)0,10,100,1000

2、后端基础的构建

依据表格完成对后端基础增删改的设置,可以用Ruoyi一键生成。以下主要说明插入时,ancestors的设置:

插入时需要依据父分类id来完成对ancestors的设置。(注意设置ancestors的getter、setter方法)

private MarkclassMapper markclassMapper;
//这个是在你写的Impl层中的那个类里,你的selectById方法在哪里就引用哪个

public int insertMarkclass(Markclass markclass)
    {
       Markclass mar=
       markclassMapper.selectMarkclassByMarkClassId(markclass.getParentid());
       //依据传入的markclass对象的父分类id查找具体的分类

       markclass.setAncestors(mar.getAncestors()+","+markclass.getParentid());
       //调用set方法。按照字符串拼接的方法,获取父分类所包含的祖分类id,并加上父分类id。

       return markclassMapper.insertMarkclass(markclass);

    }

3、主代码——构建树相关

(1)创建适配el-tree数据类型的类

el-tree的构件数据要求为:{ id:1,  label:name,  childer:[……]  }形式,于是可定义一个“TreeSelect”类(类名称随意)

package com.blhq.wjs.domain;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

import com.blhq.common.core.domain.entity.SysMenu;
import com.fasterxml.jackson.annotation.JsonInclude;
//引入需要的你定义到的实体类

/**
 * Treeselect树结构实体类
 * 数据类型依据el-tree数据需求进行定义,即为:id、label、children,
 * @author blhq
 */
public class TreeSelect implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** 节点ID */
    private Long id;

    /** 节点名称 */
    private String label;

    /** 子节点 */
    //    @JsonInclude(JsonInclude.Include.NON_EMPTY)

    private List<TreeSelect> children;

    public TreeSelect(Class aclass) {
        this.id = aclass.getClassid();
        this.label = aclass.getClassname();
        // 检查此处是否正确设置了 class_children 属性
        this.children = aclass.getClass_children().
        stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    //写了多个TreeSelect构造类,以满足后续其它类型对象的调用,
    public TreeSelect(Markclass markclass){
        this.id=markclass.getMarkClassId();
        this.label=markclass.getClassname();
        this.children=markclass.getMarkChildren().
        stream().map(TreeSelect::new).collect(Collectors.toList());
    }

    public TreeSelect(SysMenu menu)
    {
        this.id = menu.getMenuId();
        this.label = menu.getMenuName();
        this.children = menu.getChildren().
        stream().map(TreeSelect::new).collect(Collectors.toList());
    }


    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public String getLabel()
    {
        return label;
    }

    public void setLabel(String label)
    {
        this.label = label;
    }

    public List<TreeSelect> getChildren()
    {
        return children;
    }

    public void setChildren(List<TreeSelect> children)
    {
        this.children = children;
    }
}


补充:Markclass类

private List<Markclass> markChildren=new ArrayList<Markclass>();
//必须实例化,不然会报错java.lang.NullPointerException: null
//同时设置getter、setter方法
public List<Markclass> getMarkChildren() {
        return markChildren;
}

public void setMarkChildren(List<Markclass> markChildren) {
        this.markChildren = markChildren;
 }

(2)service层:

在你的service类中创建方法:(如果没有service层,则无视,直接看实现层操作即可)

注意:部分返回值类型为刚刚定义的TreeSelect的列表。

    public List<TreeSelect> selectMarkClassTreeList(Markclass markclass);
    //接收用户传入的分类,即为当前操作的分类

    public List<Markclass> buildMarkClassTree(List<Markclass> markclassList);
    //构建树的核心方法
    
    public List<TreeSelect> buildMarkClassTreeSelect(List<Markclass> classes);
    
//注意返回值类型为刚刚定义的TreeSelect的列表。

(3)Impl实现层:

核心代码:
    @Override
    public List<TreeSelect> selectMarkClassTreeList(Markclass markclass) {
        //传入用户操作的分类,获取筛选后的书签分类列表
        List<Markclass> markClasses = this.selectMarkclassList(markclass);
        //selectMarkclassList()为查找分类列表用的方法,返回值为List<Markclass>类型
        return buildMarkClassTreeSelect(markClasses);
        //构建树
    }

    @Override
    public List<TreeSelect> buildMarkClassTreeSelect(List<Markclass> classes) {
        List<Markclass> markClasses = buildMarkClassTree(classes);

        return markClasses.stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    /**
     * 构建前端所需要树结构
     */
    @Override
    public List<Markclass> buildMarkClassTree(List<Markclass> markclassList) {
        List<Markclass> returnList=new ArrayList<Markclass>();
        存储当前分类出现的节点
        List<Long> tempList = markclassList.stream().map(Markclass::getMarkClassId).collect(Collectors.toList());
        for (Markclass markclass : markclassList) {
            if(!tempList.contains(markclass.getParentid())){
                // 如果是顶级节点, 遍历该父节点的所有子节点
                recursionFn(markclassList, markclass);
                returnList.add(markclass);
                //不存在的加入进去,从而完成一整个树的遍历
            }
        }
        if (returnList.isEmpty()) {
            returnList = markclassList;
        }
        return returnList;

    }

    private void recursionFn(List<Markclass> list, Markclass t) {
        // 递归。得到子节点列表
        List<Markclass> childList = getChildList(list, t);
        t.setMarkChildren(childList);
        for (Markclass tChild : childList) {
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
    }
    /**
     * 得到子节点列表
     */
    private List<Markclass> getChildList(List<Markclass> list, Markclass t) {
        List<Markclass> tlist = new ArrayList<Markclass>();
        for (Markclass n : list) {
            if (StringUtils.isNotNull(n.getParentid()) && n.getParentid().longValue() == t.getMarkClassId().longValue()) {
                tlist.add(n);
            }
        }
        return tlist;
    }

    private boolean hasChild(List<Markclass> list, Markclass t) {
        return getChildList(list, t).size() > 0;
    }
完整Impl层代码:
package com.blhq.wjs.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.blhq.common.utils.StringUtils;
import com.blhq.wjs.domain.TreeSelect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.blhq.wjs.mapper.MarkclassMapper;
import com.blhq.wjs.domain.Markclass;
import com.blhq.wjs.service.IMarkclassService;

/**
 * 书签分类Service业务层处理
 * 
 * @author blhq
 * &#064;date  2024-06-19
 */
@Service
public class MarkclassServiceImpl implements IMarkclassService 
{

    @Autowired
    private MarkclassMapper markclassMapper;

    /**
     * 查询书签分类
     * 
     * @param markClassId 书签分类主键
     * @return 书签分类
     */
    @Override
    public Markclass selectMarkclassByMarkClassId(Long markClassId)
    {
        return markclassMapper.selectMarkclassByMarkClassId(markClassId);
    }

    /**
     * 查询书签分类列表
     * 
     * @param markclass 书签分类
     * @return 书签分类
     */
    @Override
    public List<Markclass> selectMarkclassList(Markclass markclass)
    {
        return markclassMapper.selectMarkclassList(markclass);
    }

    /**
     * 新增书签分类
     * 
     * @param markclass 书签分类
     * @return 结果
     */
    @Override
    public int insertMarkclass(Markclass markclass)
    {
        if (markclass.getMarkClassId() == null) {
            return markclassMapper.insertMarkclass(markclass);
        }else {
            Markclass mar=markclassMapper.selectMarkclassByMarkClassId(markclass.getParentid());
            markclass.setAncestors(mar.getAncestors()+","+markclass.getParentid());
            return markclassMapper.insertMarkclass(markclass);
        }
    }
    /**
     * 修改书签分类
     * 
     * @param markclass 书签分类
     * @return 结果
     */
    @Override
    public int updateMarkclass(Markclass markclass)
    {
        return markclassMapper.updateMarkclass(markclass);
    }

    /**
     * 批量删除书签分类
     * 
     * @param markClassIds 需要删除的书签分类主键
     * @return 结果
     */
    @Override
    public int deleteMarkclassByMarkClassIds(Long[] markClassIds)
    {
        return markclassMapper.deleteMarkclassByMarkClassIds(markClassIds);
    }

    /**
     * 删除书签分类信息
     * 
     * @param markClassId 书签分类主键
     * @return 结果
     */
    @Override
    public int deleteMarkclassByMarkClassId(Long markClassId)
    {
        return markclassMapper.deleteMarkclassByMarkClassId(markClassId);
    }


    @Override
    public List<TreeSelect> selectMarkClassTreeList(Markclass markclass) {
        //传入用户操作的分类,获取筛选后的书签分类列表
        List<Markclass> markClasses = this.selectMarkclassList(markclass);
        //selectMarkclassList()为查找分类列表用的方法,返回值为List<Markclass>类型
        return buildMarkClassTreeSelect(markClasses);
        //构建树
    }

    @Override
    public List<TreeSelect> buildMarkClassTreeSelect(List<Markclass> classes) {
        List<Markclass> markClasses = buildMarkClassTree(classes);

        return markClasses.stream().map(TreeSelect::new).collect(Collectors.toList());
    }
    /**
     * 构建前端所需要树结构
     */
    @Override
    public List<Markclass> buildMarkClassTree(List<Markclass> markclassList) {
        List<Markclass> returnList=new ArrayList<Markclass>();
        存储当前分类出现的节点
        List<Long> tempList = markclassList.stream().map(Markclass::getMarkClassId).collect(Collectors.toList());
        for (Markclass markclass : markclassList) {
            if(!tempList.contains(markclass.getParentid())){
                // 如果是顶级节点, 遍历该父节点的所有子节点
                recursionFn(markclassList, markclass);
                returnList.add(markclass);
                //不存在的加入进去,从而完成一整个树的遍历
            }
        }
        if (returnList.isEmpty()) {
            returnList = markclassList;
        }
        return returnList;

    }

    private void recursionFn(List<Markclass> list, Markclass t) {
        // 递归。得到子节点列表
        List<Markclass> childList = getChildList(list, t);
        t.setMarkChildren(childList);
        for (Markclass tChild : childList) {
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
    }
    /**
     * 得到子节点列表
     */
    private List<Markclass> getChildList(List<Markclass> list, Markclass t) {
        List<Markclass> tlist = new ArrayList<Markclass>();
        for (Markclass n : list) {
            if (StringUtils.isNotNull(n.getParentid()) && n.getParentid().longValue() == t.getMarkClassId().longValue()) {
                tlist.add(n);
            }
        }
        return tlist;
    }

    private boolean hasChild(List<Markclass> list, Markclass t) {
        return getChildList(list, t).size() > 0;
    }

}

(4)controller层:

这时候,我们直接添加即可:推荐把它放到对应需要分类显示的文件中,比如我的是在书签的controller中。

@GetMapping("/deptTree")
    public AjaxResult deptTree(Markclass markclass)
    {
        List<TreeSelect> list = markclassService.selectMarkClassTreeList(markclass);
        return success(list);
    }

(5)xml文件:

修改查找逻辑的语句:将分类的查询改为,从markclas表的ancestors查:

    <select id="selectBookmarkList" parameterType="Bookmark" resultMap="BookmarkResult">
        select b.markId, b.markName, b.markClassId, b.website, b.`desc`, b.createTime, b.editTime, b.icon, b.statue, b.commonGrade, b.allGrade, b.markPlot, b.likes, b.markExtend, c.classname, c.ancestors from bookmark b
        left join markclass c on b.markClassId = c.markClassId
        where 1=1
            <if test="markId != null "> and markId = #{markId}</if>
            <if test="markName != null  and markName != ''"> and markName like concat('%', #{markName}, '%')</if>
            <if test="markClassId != null ">
                AND (b.markClassId = #{markClassId} OR b.markClassId IN ( SELECT c.markClassId FROM class c WHERE find_in_set(#{markClassId}, ancestors) ))
            </if>
            <if test="website != null  and website != ''"> and website like concat('%', #{website}, '%')</if>
            <if test="desc != null  and desc != ''"> and b.`desc` like concat('%', #{desc}, '%')</if>
            <if test="createTime != null "> and b.createTime &gt;= #{createTime}</if>
            <if test="editTime != null "> and b.editTime &lt;= #{editTime}</if>
            <if test="icon != null  and icon != ''"> and icon like concat('%', #{icon}, '%')</if>
            <if test="statue != null "> and statue = #{statue}</if>
            <if test="commonGrade != null "> and commonGrade = #{commonGrade}</if>
            <if test="allGrade != null "> and allGrade like concat('%', #{allGrade}, '%')</if>
            <if test="markPlot != null  and markPlot != ''"> and markPlot = #{markPlot}</if>
            <if test="likes != null "> and likes like concat('%', #{likes}, '%')</if>
            <if test="markExtend != null "> and markExtend like concat('%', #{markExtend}, '%')</if>
    </select>

4、前端应用:

整体思路就是引用它,把它调过来使用就行。下面按我的思路来演示:

(1)引入api:

// 查询书签分类列表--tree
export function markClassTreeSelect(query) {
  return request({
    url: '/markclass/markclass/deptTree',
    method: 'get',
    params: query
  })
}

(2)页面导入

注意将v-model中的值,改为你自己的。

<template>
   <el-row :gutter="20">
      <el-col :span="4" :xs="24">
        <div class="head-container">
          <el-input
            v-model="markName"
            placeholder="请输入书签分类名称"
            clearable
            size="small"
            prefix-icon="el-icon-search"
            style="margin-bottom: 20px"
          />
        </div>
        <el-tree
          :data="markOptions"
          :props="defaultProps"
          :expand-on-click-node="false"
          :filter-node-method="filterNode"
          ref="tree"
          node-key="id"
          default-expand-all
          highlight-current
          @node-click="handleNodeClick"
        />
        <!--        </div>-->
      </el-col>

     <el-col :span="20" :xs="24">
        …………
     </el-col>
 </el-row>

        …………//你的其它页面布局代码,上文gutter表示左侧分类栏占比大小。
        

</template>

<script></script>内需要添加的:

   data() {
    return {
      //data内需要添加的数据:
    
      // 书签分类名称
      markName:undefined,
      // 书签分类选项
      markOptions: undefined,
      //设置分类数据样式:
      defaultProps: {
        children: "children",
        //children:就是告诉el-tree,
            //它需要的children,在你这里的数据,叫啥名,比如我的为children
        //就是TreeSelect类中定义的children
        label: "label"
      },
},
},

watch: {
    //在watch内,添加如下内容,没watch就自己加,在data(){},后面。
    // 根据名称筛选树
    markName(val) {
      this.$refs.tree.filter(val);
    }
  },

created() {
    //调用方法
    this.getMarkTree();
  },

methods: {

    // 获取书签分类树
    getMarkTree() {
      markClassTreeSelect().then(response => {
        this.markOptions = response.data;
        console.log(response.data);
        // console.log(response);
      });
    },
    // 筛选节点
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    // 节点单击事件
    handleNodeClick(data) {
      this.queryParams.markClassId = data.id;
      this.handleQuery();
    },

},

5、成果展示:

点击游戏类后:

三、我遇到的问题

(1):无法自动装配。找不到'MarkclassMapper’类型的 Bean。

 方案:在MarkclassMapper中,最前面加入@Mapper注解即可

(2)Failed to instantiate: Factory method 'sqlSessionFactory' threw exception; TypeException: The alias 'TreeSelect' is already mapped to the value 'com.blhq.wjs.domain.TreeSelect'.

方案:如果提示这个,请把我们刚才定义的TreeSelect类,重构一下,改个名就行。

更详细说明请看下文:

分类树实现时遇见的bug:如XXXController $$EnhancerBySpringCGLIB$$c8ca0a15 cannot be cast to XXX……-CSDN博客文章浏览阅读2次。实现分类树实现时遇见的bughttps://blog.csdn.net/qq_64595427/article/details/139843770?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139843770%22%2C%22source%22%3A%22qq_64595427%22%7D

如有问题,欢迎留言讨论哦~

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

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

相关文章

如何下载DVS Gesture数据集?解决tonic.datasets.DVSGesture错误HTTP Error 403: Forbidden

1 问题 DVSGesture数据集是一个专注于动态视觉传感&#xff08;Dynamic Vision Sensor, DVS&#xff09;技术的数据集&#xff0c;它包含了基于事件的图像记录&#xff0c;用于手势识别任务。DVSGesture数据集由一系列动态图像组成&#xff0c;这些图像是通过动态视觉传感器捕…

免费分享:GIS插件-ARCGIS一键拓扑(模型构建器)(附下载方法)

工具详情 ARCGIS一键拓扑(模型构建器)&#xff0c;可直接在ArcGIS中安装使用。 可试用本工具进行数据拓扑检查。 下载方法 下载地址&#xff1a;https://open.geovisearth.com/service/resource/150下载流程&#xff1a;点击上面的下载地址&#xff0c;打开数字地球开放平台…

数据结构-绪论

目录 前言一、从问题到程序二、数据结构的研究内容三、理解数据结构3.1 数据3.2 结构3.2.1 逻辑结构的分类3.2.2 存储结构的分类 3.3 数据结构 四、数据类型和抽象数据类型4.1 抽象数据类型的定义格式4.2 抽象数据类型的实现 总结 前言 本篇文章先介绍数据结构的研究内容&…

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

SAR动目标检测系列:【4】动目标二维速度估计

在三大类杂波抑制技术(ATI、DPCA和STAP)中&#xff0c;STAP技术利用杂波与动目标在二维空时谱的差异&#xff0c;以信噪比最优为准则&#xff0c;对地杂波抑制的同时有效保留动目标后向散射能量&#xff0c;有效提高运动目标的检测概率和动目标信号输出信杂比&#xff0c;提供理…

C++学习(23)

#学习自用# union 共用体和结构体相似&#xff0c;但是共用体一次只能占用一个成员的内存&#xff0c;所有成员共用同一地址。 #include<iostream> using namespace std; union A {int int_val;float float_val; }a; int main() {a.float_val 2.0f;cout << a.f…

【AWS SMB 能力最佳实践】利用 MGN 解决方案实现跨AWS账号迁移Amazon EC2 实例、弹性IP地址等资源

文章目录 一、实验情景二、实验关键服务概述2.1 MGN解决方案2.2 VPC对等连接 三、实验架构示意图四、实验具体操作步骤4.0 创建访问密钥4.1 创建VPC资源4.1.1 在源账号上创建VPC4.1.2 在目标账号上创建VPC 4.2 创建对等连接✨4.2.1 发起对等连接请求4.2.2 接受对等连接请求4.2.…

【内含优惠码】重磅发售!《2023年度中国量化投资白皮书》(纸质版)

这是可以公开了解量化行业图景的&#xff0c;为数不多资料。 简介 《2023年度中国量化投资白皮书》由宽邦科技、华泰证券、金融阶、华锐技术、AMD、阿里云、英迈中国等多家机构联合发起编写&#xff0c;并于2024年6月15日正式发布&#xff0c;全书公17万字6大章节勾勒最新量化…

torch.optim 之 Algorithms (Implementation: for-loop, foreach, fused)

torch.optim的官方文档 官方文档中文版 一、Implementation torch.optim的官方文档在介绍一些optimizer Algorithms时提及它们的implementation共有如下三个类别&#xff1a;for-loop, foreach (multi-tensor), and fused。 Chat-GPT对这三个implementation的解释是&#xf…

算法设计与分析 实验4 动态规划法求扔鸡蛋问题

目录 一、实验目的 二、问题描述 三、实验要求 四、实验内容 动态规划法 算法描述 算法伪代码描述 算法复杂度分析 数据测试 二分优化的动态规划法 算法描述 二分优化&#xff1a; 算法伪代码 算法复杂度分析 数据测试 单调决策优化的动态规划法 算法描述 算…

【Ardiuno】实验使用ESP32接收电脑发送的串口数据(图文)

使用ESP32可以非常方便的与电脑进行串口通讯&#xff0c;一般我们可以用串口接收ESP32的输出作为调试使用&#xff0c;今天我们再来实验一下从电脑端向ESP32单片机发送数据。 发送数据程序代码&#xff1a; void setup() {Serial.begin(9600); }void loop() { if(Serial.ava…

股票核心因子解读以及如何从接口获取股票数据信息

目录 1 股票基础信息1.1 股票核心因子1.2 获取股票信息 2 如何从接口获取股票数据2.1 yfinance2.2 finnhub-python2.3 alpha_vantage2.4 efinance2.4 Tushare 3 如何从各大金融平台获取咨询信息3.1 国外3.2 国内 1 股票基础信息 1.1 股票核心因子 基本面因子 因子名称计算公…

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑&#xff0c;可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界&#xff0c;把…

java读取wps嵌入式图片思路

这个只写了思路具体代码在文章最后&#xff0c;不想了解得直接去拿代码 了解Excel数据结构 Excel 文件格式后缀xls,xlsx 其实是一个压缩文件&#xff0c;是由多个文件夹以及xml 文件组合为一个文件&#xff0c;xml文件记录了Excel得内容以及样式等信息。加入在桌面新建一个xls…

MySQL之复制(七)

复制 定制的复制方案 分离功能 许多应用都混合了在线事务处理(OLTP)和在线数据分析(OLAP)的查询。OLTP查询比较短并且是事务型的。OLAP查询则通常很大&#xff0c;也很慢&#xff0c;并且不要求绝对最新的数据。这两种查询给服务器带来的负担完全不同&#xff0c;因此它们需…

一文教你在centos 7.9中安装mysql5.7(超级详细)

##red## &#x1f534; 大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff0c;雄雄的小课堂。 一、前言 每当新来一个服务器之后&#xff0c;习惯性的都会安装一个宝塔面板&#xff0c;不为别的&#xff0c;就为了装环境方便点儿&#xff0c;比如常用的jdk,m…

python的赋值运算

# coding:utf-8 x20 #直接复制&#xff0c;直接将20赋值给x y10 xxy #将xy的和赋值给给x print(x) xy print(x)#40 x-y #相当于x-y print(x) #30x*y #xx*y x/y #xx/y print(x) x%2#xx%2 print(x)#0.0 隐式转换 z3 y//z #yy//z y**2#yy**2 #python支持链式赋值 abc100#相当于a10…

【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver

3 jtop nvidia@tx2-nx:~$ jtop [WARN] Board missing UNKNOWN (press CTRL + Click) nvidia@tx2-nx:~$ 点击info 可以看到 jetpack是4.6opencv 是4.1.15.1.2 的不适合我 tritonserver2.35.0-jetpack5.1.2-update-2.tgz tritonserver2.19.0-jetpack4.6.1.tgz. 4.6.1<

【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条

总结 需要安装插件 mouse-wheel 和 scrollbar 在PC端如何开启鼠标滚动? 需要安装官方提供的滚动插件&#xff1a;mouse-wheel https://better-scroll.github.io/docs/zh-CN/plugins/mouse-wheel.html 为了开启鼠标滚动功能&#xff0c;你需要首先引入 mouseWheel 插件&…

华为设备SSH远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑SSH 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户SSH 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录接入用…