Ant Design Vue和VUE3下的upload组件使用以及文件预览

在这里插入图片描述

Ant Design Vue和VUE3下的upload组件使用以及文件预览

文章目录

  • Ant Design Vue和VUE3下的upload组件使用以及文件预览
    • 一、多文件上传
      • 1.需求
      • 2.样例
      • 3.代码
    • 二、单文件上传
      • 1. 需求
      • 2. 样例
      • 3.代码
    • 二、多文件上传产生的时间超时问题
    • 三、文件系统名称更改
      • 1. 修改文件`index.html`
      • 2. 修改文件`index.js`
      • 3. 修改数据库存储的系统名称
    • 四、系统登陆后的首页更改

用到技术:Ant Design Vue、VUE3、xlsx的文件预览功能(也可预览txt,csv)

一、多文件上传

1.需求

  1. 可以多文件上传
  2. 文件先上传到本地,点击开始上传再通过后端接口继续上传
  3. 上传后显示全部、正确和错误的数据信息
  4. 上传后可以下载

注意细节:

  1. 最开始文件上传到本地时,右边页面不加载,当点击上传后,在右边未获取数据之前,
    a.上传组件无法再次上传;
    b:右边数据均处于加载中状态;
    c.文件下载处于不可编辑状态
  2. 加载出数据后,
    a.上传组件可再次上传;
    b.文件预览中的全部、正确和错误数据均需显示出对应的数据序号
    c.正确和错误的数据,均不显示‘比对结果’,仅全部数据显示
  3. 文件下载接口注意文件类型为‘blob’

2.样例

在这里插入图片描述

3.代码

<template>
	<a-row :gutter="8">
		<a-col :span="8">
			<a-card title="文件上传">
				<a-upload-dragger
					v-model:fileList="fileList"
					name="files"
					accept=".txt"
					:multiple="true"
					:action="action"
					:before-upload="beforeUpload"
					:disabled="upLoadDisabled"
					@remove="handleRemove"
					:showUploadList="{
						showRemoveIcon: true
					}"
				>
					<p class="ant-upload-drag-icon">
						<inbox-outlined></inbox-outlined>
					</p>
					<p class="ant-upload-text">点击或将文件拖拽到这里上传, 支持扩展名:.txt</p>
				</a-upload-dragger>
				<div style="text-align: right">
					<a-button
						type="primary"
						:disabled="fileList.length === 0"
						:loading="uploading"
						style="margin-top: 16px"
						@click="handleUpload"
					>
						{{ uploading ? '上传中' : '开始上传' }}
					</a-button>
				</div>
			</a-card>
		</a-col>
		<a-col :span="16">
			<a-card>
				<a-spin :spinning="upLoadSpinning" tip="数据加载中...">
					<a-row :gutter="16">
						<a-col :span="12">
							<a-statistic title="正确/错误(个)" :value="trueNum" class="demo-class">
								<template #suffix>
									<span>/{{ falseNum }}</span>
								</template>
							</a-statistic>
						</a-col>
						<a-col :span="12">
							<a-statistic title="完善度" :value="wcdPercent" style="margin-right: 50px" />
						</a-col>
					</a-row>
				</a-spin>
			</a-card>
			<a-card title="文件预览" style="margin-top: 5px">
				<a-spin :spinning="upLoadSpinning" tip="数据加载中...">
					<a-tabs v-model:activeKey="activeKey" type="card" @change="tabChange">
						<a-tab-pane key="0">
							<template #tab>
								<div>全部</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
								<div v-if="tableData0.length > 0">
									<a-table :columns="columns" :data-source="tableData0" bordered> </a-table>
								</div>
								<div v-else>
									<div class="emptyStyle"></div>
								</div>
							</div>
						</a-tab-pane>
						<a-tab-pane key="1">
							<template #tab>
								<div>正确</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
								<div v-if="tableData1.length > 0">
									<a-table :columns="columns1" :data-source="tableData1" bordered> </a-table>
								</div>
								<div v-else>
									<div class="emptyStyle"></div>
								</div>
							</div>
						</a-tab-pane>
						<a-tab-pane key="2">
							<template #tab>
								<div>错误</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
								<div v-if="tableData2.length > 0">
									<a-table :columns="columns1" :data-source="tableData2" bordered> </a-table>
								</div>
								<div v-else>
									<div class="emptyStyle"></div>
								</div>
							</div>
						</a-tab-pane>
						<template #rightExtra>
							<a-button @click="fileDownloadBtn" type="primary" :disabled="fileDownload">文件下载</a-button>
						</template>
					</a-tabs>
				</a-spin>
			</a-card>
		</a-col>
	</a-row>
</template>

<script setup>
	import { message } from 'ant-design-vue'
	import sysConfig from '@/config'
	import uploadApi from '@/api/auth/uploadApi'
	import * as XLSX from 'xlsx'
	import { clone } from 'lodash-es'
	import fileApi from '@/api/dev/fileApi'
	const props = defineProps({
		action: {
			type: String,
			default: '/biz/file/upload',
			required: false
		}
	})
	const action = sysConfig.API_URL + props.action
	const fileList = ref([])
	const beforeUpload = (file) => {
		fileList.value = [...(fileList.value || []), file]
		return false
	}
	const handleRemove = (file) => {
		const index = fileList.value.indexOf(file)
		const newFileList = fileList.value.slice()
		newFileList.splice(index, 1)
		fileList.value = newFileList
	}
	const handleUpload = () => {
		// 可预览
		upLoadSpinning.value = true
		upLoadDisabled.value = true
		fileDownload.value = true
		uploading.value = true
		const fileData = new FormData()
		fileList.value.forEach((item) => {
			fileData.append('files', item.originFileObj)
		})
		uploadApi
			.upload(fileData)
			.then((res) => {
				message.success(`文件上传成功`)
				previewFile()
				trueNum.value = res.trueNum
				falseNum.value = res.falseNum
				wcdPercent.value = res.wcdPercent
			})
			.catch(() => {
				message.error(`文件上传失败`)
			})
			.finally(() => {
				//开始上传按钮
				uploading.value = false
				//文件上传禁选择
				upLoadDisabled.value = false
				//可预览
				upLoadSpinning.value = false
				//可下载
				fileDownload.value = false
			})
	}
	const activeKey = ref('0')
	const uploading = ref(false)
	const upLoadSpinning = ref(true)
	const upLoadDisabled = ref(true)
	const tableData = ref([])
	const tableData0 = ref([])
	const tableData1 = ref([])
	const tableData2 = ref([])
	const columns = ref({})
	const columns1 = ref({})
	const previewFile = () => {
		uploadApi
			.download()
			.then((res) => {
				const reader = new FileReader()
				reader.readAsBinaryString(res.data)
				reader.onload = (ev) => {
					try {
						const data = ev.target.result
						const wb = XLSX.read(data, {
							type: 'binary',
							cellText: false,
							cellDates: true
						})
						const outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
						let tableheader = outdata[0]
						columns.value = [
							{
								title: '序号',
								dataIndex: '序号',
								key: '序号'
							}
						]
						columns1.value = [
							{
								title: '序号',
								dataIndex: '序号',
								key: '序号'
							}
						]
						for (let val in tableheader) {
							if (val !== '__EMPTY') {
								columns.value.push({
									title: val,
									dataIndex: val,
									key: val
								})
								if (val !== '比对结果') {
									columns1.value.push({
										title: val,
										dataIndex: val,
										key: val
									})
								}
							}
						}
						tableData.value = clone(outdata)
						tabChange(activeKey.value)
					} catch (e) {
						return false
					}
				}
				fileDownload.value = false
			})
			.catch((error) => {
				console.log(error)
			})
	}
	const tabChange = (key) => {
		if (key === '0') {
			const tableAll = tableData.value
			tableAll.forEach((v, i) => {
				v['序号'] = v.__EMPTY + 1
				v = { ...v, key: i + 1 }
			})
			tableData0.value = tableAll
		} else if (key === '1') {
			const tableTrue = tableData.value.filter((item) => item['比对结果'] === 1)
			tableTrue.forEach((v, i) => {
				v['序号'] = i + 1
			})
			tableData1.value = tableTrue
		} else if (key === '2') {
			const tableFalse = tableData.value.filter((item) => item['比对结果'] === 0)
			tableFalse.forEach((v, i) => {
				v['序号'] = i + 1
			})
			tableData2.value = tableFalse
		}
	}
	const fileDownload = ref(true)
	const trueNum = ref(0)
	const falseNum = ref(0)
	const wcdPercent = ref(0)
	const fileDownloadBtn = () => {
		upLoadSpinning.value = true
		upLoadDisabled.value = true
		fileDownload.value = true
		uploadApi
			.download()
			.then((res) => {
				message.success('文件下载成功')
				const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
				const $link = document.createElement('a')
				$link.href = URL.createObjectURL(blob)
				// $link.download = 'xxx.xlsx'
				$link.download = 'xxx.csv'
				$link.click()
				document.body.appendChild($link)
				document.body.removeChild($link) // 下载完成移除元素
				window.URL.revokeObjectURL($link.href) // 释放掉blob对象
				//文件上传禁选择
				upLoadDisabled.value = false
				//可预览
				upLoadSpinning.value = false
				//可下载
				fileDownload.value = false
			})
			.catch((error) => {
				console.log(error)
			})
	}
	onMounted(() => {
		//文件上传禁选择
		upLoadDisabled.value = false
		//可预览
		upLoadSpinning.value = false
	})
</script>

<style scoped>
	.emptyStyle {
		height: 200px;
		background-image: url(../../assets/images/empty1.png);
		background-position: center;
		background-repeat: no-repeat;
		background-size: 200px 200px;
		cursor: default;
	}
</style>

二、单文件上传

1. 需求

  1. 单个文件上传
  2. 文件直接上传,直接调用后端接口
  3. 上传后显示全部、正确和错误的数据信息
  4. 上传后可以下载

注意细节:

  1. 文件上传未完成时,不可以再次上传,不可以下载,右边需要处于加载状态
  2. 文件再次上传后,原文件被覆盖,需要清除之前的fileList
  3. 文件下载接口注意类型为blob

2. 样例

在这里插入图片描述

3.代码

<template>
	<a-row :gutter="8">
		<a-col :span="8">
			<a-card title="文件上传">
				<a-upload-dragger
					v-model:fileList="fileList"
					name="files"
					accept=".txt"
					:multiple="false"
					:action="action"
					@change="handleChange"
					:disabled="upLoadDisabled"
					:showUploadList="{
						showRemoveIcon: false
					}"
				>
					<p class="ant-upload-drag-icon">
						<inbox-outlined></inbox-outlined>
					</p>
					<p class="ant-upload-text">点击或将文件拖拽到这里上传, 支持扩展名:.txt</p>
					<p class="ant-upload-hint">仅支持单个文件上传</p>
					<template #removeIcon><StarOutlined></StarOutlined></template>
				</a-upload-dragger>
			</a-card>
		</a-col>
		<a-col :span="16">
			<a-card>
				<a-spin :spinning="upLoadSpinning" tip="文件加载中...">
					<a-row :gutter="16">
						<a-col :span="12">
							<a-statistic title="正确/错误(个)" :value="trueNum" class="demo-class">
								<template #suffix>
									<span>/{{ falseNum }}</span>
								</template>
							</a-statistic>
						</a-col>
						<a-col :span="12">
							<a-statistic title="完善度" :value="wcdPercent" style="margin-right: 50px" />
						</a-col>
					</a-row>
				</a-spin>
			</a-card>
			<a-card title="文件预览" style="margin-top: 5px">
				<a-spin :spinning="upLoadSpinning" tip="文件加载中...">
					<a-tabs v-model:activeKey="activeKey" type="card" @change="tabChange">
						<a-tab-pane key="0">
							<template #tab>
								<div>全部</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
									<div v-if="tableData0.length > 0">
										<a-table :columns="columns" :data-source="tableData0" bordered> </a-table>
									</div>
									<div v-else>
										<div class="emptyStyle"></div>
									</div>
							</div>
						</a-tab-pane>
						<a-tab-pane key="1">
							<template #tab>
								<div>正确</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
									<div v-if="tableData1.length > 0">
										<a-table :columns="columns1" :data-source="tableData1" bordered> </a-table>
									</div>
									<div v-else>
										<div class="emptyStyle"></div>
									</div>
							</div>
						</a-tab-pane>
						<a-tab-pane key="2">
							<template #tab>
								<div>错误</div>
							</template>
							<div style="padding-bottom: 20px; padding-top: 20px">
									<div v-if="tableData2.length > 0">
										<a-table :columns="columns1" :data-source="tableData2" bordered> </a-table>
									</div>
									<div v-else>
										<div class="emptyStyle"></div>
									</div>
							</div>
						</a-tab-pane>
						<template #rightExtra>
							<a-button @click="fileDownloadBtn" type="primary" :disabled="fileDownload">文件下载</a-button>
						</template>
					</a-tabs>
				</a-spin>
			</a-card>
		</a-col>
	</a-row>
</template>

<script setup>
	import { message } from 'ant-design-vue'
	import sysConfig from '@/config'
	import uploadApi from '@/api/auth/uploadApi'
	import * as XLSX from 'xlsx'
	import { clone } from 'lodash-es'
	const props = defineProps({
		action: {
			type: String,
			default: '/biz/file/upload',
			required: false
		}
	})
	const action = sysConfig.API_URL + props.action
	const fileList = ref([])
	const handleChange = (info) => {
		if (fileList.value.length > 1) {
			fileList.value.shift()
		}
		upLoadSpinning.value = true
		upLoadDisabled.value = true
		fileDownload.value = true
		const status = info.file.status
		if (status === 'done') {
			if (info.file.response.code === 200) {
				message.success(`${info.file.name}上传成功`)
				trueNum.value = info.file.response.data.trueNum
				falseNum.value = info.file.response.data.falseNum
				wcdPercent.value = info.file.response.data.wcdPercent
				//文件上传禁选择
				upLoadDisabled.value = false
			}
			//可预览
			upLoadSpinning.value = false
			//可下载
			fileDownload.value = false
			previewFile(1)
		} else if (status === 'error') {
			message.error(`${info.file.name}上传失败`)
			//文件上传禁选择
			upLoadDisabled.value = false
			//可预览
			upLoadSpinning.value = false
			//可下载
			fileDownload.value = false
		} else if (status === 'removed') {
			//文件上传禁选择
			upLoadDisabled.value = false
			//可预览
			upLoadSpinning.value = false
			//可下载
			fileDownload.value = false
		}
	}
	const activeKey = ref('0')
	const upLoadSpinning = ref(true)
	const upLoadDisabled = ref(true)
	const tableData = ref([])
	const tableData0 = ref([])
	const tableData1 = ref([])
	const tableData2 = ref([])
	const columns = ref({})
	const columns1 = ref({})
	const previewFile = () => {
		uploadApi
			.download()
			.then((res) => {
				const reader = new FileReader()
				reader.readAsBinaryString(res.data)
				reader.onload = (ev) => {
					try {
						const data = ev.target.result
						const wb = XLSX.read(data, {
							type: 'binary',
							cellText: false,
							cellDates: true
						})
						const outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
						let tableheader = outdata[0]
						columns.value = [
							{
								title: '序号',
								dataIndex: '序号',
								key: '序号'
							}
						]
						columns1.value = [
							{
								title: '序号',
								dataIndex: '序号',
								key: '序号'
							}
						]
						for (let val in tableheader) {
							if (val !== '__EMPTY') {
								columns.value.push({
									title: val,
									dataIndex: val,
									key: val
								})
								if (val !== '比对结果') {
									columns1.value.push({
										title: val,
										dataIndex: val,
										key: val
									})
								}
							}
						}
						tableData.value = clone(outdata)
						tabChange(activeKey.value)
					} catch (e) {
						return false
					}
				}
				fileDownload.value = false
				upLoadDisabled.value = false
				//可预览
				upLoadSpinning.value = false
			})
			.catch((error) => {
				console.log(error)
			})
	}
	const tabChange = (key) => {
		console.log(key, 'key')
		if (key === '0') {
			const tableAll = tableData.value
			tableAll.forEach((v, i) => {
				v['序号'] = v.__EMPTY + 1
				v = { ...v, key: i + 1 }
			})
			tableData0.value = tableAll
		} else if (key === '1') {
			const tableTrue = tableData.value.filter((item) => item['比对结果'] === 1)
			tableTrue.forEach((v, i) => {
				v['序号'] = i + 1
			})
			tableData1.value = tableTrue
		} else if (key === '2') {
			const tableFalse = tableData.value.filter((item) => item['比对结果'] === 0)
			tableFalse.forEach((v, i) => {
				v['序号'] = i + 1
			})
			tableData2.value = tableFalse
		}
	}
	const fileDownload = ref(true)
	const trueNum = ref(0)
	const falseNum = ref(0)
	const wcdPercent = ref(0)
	const fileDownloadBtn = () => {
		upLoadSpinning.value = true
		upLoadDisabled.value = true
		fileDownload.value = true
		uploadApi
			.download()
			.then((res) => {
				message.success('文件下载成功')
				const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
				const $link = document.createElement('a')
				$link.href = URL.createObjectURL(blob)
				// $link.download = 'xxx.xlsx'
				$link.download = 'xxx.csv'
				$link.click()
				document.body.appendChild($link)
				document.body.removeChild($link) // 下载完成移除元素
				window.URL.revokeObjectURL($link.href) // 释放掉blob对象
				//文件上传禁选择
				upLoadDisabled.value = false
				//可预览
				upLoadSpinning.value = false
				//可下载
				fileDownload.value = false
			})
			.catch((error) => {
				console.log(error)
			})
	}
	onMounted(() => {
		//文件上传禁选择
		upLoadDisabled.value = false
		//可预览
		upLoadSpinning.value = false
	})
</script>

<style scoped>
	.emptyStyle {
		height: 200px;
		background-image: url(../../assets/images/empty1.png);
		background-position: center;
		background-repeat: no-repeat;
		background-size: 200px 200px;
		cursor: default;
	}
</style>

二、多文件上传产生的时间超时问题

当上传文件太多时,需要延长请求时间,以减少报错情况

文件路径:src/config/index.js
修改该文件中的TIMEOUT以延长请求时间
在这里插入图片描述

三、文件系统名称更改

1. 修改文件index.html

文件路径:index.html,修改这两处,即可修改刷新系统时候,浏览器显示的系统名称
在这里插入图片描述

2. 修改文件index.js

文件路径:src/config/index.js,修改此处即可修改登陆页面系统名称
在这里插入图片描述

3. 修改数据库存储的系统名称

在这里插入图片描述

四、系统登陆后的首页更改

原始首页为个人首页,若想修改为自己想要的页面,并且面包屑也不显示已去除的个人首页时,需修改文件util.js
文件路径:src/views/auth/login/util.js
在这里插入图片描述

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

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

相关文章

现货大宗商品交易系统开发及平台需要哪些资质

现货大宗商品交易平台需要一系列资质和条件来确保其合法、合规运营&#xff0c;保障投资者的权益和市场的稳定。以下是现货大宗商品交易平台需要的主要资质和条件&#xff1a; 公司注册与法人资格&#xff1a;平台需要依法办理工商注册登记手续&#xff0c;并具有法人资格。这…

硬核分享|如何使用AI根据一段文字描述来生成图片

硬核分享|如何使用AI根据一段文字描述来生成图片_哔哩哔哩_bilibili 最近许多人询问关于AIGC生成图片工具的推荐问题&#xff0c;深感寻找一款好用的AIGC生成图片工具在当今信息爆炸时代的重要性。现在&#xff0c;为大家分享几款好用的AIGC生成图片工具&#xff0c;一起探索吧…

【C++】vector容器初步模拟

送给大家一句话&#xff1a; 努力一点&#xff0c;漂亮—点&#xff0c;阳光一点。早晚有一天&#xff0c;你会惊艳了时光&#xff0c;既无人能替&#xff0c;又光芒万丈。 vector容器初步模拟 1 认识vector开始了解底层实现 2 开始实现成员变量构造函数 析构函数尾插迭代器插入…

FX110网:FCA揭露Admirals的克隆实体!冒充正规平台行骗

近日&#xff0c;英国金融行为监管局&#xff08;FCA&#xff09;曝光了多个网址&#xff0c;揭露克隆实体fxsadmiral / admiral-fx / admiralsfx。这些克隆公司复制授权公司Admiral Markets UK Ltd的重要信息&#xff0c;试图让人们相信他们的公司是真实的。FCA本次披露的克隆…

记录西门子200:PUT和GET通讯测试

GET/PUT&#xff1a;S7-200SMART之间专有通讯协议。 准备两台Smart-PLC&#xff0c;这里使用的ST60和CR40。外加一个交换机。 CR40的地址设置是&#xff1a;192.168.2.1 用来读 ST60的地址设置是&#xff1a;192.168.2.2 用来写 打开软件&#xff0c;选择CPU-CR4配…

深入探索Java并发库(JUC)中的ReentrantReadWriteLock

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java并发编程的世界中&#xff0c;锁是一种用于同步访问共享资源的机制。Java并发库&#xff08;JUC&#xff09;为我们提供了多…

简易指南:国内ip切换手机软件怎么弄

在网络访问受到地域限制的情况下&#xff0c;使用国内IP切换手机软件可以帮助用户轻松访问被屏蔽的内容&#xff0c;扩展网络体验。以下是虎观代理小二分享的使用国内IP切换手机软件的简易指南。并提供一些注意事项。 如何在手机上使用国内IP切换软件 步骤一&#xff1a;选择I…

PHP连接达梦数据库

PDO是一种在PHP中连接数据库的接口&#xff0c;可以通过PDO接口使用PHP连接达梦数据库。 1、安装PHP环境 检查当前环境是否安装PHP [rootlocalhost ~]# php -v 当前环境并未安装PHP&#xff0c;需要进行安装&#xff0c;选择安装PHP7.3版本。 2、安装 epel-release源和源管…

工程信号的去噪和(分类、回归和时序)预测

&#x1f680;【信号去噪及预测论文代码指导】&#x1f680; 还为小论文没有思路烦恼么&#xff1f;本人专注于最前沿的信号处理与预测技术——基于信号模态分解的去噪算法和深度学习的信号&#xff08;回归、时序和分类&#xff09;预测算法&#xff0c;致力于为您提供最精确、…

【Python爬虫】网络爬虫:信息获取与合规应用

这里写目录标题 前言网络爬虫的工作原理网络爬虫的应用领域网络爬虫的技术挑战网络爬虫的伦理问题结语福利 前言 网络爬虫&#xff0c;又称网络爬虫、网络蜘蛛、网络机器人等&#xff0c;是一种按照一定的规则自动地获取万维网信息的程序或者脚本。它可以根据一定的策略自动地浏…

常用的6个的ChatGPT网站,国内可用!

GPTGod &#x1f310; 链接&#xff1a; GPTGod &#x1f3f7;️ 标签&#xff1a; GPT-4 免费体验 支持API 支持绘图 付费选项 &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&#xff0c;包括API接入和绘图支持。用户可以选择免…

【阿里魔搭】modelscope包下载安装

最终解决方案&#xff1a;使用源码安装modelscope 这里写目录标题 问题描述&#xff1a;pip安装包冲突安装步骤 问题描述&#xff1a;pip安装包冲突 一开始的是在3.11的虚拟环境下使用命令行pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.al…

DUSt3R:简化三维重建

3D 重建是从二维 (2D) 图像创建对象或场景的 3D 虚拟表示的任务&#xff0c;可用于模拟、可视化或本地化等多种目的。 它广泛应用于计算机视觉、机器人和虚拟现实&#xff08;VR&#xff09;等多个领域。 在基本设置中&#xff0c;3D 重建方法输入一对图像 I1 和 I2&#xff0c…

字体测试集:选取、应用与兼容性指南

1. 字体测试集 本人非专业字体工作者&#xff0c;字体测试集为个人经验总结整理&#xff0c;仅供参考 那时&#xff0c;天下人的口音、言语都是一样。 南去經三國&#xff0c;東來過五湖 南去经三国&#xff0c;东来过五湖 永东国酬爱郁灵鹰袋 0Oo1lI ga The quick brown fox j…

6个免费的ChatGPT网站

AI 大模型的出现给时代带来了深远的影响&#xff1a; 改变了产业格局&#xff1a;AI 大模型的发展推动了人工智能技术在各行业的广泛应用&#xff0c;改变了传统产业的运作方式&#xff0c;促进了新兴产业的崛起&#xff0c;如智能驾驶、医疗健康、金融科技等。提升了科学研究…

微软发布首款AI PC ,产业链有望迎来新一轮量价齐升

3月21日晚&#xff0c;微软举办主题为“办公新时代”的线上新品发布会&#xff0c;发布Surface Pro 10和Surface Laptop 6&#xff0c;新品将搭载基于英特尔酷睿Ultra或高通骁龙X Elite的处理器&#xff0c;配备新一代NPU&#xff0c;以增强AI性能。 这两款AI PC将支持“AI Exp…

土地利用的时序建模

1、LULC 模型的现状 最近的土地利用和土地覆盖 (LULC) 建模进展来自两种方法。 在一种方法中&#xff0c;现有模型适用于 LULC&#xff0c;而在另一种方法中&#xff0c;模型架构是针对 LULC 明确设计的。 随着大型基础模型的兴起&#xff0c;人工智能和深度学习取得了重大进…

数据结构 二叉树 力扣例题AC——代码以及思路记录

LCR 175. 计算二叉树的深 某公司架构以二叉树形式记录&#xff0c;请返回该公司的层级数。 AC int calculateDepth(struct TreeNode* root) {if (root NULL){return 0;}else{return 1 fmax(calculateDepth(root->left), calculateDepth(root->right));} } 代码思路 …

【Linux C | 多线程编程】线程的创建、线程ID、线程属性

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-03-22 0…

SSC9211_USB-CAM解决方案

一、方案描述 SSC9211是一种用于USB-CAM应用程序跟场景的高度集成的SOC产品。平台本身基于ARM层-A7双核&#xff0c;内置16位&#xff0c;64M的DDR2&#xff0c;集成了图像传感器接口、高级ISP、高性能JPEG编码器和其他丰富的外设接口。支持单&#xff0c;双 MIPI sensor方案&…