Java学习Day50:唤醒八戒(Excel相关)

embedded/2024/10/23 4:40:16/

1.批量导入Excel数据

1.实现模板下载

<el-card class="box-card">
<div class="boxMain">
<el-button style="margin-bottom: 20px;margin-right: 20px" type="primary" @click="downloadTemplate()">模板下载</el-button><el-upload action="/ordersetting/upload.do"name="excelFile":show-file-list="false":on-success="handleSuccess":before-upload="beforeUpload"><el-button type="primary">上传文件</el-button></el-upload></div><div>
操作说明:请点击"模板下载"按钮获取模板文件,在模板文件中录入预约设置数据后点击"上传文件"按钮上传模板文件。
</div>
</el-card>
java"> downloadTemplate(){window.location.href="../../template/ordersetting_template.xlsx";}

../为退回上级目录,找到excel在服务器的位置即可下载

2.文件上传

<el-upload action="/ordersetting/upload.do"name="excelFile":show-file-list="false":on-success="handleSuccess":before-upload="beforeUpload"><el-button type="primary">上传文件</el-button>
</el-upload>

拥有:on-success="handleSuccess" 和:before-upload="beforeUpload"为成功上传和上传前的方法

java">  handleSuccess(response, file) {if(response.flag){this.$message({message: response.message,type: 'success'});}else{this.$message.error(response.message);}console.log(response, file, fileList);},
java">//上传之前进行文件格式校验beforeUpload(file){const isXLS = file.type === 'application/vnd.ms-excel';if(isXLS){return true;}const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';if (isXLSX) {return true;}this.$message.error('上传文件只能是xls或者xlsx格式!');return false;},
java"> @PostMapping("/upload")public Result upload(MultipartFile excelFile){List<OrderSetting> orderSettingList=new ArrayList<>();System.out.println(excelFile);try {/*** 后端使用 List<String []>来接受,* list集合接受多对键值对,每个键值对都是excel中的一行* String【】中有两个数据,一个为orderDate预约时间,* 一个是number可预约数* 使用双层for循环取出*3.  List<String[]> 转成JavaBean对象 OrderSetting*4. 调业务层传递JavaBean对象,写入MySQL*/List<String []> stringList= POIUtils.readExcel(excelFile);for (int i = 0; i < stringList.size(); i++) {String[] strings= stringList.get(i);for (int j = 0; j < strings.length; j++) {System.out.println(strings[j]);orderSettingList.add(new OrderSetting(new Date(strings[0]),Integer.parseInt(strings[1])));}}orderSettingServices.addOrderSetting(orderSettingList);} catch (IOException e) {throw new RuntimeException(e);}return new Result(true, MessageConstant.ORDERSETTING_SUCCESS);}

后端使用什么类型的集合或数组接收,全看前端传过来的数据,或者数据库语句决定

查询数据,防止用户多次提交,多次提交更新,第一次提交插入

java"> @Overridepublic void addOrderSetting(List<OrderSetting> orderSettingList) {for (OrderSetting orderSetting:orderSettingList){int count=orderSettingMapper.queryOrderSettingByOrderDate(orderSetting);if (count!=0){orderSettingMapper.updateOrderSetting(orderSetting);}else {orderSettingMapper.addOrderSetting(orderSetting);}}
 <select id="queryOrderSettingByOrderDate" parameterType="OrderSetting" resultType="int">select count(0) from t_ordersetting where orderDate = #{orderDate}</select><update id="updateOrderSetting" parameterType="OrderSetting">update t_ordersetting set number = #{number} where  orderDate = #{orderDate}</update><insert id="addOrderSetting" parameterType="OrderSetting">insert into t_ordersetting values(#{id},#{orderDate},#{number},#{reservations})</insert>

2.日历展示预约设置信息

1.前端信息决定传参数据容器

<template><template v-for="obj in leftobj"><template v-if="obj.date == dayobject.day.getDate()"><template v-if="obj.number > obj.reservations"><div class="usual"><p>可预约{{obj.number}}人</p><p>已预约{{obj.reservations}}人</p></div></template><template v-else><div class="fulled"><p>可预约{{obj.number}}人</p><p>已预约{{obj.reservations}}人</p><p>已满</p></div></template></template></template><button v-if="dayobject.day > today" @click="handleOrderSet(dayobject.day)" class="orderbtn">设置</button>
</template>

可以发现leftobj中的对象obj包含date,number,reservations用来显示数据

this.leftobj = [
                  { date: 1, number: 120, reservations: 1 },
                  { date: 3, number: 120, reservations: 1 },
                  { date: 4, number: 120, reservations: 120 },
                  { date: 6, number: 120, reservations: 1 },
                  { date: 8, number: 120, reservations: 1 }
                ];

决定了后端传输参数使用

List<Map<String,Integer>>

传输数据,或者使用List<对象>也可以

2.后端发送数据

因为预约只能是从现在起当月当年,所以,后端需要查询数据库中年月符合的数据,所以需要的数据时当前年份和月份

axios.get("/ordersetting/findMonthOrderSetting.do?month="+this.currentMonth+"&year="+this.currentYear).then(response=>{if (response.data.flag){//响应回来的data数组,赋值到this.leftobj = response.data.data;}else {this.$message.error(response.data.message);}})

3.后端处理

java">/*** 查找当年当月的数据* @param month* @param year* @return*/@GetMapping("/findMonthOrderSetting")public Result findMonthOrderSetting(Integer month,Integer year){List<Map<String,Integer>> mapList= orderSettingServices.findMonthOrderSetting(month,year);return new Result(true,MessageConstant.QUERY_ORDER_SUCCESS,mapList);}
java"> @Overridepublic List<Map<String, Integer>> findMonthOrderSetting(Integer month, Integer year) {//查找出的数据封装成实体类列表List<OrderSetting> orderSettingList= orderSettingMapper.findMonthOrderSetting(month,year);//设置返回用的装满集合的列表List<Map<String ,Integer>> mapList=new ArrayList<>();for (OrderSetting orderSetting:orderSettingList){//新建Map对象Map<String,Integer> map = new HashMap<>();//取出orderSetting对象中的数据,存储Map集合中/*** number:总可预约数* reservations:已预约数* date:日期*/map.put("number",orderSetting.getNumber());map.put("reservations",orderSetting.getReservations());map.put("date",orderSetting.getOrderDate().getDate());mapList.add(map);}return mapList;}
 @Select("select id,orderDate,number,reservations from" +" t_ordersetting where year(orderDate)=#{year} and month(orderDate)=#{month}")List<OrderSetting> findMonthOrderSetting(@Param("month") Integer month, @Param("year") Integer year);
where year(orderDate)=#{year} and month(orderDate)=#{month}

year(orderDate)=#{year}将orderDate中的年份提取,month同理


http://www.ppmy.cn/embedded/129733.html

相关文章

Python知识点:基于Python技术和工具,如何使用IPFS进行去中心化存储

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用IPFS进行去中心化存储 在当今的数字化时代&#xff0c;数据存储的安全和…

vue与u3d互调

vue与u3d互调 u3d配置 给前端发送数据的方法中使用下面的方法给Window注册个事件 // eventname 方法名: 随意取, 前端用这个名判断是获取哪个事件的数据 // data 给vue 传递的参数 window.ReportReady(UTF8ToString(eventname), UTF8ToString(data));vue配置 将u3d导出好…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后&#xff0c;下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口&#xff0c;元素可以被分发到一个或多个窗口中&#xff0c;Flink 内置了常用的窗口分配器&#xff0c;包括&#xff1a;tumbling wi…

MySQL 中的三种引号

一&#xff1a;标识符和字符常量 要理解MySQL中三种引号的作用&#xff0c;首先就需要了解MySQL中标识符、字符串常量表示的是什么。 标识符&#xff1a; 引用数据库对象名称。如&#xff1a;数据库名、表名、存储过程名称、列名。这些都是标识符。 字符串常量&#xff1a; 表…

Android 设置特定Activity内容顶部显示在状态栏底部,也就是状态栏的下层 以及封装一个方法修改状态栏颜色

推荐:https://github.com/gyf-dev/ImmersionBar 在 Android 中要实现特定 Activity 内容顶部显示在状态栏底部以及封装方法修改状态栏颜色&#xff0c;可以通过以下步骤来完成&#xff1a; 一、让 Activity 内容显示在状态栏底部 在 AndroidManifest.xml 文件中&#xff0c;为特…

#MySQL `SELECT` 语句执行流程详解

在数据库操作中&#xff0c;MySQL 的 SELECT 语句是用于查询数据最常见的 SQL 语句之一。理解它的执行流程对数据库优化和性能提升具有至关重要的意义。本文将详细解析 SELECT 语句从发出请求到返回结果的每个步骤&#xff0c;并结合 MySQL 的架构为您提供深度理解。 ## 1. 连接…

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

MySQL-多表查询

子查询[分步走] 1:一个sql的查询结果当做另一个sql的查询条件. 2:内层的那个sql语句要先执行 sql -- todo --------------子查询---(嵌套查询)--------------- -- 例如&#xff0c;使用命令完成&#xff1a; -- &#xff08;1&#xff09;使用数据库班级db_product3下的商品表和…