react + pro-components + ts完成单文件上传和批量上传
上传部分使用的是antd中的Upload组件,具体如下:
GradingFilingReportUpload方法是后端已经做好文件流,前端只需要调用接口即可
单文件上传
<Uploadkey={`upload_${record.id}`}showUploadList={false}accept=".xlsx"maxCount={1}customRequest={({ file }) => {const formData = new FormData();formData.append('id', record.id);formData.append('ins', file);GradingFilingReportUpload(formData).then(res => {if (res.state === 200) {message.success(res.message);} else {message.error('上传失败');}})}}
><a >上传</a></Upload>
多文件上传
页面组件
<UploadshowUploadList={false}multiplecustomRequest={({ file, onSuccess, onError }) => {handleRequestAllFile([file]).then(() => onSuccess && onSuccess('上传成功')).catch(() => onError)}}
><a >批量上传</a>
</Upload>
js逻辑
const handleRequestAllFile = async (fileList: any[]) => {try {const formData = new FormData();fileList.forEach((file) => {formData.append('ins', file);})const res = await GradingFilingReportUpload(formData);if (res.state === 200) {message.success('文件上传成功');} else {message.error('文件上传失败');}} catch (e) {message.error('文件上传过程出错')}}
完整页面代码
import { downLoad, downLoadStream } from '@/util/request';
import { ProTable } from '@ant-design/pro-components';
import { getTableColumns } from './colums'
import { useEffect, useRef, useState } from 'react';
import DeleteBtn from './components/DeleteBtn';
import { Button, Table, Upload, message } from 'antd';
import { DeleteOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import type { GradingFilingReportData, GradingFilingReportSelect } from '@/types/GradingFilingReport';
import { GradingFilingReportDataList, deleteDataById, GradingFilingReportUpload } from '@/service/GradingFilingReport'
import AddEditModal, { MODAL_TYPE } from './components/AddEditModal';
const GradingFilingReport = () => {const [columns, setColumns] = useState<ProColumns<GradingFilingReportData>[]>([]);const actionRef = useRef<ActionType>();const [SortOrderTest, setSortOrderTest] = useState<string>('');const [valueEnums, setValueEnums] = useState<GradingFilingReportSelect>({});// 获取表格数据const getData = async (filter: any) => {const params = { ...filter, offSet: filter.current, orderType: SortOrderTest };delete params.current;const { state, total, data } = (await GradingFilingReportDataList(params)) || {};if (state === 200) {return { data, success: true, total: total };} else {return { data: [] };}};// 下载文件const downLoadFileThis = async (item: any) => {let fileName = item.systemName + '.xlsx'let id = item.idlet downloadParams = { id }let url = '/projectAcceptance/service/ratingFilingReportService/downloadReport/0'downLoad(url, downloadParams).then(res => {downLoadStream(res, fileName);}).catch((e) => {message.error('导出失败');}).finally(() => {console.log('完成');})}// 获取表格的表头数据const getTableConfig = async () => {const { columns, valueEnums } = await getTableColumns();setValueEnums(valueEnums);setColumns([...columns,{title: '操作',valueType: 'option',key: 'option',fixed: 'right',width: 160,align: 'center',render: (text, record: any, index, action) => [<AddEditModalkey={`edit_${record.id}`}type={MODAL_TYPE.EDIT}record={record}valueEnums={valueEnums}callback={() => {action && action.reload();}}/>,<DeleteBtn<Array<any>>key={`delete_${record.id}`}params={record.id || ''}method={deleteDataById}callback={() => {action && action.reload();}}/>,<Uploadkey={`upload_${record.id}`}showUploadList={false}accept=".xlsx"maxCount={1}customRequest={({ file }) => {const formData = new FormData();formData.append('id', record.id);formData.append('ins', file);GradingFilingReportUpload(formData).then(res => {if (res.state === 200) {message.success(res.message);} else {message.error('上传失败');}})}}><a >上传</a></Upload>,<a key={`download_${record.id}`} onClick={() => downLoadFileThis(record)}>下载</a>],},]);}// 批量上传的方法const handleRequestAllFile = async (fileList: any[]) => {try {const formData = new FormData();fileList.forEach((file) => {formData.append('ins', file);})const res = await GradingFilingReportUpload(formData);if (res.state === 200) {message.success('文件上传成功');} else {message.error('文件上传失败');}} catch (e) {message.error('文件上传过程出错')}}// 批量上传的按钮const toolBarRender = (action: ActionType | undefined) => {return [<UploadshowUploadList={false}multiplecustomRequest={({ file, onSuccess, onError }) => {handleRequestAllFile([file]).then(() => onSuccess && onSuccess('上传成功')).catch(() => onError)}}><a >批量上传</a></Upload>];};// 完成排序功能const handleChange = (pagination: any, filters: any, sorter: any) => {console.log(sorter, 'sorter');if (sorter.order !== undefined) {setSortOrderTest(sorter.order === 'descend' ? 'DESC' : 'ASC');}};// 初始化调用useEffect(() => {getTableConfig()}, [])return (<ProTable<GradingFilingReportData>rowKey="id"cardBorderedactionRef={actionRef}request={getData}columns={columns}search={{labelWidth: 100,}}onChange={handleChange}toolBarRender={toolBarRender}scroll={{ x: 'max-content' }}rowSelection={{selections: [Table.SELECTION_ALL],}}tableAlertOptionRender={({ selectedRowKeys }) => {return (<DeleteBtn<Array<any>>content={<Button type="link" icon={<DeleteOutlined />}>{'批量删除'}</Button>}method={deleteDataById}params={selectedRowKeys}callback={() => actionRef.current && actionRef.current.reload()}/>);}}/>)
}
export default GradingFilingReport
相关文章:
react + pro-components + ts完成单文件上传和批量上传
上传部分使用的是antd中的Upload组件,具体如下: GradingFilingReportUpload方法是后端已经做好文件流,前端只需要调用接口即可 单文件上传 <Uploadkey{upload_${record.id}}showUploadList{false}accept".xlsx"maxCount{1}customRequest{({ file }) > {const …...
暑假第一周——ZARA仿写
iOS学习 前言首页:无限轮播图商城:分类我的:自定义cell总结 前言 结束了UI的基础学习,现在综合运用开始写第一个demo,在实践中提升。 首页:无限轮播图 先给出效果: 无限轮播图,顾…...
github.com/antchfx/jsonquery基本使用
要在 GitHub 上使用 antchfx/jsonquery 库来查找 JSON 文档中的元素,首先需要了解这个库的基本用法。jsonquery 是一个用于查询 JSON 数据的 Go 语言库,允许使用 XPath 表达式来查找和选择 JSON 数据中的元素。 以下是一些基本步骤和示例,演…...
【python虚拟环境管理】【mac m3】使用poetry管理python项目
文章目录 一. 为什么选择poetry二. poetry相关操作1. 创建并激活环境2. 依赖包管理2.1. 安装项目依赖1.2. 管理不同开发环境的依赖1.3. 依赖维护1.4. 项目相关 Poetry是Python中用于依赖管理和打包的工具。它允许您声明项目所依赖的库,并将为您管理(安装…...
《JavaSE》---16.<抽象类接口Object类>
目录 前言 一、抽象类 1.1什么是抽象类 1.2抽象类代码实现 1.3 抽象类特点 1.4抽象类的作用 二、接口 2.1什么是接口 2.2接口的代码书写 2.3 接口使用 2.4 接口特点 2.5 实现多个接口 快捷键(ctrl i ): 2.6接口的好处 2.7 接…...
简单修改,让UE4/5着色器编译速度变快
简单修改,让UE4/5着色器编译速度变快 目录 简单修改,让UE4/5着色器编译速度变快 一、问题描述 二、解决方法 (一)硬件升级 (二)调整相关设置和提升优先级 1.调整相关设置 (1)…...
如何查看极狐GitLab Helm Chart?
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…...
代码随想录算法训练营第十六天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
写代码的第十六天,自从到了二叉树错误版代码就少了,因为我自己根本没思路,都是看完思路在做,那基本上就是小语法问题,很少有其他问题了,证实了我好菜。。。。。。 还是得写思路啊啊啊啊,写思路好…...
NODEJS复习(ctfshow334-344)
NODEJS复习 web334 下载源码代码审计 发现账号密码 代码逻辑 var findUser function(name, password){ return users.find(function(item){ return name!CTFSHOW && item.username name.toUpperCase() && item.password password; }); }; 名字不等于ctf…...
【Go系列】RPC和grpc
承上启下 介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于…...
【VUE】v-if和v-for的优先级
v-if和v-for v-if 用来显示和隐藏元素 flag为true时,dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历,可以遍历数字对象数组,会将整个元素遍历指定次数 <!-- 遍…...
【单目3D检测】smoke(1):模型方案详解
纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息,而是采取直接回归3D信息,这种思路简单又高效,并不需要复杂的前后处理,而且是一种one stage方法,对于实际业务部署也很友好。 题目:SMOKE&…...
数据库系统概论:数据库系统的锁机制
引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,数据作为一种共享资源,其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象(如表、行等)进行加锁,以确保在同…...
Django+vue自动化测试平台(28)-- ADB获取设备信息
概述 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下…...
RESTful API设计指南:构建高效、可扩展和易用的API
文章目录 引言一、RESTful API概述1.1 什么是RESTful API1.2 RESTful API的重要性 二、RESTful API的基本原则2.1 资源导向设计2.2 HTTP方法的正确使用 三、URL设计3.1 使用名词而非动词3.2 使用复数形式表示资源集合 四、请求和响应设计4.1 HTTP状态码4.2 响应格式4.2.1 响应实…...
npm下载的依赖包版本号怎么看
npm下载的依赖包版本号怎么看 版本号一般分三个部分,主版本号、次版本号、补丁版本号。 主版本号:一般依赖包发生重大更新时,主版本号才回发生变化,如Vue2.x到Vue3.x。次版本号:当依赖包中发生了一些小变化ÿ…...
css前端面试题
1.什么是css盒子模型? 盒子模型包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素。 标准盒子模型和IE盒子模型的区别在于其对元素的w…...
Vue从零到实战
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...
【Chatgpt大语言模型医学领域中如何应用】
随着人工智能技术 AI 的不断发展和应用,ChatGPT 作为一种强大的自然语言处理技术,无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成,还是语音识别、计算机视觉等方面,ChatGPT 都有着广泛的应用前景。特别在临床医学领…...
ES6 正则的扩展(十九)
1. 正则表达式字面量改进 特性:在 ES6 中,正则表达式字面量允许在字符串中使用斜杠(/)作为分隔符。 用法:简化正则表达式的书写。 const regex1 /foo/; const regex2 /foo/g; // 全局搜索2. u 修饰符(U…...
<数据集>钢铁缺陷检测数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:1800张 标注数量(xml文件个数):1800 标注数量(txt文件个数):1800 标注类别数:6 标注类别名称:[crazing, patches, inclusion, pitted_surface, rolled-in_scale, scr…...
Kafka系列之:Kafka存储数据相关重要参数理解
Kafka系列之:Kafka存储数据相关重要参数理解 一、log.segment.bytes二、log.retention.bytes三、日志段四、log.retention.check.interval.ms五、数据底层文件六、index、log、snapshot、timeindex、leader-epoch-checkpoint、partition.metadata一、log.segment.bytes 参数lo…...
Template execution failed: ReferenceError: name is not defined
问题 我们使用了html-webpack-plugin(webpack)进行编译html,导致的错误。 排查结果 连接地址 html-webpack-plugin版本低(2.30.1),html模板里面不能有符号,注释都不行 // var reg new RegExp((^|&)${name}([^&…...
CVE-2024-24549 Apache Tomcat - Denial of Service
https://lists.apache.org/thread/4c50rmomhbbsdgfjsgwlb51xdwfjdcvg Apache Tomcat输入验证错误漏洞,HTTP/2请求的输入验证不正确,会导致拒绝服务,可以借助该漏洞攻击服务器。 https://mvnrepository.com/artifact/org.apache.tomcat.embed/…...
Linux下如何安装配置Graylog日志管理工具
Graylog是一个开源的日志管理工具,可以帮助我们收集、存储和分析大量的日志数据。它提供了强大的搜索、过滤和可视化功能,可以帮助我们轻松地监控系统和应用程序的运行情况。 在Linux系统下安装和配置Graylog主要包括以下几个步骤: 准备安装…...
「MQTT over QUIC」与「MQTT over TCP」与 「TCP 」通信测试报告
一、结论 在实车5G测试中「MQTT Over QUIC」整体表现优于「TCP」,可在系统架构升级时采用MQTT Over QUIC替换原有的TCP通讯;从实现原理上基于QUIC比基于TCP在弱网、网络抖动导致频繁重连场景延迟更低。 二、测试方案 网络类型:实车5G、实车…...
获取磁盘剩余容量-----c++
获取磁盘剩余容量 #include <filesystem>struct DiskSpaceInfo {double total;double free;double available; };DiskSpaceInfo getDiskSpace(const std::string& path) {std::filesystem::space_info si std::filesystem::space(path);DiskSpaceInfo info;info.…...
AI算法24-决策树C4.5算法
目录 决策树C4.5算法概述 决策树C4.5算法简介 决策树C4.5算法发展历史 决策树C4.5算法原理 信息熵(Information Entropy) 信息增益(Information Gain) 信息增益比(Gain Ratio) 决策树C4.5算法改进 …...
【云原生】Prometheus整合Alertmanager告警规则使用详解
目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…...
C++ :友元类
友元类的概念和使用 (1)将类A声明为B中的friend class后,则A中所有成员函数都成为类B的友元函数了 (2)代码实战:友元类的定义和使用友元类是单向的 (3)友元类是单向的,代码实战验证 互为友元类 (1)2个类可以互为友元类,代码实战…...
如何建立网站链接/注册公司流程和费用
一、MNIST手写数字介绍 1、获取样本 手写数字的MNIST数据库可从此页面获得,其中包含60,000个示例的训练集以及10,000个示例的测试集。它是NIST提供的更大集合的子集。这些数字已经过尺寸标准化并以固定尺寸的图像为中心。 下载链接:http://yann.lecun.co…...
网站如何做谷歌优化/seo与sem的区别和联系
一、程序员的特性 技术出身的职场人特性很明显,与做市场、业务出身的职场人区别尤其明显。IT行业中常见的一些职场角色:老板、项目经理、产品经理、需求分析师、设计师、开发工程师、运维工程师等。开发工程师具有如下特征: 1、逻辑思维清晰、…...
做网上贸易哪个网站好/360推广官网
目录 一、简介 二、防碰撞系统 1.三种碰撞场景 2.基本安全信息(BSM) 三、三种对V2V通信的攻击 1.攻击者模型 2.基于碰撞前场景的攻击 四、方法 五、特征选择 七、总结 随着自动驾驶技术的不断发展,提高汽车安全性的一个新趋势是车辆…...
西宁电子商务网站建设/免费seo培训
这是松哥之前一个零散的笔记,整理出来分享给大伙! MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了。受困于 Linux 和 MySQL 版本问题,很多人经常会搭建失败,今天松哥就给大伙举一个成功的例子,后面有时间再…...
做旅游网站课程设计报告/5g站长工具查询
笔者为了学习PHP,WIN7系统上装了XAMPP。 默认情况下,mysql的root密码为空。在命令行下,通过mysql -u root即可进入。笔者在mysql数据库下user表中更改了root密码,退出后,发现root用户使用新设置密码登录不了。root用户…...
建设报名系统官方网站/seo网站推广什么意思
IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…...