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

el-table大数据量渲染卡顿问题

1、场景描述

在项目开发中,遇到在表格中一次性加载完的需求,且加载数量不少,有几百几千条,并且每条都可能有自己的下拉框,输入框来做编辑功能,此时普通的el-table肯定会导致浏览器卡死,那么怎么办呢?

2、解决方案

当然很多童鞋肯定会想到利用插件,其实我本人是不咋喜欢插件的,能自己写就自己写,毕竟插件可能也有bug或者啥的,万一出现了,作者不去改咋办,所以我总结了下面几个解决方法

提示:本篇博客基本都用的tsx + vue3 composition-api体验版 来写的噢,用vue2或者vue3模板语法写会更简单噢,照葫芦画瓢逻辑都是一样的,我这里就不写了,想了解相关的vue3知识我另一篇博客上有噢~

Vue3知识点学习

1、滚动触底分页(良)

当纵向滚动条触底的时候,加载新的数据到当前表格中,逻辑如下:

table.scrollTop + table.clientHeight === table.scrollHeight 

当上述成立时候触发加载,table为表格dom, 但是如果数据很多的话,每次滚动都会将新的tr加入到表格中,那表格tr dom总数还是会依次递增,dom一多照样卡死

2、滚动区间分页(良+)

如果你没有表格编辑功能,全是展示数据的话,那么这个解决方案已经完全可以了

比如你当前表格可显示区域能够展示十条数据,那么首次进来时,显示数据的区间为 [0, 9],每次表格滚动时,都动态的去获取当前展示的区间,其实这种方式是比较好的,为啥呢?因为不管你几千几万条数据,我同一时刻就只有10行,完全不会因为tr数量过多导致浏览器渲染卡顿,当然这可视区域能展示多少条数据,是有你表格可视高度和单行tr高度一起决定的

const selectWrap = table.querySelector('.el-table__body-wrapper');const selectRow = table.querySelector('table tr');展示tr数量 = Math.ceil(selectWrap.clientHeight / selectRow.clientHeight)

tsx:页面

setup() {return () => (<el-tabledata={visibleResult.value} // 可视区域的数据></el-table>)
}

ts:逻辑

  /** 表格上展示的数据 */const visibleResult = computed(() => {return result.value.filter((_item, index) => {if (index < curStartIndex.value) {return false;} else if (index > curEndIndex.value) {return false;} else {return true;}});})

那么如何去控制这个滚动区间呢?这个方法很多,监听滚动条的scroll,当向下滚动或向上滚动,我们都可以监听到,然后改变curStartIndex和curEndIndex的值就可以改变啦,这样的话,光是只看数据倒是解决了,但是要是表格要实现编辑效果咋办?每行数据有十几个下拉框和输入框,你要知道,el-select dom层级很高,像这种el-select数量一多,就算你当前展示区域没有多少条数据,也会导致渲染卡顿的,所以就有下面的优化版方案

3、滚动区间分页 + 表格编辑(优)

当前表格可视区域有30条数据,每条数据有10个el-select和5个el-input(当然可能有童鞋会说,el-select dom层级高,那我就自己写select鸭~但是你自己写的未必有el-select好看且功能相当)。此时首次加载就很卡顿了,原因就是el-select多了,那么我首先想的是这些el-select又不是直接要用,为啥不在我点击这个单元格时候再弹出下拉呢?不点击单元格时候,就直接展示文本效果(el-select没有值时展示 '请选择', 有值时展示你选择的值)

例图如下:

 滚动区间分页

 不管你有多少条数据,我始终首次只加载这么十多个tr,tr数量不变,变化的是每次的区间取值,大家会发现下面有个tr id为 virtual-scroll,那这是干什么 的呢?其实核心思路是:

显示区的高度 + 已经滚动过的高度 + 虚拟滚动条高度 === 总的数据高度table-wrapper.clientHeight + table-wrapper.scrollTop + virtual-scroll.height === data.lentth * tr.clientHeight

 是不是发现和方案1类似,但是区别不同的是,虚拟条高度可是一来就会被计算出来的,因为开始时候scrollTop为0, 那么 虚拟条高度 就是 总的数据高度 - 显示区高度

tsx: 通过自定义指令来监听表格的滚动,返回值触发loadMore方法,来决定显示区展示数据的区间

setup() {return () => (<el-tabledata={visibleResult.value} // 可视区域的数据{...{ directives: [{ name: 'load-more', value: methods.loadMore }] }}></el-table>)
}

ts: 逻辑

  /** 表格上展示的数据 */const visibleResult = computed(() => {return result.value.filter((_item, index) => {if (index < curStartIndex.value) {return false;} else if (index > curEndIndex.value) {return false;} else {return true;}});})const methods = {/*** 懒加载回调* @param startIndex 区段位置开始索引* @param endIndex 区段位置结束索引*/loadMore(startIndex: number, endIndex: number) {curStartIndex.value = startIndexcurEndIndex.value = endIndex},
}

那上面是实现滚动区间的代码,那说的表格编辑相关在哪里呢?下面即是:

表格编辑

当我们表格中有很多下拉框和输入框时,其实拖垮性能的多半是el-select,那解决方法是将渲染input和select的逻辑提出来,input不做处理,select当前单元格row,column索引和focusCell的值一致时说明单元格被聚焦了,就显示el-select,否则直接展示文本

关键方法及属性讲解:

inputChange:输入框回调

selectChange:下拉框选择回调

selectPerofrmance:下拉框当前值渲染

domPropsInnerHTML: 等同于v-html,但是jsx中不能用v-html

decorateHeader:表格各列数据我都是动态配置的,后续我会出一期博客来讲解vue3+tsx下如何封装表格

然后效果大致如下,总结下就是同一时间最多只会存在一个el-select,既然el-select dom减少了,那么表格渲染速度就自然而然快了

 上面例图中被黄色圈中的就是聚焦,没有被聚焦的都展示文本,源码讲解如下:

const focusCell = ref<string>('0,0') // 表格数据第0行第0列

 你在el-table 里有 cell-click 这个事件,它会将当前row, column全都回调回去,那么你就会知道你当前点击单元格的索引值, 我们将索引值生成, 在同一时间,focusCell只会有一条数据,所以我们直接用字符串来存储就好

<el-tableon-cell-click={methods.cellClick}
>
</el-table>const methods = {cellClick(row, column) {if (focusCell.value !== `${row.index},${column.index}`) {focusCell.value = `${row.index},${column.index}`}}
}

那么关键来了,下拉框单元格聚焦的时候,我们才显示下拉框,其他时候展示文本,输入框类型单元格聚焦的时候不做处理,代码该如何写呢?

setup() {return () => {/** 输入框类型渲染 */const inputDomRender = (scope, item) => (<el-inputvalue={scope.row[item.prop]}on-input={e => methods.inputChange(e, scope, item)}/>)/** 下拉框类型渲染 */const selectDomRender = (scope, item) => ((focusCell.value === `${scope.row.autoIndex},${scope.column.index}` ? <el-selectvalue-key='id'value={scope.row[item.prop]}onChange={e => methods.selectChange(e, scope, item)}>{item.selects.map(item1 => {return <el-optionkey={item1.id}label={item1.label}value={item1.id}></el-option>})}</el-select> : <divdomPropsInnerHTML={methods.selectPerofrmance(scope.row[item.prop], item.prop)}></div>))return <el-tableon-cell-click={methods.cellClick}>{decorateHeader.map((item: TableLabel) => {return <el-table-columnwidth={item.width}label={item.label}align={item.align ? item.align : 'center'}prop={item.prop}scopedSlots={{default: scope => {return <div>{item.mode !== 'input' ? selectDomRender(scope, item) : inputDomRender(scope, item)}</div>}}}></el-table-column>})}</el-table>}
}

自此上述两步优化,其实就能使我们一次性加载几千条可编辑数据不会卡顿了~

3、v-load-more自定义指令

源码:

import {VNodeDirective
} from 'vue'
let timeout;
/** 设置表格滚动区间 */
const setRowScrollArea = (topNum, showRowNum, binding) => {if (timeout) {clearTimeout(timeout);}timeout = setTimeout(() => {binding.value.call(null, topNum, topNum + showRowNum);});
};
const loadMore= {bind(el: Element, _binding) {setTimeout(() => {// 创建虚拟滚动条const selectWrap = el.querySelector('.el-table__body-wrapper');const selectTbody = selectWrap.querySelector('table tbody');const createElementTR = document.createElement('tr');createElementTR.id = 'virtual-scroll'selectTbody.append(createElementTR); // 先行将虚拟滚动条加入进来})},componentUpdated(el: Element, binding: VNodeDirective, vnode, oldVnode) {setTimeout(() => {const dataSize = vnode.data.attrs['data-size'];const oldDataSize = oldVnode.data.attrs['data-size'];// 当数量相同时,表明当前未发生更新,减少后续操作if (dataSize === oldDataSize) {return;}const selectWrap = el.querySelector('.el-table__body-wrapper');const selectTbody = selectWrap.querySelector('table tbody');const selectRow = selectWrap.querySelector('table tr');// 当一行都没有,说明无数据渲染,但一般逻辑都不会进入这里if (!selectRow) {return;}const rowHeight = selectRow.clientHeight;// 能够在当前显示区的展示条数,本项目就是11条const showRowNum = Math.round(selectWrap.clientHeight / rowHeight);const createElementTRHeight = (dataSize - showRowNum) * rowHeight;const createElementTR = selectTbody.querySelector('#virtual-scroll')// 监听滚动后事件selectWrap.addEventListener('scroll', function() {let topPx = this.scrollTop;let topNum = Math.round(topPx / rowHeight);const minTopNum = dataSize - showRowNum;if (topNum > minTopNum) {topNum = minTopNum;}if (topNum < 0) {topNum = 0;topPx = 0;}selectTbody.setAttribute('style', `transform: translateY(${topPx}px)`);// 本来触底的话,应该设置为0,但是触底后 就没有滚动条了createElementTR.setAttribute('style', `height: ${createElementTRHeight - topPx > 0 ? createElementTRHeight - topPx : rowHeight}px;`);setRowScrollArea(topNum, showRowNum, binding);})});}
}export default loadMore

 不太了解自定义指令是啥的可以参考我另一篇博客

vue学习(6)自定义指令详解及常见自定义指令

4、有趣拓展

1、我想在上述表格中对指定列实现高亮搜索怎么做?

当有值时滚动到指定位置,无值时不动,那首先在加载数据时,要先写下面代码

 // 先让他触发滚动,才能让virtual-scroll高度生成
table.$el.querySelector('.el-table__body-wrapper').scrollTo({ top: 1, behavior: 'smooth' })

输入框执行逻辑如下,防抖肯定是要的,然后搜索的列是 originName,当发现有搜索到值时,找到第一个被匹配到的行索引,然后去计算表格应该滚动到哪个高度位置,然后滚动

    /*** 滚动定位到表格指定位置* @param flag 是否能执行滚动的标志* @returns*/scrollToTable: () => $debounce(function() {// 当没有值时,不进行搜索if (dialogSearchKey.value) {const vmEl = table.value.$el;const selectWrap = vmEl.querySelector('.el-table__body-wrapper')if (vmEl) {const autoIndex = result.value.find((item: TableDataItem) => {return item.originName.indexOf(dialogSearchKey.value) !== -1})?.autoIndex ?? -1if (autoIndex !== -1) {scrollToIndex(selectWrap, autoIndex)}}}}, 500, false),/*** 表格滚动到指定索引值行* @param selectWrap 表格dom* @param autoIndex 索引*/scrollToIndex(selectWrap, autoIndex) {const showNum = 12 // 当显示条数小于次数时,不进行滚动操作const topPx = autoIndex * columnHeight.valueif (autoIndex > showNum) {selectWrap.scrollTo({ top: topPx, behavior: 'smooth' })}}

 然后高亮被搜索文字源码如下:

setup() {return () => {return <el-tableon-cell-click={methods.cellClick}>{decorateHeader.map((item: TableLabel) => {return <el-table-columnwidth={item.width}label={item.label}align={item.align ? item.align : 'center'}prop={item.prop}scopedSlots={{default: scope => {return <div><divclass='multiline'domPropsInnerHTML={methods.textRender(scope.row[item.prop], item.prop)}/></div>}}}></el-table-column>})}</el-table>}
}

 props.heightLight  为输入框的搜索关键词

    /*** 文字渲染* @param word 被渲染的文字* @param prop 属性名* @returns 替换后的渲染文字*/textRender(word: string, prop: string): string {const reg = new RegExp(`${props.heightLight}`, 'ig')// 有搜索关键词 && 是否有该子字符串if (props.heightLight && word.indexOf(props.heightLight) !== -1) {return word.replace(reg, `<font color='red'>$&</font>`)// 正常返回的列} else {return word}}

 2、前端实现表格导出excel

需要依赖如下:

import * as XLSX2 from 'xlsx';
import XLSX from 'xlsx-style';

存在需要对依赖源码进行打补丁的地方:

1、/node_modules/xlsx-style/dist/cpexcel.js
错误源码:var cpt = require('./cpt' + 'able');
应修改为:var cpt = cptable;2、/node_modules/xlsx-style/dist/ods.js
错误源码:return require('../' + 'xlsx').utils;
应修改为:return require('./' + 'xlsx').utils;

变量名讲解:

// props.headerDisplay: 导出excel头部
{autoIndex: '序号',originName: '视频文件',
}// exportData: 导出文件数据格式
[{autoIndex: 1,originName: 'xxx'},{autoIndex: 2,originName: 'xxx'}
]// headProp: 导出excel头部属性名数组
['autoIndex', 'originName']

 导出excel源码: 

exportTransfer(exportData, header) {nextTick(() => {const newData = [props.headerDisplay, ...exportData] // 封装组合后的数据const headProp = header.map(item => item.prop) // 头部属性数组// 把json转为worksheet对象 后续用这种方法const wb = XLSX2.utils.json_to_sheet(newData, { header: headProp, skipHeader: true })// returnconst widthList = header.map(item => item.width ? Number(item.width) : 150)// 举例一共有14列(包括序号,不包括操作栏)wb['!cols'] = [] // 先初始化列数组配置for (let i = 0; i < 14; i++) {wb['!cols'][i] = {wpx: widthList[i]}}// 样式的文档地址// https://www.npmjs.com/package/xlsx-stylefor (const key in wb) {if (key.indexOf('!') === -1) { // 非excel配置类,带!都是配置类,这里对非配置类进行样式修改wb[key].s = {font: { // 字体设置sz: 13,bold: false,color: { // 只有DEFG第一行(标题行)才是红色,其余皆是黑色rgb: new RegExp(/^[DEFG]1{1}$/).test(key) ? 'D9001B' : '000000' // 十六进制,不带#, 除去文件类型, 视频来源, 视频版权, 视频分类 这四栏标题行标红外,其他都是黑色}},alignment: { // 文字居中horizontal: 'center',vertical: 'center',wrapText: 1 // 换行},border: { // 设置边框top: { style: 'thin' },bottom: { style: 'thin' },left: { style: 'thin' },right: { style: 'thin' }}}}}const filedata = sheet2blob(wb)openDownloadDialog(filedata, `xxx`)})},/*** 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载* @param sheet excel对象* @param sheetName* @returns*/sheet2blob(sheet, sheetName?: string) {const s2ab = (s) => {const buf = new ArrayBuffer(s.length);const view = new Uint8Array(buf);for (let i = 0; i !== s.length; ++i) {view[i] = s.charCodeAt(i) & 0xFF;}return buf;}sheetName = sheetName || 'sheet1';const workbook = {SheetNames: [sheetName],Sheets: {}};workbook.Sheets[sheetName] = sheet; // 生成excel的配置项const wopts = {bookType: 'xlsx', // 要生成的文件类型bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性type: 'binary'};const wbout = XLSX.write(workbook, wopts);const blob = new Blob([s2ab(wbout)], { // 字符串转ArrayBuffertype: 'application/octet-stream'});return blob;},/*** 创建excel地址并下载到本地* @param url 文件blob二进制路径* @param saveName 文件名*/openDownloadDialog(url, saveName) {if (typeof url === 'object' && url instanceof Blob) {url = URL.createObjectURL(url); // 创建blob地址}const aLink = document.createElement('a');aLink.href = url;aLink.download = `${saveName}.xlsx`; // HTML5新增的属性,指定保存文件名let event;if (window.MouseEvent) {event = new MouseEvent('click');} else {event = document.createEvent('MouseEvents'); // 事件抛出event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);}aLink.dispatchEvent(event); // 事件派发}

有不理解的或有更好想法的可以底下评论喔~

相关文章:

el-table大数据量渲染卡顿问题

1、场景描述 在项目开发中&#xff0c;遇到在表格中一次性加载完的需求&#xff0c;且加载数量不少&#xff0c;有几百几千条&#xff0c;并且每条都可能有自己的下拉框&#xff0c;输入框来做编辑功能&#xff0c;此时普通的el-table肯定会导致浏览器卡死&#xff0c;那么怎么…...

MyBatis-Plus 实现分页的几种写法

简介MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。快速开始添加依赖全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff…...

记一次Binder内存不足导致的应用被杀

每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更&#xff0c;怀疑APP被杀掉过&#xff0c;于是开始看日志&#xff08;实际后来模拟的时候可以发现app确实被杀掉了&#xff09; APP的压测平台会上报进程号变更时间点&#xff0c;发…...

Zabbix4.0架构理解-zabbix的工作方式

目录 1.1、zabbix4.0架构图 1.2、zabbix的进程 1、 zabbix server 2、zabbix agent 3、 zabbix proxy 4、 java gateway 5、zabbix get 1.3、zabbix的几种工作方式 1、通过zabbix agent 2、通过zabbix proxy 3、通过 zabbix java gateway 4、其他 1.3、zabbix 数据走…...

MySQL中的一些非常实用的函数、语法

前言我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。1.group_concat在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。比如想统计出用户表中&#x…...

RT-Thread移植到STM32F407

文章目录第一步&#xff1a;获取RT-Thread源码第二步&#xff1a;项目结构介绍第三步&#xff1a;拷贝示例代码到裸机工程第四步&#xff1a;删除无用文件第五步&#xff1a;修改工程目录结构第六步&#xff1a;添加工程文件路径第七步&#xff1a;编译第八步&#xff1a;修改配…...

VR全景到底有多全能?为何屡受关注?

告别两年的“冰封”时期&#xff0c;现在疫情放开已经有一段时间了&#xff0c;各个行业的市场和经济已经逐步回暖&#xff0c;但是疫情对广大群众造成的心理阴影还是迟迟未有退散。就拿去电影院看电影来说&#xff0c;以前看电影是看心情&#xff0c;现在看电影则是看环境&…...

剑指 Offer 30. 包含min函数的栈

摘要 剑指 Offer 30. 包含min函数的栈 一、栈解析 package Stock;import java.util.Stack;/*** Classname JZ30min函数栈* Description TODO* Date 2023/2/24 18:59* Created by xjl*/ public class JZ30min函数栈 {/*** description 最小栈的含义是每次从栈中获取的数据都是…...

stm32f407探索者开发板(二十二)——通用定时器基本原理讲解

文章目录一、三种定时器的区别二、通用定时器特点2.1 功能特点描述2.2 计数器模式三、通用定时器工作过程四、附一、三种定时器的区别 STM32F40x系列总共最多有14个定时器 三种&#xff08;4&#xff09;STM32定时器区别 二、通用定时器特点 2.1 功能特点描述 STM3 F4的通…...

cmake 入门三 常用变量和指令

cmake常用变量 一、cmake 变量引用的方式&#xff1a; 前面我们已经提到了&#xff0c;使用${}进行变量的引用。在IF 等语句中&#xff0c;是直接使用变量名而不通过${}取值 二&#xff0c;cmake 自定义变量的方式&#xff1a; 主要有隐式定义和显式定义两种&#xff0c;一…...

Linux基础命令-find搜索文件位置

文章目录 find 命令介绍 语法格式 命令基本参数 参考实例 1&#xff09;在root/data目录下搜索*.txt的文件名 2&#xff09;搜索一天以内最后修改时间的文件&#xff1b;并将文件删除 3&#xff09;搜索777权限的文件 4&#xff09;搜索一天之前变动的文件复制到test…...

获取浏览器硬件资源的媒体数据(拍照、录音、录频、屏幕共享)

目录一、window.navigator 对象包含有关访问者浏览器的信息取二、MediaDevices1.使用麦克风2.使用摄像头&#xff08;和音频一样&#xff09;3.拍照4.录屏三、MediaRecorder(录制,可录制音频视屏)一、window.navigator 对象包含有关访问者浏览器的信息取 <!DOCTYPE html>…...

Java入门教程||Java 日期时间||Java 正则表达式

Java 日期时间java.util包提供了Date类来封装当前的日期和时间。Date类提供两个构造函数来实例化Date对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数&#xff0c;该参数是从1970年1月1日起的毫秒数。Date(long millisec)Date对象创建…...

详解八大排序算法

文章目录前言排序算法插入排序直接插入排序:希尔排序(缩小增量排序)选择排序直接选择排序堆排序交换排序冒泡排序快速排序hoare版本挖坑法前后指针版本快速排序的非递归快速排序总结归并排序归并排序的非递归实现&#xff1a;计数排序排序算法复杂度及稳定性分析总结前言 本篇…...

python库streamlit学习笔记

什么是streamlit&#xff1f; Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序。它是一个基于Python的库&#xff0c;专为机器学习工程师设计。数据科学家或机器学习工程师不是网络开发人员&#xff0c;他们对花几周时间学习…...

C/C++开发,无可避免的内存管理(篇一)-约束好跳脱的内存

一、养成内存管理好习惯 1.1 养成动态对象创建、调用及释放好习惯 开发者手动接管内存分配时&#xff0c;必须处理这两个任务。分配原始内存时&#xff0c;必须在该内存中构造对象&#xff1b;在释放该内存之前&#xff0c;必须保证适当地撤销这些对象。如果你的项目是c项目&am…...

在React项目中引入字体文件并使用

一、背景 设计稿里某些文字所用的字体&#xff0c;系统默认不支持。 比如设计需要的这个字体&#xff1a;EmerlandRegular&#xff0c;即使在css里将文字字体设置为他们&#xff0c;实际效果也显示不出来。 二、现象及原因 1、样式 2、期待效果 3、实际效果 实际上是因为这个…...

STM32 CubeMX按键点灯

本文代码使用 HAL 库。 文章目录前言一、按键原理图二、CubeMX 创建工程三、代码讲解&#xff1a;1. GPIO的输入HAL库函数&#xff1a;2. 消抖&#xff1a;3. 详细代码四&#xff0c;实验现象&#xff1a;总结前言 我们继续讲解 stm32 f103&#xff0c;这篇文章将详细 为大家讲…...

2023链动2+1模式到底是什么?带你了解核心规则

2023链动21模式到底是什么&#xff1f;带你了解核心规则 2023-02-24 梦龙 大家好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 传统的直销模式产品低价高卖&#xff0c;消费者难以接受。虽然直销省去了传统流通渠道的中间环节&#xff0c;但…...

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day14

大家好&#xff0c;我是陶然同学&#xff0c;软件工程大三今年实习。认识我的朋友们知道&#xff0c;我是科班出身&#xff0c;学的还行&#xff0c;但是对面试掌握不够&#xff0c;所以我将用这100多天更新Java面试题&#x1f643;&#x1f643;。 不敢苟同&#xff0c;相信大…...

K8S篇-搭建kubenetes集群

安装环境 这里使用pve虚拟机搭建三台centos机器&#xff0c;搭建过程参考: Centos篇-Centos Minimal安装 此次安装硬件配置 CPU&#xff1a;2C 内存&#xff1a;2G 存储&#xff1a;64G 环境说明 操作系统&#xff1a;Centos 7.9 内核版本&#xff1a;6.2.0-1.el7.elrepo…...

文本生成图像简述4——扩散模型、自回归模型、生成对抗网络的对比调研

基于近年来图像处理和语言理解方面的技术突破&#xff0c;融合图像和文本处理的多模态任务获得了广泛的关注并取得了显著成功。 文本生成图像&#xff08;text-to-image&#xff09;是图像和文本处理的多模态任务的一项子任务&#xff0c;其根据给定文本生成符合描述的真实图像…...

财务共享建设,为什么需要电子影像系统?

某集团作为投资性集团公司&#xff0c;业务遍布全国20多个省市&#xff0c;控股公司200余家&#xff0c;业务范围涉及火电、供热、风电、天然气天然气、水务、铁路、港口、酒店、地产等20多个细分行业。 伴随着集团企业的快速发展&#xff0c;某集团在管理中面临“点多、面广、…...

「RISC-V Arch」SBI 规范解读(下)

第六章 定时器扩展&#xff08;EID #0x54494D45"TIME"&#xff09; 这个定时器扩展取代了遗留定时器扩展&#xff08;EID #0x00&#xff09;&#xff0c;并遵循 v0.2 中定义的调用规约。 6.1 函数&#xff1a;设置定时器&#xff08;FID #0&#xff09; struct sbi…...

Android framework socketpair

简述 在Linux中&#xff0c;socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字&#xff0c;其中一个套接字可用于读取&#xff0c;另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信&#xff08;IPC&#xff09;。 以下是使用socketp…...

腾讯在海外游戏和短视频广告领域的新增长机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 腾讯(00700)的收入在过去几个季度一直在下降&#xff0c;部分原因是由于新冠疫情导致的经济放缓以及中国监管机构对大型科技公司的监管收紧导致游戏行业萎缩造成的。 然而&#xff0c;猛兽财经认为&#xff0c;这些不利因素…...

查找该学号学生的成绩。

从键盘输入某班学生某门课的成绩&#xff08;每班人数最多不超过40人&#xff09;&#xff0c;当输入为负值时&#xff0c;表示输入结束&#xff0c;试编程从键盘任意输入一个学号&#xff0c;查找该学号学生的成绩。**输入格式要求&#xff1a;"%ld"(学号) "%l…...

为Webpack5项目引入Buffer Polyfill

前言 最近在公司的一个项目中使用到了Webpack5&#xff0c; 然而在使用某个npm包的时候&#xff0c;出现了Buffer is not defined 这个问题&#xff0c;原因很明显了&#xff0c;因为浏览器运行时没有Buffer这个API&#xff0c;所以需要为浏览器引入Buffer Polyfill. Webpack5…...

【人工智能 AI 】您可以使用机器人流程自动化 (RPA) 实现自动化的 10 个业务流程:Robotic Process Automation (RPA)

摘:人类劳动正在被机器(例如在工业中)或计算机程序(适用于所有行业)所取代。 目录 10 processes you can robotise in your company您可以在公司中实现自动化的 10 个流程 Human employees or robotic workers?人类员工还是机器人工人? Robots take over headhunting…...

VMware ESXi 8.0b - 领先的裸机 Hypervisor (Dell HPE Custom Image update)

本站发布 Dell 和 HPE 定制版 ESXi 8.0b 镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 产品简介 VMware ESXi&#xff1a;专门构建的裸机 Hyper…...