vue管理网站实训源码分享,vue管理平台

大家好,今天小编来为大家解答以下的问题,关于vue管理网站实训源码分享,vue管理平台这个很多人还不知道,现在让我们一起来看看吧!

作者:jerryWu

转发连接:https://juejin.im/post/5ec48f84e51d45788266753a

pdf.js实战,含水印、电子签章解决方案

项目涉及到移动端查看电子合同的问题,前前后后试了三种方案,真是一步一个坑,三种方案各有各的优点,不水,直接上代码,按照自己的需求选择。

一、vue-pdf

直接使用vue-pdf插件,核心的代码是pdf.js,只不过就是自己封装了一下,优点是方便快捷,缺点是无法加载电子签章。

github地址:https://github.com/FranckFreiburger/vue-pdf

1、npminstallpdf-vue–save

2、template代码

<template>\n<divclass=&34;v-show=&39;pdf&34;>\n<pclass=&34;>\n//上一页\n<span@click=&34;class=&34;:class=&34;>Preview</span>\n{{currentPage}}/{{pageCount}}\n//下一页\n<span@click=&34;class=&34;:class=&34;>Next</span>\n</p>\n//自己引入就可以使用,这里我的需求是做了分页功能,如果不需要分页功能,只要src就可以了\n<pdf\n:src=&34;//src需要展示的PDF地址\n:page=&34;//当前展示的PDF页码\n@num-pages=&34;//PDF文件总页码\n@page-loaded=&34;//一开始加载的页面\n@loaded=&34;>//加载事件\n</pdf>\n</div>\n</template>\n复制代码

3、js代码

importpdffrom&39;\nexportdefault{\ncomponents:{pdf},\ndata(){\nreturn{\ncurrentPage:0,//pdf文件页码\npageCount:0,//pdf文件总页数\nfileType:&39;,//文件类型\n????src:&39;,//pdf文件地址\n}\n},\n??created:{\n????//有时PDF文件地址会出现跨域的情况,这里最好处理一下\n????this.src=pdf.createLoadingTask(this.src)\n??}\nmethod:{\n//改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页\nchangePdfPage(val){\n//console.log(val)\nif(val===0&&this.currentPage>1){\nthis.currentPage–\n//console.log(this.currentPage)\n}\nif(val===1&&this.currentPage<this.pageCount){\nthis.currentPage++\n//console.log(this.currentPage)\n}\n},\n\n//pdf加载时\nloadPdfHandler(e){\nthis.currentPage=1//加载的时候先加载第一页\n}\n\n}\n}\n复制代码

使用非常方便,尤其是只需要翻页,或者不需要翻页的,强烈推荐。

二、pdf-dist

pdf-dist也是基于pdf.js的一个组件,只不过没有封装,需要自己配置,优点是可配置,可实现特殊的需求,缺点是需要自己封装,水印可加载,网上说可以加载电子签章,我的加载不出来,所以还是没采用。

1、npminstallpdf-dist–save

2、封装一个pdf.vue

<template>\n<divclass=&34;id=&34;>\n<divclass=&34;>\n<canvasclass=&34;id=&34;></canvas>\n<divclass=&34;>\n<button@click=&34;style=&34;>上一页</button>\n<span>Page:<spanv-text=&34;></span>/<spanv-text=&34;></span></span>\n<button@click=&34;style=&34;>下一页</button>\n</div>\n</div>\n</div>\n</template>\n<script>\nimportPDFJSfrom&39;\n\nexportdefault{\nname:&39;,\n//接收父组件传来的参数\nprops:[&39;],\ncomponents:{},\ndata(){\nreturn{\npdfDoc:null,//pdfjs生成的对象\npageNum:1,//\npageRendering:false,\npageNumPending:null,\nscale:1,//放大倍数\npage_num:0,//当前页数\npage_count:0,//总页数\nmaxscale:2,//最大放大倍数\nminscale:0.8//最小放大倍数\n}\n},\nmethods:{\nrenderPage(num){//渲染pdf\nletvm=this\nthis.pageRendering=true\nletcanvas=document.getElementById(&39;)\nletctx=canvas.getContext(&39;)\nletbsr=\nctx.webkitBackingStorePixelRatio||\nctx.mozBackingStorePixelRatio||\nctx.msBackingStorePixelRatio||\nctx.oBackingStorePixelRatio||\nctx.backingStorePixelRatio||\n1\nletdpr=window.devicePixelRatio||1\nletratio=dpr/bsr\n//Usingpromisetofetchthepage\nthis.pdfDoc.getPage(num).then(function(page){\nvarviewport=page.getViewport(screen.availWidth/page.getViewport(1).width)\n//alert(vm.canvas.height)\ncanvas.height=ratio*viewport.width\ncanvas.width=ratio*viewport.height\ncanvas.style.width=1.5*viewport.width+&39;\ncanvas.style.height=1*viewport.height+&39;\nctx.setTransform(ratio,0,0,ratio,0,0)\n//RenderPDFpageintocanvascontext\nvarrenderContext={\ncanvasContext:ctx,\nviewport:viewport\n}\nvarrenderTask=page.render(renderContext)\n\n//Waitforrenderingtofinish\nrenderTask.promise.then(function(){\nvm.pageRendering=false\nif(vm.pageNumPending!==null){\n//Newpagerenderingispending\nvm.renderPage(vm.pageNumPending)\nvm.pageNumPending=null\n}\n})\n})\nvm.page_num=vm.pageNum\n},\naddscale(){//放大\nif(this.scale>=this.maxscale){\nreturn\n}\nthis.scale+=0.1\nthis.queueRenderPage(this.pageNum)\n},\nminus(){//缩小\nif(this.scale<=this.minscale){\nreturn\n}\nthis.scale-=0.1\nthis.queueRenderPage(this.pageNum)\n},\nprev(){//上一页\nletvm=this\nif(vm.pageNum<=1){\nreturn\n}\nvm.pageNum–\nvm.queueRenderPage(vm.pageNum)\n},\nnext(){//下一页\nletvm=this\nif(vm.pageNum>=vm.page_count){\nreturn\n}\nvm.pageNum++\nvm.queueRenderPage(vm.pageNum)\n},\nclosepdf(){//关闭PDF\nthis.$emit(&39;)\n},\nqueueRenderPage(num){\nif(this.pageRendering){\nthis.pageNumPending=num\n}else{\nthis.renderPage(num)\n}\n}\n},\ncomputed:{\nctx(){\nletid=document.getElementById(&39;)\nreturnid.getContext(&39;)\n}\n},\nmounted(){\nletvm=this\nPDFJS.getDocument(vm.pdfurl).then(function(pdfDoc_){//初始化pdf\nvm.pdfDoc=pdfDoc_\nvm.page_count=vm.pdfDoc.numPages\nvm.renderPage(vm.pageNum)\n})\n}\n}\n\n</script>\n<stylelang=&34;scoped>\n.cpdf{\ndisplay:flex;\njustify-content:center;\nalign-items:center;\n.center{\ntext-align:center;\nheight:100%;\noverflow:hidden;\npadding-top:20px;\n.contor{\nposition:fixed;\nbottom:30px;\nleft:0;\nwidth:100%;\nz-index:99999;\nfont-size30px\nmargin-top20px\nmargin-bottom:10px;\n}\n}\n}\n</style>\n复制代码

3、直接当成组件,引用就可以了

importcdpdffrom&39;\n\n<cdpdf:pdfurl=&34;></cdpdf>\n复制代码

一开始项目使用的是pdf-dist,因为后来电子签章显示不出来:

Warning:Unimplementedwidgetfieldtype&34;,fallingbacktobasefieldtype.\n复制代码

从网上搜了很多方法,说是需要修改pdf.work.js的源码,全局搜索AnnotationFlag.HIDDEN:

if(data.fieldType===&39;){\nwarn(&39;);\n//注释下面这行代码\nthis.setFlags(AnnotationFlag.HIDDEN);\n}\n复制代码

可能是移动端使用微信浏览器的原因,注释掉代码还是不好使,只能再想其他办法了

三、pdf.js

最后用了最笨的办法,直接从GitHub拉下来pdf.js的demo,用iframe标签包住demo里的HTML文件,直接套着用,完美解决电子签章的问题:

1、从GitHub拉一下源码,或者从这个地址直接下载

https://github.com/mozilla/pdf.js

下载下来以后放在public文件下(3.x脚手架)

2、iframe标签直接粗暴的设置src

<iframe:src=&34;:style=&34;style=&34;></iframe>\n\nthis.pdfUrl=&39;+this.pdfurl,+&39;\n\npdfUrl是iframe标签的URL,pdfurl是需要查看的PDF文件的url\n复制代码

总结

只要能实现需求的代码就是好代码,我的项目是移动端查看PDF文件,因为文件上有电子签章,所以尝试了好几种方案,个人还是推荐第二种方案,如果没有电子签章的情况下。

推荐Vue学习资料文章:

《基于vue+element的后台管理系统解决方案》

《Vue仿蘑菇街商城项目(vue+koa+mongodb)》

《基于electron-vue开发的音乐播放器「实践」》

《「实践」Vue项目中标配编辑器插件Vue-Quill-Editor》

《消息队列助你成为高薪Node.js工程师》

《Node.js中的stream模块详解》

《「干货」DenoTCPEchoServer是怎么运行的?》

《「干货」了不起的Deno实战教程》

《「干货」通俗易懂的Deno入门教程》

《Deno正式发布,彻底弄明白和node的区别》

《「实践」基于Apify+node+react/vue搭建一个有点意思的爬虫平台》

《「实践」深入对比Vue3.0CompositionAPI和ReactHooks》

《前端网红框架的插件机制全梳理(axios、koa、redux、vuex)》

《深入Vue必学高阶组件HOC「进阶篇」》

《深入学习Vue的data、computed、watch来实现最精简响应式系统》

《10个实例小练习,快速入门熟练Vue3核心新特性(一)》

《10个实例小练习,快速入门熟练Vue3核心新特性(二)》

《教你部署搭建一个Vue-cli4+Webpack移动端框架「实践」》

《2020前端就业Vue框架篇「实践」》

《详解Vue3中router带来了哪些变化?》

《Vue项目部署及性能优化指导篇「实践」》

《Vue高性能渲染大数据Tree组件「实践」》

《尤大大细品VuePress搭建技术网站与个人博客「实践」》

《10个Vue开发技巧「实践」》

《是什么导致尤大大选择放弃Webpack?【vite原理解析】》

《带你了解vue-next(Vue3.0)之小试牛刀【实践】》

《带你了解vue-next(Vue3.0)之初入茅庐【实践】》

《实践Vue3.0做JSX(TSX)风格的组件开发》

《一篇文章教你并列比较React.js和Vue.js的语法【实践】》

《手拉手带你开启Vue3世界的鬼斧神工【实践】》

《深入浅出通过vue-cli3构建一个SSR应用程序【实践】》

《怎样为你的Vue.js单页应用提速》

《聊聊昨晚尤雨溪现场针对Vue3.0Beta版本新特性知识点汇总》

《【新消息】Vue3.0Beta版本发布,你还学的动么?》

《Vue真是太好了壹万多字的Vue知识点超详细!》

《Vue+Koa从零打造一个H5页面可视化编辑器——Quark-h5》

《深入浅出Vue3跟着尤雨溪学TypeScript之Ref【实践】》

《手把手教你深入浅出vue-cli3升级vue-cli4的方法》

《Vue3.0Beta和React开发者分别杠上了》

《手把手教你用vuedragchart实现一个可以拖动/缩放的图表组件》

《Vue3尝鲜》

《总结Vue组件的通信》

《手把手让你成为更好的Vue.js开发人员的12个技巧和窍门【实践】》

《Vue开源项目TOP45》

《2020年,Vue受欢迎程度是否会超过React?》

《尤雨溪:Vue3.0的设计原则》

《使用vue实现HTML页面生成图片》

《实现全栈收银系统(Node+Vue)(上)》

《实现全栈收银系统(Node+Vue)(下)》

《vue引入原生高德地图》

《Vue合理配置WebSocket并实现群聊》

《多年vue项目实战经验汇总》

《vue之将echart封装为组件》

《基于Vue的两层吸顶踩坑总结》

《Vue插件总结【前端开发必备】》

《Vue开发必须知道的36个技巧【近1W字】》

《构建大型Vue.js项目的10条建议》

《深入理解vue中的slot与slot-scope》

《手把手教你Vue解析pdf(base64)转图片【实践】》

《使用vue+node搭建前端异常监控系统》

《推荐8个漂亮的vue.js进度条组件》

《基于Vue实现拖拽升级(九宫格拖拽)》

《手摸手,带你用vue撸后台系列二(登录权限篇)》

《手摸手,带你用vue撸后台系列三(实战篇)》

《前端框架用vue还是react?清晰对比两者差异》

《Vue组件间通信几种方式,你用哪种?【实践】》

《浅析React/Vue跨端渲染原理与实现》

《10个Vue开发技巧助力成为更好的工程师》

《手把手教你Vue之父子组件间通信实践讲解【props、$ref、$emit】》

《1W字长文+多图,带你了解vue的双向数据绑定源码实现》

《深入浅出Vue3的响应式和以前的区别到底在哪里?【实践】》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《基于Vue/VueRouter/Vuex/Axios登录路由和接口级拦截原理与实现》

《手把手教你D3.js实现数据可视化极速上手到Vue应用》

《吃透Vue项目开发实践|16个方面深入前端工程化开发技巧【上】》

《吃透Vue项目开发实践|16个方面深入前端工程化开发技巧【中】》

《吃透Vue项目开发实践|16个方面深入前端工程化开发技巧【下】》

《Vue3.0权限管理实现流程【实践】》

《后台管理系统,前端Vue根据角色动态设置菜单栏和路由》

作者:jerryWu

转发连接:https://juejin.im/post/5ec48f84e51d45788266753a

vue管理网站实训源码分享和vue管理平台的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平