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

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>
 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"为成功上传和上传前的方法

  handleSuccess(response, file) {if(response.flag){this.$message({message: response.message,type: 'success'});}else{this.$message.error(response.message);}console.log(response, file, fileList);},
//上传之前进行文件格式校验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;},
 @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);}

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

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

 @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.后端处理

/*** 查找当年当月的数据* @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);}
 @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.rhkb.cn/news/454247.html

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

相关文章

柔性数组的使用

//柔性数组的使用 #include<stdio.h> #include<stdlib.h> #include<errno.h> struct s {int i;int a[]; }; int main() {struct s* ps (struct s*)malloc(sizeof(struct s) 20 * sizeof(int));if (ps NULL){perror("malloc");return 1;}//使用这…

用.NET开发跨平台应用程序采用 Avalonia 与MAUI如何选择

Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这意味着开发人员可以共享他们的UI代码&#xff0c;…

容灾与云计算概念

​​​​​​基础知识容灾备份——备份技术系统架构与备份网络方案-CSDN博客 SAN&#xff0c;是storage area network的简称&#xff0c;翻译过来就是存储区域网络。 顾名思义&#xff0c;SAN首先是一个网络&#xff0c;其次它是关于存储的&#xff0c;区域则是指服务器和存储资…

iTOP-RK3568开发板独立NPU通过算法加特应用到以下的场景

iTOP-3568开发板采用瑞芯微RK3568处理器&#xff0c;内部集成了四核64位Cortex-A55处理器。主频高达2.0Ghz&#xff0c;RK809动态调频。集成了双核心架构GPU&#xff0c;ARM G52 2EE、支持OpenGLES1.1/2.0/3.2、OpenCL2.0、Vulkan1.1、内嵌高性能2D加速硬件。 内置独立NPU,算力…

出血性脑卒中临床智能诊疗建模

出血性脑卒中是一种常见但危险的脑血管疾病&#xff0c;其治疗和管理需要及时而准确的诊断以及有效的预测模型。本研究旨在通过分析入院患者的临床数据和影像学特征&#xff0c;建立数学模型&#xff0c;评估患者的血肿扩张风险、血肿周围水肿进展以及长期预后。 针对问题一&a…

15分钟学Go 第8天:控制结构 - 循环

第8天&#xff1a;控制结构 - 循环 在Go语言中&#xff0c;循环是一种基本的控制结构&#xff0c;用于重复执行一段代码。今天我们将深入了解Go语言中的for循环&#xff0c;包括它的各种用法、语法结构、以及如何在实践中有效地应用循环。 1. for 循环的基本概念 for循环是G…

应对 .DevicData-X-XXXXXXXX 勒索病毒:防御与恢复策略

引言 随着信息技术的快速发展&#xff0c;网络安全问题愈发严峻。勒索病毒作为一种恶性网络攻击手段&#xff0c;已成为企业和个人面临的重大威胁之一。尤其是 .DevicData-X-XXXXXXXX 勒索病毒&#xff0c;其通过加密用户数据并勒索赎金&#xff0c;给受害者带来了巨大的经济损…

在Xshell中查看日志文件详情

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

子比主题美化 – 评论区添加随机夸夸功能(修复api)

简介 有很多人在网站浏览需要回复&#xff0c;有的比较嫌麻烦不愿意打字&#xff0c;也会收到一些各种评论相对比较杂乱&#xff0c;今天分享一个用夸夸功能&#xff0c;来替代传统的评论一言&#xff0c;将它们分开使用&#xff0c;先看看效果图&#xff0c;再考虑使用不使用…

基于SpringBoot+Vue+uniapp微信小程序的教学质量评价系统的详细设计和实现

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

一文详解“位运算“在算法中的应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 位运算的相关介绍&#xff08;重要&#xff09; 136. 只出现一次的数字 191.位1的个数 461. 汉明距离 260. 只出现一…

导数的概念及在模型算法中的应用

一. 导数概念与计算 1. 导数的物理意义&#xff1a; 瞬时速率。一般的&#xff0c;函数yf(x)在x处的瞬时变化率是 2. 导数的几何意义&#xff1a; 曲线的切线&#xff0c;当点趋近于P时&#xff0c;直线 PT 与曲线相切。容易知道&#xff0c;割线的斜率是当点趋近于 P 时&…

QT 实现按钮多样化

1.界面实现效果 以下是具体的项目需要用到的效果展示,可以根据需要,实例化想要的按钮。 2.简介 原理:使用Qt的QPropertyAnimation动画类,这里简单来说就是切换两个按钮样式。 请看以下结构体: #define MAX_LINE_COUNT 3struct PurelinStatus {QSizeF bgSize

ABAQUS应用13——大量INP文件的自动提交

文章目录 0、背景1、正文 0、背景 ABAQUS自动批量提交INP文件。原文来自曹老师公众号&#xff0c;感兴趣的可以点击这里。 为了防止遗失&#xff0c;我还是先保存比较好。 1、正文 分析需要对大量 INP 文件进行提交分析&#xff0c;在 Abaqus / CAE 中手动操作无法完成&…

十四、MySQL事务日志

文章目录 1. redo日志1.1 为什么需要REDO日志1.2 REDO日志的好处、特点1.2.1 好处1.2.2 特点1.3 redo的组成1.4 redo的整体流程1.5 redo log 的刷盘策略1.6 不同刷盘策略演示1.7 写入redo log buffer 过程1.7.1 补充概念:Mini-Transaction1.7.2 redo 日志写入log buffer1.7.3 …

量子门电路开销——T门、clifford门、toffoli门、fredkin门

在量子计算中&#xff0c;T门的成本比Clifford门高出很多倍的原因与量子计算中纠错的实现、物理门操作的复杂性以及容错量子计算架构中的成本评估有关。以下是几个关键原因&#xff0c;解释了为什么 T 门的成本在量子计算中远远高于 Clifford 门&#xff1a; 1. T 门和 Cliffo…

飞凌嵌入式FET527N-C核心板已适配OpenHarmony4.1

近期&#xff0c;飞凌嵌入式为FET527N-C核心板适配了OpenHarmony4.1系统——进一步提升了核心板的兼容性、稳定性和安全性。 OpenHarmony4.1在应用开发方面展现了全新的开放能力&#xff0c;以更加清晰的逻辑和场景化视角提供给开发者丰富的API接口&#xff0c;应用开发能力得…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不多说…

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…

项目管理软件真的能让敏捷开发变得更简单吗?

敏捷开发是一种以快速交付和适应变化为核心特点的软件开发方法。其特点包括尽早并持续交付、能够驾驭需求变化、版本周期内尽量不加任务、业务与开发协同工作、以人为核心、团队配置敏捷等。 例如&#xff0c;尽早并持续交付可使用的软件&#xff0c;使客户能够更早地体验产品…