java + element-ui 上传多个文件

前端
      <el-upload ref="performanceUpload" accept=".xlsx, .xls" :headers="performanceUpload.headers"
                 :action="performanceUpload.url + '?updateSupport=' + performanceUpload.updateSupport"
                 :disabled="performanceUpload.isUploading" :on-progress="handleFileUploadProgressPerformance"
                 :on-success="handleFileSuccessPerformance" :auto-upload="false" :multiple="true" 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="performanceUpload.updateSupport"/>
            是否更新已经存在的用户数据
          </div>
          <span>仅允许导入xls、xlsx格式文件。</span>
        </div>
      </el-upload>

js

      <el-upload
        ref="upload"
        accept=".docx, .doc"
        :headers="upload.headers"
        :action="upload.url"
        :http-request="HttpUploadFile"
        :disabled="upload.isUploading"
        :data="getfileData()"
        :on-change="handleChange"
        :on-remove="handleRemove"
        :on-progress="handleFileUploadProgress"
        :on-success="handleFileSuccess"
        :auto-upload="false"
        :multiple="true" drag>
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip text-center" slot="tip">
          <span>仅允许导入.docx, .doc格式文件。</span>
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="handleCancel">取 消</el-button>
      </div>
// 参数
      upload: {
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: '',
        // 是否禁用上传
        isUploading: false,
        // 是否更新已经存在的用户数据
        updateSupport: 0,
        // 设置上传的请求头部
        headers: { Authorization: 'Bearer ' + getToken() },
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + '/duty/report/importData',
        fileList: []
      },
    // 提交上传文件
    submitFileForm() {
      //判断是否有文件再上传
      if (this.upload.fileList.length === 0) {
        return this.$message.warning('请选取文件后再上传')
      }
      if (this.upload.fileList.length > 0) {
        //创建FormData对象,用于携带数据传递到后端
        this.fileData = new FormData()
        this.$refs.upload.submit();
        this.fileData.append("data", JSON.stringify(this.form));
        this.fileData.append("headers", { Authorization: "Bearer " + getToken() });
        this.fileData.append("withCredentials",false)
        this.fileData.append("filename", "file");
        var i = this.upload.fileList.length
        if (i !== 0) {
          //此处执行调用发送请求
          exportFiles(this.fileData).then((res) =>{
            if(res.code === 200) {
              this.upload.isUploading = false;
              this.upload.fileList = [];
              this.upload.open = false;
              this.$refs.upload.clearFiles();
              this.$modal.msgSuccess(res.msg);
              this.getReportDutyList(this.selectVal);
              this.getPersonnelInfo(this.selectVal);
            } else {
              this.$message({
                message: "失败",
                type: 'error'
              })
            }
          })
        } else {
          //如果没有文件要上传在此处写逻辑
        }
      } 
    },

后端 controller

@PostMapping("/importDataFiles")
    public AjaxResult importDataFiles(MultipartFile[] files) throws Exception {
        if (CollectionUtils.isEmpty(Arrays.asList(files))) {
            return AjaxResult.error("上传文件为空!");
        } else {
            for (MultipartFile file : files) {
                InputStream inputStream = file.getInputStream();
                List<WordTableVO> wordTableVOS = new ArrayList<>();
                if (WordUtils.isDocOrDocx(file.getOriginalFilename())) {
                    wordTableVOS = WordUtils.getTableFromDoc(inputStream);
                } else {
                    wordTableVOS = WordUtils.getTableFromDocx(inputStream);
                }
                ReportDutyExportEntity result = WordUtils.processWordData(wordTableVOS);
                // 获取登录人员信息
                String userName = getUsername();
                // 添加导入数据信息
                int insertResult = scoreService.insertScore(result, userName);
                if (insertResult == 0) {
                    return AjaxResult.error("导入失败!");
                }
            }
            return AjaxResult.success("导入成功!");
        }

    }
<think>好的,我现在需要帮助用户找到如何用Java后端配合Vue2前端和Element-UI组件库实现多选删除功能的示例或教程。首先,我需要理清用户的需求。用户提到了多选删除功能,这通常涉及前端展示可多选的表格,后端处理删除请求。用户可能希望了解前后端如何配合,包括接口设计、数据传输和具体实现步骤。 首先,我应该回顾用户提供的引用内容。引用[1]和[2]提到了Vue2与Element-UI的整合,特别是使用Element-UI的组件如表格和树形控件。例如,引用[2]中提到了用Element-UI的tree组件实现权限管理,这可能与多选功能相关。不过用户的问题是关于多选删除,所以重点应放在表格的多选和删除操作上。 接下来,我需要拆解问题。多选删除通常涉及以下几个步骤: 1. 前端使用Element-UI的表格组件,并启用多选功能。 2. 用户选择多条数据后,前端将选中的数据ID发送到后端。 3. 后端Java接口接收这些ID,执行删除操作。 4. 前后端通过RESTful API进行通信,可能使用JSON格式传输数据。 对于前端部分,Element-UIel-table组件支持多选,需要添加<el-table-column type="selection">来启用复选框。然后需要获取用户选中的数据,这可以通过@selection-change事件处理函数来实现。当用户点击删除按钮时,前端需要收集选中的行数据的ID,并通过axios发送POST或DELETE请求到后端。 后端部分,Java可以使用Spring Boot框架来处理HTTP请求。需要创建一个接收数组或列表的接口,使用@RequestBody注解来接收前端传来的ID数组,然后调用服务层删除这些记录,可能需要使用MyBatis或JPA操作数据库。 在数据传输方面,前后端需要约定好接口的URL、请求方法(POST或DELETE)以及数据格式。例如,前端发送一个包含ids数组的JSON对象,后端解析这个数组并执行删除操作。 然后,我需要考虑用户可能遇到的常见问题。例如,跨域问题,这时候需要在后端配置CORS;或者前后端数据格式不一致,比如日期格式或字段名不匹配。此外,删除操作可能需要事务处理,确保所有选中的记录都被正确删除,或者在删除前进行权限验证。 用户可能还希望看到具体的代码示例,比如前端如何配置表格,如何处理选中事件,以及后端如何接收参数并处理删除。同时,可能需要指导如何集成Element-UI的组件到Vue2项目中,这部分在引用[1]中已经提到,包括安装Element-UI和导入组件库。 另外,用户可能需要了解如何测试这个功能,比如使用Postman测试后端接口,或者在前端如何调试网络请求。此外,错误处理也是重要的,比如处理网络错误或后端返回的错误信息,并在前端显示友好的提示。 最后,我需要确保提供的解决方案符合最佳实践,比如使用RESTful风格的设计,合理使用HTTP状态码,以及保证代码的可维护性和安全性,例如防止SQL注入等。</think>以下是基于Vue2+Element-UI+Java实现多选删除功能的实现步骤: ### 一、前端实现(Vue2 + Element-UI) 1. **安装Element-UI** ```bash npm install element-ui -S ``` 2. **表格组件配置** ```html <template> <div> <el-button @click="batchDelete" type="danger">批量删除</el-button> <el-table ref="multipleTable" :data="tableData" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="名称"></el-table-column> </el-table> </div> </template> ``` 3. **处理多选逻辑** ```javascript export default { data() { return { tableData: [], // 表格数据 multipleSelection: [] // 选中项集合 } }, methods: { handleSelectionChange(val) { this.multipleSelection = val; }, async batchDelete() { if (this.multipleSelection.length === 0) { this.$message.warning('请选择要删除的记录'); return; } const ids = this.multipleSelection.map(item => item.id); try { await this.$confirm('确认删除选中项?', '提示', { type: 'warning' }); const res = await this.$http.post('/api/deleteBatch', { ids }); if (res.data.success) { this.$message.success('删除成功'); this.fetchData(); // 重新加载数据 } } catch (error) { console.error('删除失败:', error); } } } } ``` ### 二、后端实现(Spring Boot) 1. **定义删除接口** ```java @RestController @RequestMapping("/api") public class DataController { @Autowired private DataService dataService; @PostMapping("/deleteBatch") public ResponseEntity<?> deleteBatch(@RequestBody Map<String, List<Long>> request) { List<Long> ids = request.get("ids"); if (ids == null || ids.isEmpty()) { return ResponseEntity.badRequest().body("参数错误"); } dataService.deleteBatch(ids); return ResponseEntity.ok(Collections.singletonMap("success", true)); } } ``` 2. **Service层实现** ```java @Service public class DataServiceImpl implements DataService { @Autowired private DataMapper dataMapper; @Transactional @Override public void deleteBatch(List<Long> ids) { dataMapper.deleteBatchIds(ids); } } ``` 3. **MyBatis Mapper配置** ```xml <delete id="deleteBatchIds"> DELETE FROM your_table WHERE id IN <foreach collection="list" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> ``` ### 三、关键点说明 1. **Element-UI表格多选**:通过`@selection-change`事件获取选中项[^2] 2. **ID集合传递**:前端将选中项的ID数组通过POST请求体发送 3. **批量删除SQL**:使用MyBatis的`foreach`标签生成IN语句 4. **事务处理**:在Service层添加`@Transactional`保证操作原子性 ### 四、常见问题解决方案 1. **跨域问题**:在后端添加CORS配置 ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*"); } } ``` 2. **性能优化**:批量删除建议分批处理(每批500条) ```java List<List<Long>> partitions = Lists.partition(ids, 500); partitions.forEach(dataMapper::deleteBatchIds); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值