前端各种文本文件预览 文本编辑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>
相关文章:

前端各种文本文件预览 文本编辑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 等各种文本文件) 其中 除p…...
【Qt】QPluginLoader 类学习
文章目录 一、简介二、常用方法2.1 构造函数2.2 动态加载方法——load()2.3 检查是否加载成功——isLoaded()2.4 访问插件中的根组件——instance()2.5 卸载插件——unload() 一、简介 QPluginLoader 类在运行时加载插件。 QPluginLoader 提供对Qt插件的访问。Qt插件存储在共享…...
DataGear 企业版 1.2.0 发布,数据可视化分析平台
DataGear 企业版 1.2.0 已发布,欢迎体验! http://datagear.tech/pro/ 企业版 1.2.0 修复严重漏洞,新增文件源管理模块,新增JWT统一登录支持,MQTT数据集主题支持通配符,具体更新内容如下: 新增…...

为啥https比http慢
Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例...

软件测试需要具备的基础知识【功能测试】---后端知识(三)
您好,我是程序员小羊! 前言 为了更好的学习软件测试的相关技能,需要具备一定的基础知识。需要学习的基础知识包括: 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写,这是第三篇 …...
详解 Redis 队列 实现
Redis 是一个高性能的键值存储系统,它的多种数据结构使其能够以不同方式实现队列,包括普通队列、延时队列和异步队列的介绍和示例。 介绍 Redis 的 List 数据结构可以用来实现普通的队列。 生产者使用 LPUSH 或 RPUSH 命令将消息添加到列表的头部或尾部…...

分析SQL的count(*)并优化
最近优化过几个慢查询接口的性能,总结了一些心得体会拿出来跟大家一起分享一下,希望对你会有所帮助。 我们使用的数据库是Mysql8,使用的存储引擎是Innodb。这次优化除了优化索引之外,更多的是在优化count(*)。 通常情况下&#…...

Java学习日记(day18)
一、软件的结构 C/S (Client - Server 客户端-服务器端) 典型应用:QQ软件 ,飞秋,印象笔记。 特点: 必须下载特定的客户端程序。服务器端升级,客户端升级。 B/S (Broswer -Server 浏览器端- 服务器端&a…...
Oracle(61)什么是外部表(External Table)?
外部表(External Table)是Oracle数据库中的一种特殊表类型,用于访问存储在外部文件系统中的数据,而不需要将数据实际加载到数据库内部。外部表的主要优势在于允许数据库用户在不移动或复制数据的情况下,直接查询和处理…...

物联网HMI/网关搭载ARM+CODESYS实现软PLC+HMI一体化
物联网HMI/网关搭载CODESYS实现软PLCHMI一体化 硬件:ARM平台,支持STM32/全志T3/RK3568/树莓派等平台 软件:CODESYS V3.5、JMobile Studio CODESYS是一款功能强大的PLC软件编程工具,它支持IEC61131-3标准IL、ST、FBD、LD、CFC、…...
Java中Stream流
Java中Stream流 Stream 使用flatMap处理嵌套集合: 有一个对象列表,每个对象又包含一个列表,可以使用flatMap来“展平”这个结构。 List<List<String>> listOfLists Arrays.asList(Arrays.asList("a", "b"),Arrays.a…...

纯css实现多行文本右下角最后一行展示全部按钮
未展开全部: 展开全部: 综上演示按钮始终保持在最下方 css代码如下: <div class"info-content"><div class"info-text" :class"!showAll ? mle-hidden : "><span class"show-all"…...

WPF篇(17)-ListBox列表控件+ListView数据列表控件
ListBox列表控件 ListBox是一个列表控件,用于显示条目类的数据,默认每行只能显示一个内容项,当然,我们可以通过修改它的数据模板,来自定义每一行(元素)的数据外观,达到显示更多数据…...

HAProxy 全解析:驾驭网络负载均衡与高可用的强大引擎
一、什么是HAproxy HAProxy是一个免费、开源的高性能TCP/HTTP负载均衡器和代理服务器软件,主要用于实现以下功能 一、负载均衡 多种负载均衡算法支持: 轮询(Round Robin):它依次将请求均匀分配到后端的各个服务器。例…...

陶瓷材质的防静电架空地板越来越受欢迎的原因
目前市面上的陶瓷防静电架空地板主要分为两种:钢基和硫酸钙基。前者是以全钢冲孔裸板作为板基,经粘接、固定整型和灌浆的方式加工而成,后者是以复合硫酸钙板为基材,表面粘接防静电陶瓷砖,四周导电PVC边条封边。近年来陶…...

Mariadb数据库本机无密码登录的问题解决
Mariadb数据库本机无密码登录的问题解决 安装了mariadb后,发现Mariadb本机无密码才能登录 百度了很多文章,发现很多人是因为root的plugin设置的值不正确导致的,unix_socket可以不需要密码,mysql_native_password 是正常的。 解…...

校园外卖平台小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,菜品信息管理,菜品分类管理,购买菜品管理,订单信息管理,系统管理 微信端账号功能包括:系统首页&a…...

Python3 第八十一课 -- urllib
目录 一. 前言 二. urllib.request 三. urllib.error 四. urllib.parse 五. urllib.robotparser 一. 前言 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块: url…...

Vue 3+Vite+Eectron从入门到实战系列之(五)一后台管理登录页
前面已经讲了不少基础知识,这篇开始,我们进行实操,做个后台管理系统,打包成多端的,可安装的桌面app!!其中,登录,退出的提示信息用系统的提示,不使用elemengplus的弹窗提示!ÿ…...

Docker 网络代理配置及防火墙设置指南
Docker 网络代理配置及防火墙设置指南 背景 在某些环境中,服务器无法直接访问外网,需要通过网络代理进行连接。虽然我们通常会在 /etc/environment 或 /etc/profile 等系统配置文件中直接配置代理,但 Docker 命令无法使用这些配置。例如&am…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...