前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载

news2024/12/25 12:48:45

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载

各种文本文件预览(pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md, txt, log, fa, fasta, tsv, csv 等各种文本文件)
其中 除pdf,xlsx,docx之外的文本还可以修改,xlsx想要修改看我另一篇博客luckyexcel 编辑预览excel文件

先看效果
请添加图片描述

引入库


     //预览编辑文本用
    "@codemirror/lang-cpp": "^6.0.2",
    "@codemirror/lang-css": "^6.2.1",
    "@codemirror/lang-html": "^6.4.9",
    "@codemirror/lang-java": "^6.0.1",
    "@codemirror/lang-javascript": "^6.2.2",
    "@codemirror/lang-json": "^6.0.1",
    "@codemirror/lang-markdown": "^6.2.5",
    "@codemirror/lang-python": "^6.1.6",
    "@codemirror/lang-rust": "^6.0.1",
    "@codemirror/lang-sql": "^6.7.0",
    "@codemirror/lang-vue": "^0.1.3",
    "@codemirror/lang-xml": "^6.1.0",
    "@codemirror/theme-one-dark": "^6.1.2",
    "codemirror": "^6.0.1",
     
     //预览word、pdf、excel文件用
    "@vue-office/docx": "^1.6.2",
    "@vue-office/excel": "^1.7.11",
    "@vue-office/pdf": "^2.0.2",
    
    //导出word
    "buffer": "^6.0.3",
    "docxtemplater": "^3.46.0",
    "file-saver": "^2.0.5",
    "pizzip": "^3.1.6",
	"jszip-utils": "^0.1.0",

	//导出pdf
    "html2canvas": "^1.4.1",
    "jspdf": "^2.5.1",
    
    //导出xlsx文件(试用于electron,web也可以用)
    "node-xlsx": "^0.23.0",
    //或者用xlsx库
	"xlsx": "^0.18.5"

导出pdf、xlsx、word文件

<template>
  <div class="content" id="exportPdf">
    <a-space>
      <a-button type="primary" @click="exportWord">导出word</a-button>
      <a-button type="primary" @click="exportXlsx">导出elcel</a-button>
      <a-button type="primary" @click="exportPdf">导出pdf</a-button>
      <a-button type="primary" @click="() => router.push('/preview')">文件预览</a-button>
    </a-space>

    <br />
    <br />
    <hr />
    <div class="flex flex-justify-around">
      <div>unocss</div>
      <div>测试</div>
      <div>可以用的</div>
    </div>
    <br />
    <div class="text-center">
      <a href="https://unocss.dev/interactive/" target="_blank" rel="noopener noreferrer"
        >unocss 文档</a
      >
    </div>
  </div>
</template>

<script lang="ts" setup>

import { useRouter } from 'vue-router';
import { setLogin, getUserInfo } from '../../serve/api/login';
import { globalData } from '../../setting/global';

import { Buffer } from 'buffer';
import xlsx from 'node-xlsx';

import docxtemplater from 'docxtemplater';
import PizZip from 'pizzip';
import JSZipUtils from 'jszip-utils';
import { saveAs } from 'file-saver';

import html2canvas from 'html2canvas';
import JsPDF from 'jspdf';

const router = useRouter();

const tableValue = reactive({
  unit: '中国',
  date: undefined,
  sampleType: '你猜',
  people: '黄种人',
  name: '夜空',
  sex: '男',
  age: '25',
  work: '开发',
  id: '',
  jiance: '商品化试剂盒',
  date2: undefined,
});
const exportWord = () => {
  let docxname = '导出word.docx';
  JSZipUtils.getBinaryContent('/template.docx', function (error: any, content: any) {
    // template.docx是模板(这里我放到public公共文件夹下面了)。我们在导出的时候,会根据此模板来导出对应的数据
    // 抛出异常
    if (error) {
      throw error;
    }

    // 创建一个PizZip实例,内容为模板的内容
    let zip = new PizZip(content);
    // 创建并加载docx templater实例对象
    let doc = new docxtemplater().loadZip(zip);
    // 设置模板变量的值  主要变量替换在这里
    doc.setData({
      name: tableValue.name,
      unit: tableValue.unit,
      date: '这里也不可以不写变量',
      sampleType: tableValue.sampleType,
      sex: tableValue.sex,
      age: tableValue.age,
    });

    try {
      // 用模板变量的值替换所有模板变量
      doc.render();
    } catch (error: any) {
      // 抛出异常
      let e = {
        message: error.message,
        name: error.name,
        stack: error.stack,
        properties: error.properties,
      };
      console.log(
        JSON.stringify({
          error: e,
        }),
      );
      throw error;
    }

    // 生成一个代表docxtemplater对象的zip文件(不是一个真实的文件,而是在内存中的表示)
    let out = doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    });
    // 将目标文件对象保存为目标类型的文件,并命名
    saveAs(out, docxname);
  });
};
const exportXlsx = () => {
  let data = [
    [1, 222, '', '', '', ''],
    ['', 2, 3, 4, 5, 6],
    ['', 2, 3, 4, 5, 6],
    ['', 2, 3, 4, 5, 6],
    ['', 2, 3, 4, 5, 6],
    [22, 2, 3, 4, 5, 6],
  ];

  // 行列合并规则  c:col 列   r:row 行
  const range0 = { s: { c: 0, r: 0 }, e: { c: 0, r: 4 } };
  const range1 = { s: { c: 1, r: 0 }, e: { c: 5, r: 0 } };
  const sheetOptions = {
    '!merges': [range0, range1],
    // cols 列宽大小
    '!cols': [{ wch: 5 }, { wch: 10 }, { wch: 15 }, { wch: 20 }, { wch: 30 }, { wch: 50 }],
  };
  //如果不需要格式,这里的sheetOptions可以省略不写
  let result = xlsx.build([{ name: 'sheet1', data }], { sheetOptions });
  const ab = Buffer.from(result, 'binary');
  const blob = new Blob([ab]);
  const blobUrl = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = blobUrl;
  a.download = '导出excel.xlsx';
  a.click();
  window.URL.revokeObjectURL(blobUrl);
};
const exportPdf = () => {
  downloadPDF(document.querySelector('#exportPdf'), '导出pdf文件', pdfSuc(), 4);
};
const pdfSuc = () => {
  message.success('导出成功');
};
/**
 * ele:需要导出的容器
 * pdfName:导出文件的名字
 * callback: 成功回调
 */
const downloadPDF = (ele: any, pdfName: any, callback: any, scale?: number) => {
  html2canvas(ele, {
    dpi: 600,
    scale: scale ? scale : 8,
    // allowTaint: true,  //允许 canvas 污染, allowTaint参数要去掉,否则是无法通过toDataURL导出canvas数据的
    useCORS: true, //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
    width: ele.scrollWidth,
    height: ele.scrollHeight,
  }).then((canvas) => {
    //未生成pdf的html页面高度
    var leftHeight = canvas.height;
    var a4Width = 595.28;
    var a4Height = 801.89; //(一张A4高=841.89减去20,使得上下边距空出20,pdf.addImage生成上边距(第四个参数=10)致使使得上下边距各10)
    //一页pdf显示html页面生成的canvas高度;
    var a4HeightRef = Math.floor((canvas.width / a4Width) * a4Height);
    //pdf页面偏移
    var position = 0;
    var pageData = canvas.toDataURL('image/jpeg', 1.0);
    var pdf = new JsPDF('x', 'pt', 'a4');
    var index = 1,
      canvas1 = document.createElement('canvas'),
      height;
    pdf.setDisplayMode('fullwidth', 'continuous', 'FullScreen');

    function createImpl(canvas) {
      if (leftHeight > 0) {
        index++;
        var checkCount = 0;
        if (leftHeight > a4HeightRef) {
          var i = position + a4HeightRef;
          for (i = position + a4HeightRef; i >= position; i--) {
            var isWrite = true;
            for (var j = 0; j < canvas.width; j++) {
              var c = canvas.getContext('2d').getImageData(j, i, 1, 1).data;
              if (c[0] != 0xff || c[1] != 0xff || c[2] != 0xff) {
                isWrite = false;
                break;
              }
            }
            if (isWrite) {
              checkCount++;
              if (checkCount >= 10) {
                break;
              }
            } else {
              checkCount = 0;
            }
          }
          height = Math.round(i - position) || Math.min(leftHeight, a4HeightRef);
          if (height <= 0) {
            height = a4HeightRef;
          }
        } else {
          height = leftHeight;
        }
        canvas1.width = canvas.width;
        canvas1.height = height;
        var ctx = canvas1.getContext('2d');
        ctx.drawImage(canvas, 0, position, canvas.width, height, 0, 0, canvas.width, height);
        if (position != 0) {
          pdf.addPage();
        }
        // 在pdf.addImage(pageData, 'JPEG', 左间距,上间距,宽度,高度)设置在pdf中显示;
        pdf.addImage(
          canvas1.toDataURL('image/jpeg', 1.0),
          'JPEG',
          70,
          56,
          a4Width - 140,
          (a4Width / canvas1.width) * height - 112,
        );

        leftHeight -= height;
        position += height;
        if (leftHeight > 0) {
          setTimeout(createImpl, 500, canvas);
          callback();
        } else {
          pdf.save(pdfName);
          callback();
        }
      }
    }

    // 当内容未超过pdf一页显示的范围,无需分页
    if (leftHeight < a4HeightRef) {
      pdf.addImage(pageData, 'JPEG', 0, 50, a4Width, (a4Width / canvas.width) * leftHeight);
      pdf.save(pdfName);
      // callback();
    } else {
      try {
        pdf.deletePage(0);
        setTimeout(createImpl, 500, canvas);
      } catch (err) {
        console.log(err);
      }
    }
  });
};
</script>

<style lang="less" scoped>
.content {
  width: 90vw;
  min-height: 90vh;
  margin: 5vh auto;
  padding: 20px;
  outline: 1px dashed #999;
}
</style>

预览各种文本

<!--
 * @Descripttion:
 * @Author: 苍狼一啸八荒惊
 * @Date: 2024-08-12 12:18:53
 * @LastEditTime: 2024-08-13 15:27:27
 * @LastEditors: 夜空苍狼啸
-->
<script lang="ts" setup>
// ! 目前不支持doc、xls格式文件的预览
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx';
import '@vue-office/docx/lib/index.css';

//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel';
import '@vue-office/excel/lib/index.css';

//引入VueOfficePdf组件
import VueOfficePdf from '@vue-office/pdf';

import { message } from 'ant-design-vue';
import { useRouter } from 'vue-router';
const router = useRouter();
const fileText: any = undefined;
const data = reactive({
  loading: false,
  fileList: [],
  fileType: 'xlsx',
  //   docxSrc: 'http://static.shanhuxueyuan.com/test6.docx',
  //   excelSrc: 'http://static.shanhuxueyuan.com/demo/excel.xlsx',
  docxSrc: '',
  excelSrc: '/template.xlsx',
  pdfSrc: '',

  codemirror: false,
  fileText,
  refreshCodemirrorKey: 0,
});
const customUpload = async (info: any) => {
  data.loading = true;
  console.log(info);
  let suffixName = info.file.name.split('.').pop();
  data.fileType = suffixName;
  data.codemirror = false;

  let fileReader = new FileReader();
  fileReader.readAsArrayBuffer(info.file);

  if (['docx', 'doc'].includes(suffixName)) {
    if (suffixName === 'doc') {
      message.info('请上传docx格式的文件');
      return;
    }
    fileReader.onload = () => {
      data.docxSrc = fileReader.result;
    };
  } else if (['xlsx', 'xls'].includes(suffixName)) {
    if (suffixName === 'xls') {
      message.info('请上传xlsx格式的文件');
      return;
    }
    fileReader.onload = () => {
      data.excelSrc = fileReader.result;
    };
  } else if (['pdf'].includes(suffixName)) {
    fileReader.onload = () => {
      data.pdfSrc = fileReader.result;
    };
  } else if (
    ['cpp', 'java', 'sql', 'py', 'vue', 'html', 'js', 'json', 'css', 'xml', 'rust', 'md'].includes(
      suffixName,
    )
  ) {
    // 文本,启用 Codemirror
    data.codemirror = true;

    data.fileText = await readFileAsync(info.file);
    data.refreshCodemirrorKey++;
  } else {
    // message.info('该格式暂不支持查看!');

    data.codemirror = true;
    data.fileText = await readFileAsync(info.file);
    data.refreshCodemirrorKey++;
  }
  data.loading = false;
};
const handleChange = async (e: any) => {
  let file = e.target.files[0];
  let suffixName = file.name.split('.').pop();
  data.fileType = suffixName;
  data.codemirror = false;

  let fileReader = new FileReader();
  fileReader.readAsArrayBuffer(file);

  if (['docx', 'doc'].includes(suffixName)) {
    if (suffixName === 'doc') {
      message.info('请上传docx格式的文件');
      return;
    }
    fileReader.onload = () => {
      data.docxSrc = fileReader.result;
    };
  } else if (['xlsx', 'xls'].includes(suffixName)) {
    if (suffixName === 'xls') {
      message.info('请上传xlsx格式的文件');
      return;
    }

    // 使用blob文件流
    let blob = new Blob([file], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    });
    data.excelSrc = URL.createObjectURL(blob);
    // 读取文件的ArrayBuffer
    // fileReader.onload = () => {
    //   data.excelSrc = fileReader.result;
    // };

    // data.excelSrc = URL.createObjectURL(file);
  } else if (['pdf'].includes(suffixName)) {
    fileReader.onload = () => {
      data.pdfSrc = fileReader.result;
    };
  } else if (
    ['txt', 'vue', 'json', 'java', 'sql', 'js', 'css', 'xml', 'html', 'yaml', 'md', 'py'].includes(
      suffixName,
    )
  ) {
    // 文本,启用 Codemirror
    data.codemirror = true;

    data.fileText = await readFileAsync(file);
    data.refreshCodemirrorKey++;
  } else {
    // message.info('该格式暂不支持查看!');

    data.codemirror = true;
    data.fileText = await readFileAsync(file);
    data.refreshCodemirrorKey++;
  }
};
const rendered = () => {
  console.log('渲染完成');
};
const errorHandler = () => {
  console.log('渲染失败');
};

// 读取文本文件内容
const readFileAsync = (file: Blob | File) => {
  return new Promise((resolve, reject) => {
    // 读取文件里面的内容返回
    var reader = new FileReader();
    // 以文本格式读取文件
    reader.readAsText(file, 'UTF-8');
    reader.onload = function (event) {
      resolve(event.target.result);
    };
    reader.onerror = function (event) {
      reject(event.target);
    };
  });
};

onMounted(() => {});
</script>
<template>
  <div class="content">
    <div class="mb-1 color-red-500">
      支持预览文件: pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md,
      txt, log, fa, fasta, tsv, csv 等各种文本文件
    </div>
    <a-space class="mb-1">
      <!-- accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" -->
      <a-upload
        v-model:file-list="data.fileList"
        :customRequest="customUpload"
        name="file"
        :multiple="false"
        :showUploadList="false"
      >
        <a-button :loading="data.loading" type="primary">上传文件</a-button>
      </a-upload>
      <input type="file" ref="fileButton" @change="handleChange" />
      <a-button type="primary" @click="() => router.push('/index')">文件导出</a-button>
    </a-space>
    <!-- office -->
    <div v-if="!data.codemirror">
      <!-- docx -->
      <vue-office-docx
        v-if="data.fileType === 'docx'"
        :src="data.docxSrc"
        style="height: 80vh"
        @rendered="rendered"
        @error="errorHandler"
      />
      <!-- excel -->
      <vue-office-excel
        v-else-if="data.fileType === 'xlsx'"
        :src="data.excelSrc"
        style="height: 80vh"
        @rendered="rendered"
        @error="errorHandler"
      />
      <!-- pdf -->
      <vue-office-pdf
        v-else-if="data.fileType === 'pdf'"
        :src="data.pdfSrc"
        style="height: 100vh"
        @rendered="rendered"
        @error="errorHandler"
      />
    </div>
    <!-- 文本 -->
    <div v-else class="mt--6">
      <Codemirror :fileText="data.fileText" :fileType="data.fileType" />
      <!-- :key="data.refreshCodemirrorKey" -->
    </div>
  </div>
</template>

<style lang="less" scoped>
.content {
  width: 90vw;
  min-height: 90vh;
  margin: 5vh auto;
  padding: 20px;
  outline: 1px dashed #999;
}
</style>

子组件

<!--
 * @Descripttion: 
 * @Author: 苍狼一啸八荒惊
 * @Date: 2024-08-12 13:51:19
 * @LastEditTime: 2024-08-13 15:36:07
 * @LastEditors: 夜空苍狼啸
-->

<script lang="ts" setup>
// codemirror api https://codemirror.net/docs/guide/
import { EditorState, Text, Compartment } from '@codemirror/state';
import { basicSetup, EditorView } from 'codemirror';
import { keymap, lineNumbers } from '@codemirror/view';
import { defaultKeymap } from '@codemirror/commands';
import { oneDark } from '@codemirror/theme-one-dark';

import { json, jsonParseLinter } from '@codemirror/lang-json';
import { css } from '@codemirror/lang-css';
import { cpp } from '@codemirror/lang-cpp';
import { html } from '@codemirror/lang-html';
import { java } from '@codemirror/lang-java';
import { javascript as js } from '@codemirror/lang-javascript';
import { markdown as md } from '@codemirror/lang-markdown';
import { python as py } from '@codemirror/lang-python';
import { sql } from '@codemirror/lang-sql';
import { rust } from '@codemirror/lang-rust';
import { vue } from '@codemirror/lang-vue';
import { xml } from '@codemirror/lang-xml';
import { saveTextAsFile } from '/@/libs/utils/download';
const props = defineProps({
  fileText: {
    type: String,
    default: 'hello word!', //文本
  },
  fileType: {
    type: String,
    default: 'json', // 编辑模式(文件类型)
  },
});

const data = reactive({
  fontSize: '14',
  theme: 'dark', // codeMirror主题
  readOnly: false,
  lineNumber: true,
});

const editorRef: Ref<InstanceType<typeof Element> | undefined> = ref();

onMounted(() => {});
onUnmounted(() => {
  view?.destroy();
});
watch(
  () => props.fileText,
  (n) => {
    init();
  },
);

let view: any;
const init = () => {
  view?.destroy();
  let startState = EditorState.create({
    doc: props.fileText,
    extensions: [
      data.lineNumber ? basicSetup : [],
      data.theme == 'default' ? [] : oneDark,
      EditorState.readOnly.of(!data.readOnly),
      textType(props.fileType),

      // 自定义主题

      // EditorView.theme(
      //   {
      //     '&': {
      //       color: 'white',
      //       backgroundColor: '#034',
      //     },
      //     '.cm-content': {
      //       caretColor: '#0e9',
      //     },
      //     '&.cm-focused .cm-cursor': {
      //       borderLeftColor: '#0e9',
      //     },
      //     '&.cm-focused .cm-selectionBackground, ::selection': {
      //       backgroundColor: '#074',
      //     },
      //     '.cm-gutters': {
      //       backgroundColor: '#045',
      //       color: '#ddd',
      //       border: 'none',
      //     },
      //   },
      //   { dark: true },
      // ),
    ],
    // extensions: [keymap.of(defaultKeymap)],
  });
  view = new EditorView({
    state: startState,
    parent: unref(editorRef),
  });
};
const textType = (type: string) => {
  // if (supportType.includes(type)) {
  //   // eval 将字符串转化为函数
  //   return eval(type + '()');
  // } else {
  //   return keymap.of(defaultKeymap);
  // }
  return type == 'json'
    ? json()
    : type == 'css'
    ? css()
    : type == 'cpp'
    ? cpp()
    : type == 'html'
    ? html()
    : type == 'java'
    ? java()
    : type == 'js' || type == 'ts'
    ? js()
    : type == 'md'
    ? md()
    : type == 'py'
    ? py()
    : type == 'sql'
    ? sql()
    : type == 'rust'
    ? rust()
    : type == 'vue'
    ? vue()
    : type == 'xml'
    ? xml()
    : keymap.of(defaultKeymap);
};
//节流
let timer_throttle: any;
const throttle = (fn: Function, wait?: number) => {
  wait = wait || 100;
  if (!timer_throttle) {
    timer_throttle = setTimeout(() => {
      fn.apply(this);
      timer_throttle = null;
    }, wait);
  }
};

const handFontSize = (value: string) => {
  let cmContent = document.querySelector('.cm-content');
  if (cmContent) {
    cmContent.style.fontSize = value + 'px';
  }
};
const handTheme = (value: string) => init();

const handLineNumber = (value: boolean) => init();

const handReadOnly = (value: boolean) => init();
const saveFile = () => {
  console.log(view?.state.doc.toString());
  saveTextAsFile(view?.state.doc.toString(), 'newFile.' + props.fileType);
};
</script>
<template>
  <div class="flex-end mt-2 mb-2">
    <a-space>
      <a-button type="primary" v-if="data.readOnly" @click="saveFile">保存</a-button>
      <a-select v-model:value="data.fontSize" class="w-px-100" @change="handFontSize">
        <a-select-option value="12">12px</a-select-option>
        <a-select-option value="14">14px</a-select-option>
        <a-select-option value="16">16px</a-select-option>
        <a-select-option value="18">18px</a-select-option>
      </a-select>
      <a-select v-model:value="data.theme" class="w-px-100" @change="handTheme">
        <a-select-option value="default">默认</a-select-option>
        <a-select-option value="dark">dark</a-select-option>
      </a-select>
      <a-switch
        checked-children="显示行号"
        un-checked-children="不显示"
        v-model:checked="data.lineNumber"
        @change="handLineNumber"
      />
      <a-switch
        checked-children="可编辑"
        un-checked-children="不可编辑"
        v-model:checked="data.readOnly"
        @change="handReadOnly"
      />
    </a-space>
  </div>
  <div ref="editorRef"></div>

  <!-- <CodemirrorCodemirror :value="fileText" :fileType :lineNumber :readOnly :theme="data.theme" /> -->
</template>

<style lang="less" scoped></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047772.html

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

相关文章

【LeetCode Cookbook(C++ 描述)】一刷二叉树综合(上)

目录 LeetCode #226&#xff1a;Invert Binary Tree 翻转二叉树「遍历」「分而治之」广度优先搜索&#xff1a;层序遍历 LeetCode #101&#xff1a;Symmetric Tree 对称二叉树递归法迭代法 LeetCode #100&#xff1a;Same Tree 相同的树递归法迭代法 LeetCode #559&#xff1a;…

万能钥匙:解锁 C++ 模板的无限可能

1.泛型编程 1.1:交换两个数(C语言) 1.2:交换两个数(C) 1.3:泛型编程 2:函数模板 2.1:函数模板的概念 2.2:函数模板的格式 ​编辑 2.3:函数模板的原理 2.4:模板的实例化 2.4.1:隐式实例化 2.4.2:显式实例化:在函数名后的<>中指定模板参数的实际类型. 2.4.2.1…

Unidbg使用指南

Unidbg使用指南 简介使用Unidbg补环境仅含C语言C调用 Java 实操——车智赢在unidbg实现执行so中的方法附——关于引用数据类型的转换附——静态注册和动态注册模板静态注册动态注册 现在很多的app使用了so加密&#xff0c;以后会越来越多。爬虫工程师可能会直接逆向app&#xf…

黑马前端——days09_css

案例 1 页面框架文件 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…

Ubuntu20.04如何安装配置JDK

资源准备 官方下载地址&#xff08;根据自己的系统版本选择不同版本进行下载即可&#xff09;&#xff1a;Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …

jmeter安装及环境变量配置、Jmeter目录介绍和界面详解

一 JMeter简介 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xff1a;静态文件&#xff0c;Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…

【已解决】在进行模型量化推理的过程中遇到的错误以及解决方法

①在使用vLLM推理模型时&#xff0c;出现&#xff1a; Error in calling custom op rms_norm: _OpNamespace _C object has no attribute rms_norm 尝试众多解决方法之后&#xff0c;包括重新安装 pip install vllm0.5.0 对我有用的解决方法&#xff1a; 修改子目录下的vll…

【2024最新】Windows系统上NodeJS安装及环境配置图文教程

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许在服务器端运行 JavaScript 代码。它采用事件驱动、非阻塞 I/O 模型&#xff0c;非常适合构建高性能的网络应用程序。Node.js 提供了一系列内置模块&#xff0c;支持异步编程&#xff0c;易于扩展&…

机器学习:knn算法实现图像识别

1、概述 使用K-近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法对手写数字进行识别的过程。通过读取一张包含多个手写数字的图片&#xff0c;将其分割成单独的数字图像&#xff0c;并将其作为训练和测试数据集。 2、数据处理思路 1、图像分割该数据有50行100列&am…

手机设备IP地址切换:方法、应用与注意事项

在当今数字化时代&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;手机都扮演着重要角色。然而&#xff0c;随着网络环境的日益复杂&#xff0c;有时我们需要切换手机设备的IP地址以满足特定的需求&#xff0c;如保护隐私、绕过地…

算法笔记:空间填充曲线

空间填充曲线&#xff08;Space-filling curve&#xff09;是一种数学曲线&#xff0c;它可以无间断地覆盖一个多维空间的每一个点&#xff0c;从而实现从一维到多维的映射。用以解决连续与离散空间之间的映射问题。空间填充曲线的应用广泛&#xff0c;包括图像处理、地理信息系…

基于微信小程序的诗词智能学习系统的设计与实现(全网独一无二,24年最新定做)

文章目录 前言&#xff1a; 博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为…

dos攻击漏洞思路小结

前言 想挖掘src拒绝服务类型的漏洞&#xff0c;搜索了一圈社区相关文章较少&#xff0c;这里根据自己的一些实战案例归纳思路来抛砖引玉&#xff0c;希望能对各位师傅有所帮助&#xff01; 从黑盒视角搭配实际场景&#xff0c;说明如何具体操作能够快速的挖掘拒绝服务漏洞。 …

vue3中使用useStore(),返回undefined的踩坑记录

vue3中使用useStore()&#xff0c;返回undefined&#xff0c;排查后&#xff0c;记录一下的踩坑记录。 总结为&#xff0c;三检查&#xff1a; 1、一检查版本 在package.json中检查&#xff0c;vuex是否正常引入&#xff1a; 版本也要确认一下&#xff1a; vue3对应vuex4的…

使用光流进行相机运动估计

文章目录 基本相机移动区分动作的核心思想了解代码参考 基本相机移动 从我的非专业角度来看&#xff0c;尽管已知的摄像机运动有多种&#xff0c;但我们应该概述其中三种&#xff1a; 一种是将摄像机安装在轨道上并移动——卡车、移动式摄影车、基座摄像机停留在同一位置并旋…

MySQL中的distinct和group by哪个效率更高?

前言 大家好&#xff0c;我是月夜枫~~ 一、distinct和group by的区别 1.1.作用方式和应用场景 ‌group by和‌distinct的主要区别在于它们的作用方式和应用场景。 group by用于对数据进行分组和聚合操作&#xff0c;通常与聚合函数&#xff08;如COUNT、SUM、AVG等&#xf…

学习分享:微软Edge浏览器全解析(请按需收藏)

成长路上不孤单&#x1f60a;【14后小学生一枚&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;】 微软Edge浏览器是一款由微软开发的现代网页浏览…

Python(PyTorch)硅光电倍增管和量化感知训练亚光子算法验证

&#x1f3af;要点 &#x1f3af;亚光子光神经网络矩阵计算 | &#x1f3af;光学扇入计算向量点积 | &#x1f3af;表征测量确定不同光子数量下计算准确度 | &#x1f3af;训练全连接多层感知器基准测试光神经网络算法数字识别 | &#x1f3af;物理验证光学设备设置 | &#x…

【闭包】闭包知识点总结

一、什么是闭包&#xff1f; ——官方解释&#xff1a; 一个函数对周围状态的引用捆绑在一起&#xff0c;内层函数中访问到其外层函数的作用域 ——简单解释&#xff1a; &#x1f449; 闭包内层函数可以引用的外层函数的变量 ——闭包优势 可以保护内部变量&#xff0c;不让外…

黑马前端——days11_综合案例

文章目录 一、首页1、页面开头2、快捷导航2.1 页面框架2.2 格式文件 3、头部模块3.1 页面框架3.2 格式文件 4、导航栏4.1 页面框架4.2 格式文件 5、页面主模块5.1 页面框架5.2 格式文件 6、推荐模块6.1 页面框架6.2 格式文件 7、楼层模块7.1 页面框架7.2 格式文件 8、页面底部8…