card.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <template>
  2. <view id="container">
  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 class="qr"
  7. canvas-id="qrCode-canvas"
  8. id="qrCode-canvas"
  9. :style="{ left: `${(canWeidth - 134) / 2}px`}"></canvas>
  10. </view>
  11. <!-- <view class="card">
  12. <view class="header flex_item">
  13. <view class="portrait"><image :src="userInfo.ext_info.photo"></image></view>
  14. <view class="info">
  15. <view class="name">{{userInfo.ext_info.name}}<text>{{ userInfo.ext_info.doctor_level == 1 ? '医师' : userInfo.ext_info.doctor_level == 2 ? '主治医师' : userInfo.ext_info.doctor_level == 3 ? '副主任医师' : '主任医师'}}</text></view>
  16. <view class="tip">{{userInfo.ext_info.hospital_name}}</view>
  17. </view>
  18. </view>
  19. <view class="tki-qrcode">
  20. <canvas canvas-id="qrcode" />
  21. </view>
  22. </view> -->
  23. </view>
  24. </template>
  25. <script>
  26. import { mapState } from 'vuex';
  27. import uQRCode from '@/components/Sansnn-uQRCode/uqrcode.js'
  28. import html2canvas from 'html2canvas'
  29. import QRCode from 'qrcode'
  30. import { weixindata } from '@/utils/wxAuthorized';
  31. import { shareLoad } from '@/utils/wxAuthorized';
  32. export default {
  33. data() {
  34. return {
  35. url: '',
  36. src:'',
  37. posterDataUrl:'',
  38. poster: '',// 合成图片
  39. canHeight: 0,
  40. canWeidth: 0,
  41. size: 180,
  42. ratio: 1, //页面比例用于计算
  43. };
  44. },
  45. computed: {
  46. ...mapState(['userInfo']),
  47. },
  48. onLoad() {
  49. this.loadData();
  50. this.shareDate()
  51. this.$nextTick(() => {
  52. const query = uni.createSelectorQuery().in(this);
  53. query.select('#container').boundingClientRect(data => {
  54. this.ratio = data.width / 750;
  55. }).exec();
  56. // 获取画布宽高信息
  57. query.select('#qrCode-canvas').fields(
  58. {size: true},e => {
  59. console.log('获取画布宽高信息',e)
  60. this.canHeight = e.height;
  61. this.canWeidth = e.width;
  62. }).exec();
  63. });
  64. },
  65. // onLoad() {
  66. // console.log(this.userInfo)
  67. // this.loadData();
  68. // },
  69. methods: {
  70. // 请求载入数据
  71. async loadData() {
  72. let obj = this;
  73. obj.url = 'http://doctortest.igxys.com/index/#/pages/doctor/expert' + '?id=' + obj.userInfo.uid+'&spread='+obj.userInfo.uid;
  74. obj.make();
  75. obj.shareDate()
  76. },
  77. //生成二维码
  78. make() {
  79. let obj = this;
  80. //先用 QRCode 生成二维码 canvas,然后用 html2canvas 合成整张海报并转成 base64 显示出来
  81. this.$nextTick(() => {
  82.      setTimeout(function(){
  83. let canvas = document.getElementById('qrCode-canvas').children[0];
  84. console.log(canvas,'canvas')
  85. console.log(obj.url)
  86. QRCode.toCanvas(canvas,obj.url,(error) => {
  87. if (error) {
  88. console.log(error,'error')
  89. } else {
  90. //qrcode 生成的二维码会带有一些默认样式,需要调整下
  91. canvas.style.width = '140px'
  92. canvas.style.height = '140px'
  93. canvas.style.padding = '0px'
  94. canvas.style.borderRadius = '10px'
  95. let poster = document.getElementById('poster')
  96. html2canvas(poster).then(canvas => {
  97. // console.log(canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"))
  98. obj.posterDataUrl = canvas.toDataURL();
  99. });
  100. }
  101. })
  102. },500);
  103.      });
  104. // uQRCode.make({
  105. // canvasId: 'qrcode',
  106. // componentInstance: this,
  107. // text: obj.url,
  108. // size: 280,
  109. // margin: 3,
  110. // backgroundColor: '#ffffff',
  111. // foregroundColor: '#000000',
  112. // fileType: 'png',
  113. // correctLevel: uQRCode.defaults.correctLevel,
  114. // success: res => {
  115. // console.log(res)
  116. // }
  117. // })
  118. },
  119. shareDate() {
  120. let obj = this;
  121. let url = 'http://doctortest.igxys.com/index/#/pages/doctor/expert' + '?id=' + obj.userInfo.uid+'&spread='+obj.userInfo.uid;
  122. let bool = uni.getStorageSync('weichatBrowser') || '';
  123. let doctor_name = obj.userInfo.ext_info.doctor_level == 1 ? '医师' : obj.userInfo.ext_info.doctor_level == 2 ? '主治医师' : obj.userInfo.ext_info.doctor_level == 3 ? '副主任医师' : '主任医师'
  124. let data = {
  125. link: url, // 分享链接
  126. imgUrl: obj.userInfo.ext_info.photo, // 分享图标
  127. desc:obj.userInfo.ext_info.hospital_name + doctor_name,
  128. title: obj.userInfo.ext_info.name ,
  129. success: function() {}
  130. };
  131. console.log(data,'datadatadata')
  132. // console.log(shareLoad);
  133. shareLoad(data);
  134. },
  135. }
  136. }
  137. </script>
  138. <style lang="scss">
  139. page{
  140. height: 100%;
  141. }
  142. #container{
  143. width: 100%;
  144. height: 1400rpx;
  145. .item-box{
  146. width: 100%;
  147. height: 100%;
  148. margin: 0rpx auto;
  149. background-size: 100% 100%;
  150. .poster-bg{
  151. position: relative;
  152. height: 100%;
  153. width: 100%;
  154. margin: 0rpx auto;
  155. }
  156. .qr{
  157. width: 100%;
  158. height: 100%;
  159. position: absolute;
  160. top:9.6rem;
  161. // left:6.5rem;
  162. }
  163. }
  164. }
  165. // page{
  166. // background-color: #F5F5F5;
  167. // height: 100%;
  168. // .container{
  169. // height: 100%;
  170. // padding: 45rpx 0rpx;
  171. // }
  172. // }
  173. // .tki-qrcode{
  174. // width: 100%;
  175. // }
  176. // canvas{
  177. // width: 600rpx;
  178. // height: 600rpx;
  179. // }
  180. // .card{
  181. // padding: 50rpx 50rpx;
  182. // width: 90%;
  183. // margin: 0rpx auto;
  184. // background-color: #FFFFFF;
  185. // border-radius: 25rpx;
  186. // font-size: 30rpx;
  187. // text-align: center;
  188. // .header{
  189. // padding-bottom: 30rpx;
  190. // .portrait{
  191. // width: 150rpx;
  192. // height: 150rpx;
  193. // image{
  194. // border-radius: 100rpx;
  195. // width: 100%;
  196. // height: 100%;
  197. // }
  198. // }
  199. // .info{
  200. // margin-left: 25rpx;
  201. // text-align: left;
  202. // .name{
  203. // font-size: 36rpx;
  204. // font-weight: bold;
  205. // text{
  206. // font-weight:normal !important;
  207. // padding-left: 25rpx;
  208. // font-size: 30rpx;
  209. // }
  210. // }
  211. // .tip{
  212. // text-align: left;
  213. // padding-top: 15rpx;
  214. // }
  215. // }
  216. // }
  217. // .shareText{
  218. // margin-bottom: 50rpx;
  219. // }
  220. // .shareDate{
  221. // width: 100%;
  222. // padding: 25rpx 0rpx;
  223. // margin: 0rpx auto;
  224. // background-color: #5E96F5;
  225. // color: #FFFFFF;
  226. // border-radius: 25rpx;
  227. // }
  228. // }
  229. </style>