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

news2024/10/23 1:23:41

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);
    }

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

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

 @Override
    public 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);
    }
 @Override
    public 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.coloradmin.cn/o/2221210.html

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

相关文章

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

银行数字化转型导师坚鹏:2025年银行开门红8大思考

2025年银行开门红8大思考&#xff1a;与2024年相比有哪些新的变化与不同&#xff1f; 1. ‌员工&#xff1a;从认清现实到重塑信心‌ 经济下行周期开启&#xff0c;叠加外部不稳定、不确定因素增加&#xff0c;让很多员工不适应、不习惯&#xff0c;甚至产生躺平心态。2025年…

信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分求最小

PDF文档回复:20241017 1 P8814 [CSP-J 2022] 解密 [题目描述] 给定一个正整数 k&#xff0c;有 k 次询问&#xff0c;每次给定三个正整数 ni,ei,di&#xff0c;求两个正整数 pi,qi&#xff0c;使 nipiqi、eidi(pi−1)(qi−1)1 [输入格式] 第一行一个正整数 k&#xff0c;表…

leetcode动态规划(十)-0-1背包理论基础(一维数组)

一维dp数组&#xff08;滚动数组&#xff09; leetcode中无纯0-1背包问题&#xff0c;可从卡码网上查看题目46.0-1背包问题 一维数组来源于二维数组&#xff0c;其本质是对一维数组进行压缩了&#xff0c;压缩后需要注意在进行背包容量循环的时候采用后序遍历&#xff0c;而不…

Linux系统基础-进程间通信(3)_模拟实现匿名管道

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-进程间通信(3)_模拟实现匿名和命名管道 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&a…

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…

无人机电机损耗!

一、电机损耗类型 机械损耗&#xff1a; 主要由于电机的旋转部件&#xff08;如转子、轴承等&#xff09;在运转过程中产生的摩擦和磨损。 长时间运行或不当维护可能加剧这种损耗。 电气损耗&#xff1a; 包括电阻损耗、铁芯损耗和杂散损耗等。 这些损耗主要由电流通过电…

Golang | Leetcode Golang题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; var (temp []intans [][]int )func findSubsequences(nums []int) [][]int {ans [][]int{}dfs(0, math.MinInt32, nums)return ans }func dfs(cur, last int, nums []int) {if cur len(nums) {if len(temp) > 2 {t : make([]int, len(…

未来AI的学习能力会达到怎样的水平?

​ 大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共2…

Leetcode—192. 统计词频【中等】(Shell)

2024每日刷题&#xff08;188&#xff09; Leetcode—192. 统计词频 实现代码 # Read from the file words.txt and output the word frequency list to stdout. cat words.txt | tr -s \n | sort | uniq -c | sort -nr | awk {print $2, $1}运行结果 之后我会持续更新&…

学习threejs,通过THREE.Raycaster给模型绑定点击事件

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Raycaster光线投射概…

DirectX11:Position Based Fluid

前言 这是我本科毕业设计项目&#xff0c;使用DirectX11实现一个基于PBD的流体模拟仿真&#xff0c;同时也算是补了Games101的大作业了。 阅读本文假设你对以下内容比较熟悉&#xff1a; 流体模拟&#xff1a;Smoothed Particle Hydrodynamics 流体模拟&#xff1a;Neighbor…

UNIX网络编程-传输层

概述 传输层主要包括&#xff1a;TCP、UDP、SCTP&#xff08;流控制传输协议&#xff09;&#xff01; 绝大多数客户端/服务器网络应用都使用TCP/UDP。SCTP是一个较新的协议&#xff0c;最初设计用于跨因特网传输电话信令。 这些传输协议都转而使用网络协议IP&#xff1a;或是…

windows中命令行批处理脚本学习

目录 一 基础知识二 常见命令1. 输出 echo2. 注释 rem .... %...% :: goto if (10) ()3. 变量 set4. 获取参数 %数字 %*5. 退出 exit6. 复制 copy7.读取输出文件内容 type8. 帮助 命令xxx /?9.等待当前命令运行结束后,才执行下一条命令 call10. 修改字体编码 chcp11. 特殊变量…

集合框架16:HashMap的使用

视频链接&#xff1a;13.35 HashMap使用&#xff08;1&#xff09;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p35 1.创建Student类&#xff0c;添加无参构造…

UML之用例图详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是用例图 用例图&#xff08;Use Case Diagram&#xff09;是UML中一种重要的图表类型&#xff0c;它主要用于描述系统的功能性需求&am…

Java使用HttpClient5实现发送HTTP请求

Java 实现发送 HTTP 请求&#xff0c;系列文章&#xff1a; 《Java使用原生HttpURLConnection实现发送HTTP请求》 《Java使用HttpClient5实现发送HTTP请求》 《SpringBoot使用RestTemplate实现发送HTTP请求》 1、HttpClient5 的介绍 HttpClient5 是 Apache HttpComponents 项目…

文件处理新纪元:微信小程序的‘快递员’与‘整理师’

嗨&#xff0c;我是中二青年阿佑&#xff0c;今天阿佑将带领大家如何通过巧妙的文件处理功能&#xff0c;让用户体验从‘杂乱无章’到‘井井有条’的转变&#xff01; 文章目录 微信小程序的文件处理文件上传&#xff1a;小程序的“快递服务”文件下载&#xff1a;小程序的“超…

植物大战僵尸杂交版游戏分享

植物大战僵尸杂交版游戏下载&#xff1a;夸克网盘分享 无捆绑之类的隐形消费&#xff0c;下载即玩