donaSuccess.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <template>
  2. <view class="content">
  3. <view class="box">
  4. <view class="music">
  5. <view class="player playing" :class="playing?'none':'keepgo'" @click.stop="play">
  6. <image src="../../static/img/music.png" style="width: 68rpx;height: 68rpx;" :animation="animationData"></image>
  7. </view>
  8. </view>
  9. <canvas v-if="showcanvas" id="qrShareBox" canvas-id="qrShareBox" class="tki-qrcode-canvas" />
  10. <image class="imgbox" v-else :src="img"></image>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. // #ifdef H5
  16. // import { weixindata, weixinhideMenu } from '@/utils/wxAuthorized';
  17. import {
  18. weixindata,
  19. weixinlocation
  20. } from '@/utils/wxAuthorized.js';
  21. // #endif
  22. export default {
  23. data() {
  24. return {
  25. url:'',
  26. img:'',
  27. showcanvas:true,
  28. loading: true, //是否载入图片中
  29. size: 180,
  30. ratio: 1, //页面比例用于计算
  31. canHeight: '',
  32. canWeidth: '',
  33. playing: true,
  34. current: {
  35. src: '../../static/audio/xx.mp3',
  36. },
  37. rotateIndex: '',
  38. animation: {},
  39. animationData: {},
  40. audioAction: {
  41. method: 'pause'
  42. },
  43. ran: -1,
  44. isStop: true,
  45. demo: 0
  46. }
  47. },
  48. onReady() {
  49. let query = uni.createSelectorQuery();
  50. let obj = this
  51. // 获取页面比例
  52. query
  53. .select('.box')
  54. .fields({
  55. size: true
  56. },
  57. e => {
  58. console.log('获取页面比例', e)
  59. // 保存比例
  60. this.ratio = e.width / 750;
  61. }
  62. )
  63. .exec();
  64. // 获取画布宽高信息
  65. query
  66. .select('#qrShareBox')
  67. .fields({
  68. size: true
  69. },
  70. e => {
  71. console.log('获取画布宽高信息', e)
  72. obj.canHeight = e.height;
  73. obj.canWeidth = e.width;
  74. }
  75. )
  76. .exec();
  77. let ctxBg = '/index/static/img/thanks.png'; //画布背景
  78. let src = '/index/static/erweima.png' // 二维码
  79. let context = uni.createCanvasContext('qrShareBox');
  80. // 插入背景图片
  81. console.log('插入背景图片', ctxBg, 0, 0, obj.canWeidth, obj.canHeight)
  82. context.drawImage(ctxBg, 0, 0, obj.canWeidth, obj.canHeight);
  83. const codeSize = obj.size * obj.ratio; //计算二维码大小
  84. const codeX = ((750 - obj.size) * obj.ratio) / 2; //二维码所在x轴位置
  85. const codeY = 999 * obj.ratio; //二维码所在y轴位置
  86. const codeBoxColor = '#FFFFFF'; //包裹框颜色
  87. const codeBoxWidht = 0; //包裹边框宽度
  88. const codeBoxSize = (codeBoxWidht / 2) * obj.ratio; //计算二维码白色包裹框大小
  89. const codeBoxX = codeX - codeBoxSize; //包裹框初始X轴
  90. const codeBoxY = codeY - codeBoxSize; //包裹框初始Y轴
  91. const codeBoxEnd = codeSize + codeBoxWidht * obj.ratio; //计算包裹框大小
  92. const fontTop = codeY + codeBoxEnd + (codeBoxWidht + 20) * obj.ratio; //文字距离上边距高度
  93. const fontSize = 24 * obj.ratio; //文字大小
  94. const fontText = ''; //文字内容
  95. const fontLeft = (codeSize - fontSize * fontText.length) / 2 + codeX; //文字左侧距离
  96. // // 插入文字
  97. context.setFontSize(28)
  98. // context.setColor('#FFFFFF')
  99. context.setFillStyle('#FFFFFF')
  100. context.fillText('感谢信', ((750 - obj.size) * obj.ratio) / 2, 260 * obj.ratio)
  101. context.setFontSize(30 * obj.ratio)
  102. context.fillText('感谢您积极参与武汉市江夏区红十字会志愿者', (110 * obj.ratio), 340 * obj.ratio)
  103. // context.fillText('感谢您积极参与武汉市江夏区红十字会志', (115* obj.ratio), 370 * obj.ratio)
  104. context.fillText('的各项活动。关爱他人、无私奉献,为有需要的人', (50 * obj.ratio), 390 * obj.ratio)
  105. context.fillText('送去温暖,用实际行动诠释“人道、博爱、奉献”', (50 * obj.ratio), 440 * obj.ratio)
  106. context.fillText('的红十字精神。', (50 * obj.ratio), 490 * obj.ratio)
  107. context.fillText('祝您及家人身体健康,万事如意!我们一起', (110 * obj.ratio), 540 * obj.ratio)
  108. context.fillText('将大爱传递”。', (50 * obj.ratio), 590 * obj.ratio)
  109. // context.fillText('此致', (640 * obj.ratio), 630 * obj.ratio)
  110. // context.fillText('谨表谢意', (580 * obj.ratio), 680 * obj.ratio)
  111. context.fillText('武汉市江夏区红十字会', (400 * obj.ratio), 730 * obj.ratio)
  112. // 插入二维码
  113. // console.log(codeX, codeY, codeSize, 999)
  114. context.drawImage(src, codeX, codeY, codeSize, codeSize);
  115. // context.draw()
  116. // 生成
  117. context.draw(false, (e) => {
  118. uni.canvasToTempFilePath({
  119. x: 0,
  120. y: 0,
  121. width: obj.canWeidth,
  122. height: obj.canHeight,
  123. destWidth: obj.canWeidth,
  124. destHeight: obj.canHeight,
  125. canvasId: 'qrShareBox',
  126. success: function(res) {
  127. console.log(333, res)
  128. // 在H5平台下,tempFilePath 为 base64
  129. obj.showcanvas = false;
  130. obj.img = res.tempFilePath
  131. // let url = res.tempFilePath
  132. // console.log('res.tempFilePath',res.tempFilePath)
  133. // function dataURLtoFile(dataurl, filename = 'file') {
  134. // let arr = dataurl.split(',')
  135. // let mime = arr[0].match(/:(.*?);/)[1]
  136. // let suffix = mime.split('/')[1]
  137. // let bstr = atob(arr[1])
  138. // let n = bstr.length
  139. // let u8arr = new Uint8Array(n)
  140. // while (n--) {
  141. // u8arr[n] = bstr.charCodeAt(n)
  142. // }
  143. // return new File([u8arr], `${filename}.${suffix}`, {
  144. // type: mime
  145. // })
  146. // }
  147. // var base64Img = res.tempFilePath // base64编码的图片
  148. // var imgFile = dataURLtoFile(base64Img)
  149. // console.log('imgFile====>', imgFile)
  150. // let url = imgFile
  151. // uni.downloadFile({
  152. // url: url,
  153. // // url: 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png',
  154. // success(res) {
  155. // console.log('res.tempFilePath:', res.tempFilePath)
  156. // obj.showcanvas = false;
  157. // obj.img = res.tempFilePath
  158. // }
  159. // })
  160. }
  161. })
  162. })
  163. },
  164. onShow() {
  165. var animation = uni.createAnimation()
  166. this.animation = animation
  167. if (this.isStop) {
  168. // 使用动画
  169. this.scaleAndScale()
  170. this.timer = setInterval(() => { //创建定时器,3秒执行异一次
  171. this.scaleAndScale()
  172. // console.log('每三秒执行一次 , 达到往复运动的效果')
  173. }, 1000)
  174. } else {
  175. this.noscaleAndScale()
  176. }
  177. },
  178. onLoad() {
  179. this.shareIs();
  180. this.ScanAudio(true)
  181. // app.audioMusic.src = '../../static/audio/xx.png';
  182. // const innerAudioContext = uni.createInnerAudioContext();
  183. // innerAudioContext.autoplay = true;
  184. // innerAudioContext.src = '../../static/audio/xx.png';
  185. // console.log(1123);
  186. // innerAudioContext.onPlay(() => {
  187. // console.log('开始播放');
  188. // });
  189. // innerAudioContext.onError((res) => {
  190. // console.log('出错了');
  191. // console.log(res);
  192. // // console.log(res);
  193. // });
  194. },
  195. onHide() { //在页面隐藏时也要清除定时器
  196. if (this.timer) {
  197. // console.log('清除定时器-' + this.timer)
  198. clearInterval(this.timer)
  199. }
  200. },
  201. onUnload() { //在页面卸载时清除定时器 避免出现多个定时器连续创建动画
  202. if (this.timer) {
  203. console.log('清除定时器-' + this.timer)
  204. clearInterval(this.timer)
  205. }
  206. },
  207. methods: {
  208. // 加载分享
  209. shareIs(data) {
  210. let obj = this;
  211. let item = {
  212. link: 'http://jxred.igxys.com/index/#/pages/form/donaSuccess',// 分享链接
  213. imgUrl: '/index/static/img/002.png',
  214. desc: '感谢信',
  215. title: '武汉市江夏区红十字会',
  216. success: console.log('分享加载成功')
  217. };
  218. console.log('分享加',item)
  219. weixindata(item);
  220. },
  221. musicClick() {
  222. // if (this.isRoate) {
  223. // this.isRoate = false
  224. // this.stopScanAudio()
  225. // } else {
  226. // this.isRoate = true
  227. // this.ScanAudio()
  228. // }
  229. },
  230. play() {
  231. this.playing = !this.playing;
  232. this.ScanAudio(this.playing);
  233. if (this.playing == true) {
  234. this.timer = setInterval(() => { //创建定时器,3秒执行异一次
  235. this.scaleAndScale()
  236. console.log('每1秒执行一次')
  237. }, 1000)
  238. } else {
  239. clearInterval(this.timer)
  240. }
  241. // var music = uni.createInnerAudioContext();
  242. // music.src= "../../static/audio/xx.mp3"; //选择播放的音频
  243. // music.onPause(); //暂停播放
  244. // console.log('暂停播放')
  245. // console.log('dianjizanting')
  246. // this.stopAudio()
  247. // this.playing = !this.playing; //背景音乐点击,暂停或继续
  248. },
  249. // 定义动画内容
  250. scaleAndScale() {
  251. // 定义动画内容
  252. // this.animation.scale(1.2, 1.2).step() //先放大1,2倍
  253. // this.animation.scale(1, 1).step() //缩小至原来的大小
  254. // 导出动画数据传递给data层
  255. // this.animationData = this.animation.export(); //每次执行导出动画时 会覆盖之前的动画
  256. this.animation.rotate(this.demo).step({
  257. duration: 1000
  258. })
  259. this.animationData = this.animation.export()
  260. this.demo += 360;
  261. },
  262. noscaleAndScale() {
  263. this.animation.rotate(0).step({
  264. duration: 1000
  265. })
  266. this.animationData = this.animation.export()
  267. },
  268. // ScanAudio(){
  269. // this.$api.music.play(); //执行播放
  270. // console.log('执行播放')
  271. // }
  272. }
  273. }
  274. </script>
  275. <style lang="scss">
  276. page {
  277. width: 100%;
  278. height: 100%;
  279. }
  280. .content {
  281. // background-color: pink;
  282. width: 100%;
  283. height: 100%;
  284. position: relative;
  285. .bgimg {
  286. width: 100%;
  287. height: 100%;
  288. // background-color: pink;
  289. image {
  290. width: 100%;
  291. height: 100%;
  292. }
  293. }
  294. .tki-qrcode-canvas {
  295. width: 750rpx;
  296. height: 1350rpx;
  297. margin: 0 auto;
  298. // background-color: pink;
  299. }
  300. .box {
  301. // position: absolute;
  302. // left: 0;
  303. // top: 0;
  304. // background-color: pink;
  305. // width: 100%;
  306. // height: 100%;
  307. // display: flex;
  308. // flex-direction: column;
  309. // align-items: center;
  310. // color: #FFFFFF;
  311. // padding: 0rpx 32rpx 0 32rpx;
  312. color: #FFFFFF;
  313. width: 100%;
  314. height: 100vh;
  315. // background-color: pink;
  316. .music {
  317. // width: 55rpx;
  318. // height: 55rpx;
  319. border-radius: 28rpx;
  320. // background-color: pink;
  321. position: absolute;
  322. left: 12rpx;
  323. top: 250rpx;
  324. z-index: 999;
  325. }
  326. // .title {
  327. // margin-top: 234rpx;
  328. // font-size: 54rpx;
  329. // }
  330. // .main {
  331. // margin-top: 20rpx;
  332. // font-size: 32rpx;
  333. // .box-2 {
  334. // text-indent: 68rpx;
  335. // margin-top: 12rpx;
  336. // }
  337. // }
  338. // .footer {
  339. // margin-top: 32rpx;
  340. // // background-color: pink;
  341. // width: 100%;
  342. // .box-1 {
  343. // display: flex;
  344. // justify-content: flex-end;
  345. // font-size: 28rpx;
  346. // // padding-right: 14rpx;
  347. // }
  348. // }
  349. }
  350. // .playing {
  351. // animation: run 10s linear 0s infinite;
  352. // }
  353. // .player {
  354. // width: 65rpx;
  355. // height: 65rpx;
  356. // border-radius: 50%;
  357. // background-color: rgba(0, 0, 0, 0.1);
  358. // z-index: 999999;
  359. // }
  360. .keepgo {
  361. animation-play-state: paused;
  362. }
  363. .imgbox{
  364. height: 1350rpx;
  365. width:750rpx;
  366. }
  367. }
  368. </style>