【Vue】Element开发笔记
Element开发笔记
前言
官网 https://element.eleme.cn/#/zh-CN/component/upload
其它项目网站
https://www.cnblogs.com/qq2806933146xiaobai/p/17180878.html
表格
序号列添加
<el-table-column type="index" :index="handleIndexCalc" label="#" align="center" />
handleIndexCalc是计算分页中的ID,否则序号不准确。
// 自动计算分页 Id
handleIndexCalc(index) {return ((this.queryParams.pageIndex - 1) * this.queryParams.pageSize + index + 1)
},
选择列添加
<el-table-column sortable type="selection" align="center" />
注意:同时拥有 序号列、选择列,序号必须在 选择列前面
表格高度统一,防止数据量少时,页脚上升
表格设置height
属性,根据浏览器界面大小自动计算高度,留页脚面板高度。
<el-table ref="dataResult"v-loading="loading":data="dataResult.dataSource":height="tableHeight":default-sort="{ prop: queryParams.orderby, order: queryParams.sort }"row-key="id"stripeborderstyle="width: 100%;height=250"@sort-change="handleSortable">
Data:
// 表格高度
tableHeight: window.innerHeight - 280,
项目实例:
<!-- 表格数据展示 --><el-row><el-table ref="dataResult"v-loading="loading":data="dataResult.dataSource":height="tableHeight":default-sort="{ prop: queryParams.orderby, order: queryParams.sort }"row-key="id"stripeborderstyle="width: 100%;height=250"@sort-change="handleSortable"><el-table-column type="index" :index="handleIndexCalc" label="#" align="center" /><el-table-column sortable type="selection" align="center" /><el-table-column sortable prop="title" :show-overflow-tooltip="true" align="center" label="标题" width="200px" /><el-table-column sortable prop="fileName" :show-overflow-tooltip="true" align="left" label="文档名称" width="200px" /><el-table-column sortable prop="fileType" :show-overflow-tooltip="true" align="left" label="文档格式" width="100px" /><el-table-column sortable prop="securityLevel" align="left" label="密级" width="80px" /><el-table-column prop="keyWords" :show-overflow-tooltip="true" align="left" label="关键字" width="200px" /><el-table-column sortable prop="fileSource" :show-overflow-tooltip="true" align="left" label="资料来源" width="100px" /><el-table-column sortable prop="createName" align="left" label="创建人" width="100px" /><el-table-column sortable prop="createTime" :show-overflow-tooltip="true" align="left" label="创建时间" width="200px" /><el-table-column sortable prop="downloadCount" :show-overflow-tooltip="true" align="left" label="下载次数" width="100px" /><el-table-column sortable prop="status_dictText" :show-overflow-tooltip="true" align="left" label="审核状态" width="100px" /><el-table-column prop="failReason" align="left" :show-overflow-tooltip="true" label="不通过原因" width="250px" /><el-table-column prop="remarks" align="left" :show-overflow-tooltip="true" label="备注" width="300px" /><el-table-column label="操作" align="center" fixed="right" width="300px"><template slot-scope="scope"><el-button v-permission="['PRIV_DOC_PREVIEW']" type="text" size="mini" @click="handlePreview(scope.row)">预览</el-button><el-button v-permission="['PRIV_DOC_EDIT']" type="text" size="mini" @click="handleEdit(scope.row)">修改</el-button><el-button v-permission="['PRIV_DOC_DOWNLOAD']" type="text" size="mini" @click="handleDownLoad(scope.row)">下载</el-button><el-button v-if="scope.row.status !='3'" v-permission="['PRIV_DOC_APPROVED']" type="text" size="small" @click="handleApproved(scope.row)">审批</el-button><el-button v-if="scope.row.status !='4'" v-permission="['PRIV_DOC_APPROVEDFAILED']" type="text" size="small" @click="handleApprovedFail(scope.row)">驳回</el-button></template></el-table-column></el-table><pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageIndex" :limit.sync="queryParams.pageSize" @pagination="getList" /></el-row>
Select选择器
<template><el-select v-model="value" clearable placeholder="请选择"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"></el-option></el-select>
</template><script>export default {data() {return {options: [{value: '选项1',label: '黄金糕'}, {value: '选项2',label: '双皮奶'}, {value: '选项3',label: '蚵仔煎'}, {value: '选项4',label: '龙须面'}, {value: '选项5',label: '北京烤鸭'}],value: ''}}}
</script>
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
value / v-model | 绑定值 | boolean / string / number | — | — |
multiple | 是否多选 | boolean | — | false |
disabled | 是否禁用 | boolean | — | false |
value-key | 作为 value 唯一标识的键名,绑定值为对象类型时必填 | string | — | value |
size | 输入框尺寸 | string | medium/small/mini | — |
clearable | 是否可以清空选项 | boolean | — | false |
collapse-tags | 多选时是否将选中值按文字的形式展示 | boolean | — | false |
multiple-limit | 多选时用户最多可以选择的项目数,为 0 则不限制 | number | — | 0 |
name | select input 的 name 属性 | string | — | — |
autocomplete | select input 的 autocomplete 属性 | string | — | off |
auto-complete | 下个主版本弃用 | string | — | off |
placeholder | 占位符 | string | — | 请选择 |
filterable | 是否可搜索 | boolean | — | false |
allow-create | 是否允许用户创建新条目,需配合 filterable 使用 | boolean | — | false |
filter-method | 自定义搜索方法 | function | — | — |
remote | 是否为远程搜索 | boolean | — | false |
remote-method | 远程搜索方法 | function | — | — |
loading | 是否正在从远程获取数据 | boolean | — | false |
loading-text | 远程加载时显示的文字 | string | — | 加载中 |
no-match-text | 搜索条件无匹配时显示的文字,也可以使用slot="empty" 设置 | string | — | 无匹配数据 |
no-data-text | 选项为空时显示的文字,也可以使用slot="empty" 设置 | string | — | 无数据 |
popper-class | Select 下拉框的类名 | string | — | — |
reserve-keyword | 多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词 | boolean | — | false |
default-first-option | 在输入框按下回车,选择第一个匹配项。需配合 filterable 或 remote 使用 | boolean | - | false |
popper-append-to-body | 是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 false | boolean | - | true |
automatic-dropdown | 对于不可搜索的 Select,是否在输入框获得焦点后自动弹出选项菜单 | boolean | - | false |
项目实例
<el-select v-model="queryParams.queryStatus" placeholder="请选择文档状态" filterable clearable @change="handleSelectSearchStatus"><el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value" /></el-select>
// 搜索框-文档状态statusOptions: [],// 创建时 created() {getOption('SYSTEM_STATUS').then((response) => {this.statusOptions = response.data}),this.getList()},// 选择文档状态(搜索框)handleSelectSearchStatus(e) {this.queryParams.queryStatus = e},
el-select
使用 multiple
多选属性时,数据定义必须符合规范,并且返回的是 字符串数组
,一开始需要定义好,否则数据无法显示。
<el-selectv-model="keyWordsList"multiplefilterableallow-createdefault-first-optionplaceholder="请填写关键字(可多选,可手填按回车键)"><el-optionv-for="item in keyWordsOptions":key="item.wordName":label="item.wordName":value="item.wordName" /></el-select>
// 控件绑定的keyWordsList: [],/** 编辑按钮操作 */handleEdit(row) {this.reset()this.postForm = { ...row }this.keyWordsList = row.keyWords.split(',') //数据库取出来是字符串,转数组this.bOpenForm = truethis.title = '编辑文档'},
dialog弹出框
需要注意浅拷贝
和 深拷贝
问题,row是Object对象类型,如果直接赋值,就变成了 浅拷贝
,相当于我们的引用传递。
//方法一
this.form = JSON.parse(JSON.stringify(row));
//方法二
this.form = {...row}
/** 新增按钮操作 */
handleCreate() {this.reset()this.open = truethis.title = '添加关键字'
},
/** 修改按钮操作 */
handleUpdate(row) {this.reset()this.form = { ...row }this.open = truethis.title = '修改关键字'
},
每次窗体打开,并不会清除上一次验证规则
,需要手动调用clearValidate()
方法清除,与C#一样。
watch: {// 打开弹窗,清空上一次验证规则bOpenForm: {handler(newVal) {if (newVal) {this.$nextTick(() => {this.$refs['postForm'].clearValidate()})}},},},
el-upload上传组件
:action是执行上传动作的后台接口,el-button是触发上传的按钮。
multiple 设置是否可以同时选中多个文件上传
accept 设置限制上传文件的格式
<el-upload :action="uploadActionUrl"accept="image/jpeg,image/gif,image/png":before-upload="onBeforeUpload"multiple:limit="3":on-exceed="handleExceed"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">请上传图片格式文件</div>
</el-upload>
...onBeforeUpload(file){const isIMAGE = file.type === 'image/jpeg'||'image/gif'||'image/png';const isLt1M = file.size / 1024 / 1024 < 1;if (!isIMAGE) {this.$message.error('上传文件只能是图片格式!');}if (!isLt1M) {this.$message.error('上传文件大小不能超过 1MB!');}return isIMAGE && isLt1M;}
属性
参数 | 说明dd | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
action | 必选参数,上传的地址 | string | — | — |
headers | 设置上传的请求头部 | object | — | — |
multiple | 是否支持多选文件 | boolean | — | — |
data | 上传时附带的额外参数 | object | — | — |
name | 上传的文件字段名 | string | — | file |
with-credentials | 支持发送 cookie 凭证信息 | boolean | — | false |
show-file-list | 是否显示已上传文件列表 | boolean | — | true |
drag | 是否启用拖拽上传 | boolean | — | false |
accept | 接受上传的文件类型(thumbnail-mode 模式下此参数无效) | string | — | — |
on-preview | 点击文件列表中已上传的文件时的钩子 | function(file) | — | — |
on-remove | 文件列表移除文件时的钩子 | function(file, fileList) | — | — |
on-success | 文件上传成功时的钩子 | function(response, file, fileList) | — | — |
on-error | 文件上传失败时的钩子 | function(err, file, fileList) | — | — |
on-progress | 文件上传时的钩子 | function(event, file, fileList) | — | — |
on-change | 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 | function(file, fileList) | — | — |
before-upload | 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。 | function(file) | — | — |
before-remove | 删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。 | function(file, fileList) | — | — |
list-type | 文件列表的类型 | string | text/picture/picture-card | text |
auto-upload | 是否在选取文件后立即进行上传 | boolean | — | true |
file-list | 上传的文件列表, 例如: [{name: ‘food.jpg’, url: ‘https://xxx.cdn.com/xxx.jpg’}] | array | — | [] |
http-request | 覆盖默认的上传行为,可以自定义上传的实现 | function | — | — |
disabled | 是否禁用 | boolean | — | false |
limit | 最大允许上传个数 | number | — | — |
on-exceed | 文件超出个数限制时的钩子 | function(files, fileList) | — | - |
项目实例
这里使用了,父组件向子组件传参,子组件向父组件传参
。
<el-form-item label="上传附件" prop="fileName"><file-upload v-model="postForm.fileName" :uploadlimit="filelimit" :accept="fileAccept" :listType="filelistType" @fileList="getFileList" :actionUrl="fileActionUrl" :tips="filetips" /></el-form-item>
父组件传参数
// 上传附件fileActionUrl: CONFIG_URL.PUBLIC_CONFIG.baseURL + '/api/doc/UpLoadFile',fileAccept: '.doc, .docx, .xls, .xlsx, .ppt, .pptx, .pdf',filelimit: 1,filelistType: 'file',filetips: '只能上传办公文档,其它类型建议不要上传',
子组件接收参数,在props
中定义
// 接收父组件传递的值props: {// 动作actionactionUrl: {type: String,required: true,default: '/api/doc/UpLoadFile'},// 接受上传的文件类型accept: {type: String,required: true},// 最大允许上传个数uploadlimit: {type: Number,required: true,default: 1},/** 文件列表的类型* drag是否启用拖拽上传* list-type 可选值 text/picture/picture-card**/listType: {type: String,required: true,default: 'text'},// 上传提示语tips: {type: String,required: false}},
子组件向父组件回传数据
// $emit() 向外触发父组件中方法,fileList由父组件传递过来this.$emit("fileList", this.ret_fileList)
父组件接收子组件回传的数据,需要在watch
监听器中实现,能够感知数据变化。
watch: {// 监听文件列表变化fileList: {handler() {this.$emit('fileList', this.ret_fileList)}}},
子组件代码
<!-- 文件上传通用组件(支持拖拽上传,打开本地资源管理器) -->
<template><div class="content"><el-upload:action="actionUrl":accept="accept":on-preview="handlePreview":before-remove="beforeRemove":on-remove="handleRemove":on-exceed="handleExceed":on-success="handleSuccess":drag="listType!=='picture'":limit="uploadlimit":headers="header":file-list="fileList":list-type="listType"><el-button v-if="listType==='picture'" size="small" type="primary">点击上传</el-button><i v-if="listType!=='picture'" class="el-icon-upload" /><div v-if="listType!=='picture'" class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><!-- 附件提示信息 --><div v-if="tips" slot="tip" class="el-upload__tip">{{ tips }}</div></el-upload></div>
</template>
<script>
import { getToken } from '@/utils/auth'
export default {name: 'FileUpload',// 接收父组件传递的值props: {// 动作actionactionUrl: {type: String,required: true,default: '/api/doc/UpLoadFile'},// 接受上传的文件类型accept: {type: String,required: true},// 最大允许上传个数uploadlimit: {type: Number,required: true,default: 1},/** 文件列表的类型* drag是否启用拖拽上传* list-type 可选值 text/picture/picture-card**/listType: {type: String,required: true,default: 'text'},// 上传提示语tips: {type: String,required: false}},data() {return {// 界面绑定的文件列表,参数不可更改,否则底层无法识别// 上传的文件列表,例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}]fileList: [], // 服务器返回的文件列表ret_fileList: [],header: {}}},/*** watch侦听器* 侦听父组件传递的值,实现动态传递数据*/// watch: {// },created() {this.header = { token: getToken() }},methods: {// 文件列表重置reset() {this.ret_fileList = [ {fileName: undefined,fileType: undefined,fileUrl: undefined,viewUrl: undefined,cover: ''}]},// 文件超出个数限制时的钩子handleExceed() {this.$message.warning(`每次只能上传 ${this.uploadlimit} 个文件`)},// 点击的文件列表元素handlePreview(file) {console.log("你点击了 " + file.name)this.$message.warning("你点击了 " + file.name)},// 删除文件之前的钩子beforeRemove(file) {return this.$confirm(`确定移除 ${ file.name }文件?`)},// 文件列表移除文件时的钩子handleRemove(file, fileList) {console.log(file, fileList);this.fileList = this.fileList.filter((item) => {return item.name !== file.name })},// 文件上传成功时的钩子handleSuccess(response) {if (response.statusCode === 200) {this.$message({message: '上传成功',type: 'success'})this.ret_fileList = response.data}else{this.$message({type: 'error',message: response.msg})this.reset()}// $emit() 向外触发父组件中方法,fileList由父组件传递过来this.$emit("fileList", this.ret_fileList)}}
}</script>
相关文章:
【Vue】Element开发笔记
Element开发笔记 前言 官网 https://element.eleme.cn/#/zh-CN/component/upload 其它项目网站 https://www.cnblogs.com/qq2806933146xiaobai/p/17180878.html 表格 序号列添加 <el-table-column type"index" :index"handleIndexCalc" label&qu…...
How to install mongodb 7.0 to Ubuntu 22.04
How to install mongodb 7.0 to Ubuntu 22.04 1、安装1.1、添加gpg1.2、添加apt源1.3、更新1.4、安装 2、管理2.1、服务管理2.1.1、查看服务状态2.1.2、启动服务2.1.3、 设置服务为开机启动2.1.4、取消服务开机启动2.1.5、关闭服务2.1.6、服务重启 2.2、mongosh2.2.1、进入mong…...

AFL安全漏洞挖掘
安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、AFL简介 二、AFL的安装 三、代码示例及种子语料库 四、AFL插桩编译 五、AFL运行及测试 六、AFL结果分析 一、AFL简介 模糊测试(Fuzzing)技术作为漏洞挖掘最有…...
ES6 let const var和解构赋值
1.let/const和var的区别 1.变量提升:var会发生变量提升,let和const不存在变量提升 2.暂时性死区:变量声明之前变量不可用称为暂时性死区。var不存在,let和const存在暂时性死区 3.typeof 不再是百分百不会报错:let声…...

03、MySQL-------数据库中间件MyCat实现读写分离
目录 八、数据库中间件MyCat实现读写分离1、克隆:2、配置分析:1、schema.xml2、启动mycat:3、关闭防火墙:4、代码测试:测试写入:测试读:强制读Master 八、数据库中间件MyCat实现读写分离 作用&…...

虹科活动 | 探索全新AR应用时代,虹科AR VIP研讨会广州场回顾!
文章来源:虹科数字化AR 阅读原文:https://mp.weixin.qq.com/s/7tmYR42Tw5XLn70fm8Nnew 主题演讲 本次研讨会,虹科特邀 “工业AR鼻祖” 美国Vuzix公司的首席应用工程师郑慎方先生进行主题演讲,并邀请到了各界的专业人士和企业代表参…...

非科班,补基础
大家好,我是大彬~ 今天跟大家分享知识星球小伙伴关于【非科班转码如何补基础】的提问。 往期星球提问整理: 读博?找工作? 性格测试真的很重要 想找一份实习工作,需要准备什么 球友提问: 大彬大佬…...
安全性与合规性:IT运维的双重守护
在当今数字化时代,信息技术(IT)已深入渗透到企业的各个层面。随着数据和技术的不断发展,IT运维安全性和合规性逐渐成为了企业运营的两大核心要素。它们不仅保障了企业数据的安全,更维护了公司的声誉和客户信任。本文将…...

session 反序列化
原理详解 ctfshow web 263 ctfshow 新手杯 剪刀石头布 这里我们可以发现服务器使用的处理器为php_serialize,与当前页面处理器不同,在反序列化的时候会造成一些问题。同时cleanup配置没开,关闭了session自动清理,所以我们不需要…...
PostgreSQL中实现数学中的组合问题
记得在学《数值分析》这门课程时,其中有排列组合的相关计算。最近没有想到,自己居然在编程上需要了这个问题,需要在数据库的一张表中,找出任意n条记录的组合,判断组合后的图形是什么,也就是组合问题。从网上搜索的相关资料,发现很多是在Java或者python代码实现的。因为数…...

编译和连接
前言:哈喽小伙伴们,从我们开始学习C语言到实现如今的成果,可以说我们对C语言的掌握已经算是精通级别了,但是我们只学习了怎么写代码,却没怎么了解过代码的背后是怎么工作的。 那么今天这篇文章我们一起来学习C语言的最…...

常见分布整理
概率论 - 常见分布(及其分布表) 常见分布的期望和方差 离散型分布 两点分布 有2种结果,实验只做1次 X~b(1,p)则有 P(X k) pk (1-p)1-k,k 0, 1 数学期望:E(X) p 方差:D(X)p(1-p) 二项分布 P(A) p࿰…...

ubuntu终端命令行下如何使用NetworkManager(netplan)来配置wifi网络
最近在给家里折腾一个文件共享服务器给家里的小米摄像头保存监控视频用。树莓派太贵了,找来找去发现香橙派orangepi zero3 是最低成本的替代解决方案(网络足够快,CPU的IO能力足够强),香橙派orangepi zero3的操作系统是…...

GO学习之 goroutine的调度原理
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

CUDA学习笔记5——CUDA程序错误检测
CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值,代表了一种错误信息;只有返回cudaSuccess时,才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…...

虹科 | 解决方案 | 机械免拆压力测试方案
对于发动机的气门卡滞或气门开闭时刻错误、活塞环磨损、喷油嘴泄漏/堵塞等故障,往往需要解体发动机或拆卸部件才能发现;而对于某些轻微的故障,即使解体了发动机后也经常难于肉眼判别 虹科Pico提供的WPS500压力测试方案,可以动态测…...

Python数据挖掘实用案例——自动售货机销售数据分析与应用
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…...

深度学习技巧应用29-软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式
大家好,我是微学AI,今天给大家介绍一下软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式。我们知道软件设计模式有23种,考试的时候经常会考到,但是这么种里面我们如何取判断它呢,如何去记忆它呢&a…...

中文编程开发语言工具应用案例:ps5体验馆计时收费管理系统软件
中文编程开发语言工具应用案例:ps5体验馆计时收费管理系统软件 软件部分功能: 1、计时计费功能:只需点开始计时即可,时间直观显示 2、商品管理功能:可以管理饮料等商品 3、会员管理功能:支持只用手机号作…...

绘制核密度估计图
简介 核密度估计图(Kernel Density Estimation,KDE)是一种用于估计数据分布的非参数方法,通常用于可视化和理解数据的分布情况。它通过平滑地估计数据的概率密度函数(PDF)来显示数据的分布特征,…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)
之前都是使用react-pdf来渲染pdf文件,这次有个需求是要兼容xp环境,xp上chrome最高支持到49,虽然说iframe或者embed都可以实现预览pdf,但为了后续的定制化需求,还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...