springboot+vue3+antdesignvue实现文件的导入导出javaguns框架

1.技术要点

mybatisplus;vue3,springboot2;javaguns框架

2实现导入功能

后端实现:

①controller层

@RestController
@ApiResource(name = "项目评价")
public class ProjectAppraisalController {/*** 导入excel表数据* @param file* @return*/@PostResource(name = "数据导入" ,path = "/projectAppraisal/import")public ResponseData<?> importData(MultipartFile file){return new SuccessResponseData<>(projectAppraisalService.importData(file));}}
  • 这段代码是一个使用了Spring Boot框架的控制器方法。它使用了@PostResource注解来定义一个POST请求的资源,并指定了资源的名称为"数据导入",路径为"/awardPatent/import"。

    该方法接收一个MultipartFile类型的文件作为参数,表示要导入的文件。MultipartFile是Spring框架提供的一个类,用于处理文件上传。

    在方法体内,调用了awardPatentService.importData(file)来处理文件导入的逻辑。awardPatentService是一个服务类的实例,通过调用其importData方法来处理文件导入操作。

    最后,将导入操作的结果封装在一个SuccessResponseData对象中,并作为响应返回。SuccessResponseData是一个自定义的响应数据类,表示成功的响应,并包含了导入操作的结果数据。

    总结来说,这段代码定义了一个用于处理文件导入的控制器方法。它接收一个文件作为参数,调用服务类的方法来处理文件导入操作,并将结果封装在响应数据中返回。具体的实现逻辑需要根据代码的上下文来确定。

②service层:

public interface ProjectAppraisalService extends IService<ProjectAppraisal> {ResponseData<?> importData(MultipartFile file);}
  • ResponseData<?> importData(MultipartFile file) 是一个方法声明,其中 ResponseData<?> 表示返回类型为 ResponseData,而 MultipartFile file 是该方法的参数,表示接收一个文件作为输入。

    具体来说,这个方法可能是用于处理文件导入的逻辑。它接收一个 MultipartFile 类型的文件作为参数,表示要导入的文件。MultipartFile 是Spring框架提供的一个类,用于处理文件上传。

    ResponseData 是一个自定义的响应数据类,可能包含了请求的处理结果和相关的数据。<?> 表示泛型,表示可以是任意类型的数据。

    这个方法的作用可能是将接收到的文件进行处理,然后返回一个包含处理结果和相关数据的 ResponseData 对象。

    总结来说,ResponseData<?> importData(MultipartFile file) 是一个方法声明,用于处理文件导入操作。它接收一个文件作为参数,并返回一个包含处理结果和相关数据的 ResponseData 对象。具体的实现逻辑需要根据代码的上下文来确定。

③实体层:

@TableName("project_appraisal")
@Data
@ExcelIgnoreUnannotated
@EqualsAndHashCode(callSuper = true)
public class ProjectAppraisal extends BaseEntity {@ExcelProperty(value = "序号",index = 0)@TableField(exist = false)private Integer serialNum;/*** 主键*/@TableId(value = "id", type = IdType.ASSIGN_ID)@ChineseDescription("主键")private Long id;/*** 流程ID*/@TableField("process_id")@ChineseDescription("流程ID")private String processId;/*** 管理编号*/@TableField("manage_code")@ChineseDescription("管理编号")private String manageCode;/*** 案件状态*/@TableField("status")@ChineseDescription("案件状态")private String status;@TableField(exist = false)@ChineseDescription("工作流相关")private WorkflowModel workflowModel;/*** 项目名称*/@TableField("project_name")@ExcelProperty(value = "项目名称",index = 1)@ChineseDescription("项目名称")private String projectName;/*** 投产单位*/@TableField("production_unit")@ChineseDescription("投产单位")@ExcelProperty(value = "投产单位",index = 2)private String productionUnit;/*** 评价单位*/@TableField("evaluation_unit")@ChineseDescription("评价单位")@ExcelProperty(value = "评价单位",index = 3)private String evaluationUnit;/*** 评价方式*/@TableField("evaluation_method")@ChineseDescription("评价方式")@ExcelProperty(value = "评价方式",index = 4)private String evaluationMethod;/*** 评价时间*/@DateTimeFormat("yyyy-MM-dd")@TableField("evaluation_time")@ChineseDescription("评价时间")@ExcelProperty(value = "评价时间",index = 5)private Date evaluationTime;/*** 评价结果*/@TableField("evaluation_result")@ChineseDescription("评价结果")@ExcelProperty(value = "评价结果",index = 6)private String evaluationResult;/*** 附件*/@TableField("attachment")@ChineseDescription("附件")private String attachment;}

④serviceImpl

@Service
public class ProjectAppraisalServiceImpl extends ServiceImpl<ProjectAppraisalMapper, ProjectAppraisal> implements ProjectAppraisalService {@Overridepublic ResponseData<?> importData(MultipartFile file) {if (file != null){List<ProjectAppraisal>  projectAppraisalList = null;try {//创建监听器GeneralListener<ProjectAppraisal> listener = new GeneralListener<>();//执行Excel的读取,read方法需要三个参数 ,文件(流) 大的Class实例  监听器EasyExcel.read(file.getInputStream() , ProjectAppraisal.class , listener).sheet().doRead();//获取监听器的数据projectAppraisalList = listener.getList();} catch (IOException e) {return  new ErrorResponseData<>("F0002" ,"数据格式有误");}//处理表头的第一行数据、projectAppraisalList.stream().filter(item -> Pattern.matches("//d+", String.valueOf(item.getSerialNum())));//添加表中数据projectAppraisalList.forEach(projectAppraisal -> {String projectName = projectAppraisal.getProjectName();String productionUnit = projectAppraisal.getProductionUnit();LambdaQueryWrapper<ProjectAppraisal> wrapper = new LambdaQueryWrapper<>();wrapper.eq(ProjectAppraisal::getProjectName ,projectName);wrapper.eq(ProjectAppraisal::getProductionUnit,productionUnit);List<ProjectAppraisal> projectAppraisals = projectAppraisalService.list(wrapper);//如果不存在,加入if (projectAppraisals.isEmpty()){projectAppraisal.setStatus("完成");projectAppraisal.setCreateTime(new Date());projectAppraisalService.save(projectAppraisal);}});return  new SuccessResponseData<>("00000" ,"上传成功" ,null);}else {return new ErrorResponseData<>("F0003" ,"上传失败");}}}

这段代码是一个实现了importData方法的具体实现。该方法接收一个MultipartFile类型的文件作为参数,并返回一个ResponseData<?>类型的响应数据。

在方法体内,首先判断传入的文件是否为空。如果不为空,则继续执行文件导入的逻辑。

在文件导入的逻辑中,首先创建一个GeneralListener<ProjectAppraisal>类型的监听器对象。然后使用EasyExcel库的read方法,传入文件流、ProjectAppraisal类的实例和监听器对象,来读取Excel文件的内容。通过监听器对象获取读取到的数据,将其赋值给projectAppraisalList变量。

接下来,对projectAppraisalList进行处理。首先使用stream()方法和filter()方法,过滤出表头的第一行数据。然后使用forEach()方法遍历projectAppraisalList,对每个ProjectAppraisal对象进行处理。根据项目名称和生产单位查询数据库中是否存在相同的记录,如果不存在,则将该记录保存到数据库中。

最后,根据处理结果返回相应的响应数据。如果文件上传成功,返回一个SuccessResponseData对象,包含成功的响应码和消息。如果文件上传失败,返回一个ErrorResponseData对象,包含失败的响应码和消息

3.前端代码:

<template><div class="ele-body"><!-- 搜索表单 --><div class="block-interval"><a-card :bordered="false"><a-form :model="where"><a-row :gutter="20"><a-col><a-form-item label="项目名称:"><a-input v-model:value.trim="where.projectName" placeholder="请输入项目名称" allow-clear /></a-form-item></a-col><a-col><a-form-item label="评价单位:"><a-input v-model:value.trim="where.evaluationUnit" placeholder="请输入评价单位" allow-clear /></a-form-item></a-col><a-col><a-space class="ele-text-center"><a-button type="primary" @click="reload">查询</a-button><a-button @click="reset">重置</a-button></a-space></a-col></a-row></a-form></a-card></div><!-- 表格 --><div><a-card :bordered="false" class="table-height"><ele-pro-tableref="table"row-key="id":datasource="datasource":columns="columns":where="where"v-model:selection="selection":scroll="{ x: 'max-content' }"><!-- table上边工具栏 --><template #toolbar><a-space><a-button type="primary" @click="openEdit()" v-permission="'PROJECTEVALUATION_ADD_BUTTON'"><template #icon><plus-outlined /></template><span>新建</span></a-button><a-button class="export-excel-button" type="primary" @click="exportExcel" v-permission="'PROJECTEVALUATION_EXPORT_BUTTON'"><template #icon><download-outlined /></template><span>导出</span></a-button><a-button @click="showImport()" v-if="hasRole()"><upload-outlined />导入</a-button></a-space><a-modal v-model:visible="isShowImport" title="导入数据" :footer="null"><a-upload-draggerref="fileImport"v-model:file-list="fileList"name="file":multiple="true":accept="importAccept":action="baseUrl + '/projectAppraisal/import'":headers="headers"@change="handleChange"@reject="handleReject":before-upload="beforeImport"><p class="ant-upload-drag-icon"><inbox-outlined></inbox-outlined></p><p class="ant-upload-text">点击选择文件或拖拽文件到此处</p></a-upload-dragger><p style="margin-top: 20px; text-align: center; color: #ccc">请上传Excel格式文件,<a href="/static/template/projectappraisal.xlsx" download="项目评价数据导入模板.xlsx">下载模板</a></p></a-modal></template><template #bodyCell="{ column, record }"><template v-if="column.key === 'ended'"><a-tag color="green" v-if="(record.workflowModel ? record.workflowModel.isEnd : '') === 1">是</a-tag><a-tag color="red" v-else> 否</a-tag></template><!-- 当前节点 --><template v-if="column.key === 'active'"><span v-if="record.workflowModel"><a @click="tracking(record)" v-if="record.workflowModel.isEnd === 1">结束</a><a @click="tracking(record)" v-else>{{ record.workflowModel.actName }}</a></span><span v-else> - </span></template><!-- 申报结果 --><template v-if="column.key === 'evaluationResult'"><span v-if="record.evaluationResult"><a-tag color="green" v-if="record.evaluationResult === '是'">通过</a-tag><a-tag color="red" v-else>未通过</a-tag></span><span v-else> - </span></template><!-- table操作栏按钮 --><template v-if="column.key === 'action'"><a-space><a @click="openDetail(record)">查看</a><a-spacev-permission="'PROJECTEVALUATION_UPDATE_BUTTON'"v-if="(record.workflowModel && record.workflowModel.isEnd) !== 1 || hasRole()"><a-divider type="vertical" /><a @click="openEdit(record)">修改</a></a-space><a-space v-permission="'PROJECTEVALUATION_UPDATE_BUTTON'" v-if="record.status === '完成' && !record.evaluationResult"><a-divider type="vertical" /><a-popconfirmtitle="该记录是否通过申报?"ok-text="通过"cancel-text="不通过"@confirm="resultFun(record, '是')"@cancel="resultFun(record, '否')"><a>结果</a></a-popconfirm></a-space><a-space v-permission="'PROJECTEVALUATION_DEL_BUTTON'" v-if="record.status === '暂存' || hasRole()"><a-divider type="vertical" /><a-popconfirm title="确定要删除此记录吗?" @confirm="remove(record)"><a class="ele-text-danger">删除</a></a-popconfirm></a-space></a-space></template></template></ele-pro-table></a-card></div><common-tracking ref="tracking" /><!-- 编辑弹窗 --><projectAppraisal-edit v-model:visible="showEdit" :data="current" @done="reload" /></div>
</template>
<script>
import { message } from 'ant-design-vue';
import { PlusOutlined } from '@ant-design/icons-vue';
import ProjectAppraisalEdit from './project_appraisal_edit.vue';
import { ProjectAppraisalApi } from '@/api/bohua/ProjectAppraisalApi';
import CommonTracking from '@/views/workflow/tracking/common-tracking.vue';
import { useUserStore } from '@/store/modules/user';
import { hasRole } from '@/utils/permission';
import { toDateString } from 'ele-admin-pro';
import { ref } from 'vue';
import { getToken } from '@/utils/token-util';export default {name: 'ProjectAppraisal',components: {PlusOutlined,ProjectAppraisalEdit,CommonTracking},async mounted() {},data() {return {isShowImport: ref(false),fileList: [],importAccept: ['.xlsx', '.xls'],baseUrl: import.meta.env.VITE_API_URL,// 表格列配置columns: [{key: 'index',title: '序号',align: 'center',width: 48,customRender: ({ index }) => this.$refs.table.tableIndex + index},{title: '项目名称',dataIndex: 'projectName'},{title: '投产单位',dataIndex: 'productionUnit'},{title: '评价单位',dataIndex: 'evaluationUnit'},{title: '评价方式',dataIndex: 'evaluationMethod'},{title: '评价时间',dataIndex: 'evaluationTime',customRender: ({ text }) => {return !text ? '-' : toDateString(text, 'yyyy-MM-dd');}},{title: '评价结果',dataIndex: 'evaluationResult',key: 'evaluationResult'},{ellipsis: true,resizable: true,title: '审批节点',dataIndex: 'workflowModel.actName',key: 'active'},{title: '流程结束',dataIndex: 'workflowModel.isEnd',key: 'ended'},{title: '操作',key: 'action',width: 180,fixed: 'right',align: 'center'}],// 表格搜索条件where: {},// 表格选中数据selection: [],// 当前编辑数据current: null,// 是否显示编辑弹窗showEdit: false,// 是否查看isDetail: false,headers: {authorization: getToken()}};},methods: {showImport() {this.isShowImport = true;},isAllowedFile(fileName, allowedExtensions) {const fileExtension = '.' + fileName.split('.').pop().toLowerCase();return allowedExtensions.includes(fileExtension);},hasRole() {return hasRole('superAdmin');},handleChange(info) {if (!this.isAllowedFile(info.file.name, this.importAccept) || info.file.status !== 'uploading') {// 如果文件格式支持或不在上传if (info.file.status == 'done' || info.file.status == 'error') {const success = info.file?.response?.success || false;const msg = info.file?.response?.message || '';if (!success || info.file.status == 'error') {message.error(info.file.name + '导入失败!' + msg);} else if (info.file.status == 'done') {message.success(info.file.name + '导入成功!');}}//console.log('移除上传完成、上传错误或不允许上传的文件');this.fileList = info.fileList.filter(file => file.uid !== info.file.uid);}},handleReject() {message.error('上传文件格式不正确!');},beforeImport(file) {if (!this.isAllowedFile(file.name, this.importAccept)) {message.error('上传文件只能是' + this.importAccept.join('、') + '格式!');return false; // 阻止上传}return true; // 允许上传},/*** 打开追踪界面***/tracking(row) {this.$refs.tracking.tracking(row.processId);},/*** 搜索按钮** */reload() {this.selection = [];this.$refs.table.reload({ page: 1 });},/*** 重置搜索** */reset() {this.reloadPage = 1;this.where.projectName = '';this.where.evaluationUnit = '';this.$nextTick(() => {this.reload();});},/*** 删除** @author zhihui* @date 2023/12/26 09:38*/async remove(row) {const result = await ProjectAppraisalApi.delete({ id: row.id });message.success(result.message);this.reload();},/*** 打开新增或编辑弹窗** */openEdit(row) {if (row) this.current = row;else {//新建时,默认企业名称为用户所在单位const loginUserInfo = useUserStore().info;this.current = { companyName: loginUserInfo.orgName };}this.showEdit = true;this.isDetail = false;},openDetail(row) {this.current = row;this.showEdit = true;this.isDetail = true;},/*** 获取表格数据** */datasource({ page, limit, where, orders }) {return ProjectAppraisalApi.findPage({ ...where, ...orders, pageNo: page, pageSize: limit });},resultFun(record, i) {ProjectAppraisalApi.edit({ id: record.id, evaluationResult: i }).then(result => {message.success(result.message);this.reload();});},exportExcel() {ProjectAppraisalApi.exportExcel(this.where);}}
};
</script>

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

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

相关文章

NineAi 新版AI系统网站源码 ChatGPT

简介: Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务。 NineAi 新版A…

MYSQL第四次作业--多表查询

二、多表查询 1.创建student和score表 创建student表 创建score表。 CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu_id INT(10) NOT NULL , c_name VARCHAR(20) , grade INT(10) ); 2.为student表和score表增加记录 向student表插入记录的…

自定义类型详解(2)

文章目录 5. 通讯录的实现 5. 通讯录的实现 实现一个通讯录&#xff1a; 通讯录中保存人的信息&#xff1a; 名字年龄性别电话住址 通讯录中可以存放100个人的信息增加联系人删除指定联系人修改指定联系人查找指定联系人显示所有联系人的信息排序功能 首先&#xff0c;我们需要…

Python爬虫---scrapy框架---下载嵌套数据

./spider/movie.py文件 import scrapy from scrapy_movie_20240116.items import ScrapyMovie20240116Itemclass MovieSpider(scrapy.Spider):name "movie"# 如果是多页下载的话, 那么必须要调整的是allowed_domains的范围 一般情况下只写城名allowed_domains [&…

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …

MATLAB - 加载预定义的机器人模型

系列文章目录 前言 一、 要快速访问常见的机器人模型&#xff0c;可使用 loadrobot 功能&#xff0c;该功能可加载市售的机器人模型&#xff0c;如 Universal Robots™ UR10 cobot、Boston Dynamics™ Atlas 人形机器人和 KINOVA™ Gen 3 机械手。探索如何生成关节配置并与机器…

小程序基础库与Android之间通信优化的可能

最近在学习graalvm&#xff0c;发现有一个graaljs项目&#xff0c;项目中介绍可以让java与JavaScript做数据转换&#xff0c;比如JavaScript中可以使用java的数据类型与结构。突然想到之前遇到的一个问题&#xff0c;小程序中开发的代码和基础库的部分代码都是j2v8来执行的&…

深入理解 Spark(二)SparkApplication 提交和运行源码分析

spark 核心流程 yarn-client yarn-cluster spark 任务调度 spark stage 级别调度 spark task 级别调度 失败重试和白名单 对于运行失败的 Task&#xff0c;TaskSetManager 会记录它失败的次数&#xff0c;如果失败次数还没有超过最大重试次数&#xff0c;那么就把它放回待调…

【Docker构建MySQL8.0镜像】

Docker构建MySQL8.0镜像 部署流程1. 拉取docker镜像2. 创建数据卷&#xff0c;存放MySQL数据3. 启动MySQL镜像4. 初始化sql放入MySQL镜像5. 执行MySQL脚本6. MySQL镜像打包7. MySQL镜像迁移 部署流程 1. 拉取docker镜像 docker pull mysql:8.0.35拉取成功后就可以看到镜像了&…

openxml获取sheet所有的数据二维数组

此代码假定您已经安装了OpenXML SDK&#xff0c;并且您有一个.xlsx文件的路径。\n\n请注意&#xff0c;续写的代码将获取指定工作表中的所有数据&#xff0c;包括空单元格&#xff0c;并将它们存储在一个二维数组中。如果工作表中有多个行和列&#xff0c;数组的大小将与工作表…

NFS(Network File System 网络文件服务)

一&#xff0c;nfs 简介 1&#xff0c;nfs 性质 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议&#xff0c;客户机可以像访问本地目录一样…

【NI国产替代】NI-9231,8通道,51.2 kS/s/ch,-5至5 V,C系列声音和振动输入模块

8通道&#xff0c;51.2 kS/s/ch&#xff0c;-5至5 V&#xff0c;C系列声音和振动输入模块 NI-9231是一款高密度声音和振动模块&#xff0c;能够测量来自速度计、转速计和接近式探针等集成电子压电(IEPE)和非IEPE传感器的信号。该模块可以执行现代麦克风和加速计所需的高动态范围…

【Java万花筒】未来编码:深度了解Java中机器学习的核心库

构建智能系统&#xff1a;Java中的机器学习库全攻略 前言 随着人工智能和机器学习的不断发展&#xff0c;使用合适的库成为构建强大应用的关键一环。本文将深入介绍几个在Java生态系统中备受推崇的机器学习与人工智能库&#xff0c;为读者提供全面的了解和使用指南。每个库都…

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路&#xff08;状态机实现&#xff09;分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路&#xff08;状态机实现&#xff09; module Detect_101(input clk,input rst_n,input data,o…

56.Spring事务:事务四大特性

56.Spring事务&#xff1a;事务四大特性 原子性&#xff08;Atomicity&#xff09; 原子性是指事务包含的所有操作要么全部成功&#xff0c;要么全部失败回滚&#xff0c; 因此事务的操作如果成功就必须要完全应用到数据库&#xff0c;如果操作失败则不能对数据库有任何影响。…

力扣每日一练(24-1-15)

重复n次检查&#xff0c;几乎都用双指针。。。 固然双指针就是题解&#xff1a; if len(nums) < 3:return len(nums)p1 2 for p2 in range(2, len(nums)):if nums[p2] ! nums[p1 - 2]:nums[p1] nums[p2]p1 1return p1 可以重复两次&#xff0c;那么隔一个检查就行&#…

【征服redis3】一文征服redis的jedis客户端

使用数据库的时候&#xff0c;我们可以用JDBC来实现mysql数据库与java程序之间的通信&#xff0c;为了提高通信效率&#xff0c;我们有了数据库连接池比如druid等等。而我们想通过Java程序控制redis&#xff0c;同样可以借助一些工具来实现&#xff0c;这就是redis客户端&#…

npm install 卡住不动的六种解决方法

1.重装 检查网络设置&#xff0c;删除node_modules重新npm install 2. 配置npm代理 // 配置nmp代理来提高速度&#xff0c;如设置淘宝镜像 npm config set registry https://registry.npm.taobao.org// 查看配置是否成功 npm config get registry// 成功后重新npm install安…

vtk9.3 配置 visual studio 2019 运行环境 和运行实例详解

&#xff08;1&#xff09;包含文件配置&#xff1a; 项目--属性--VC目录&#xff0c;在包含目录中把include文件夹的地址加进去&#xff0c;一直要到下一级 vtk-9.3目录下&#xff0c; 小知识&#xff1a; 在Visual Studio 2019中运行项目时&#xff0c;如果项目中使用了第三…

网络安全笔记-SQL注入

文章目录 前言一、数据库1、Information_schema2、相关函数 二、SQL注入分类1、联合查询注入&#xff08;UNION query SQL injection&#xff09;语法 2、报错注入&#xff08;Error-based SQL injection&#xff09;报错注入分类报错函数报错注入原理 3、盲注布尔型盲注&#…