index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <view class="container" @click="handleDownloadQrIMg()">
  3. <img v-if="posterDataUrl" :src="posterDataUrl" class="poster-bg" width="100%" height="auto"/>
  4. <view v-else class="item-box" id="poster" >
  5. <img class="poster-bg" src="../../static/img/img38.jpg"/>
  6. <canvas
  7. :style="{ left: `${(canWeidth - 134) / 2}px`}"
  8. class="qr" canvas-id="qrCode-canvas" id="qrCode-canvas"></canvas>
  9. </view>
  10. </view>
  11. </template>
  12. <script>
  13. import { mapState } from 'vuex';
  14. import html2canvas from 'html2canvas'
  15. import QRCode from 'qrcode'
  16. import { shareLoad } from '@/utils/wxAuthorized';
  17. export default {
  18. data() {
  19. return {
  20. url: '',
  21. src:'',
  22. posterDataUrl:'',
  23. poster: '',// 合成图片
  24. canHeight: 0,
  25. canWeidth: 0,
  26. size: 180,
  27. ratio: 1, //页面比例用于计算
  28. };
  29. },
  30. onLoad() {
  31. this.loadData();
  32. this.shareDate()
  33. this.$nextTick(() => {
  34. const query = uni.createSelectorQuery().in(this);
  35. query.select('.container').boundingClientRect(data => {
  36. this.ratio = data.width / 750;
  37. }).exec();
  38. // 获取画布宽高信息
  39. query.select('#qrCode-canvas').fields(
  40. {size: true},e => {
  41. console.log('获取画布宽高信息',e)
  42. this.canHeight = e.height;
  43. this.canWeidth = e.width;
  44. }).exec();
  45. });
  46. },
  47. computed: {
  48. ...mapState(['userInfo']),
  49. },
  50. methods: {
  51. // 请求载入数据
  52. async loadData() {
  53. let obj = this;
  54. obj.url = 'http://doctortest.igxys.com/index/#/pages/index/home' + '?spread=' + obj.userInfo.uid;
  55. obj.createQRCode();
  56. // obj.shareDate()
  57. },
  58. shareDate() {
  59. let obj = this;
  60. let url = 'http://doctortest.igxys.com/index/#/pages/index/home?spread=' + obj.userInfo.uid;
  61. let bool = uni.getStorageSync('weichatBrowser') || '';
  62. let data = {
  63. link: url, // 分享链接
  64. imgUrl: obj.userInfo.avatar, // 分享图标
  65. desc:obj.userInfo.nickname,
  66. title: obj.userInfo.nickname+'邀请您进入麻醉服务平台',
  67. success: function() {},
  68. };
  69. console.log(data,'datadatadata')
  70. console.log(shareLoad);
  71. shareLoad(data);
  72. },
  73. createQRCode () {
  74. let obj = this;
  75. //先用 QRCode 生成二维码 canvas,然后用 html2canvas 合成整张海报并转成 base64 显示出来
  76. this.$nextTick(() => {
  77.      setTimeout(function(){
  78. let canvas = document.getElementById('qrCode-canvas').children[0];
  79. // console.log(canvas,'canvas')
  80. // console.log(obj.url)
  81. QRCode.toCanvas(canvas,obj.url,(error) => {
  82. if (error) {
  83. console.log(error,'error')
  84. } else {
  85. //qrcode 生成的二维码会带有一些默认样式,需要调整下
  86. canvas.style.width = '140px'
  87. canvas.style.height = '140px'
  88. canvas.style.padding = '0px'
  89. let poster = document.getElementById('poster')
  90. html2canvas(poster).then(canvas => {
  91. // console.log(canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"))
  92. obj.posterDataUrl = canvas.toDataURL();
  93. });
  94. }
  95. })
  96. },500);
  97.      });
  98. },
  99. handleDownloadQrIMg() {
  100. console.log('sssbb')
  101. const imgUrl = this.posterDataUrl
  102. // 如果浏览器支持msSaveOrOpenBlob方法(也就是使用IE浏览器的时候),那么调用该方法去下载图片
  103. if (window.navigator.msSaveOrOpenBlob) {
  104. var bstr = atob(imgUrl.split(',')[1])
  105. var n = bstr.length
  106. var u8arr = new Uint8Array(n)
  107. while (n--) {
  108. u8arr[n] = bstr.charCodeAt(n)
  109. }
  110. var blob = new Blob([u8arr])
  111. window.navigator.msSaveOrOpenBlob(blob, '分享二维码' + '.' + 'png')
  112. } else {
  113. // 这里就按照chrome等新版浏览器来处理
  114. const a = document.createElement('a')
  115. a.href = imgUrl
  116. a.setAttribute('download', '分享二维码')
  117. a.click()
  118. }
  119. },
  120. },
  121. };
  122. </script>
  123. <style lang="scss">
  124. page{
  125. height: 100%;
  126. }
  127. .container{
  128. width: 100%;
  129. height: 1400rpx;
  130. .item-box{
  131. width: 100%;
  132. height: 100%;
  133. margin: 0rpx auto;
  134. background-size: 100% 100%;
  135. .poster-bg{
  136. position: relative;
  137. height: 100%;
  138. width: 100%;
  139. margin: 0rpx auto;
  140. }
  141. .qr{
  142. width: 100%;
  143. height: 100%;
  144. position: absolute;
  145. top:9.6rem;
  146. // left:6.5rem;
  147. }
  148. }
  149. }
  150. </style>