index.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import {
  2. getPkResult
  3. } from '~/api/works'
  4. import {
  5. setDuration
  6. } from '~/utils/util'
  7. import {
  8. userEvent
  9. } from '~/api/global'
  10. let innerAudioContext
  11. Page({
  12. /**
  13. * 页面的初始数据
  14. */
  15. data: {
  16. pkId: '',
  17. pkRecord: {},
  18. vState: false,
  19. vStart: '00:00',
  20. vEnd: '00:00',
  21. vProgress: 0,
  22. dState: false,
  23. dStart: '00:00',
  24. dEnd: '00:00',
  25. dProgress: 0,
  26. currentType: '',
  27. victory: {},
  28. defeated: {},
  29. equal: false,
  30. // 是否是分享进来的
  31. isPlayback: false
  32. },
  33. /**
  34. * 生命周期函数--监听页面加载
  35. */
  36. async onLoad(options) {
  37. let {
  38. pkRecord,
  39. pkRecordVOS
  40. } = await getPkResult(options.id)
  41. this.setData({
  42. pkId: options.id,
  43. pkRecord,
  44. isplayback: options.playback || false
  45. })
  46. this.compareScore(pkRecordVOS)
  47. this.innerAudioContext = wx.createInnerAudioContext()
  48. await userEvent({
  49. action: 'WXPKSCORE',
  50. })
  51. },
  52. compareScore(resultData) {
  53. let first = resultData[0]
  54. let second = resultData[1]
  55. let victory = first.userRead.score > second.userRead.score ? first : second
  56. let defeated = second.userRead.score < first.userRead.score ? second : first
  57. this.setData({
  58. equal: first.userRead.score == second.userRead.score,
  59. victory: first.userRead.score > second.userRead.score ? first : second,
  60. defeated,
  61. vEnd: setDuration(victory.userRead.duration),
  62. dEnd: setDuration(defeated.userRead.duration),
  63. })
  64. },
  65. playAudio({
  66. currentTarget
  67. }) {
  68. let type = currentTarget.dataset.type
  69. // 重置音频对象
  70. if (type != this.data.currentType) {
  71. this.innerAudioContext.stop();
  72. }
  73. // 处理音频播放
  74. if (type == 'victory' && !this.data.vState) {
  75. if (this.data.currentType != 'victory') {
  76. this.innerAudioContext.src = this.data.victory.userRead.audioPath
  77. }
  78. this.setData({
  79. vState: true,
  80. dState: false
  81. })
  82. } else if (type == 'victory' && this.data.vState) {
  83. this.innerAudioContext.pause();
  84. return this.setData({
  85. vState: false
  86. })
  87. } else if (type == 'defeated' && !this.data.dState) {
  88. if (this.data.currentType != 'defeated') {
  89. this.innerAudioContext.src = this.data.defeated.userRead.audioPath;
  90. }
  91. this.setData({
  92. dState: true,
  93. vState: false
  94. })
  95. } else if (type == 'defeated' && this.data.dState) {
  96. this.innerAudioContext.pause();
  97. return this.setData({
  98. dState: false
  99. })
  100. }
  101. this.setData({
  102. currentType: type
  103. })
  104. // this.innerAudioContext.onCanplay(() => {
  105. this.innerAudioContext.play();
  106. // })
  107. this.innerAudioContext.onTimeUpdate(() => {
  108. let label = this.data.currentType == 'victory' ? 'vStart' : 'dStart'
  109. let progressV = this.data.currentType == 'victory' ? 'vProgress' : 'dProgress'
  110. this.setData({
  111. [label]: setDuration(this.innerAudioContext.currentTime),
  112. [progressV]: Math.round((this.innerAudioContext.currentTime / this.innerAudioContext.duration) * 100)
  113. })
  114. })
  115. },
  116. result({
  117. currentTarget
  118. }) {
  119. if (currentTarget.dataset.type == 'reading') {
  120. wx.redirectTo({
  121. url: `/pages/reading/index?videoId=${this.data.victory.userRead.exampleId}&readingType=pk`,
  122. })
  123. } else if (currentTarget.dataset.type == 'index') {
  124. wx.switchTab({
  125. url: '/pages/index/index',
  126. })
  127. } else {
  128. wx.redirectTo({
  129. url: `/pages/pkPage/index?videoId=${this.data.pkRecord.challengerUserReadId}&isShare=true`,
  130. })
  131. }
  132. },
  133. /**
  134. * 生命周期函数--监听页面卸载
  135. */
  136. onUnload() {
  137. this.innerAudioContext.destroy()
  138. },
  139. creatShare() {
  140. return new Promise((resolve, reject) => {
  141. let context = wx.createSelectorQuery();
  142. context
  143. .select('#share')
  144. .fields({
  145. node: true,
  146. size: true
  147. }).exec((res) => {
  148. const canvas = res[0].node;
  149. const ctx = canvas.getContext('2d');
  150. const dpr = wx.getSystemInfoSync().pixelRatio;
  151. canvas.width = res[0].width * dpr;
  152. canvas.height = res[0].height * dpr;
  153. ctx.scale(dpr, dpr);
  154. ctx.font = '16px PingFang';
  155. let bgImg = canvas.createImage();
  156. bgImg.src = this.data.equal ? 'https://reader-wx.ai160.com/images/reader/v3/equal.png' : 'https://reader-wx.ai160.com/images/reader/v3/victory.png'
  157. bgImg.onload = () => {
  158. ctx.drawImage(bgImg, 0, 0, 375, 300);
  159. ctx.textAlign = "center";
  160. var lnamex = this.data.equal ? 100 : 100,
  161. lnamey = this.data.equal ? 125 : 115;
  162. var vName = this.data.victory.user.nickName || this.data.victory.user.eid
  163. if (vName.length > 4) {
  164. vName = vName.slice(0, 4) + '...'
  165. }
  166. ctx.fillText(vName, lnamex, lnamey)
  167. var rnamex = this.data.equal ? 280 : 280,
  168. rnamey = this.data.equal ? 125 : 140;
  169. var dName = this.data.defeated.user.nickName || this.data.defeated.user.eid
  170. if (dName.length > 4) {
  171. dName = dName.slice(0, 4) + '...'
  172. }
  173. ctx.fillText(dName, rnamex, rnamey)
  174. ctx.font = '19px PingFang';
  175. var lnumx = this.data.equal ? 100 : 100,
  176. lnumy = this.data.equal ? 150 : 140;
  177. ctx.fillText(this.data.victory.userRead.score + '分', lnumx, lnumy)
  178. var rnumx = this.data.equal ? 280 : 280,
  179. rnumy = this.data.equal ? 150 : 165;
  180. ctx.fillText(this.data.defeated.userRead.score + '分', rnumx, rnumy)
  181. ctx.font = '13px PingFang';
  182. var ltimex = this.data.equal ? 136 : 136,
  183. ltimey = this.data.equal ? 252.5 : 239.5;
  184. ctx.fillText(this.data.vEnd, ltimex, ltimey)
  185. var rtimex = this.data.equal ? 320 : 320,
  186. rtimey = this.data.equal ? 253 : 267;
  187. ctx.fillText(this.data.dEnd, rtimex, rtimey)
  188. // 圆形位置 大小
  189. var size = 55;
  190. var lx = this.data.equal ? 71 : 72,
  191. ly = this.data.equal ? 45 : 38;
  192. var rx = this.data.equal ? 252 : 247,
  193. ry = this.data.equal ? 45 : 60;
  194. ctx.save(); // 保存
  195. ctx.arc(size / 2 + lx, size / 2 + ly, size / 2, 0, Math.PI * 2, false);
  196. ctx.arc(size / 2 + rx, size / 2 + ry, size / 2, 0, Math.PI * 2, false);
  197. ctx.clip();
  198. let leftImg = canvas.createImage();
  199. leftImg.src = this.data.victory.user.avatar
  200. leftImg.onerror = () => {
  201. loadRightImg()
  202. }
  203. leftImg.onload = () => {
  204. ctx.drawImage(leftImg, lx, ly, size, size)
  205. loadRightImg()
  206. }
  207. let loadRightImg = () => {
  208. let rightImg = canvas.createImage();
  209. rightImg.src = this.data.defeated.user.avatar
  210. rightImg.onload = () => {
  211. ctx.drawImage(rightImg, rx, ry, size, size)
  212. setTimeout(() => {
  213. wx.canvasToTempFilePath({
  214. canvas: canvas,
  215. success: (res) => {
  216. let userName = this.data.pkRecord.userReadId == this.data.victory.userRead.id ? this.data.victory.user.nickName || this.data.victory.user.eid : this.data.defeated.user.nickName || this.data.defeated.user.eid
  217. if (userName.length > 4) {
  218. userName = userName.slice(0, 4) + '...'
  219. }
  220. resolve({
  221. title: `我挑战了${userName}的作品,这场比拼真精彩!点击加入战局!`,
  222. path: `/pages/pkResult/index?id=${this.data.pkId}&uid=${wx.getStorageSync('uid')}&playback=true`,
  223. imageUrl: res.tempFilePath
  224. })
  225. },
  226. fail(res) {
  227. reject()
  228. }
  229. }, this)
  230. }, 500)
  231. }
  232. rightImg.onerror = () => {
  233. setTimeout(() => {
  234. wx.canvasToTempFilePath({
  235. canvas: canvas,
  236. success(res) {
  237. resolve({
  238. title: '我的新作品发布啦,快来捧场点赞!',
  239. path: `/pages/pkResult/index?uid=${wx.getStorageSync('uid')}`,
  240. imageUrl: res.tempFilePath
  241. })
  242. },
  243. fail(res) {
  244. reject()
  245. }
  246. }, this)
  247. }, 500)
  248. }
  249. }
  250. }
  251. })
  252. })
  253. },
  254. onShareAppMessage({
  255. from,
  256. target
  257. }) {
  258. if (from == 'button') {
  259. const promise = new Promise(resolve => {
  260. this.creatShare().then(res => {
  261. resolve(res)
  262. })
  263. })
  264. return {
  265. title: '自从用了它,家里朗朗书声,美妙极了!你家孩子也快来试试!',
  266. path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`,
  267. imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg',
  268. promise
  269. }
  270. } else {
  271. return {
  272. title: '自从用了它,家里朗朗书声,美妙极了!你家孩子也快来试试!',
  273. path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`,
  274. imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg'
  275. }
  276. }
  277. },
  278. })