项目-02-数学学院后台项目开发过程中的问题总结

目录

  • 一、后台(pc端,vue2)
      • 1. dialog对话框被黑色蒙层盖住
      • 2. 将前端表格导出为word文档
      • 3. 在线查看、下载 .docx、.doc、.pdf文档

一、后台(pc端,vue2)

1. dialog对话框被黑色蒙层盖住

问题: dialog被黑色蒙层盖住(如下图),我希望dialog背景是黑色蒙层,但是dialog对话框不被盖住
在这里插入图片描述
解决办法: 给el-dialog添加如下两个属性

    <el-dialog :modal-append-to-body="false" :append-to-body="true">

添加后效果如下:
在这里插入图片描述

2. 将前端表格导出为word文档

需求:

  1. 前端独立完成
  2. 将审批通过的数据,按照班级分类打印出通过人员名单
  3. word文档的名字可以指定(前端人员传参决定),例如传参为“入团积极分子审查表”
  4. word文档的内容标题为动态的,是各期活动名字,例如“入团申请第十一期”
  5. word文档的后缀为.docx

效果图如下:

在这里插入图片描述

解决方法:
一. 参考文档

  • vue3实现包含表格的Word文件导出
  • Vue中前端导出word文件

二. 具体方法

  1. 安装第三方包:
  • vue3下载包参考版本
"dependencies": {"angular-expressions": "^1.2.1","docx-preview": "^0.3.2","docxtemplater": "^3.49.1","docxtemplater-image-module-free": "^1.1.1","file-saver": "^2.0.5","lodash": "^4.17.21","pizzip": "^3.1.7",},
  • vue2下载包参考版本(docx-preview版本过高可能会报错)
"dependencies": {"angular-expressions": "^1.2.1","docx-preview": "^0.1.20","docxtemplater": "^3.49.1","docxtemplater-image-module-free": "^1.1.1","file-saver": "^2.0.5","lodash": "^4.17.21","pizzip": "^3.1.7",},
  1. 根据自己的需求,创建word文档,我创建的word文档如下:(具体书写规则参考vue3实现包含表格的Word文件导出里的解释)

在这里插入图片描述

  1. 编写导出Word的工具函数(我在utils文件夹下创建了exportFile.js文件)

注意:

  • 下面代码是完整版代码(包括word的 导出预览,导出功能包括支持图片导出和不支持图片导出)
  • 由于我只需要 “导出word,不支持图片” 的功能,所以最后只使用了下列代码中的exportWord函数,大家用的时候可以根据需要填写
// 编写导出word的工具函数// 引入基本模块
import Docxtemplater from "docxtemplater";
import PizZip from "pizzip";
import PizZipUtils from "pizzip/utils/index.js";
import { saveAs } from "file-saver";
// 图片模块
import ImageModule from "docxtemplater-image-module-free";
// 解析语法模块
import expressions from "angular-expressions";
import assign from "lodash/assign";
// 文档预览模块
import { renderAsync } from "docx-preview";expressions.filters.lower = function (input) {if (!input) return input;return input.toLowerCase();
};function angularParser(tag) {tag = tag.replace(/^\.$/, "this").replace(/('|')/g, "'").replace(/("|")/g, '"');const expr = expressions.compile(tag);return {get: function (scope, context) {let obj = {};const scopeList = context.scopeList;const num = context.num;for (let i = 0, len = num + 1; i < len; i++) {obj = assign(obj, scopeList[i]);}return expr(scope, obj);},};
}// 加载文件
function loadFile(url, callback) {PizZipUtils.getBinaryContent(url, callback);
}// 配置空值替换函数 作为配置参数可配置在setOptions中
function nullGetter(part, scopeManager) {if (!part.module) {return "-null-";}if (part.module === "rawxml") {return "";}return "--";
}/*** 预览word,支持图片* @param {Object} tempDocxPath 模板文件路径* @param {Object} wordData 导出数据* @param {Object} fileName 导出文件名* @param {Arrsy} imgSize 自定义图片尺寸*/
export const getWordImage = (tempDocxPath, wordData, imgSize, file) => {loadFile(tempDocxPath, (error, content) => {if (error) {throw error;}// 图片配置const imageOpts = {getImage: function (tagValue, tagName) {return new Promise(function (resolve, reject) {PizZipUtils.getBinaryContent(tagValue, function (error, content) {if (error) {return reject(error);}return resolve(content);});});},getSize: function (img, tagValue, tagName) {const size = imgSize[tagName] ? imgSize[tagName] : [150, 150];return size;},};let imageModule = new ImageModule(imageOpts);const zip = new PizZip(content);// 实例化有两种方式 这里是链式const doc = new Docxtemplater().loadZip(zip).setOptions({// delimiters: { start: "[[", end: "]]" },paragraphLoop: true,linebreaks: true,nullGetter: nullGetter,parser: angularParser,}).attachModule(imageModule).compile();doc.renderAsync(wordData).then(() => {const out = doc.getZip().generate({type: "blob",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",});renderAsync(out, file);});});
};/*** 导出word,不支持图片* @param {Object} tempDocxPath 模板文件路径* @param {Object} wordData 导出数据* @param {Object} fileName 导出文件名*/
export const exportWord = (tempDocxPath, wordData, fileName) => {loadFile(tempDocxPath, (error, content) => {if (error) {throw error;}const zip = new PizZip(content);const doc = new Docxtemplater().loadZip(zip)doc.setData({...wordData.form,user_list: wordData.user_list,outsideList: wordData.outsideList})try {doc.render()} catch (error) {const e = {message: error.message,name: error.name,stack: error.stack,properties: error.properties}throw error}const out = doc.getZip().generate({type: "blob",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",});// Output the document using Data-URIsaveAs(out, `${fileName}.docx`);});
}/*** 导出word,支持图片* @param {Object} tempDocxPath 模板文件路径* @param {Object} wordData 导出数据* @param {Object} fileName 导出文件名* @param {Arrsy} imgSize 自定义图片尺寸*/
export const exportWordImage = (tempDocxPath, wordData, fileName, imgSize) => {loadFile(tempDocxPath, (error, content) => {if (error) {throw error;}// 图片配置const imageOpts = {getImage: function (tagValue, tagName) {return new Promise(function (resolve, reject) {PizZipUtils.getBinaryContent(tagValue, function (error, content) {if (error) {return reject(error);}return resolve(content);});});},getSize: function (img, tagValue, tagName) {const size = imgSize[tagName] ? imgSize[tagName] : [150, 150]return size;},};let imageModule = new ImageModule(imageOpts);const zip = new PizZip(content);// 实例化有两种方式 这里是链式const doc = new Docxtemplater().loadZip(zip).setOptions({// delimiters: { start: "[[", end: "]]" },paragraphLoop: true,linebreaks: true,nullGetter: nullGetter,parser: angularParser,}).attachModule(imageModule).compile();doc.renderAsync(wordData).then(function () {const out = doc.getZip().generate({type: "blob",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",});saveAs(out, `${fileName}.docx`);});});
}
  1. vue页面使用
import { exportWord } from '../../utils/exportFile';export default {data() {return {activity_name: '入团积极分子第十一期',filename: '入团积极分子审查表'}},methods: {exportTable() {// 需要导出的所有数据都需要写在wordData里面// 因为我们写的exportWord工具函数只接受三个参数,第一个是模版文件路径,第二个是导出数据,第三个是表的名称// 当然,大家也可以根据需要修改../../utils/exportFile里面的函数let wordData = { form: {activity_name: this.activity_name // 活动名称},outsideList: [ // 要导出的班级人员名单数据{user_class: '计科211',user_list: [{ name: '袁云熙'},{ name: '莫睿'}]},{user_class: '数本221',user_list: [{ name: '向致远'}]}]}exportWord("../../../static/template.docx", wordData, this.filename)}}
}

3. 在线查看、下载 .docx、.doc、.pdf文档

需求:

  1. 前端独立完成
  2. 后端返回的是文件地址,例如:
  3. 点击“查看”按钮,在新窗口打开查看文档内容
  4. 点击“下载”按钮,可以下载对应的文档
  5. 点击“一键导出”,可以下载全部的文档

参考文档:

  • 纯前端vue在线预览编辑Office,支持doc/docx、xls/xlsx、ptt/pttx、pdf等格式

解决方案:

<div class="top"><el-button @click="downAllfile" style="padding: 3px 0" type="text">一键导出</el-button>
</div><el-table :data="wordPdfData" border><el-table-column label="操作" align="center" width="250"><template #default="{ row }"><span class="check"><a :href="getFileExtension(row.file_name) === 'pdf' ? `${row.file_path}` : `https://view.officeapps.live.com/op/view.aspx?src=${row.file_path}`" target="_blank">查看</a></span><span class="download"><a @click="downFile(row.file_path, row.file_name)">下载</a></span></template></el-table-column>
</el-table>
export default {data() {return {wordPdfData: []}},methods: {// 获取文件后缀名getFileExtension(filename) {return filename.split('.').pop().toLowerCase()},// 下载文件downFile(url, filename) { // url:文件地址,filename:文件名称return new Promise((resolve, reject) => {// 创建一个隐藏的<a>元素用于触发下载const a = document.createElement("a");// 使用fetch API下载文件fetch(url).then(res => {// 检查网络响应是否成功if (!res.ok) {// 如果响应不成功,则抛出一个错误throw new Error(`网络响应失败,状态码:${res.status}`);}// 如果响应成功,则返回Blob对象return res.blob();}).then(blob => {// 创建一个对象URL用于下载const objectURL = URL.createObjectURL(blob);a.href = objectURL;a.download = filename; // 设置下载的文件名a.style.display = 'none'; // 隐藏<a>元素document.body.appendChild(a); // 将<a>元素添加到文档中a.click(); // 触发下载// 使用setTimeout在下一轮事件循环中释放对象URL并移除<a>元素// 同时解析Promise表示下载成功setTimeout(() => {URL.revokeObjectURL(objectURL);document.body.removeChild(a);resolve(); // 下载成功,解析Promise}, 0);}).catch(error => {// 如果在下载过程中发生错误,则拒绝Promisereject(error); // 下载失败,拒绝Promise});});},// 批量下载文件downAllfile() {let downList = this.wordPdfDataconst downloadPromises = downList.map(item => {const downloadUrl = item.file_path; // 构造下载URLreturn new Promise((resolve, reject) => {// 调用downImage方法下载图片,并在下载完成后解析或拒绝Promisethis.downFile(downloadUrl, item.file_name).then(() => resolve()) .catch(error => reject(error)); });})// 使用Promise.all等待所有下载任务完成Promise.all(downloadPromises).then(() => {// 所有文件都已成功下载this.$message({type: 'success',message: '所有导出成功!',showClose: true,duration: 3000});}).catch(error => {// 至少有一个文件下载失败console.error('至少有一个文件下载失败:', error);this.$message({type: 'error',message: '导出失败,请重试。',showClose: true,duration: 3000});});}	    }
}

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

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

相关文章

大语言模型技术相关知识-笔记整理

系列文章目录 这个系列攒了很久。主要是前段之间面试大语言模型方面的实习&#xff08;被拷打太多次了&#xff09;&#xff0c;然后每天根据面试官的问题进行扩展和补充的这个笔记。内容来源主要来自视频、个人理解以及官方文档中的记录。方便后面的回顾。 文章目录 系列文章…

【计算机网络】实验11:边界网关协议BGP

实验11 边界网关协议BGP 一、实验目的 本次实验旨在验证边界网关协议&#xff08;BGP&#xff09;的实际作用&#xff0c;并深入学习在路由器上配置和使用BGP协议的方法。通过实验&#xff0c;我将探索BGP在不同自治系统之间的路由选择和信息交换的功能&#xff0c;理解其在互…

HTTP协议图--HTTP 报文实体

1. HTTP 报文实体概述 HTTP 报文结构 大家请仔细看看上面示例中&#xff0c;各个组成部分对应的内容。 接着&#xff0c;我们来看看报文和实体的概念。如果把 HTTP 报文想象成因特网货运系统中的箱子&#xff0c;那么 HTTP 实体就是报文中实际的货物。 报文&#xff1a;是网络…

PCL DipG-Seg 地面分割实现

DipG-Seg采用基于像素的图像方法,将点云投影到两个图像面,经过投影图像生成,图像预分割、图像精细分割、标签投票等步骤,完成对于地面的分割。验证后其分割效果优于patchwork++等传统算法,16线激光雷达可以达到200hz的速度。代码可以由单模态激光雷达数据扩展到多模态点云…

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…

4.5 TCP 报文段的首部格式

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 TCP 报文段的基本结构2 固定部分2.1 源端口与目的端口2.2 序号2.3 确认号2.4 数据偏移2.5 保留字段2.6 控制位2.7 窗口2.8 检验和2.9 紧急指针 3 可变部分3.1 选项3.2 填…

堆叠的简析

堆叠 堆叠的概念 堆叠是指将一台以上的交换机组合起来共同工作&#xff0c;以便在有限的空间内提供尽可能多的端口。‌ 堆叠技术可以通过专用连接电缆将多台交换机连接成一个堆叠单元&#xff0c;从而增加端口密度和管理效率。‌12 堆叠与级联有所不同。级联的交换机之间可以…

Qt复习学习

https://www.bilibili.com/video/BV1Jp4y167R9/?spm_id_from333.999.0.0&vd_sourceb3723521e243814388688d813c9d475f https://subingwen.cn/qt/qt-primer/#1-4-Qt%E6%A1%88%E4%BE%8B https://subingwen.cn/qt/ https://download.qt.io/archive/qt/1.1Qt的特点 1.2QT中的…

MySQL:函数

在MySQL中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;MySQL提供了很多函数。 在MySQL中&#xff0c;函数非常多&#xff0c;主要可以分为以下几类: 聚合函数数学函数字符串函数日期函数控制流函数窗口函数 聚合函数 在MySQL中&#xff0c;聚合函数主要由&…

同为科技(TOWE)柔性定制化PDU插座

随着科技的进步&#xff0c;越来越多的精密电子设备&#xff0c;成为工作生活密不可分的工具。 电子电气设备的用电环境也变得更为复杂&#xff0c;所以安全稳定的供电是电子电气设备的生命线。 插座插排作为电子电气设备最后十米范围内供配电最终核心部分&#xff0c;便捷、安…

javaweb-Day06~08

1.mysql数据库 单行注释的–注释后面要加空格才能真正实现注释&#xff0c;即“-- ” &#xff08;1&#xff09;所有的关系型数据库都是基于SQL语句的 2.DDL 3.数据库设计 4. DML 5.DQL &#xff08;1&#xff09;总 6.多表设计 &#xff08;1&#xff09;一对多 &#x…

基于遗传优化SVM的电机参数预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 数据收集与预处理 4.2模型构建与训练 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 输入&#xff1a;电机结构参数x1 x2 x3 x4 x5(分别是铁心高度 铁心厚度 绕组…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

PythonQt练习

下面是一个简单登录界面的搭建 import sys# 从PySide6中导入必要的模块&#xff0c;用于创建GUI界面 from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit from QtCore import Qt# 导入Qt Designer生成的UI文件 from TAJ import Ui_Form from secon…

【Windows系统下打造高效智能聊天平台LobeChat解锁远程协作新体验】

文章目录 前言1. LobeChat功能介绍2. 本地安装LobeChat3. 如何使用LobeChat工具4. 安装Cpolar内网穿透5. 实现公网访问LobeChat6. 固定LobeChat公网地址 前言 在这个数字化飞速发展的时代&#xff0c;人工智能已经深深地融入了我们的生活。从智能家居到自动驾驶&#xff0c;再…

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)

基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器&#xff08;模块化编写&#xff09; 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…

Linux 文本处理三剑客基本用法

Linux文本处理三剑客 - grep sed awk 1. 基本用法 grep 是一种强大的文本搜索工具&#xff0c;用于在文件中搜索指定的模式&#xff08;通常是字符串或正则表达式&#xff09;&#xff0c;并输出匹配的行。以下是 grep 的一些基本用法&#xff1a; 基本语法 grep [选项] 模式…

美畅物联丨智能监控,高效运维:视频汇聚平台在储能领域的实践探索

在当今全球能源格局不断变化的大背景下&#xff0c;对清洁能源的需求正以惊人的速度增长。储能项目作为平衡能源供需、提升能源利用效率的关键环节&#xff0c;其规模和复杂度也在不断攀升。在储能项目的运营管理过程中&#xff0c;安全监控、设备运维以及数据管理等方面面临着…

记一次跑前端老项目的问题

记一次跑前端老项目的问题 一、前言二、过程1、下载依赖2、启动项目3、打包 一、前言 在一次跑前端老项目的时候&#xff0c;遇到了一些坑&#xff0c;这里记录一下。 二、过程 1、下载依赖 使用 npm install下载很久&#xff0c;然后给我报了个错 core-js2.6.12: core-js…

【AI系统】推理引擎架构

推理引擎架构 在深入探讨推理引擎的架构之前&#xff0c;让我们先来概述一下推理引擎的基本概念。推理引擎作为 AI 系统中的关键组件&#xff0c;负责将训练好的模型部署到实际应用中&#xff0c;执行推理任务&#xff0c;从而实现智能决策和自动化处理。随着 AI 技术的快速发…