当前位置: 首页 > news >正文

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 } = valthis.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.applypropsDatathis.applySubjectData.name=this.applypropsData.aPersonNamethis.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:1aCompanyName: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')// returnthis.$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, // 申请单位NOaCompanyName: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>

相关文章:

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

提醒自己&#xff1a; 这是之前的逻辑&#xff0c;或许你重新写会有更好的方法&#xff0c;可以参考逻辑&#xff01;&#xff01;&#xff01; 功能介绍 1.有面包屑点击切换 2.有公司、部门、人员 3.单选、多选实现 4.编辑/回显 5.使用随意切换层级和跳转到指定层级回显等功…...

【以图搜图】GPUNPU适配万物识别模型和Milvus向量数据库

目录 以图搜图介绍项目地址Milvuscv_resnest101_general_recognition 代码使用流程结果展示模型部署环境Milvus部署及使用docker安装docker-compose安装Milvus可视化工具Attu进入网页端 Data数据示例点个赞再走呗&#xff01;比心&#x1f49e;️ 以图搜图 • &#x1f916; Mo…...

迷茫了!去大厂还是创业?

大家好&#xff0c;我是麦叔&#xff0c;最近我创建了一个 学习圈子 有球友在 星球 里提问。 大厂的layout岗位和小厂的硬件工程师岗位&#xff0c;该如何选择&#xff1f; 这个问题我曾经也纠结过&#xff0c;不过现在的我&#xff0c;I am awake&#xff01; 肯定是有大点大。…...

Qt源码分析: QEventLoop实现原理

QEventLoop屏蔽了底层消息循环实现细节&#xff0c;向上提供了与平台无关的消息/事件循环。 本文拟对Windows系统下QEventLoop的实现原理予以分析。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 …...

痛失offer的八股

java面试八股 mysql篇&#xff1a; 事物的性质&#xff1a; 事物的性质有acid四特性。 a&#xff1a;automic&#xff0c;原子性&#xff0c;要么全部成功&#xff0c;要么全部失败&#xff0c;mysql的undolog&#xff0c;事物在执行的时候&#xff0c;mysql会进行一个快照读…...

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…...

知识蒸馏——深度学习的简化之道 !!

文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里&#xff0c;大型神经网络因其出色的性能和准确性而备受青睐。然而&#xff0c;这些网络通常包含数百万甚至数十亿个参数&#xff0c;使得它们在资源受限的环境下&…...

【爬虫】Selenium打开新tab页截图并关闭

如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 &#x1f3b5; 王菲《如愿》 在自动化测试和网页抓取中&#xff0c;Selenium WebDriver 是一个强大的工具&…...

09 事务和连接池

文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量&#xff0c;用于放连接。 创建Properties静态常量&#xff0c;用于解析properties文件 静态代码块中&#xff0c;解析properties文件&#xff0c;将解析结果用于创建连接池 …...

P4344 [SHOI2015] 脑洞治疗仪 线段树+二分

主要是维护一个连续区间&#xff0c;比较经典的题目&#xff0c;还要考虑一下二分的情况&#xff0c;否则很难处理&#xff0c;比较有难度。这里和序列操作一题的区别是不需要考虑1的个数&#xff0c;因为不需要取反。传送门https://www.luogu.com.cn/problem/P4344 #include&…...

解决大型语言模型中的幻觉问题:前沿技术的综述

大型语言模型中的幻觉问题及其解决技术综述 摘要 大型语言模型(LLM)如GPT-4、PaLM和Llama在自然语言生成能力方面取得了显著进步。然而&#xff0c;它们倾向于产生看似连贯但实际上不正确或与输入上下文脱节的幻觉内容&#xff0c;这限制了它们的可靠性和安全部署。随着LLM在…...

机器学习流程—AutoML

文章目录 机器学习流程—AutoMLAutoML工具Auto-SKLearnMLBoxTPOTRapidMinerPyCaretAuto-KerasH2OAutoML谷歌AutoML云Uber LudwigTransmogrifAIAutoGluonAutoWekaDataRobot...

Ubuntu 23.10 tar包安装和配置Elasticsearch kibana 7.13.3

目录 一、环境说明 二、准备工作 三、安装elasticsearch 3.1 安装elasticsearch 3.2 添加服务和设置开机启动 四、安装kibana 4.1. 安装kibana 4.2 添加服务和设置开机启动 出于工作需要&#xff0c;需要在Ubuntu 23.10系统上通过tar包方式安…...

glibc内存管理ptmalloc

1、前言 今天想谈谈ptmalloc如何为应用程序分配释放内存的&#xff0c;基于以下几点原因才聊它&#xff1a; C/C 70%的问题是内存问题。了解一点分配器原理对解决应用程序内存问题肯定有帮助。C也在用ptmalloc. 当你在C中new一个对象时&#xff0c;底层还是依赖glibc中的ptma…...

HarmonyOS入门学习

HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…...

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…...

spring cloud gateway k8s优雅启停

通过配置readiness探针和preStop hook&#xff0c;实现优雅启动和停止&#xff08;滚动部署&#xff09; 1. k8s工作负载配置 readinessProbe:httpGet:path: /datetimeport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 1periodSeconds: 30successThreshold: 1fa…...

嵌入式软件面试-linux-中高级问题

Linux系统启动过程&#xff1a; BIOS自检并加载引导程序。引导程序&#xff08;如GRUB&#xff09;加载Linux内核到内存。内核初始化硬件&#xff0c;加载驱动&#xff0c;建立内存管理。加载init进程&#xff08;PID为1&#xff09;&#xff0c;通常是systemd或SysVinit。init…...

css禁用元素指针事件,鼠标穿透,点击下层元素,用`pointer-events:none;`

pointer-events: 对鼠标事件的反应 MDN pointer-events 英文 https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events 菜鸟教程 CSS pointer-events 属性 https://www.runoob.com/cssref/css3-pr-pointer-events.html 常用取值 auto 和 none pointer-events: aut…...

Eureka的介绍和作用,以及搭建

一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具&#xff0c;它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一&#xff0c;它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

作为点的对象CenterNet论文阅读

摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表&#xff0c;并对每一个位置进行分类。这种做法既浪费又低效&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采取了不同的方法。我们将物体建模为单…...