123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972 |
- import {
- getreadInfo,
- likeVideo,
- collectVideo,
- submitPlayLog
- } from '~/api/video'
- import {
- publishWorks,
- uploadPk,
- postWorksScore
- } from '~/api/works'
- import {
- buyVip,
- getVipInfo
- } from '~/api/user'
- import {
- userEvent
- } from '~/api/global'
- import {
- createStoreBindings
- } from 'mobx-miniprogram-bindings'
- import {
- store
- } from '~/store/index'
- import {
- setDuration
- } from '~/utils/util'
- import event from '~/mixins/event'
- let aiengine = require('~/utils/ChivoxAiEngine')
- let sha1 = require('~/utils/sha1');
- // 文章行高
- let rowH = 0
- let videoContext = null
- // 滚动变色定时器
- let stl = null
- // 倒计时
- let setTimeoutObj = null
- // 录音
- let innerAudioContext = null
- // 试听
- let resultAudioContext = null
- /*创建基础引擎*/
- let wsEngine = aiengine.createWsEngine({});
- /*微信录音*/
- let recorderManager = wx.getRecorderManager();
- Page({
- behaviors: [event],
- data: {
- videoInfo: {},
- videoPath: '',
- currentRow: null,
- state: false,
- // 示例播放状态
- exampleState: false,
- // 是否静音播放视频
- muted: false,
- countDown: {
- state: false,
- num: 3,
- },
- contentH: 0,
- percent: 0,
- scrollTop: 0,
- //如果readingReset为true就是重读
- readingReset: false,
- //readingType为public是普通阅读,为pk是pk逻辑,readMatch为朗读赛
- readingType: 'public',
- uploadState: false,
- article: [],
- silderData: {
- currentTime: '00:00',
- endTime: '00:00',
- silderValue: 0
- },
- // 朗读赛的id
- activityId: '',
- // 0免费1收费
- free: 1,
- isVip: false,
- tempFilePath: ""
- },
- onLoad(options) {
- let videoId = null
- let params = decodeURIComponent(options.scene).split('&')
- videoId = !options.scene ? options.videoId : params[0]
- wx.setNavigationBarTitle({
- title: options.navBarTitle
- })
- this.setData({
- readingReset: options.reset || false,
- readingType: options.readingType || 'public',
- uploadHide: options.uploadHide,
- activityId: options.activityId || '',
- free: options.free ? Number(options.free) : 1
- })
- this.getreadInfo(videoId, options.reset).then(res => {
- wx.nextTick(() => {
- if (options.voluntarily && this.data.isVip) {
- this.setCountDown()
- }
- if (options.autoPlay) {
- this.videoPlay()
- }
- })
- })
- // 手工绑定
- this.storeBindings = createStoreBindings(this, {
- store,
- fields: {
- userInfo: 'userInfo',
- readDetail: 'readDetail',
- pkData: 'pkData'
- },
- actions: {
- setUser: 'setUser',
- setReadDetail: 'setReadDetail'
- }
- })
- // 录音授权
- wx.getSetting({
- success(res) {
- if (!res.authSetting['scope.record']) {
- wx.authorize({
- scope: 'scope.record',
- success() {
- // 用户已经同意小程序使用录音功能,后续调用接口不会弹窗询问
- },
- fail() {
- wx.showModal({
- title: '授权提示',
- content: '请先开启录音功能',
- success(res) {
- wx.openSetting({
- success(res) {}
- })
- }
- })
- }
- })
- }
- }
- })
- /*监听评测结果:必须在基础引擎创建后,调用任何评测接口前设置监听,否则有可能收不到相关事件。*/
- wsEngine.onResult((res) => {
- console.log('触发评分结束了');
- this.getRecordScore(res)
- });
- wsEngine.onErrorResult((res) => {
- console.log("===收到错误结果=============", res)
- userEvent({
- action: 'WXSCORE',
- targetContent: res
- })
- });
- this.innerAudioContext = wx.createInnerAudioContext();
- this.innerAudioContext.onTimeUpdate(res => {
- this.setData({
- ["silderData.sliderValue"]: Math.round(this.innerAudioContext.currentTime / this.innerAudioContext.duration * 100),
- ["silderData.currentTime"]: setDuration(this.innerAudioContext.currentTime)
- })
- })
- this.resultAudioContext = wx.createInnerAudioContext();
- this.resultAudioContext.onTimeUpdate(res => {
- this.setData({
- ["silderData.sliderValue"]: Math.round(this.resultAudioContext.currentTime / this.resultAudioContext.duration * 100),
- ["silderData.currentTime"]: setDuration(this.resultAudioContext.currentTime)
- })
- })
- this.resultAudioContext.onError(res => {
- console.log(res, 'resultAudioContext');
- })
- this.innerAudioContext.onError(res => {
- console.log(res, 'bbbb');
- })
- this.resultAudioContext.onEnded(res => {
- console.log('102-resultAudioContext.ended');
- this.setData({
- exampleState: false
- })
- if (this.data.videoInfo.userReadExtend.resourcesType == 0) {
- this.videoContext.stop()
- this.videoContext.seek(0)
- }
- })
- this.resultAudioContext.onStop((res) => {
- console.log('109-resultAudioContext.onStop');
- this.setData({
- exampleState: false
- })
- if (this.data.videoInfo.userReadExtend.resourcesType == 0) {
- this.videoContext.stop()
- this.videoContext.seek(0)
- }
- });
- this.resultAudioContext.onEnded(res => {
- this.setData({
- ["silderData.sliderValue"]: 100
- })
- })
- },
- onShow() {
- this.getVipInfo()
- },
- // 获取是否vip
- async getVipInfo() {
- let vipTime = await getVipInfo()
- this.setData({
- isVip: vipTime != ''
- })
- },
- // 获取阅读内容
- getreadInfo(videoId, reset = false) {
- return new Promise(async (resolve, reject) => {
- let videoInfo = await getreadInfo(videoId)
- let data = JSON.parse(videoInfo.userReadExtend.lessonText)
- data = data.map((item, index) => {
- item.time = Number(item.time)
- item.readTime = data[index + 1] ? data[index + 1].time - item.time : ''
- return item
- })
- this.setData({
- videoPath: videoInfo.userRead.originVideo,
- article: data,
- videoInfo,
- ["silderData.endTime"]: setDuration(videoInfo.userRead.duration)
- })
- if (!reset) {
- this.getHeight()
- }
- if (this.data.videoInfo.userReadExtend.resourcesType == 0) {
- this.videoContext = wx.createVideoContext('myVideo')
- } else {
- this.innerAudioContext.src = videoInfo.userRead.originVideo
- this.innerAudioContext.onEnded(res => {
- console.log("138innerAudioContext触发的");
- this.resetReading()
- })
- this.innerAudioContext.onStop((res) => {
- console.log("143innerAudioContext触发的");
- });
- }
- resolve()
- })
- },
- // 开始录制
- setCountDown() {
- if (!this.data.isVip && !!this.data.free) {
- this.resetReading()
- return this.selectComponent('#buyVip').open({
- isVip: this.data.isVip
- })
- }
- if (this.data.state) {
- this.resetReading()
- return
- }
- if (!this.data.readingReset) {
- this.getHeight()
- }
- this.resetReading()
- this.setData({
- readingReset: false,
- 'countDown.state': true
- })
- this.stl = setInterval(async () => {
- if (this.data.countDown.num == 0) {
- clearInterval(this.stl)
- this.setData({
- state: true,
- countDown: {
- state: false,
- num: 3
- }
- })
- await this.playMediaState()
- if (this.data.videoInfo.userReadExtend.businessType != 2) {
- await this.soundRecording()
- } else {
- await this.songRecording()
- }
- this.startRecording()
- } else {
- this.setData({
- 'countDown.num': --this.data.countDown.num
- })
- }
- }, 1000)
- },
- // 录音
- soundRecording() {
- /*调用微信开始录音接口,并启动语音评测*/
- let timeStamp = new Date().getTime()
- let sig = sha1(`16075689600000da${timeStamp}caa8e60da6042731c230fe431ac9c7fd`)
- let app = {
- applicationId: '16075689600000da',
- sig, //签名字符串
- alg: 'sha1',
- timestamp: timeStamp + '',
- userId: wx.getStorageSync('uid')
- }
- let lessonText = JSON.parse(this.data.videoInfo.userReadExtend.lessonText).map((item) => {
- return item.text
- }).join('\n')
- // userReadExtend 中 businessType 0:中文/ 1: 英文 / 2: 歌曲
- let businessType = this.data.videoInfo.userReadExtend.businessType
- // https://www.chivox.com/opendoc/#/ChineseDoc/coreCn/Chinese/cn.sent.raw?id=%e5%8f%82%e6%95%b0%e8%af%b4%e6%98%8e <----参数说明
- console.log('启动了', businessType == 0 ? "cn.pred.raw" : "en.pred.score");
- wsEngine.start({
- request: {
- coreType: businessType == 0 ? "cn.pred.raw" : "en.pred.score",
- refText: lessonText,
- rank: 100,
- result: {
- details: {
- gop_adjust: 0.5 //评测系数
- }
- }
- },
- app,
- audio: {
- audioType: "mp3",
- channel: 1,
- sampleBytes: 2,
- sampleRate: 16000
- },
- success: (res) => {
- /*引擎启动成功,可以启动录音机开始录音,并将音频片传给引擎*/
- let recorderOptions = {
- duration: 600000,
- sampleRate: 44100, //采样率
- numberOfChannels: 1, //录音通道数
- encodeBitRate: 192000, //编码码率
- format: 'mp3', //音频格式,有效值aac/mp3
- frameSize: 50 //指定帧大小,单位 KB
- };
- recorderManager.start(recorderOptions);
- },
- fail: (res) => {
- console.log("fail============= ", res);
- },
- });
- recorderManager.onError(res => {
- console.log(res, 'recorderManagerError');
- })
- //监听录音开始事件
- recorderManager.onStart(() => {});
- //监听录音结束事件
- recorderManager.onStop((res) => {
- console.log('录音结束', res);
- this.setData({
- tempFilePath: res.tempFilePath,
- });
- //录音机结束后,驰声引擎执行结束操作,等待评测返回结果
- wsEngine.stop({
- success: () => {
- console.log('====== wsEngine stop success ======');
- },
- fail: (res) => {
- console.log('录音结束报错', res);
- },
- });
- });
- //监听已录制完指定帧大小的文件事件。如果设置了 frameSize,则会回调此事件。
- recorderManager.onFrameRecorded((res) => {
- let {
- frameBuffer
- } = res
- //TODO 调用feed接口传递音频片给驰声评测引擎
- wsEngine.feed({
- data: frameBuffer, // frameBuffer为微信录音机回调的音频数据
- success: () => {},
- fail: (res) => {
- console.log('监听已录制完指定帧大小报错', res)
- },
- });
- });
- },
- songRecording() {
- //开始录音,在开始录音回调中feed音频片
- let recorderOptions = {
- duration: 600000,
- sampleRate: 44100, //采样率
- numberOfChannels: 1, //录音通道数
- encodeBitRate: 192000, //编码码率
- format: 'mp3', //音频格式,有效值aac/mp3
- frameSize: 50 //指定帧大小,单位 KB
- };
- recorderManager.start(recorderOptions);
- recorderManager.onError(res => {
- console.log(res, 'songError');
- })
- //监听录音开始事件
- recorderManager.onStart(() => {});
- //监听录音结束事件
- recorderManager.onStop(async (res) => {
- this.setData({
- tempFilePath: res.tempFilePath,
- });
- let detail = {
- integrity: 80,
- tone: 80,
- accuracy: 80,
- fluency: 80,
- myOverall: 80,
- businessType: this.data.videoInfo.userReadExtend.businessType,
- tempFilePath: this.data.tempFilePath,
- title: this.data.videoInfo.userRead.title,
- id: this.data.videoInfo.userRead.exampleId,
- coverImg: this.data.videoInfo.userRead.coverImg,
- resourcesType: this.data.videoInfo.userReadExtend.resourcesType,
- aBg: this.data.videoInfo.userReadExtend.resourcesType == 1 ? this.data.videoInfo.userReadExtend.backgroundVirtualImg : '',
- originVideo: this.data.videoInfo.userRead.originVideo
- }
- this.setReadDetail(detail)
- await userEvent({
- action: 'WXSCORE',
- })
- if (this.data.readingType == 'public' || this.data.readingType == 'readMatch') {
- wx.navigateTo({
- url: `/pages/score/index?readingType=${this.data.readingType}&activityId=${this.data.activityId}&free=${this.data.free}`,
- events: {
- // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
- goback: (data) => {
- this.setData({
- readingReset: data.reset || false,
- readingType: data.readingType || 'public',
- uploadHide: data.uploadHide
- })
- }
- },
- })
- } else {
- this.uploadAudio()
- }
- });
- },
- // 直接跳转的时候用的,勿动
- // util() {
- // wx.navigateTo({
- // url: `/pages/score/index?readingType=${this.data.readingType}`,
- // events: {
- // // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
- // someEvent: (data) => {
- // console.log(data)
- // this.setData({
- // readingReset: data.reset || false,
- // readingType: data.readingType || 'public',
- // uploadHide: data.uploadHide
- // })
- // console.log(this.data, 'ggggggggg');
- // }
- // },
- // })
- // },
- // 获取测评结果
- async getRecordScore(res) {
- let result = res.result;
- //0是中文,1是英文
- let businessType = this.data.videoInfo.userReadExtend.businessType
- let integrity = Math.floor(result.integrity); //完成度
- let accuracy = Math.floor(result.accuracy); // 准确度 发音分
- let fluency = Math.floor(result.fluency.overall); //流利度
- let tone = 0 // 语调声调
- let myOverall = 0;
- if (businessType == 0) {
- tone = Math.floor(result.tone);
- myOverall = Math.floor(integrity * 0.5 + accuracy * 0.3 + fluency * 0.1 + tone * 0.1);
- } else if (businessType == 1) {
- myOverall = Math.floor(integrity * 0.5 + accuracy * 0.3 + fluency * 0.2);
- }
- let detail = {
- integrity,
- tone,
- accuracy,
- fluency,
- myOverall,
- businessType: this.data.videoInfo.userReadExtend.businessType,
- tempFilePath: this.data.tempFilePath,
- title: this.data.videoInfo.userRead.title,
- id: this.data.videoInfo.userRead.exampleId,
- coverImg: this.data.videoInfo.userRead.coverImg,
- resourcesType: this.data.videoInfo.userReadExtend.resourcesType,
- aBg: this.data.videoInfo.userReadExtend.resourcesType == 1 ? this.data.videoInfo.userReadExtend.backgroundVirtualImg : '',
- originVideo: this.data.videoInfo.userRead.originVideo
- }
- console.log('评测结果2', detail);
- this.setReadDetail(detail)
- await userEvent({
- action: 'WXSCORE',
- })
- if (this.data.readingType == 'public' || this.data.readingType == 'readMatch') {
- wx.navigateTo({
- url: `/pages/score/index?readingType=${this.data.readingType}&activityId=${this.data.activityId}&free=${this.data.free}`,
- events: {
- // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
- goback: (data) => {
- this.setData({
- readingReset: data.reset || false,
- readingType: data.readingType || 'public',
- uploadHide: data.uploadHide
- })
- }
- },
- })
- } else {
- this.uploadAudio()
- }
- },
- // 挑战录音上传
- uploadAudio() {
- this.setData({
- uploadState: true
- })
- let uploadTask = wx.uploadFile({
- url: 'https://reader-api.ai160.com//file/upload',
- filePath: this.data.tempFilePath,
- name: '朗读录音',
- header: {
- uid: wx.getStorageSync('uid')
- },
- success: async (res) => {
- let formateRes = JSON.parse(res.data);
- let audioPath = formateRes.data;
- let uploadRes = await publishWorks({
- exampleId: this.data.pkData.exampleId,
- audioPath,
- })
- let _data = this.data.readDetail
- let scoreRes = await postWorksScore({
- "userReadId": uploadRes.id,
- "complete": _data.integrity,
- "accuracy": _data.accuracy,
- "speed": _data.fluency,
- "intonation": _data.tone,
- "score": _data.myOverall
- }).finally(() => {
- this.setData({
- uploadState: false
- })
- })
- console.log({
- "userReadId": uploadRes.id,
- "complete": _data.integrity,
- "accuracy": _data.accuracy,
- "speed": _data.fluency,
- "intonation": _data.tone,
- "score": _data.myOverall
- }, 'score', scoreRes, 'scoreRes');
- let data = {}
- if (_data.businessType != 2) {
- data = {
- challengerUserReadId: uploadRes.id,
- userReadId: this.data.pkData.id,
- winnerUId: this.data.pkData.score > _data.myOverall ? this.data.pkData.uid : this.data.pkData.score == _data.myOverall ? '' : wx.getStorageSync('uid')
- }
- } else {
- data = {
- challengerUserReadId: uploadRes.id,
- userReadId: this.data.pkData.id,
- winnerUId: ''
- }
- }
- let result = await uploadPk(data)
- await userEvent({
- action: 'WXPKUPLOAD',
- })
- wx.redirectTo({
- url: `/pages/pkResult/index?id=${result.id}`
- })
- },
- fail: (res) => {
- this.setData({
- uploadState: false
- })
- }
- });
- uploadTask.onProgressUpdate((res) => {
- this.setData({
- percent: res.progress
- })
- })
- },
- // 字体换行
- startRecording() {
- setTimeout(() => {
- if (this.data.currentRow == null) {
- this.setData({
- currentRow: 0
- })
- }
- let row = this.data.article[this.data.currentRow]
- if (!row.readTime) {
- return
- }
- this.setTimeoutObj = setTimeout(() => {
- this.setData({
- currentRow: ++this.data.currentRow
- })
- this.setData({
- scrollTop: this.rowH * this.data.currentRow
- })
- this.startRecording()
- },
- row.readTime);
- }, 100)
- },
- // 视频播放结束
- videoEnd() {
- this.resetReading()
- },
- videoPlay() {
- if (this.data.state) {
- return
- }
- if (this.data.videoInfo.userReadExtend.resourcesType == 1) {
- if (this.data.exampleState) {
- this.setData({
- exampleState: false
- })
- return this.resultAudioContext.stop()
- }
- this.resultAudioContext.src = this.data.readingReset ? this.data.readDetail.tempFilePath : this.data.videoInfo.userRead.audioPath;
- setTimeout(() => {
- this.resultAudioContext.play();
- }, 200)
- this.setData({
- exampleState: true
- })
- } else {
- if (this.data.readingReset) {
- this.resultAudioContext.src = this.data.readDetail.tempFilePath;
- this.resultAudioContext.play();
- this.setData({
- muted: true,
- exampleState: true
- })
- } else {
- this.setData({
- muted: false,
- exampleState: true
- })
- }
- this.setData({
- videoPath: this.data.videoInfo.userRead.videoPath
- })
- wx.nextTick(() => {
- this.videoContext.play()
- })
- }
- this.startRecording()
- submitPlayLog({
- userReadId: this.data.videoInfo.userRead.exampleId,
- playStopTime: 1000
- })
- },
- // 控制视频或音频的播放状态
- async playMediaState() {
- this.setData({
- muted: false
- })
- if (this.data.videoInfo.userReadExtend.resourcesType == 0) {
- this.setData({
- videoPath: this.data.videoInfo.userRead.originVideo
- })
- wx.nextTick(() => {
- this.videoContext.play()
- })
- } else {
- this.innerAudioContext.play();
- }
- userEvent({
- action: 'WXREADING',
- readId: this.data.videoInfo.userRead.id
- })
- },
- // 重置一切状态
- resetReading() {
- clearTimeout(this.setTimeoutObj)
- clearInterval(this.stl)
- // 重置视频
- if (this.data.videoInfo.userReadExtend.resourcesType == 0) {
- this.videoContext.stop()
- this.videoContext.seek(0)
- }
- // 重置试听音频
- if (this.data.exampleState) {
- this.resultAudioContext.stop()
- // 重置录音时的背景音乐
- this.innerAudioContext.stop();
- console.log('是我暂停了');
- }
- if (this.data.state) {
- // 重置录音时的背景音乐
- this.innerAudioContext.stop();
- /*微信录音结束*/
- recorderManager.stop();
- }
- this.setData({
- exampleState: false,
- state: false,
- currentRow: null,
- scrollTop: 0,
- ["silderData.sliderValue"]: 0,
- ["silderData.currentTime"]: '00:00'
- })
- },
- // 阻止作品上传时返回
- beforeleave() {
- this.setData({
- uploadState: true
- })
- },
- // 获取设备高度与行高度
- getHeight() {
- var query = wx.createSelectorQuery();
- query.select('.content').boundingClientRect((rect) => {
- this.setData({
- contentH: rect.height
- })
- }).exec()
- query.select('.row').boundingClientRect((rect) => {
- this.rowH = rect.height
- }).exec()
- },
- // 进度条
- slider({
- detail
- }) {
- this.resultAudioContext.pause();
- this.resultAudioContext.seek(detail.value / 100 * this.data.videoInfo.userRead.duration)
- setTimeout(() => {
- this.resultAudioContext.play()
- }, 300)
- },
- onHide() {
- wsEngine.reset()
- this.resetReading()
- },
- onUnload() {
- wsEngine.reset()
- this.resetReading()
- this.storeBindings.destroyStoreBindings()
- },
- backReading() {
- wx.navigateBack({
- delta: 1
- })
- },
- otherWork() {
- wx.navigateTo({
- url: `/pages/otherWork/index?exampleId=${this.data.videoInfo.userRead.exampleId}`
- })
- },
- async toBuy({
- detail
- }) {
- wx.showLoading({
- title: '提交中',
- mask: true
- })
- let res = await buyVip({
- productId: detail.id
- }).finally(() => {
- wx.hideLoading()
- })
- userEvent({
- action: 'ANDROID_PAY_ACTIVITY',
- })
- let {
- timeStamp,
- nonceStr,
- signType,
- paySign
- } = res
- // package保留字
- wx.requestPayment({
- timeStamp,
- nonceStr,
- package: res.package,
- signType,
- paySign,
- success: (res) => {
- this.selectComponent('#buyVip').closeModal()
- this.selectComponent('#vipModal').open()
- this.setData({
- isVip: true
- })
- setTimeout(() => {
- this.getVipInfo()
- }, 1500)
- userEvent({
- action: 'ANDROID_PAY_SUCCESS',
- })
- },
- fail(res) {
- wx.showToast({
- title: "支付失败",
- icon: "none",
- duration: 3000
- })
- }
- })
- },
- // 收藏课程
- async collect() {
- let {
- id,
- type,
- uid
- } = this.data.videoInfo.userRead
- if (wx.getStorageSync('uid') == uid) {
- return wx.showToast({
- title: '不能收藏自己作品哦!',
- icon: "none"
- })
- }
- await collectVideo({
- targetCode: id,
- favoritesType: type
- })
- this.setData({
- ['videoInfo.isFavorites']: !this.data.videoInfo.isFavorites
- })
- },
- // 点赞
- async likeVideo() {
- if (this.data.videoInfo.isLike) {
- return
- }
- let {
- id
- } = this.data.videoInfo.userRead
- await likeVideo(id)
- this.setData({
- ['videoInfo.isLike']: true,
- ['videoInfo.userRead.likeAmount']: this.data.videoInfo.userRead.likeAmount + 1
- })
- },
- //评论
- openComment() {
- this.selectComponent('#comment').open('', this.data.videoInfo.userRead.id)
- },
- addCommentNum() {
- this.setData({
- ['videoInfo.userRead.commentAmount']: ++this.data.videoInfo.userRead.commentAmount
- })
- },
- creatShare() {
- return new Promise((resolve, reject) => {
- let video = this.data.videoInfo
- let context = wx.createSelectorQuery();
- context
- .select('#share')
- .fields({
- node: true,
- size: true
- }).exec((res) => {
- let canvas = res[0].node;
- let ctx = canvas.getContext('2d');
- let dpr = wx.getSystemInfoSync().pixelRatio;
- canvas.width = res[0].width * dpr;
- canvas.height = res[0].height * dpr;
- ctx.scale(dpr, dpr);
- ctx.font = '14px PingFang';
- let pic = canvas.createImage();
- pic.src = video.userReadExtend && video.userReadExtend.resourcesType == 1 ? video.userReadExtend.backgroundVirtualImg : video.userRead.coverImg;
- pic.onload = () => {
- ctx.drawImage(pic, 0, 0, 375, 211);
- let peiyin = canvas.createImage();
- peiyin.src = '/static/peiyin.jpg';
- peiyin.onload = () => {
- ctx.drawImage(peiyin, 0, 211, 375, 89);
- //分享
- let fx = canvas.createImage();
- fx.src = '/static/share.png'
- fx.onload = () => {
- ctx.drawImage(fx, 12, 220, 20, 20)
- ctx.fillText('分享', 36, 238)
- // 收藏,一个一个渲染
- let sc = canvas.createImage();
- sc.src = '/static/no_collect.png'
- sc.onload = () => {
- ctx.drawImage(sc, 110, 220, 19, 19)
- ctx.fillText('收藏', 134, 238)
- //点赞
- let dz = canvas.createImage();
- dz.src = '/static/heart.png'
- dz.onload = () => {
- ctx.drawImage(dz, 318, 222, 22, 22)
- ctx.fillText(video.userRead.likeAmount || 0, 254, 238)
- // 评论
- let pl = canvas.createImage();
- pl.src = '/static/comment.png'
- pl.onload = () => {
- ctx.drawImage(pl, 228, 222, 22, 22)
- ctx.fillText(video.userRead.commentAmount, 340, 238)
- if (video.userReadExtend.resourcesType == 1) {
- let aBg = canvas.createImage();
- aBg.src = '/static/shareAudioBg.png';
- aBg.onload = () => {
- ctx.drawImage(aBg, 127.5, 38, 120, 120);
- let rate = 0.5
- ctx.arc(
- Math.floor(375 * rate),
- 98,
- Math.floor(100 * rate),
- 0,
- 2 * Math.PI
- );
- ctx.clip() //裁剪
- let coverImg = canvas.createImage();
- coverImg.src = video.userRead.coverImg;
- coverImg.onload = () => {
- ctx.drawImage( //定位在圆圈范围内便会出现
- coverImg, //图片暂存路径
- 129, 42,
- 110, 110,
- );
- ctx.restore()
- }
- }
- }
- setTimeout(() => {
- wx.canvasToTempFilePath({
- canvas: canvas,
- success(res) {
- resolve({
- title: video.user.profession == '官方' ? '我正在听这篇朗读示范,这发音,播音专业水准!你也来听听!' : '我的新作品发布啦,快来捧场点赞!',
- path: video.user.profession == '官方' ? `/pages/reading/index?uid=${wx.getStorageSync('uid')}&videoId=${video.userRead.id}` : `/pages/pkPage/index?videoId=${wx.getStorageSync('shareVideoId')}&uid=${wx.getStorageSync('uid')}&isShare=true`,
- imageUrl: res.tempFilePath
- })
- },
- fail(res) {
- reject()
- }
- }, this)
- }, 500)
- }
- }
- }
- }
- }
- }
- })
- })
- },
- onShareAppMessage({
- from,
- target
- }) {
- if (from == 'button') {
- let promise = new Promise(resolve => {
- this.creatShare().then(res => {
- resolve(res)
- })
- })
- return {
- title: '我的新作品发布啦,快来捧场点赞!',
- path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`,
- imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg',
- promise
- }
- } else {
- return {
- title: '自从用了它,家里朗朗书声,美妙极了!你家孩子也快来试试!',
- path: `/pages/index/index?uid=${wx.getStorageSync('uid')}`,
- imageUrl: 'http://reader-wx.ai160.com/images/reader/v3/375-300-1.jpg'
- }
- }
- },
- })
|