前端--导出
这边记录我们公司后端做的导出接口和前端是如何对接的
这边的技术栈是:
1: react
2: fetch
第一步:简单封装--导出界面
import { DrawerForm } from '@ant-design/pro-components';
import { CloseOutlined } from '@ant-design/icons';
import { Col, Input, Row, Select, DatePicker, message, InputNumber, Card, Button } from 'antd'
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import { DEPT_NAMESPACE } from "@/actions/dept";
import { getCurrentUser } from "@/utils/authority";
import { getDictBiz } from "@/utils/utils";
import { DICT_BIZ_NAMESPACE } from "@/actions/dictbiz";
import { clubSetMealSave, clubSetMealUpdate } from "@/services/club";
import { list } from '@/services/menu';import style from './common.less';const { TextArea } = Input;function NewExp(props) {//show 是根据需要是否展示下方的弹窗//hang 是根据返回结果关闭弹窗//changeHange 是根据需要把参数返回出去//title 是弹窗的标题//Component 是触发弹窗的关键const { title, Component, changeHange, hang, show } = props// 时间const [startDate, setStartDate] = useState(null)const [startDate1, setStartDate1] = useState(null)const [flag, setflag] = useState(false)const submit = async () => {// 判断时间if (!show) {if (startDate != null || startDate1 != null) {// 时间比较大小if (startDate1 < startDate) {return message.error('结束时间不能小于开始时间')}let data = {d1: startDate,d2: startDate1,}changeHange(data)if (hang() == 1) {setflag(false)setStartDate(null)setStartDate1(null)}}} else {changeHange()if (hang() == 1) {setflag(false)setStartDate(null)setStartDate1(null)}}// if (res?.success) {// message.success('保存成功')// setflag(false)// changeupadte()// }}const onChange = (date, dateString) => {setStartDate(dateString)};const onChange1 = (date, dateString) => {setStartDate1(dateString)};return (<>{!show ?<><DrawerFormclassName={style.common}submitter={{resetButtonProps: { type: 'dashed' },submitButtonProps: { style: { display: 'none' } },resetButtonRender: (_, dom) => null,// <Button key="submit" type="primary" onClick={() => { submit() }}>保存</Button>render: (props, defaultDoms) => {return [<Button key="clean" onClick={() => { setflag(false) }}>取消</Button>,<Button key="close" type="primary" onClick={() => { submit('pass') }}>下载</Button>,]}}} drawerProps={{closeIcon: null,destroyOnClose: true,extra: <CloseOutlined onClick={() => setflag(false)} />}}visible={flag}onVisibleChange={(e) => {setflag(e)}}width={440}onFinish={() => submit()}title={<span style={{color: '#1F1F1F',fontSize: '18px',fontWeight: 600,height: '22px',lineHeight: '22px'}}>{title}</span>}trigger={Component}><div style={{ ...style0 }}><div style={{ ...style1 }}>导出开始时间</div><DatePicker placeholder='请选择开始时间' style={{ ...style2 }} onChange={onChange} /></div><div style={{ ...style0, margin: '20px 0' }}><div style={{ ...style1, }}>导出结束结束</div><DatePicker placeholder='请选择结束时间' style={{ ...style2 }} onChange={onChange1} /></div></DrawerForm></>:<><ButtononClick={() => { submit('pass') }}type="primary">导出</Button></>}</>)
}
const style0 = {display: 'flex',justifyContent: 'space-between',alignItems: 'center',
}
const style1 = {width: '22%'
}
const style2 = {width: '76%'
}
const mapStateToProps = (state) => {return {};
};export default connect(mapStateToProps)(NewExp)
第二步:封装请求导出js-----utils
import { stringify } from 'qs';//引入qs库export async function download(url, params) {// /api/blade-cust/custhubAppointment/export-customerconst urls = `/api/${url}?${stringify(params)}`;const response = await fetch(urls, {method: 'GET',headers: {'Authorization': ``,'Blade-Auth': `Bearer ${getAccessToken()}` //请求token,'Content-Type': 'application/json' //JSON形式----有时候也是具体什么时候用看需求 //responseType:"blob",,}});if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const blob = await response.blob();const contentDisposition = response.headers.get('content-disposition');const filename = contentDisposition ? contentDisposition.split('filename=')[1].replace(/"/g, '') : 'exported_data.csv';const urlBlob = window.URL.createObjectURL(blob);const a = document.createElement('a');if (a) {
//创建了一个a 直接下载 a.href = urlBlob;a.download = filename;document.body.appendChild(a);a.click();a.remove();window.URL.revokeObjectURL(urlBlob);return true //这边是给我返回成功的状态}}
第三步:导入封好的js---使用
import { download } from '@/utils/utils'const hang = () => {return 1}const changeHange = async (e) => {try {
//这个都是 参数---接口需要const startTime = e.d1;const endTime = e.d2;const type = userRole;const bigType = defaultvalue;const params1 = {startTime,endTime,type,bigType};let d = await download('blade-cust/custhubCustomer/export-customer', params1)if (d) {message.success('导出成功,请保存')hang()}} catch (error) {console.error('Export failed:', error);}}//导出显示组件<NewExps title={'导出'}hang={hang}Component={<Button type="primary">导出</Button>}changeHange={changeHange}></NewExps>
上方是不用打开新的页面---直接可以点击下载的
这个是打开新界面---代码奉献上---弹窗一个 直接会弹出对应的下载框

import { Upload, Switch, Button, Card, Col, Input, message, Modal, Row, Tree } from 'antd';Modal.confirm({title: '用户导出确认',content: '是否导出用户数据?',okText: '确定',okType: 'danger',cancelText: '取消',onOk() {const account = params.account || '';const realName = params.realName || '';window.open(`/api/blade-system/user/export-user?Blade-Auth=bearer ${getAccessToken()}&account=${account}&realName=${realName}`);},onCancel() {},});
相关文章:
前端--导出
这边记录我们公司后端做的导出接口和前端是如何对接的 这边的技术栈是: 1: react 2: fetch 第一步:简单封装--导出界面 import { DrawerForm } from ant-design/pro-components; import { CloseOutlined } f…...
【数据库系统概论】触发器
【数据库系统概论】触发器 概述 在数据库系统中,触发器(Trigger)是一种特殊的存储过程,当特定事件在数据库表上发生时,会自动执行。触发器主要用于确保数据的完整性、一致性和实现复杂的业务规则。触发器是由用户定义…...
小白跟做江科大32单片机之按键控制LED
原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地,一般用于滤波,在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大,就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…...
每天写java到期末考试(6.6)-java文件输入输出流实验
1、用字节流读写二进制文件 要求:用DataOutputStreamFileOutputStream类将1,2,…,100,这100个数字写入到文件 d:\out1.bin里,然后再用DatalnputStreamFilelnputStream类将d:\out1.bin的内读出来,并输出到屏幕上。 用DataOutputStreamFileOutputStream写入二进制数据时,直接调…...
Word2021中的The Mathtype DLL cannot be found问题解决(office 16+mathtype7+非初次安装)
问题描述,我的问题发生在word中无法使用自定义功能区中的mathtype 我的环境是:W11Word2021mathtype7 因为我是第二次安装mathtype7,所以我怀疑是因为没有卸载干净,于是我参考了下面这篇文章的做法 参考文章 1.首先重新卸载当前的…...
【Android面试八股文】在Java中传参数时是将值进行传递,还是传递引用?
在Java中传参数时是将值进行传递,还是传递引用? 这道题想考察什么? 是否了解什么是值传递和引用传递与真实场景使用,是否熟悉什么是值传递和引用传递在工作中的表现是什么? 考察的知识点 什么是值传递和引用传递的概念,两者对开发中编写的代码的影响 考生应该如何回…...
神经网络 torch.nn---Linear Layers(nn.Linear)
torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation nn.Linear torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 参数: in_features - 每个输入样本的大小out_features - 每个输出…...
PPT视频如何16倍速或者加速播放
有两种方式,一种是修改PPT本身,这种方式非常繁琐,不太推荐,还有一种就是修改视频本身,直接让视频是16倍速的视频即可。 如何让视频16倍速,我建议人生苦短,我用Python,几行代码&…...
【ai】DeepStream 简介
NVIDIA Metropolis 平台。 NVIDIA 大都会 利用视觉 AI 将来自数万亿物联网设备的数据转化为有价值的见解。 NVIDIA Metropolis 是一个应用程序框架、一套开发工具和合作伙伴生态系统,它将视觉数据和 AI 结合在一起,以提高各行各业的运营效率和安全性。它有助于理解数万亿个…...
如何学习使用淘宝API?淘宝API运营场景
学习使用淘宝API涉及对其功能、分类、调用方法及实际应用的综合理解。下面按部分详细解释如何系统地学习和掌握淘宝API的使用: 淘宝API接口入门 了解淘宝开放平台:淘宝开放平台为开发者提供了一个可以与淘宝数据进行交互的平台,涵盖了丰富的A…...
Java 面试题:Java 的动态代理是基于什么原理?
编程语言通常有各种不同的分类角度,动态类型和静态类型就是其中一种分类角度,简单区分就是语言类型信息是在运行时检查,还是编译期检查。 与其近似的还有一个对比,就是所谓强类型和弱类型,就是不同类型变量赋值时&…...
Python logging 模块详解
Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分,因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能,包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标,以及…...
http://account.battlenet.com.cn
http://account.battlenet.com.cn 魔兽战网 短信验证 查了下,我老早以前账号还在,纪念下,少玩游戏。...
java第二十课 —— 面向对象习题
类与对象练习题 编写类 A01,定义方法 max,实现求某个 double 数组的最大值,并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…...
Flask的模块化实践
既作为前端,又作为后端的我,写flask写了那么多行了,其实它们属于不同的模块,比如登录,注册,聊天,用户画像,那我觉得有必要分一下了,系统化的处理一下,不然找个…...
锁存器(Latch)的产生与特点
Latch 是什么 Latch 其实就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息。锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效&#…...
搜维尔科技:「案例」Faceware电影中面部动画的演变历程
面部动画是电影中角色表演的一个重要方面,尤其是在严重依赖电子动画、化妆效果和动作捕捉系统的奇幻电影中。在《龙与地下城:盗贼荣誉》电影中,龙裔角色的面部动画是一个复杂的系统,使该生物在大屏幕上栩栩如生。该系统依赖于一种…...
特征工程技巧—Bert
前段时间在参加比赛,发现有一些比赛上公开的代码,其中的数据预处理步骤值得我们参考。 平常我们见到的都是数据预处理,现在我们来讲一下特征工程跟数据预处理的区别。 数据预处理是指对原始数据进行清洗、转换、缩放等操作,以便为…...
更改 Docker 的默认存储位置
记录一下使用 Docker 遇到的问题,Docker 也用得比较多,最近发现根目录所在磁盘快满了,发现是 Docker 默认会将镜像和容器等数据保存在目录 /var/lib/docker 目录下,我们可以更改 Docker 的默认存储位置,比如改到数据盘…...
搜索与图论:图中点的层次
搜索与图论:图中点的层次 题目描述参考代码 题目描述 输入样例 4 5 1 2 2 3 3 4 1 3 1 4输出样例 1参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n, m; int h[N], e[N]…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...
数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
