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

前端各种文本文件预览 文本编辑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,)) {// 文本,启用 Codemirrordata.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,)) {// 文本,启用 Codemirrordata.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-uploadv-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-docxv-if="data.fileType === 'docx'":src="data.docxSrc"style="height: 80vh"@rendered="rendered"@error="errorHandler"/><!-- excel --><vue-office-excelv-else-if="data.fileType === 'xlsx'":src="data.excelSrc"style="height: 80vh"@rendered="rendered"@error="errorHandler"/><!-- pdf --><vue-office-pdfv-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-switchchecked-children="显示行号"un-checked-children="不显示"v-model:checked="data.lineNumber"@change="handLineNumber"/><a-switchchecked-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.rhkb.cn/news/402445.html

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

相关文章

C 408—《数据结构》算法题基础篇—数组(通俗易懂)

目录 Δ前言 一、数组的合并 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度 : 二、数组元素的倒置 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、数组中特定值元素的删除 0.题目 : …

SpringBoot3 + Flowable7 工作流引擎使用笔记

目录 Flowable 简介流程设计器安装使用 SpringBoot 3 整合表结构流程部署启动流程流程审批流程挂起和激活任务分配固定分配表达式分配值表达式方法表达式 监听器分配 流程变量运行时变量历史变量 身份服务候选人拾取任务归还任务指派给别人候选人组创建用户创建用户组用户关联用…

VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库

VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …

C语言传递指针给函数

C 语言允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值 实例1&#xff1a;获取系统的时间值 能接受指针作为参数的函数&#xff0c;也能接受数…

为什么Pandas是最流行的Python数据分析库?

本文将从Python生态、Pandas历史背景、Pandas核心语法、Pandas学习资源四个方面去聊一聊Pandas&#xff0c;期望能带给大家一点启发。 一、Python生态里的Pandas 五月份TIOBE编程语言排行榜&#xff0c;Python追上Java又回到第二的位置。Python如此受欢迎一方面得益于它崇尚简…

零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?

前言 本着将成本降到最低&#xff0c;我目前做的应用或小程序都是单机的&#xff0c;也就是不用请求接口&#xff0c;只要一上架就没有任何支出。但是写死的数据毕竟有限&#xff0c;应用的内容单一无法紧跟时事热点&#xff0c;每次打开一个样&#xff0c;自然就没有留存。遇…

Redis13-多级缓存

目录 概述 JVM进程缓存 Caffeine 实现进程缓存 Lua语法 初识Lua 变量和循环 Lua的数据类型 声明变量 循环 条件控制、函数 函数 条件控制 实现多级缓存 安装OpenResty OpenResty快速入门 请求参数处理 查询Tomcat 发送http请求的API 封装http工具 CJSON工…

CSS小玩意儿:文字适配背景

一&#xff0c;效果 二&#xff0c;代码 1&#xff0c;搭个框架 添加一张背景图片&#xff0c;在图片中显示一行文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南(限时开放)

文章目录 前言一.playwright是什么二.python引入playwright1.安装2.playwright命令行参数3.playwright codegen自动生成代码4.Chrome和Chromium有什么关系&#xff1f; 三.基本概念1. 无头浏览器&#xff08;Headless Browser&#xff09;2.同步和异步模式操作playwright2.1.同…

SQL每日一练-0815

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别&#xff0c;显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表&#xff1a;Products 和…

RockerMQ学习

消息中间件以前常用RabbitMQ和ActiveMQ&#xff0c;由于业务需要&#xff0c;后期业务偏向大数据&#xff0c;现着重学习一下RocketMQ&#xff08;RocketqMQ原理同ctg-mq&#xff09;&#xff0c;后续更新Kafka 一、RocketMQ特性 Kafka特性 &#xff08;高性能分布式&#xff…

day34-nginx常用模块

## 0. 网络面试题 网络面试题: TCP三次握手 TCP四次挥手 DNS解析流程 OSI七层模型 抓包工具 tcpdump RAID级别区别 开机启动流程 如何实现不同的网段之间通信(路由器) ip route add 192.168.1.0 255.255.255.0 下一跳的地址或者接口 探测服务器开启了哪些端口(无法登录服务器…

渗透测试-行业术语

1.肉鸡 肉鸡用来比喻哪些可以随意被我们控制的计算机&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型服务器或者其他网络设备&#xff0c;我们可以像操作自己的电脑一样操作他们而不被发觉。 2.木马 表面上伪装成了正常程序&#xff0c;但是当程序被运行的时候&a…

配置MySQL主从,配置MySQL主主 +keeplive高可用

在大数据-Hadoop体系中 配置MySQL主主keeplive高可用 注意&#xff1a;这个是我两年前的word文档&#xff0c;可以当作参考文档有个思路参考一下&#xff0c;但是里面可能有些地方有误 另外 :关于一些企业级实战技术可以参考这篇mysql 物理备份 MySQL 全量备份 增量备份 差异…

Linux_vi vim的使用

目录 vi和vim的基本介绍 vi和vim常用的三种模式 案例演示 vim的快捷键 快捷键使用练习 vi和vim的基本介绍 linux系统内会内置vi文本编译器。vim可以简单认为是vi的增强版本。 vi和vim常用的三种模式 有正常模式&#xff0c;移动光标&#xff0c;删除字符等。插入模式可以进…

Flask 线上高并发部署方案实现

目录 1、Flask默认多线程执行 2、使用gevent.pywsgi实现 3、是用uWSGI服务器实现 1、Flask默认多线程执行 前言&#xff1a;在Flask的较早版本中&#xff0c;默认并不支持多线程模式。然而&#xff0c;从Flask 0.9版本开始&#xff0c;引入了多线程模式的支持&#xff0c;并…

【自动驾驶】ROS中的TF坐标变换(一):静态坐标变换

目录 引子ros中的右手坐标系补充&#xff1a;欧拉角及四元数理解旋转平移操作复合操作 运行坐标变换的例子坐标转换 静态坐标变换-发布坐标系信息创建功能包 静态坐标变换-订阅坐标系信息添加cpp订阅者主文件修改cmakelist文件编译报错的解决方案运行程序进行测试 引子 机器人…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…

Visual Studio 2022 无法打开源文件atlimage.h

最近在搞tcp socket 通信demo&#xff0c;网上抄了一下源码&#xff08;代码参考&#xff1a;C中的Socket编程使用协议发送图片_快速传输 照片 c-CSDN博客&#xff09;&#xff0c;还没开始编译就提示 无法打开源文件atlimage.h&#xff0c;全局搜了一下没有这个文件&#xff0…

JSON Web Token (JWT): 理解与应用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的&#xff0c;因为它可以使用JSON对象在各方…