VUE+Vant实现H5组织架构选人选公司组件

提醒自己:
这是之前的逻辑,或许你重新写会有更好的方法,可以参考逻辑!!!

功能介绍

1.有面包屑点击切换
2.有公司、部门、人员
3.单选、多选实现
4.编辑/回显
5.使用随意切换层级和跳转到指定层级回显等功能

效果图:

在这里插入图片描述
点击跳转到组件主要内容区域:
在这里插入图片描述
在这里插入图片描述

数据结构

{
"children":[{}],//子级数据
"type" : 0,  // type:0-主企业,2-子企业,1-部门
"comNo" : "1543782809XXXXX",
"teamNo" : null,
"name" : "XXXXXXXX有限公司",
"id" : "1",
"count" : 0,
"parentId" : "",
"contacts": [ {
	"name" : "刘XXX",
	"icon" : "", // 头像
	"memberNo" : "111111111111111111",
	"phone" : "17XXXXXXXXX",
	"departmentId": [ "1", "62d6591fa965ea000xxxxx"],
	"department" : "[["1"],["1","62d6591fa965ea00012xxxxxxx"]
	"departmentName" : ""
	}
] //人员数据
}

第一级父级:调用UI组件

<basicCompanyInfo @applySubjectData="getApplySubjectData" class="basic-company-info">

js:
// 获取申请公司部门数据
getApplySubjectData(val) {
  let { aCompany, aCompanyName, aDepartment, aDepartmentName, name, memberNo } = val
  this.dataDTO = {
    companyId:aCompany,
    companyName:aCompanyName,
    departmentName:aDepartmentName,
    departmentNo:aDepartment,
    userName: name,
    userId: memberNo
  }
},

第二级需求UI组件:实现交互

<!-- 组织架构选单位/部门/经办人 -->
<template>
  <div class="basic-company-info">
    <van-cell @click="goOrgChoose" :value="applySubjectData.aCompanyName">
      <template #title>
        <div class="required-label">申请单位</div>
      </template>
      <template #right-icon>
        <img src="@/assets/img/icon_right.png" alt="" class="icon_right ml10">
      </template>
    </van-cell>
    <van-cell title="申请部门"
              :value="!dataState && !applySubjectData.aCompanyName ? '' : (applySubjectData.aDepartmentName ? applySubjectData.aDepartmentName : '该人员未分配部门')" @click="(event) => goOrgChoose(event,2)">
      <template #right-icon>
        <img src="@/assets/img/icon_right.png" alt="" class="icon_right ml10">
      </template>
    </van-cell>
    <van-cell :value="applySubjectData.name" @click="(event)=> goOrgChoose(event,3)">
      <template #title>
        <div class="required-label">经办人</div>
      </template>
      <template #right-icon>
        <img src="@/assets/img/icon_right.png" alt="" class="icon_right ml10">
      </template>
    </van-cell>
     <van-cell title="" value="" v-show="$router.path=='/reapply'" />
  </div>
</template>


<script>
import eventBus from "@/utils/eventBus";
import apiOrder from "@/api/apiOrder";


export default {
  name: "basicCompanyInfo",
  data(){
    return{
      dataState:false,
      keyName:1,
      checkData:[],
      applySubjectData:{},
    }
  },
  props:{
    applypropsData:{ // 申请单位/部门/经办人的数据
      type:Object,
      default:()=>({})
    }
  },
  computed:{
    userBaseData(){ // 用户信息
            return this.$store.state.user.userInfo;
    }
  },
  watch:{
    applypropsData:{
      handler(val){
        if(val&&this.$route.query.type==1){
          this.initapply()
        }
      },
      deep:true
    }
  },
  created() {
    eventBus.$off(`corporateDepartment${this.keyName}`)
    eventBus.$on(`corporateDepartment${this.keyName}`, function(data){ // 接收组织架构的数据
      this.setOrderBaseData(data);
    }.bind(this));
  },
  mounted() {
      if (this.$route.query.type==1) {
        this.initapply()
      }else{
        this.getCheckData()
      }
  },
  methods:{
    initapply(){
      this.applySubjectData=this.applypropsData
      this.applySubjectData.name=this.applypropsData.aPersonName
      this.applySubjectData.managerId=this.applypropsData.aPerson
    },
    // 赋值选中的数据
    async getCheckData(){
      if(this.applySubjectData.aCompany){ // 有选中公司部门的情况回显
        this.checkData = [this.applySubjectData];
      }else {// 第一次进来默认登录信息
        let userInfo;
        let res = await apiOrder.findDefaultDept(); // 获取默认部门
        if (res.code == 200) {
          let defaultDept = res.data;
          userInfo = {
            companyId: defaultDept.id,
            departmentName: defaultDept.departmentName,
            departmentNo: defaultDept.departmentNo
          }
        }
        let userBaseData = {...this.userBaseData, ...userInfo};
                this.initBase(userBaseData)
      }
    },
    // 初始化数据-取自state用户信息
    async initBase(data){
      // console.log("初始化数据-取自state用户信息",data)
      let list = {
        aCompany:data.companyInfo?.no, // 用户信息的公司id与组织架构的公司id不一致,所以按组织架构为准:一级公司id:1
        aCompanyName:data.companyInfo?.name,
        aDepartment:data.departmentNo,
        aDepartmentName:data.departmentName,
        memberNo:data.personNo,
        icon:data.icon,
        name:data.realName,
        phone:data.telPhone,
      };
      this.setOrderBaseData([list])
      this.checkData = [list];
    },
    // 去选择组织架构
    goOrgChoose(ev,type){ // 1-企业,2-部门,3-人员
      this.$emit('changeData')
      // return
      this.$store.commit('common/updateOrgStructureSelection', this.checkData); // 改变默认勾选数据
      this.$router.push({ path:'/organizationalStructure', query:{ key:this.keyName,levelType:type }})
    },
    // 公司部门数据获取
    setOrderBaseData(data){
      let val = data && data[0];
      this.dataState = false;
      if(val){
        this.dataState = true;
        this.applySubjectData = {...this.applySubjectData,...val};
        this.$emit('applySubjectData',this.applySubjectData)
      }
    }
  }
}
</script>


<style scoped lang="scss">
// css根据需求自定义
</style>

组件主要全部代码:

<!-- 组织架构选人/选公司/选部门-->
<template>
  <div class="org-structure">
    <div class="org-structure-content topNavPt">
      <!-- 导航部分 -->
      <topNavigation v-if="isShow" :title="breadCrumbsData.length > 0 ? breadCrumbsData[0].name : navTitle"></topNavigation>
      <!-- 面包屑 -->
      <div class="bread-crumbs bag-fff" v-if="breadCrumbsData.length > 0">
        <div class="bread-crumbs-content" v-for="(item,index) in breadCrumbsData" :key="item.id" @click="goBack(item,index)">
          <span :class="index == breadCrumbsData.length - 1 ? 'bread-crumbs-content-company cl969696' : 'bread-crumbs-content-company'">{{ item.name }}</span>
          <img src="../../assets/img/icon_right.png" alt="" class="icon_right">
        </div>
      </div>
      <!-- 公司级别/部门级别 -->
      <div class="pl15 bag-fff">
        <!-- 一级公司 -->
        <div v-if="!chooseFirstOrder" class="company-cell-content" @click="chooseOrgOrDepartment(orgList)">
          <van-checkbox v-model="checkByDefaultData">{{ orgList.name }}</van-checkbox>
          <img src="../../assets/img/icon_right.png" alt="" class="icon_right mr15">
        </div>
        <!-- 二级及以下公司部门 -->
        <div v-else>
          <div v-for="item in chooseOrgList" :key="item.id" @click="chooseOrgOrDepartment(item)" class="company-cell-content">
            <van-checkbox :class="item.children.length === 0 && item.contacts.length === 0 && item.parentId != 1 ? 'disable-orderBaseCss.scss' : ''" v-model="item.checked">{{ item.name }}
              <span>{{ `(${item.count})` }}</span>
            </van-checkbox>
            <img src="../../assets/img/icon_right.png" alt="" class="icon_right mr15">
          </div>
        </div>
      </div>
      <!--  人员级别 -->
      <div v-if="contactsList" class="pl15 bag-fff mt10">
        <!-- 单选/多选 -->
        <div class="company-cell-content company-personnel" v-for="list in contactsList">
          <van-checkbox-group v-model="checkedData" ref="checkboxGroup">
            <van-checkbox :name="list.memberNo" checked-color="#5792FD" @click="(event) => handleChecked(event,list,multipleState)">
              {{ list.name }}</van-checkbox>
          </van-checkbox-group>
        </div>
      </div>
    </div>
    <!-- 底部按钮 -->
    <div class="bottom-btn-box flex-ai-jc" :style="checkedFinallyData.length > 0 ? '' : 'background: #f9a39c;'" @click="submit">
      <span>提交{{ multipleState && checkedData.length ? `(已选${checkedData.length}人)` : ''}}</span>
    </div>
  </div>
</template>


<script>
import apiOrder from '@/api/apiOrder'
import eventBus from "@/utils/eventBus";
export default {
  name: "organizationalStructure",
  components:{
    topNavigation:() => import('@/views/shopBus/components/topNavigation')
  },
  props:{
    multipleSelection:{ // 多选/单选
      type: Boolean,
      default: false
    },
    navName:{
      type: String,
      default: "请选择经办人"
    },
    isShow:{
      type: Boolean,
      default: true
    },
    returnState:{ // 标记是否父子级反参-true父子
      type: Boolean,
      default: false
    },
    chooseData:{
      type:Array,
      default:()=>[]
    },
    levelType:{
      type:String,
      default:''
    }
  },
  data(){
    return{
      orgList: [],
      chooseOrgList:[],// 组织相关架构
      chooseFirstOrder:false, // 是否有一级
      breadCrumbsData:[], // 面包屑数据
      contactsList:[],// 人员相关数据
      checkedData:[], // 勾选数据
      checkedFinallyData:[],// 最终传参数据
      existData:[],// 之前已存在的值-备份一份
      keyName:null,
      submitState:false
    }
  },
  computed:{
    // 以下数据都是为了区分路由跳转还是父子组件使用
    navTitle(){
      return this.$route.query && this.$route.query.navName ? this.$route.query.navName : this.navName;
    },
    multipleState(){
      return this.$route.query && this.$route.query.multipleSelection ? this.$route.query.multipleSelection : this.multipleSelection;
    },
    checkByDefaultData(){
      return this.returnState ? this.chooseData : this.$store.state.common.orgStructureSelection && JSON.parse(JSON.stringify(this.$store.state.common.orgStructureSelection))
    },
    levelState(){ // 1-企业,2-部门,3-人员 --自己定义的
      return this.$route.query && this.$route.query.levelType || this.levelType
    }
  },
  created() {
    this.keyName = this.$route.query && this.$route.query.key; // 得到唯一key值,便于反参到上一个页面
    this.getOrgList();
  },
  mounted() {
    if(this.checkByDefaultData.length > 0){ // 有勾选值的话需要初始化已有的数据
      this.checkedData = this.checkByDefaultData.map(item => item.memberNo);
      this.existData = this.checkByDefaultData;
    }
  },
  methods:{
    // 组织架构数据
    async getOrgList(){
      let res = await apiOrder.getOrganization();
      if(res.code == 200 ){
        this.orgList = res.data;
        if(this.levelState > 0){ // 有需要跳转到指定层级的情况
          this.levelInitShow(this.levelState)
        }
      }
    },
    // 点击公司或者部门
    chooseOrgOrDepartment(val){
      if(val.id == 1){
        this.chooseFirstOrder = true;
      }
      if(!this.breadCrumbsData.find(i => i.id === val.id) && (val.children && val.children.length > 0 || val.contacts && val.contacts.length > 0)){ // 不是重复点击 && 有部门或者有人员
        this.breadCrumbsData.push({ id:val.id,name:val.name,type:val.type }); // 面包屑数据 type:0-主企业,2-子企业,1-部门
        this.chooseOrgList = [];
        // 下一级有数据情况
        if(val.children.length > 0){
          this.chooseOrgList = val.children; // 组织数据
          if(this.checkByDefaultData && this.checkByDefaultData.length > 0){ // 如果有选中的数据,勾选上
            this.chooseOrgList = this.chooseOrgList.map(item =>{
              let state = this.checkByDefaultData.some(i => (item.type == 2 ? i.aCompany : i.aDepartment) === item.id);
              return state ? {...item,checked:true} : {...item,checked:false}  // 判断是否需要勾选
            })
          }
        }
        // 有人员数据
        if(val.contacts.length > 0){
          this.contactsList = [...val.contacts]; // 人员数据
          if(this.checkByDefaultData && this.checkByDefaultData.length > 0) {  // 如果有选中的数据,勾选上
            this.contactsList.forEach(per => {
              let state = this.checkByDefaultData.some(i => i.memberNo === per.memberNo);
              let perState = this.checkedData.some(id => id === per.memberNo); // 判断是否有此人员
              if(state && !perState){
                this.multipleState ? this.checkedData.push(per.memberNo) : this.checkedData = [per.memberNo];
              }
            })
          }
        }
      }
    },
    // 点击面包屑回退
    goBack(val,inx){
      if(val.id !== this.breadCrumbsData[this.breadCrumbsData.length - 1].id){ // 当前级时不执行筛选
        this.breadCrumbsData.splice(inx); // 首先清除面包屑后面的数据
        let treeData = this.getItemByIdInTree(this.orgList,val.id);
        this.chooseOrgOrDepartment(treeData);
      }
    },
    // 通过某个节点的id,获取该节点的完整信息
    getItemByIdInTree(tree,value){
      if(tree.id === value){
        return tree;
      } else {
        if(tree.children && tree.children.length > 0){
          for(let i = 0; i < tree.children.length; i++){
            let resultD = this.getItemByIdInTree(tree.children[i],value);
            if(resultD){
              return {...resultD};
            }
          }
        }
      }
    },
    // 通过人员id查找相应节点
    getMemberNoInTree(tree,id){
      if(tree.memberNo === id){
        return tree;
      } else {
        if (tree.contacts && tree.contacts.length > 0) {
          for (let i = 0; i < tree.contacts.length; i++) {
            let resultD = this.getMemberNoInTree(tree.contacts[i], id);
            if (resultD) {
              return resultD;
            }
          }
        }
        if (tree.children && tree.children.length > 0) {
          for (let i = 0; i < tree.children.length; i++) {
            let resultD = this.getMemberNoInTree(tree.children[i],id);
            if(resultD){
              return {...resultD};
            }
          }
        }
      }
    },
    // 根据树子节点ID查找所有父节点 - data:要遍历的数据, target:查找目标, result用于装查找结果的数组
    findParent(node, target, result) {
      if(node.id === target.id){
        if( this.levelState == 3 ){ // 到人员的级别
          result.unshift(node);
        }
        return true;
      }
      if (node.children && node.children.length > 0) { // 如果当前节点有子节点,则继续遍历子节点
        for (const childNode of node.children) {
          if (this.findParent(childNode, target, result)) { // 如果在子节点中找到了子节点的父节点,则将当前节点的ID添加到父节点ID数组中,并返回true表示已经找到了子节点
            result.unshift(node);
            return true;
          }
        }
      }
      // for (let i in node) { // 方法二
      //   let item = node[i]
      //   if (item.id === target.id) {
      //     //将查找到的目标数据加入结果数组中
      //     result.unshift(item)
      //     return true
      //   }
      //   if (item.children && item.children.length > 0) {
      //     let ok = this.findParent(item.children, target, result)
      //     if (ok) {
      //       result.unshift(item)
      //       return true
      //     }
      //   }
      // }
      //走到这说明没找到目标
      return false
    },
    // 根据type来指定展示到某个级别-例如部门跳转过来就指定到部门级别
    levelInitShow(type){ // 1-企业,2-部门,3-人员
      let arr = this.checkByDefaultData[0];
      if(arr){
        let target = { // 企业使用公司id,部门使用部门id(如果没有部门默认打开公司)
          id:type == 1 ? arr.aCompany : (arr.aDepartment ? arr.aDepartment : arr.aCompany),
          name:type == 1 ? arr.aCompanyName : (arr.aDepartmentName && arr.aDepartmentName ? arr.aDepartmentName : arr.aCompanyName)
        }
        let result = [];
        this.findParent(this.orgList, target, result,arr);
        result.forEach(item =>{
          this.chooseOrgOrDepartment(item)
        })
        console.log('指定层级展开:',arr,result,target)
      }
    },
    // 选择人员
    handleChecked(ev,val,moreChoose){
      let aDepartment,company,per;
      if(!moreChoose){ // 单选
        this.checkedData = [val.memberNo];
      }
      this.checkedFinallyData = []; // 初始化
      this.checkedData.forEach(user => {
        // 通过面包屑数据确定公司和部门
        company = this.breadCrumbsData.find(item => item.type == 2); // 0 是主企业 2 是子企业 1 部门
        aDepartment = this.breadCrumbsData[this.breadCrumbsData.length - 1];
        if(!company){ // 没有查到子公司则使用主企业
          company = this.breadCrumbsData.find(item => item.type == 0);
        }
        // 人员数据
        per = this.getMemberNoInTree(this.orgList,user);
        let data = {
          aCompany:company.id, // 申请单位NO
          aCompanyName:company.name, // 申请单位名称
          aDepartment:!this.breadCrumbsData.find(item => item.type == 1) ? '' : aDepartment.id,  // 申请部门NO - 多级取最后一个部门/排除第一级公司;都没有部门则为空
          aDepartmentName:!this.breadCrumbsData.find(item => item.type == 1) ? '' : aDepartment.name, // 申请部门名称
          memberNo:per.memberNo,
          icon:per.icon,
          name:per.name,
          phone:per.phone,
          per:per,
        }
        this.checkedFinallyData.push(data);
      })
    },
    // 提交
    submit(){
      if(this.checkedFinallyData.length > 0){
        this.submitState = true; // 是否点击提交
        this.$router.back();
        if(this.returnState){ // 直接父子组件反参
          this.$emit('corporateDepartment',this.checkedFinallyData)
        }
      }
    }
  },
  beforeDestroy(){
    if(!this.returnState && this.submitState){ // 不是父子级反参的情况
      eventBus.$emit(`corporateDepartment${this.keyName}`,this.checkedFinallyData,true)
    }else if(!this.returnState && !this.submitState){ // 不是父子级反参 && 不是点的提交-反参之前的数据
      eventBus.$emit(`corporateDepartment${this.keyName}`,this.existData,false)
    }
  }
}
</script>


<style scoped lang="scss">
// css自定义
</style>

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

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

相关文章

Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)

背景 本文基于Spark 3.5.0 目前公司在做小文件合并的时候用到了 Spark Rebalance 这个算子&#xff0c;这个算子的主要作用是在AQE阶段的最后写文件的阶段进行小文件的合并&#xff0c;使得最后落盘的文件不会太大也不会太小&#xff0c;从而达到小文件合并的作用&#xff0c;…

【算法训练营】周测4

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-4 题目描述 输入格式 从标准输入读入数据。 输入第一行为两个正整…

Vue+jquery+jquery.maphilight实现图片热区高亮以及点击效果

//鼠标悬浮效果 mounted() {this.setCurrentTask(0); //对于id为mapAll的热区图&#xff0c;设置鼠标放置在上面有一个颜色 fillColor填充颜色 strokeColor边框颜色 strokeWidth边框宽度 fillOpacity 是设置热区填充颜色的不透明度的属性。 alwaysOn:true 保持常量$(function(…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim&#xff0c;现在使用docker需要cri-docker插件作为垫片&#xff0c;对接k8s的CRI。 硬件环境&#xff1a; 2c2g 主机环境&#xff1a; CentOS Linux release 7.9.2009 (Core) IP地址&#xff1a; 192.168.44.161 一、 主机配…

垃圾回收-垃圾回收中的相关概念

目录 System.gc()的理解 内存泄漏&#xff08;Memory Leak&#xff09; 内存溢出&#xff08;OOM&#xff09; Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下&#…

【蓝桥杯】第15届蓝桥杯青少组stema选拔赛C++中高级真题答案(20240310)

一、选择题 第 1 题 第 2 题 表达式1000/3的结果是( A )。 A.333 B.333.3 C.334 D.333.0 第 3 题 下列选项中&#xff0c;判断a等于1并且b等于1正确的表达式是( B )。 A.!((a!1)&&(b!1)) B.!((a!1)||(b!1)) C.!(a1)&&(b1) D.(a1)&&(b1) 【解析】 A…

数据机构-2(顺序表)

线性表 概念 顺序表 示例&#xff1a;创建一个存储学生信息的顺序表 表头&#xff08;Tlen总长度&#xff0c; Clen当前长度&#xff09; 函数 #include <seqlist.c> #include <stdio.h> #include <stdlib.h> #include "seqlist.h" #include &…

mysql四种事务隔离级别,2024金三银四

TransactionDefinition.PROPAGATION_MANDATORY&#xff1a;如果当前存在事务&#xff0c;则加入该事务&#xff1b;如果当前没有事务&#xff0c;则抛出异常。 TransactionDefinition.PROPAGATION_NESTED&#xff1a;如果当前存在事务&#xff0c;则创建一个事务作为当前事务的…

快来围观!我自制的 AI 周报小能手:自动收集整理周报,一键发送邮件

前言 上篇文章分享了《跟着我的步骤&#xff0c;轻松打造出 AI 智能体》&#xff0c;很多朋友都比较感兴趣&#xff0c;咨询我问 “AI 小白能学吗&#xff1f;” 我感觉问题不大&#xff0c;完全可以&#xff0c;只要把要做的事情屡明白了&#xff0c;遇到的卡点问题直接问 GPT…

oracle 19c单机版本补丁升级

文章目录 一、补丁包概述二、备份opatch三、替换高版本opatch四、打DB补丁1、关闭数据库2、关闭监听3、解压补丁4、冲突检测5、补丁空间检查6、执行补丁升级7、将更新内容加载到数据库8、最后查看数据库版本9、卸载补丁包 一、补丁包概述 补丁升级包 链接&#xff1a;https://…

GStreamer简单看看

主要是现在弄摄像头&#xff0c;要用到这东西。所以学学。 最权威主页&#xff1a;GStreamer: open source multimedia framework 大概看了下&#xff0c;好像命令也不难。 gst-launch-1.0 v4l2src device/dev/video0 ! video/x-raw,formatYUY2,width640,height480,framerat…

Java-SSM电影购票系统

Java-SSM电影购票系统 1.服务承诺&#xff1a; 包安装运行&#xff0c;如有需要欢迎联系&#xff08;VX:yuanchengruanjian&#xff09;。 2.项目所用框架: 前端:JSP、layui、bootstrap等。 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 3-1.后端功能: 1.用户管…

【漏洞复现】Arris 路由器 basic_sett 信息泄露漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

小车侧方位停车过程的动态模拟matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 小车侧方位停车过程的动态模拟matlab仿真。仿真得到小车的停车动画&#xff0c;小车移动的xy轴坐标以及角度变换。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLA…

Linux系统资源管理

Linux系统资源命令 在Linux中查看系统资源常用命令有哪些 在Linux中&#xff0c;系统资源是指计算机硬件、软件和网络设备等可以利用的一切物质和能量。Linux中的系统资源包括&#xff1a; CPU&#xff08;中央处理器&#xff09;&#xff1a;用于处理计算机中的指令和数据的…

opencv各个模块介绍(2)

Features2D 模块&#xff1a;特征检测和描述子计算模块&#xff0c;包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类&#xff0c;这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector&#xff1a;特征检测器的基类&#xf…

AI应用开发-基于python的知识图谱技术

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

19 反向迭代器

反向迭代器和正向迭代器相反&#xff0c;比如一个数组内容是1,2,3,4,5。正向迭代器就是按顺序输出&#xff0c;反向迭代器是5,4,3,2,1&#xff0c;顺序倒着。想要第一个输出5&#xff0c;需要反向迭代器rbegin在5的位置,判断输出完的条件,rend在头节点的位置就行&#xff0c;只…

【go从入门到精通】select条件控制

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…