当前位置: 首页 > article >正文

若依框架修改模板,添加通过excel导入数据功能

版本:我后端使用的是RuoYi-Vue-fast版本,前端是RuoYi-Vue3

需求:

我需要每个侧边栏功能都需要具有导入excel功能,但是若依只有用户才具备,我需要代码生成的每个功能都拥有导入功能。

每次生成一个一个改实在是太麻烦了。索性直接修改生成模板

1.后端修改

首先找到自动生成的内容,目录是src/main/resources/vm/java,我们需要改的是下面框起来的三个类。

在controller.java.vm中添加:

  /*** 导入${functionName}数据*/@PreAuthorize("@ss.hasPermi('${permissionPrefix}:import')")@Log(title = "${functionName}", businessType = BusinessType.IMPORT)@PostMapping("/importData")public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception{ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);List<${ClassName}> ${className}List = util.importExcel(file.getInputStream());String operName = getUsername();String message = ${className}Service.import${ClassName}(${className}List, updateSupport, operName);return success(message);}/*** 下载${functionName}导入模板*/@PostMapping("/importTemplate")public void importTemplate(HttpServletResponse response){ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);util.importTemplateExcel(response, "${functionName}");}

在service.java.vm中添加:

/*** 导入${functionName}数据** @param ${className}List ${functionName}数据列表* @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据* @param operName 操作用户* @return 结果*/public String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, String operName);

在serviceImpl.java.vm中添加:

在顶部添加

@Autowiredprotected Validator validator;
 /*** 导入${functionName}数据** @param ${className}List ${functionName}数据列表* @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据* @param operName 操作用户* @return 结果*/@Overridepublic String import${ClassName}(List<${ClassName}> ${className}List, Boolean isUpdateSupport, String operName){if (StringUtils.isNull(${className}List) || ${className}List.size() == 0){throw new ServiceException("导入数据不能为空!");}int successNum = 0;int failureNum = 0;StringBuilder successMsg = new StringBuilder();StringBuilder failureMsg = new StringBuilder();for (${ClassName} ${className} : ${className}List){try{// 验证是否存在这个数据${ClassName} exist${ClassName} = ${className}Mapper.select${ClassName}ById(${className}.get${pkColumn.capJavaField}());if (StringUtils.isNull(exist${ClassName})){BeanValidators.validateWithException(validator, ${className});${className}.setCreateBy(operName);this.insert${ClassName}(${className});successNum++;successMsg.append("<br/>" + successNum + "、数据 " + ${className}.get${pkColumn.capJavaField}() + " 导入成功");}else if (isUpdateSupport){BeanValidators.validateWithException(validator, ${className});${className}.setUpdateBy(operName);this.update${ClassName}(${className});successNum++;successMsg.append("<br/>" + successNum + "、数据 " + ${className}.get${pkColumn.capJavaField}() + " 更新成功");}else{failureNum++;failureMsg.append("<br/>" + failureNum + "、数据 " + ${className}.get${pkColumn.capJavaField}() + " 已存在");}}catch (Exception e){failureNum++;String msg = "<br/>" + failureNum + "、数据 " + ${className}.get${pkColumn.capJavaField}() + " 导入失败:";failureMsg.append(msg + e.getMessage());}}if (failureNum > 0){failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");throw new ServiceException(failureMsg.toString());}else{successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");}return successMsg.toString();}

这样后端的工作就完成了。什么都不用修改

将需要的直接生成,放到自己的项目中,然后来修改生成后的前端内容。

2.前端

前端可以仿照若依自己的来写,因为他的用户添加是写好的,以下我展示的是要修改的地方,如有地方没有指出,还请在评论区补充。

首先是在我们生成的代码里添加导入按钮:

然后是导入信息导入对话框

修改导入参数,一般只要修改成生成的地址就可以,后面的/importData不动

导入按钮操作:

文件上传成功处理

3.总结

修改之后应该就可以了,因为做的时间有点久了,可能有些部分遗漏,还请各位程序猿大佬评论区补充。

相关文章:

若依框架修改模板,添加通过excel导入数据功能

版本&#xff1a;我后端使用的是RuoYi-Vue-fast版本&#xff0c;前端是RuoYi-Vue3 需求: 我需要每个侧边栏功能都需要具有导入excel功能&#xff0c;但是若依只有用户才具备&#xff0c;我需要代码生成的每个功能都拥有导入功能。​ 每次生成一个一个改实在是太麻烦了。索性…...

web全栈开发学习-01html基础

背景 最近在付费网站学习web全栈开发&#xff0c;记录一下阶段性学习。今天刚好学完html基础&#xff0c;跟着教程画了个基础的网站。 样品展示: 开发工具 vscode Visual Studio Code - Code Editing. Redefined 常用插件 Prettier&#xff1a;格式优化 Live Sever:实时调…...

基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序

目录 介绍&#xff1a; 源代码&#xff1a; Socketserver-服务端代码 Socketserver客户端代码&#xff1a; 介绍&#xff1a; socketserver是一种传统的传输层网络编程接口&#xff0c;相比WebSocket这种应用层的协议来说&#xff0c;socketserver比较底层&#xff0c;soc…...

[Java 基础]枚举

枚举是一种特殊的类&#xff0c;表示一组固定的常量。枚举跟普通类一样可以用自己的变量、方法和构造函数&#xff0c;构造函数只能使用 private 访问修饰符&#xff0c;所以外部无法调用。 现实生活中的例子&#xff1a; 一周七天&#xff08;MONDAY ~ SUNDAY&#xff09; …...

多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制

原代码 public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length) {try{// 1. 检查客户端是否有效if (targetClient null || !targetClient.Connected){Console.WriteLine("Cannot send: client is not connected");ret…...

【含文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的旅游论坛系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …...

贝叶斯优化+LSTM+时序预测=Nature子刊!

贝叶斯优化与LSTM的融合在时间序列预测领域取得了显著成效&#xff0c;特别是在处理那些涉及众多超参数调整的复杂问题时。 1.这种结合不仅极大提高了预测的精确度&#xff0c;还优化了模型训练流程&#xff0c;提升了效率和成本效益。超参数优化的新篇章&#xff1a;LSTM因其…...

NodeJS全栈WEB3面试题——P3Web3.js / Ethers.js 使用

3.1 Ethers.js 和 Web3.js 的主要区别是什么&#xff1f; 比较点Ethers.jsWeb3.js体积更轻量&#xff0c;适合前端较大&#xff0c;加载慢&#xff0c;适合 Node文档文档简洁、现代化&#xff0c;支持 TypeScript文档丰富&#xff0c;但不够现代化模块化设计高度模块化&#x…...

Quick UI 组件加载到 Axure

将 Quick UI 组件加载到 Axure 的完整指南 Axure 支持通过自定义元件库加载外部 UI 组件库&#xff08;如 Quick UI&#xff09;&#xff0c;以下是详细的操作流程&#xff1a; 一、准备工作 获取 Quick UI 组件库文件&#xff1a; 下载 .rplib 格式的 Quick UI 元件库文件&a…...

Vue3(ref与reactive)

一&#xff0c;ref创建_基本类型的响应式数据 在 Vue 3 中&#xff0c;ref是创建响应式数据的核心 API 之一 ** ref的基本概念** ref用于创建一个可变的响应式数据引用&#xff0c;适用于任何类型的值&#xff08;基本类型、对象、数组等&#xff09;。通过ref包装的值会被转…...

Starrocks中RoaringBitmap杂谈

背景 最近在阅读Starrocks源码的时候&#xff0c;遇到ColumnRefSet的RoaringBitmap使用&#xff0c;所以借此来讨论一下RoaringBitmap这个数据结构,这种思想是很值得借鉴的。 对于的实现可以参考一下 <dependency><groupId>org.roaringbitmap</groupId><…...

通过ca证书的方式设置允许远程访问Docker服务

设置允许远程访问Docker服务 使用场景 环境 系统&#xff1a;anolis7.9 修改Docker服务配置&#xff0c;配置安全证书 生成ca证书到/etc/docker目录中&#xff0c;后续会要用到 #该步骤需要设置密码&#xff0c;后面步骤会要用到&#xff0c;此处设置密码为123456 openss…...

涂胶协作机器人解决方案 | Kinova Link 6 Cobot在涂胶工业的方案应用与价值

涂胶工业现状背景&#xff1a; 涂胶工艺在汽车制造、电子组装、航空航天等工业领域极为关键&#xff0c;关乎产品密封、防水、绝缘性能及外观质量。 然而&#xff0c;传统涂胶作业问题频发。人工操作重复性强易疲劳&#xff0c;涂胶质量波动大&#xff1b;大型涂胶器使用增加工…...

理解继承与组合的本质:Qt 项目中的设计选择指南

文章目录 理解继承与组合的本质&#xff1a;Qt 项目中的设计选择指南一、继承与组合的本质区别1. 继承&#xff08;Inheritance&#xff09;2. 组合&#xff08;Composition&#xff09; 二、继承的适用场景三、组合的适用场景四、错误使用继承的后果五、判断继承或组合的三问法…...

新手小白使用VMware创建虚拟机安装Linux

新手小白想要练习linux&#xff0c;找不到合适的地方&#xff0c;可以先创建一个虚拟机&#xff0c;在自己创建的虚拟机里面进行练习&#xff0c;接下来我给大家接受一下创建虚拟机的步骤。 VMware选择创建新的虚拟机 选择自定义 硬件兼容性选择第一个&#xff0c;不同的版本&a…...

使用 PHP 和 Guzzle 对接印度股票数据源API

对接 StockTV API 可能涉及获取实时或历史的金融市场数据&#xff0c;如股票价格、交易量、市场新闻等。为了帮助你更好地理解如何使用 PHP 对接 StockTV API&#xff0c;下面我将提供一个通用指南和示例代码。 前提条件 注册并获取API密钥&#xff1a;首先你需要在 StockTV …...

EscapeX:去中心化游戏,开启极限娱乐新体验

VEX 平台推出全新去中心化游戏 EscapeX&#xff08;数字逃脫&#xff09;&#xff0c;创新性地将大逃杀玩法与区块链技术相融合。用户不仅能畅享紧张刺激的解谜过程&#xff0c;更能在去中心化、公正透明的环境中参与游戏。EscapeX 的上线&#xff0c;为 VEX 生态注入全新活力&…...

使用PyQt5的图形用户界面(GUI)开发教程

文章目录 写在前面一、PyQt5的安装1.1 使用Conda管理环境1.1.1 新建环境1.1.2 conda list和pip list的区别1.1.3 conda install和pip install的区别 1.2 安装PyQt5和Qt Designer1.3 VsCode中配置Qt Designer 二、PyQt5的UI设计2.1 .ui文件设计2.2 .qrc文件建立2.3 qss设计 三、…...

STM32实战:智能环境监测站设计方案

下面是一个基于STM32的智能环境监测站设计方案&#xff0c;使用Keil MDK-ARM开发环境。这个系统集成了多种传感器&#xff0c;并通过OLED显示数据&#xff0c;同时具备数据存储和报警功能。 [STM32F4系列MCU] ├── I2C总线 │ ├── SHT30温湿度传感器 │ ├──…...

猎板硬金镀层厚度:新能源汽车高压系统的可靠性基石

在新能源汽车的电池管理系统&#xff08;BMS&#xff09;和电机控制器中&#xff0c;硬金镀层厚度直接关系到高压环境下的电气稳定性与使用寿命。猎板针对车载场景开发的耐电迁移方案&#xff08;金层 2.5μm&#xff0c;镍层 8μm&#xff09;&#xff0c;经 150℃/85% RH 高压…...

KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪

KEYSIGHT是德科技 E5063A 18G ENA系列网络分析仪 E5063A ENA 矢量网络分析仪 18GHz 2端口 降低无源射频元器件的测试成本 Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪&#xff0c;可用于测试简单的无源元器件&#xff0c;例如频率最高达到 18 GHz 的天线、滤…...

VR 虚拟仿真工器具:开启医学新视界的智慧钥匙​

VR 虚拟仿真工器具在医疗领域的应用&#xff0c;为医疗行业的发展带来了新的机遇。在手术模拟训练中&#xff0c;它让医生提前熟悉手术流程和操作技巧。对于一些复杂的手术&#xff0c;如心脏搭桥手术、神经外科手术等&#xff0c;手术难度大、风险高&#xff0c;对医生的操作技…...

webshell管理工具、C2远控服务器流量分析

文章目录 一、Webshell管理工具流量分析1. 蚁剑&#xff08;AntSword&#xff09;2. 冰蝎&#xff08;Behinder&#xff09;3. 哥斯拉&#xff08;Godzilla&#xff09;二、常见C2远控服务器流量分析1. Metasploit2. CobaltStrike 三、防御对抗策略总结 一、Webshell管理工具流…...

JavaWeb:前端工程化-TS(TypeScript)

概述 快速入门 常用类型 基础类型 联合类型 函数类型 对象类型 接口Interface Interface和type区别 典型推论...

unity+ spine切换武器不换皮肤解决方案

1.在spine编辑中获取到角色武器插槽名称 这里的武器插槽名称为“zj_22”。角色的spine正常导出到unity中。 2.将需要替换的武器图片单独放在一个spine项目里面&#xff0c;并为每个武器单独建立一个插槽。 而且全部放在根骨骼Root下。 3.将武器的spine动画导出&#xff0c;会…...

[java八股文][MySQL面试篇]SQL基础

NOSQL和SQL的区别&#xff1f; SQL数据库&#xff0c;指关系型数据库 - 主要代表&#xff1a;SQL Server&#xff0c;Oracle&#xff0c;MySQL(开源)&#xff0c;PostgreSQL(开源)。 关系型数据库存储结构化数据。这些数据逻辑上以行列二维表的形式存在&#xff0c;每一列代表…...

Ubuntu中SSH服务器安装使用

SSH服务安装 1. 安装 OpenSSH 安装 SSH 服务端&#xff08;允许远程登录&#xff09; sudo apt update sudo apt install openssh-server安装 SSH 客户端&#xff08;用于连接其他服务器&#xff09; sudo apt install openssh-client2. 检查 SSH 服务状态 sudo systemctl…...

【AI论文】SWE-rebench:一个用于软件工程代理的任务收集和净化评估的自动化管道

摘要&#xff1a;基于LLM的代理在越来越多的软件工程&#xff08;SWE&#xff09;任务中显示出有前景的能力。 然而&#xff0c;推进这一领域面临着两个关键挑战。 首先&#xff0c;高质量的训练数据稀缺&#xff0c;尤其是反映现实世界软件工程场景的数据&#xff0c;在这些场…...

Flask文件处理全攻略:安全上传下载与异常处理实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

【算法深练】分组循环:“分”出条理,化繁为简

目录 引言 分组循环 2760. 最长奇偶子数组 1446. 连续字符 1869. 哪种连续子字符串更长 2414. 最长的字母序连续子字符串的长度 3456. 找出长度为 K 的特殊子字符串 1957. 删除字符使字符串变好 674. 最长连续递增序列 978. 最长湍流子数组 2110. 股票平滑下跌阶段的…...