[前端/若依] 下载 使用模板批量导入_若依批量导入_Vransy.的博客-程序员秘密

技术标签: VUE  前端  vue.js  javascript  

前端

<el-row :gutter="10" class="mb8">
	  <el-col :span="1.5">
	    <el-button
	      type="info"
	      plain
	      icon="el-icon-upload2"
	      size="mini"
	      @click="handleImport"
	      v-hasPermi="['ipdzgl:importuser:import']"
	    >导入</el-button>
	  </el-col>
</el-row>
    <!-- 用户导入对话框 -->
	<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
	  <el-upload
	    ref="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" slot="tip">
            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据
          </div>
	    <div class="el-upload__tip text-center" slot="tip">
	      <span>仅允许导入xls、xlsx格式文件。</span>
	      <el-link type="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>


import {
     getToken } from "@/utils/auth";


  data() {
    
    return {
    
      upload: {
    
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: "",
        // 是否禁用上传
        isUploading: false,
        // 是否更新已经存在的用户数据
         updateSupport:false,
        // 设置上传的请求头部
        headers: {
     Authorization: "Bearer " + getToken() },
        // 上传的地址
        // 例如  http://localhost:81/params/keyword 则 localurl : /params/keyword
        localurl:'/params/keyword',
        url: process.env.VUE_APP_BASE_API + '/params/keyword' +  "/importData",
      },
    }
  }

method(){
    

	handleImport() {
    
      this.upload.title = "xxxxxxxx名字";
      this.upload.open = true;
    },
    /** 下载模板操作 */
    importTemplate() {
    
      this.download(this.upload.localurl + '/importTemplate', {
    
      }, `importuser_template_${
      new Date().getTime()}.xlsx`)
    },
    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
    
      this.upload.isUploading = true;
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
    
      this.upload.open = false;
      this.upload.isUploading = false;
      this.$refs.upload.clearFiles();
      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {
     dangerouslyUseHTMLString: true });
      this.getList();
    },
    // 提交上传文件
    submitFileForm() {
    
      this.$refs.upload.submit();
    }
}

后端

Controller 层

// 上传模板
    @Log(title = "用户IP地址注册", businessType = BusinessType.IMPORT)
    @RequiresPermissions("[权限名]")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
    {
    
        ExcelUtil<实体类MOdel> util = new ExcelUtil<实体类MOdel>(实体类MOdel.class);
        List<实体类MOdel> dataList = util.importExcel(file.getInputStream());
        String operName = SecurityUtils.getUsername();
        String message = registCustUserService.importData(dataList, updateSupport, operName);
        return AjaxResult.success(message);
    }


// 下载模板
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) throws IOException
    {
    
        ExcelUtil<实体类MOdel> util = new ExcelUtil<实体类MOdel>(实体类MOdel.class);
        util.importTemplateExcel(response, "模板名");
    }

Service层

public String importData(List<实体类Model> dataList, boolean updateSupport, String operName);

IMPL

	@Override
	public String importData(List<实体类Model> dataList, boolean updateSupport, String operName) {
    
		int successNum = 0;
		int failureNum = 0;
		StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
		if (StringUtils.isNull(dataList) || dataList.size() == 0)
        {
    
            throw new ServiceException("导入用户数据不能为空!");
        }
	for (实体类Model data : dataList)
        {
    
            try
            {
    
            	//TODO 需要改当前方法下 select 语句
            	 List isExist = mdRedlistMapper.selectMdRedlistList(data);
                if(isExist.size() >1) {
    
                //TODO 需要改成自己方法的插入语句
                    mdRedlistMapper.insertMdRedlist(data);
                    successMsg.append("<br/>" + successNum + data.toString() + " 导入成功");
                    successNum++;
                }else {
    
                    if(updateSupport){
    
                        successNum++;
                        mdRedlistMapper.updateMdRedlist(data);
                        successMsg.append("<br/>" + failureNum + "、号码 " + data.getRednumber() + " 已经存在, 更新成功");
                    } else {
    
                        failureNum++;
                        failureMsg.append("<br/>" + failureNum + "、号码 " + data.getRednumber() + " 已经存在");
                    }
                }
              }
            catch (Exception e)
            {
    
                failureNum++;
                String msg = "<br/>" + data.toString() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        if (failureNum > 0)
        {
    
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
    
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
	}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/vransy/article/details/126221322

智能推荐

python中模块、函数与各个模块之间的调用_stay_foolish12的博客-程序员秘密

1 针对一个模块的函数调用a : import 模块名模块名.函数名b: from 模块名 import 函数名 (as 别名)python调用另一个.py文件中的类和函数同一文件夹下的调用1.调用函数A.py文件如下:def add(x,y):print(‘和为:%d’%(x+y))在B.py文件中调用A.py的add函数如下:import AA.add(1,2)或from A import addadd(1,2)2.调用类A.py文件如下:class A: d

克罗内克积的c++简单实现_c语言怎么输出克罗内克积_Weike_Wang的博客-程序员秘密

// 函数实现vector&lt;vector&lt;int&gt;&gt; Kroneck(const vector&lt;vector&lt;int&gt;&gt; &amp;a, const vector&lt;vector&lt;int&gt;&gt; &amp;b, int i, int j, int m, int n){ vector&lt;vector&lt;int&gt;&gt; c(i*m,vector&lt;int&gt;(j*n,0)); //std::cou...

【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】六、Android音视频硬编码:生成一个MP4_opengl videoframe_开发的猫的博客-程序员秘密

【声 明】首先,这一系列文章均基于自己的理解和实践,可能有不对的地方,欢迎大家指正。其次,这是一个入门系列,涉及的知识也仅限于够用,深入的知识网上也有许许多多的博文供大家学习了。最后,写文章过程中,会借鉴参考其他人分享的文章,会在文章最后列出,感谢这些作者的分享。码字不易,转载请注明出处!教程代码:【Github传送门】目录一、Android音视频硬解码篇:1,音视频基础知识2,音视频硬解码流程:封装基础解码框架3,音视频播放:音视频同步4,音视频解封和封装:生成.

rbenv vs rvm, 选择用哪个?_rbenv 和 rvm 用 哪个_HPUZ的博客-程序员秘密

rbenv vs rvm, 选择用哪个? 参考: https://ruby-china.org/topics/10275# 老的项目以前用啥,现在就用啥, 别在服务器上瞎折腾。# 新的项目你熟悉啥,你就用啥, 你喜欢啥,你就用啥, 没啥大的区别, 你想咋折腾,就咋折腾。

100G光模块是怎样命名的?介绍:光模块名称含义_weixin_34331102的博客-程序员秘密

光模块的组成光模块(optical module)由光电子器件、功能电路和光接口等组成,光电子器件包括发射和接收两部分。它的作用是光电转换,发送端把电信号转换成光信号,通过光纤传送后,接收端再把光信号转换成电信号。但是,如果大家平时有关注光模块的话,就会发现,很多光模块的名称都是一串难以看的明白的数字、字母。光模块名称中的那些数字、字母到底代...

python语言磁力搜索引擎源码公开,基于DHT协议_UU_Yang的博客-程序员秘密

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_34844199/article/details/51558175之前我在写百度网盘爬虫,百度图片爬虫的时候答应网友说,抽时间要把ok搜搜的的源码公开,如今是时候兑现诺言了,下面就是爬虫的所有代码,完全,彻底的公开,你会不会写程序都...

随便推点

黑马程序员-ADO.NET入门_zhuxuetian的博客-程序员秘密

----------------------   Windows Phone 7手机开发.Net培训    期待与您交流! ----------------------1、Ado.net是什么?通过ado.Net技术,在程序中执行sql数据库的目的把mdf文件附加到数据库中不用的时候可以分离2、神奇代码加到main方法中string dataDi

matplotlib subplot 子图_Claroja的博客-程序员秘密

通过GridSpec来定制Subplot的坐标 GridSpec指定子图所放置的几何网格。 SubplotSpec在GridSpec中指定子图(subplot)的位置。 subplot2grid类似于“pyplot.subplot”,但是它从0开始索引ax = plt.subplot2grid((2,2),(0, 0))ax = plt.subplot(2,2,1)以上两行的子图(subpl

springboot,mybatis,mybatisplus,swagger整合_weixin_34290000的博客-程序员秘密

  这段时间准备自己搭建一个快速开发的项目,所以选择用springboot与mybatisplus集成生成基础的CRUD方法,利用swagger生成代码文档。一步一步把搭建过程记录下来,希望能给初学者提供帮助。搭建springboot  在idea上选择新建工程  选择Spring Initializr    填写maven的gav. ...

如何有效地测试Go代码_机器铃砍菜刀的博客-程序员秘密

单元测试如果把开发程序比作盖房子,那么我们必须确保所有的用料都是合格的,否则盖起来的房子就会存在问题。对于程序而言,我们可以将盖房子的砖头、钢筋、水泥等当做一个个功能单元,如果每个单元是合...

pip-修改为国内镜像源_weixin_34269583的博客-程序员秘密

pip 常用命令pipinstall./downloads/SomePackage-1.0.4.tar.gzpipinstallhttp://my.package.repo/SomePackage-1.0.4.zippipsearch"query"##查询package的具体名称pipuninstallpackage-name##卸载pip...

xx能源企业SD-WAN 组网案例_sdwan组网实例_gaoshan467888的博客-程序员秘密

客户介绍: XX集团成立于2008年,主要业务是新能源矿产资源的投资开发,锂电材料和电芯的研发、生产和销售,系统集成及行业服务,是国内拥有完整锂电产业链的集团公司。服务需求:Ø一级总部需要与二级总部的需求互联通信;Ø下属七个节点可访问一级总部的财务服务器;Ø下属七个节点与二级总部间开展视频会议;Ø下属七个节点各2M带宽,北京二级总部各10M...

推荐文章

热门文章

相关标签