项目-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.rhkb.cn/news/484051.html

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

相关文章

分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测

分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测 目录 分类预测 | Matlab实现SO-LSSVM蛇群算法优化最小二乘支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现Matlab实现SO-LSSVM蛇群算法优化最小二乘支…

两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)

角度一&#xff1b;恢复畸变的时候也把法拉第旋转恢复了 角度二&#xff1a;求解法拉第旋转角的时候 前面乘的复系数的不同也会带来法拉第旋转角和畸变的不同解 注意&#xff1a;无论多少个畸变矩阵相乘&#xff0c;结果都是2*2的矩阵&#xff0c;也就是畸变参数可以减少…

C# WinForm —— 39 40 41 42 DataGridView 介绍与使用

1. 简介 以网格的形式来显示表格数据&#xff0c;一般与数据库交互&#xff0c;将数据库中某一个表格的数据绑定到 UI控件上 并显示出来 网格中的行和列由用户自定义 三个重要对象&#xff1a;行、列、单元格 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候…

前端常用缓存技术深度剖析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格&#xff0c;部分表格采用虚拟滚动条 数据量有点大 接近快60s了&#xff0c;看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …

在服务器上实现本地python文件的依赖

1、在python中&#xff0c;一个python文件就可以视为一个模块进行导入 2、使用import 导入时&#xff0c;若使用pip 下载过可以直接导入 3、假如是自己写的同项目中的文件会去sys.path 中查找 比如说 我现在 test 下有一个 python文件 运行 下面的代码 打印的数据如上图所示p…

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

大数据新视界 -- Hive 元数据管理:核心元数据的深度解析(上)(27 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义

文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代&#xff0c;安全问题已成为技术领域不可忽视的…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…

猎板 PCB特殊工艺:铸就电子行业核心竞争力新高度

在当今竞争激烈且技术驱动的电子制造领域&#xff0c;印制电路板&#xff08;PCB&#xff09;作为电子产品的关键基石&#xff0c;其特殊工艺的发展水平直接影响着整个行业的创新步伐与产品品质。猎板 PCB 凭借在厚铜板、孔口铺铜、HDI 板、大尺寸板以及高频高速板等特殊工艺方…

STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期

需求分析 上一个案例我们输出了PWM波&#xff0c;这个案例我们使用输入捕获功能&#xff0c;来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑&#xff0c;检查测试的结果。 如何测量 1、输入捕获功能主要是&#xff1a;测量输入通道的上升沿和下降沿 2、让第一个…

Android平台GB28181设备接入模块如何支持GB28181云端录像补录

技术背景 GB28181 的补录功能是一种用于弥补视频数据缺失的重要机制。在实际的视频监控场景中&#xff0c;由于网络不稳定、设备故障等多种因素&#xff0c;可能会导致视频数据在上云或存储过程中出现缺失&#xff0c;无法保证数据的完整性。GB28181 的补录功能就是为了解决这…

如何将python项目导出为docker镜像

如何将python项目导出为docker镜像 前提条件步骤 1: 创建并准备 Python 项目步骤 2: 创建 `setup.py`步骤 3: 打包项目步骤 4: 创建 Dockerfile步骤 5: 构建 Docker 镜像步骤 6: 运行 Docker 容器步骤 7: 保存修改并继续开发总结要将修改后的Python代码导出为 .tar.gz 格式,并…

Lua使用点号和冒号的区别

首先建立一个table&#xff0c;再分别定义两个方法&#xff0c;如下&#xff1a; local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…

OpenGL ES详解——文字渲染

目录 一、文字渲染 二、经典文字渲染&#xff1a;位图字体 1.概念 2.优缺点 三、现代文字渲染&#xff1a;FreeType 1.着色器 2.渲染一行文字 四、关于未来 一、文字渲染 当你在图形计算领域冒险到了一定阶段以后你可能会想使用OpenGL来绘制文字。然而&#xff0c;可能…

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…

菲涅尔透镜加工:倚光科技的光学创新之路

在光学元件的广袤星空中&#xff0c;菲涅尔透镜以其独特的设计和卓越的性能闪耀着独特光芒。菲涅尔透镜通过将透镜表面由一系列同心棱纹组成&#xff0c;大幅减少了材料的使用量&#xff0c;却依然能够有效地汇聚或发散光线&#xff0c;在众多领域展现出无可比拟的优势&#xf…

OSCP:我理解的Web环境知识

你需要特别关注以下模块所涵盖的知识点&#xff0c;因为它们在考试中出现的概率很高。 1、SQL 注入&#xff08;SQL Injection&#xff09; ●允许攻击者注入自定义的、潜在恶意的 SQL 代码&#xff0c;由底层数据库执行。 ●可能导致数据泄露或目标服务器上的远程代码执行&…