index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <!-- 公共二维码dialog组件
  2. 1.引入方式
  3. <qr-code-dialog ref="qrCodeDialog" :qrCodeDialogData="qrCodeDialogData"></qr-code-dialog>
  4. import qrCodeDialog from "@/components/qrCodeDialog/index.vue"
  5. components: {
  6. qrCodeDialog
  7. },
  8. 2.必要参数
  9. qrCodeDialogData:{},
  10. 3.必要方法
  11. //二维码组件开关
  12. open(type,id,name){
  13. this.$set(this,'qrCodeDialogData',{
  14. title:row.name, //弹窗名称(非必传)
  15. download:true, //二维码下载按钮(非必传)
  16. type:'1', //二维码类型 用于区分二维码功能类型
  17. parameter:row.id, //二维码参数
  18. name:row.name, //二维码名称用于下载时命名(非必传)
  19. codeName:row.name, //二维码图片下名称展示(非必传)
  20. });
  21. this.$refs['qrCodeDialog'].initialize();
  22. },
  23. -->
  24. <template>
  25. <div>
  26. <!--添加/编辑弹窗-->
  27. <el-dialog class="qrCodeDialog" :title="qrCodeDialogData.title?qrCodeDialogData.title:'二维码'"
  28. :modal-append-to-body="false"
  29. :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false"
  30. :visible.sync="dialogType" v-if="dialogType" width="394px">
  31. <vue-qr v-if="dialogType" ref="vueQr" class="qrCodeDialog-vue-qr" :text="vueQrCodeData" :size="200"></vue-qr>
  32. <canvas class="qrCodeDialog-vue-qr-canvas" id="myCanvas" ref="myCanvas" width="300" :height="qrCodeDialogData.codeName?240:200"></canvas>
  33. <div slot="footer" class="dialog-footer dialog-footer-box">
  34. <p class="dialog-footer-button-null"></p>
  35. <p class="dialog-footer-button-info" @click="buttonClick(2)">取消</p>
  36. <p class="dialog-footer-button-primary" @click="buttonClick(1)">下载</p>
  37. <p class="dialog-footer-button-null"></p>
  38. </div>
  39. </el-dialog>
  40. </div>
  41. </template>
  42. <script>
  43. import vueQr from 'vue-qr'
  44. export default {
  45. name: 'qrCodeDialog',
  46. components: {
  47. vueQr
  48. },
  49. props:{
  50. qrCodeDialogData:{},
  51. },
  52. data(){
  53. return{
  54. dialogType:false,
  55. vueQrCodeData:null,
  56. vueQrImgType:false,
  57. identification: localStorage.getItem('codeOnlineAdd'), //二维码规则 服务器域名,需与微信后台开发配置内一致.
  58. }
  59. },
  60. created(){
  61. },
  62. mounted(){
  63. },
  64. methods:{
  65. //初始化
  66. initialize(){
  67. let self = this;
  68. this.$nextTick(()=>{
  69. this.$set(this,'vueQrCodeData', this.identification+'?code='+this.qrCodeDialogData.parameter+'&type='+this.qrCodeDialogData.type);
  70. this.$set(this,'dialogType',true);
  71. this.$nextTick(function () {
  72. // DOM 更新了
  73. setTimeout(function(){
  74. //获取二维码数据
  75. let imgbase64 = self.$refs.vueQr.imgUrl;
  76. let img = new Image();
  77. img.src = imgbase64;
  78. //获取canvas容器
  79. let myCanvas = document.getElementById( "myCanvas" ).getContext( '2d' );
  80. //清空画布-设置背景白色
  81. myCanvas.fillStyle = "#FFFFFF";
  82. myCanvas.clearRect(0, 0, 300, 240);
  83. myCanvas.fillRect(0, 0, 300, 240);
  84. //绘制二维码
  85. myCanvas.drawImage( img, 50, 0 );
  86. if(self.qrCodeDialogData.codeName){
  87. //设置水印
  88. myCanvas.font = "bold 14px 'Fira Sans'";
  89. myCanvas.fillStyle = 'rgba(0,0,0,1)'; //水印颜色
  90. //绘制水印
  91. myCanvas.fillText(self.qrCodeDialogData.codeName, (300-(self.qrCodeDialogData.codeName.length*14))/2, 215); //左下
  92. }
  93. },100);
  94. })
  95. })
  96. },
  97. buttonClick(type){
  98. if(type == 1){
  99. let canvas = this.$refs.myCanvas
  100. const base64Img = canvas.toDataURL('image/png')
  101. var a = document.createElement('a') // 生成一个a元素
  102. var event = new MouseEvent('click') // 创建一个单击事件
  103. a.download = this.qrCodeDialogData.codeName // 设置图片名称
  104. a.href = base64Img // 将生成的URL设置为a.href属性
  105. a.dispatchEvent(event)
  106. }else{
  107. this.$set(this,'dialogType',false);
  108. }
  109. },
  110. },
  111. }
  112. </script>
  113. <style scoped lang="scss">
  114. .qrCodeDialog{
  115. z-index: 10000;
  116. font-weight:500;
  117. .qrCodeDialog-vue-qr{
  118. position: absolute;
  119. z-index:-10;
  120. opacity: 0;
  121. display: block!important;
  122. height:200px;
  123. width:200px;
  124. margin:20px auto 27px;
  125. }
  126. .qrCodeDialog-vue-qr-canvas{
  127. display: block!important;
  128. margin:20px auto 27px;
  129. }
  130. ::v-deep .el-dialog__body{
  131. padding:0;
  132. }
  133. }
  134. </style>