芋道----如何在自己的业务模块中添加导入导出功能

导出不再多做介绍,代码自动生成就会有,这里介绍一下如何实现导入:

一、首先介绍前台:

1)页面上添加导入按钮
        <el-buttontype="primary"plainicon="el-icon-download"size="mini"@click="handleImport">导入</el-button>
2)   hanleImport方法:
   /** 导入按钮操作 */handleImport() {this.upload.title = "学校导入";this.upload.open = true;},

这里打开了一个对话框,让用户选择对应的文件上传,dialog内容如下:

<el-dialog:title="upload.title":visible.sync="upload.open"width="400px"append-to-body><el-uploadref="upload":limit="1"accept=".xlsx, .xls":headers="upload.headers":action="upload.url + '?updateSupport=' + upload.updateSupport":disabled="upload.isUploading":on-progress="handleFileUploadProgress":on-success="handleFileSuccess":auto-upload="false"drag><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip text-center" slot="tip"><div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据</div><span>仅允许导入xls、xlsx格式文件。</span><el-linktype="primary":underline="false"style="font-size: 12px; vertical-align: baseline"@click="importTemplate">下载模板</el-link></div></el-upload><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitFileForm">确 定</el-button><el-button @click="upload.open = false">取 消</el-button></div></el-dialog>
3) data中的参数如下:
      // 导入参数upload: {// 是否显示弹出层open: false,// 弹出层标题title: "",// 是否禁用上传isUploading: false,// 是否更新已经存在的用户数据updateSupport: 0,// 设置上传的请求头部headers: getBaseHeader(),// 上传的地址url: process.env.VUE_APP_BASE_API + "/admin-api/oa/school/import",},

这里的url直接会跳转到后台对应的controller

4)   添加对应方法:

handleFileUploadProgress:

    // 文件上传中处理handleFileUploadProgress(event, file, fileList) {this.upload.isUploading = true;},

 handleFileSuccess:

// 文件上传成功处理handleFileSuccess(response, file, fileList) {console.log("🚀 ~ handleFileSuccess ~ response:", response);if (response.code !== 0) {this.$modal.msgError(response.msg);return;}this.upload.open = false;this.upload.isUploading = false;this.$refs.upload.clearFiles();// 拼接提示语let data = response.data;let text = "创建成功数量:" + data.createSchoolnames.length;for (const schoolname of data.createSchoolnames) {text += "<br />&nbsp;&nbsp;&nbsp;&nbsp;" + schoolname;}text += "<br />更新成功数量:" + data.updateSchoolnames.length;for (const schoolname of data.updateSchoolnames) {text += "<br />&nbsp;&nbsp;&nbsp;&nbsp;" + schoolname;}text += "<br />更新失败数量:" + Object.keys(data.failureSchoolnames).length;for (const schoolname in data.failureSchoolnames) {text +="<br />&nbsp;&nbsp;&nbsp;&nbsp;" +schoolname +":" +data.failureSchoolnames[schoolname];}this.$alert(text, "导入结果", { dangerouslyUseHTMLString: true });this.getList();},

 importTemplate: 需要调后台取模板

    /** 下载模板操作 */importTemplate() {importTemplate().then((response) => {this.$download.excel(response, "用户导入模板.xls");});},

 最后是提交方法:

submitFileForm:

  // 提交上传文件submitFileForm() {this.$refs.upload.submit();},

5)js文件中添加:

// 下载用户导入模板
export function importTemplate() {return request({url: '/oa/school/get-import-template',method: 'get',responseType: 'blob'})
}

el-upload参数说明

参数说明类型可选值默认值
action必选参数,上传的地址string--
headers设置上传的请求头部object--
multiple是否支持多选文件boolean--

action

接受上传的文件类型

disabled

disabled

booleanfalse

on-progress

文件上传时的钩子

function(event, file, fileList)

on-success

文件上传成功时的钩子function(response, file, fileList)
auto-upload

是否在选取文件后立即进行上传

booleantrue
drag是否启用拖拽上传

二、后台

1)创建实体类

新建两个类:SchoolImportExcelVO和SchoolImportRespVO

SchoolImportExcelVO: 用于导出模板,同时也是导入时需要将excel转成的实体类型

SchoolImportRespVO:用于在导入时,向前台返回导入的结果,具体内容如下:

import com.alibaba.excel.annotation.ExcelProperty;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false,避免导入有问题
public class SchoolImportExcelVO {@ExcelProperty("学校名称")private String schoolName;@ExcelProperty("学校地址")private String schoolAddress;@ExcelProperty("学校联系方式")private String schoolTel;@ExcelProperty("项目名称")private String projectName;}
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;import java.util.List;
import java.util.Map;@Schema(description = "管理后台 - 学校导入 Response VO")
@Data
@Builder
public class SchoolImportRespVO {@Schema(description = "创建成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)private List<String> createSchoolnames;@Schema(description = "更新成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)private List<String> updateSchoolnames;@Schema(description = "导入失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)private Map<String, String> failureSchoolnames;}
2)在对应的Controller中添加方法
  @PostMapping("/import")@Operation(summary = "导入学校")@Parameters({@Parameter(name = "file", description = "Excel 文件", required = true),@Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")})
//    @PreAuthorize("@ss.hasPermission('system:user:import')")public CommonResult<SchoolImportRespVO> importExcel(@RequestParam("file") MultipartFile file,@RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {List<SchoolImportExcelVO> list = ExcelUtils.read(file, SchoolImportExcelVO.class);return success(schoolService.importSchoolList(list, updateSupport));}@GetMapping("/get-import-template")@Operation(summary = "获得导入学校模板")public void importTemplate(HttpServletResponse response) throws IOException {// 手动创建导出 demoList<SchoolImportExcelVO> list = Arrays.asList();// 输出ExcelUtils.write(response, "学校导入模板.xls", "学校列表", SchoolImportExcelVO.class, list);}
3)  Service层
SchoolImportRespVO importSchoolList(List<SchoolImportExcelVO> list,boolean isUpdateSupport);
4)ServiceImpl层
  @Override@Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入public SchoolImportRespVO importSchoolList(List<SchoolImportExcelVO> importSchools, boolean isUpdateSupport) {if (CollUtil.isEmpty(importSchools)) {throw exception(USER_IMPORT_LIST_IS_EMPTY);}SchoolImportRespVO respVO = SchoolImportRespVO.builder().createSchoolnames(new ArrayList<>()).updateSchoolnames(new ArrayList<>()).failureSchoolnames(new LinkedHashMap<>()).build();importSchools.forEach(importSchool -> {// 校验,判断是否有不符合的原因
//            try {
//                validateSchoolForCreateOrUpdate(null, importSchool.getSchoolName());
//            } catch (ServiceException ex) {
//                respVO.getFailureSchoolnames().put(importSchool.getSchoolName(), ex.getMessage());
//                return;
//            }// 判断如果不存在,在进行插入SchoolDO existSchool = schoolMapper.selectBySchoolname(importSchool.getSchoolName());if (existSchool == null) {schoolMapper.insert(BeanUtils.toBean(importSchool, SchoolDO.class));respVO.getCreateSchoolnames().add(importSchool.getSchoolName());return;}// 如果存在,判断是否允许更新if (!isUpdateSupport) {respVO.getFailureSchoolnames().put(importSchool.getSchoolName(), SCHOOL_EXISTS.getMsg());return;}SchoolDO updateSchool = BeanUtils.toBean(importSchool, SchoolDO.class);updateSchool.setId(existSchool.getId());schoolMapper.updateById(updateSchool);respVO.getUpdateSchoolnames().add(importSchool.getSchoolName());});return respVO;}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDI中的自适应子结构

SA-DDI提出了一种子结构感知图神经网络&#xff0c;一种配备了子结构注意力机制和用于DDI预测的子结构-子结构交互模块&#xff08;SSIM&#xff09;的消息传递神经网络。具体而言&#xff0c;基于分子中官能团的尺寸和形状通常是不规则的化学直觉&#xff0c;子结构注意力被设…

线阵相机之帧超时

1 帧超时的效果 在帧超时时间内相机若未采集完一张图像所需的行数&#xff0c;则相机会直接完成这张图像的采集&#xff0c;并自动将缺失行数补黑出图&#xff0c;机制有以下几种选择&#xff1a; 1. 丢弃整张补黑的图像 2. 保留补黑部分出图 3.丢弃补黑部分出图

USACO 2024年2月铜组 PALINDROME GAME(博弈)

第一题&#xff1a;PALINDROME GAME 标签&#xff1a;思维、博弈 题意&#xff1a;给定一堆石子&#xff0c;有 S S S个&#xff08; 1 ≤ S ≤ 1 0 1 0 15 1≤S≤10^{10^{15}} 1≤S≤101015&#xff09;&#xff0c; B e s s i e Bessie Bessie和 E l s i e Elsie Elsie轮流…

混子文章|蓝桥杯一题 -平方差

题目考点: 平方差 ,平方差奇偶关系 代码 #include<bits/stdc.h> #define Run 0 #define endl "\n" #define N 100005 using unl __int128_t; using ll long long; using namespace std; class Solution { public: void slove() {int sum 0;int L, R; cin &…

内存计算研究进展-针对机器学习的近数据计算架构

针对机器学习的近数据计算架构代表性工作有&#xff1a; Georgia Institute of Technology的BSSync (bounded staled sync) 和 Neurocube&#xff0c;Advanced Micro Devices 的 CoML&#xff0c;具体如下。 1 BSSync BSSync指出&#xff0c;在并行实现的机器学习应用中&#…

马斯洛激励理论

马斯洛激励理论——摘抄 马斯洛理论&#xff0c;也被称为马斯洛需求层次理论&#xff0c;是由美国心理学家亚伯拉罕马斯洛在1943年提出的。它是一种心理学中的激励理论&#xff0c;描绘了人类需求的五级模型&#xff0c;通常被描绘成金字塔内的等级。 从层次结构的底部向上&am…

代码随想录算法训练营DAY21 | 二叉树 (9)

一、LeetCode 669 修建二叉搜索树 题目链接&#xff1a;669.修建二叉搜索树https://leetcode.cn/problems/trim-a-binary-search-tree/description/ 思路&#xff1a;递归三部曲-定参数、返回值-定终止条件-定单层递归逻辑 class Solution {public TreeNode trimBST(TreeNode …

Sora了解资料

一、基本介绍 1.1sora 在 2024 年 2 月 16 日&#xff0c;Open AI 宣布推出全新的生成式人工智能模型“Sora”。据了解&#xff0c;通过文本指令&#xff0c;Sora 可以直接输出长达 60 秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感…

Prometheus+TDengine集群实现监控体系高可用

背景 为避免再次出现因Prometheus宕机导致业务无法查看历史数据受到影响&#xff0c;准备将Prometheus架构从单节点方式升级为高可用集群方式并将后端存储由本地存储改为远端分布式时序数据库存储。分布式时序数据库采用国产数据库TDengine。 架构 解释&#xff1a;虚线代表P…

Tuxera NTFS软件2024免费版本如何下载?

当然&#xff0c;以下是关于Tuxera NTFS的更多信息&#xff1a; Tuxera NTFS2024下载如下:https://wm.makeding.com/iclk/?zoneid58824 1. 易于使用和管理&#xff1a; Tuxera NTFS的界面设计简洁直观&#xff0c;用户无需复杂的设置和配置即可轻松上手。无论是对于普通用户…

机器视觉【3】非线性求解相机几何参数

线性求解相机几何参数的缺点 上一章节介绍学习了&#xff08;DLT&#xff09;线性求解相机几何参数&#xff0c;了解到线性求解法当中比较明显的缺点&#xff1a; 没有考虑到镜头畸变的影响不能引入更多的约束条件融入到DLT算法当中优化最关键的是&#xff0c;代数距离并不是…

Sora给中国AI带来的真实变化

OpenAI的最新技术成果——文生视频模型Sora&#xff0c;在春节假期炸裂登场&#xff0c;令海内外的AI从业者、投资人彻夜难眠。 如果你还没有关注到这个新闻&#xff0c;简单介绍一下&#xff1a;Sora是OpenAI使用超大规模视频数据&#xff0c;训练出的一个通用视觉模型&#x…

源 MySQL 5.7 Community Server 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 "MySQL 5.7 Community Server" 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。 问题描述&#xff1a; 服务器上安装mysql时 或 执行更新mysql 安装包的时候&#xff0c;出现了报错&#xff0c;简单记录下解决方案 执行…

ClickHouse快速上手

简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS) 官网(https://clickhouse.com/docs/zh)给出的定义&#xff0c;其实没看懂 特性 ClickHouse支持一种基于SQL的声明式查询语言&#xff0c;它在许多情况下与ANSI SQL标准相同。使用时和MySQL有点相似&#…

JAVA设计模式结构型模式

一、前言 java设计模式主要分为创建型模式&#xff0c;结构型模式和行为型模式。上一篇主要总结了行为型设计模式&#xff0c;本章总结&#xff0c;结构型模式。像创建型模式就不写了&#xff0c;比较简单。大概知道是工厂模式和建造者模式&#xff0c;原型模式就行&#xff0…

CTFHub技能树web之RCE(二)

第五题&#xff1a;远程包含 根据题目&#xff0c;使用远程包含进行 打开phpinfo&#xff0c;可以看到allow_url_fopen和allow_url_include都是On&#xff0c;因此可以使用php://input&#xff0c;由于代码会检查file中的内容&#xff0c;因此不能够使用php://filter包含文件&a…

Unreadable-Mesh内存占用翻倍问题

1&#xff09;Unreadable-Mesh内存占用翻倍问题 2&#xff09;在TMP中计算书名号《》高度的问题 3&#xff09;Mipmap如何限定层级 4&#xff09;FMOD设置中关于Virtual Channel Count&Real Channel Count的参数疑问 这是第374篇UWA技术知识分享的推送&#xff0c;精选了UW…

Code Composer Studio (CCS) - Simulators (模拟器)

Code Composer Studio [CCS] - Simulators [模拟器] 1. simulators2. root directoryReferences 1. simulators CCSv6 does NOT have any simulators. Texas Instruments is moving away from providing simulators and instead is focusing on providing low cost developmen…

STM32使用软件SPI协议操作TFT18彩屏

时间记录&#xff1a;2024/2/20 一、SPI协议介绍 &#xff08;1&#xff09;SPI设备通过4根线进行通信&#xff0c;CS片选线&#xff0c;选择从设备&#xff0c;SCK时钟线&#xff0c;由主设备产生时钟&#xff0c;主机MOSI线连从机MISO线&#xff0c;由主机向从机发送信息&am…

淘宝商品采集API通过商品id获取商品详情信息

item_get-获得淘宝商品详情 item_get_app-获得淘宝app商品详情原数据 item_get_pro-获得淘宝商品详情高级版 item_search-按关键字搜索淘宝商品 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_…