前端笔记

前端笔记

1 Vue2相关语法

1.1 父子组件传参

Up主讲解挺清楚的,这里记载下精髓。
https://www.bilibili.com/video/BV1Ut4y1N7tS/?spm_id_from=333.788&vd_source=cf6bd8c13e463b1f65d6ad155f8b711d

1、父组件向子组件传递参数,通过子组件的props属性,属性内容为传递参数

在这里插入图片描述

2、子组件向父组件传参;子组件创建一个函数,由函数传参(相当于定义一个带参数的函数);而父组件来实现子组件的定义函数,并且自动获得函数的传递参数

在这里插入图片描述

1.2 Vuex学习

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

2 开发问题解决

2.1 前端接收后端发送的csv文件名乱码

前端发送文件下载请求,接收后端发送的csv文件,关于乱码问题的处理。

在这里插入图片描述

  • 前端发送导出文件请求
 downLoadFile(){
      this.$http.get('/export').then(res => {
        //获取文件名
        /**
         * Content-Disposition此处必须开头小写,大写不通过。
         * */
        var disposition = res.headers["content-disposition"];
        var fileName = decode(disposition.substring(disposition.indexOf("=") + 1), "UTF-8");
        console.log(fileName)
        //创建一个a标签并设置href属性,之后模拟人为点击下载文件
        let link = document.createElement('a');
        /**
         * new Blob(['\uFEFF' + res.data]
         * 此处是重点,解决csv下载的文件用Excel打开乱码,其他打开不乱码的问题
         * */
        link.href = window.URL.createObjectURL(new Blob(['\uFEFF' + res.data]))
        link.download = fileName;//设置下载文件名
        link.click();//模拟点击
        //释放资源并删除创建的a标签
        URL.revokeObjectURL(link.href);
        /**
         * 这里做判断,因为第一次点击存在link删除,再点击就会报错。不是ChildNode
         * */
        if (document.body.contains(link)) {
          document.body.removeChild(link);
        }

      }, (response) => {
        console.error(response)
      });
    },
  • 后端下载并导出Csv文件
    /**
     * 下载并导出csv文件
     * */
    @RequestMapping(value = "/export")
    public void getSkuList1(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //获取到批量识别的短链接数据结果
        LinkedHashSet<ShortLinks> linkedHashSet = ParseUrl.getLinkedHashSet();
        List<Object[]> cellList = new ArrayList<>();

        if (null == linkedHashSet || linkedHashSet.isEmpty()){
            System.out.println("导出数据中没有处理的数据!");
        }else {
            for (ShortLinks sl : linkedHashSet) {
                Object[] object = {sl.getCreate_time(), sl.getShort_link(), sl.getDomain_name(), sl.getIp_address(), sl.getIp_territorial(),
                        sl.getRecord_status(), sl.getDomain_type()};
                cellList.add(object);
            }

            String[] tableHeaderArr = {"录入时间","短链接名", "对应域名", "对应IP", "IP归属地", "备案状态", "域名状态", "域名类型"};
            String fileName = "导出文件.csv";
            byte[] bytes = ExportCSVUtil.writeCsvAfterToBytes(tableHeaderArr,  cellList);
            ExportCSVUtil.responseSetProperties(fileName, bytes, request, response);
        }
    }
  • 下载文件的工具类(编码问题处理)
package com.example.util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.io.ByteOrderMark;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  写csv文件
 */
public class ExportCSVUtil {

    private static final Logger logger = LoggerFactory.getLogger(ExportCSVUtil.class);

    /**
     * 写CSV并转换为字节流
     * @param tableHeaderArr 表头
     * @param cellList 数据
     * @return
     */
    public static byte[] writeDataAfterToBytes(String[] tableHeaderArr, List<String> cellList) {
        byte[] bytes = new byte[0];
        ByteArrayOutputStream byteArrayOutputStream = null;
        OutputStreamWriter outputStreamWriter = null;
        BufferedWriter bufferedWriter = null;
        try {
            byteArrayOutputStream = new ByteArrayOutputStream();
            outputStreamWriter = new OutputStreamWriter(byteArrayOutputStream,StandardCharsets.UTF_8);
            bufferedWriter = new BufferedWriter(outputStreamWriter);
            //excel文件需要通过文件头的bom来识别编码,而CSV文件格式不自带bom,所以写文件时,需要先写入bom头,否则excel打开乱码
            bufferedWriter.write(new String(ByteOrderMark.UTF_8.getBytes()));
            //写表头
            StringBuilder sb = new StringBuilder();
            String tableHeader = String.join(",", tableHeaderArr);
            sb.append(tableHeader + StringUtils.CR + StringUtils.LF);
            for (String rowCell : cellList) {
                sb.append(rowCell + StringUtils.CR + StringUtils.LF);
            }
            bufferedWriter.write(sb.toString());
            bufferedWriter.flush();
            //把输出流转换字节流
            bytes = byteArrayOutputStream.toString(StandardCharsets.UTF_8.name()).getBytes();
            return bytes;
        } catch (IOException e) {
            logger.error("writeDataAfterToBytes IOException:{}", e.getMessage(), e);
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
                if (outputStreamWriter != null) {
                    outputStreamWriter.close();
                }
                if (byteArrayOutputStream != null) {
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                logger.error("iostream close IOException:{}", e.getMessage(), e);
            }
        }
        return bytes;
    }

    /**
     * 写CSV并转换为字节流
     * @param headers 表头
     * @param cellList 表数据
     * @return
     */
    public static byte[] writeCsvAfterToBytes(String[] headers,  List<Object[]>  cellList) {
        byte[] bytes = new byte[0];
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(byteArrayOutputStream, StandardCharsets.UTF_8);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        CSVPrinter  csvPrinter = null;
        try {
            //创建csvPrinter并设置表格头
            csvPrinter = new CSVPrinter(bufferedWriter, CSVFormat.DEFAULT.withHeader(headers));
            //写数据
            csvPrinter.printRecords(cellList);
            csvPrinter.flush();
            bytes = byteArrayOutputStream.toString(StandardCharsets.UTF_8.name()).getBytes();
        } catch (IOException e) {
            logger.error("writeCsv IOException:{}", e.getMessage(), e);
        } finally {
            try {
                if (csvPrinter != null) {
                    csvPrinter.close();
                }
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
                if (outputStreamWriter != null) {
                    outputStreamWriter.close();
                }
                if (byteArrayOutputStream != null) {
                    byteArrayOutputStream.close();
                }
            } catch (IOException e) {
                logger.error("iostream close IOException:{}", e.getMessage(), e);
            }
        }
        return bytes;
    }

    /**
     * 设置下载响应
     * @param fileName
     * @param bytes
     * @param response
     */
    public static void responseSetProperties(String fileName, byte[] bytes, HttpServletRequest request, HttpServletResponse response) {
        try {
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "max-age=30");

            /**
             * FILENAME为我们要下载的文件的文件名(包含后缀),
             * RFC 2183规定FILENAME只能为US-ASCII码,然而现代浏览器中许多已经支持UTF-8编码了,
             * 但各个浏览器的支持规则不同。
             * 在IE、chrome中,可以直接用FILENAME作为下载文件的名称,但是Firefox却不支持这样。我们直接上代码吧。
             * */

            /**
             * 2022/11/27 2:05分解决response.setHeader(fileName)中文文件名编码问题
             * */
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
            response.setHeader("Content-Disposition","attachment;filename=" + fileName);

            //Content-Disposition字段暴露给前端,才能够进行给下载的文件命名,如果是浏览器直接访问后端接口就不用暴露。
            response.setHeader("Access-Control-Expose-Headers","Content-Disposition");
            response.setHeader("content-Type", "application/csv;charset=utf-8");

            // 响应类型,编码
            OutputStream outputStream = response.getOutputStream();
            // 直接访问接口,在文件的开头,在写入任何内容之前,向流中写入0xEF,0xBB,0xBF三个字节(此处用16进制表示), 用以告诉Excel,此CSV文件的编码为UTF-8.
            /**
             * 但是当文件被前端vue接收时,还是要做处理,不然还是乱码。
             *
             *  *前端处理:
             *  * new Blob(['\uFEFF' + res.data]
             *  * 此处是重点,解决csv下载的文件用Excel打开乱码,其他打开不乱码的问题
             *  * link.href = window.URL.createObjectURL(new Blob(['\uFEFF' + res.data]))
             * */
            outputStream.write(new byte[]{(byte) 0xEF, (byte) 0xBB,(byte) 0xBF});
            outputStream.write(bytes);
            outputStream.flush();
        } catch (IOException e) {
            logger.error("isstream error:{}", e.getMessage(), e);
        }
    }
}

2.2 VUE中根据文件后缀名显示对应的图标

使用方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

提供代码

Vue中的使用方法

        <el-table-column
          prop="name"
          label="文件名"
          width="280"
          :show-overflow-tooltip="true"
        >
          <template slot-scope="scope">
             <span v-if="scope.row.type=='文件夹'">
               <img src="../Components/images/folder.png" width="18px" height="15px">
               {{ scope.row.name }}
             </span>
            <span v-if="scope.row.type=='文件'">
              <img :src="require('../Components/images/'+  matchType()(scope.row.name)  +'.png')" width="18px" height="15px"/>
              {{ scope.row.name }}
             </span>
          </template>
        </el-table-column>

matchType.js文件的全部内容

// 根据文件名后缀区分 文件类型
/*
 * @param: fileName - 文件名称
 * @param: 数据返回 1) 无后缀匹配 - false
 * @param: 数据返回 2) 匹配图片 - image
 * @param: 数据返回 3) 匹配 txt - txt
 * @param: 数据返回 4) 匹配 excel - excel
 * @param: 数据返回 5) 匹配 word - word
 * @param: 数据返回 6) 匹配 pdf - pdf
 * @param: 数据返回 7) 匹配 ppt - ppt
 * @param: 数据返回 8) 匹配 视频 - video
 * @param: 数据返回 9) 匹配 音频 - radio
 * @param: 数据返回 10) 其他匹配项 - other
 */
function matchType(fileName) {
  console.log("fileName = ",fileName)
  // 后缀获取
  var suffix = '';
  // 获取类型结果
  var result = '';
  try {
    var flieArr = fileName.split('.');
    suffix = flieArr[flieArr.length - 1];
  } catch (err) {
    suffix = '';
  }
  // fileName无后缀返回 false
  if (!suffix) {
    result = false;
    return result;
  }
  // 图片格式
  var imglist = ['png', 'jpg', 'jpeg', 'bmp', 'gif'];
  // 进行图片匹配
  result = imglist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'image';
    return result;
  };
  // 匹配txt
  var txtlist = ['txt'];
  result = txtlist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'txt';
    return result;
  };
  // 匹配 excel
  var excelist = ['xls', 'xlsx'];
  result = excelist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'excel';
    return result;
  };
  // 匹配 word
  var wordlist = ['doc', 'docx'];
  result = wordlist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'word';
    return result;
  };
  // 匹配 pdf
  var pdflist = ['pdf'];
  result = pdflist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'pdf';
    return result;
  };
  // 匹配 ppt
  var pptlist = ['ppt'];
  result = pptlist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'ppt';
    return result;
  };
  // 匹配 视频
  var videolist = ['mp4', 'm2v', 'mkv'];
  result = videolist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'video';
    return result;
  };
  // 匹配 音频
  var radiolist = ['mp3', 'wav', 'wmv'];
  result = radiolist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'radio';
    return result;
  }

  // 匹配 压缩包
  var packagelist = ['zip', 'rar', 'tar'];
  result = packagelist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'zip';
    return result;
  }

  // 匹配 CSV
  var CSVlist = ['csv'];
  result = CSVlist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'csv';
    return result;
  }

  // 匹配 SQL
  var SQLlist = ['db'];
  result = SQLlist.some(function (item) {
    return item == suffix;
  });
  if (result) {
    result = 'sql';
    return result;
  }

  // 其他 文件类型
  result = 'other';
  return result;
}

//关键
export {
  matchType
}

效果展示

在这里插入图片描述

图标、矢量图资源

网址:https://www.cnblogs.com/youmingkuang/p/11926849.html

3 Vue程序Debug调试

官网Vue调试添加配置:https://v2.cn.vuejs.org/v2/cookbook/debugging-in-vscode.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

最终调试成功

在这里插入图片描述

本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Banqc原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。Serving and Reaching Out © 2022 by Banqc is licensed under CC BY-SA 4.0
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇