card.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <view id="container">
  3. <img v-if="posterDataUrl" :src="posterDataUrl" class="poster-bg" width="100%" height="auto" />
  4. <view class="item-box" id="poster">
  5. <image @load="make()" class="poster-bg" src="../../static/img/img38.jpg" mode="widthFix"></image>
  6. <canvas class="qr" canvas-id="qrCode-canvas" id="qrCode-canvas"></canvas>
  7. </view>
  8. </view>
  9. </template>
  10. <script>
  11. import {
  12. mapState
  13. } from 'vuex';
  14. import uQRCode from '@/components/Sansnn-uQRCode/uqrcode.js'
  15. import html2canvas from 'html2canvas'
  16. import QRCode from 'qrcode'
  17. import {
  18. weixindata
  19. } from '@/utils/wxAuthorized';
  20. import {
  21. shareLoad
  22. } from '@/utils/wxAuthorized';
  23. export default {
  24. data() {
  25. return {
  26. url: '',
  27. src: '',
  28. posterDataUrl: '',
  29. poster: '', // 合成图片
  30. canHeight: 0,
  31. canWeidth: 0,
  32. size: 180,
  33. ratio: 1, //页面比例用于计算
  34. };
  35. },
  36. computed: {
  37. ...mapState(['userInfo']),
  38. },
  39. onLoad() {
  40. let obj = this;
  41. obj.url = 'http://doctortest.igxys.com/index/#/pages/doctor/expert' + '?id=' + obj.userInfo.uid + '&spread=' +
  42. obj.userInfo.uid + '&isq=1';
  43. this.shareDate();
  44. },
  45. onReady() {
  46. const query = uni.createSelectorQuery().in(this);
  47. query.select('#container').boundingClientRect(data => {
  48. this.ratio = data.width / 750;
  49. }).exec();
  50. // 获取画布宽高信息
  51. query.select('#qrCode-canvas').fields({
  52. size: true
  53. }, e => {
  54. console.log('获取画布宽高信息', e)
  55. this.canHeight = e.height;
  56. this.canWeidth = e.width;
  57. }).exec();
  58. },
  59. methods: {
  60. //生成二维码
  61. make() {
  62. let obj = this;
  63. //先用 QRCode 生成二维码 canvas,然后用 html2canvas 合成整张海报并转成 base64 显示出来
  64. this.$nextTick(() => {
  65. let canvas = document.getElementById('qrCode-canvas').children[0];
  66. // console.log(canvas, 'canvas')
  67. // console.log(obj.url)
  68. QRCode.toCanvas(canvas, obj.url, (error) => {
  69. if (error) {
  70. console.log(error, 'error')
  71. } else {
  72. //qrcode 生成的二维码会带有一些默认样式,需要调整下
  73. canvas.style.width = '140px'
  74. canvas.style.height = '140px'
  75. canvas.style.padding = '0px'
  76. canvas.style.borderRadius = '10px'
  77. let poster = document.getElementById('poster')
  78. html2canvas(poster).then(canvas => {
  79. // console.log(canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"))
  80. obj.posterDataUrl = canvas.toDataURL();
  81. });
  82. }
  83. })
  84. });
  85. },
  86. shareDate() {
  87. let obj = this;
  88. let url = 'http://doctortest.igxys.com/index/#/pages/doctor/expert' + '?id=' + obj.userInfo.uid +
  89. '&spread=' + obj.userInfo.uid;
  90. let bool = uni.getStorageSync('weichatBrowser') || '';
  91. let doctor_name = obj.userInfo.ext_info.doctor_level == 1 ? '初级' : obj.userInfo.ext_info.doctor_level ==
  92. 2 ? '中级' : obj.userInfo.ext_info.doctor_level == 3 ? '副高级' : '正高级'
  93. let data = {
  94. link: url, // 分享链接
  95. imgUrl: obj.userInfo.ext_info.photo, // 分享图标
  96. desc: obj.userInfo.ext_info.hospital_name + doctor_name,
  97. title: obj.userInfo.ext_info.name,
  98. success: function() {}
  99. };
  100. // console.log(data, 'datadatadata')
  101. shareLoad(data);
  102. },
  103. }
  104. }
  105. </script>
  106. <style lang="scss">
  107. page {
  108. height: 100%;
  109. }
  110. #container {
  111. width: 100%;
  112. height: 1400rpx;
  113. .item-box {
  114. position: fixed;
  115. top: -100%;
  116. left: -750rpx;
  117. width: 750rpx;
  118. height: 100%;
  119. margin: 0rpx auto;
  120. background-size: 100% 100%;
  121. .poster-bg {
  122. width: 750rpx;
  123. position: relative;
  124. margin: 0rpx auto;
  125. }
  126. .qr {
  127. width: 280rpx;
  128. height: 280rpx;
  129. position: absolute;
  130. top: 410rpx;
  131. left: 240rpx;
  132. }
  133. }
  134. }
  135. </style>