// pages/resourceDetails/index.js const app = getApp() const myAudio = wx.createInnerAudioContext(); import { loginInfo } from '../../../../assets/js/login'; // innerAudioContext.onPlay(function callback), // InnerAudioContext.onTimeUpdate(function callback) Page({ /** * 页面的初始数据 */ data: { showDropdown: false, noteList: [], navBarHeight: '', barHeight: '', flag: false, // 输入框是否显示 tabPanelstyle: 'display:flex;justify-content:center;align-items:center;', activeValues: [0], dialogKey: false, style: 'border: 2rpx solid rgba(220,220,220,1);border-radius: 12rpx;', activeId: '', storeInfo: '', bookId: '', bookName: '', cmsId: '', parentName: '', parentProductLinkPath: '', productLinkPath: '', threeLeveData: [], showData: '', src: '', selectedId: null, topicId: '', titleName: '', submitTitle: "", inputStyle: 'border: 2rpx solid rgba(220,220,220,1);border-radius: 12rpx; padding:16rpx', textvalue: '', style: 'height: 248rpx', submitType: "new", // 新建 or 编辑 noteId: '', myAudioDuration: '00:00', // 视频时间 myAudioCurrent: '00:00', // 当前播放进度 isplay: false, //是否默认播放, selectId: '', speed: 1.0, myAudioPos: '', startTime: "", //进入页面当前时间 pauseTime: 0, //暂停时间 formPath: '', loading: true, hidden: true, playerList: [], progress: 0, }, format(time) { let minute = Math.floor(time / 60); let second = Math.round(time % 60); let minuteStr = minute < 10 ? "0" + minute : "" + minute; let secondStr = second < 10 ? "0" + second : "" + second; return minuteStr + ":" + secondStr; }, audio: null, // 格式化笔记时间 convertTimestamp(timestamp) { const isoDate = new Date(timestamp) const year = isoDate.getFullYear() const month = String(isoDate.getMonth() + 1).padStart(2, '0') const day = String(isoDate.getDate()).padStart(2, '0') const hours = String(isoDate.getHours()).padStart(2, '0') const minutes = String(isoDate.getMinutes()).padStart(2, '0') const seconds = String(isoDate.getSeconds()).padStart(2, '0') const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` return formattedDate }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { console.log(options); wx.setNavigationBarTitle({ title: '资源详情-音频' }); const systInfo = wx.getSystemInfoSync(); const menu = wx.getMenuButtonBoundingClientRect(); // 胶囊信息 const navBarHeight = (menu.top - systInfo.statusBarHeight) * 2 + menu.height; // 导航栏高度 this.setData({ navBarHeight: navBarHeight, barHeight: systInfo.statusBarHeight, activeId: options.activeId, storeInfo: options.storeInfo, bookId: options.bookId, bookName: options.bookName, cmsId: options.cmsId, parentProductLinkPath: options.parentProductLinkPath, productLinkPath: options.productLinkPath, formPath: options.formPath }) if (options.parentName !== "教学资源" && options.parentName !== "云学习") { this.setData({ parentName: options.parentName, }) } const token = wx.getStorageSync(app.config.tokenKey) if (!token) { loginInfo(app, (data) => { if (data) {} else {} }) } this.resourceDetailsData() this.getNoteList() }, /** * 生命周期函数--监听页面初次渲染完成 * */ onReady() {}, /** * 生命周期函数--监听页面显示 */ onShow() { this.setData({ startTime: Date.now() }) }, /** * 生命周期函数--监听页面隐藏 */ onHide() { this.setData({ pauseTime: Date.now() }) if (wx.getStorageSync(app.config.tokenKey)) { let duration = this.data.pauseTime - this.data.startTime this.count(duration) } this.setPlayerList() }, /** * 生命周期函数--监听页面卸载 * * 退出页面时候调用的 * */ onUnload() { // this.setData({ // pauseTime: Date.now() // }) // if (wx.getStorageSync(app.config.tokenKey)) { // let duration = this.data.pauseTime - this.data.startTime // this.count(duration) // } // myAudio.src = '' // myAudio.destroy() this.setData({ // myAudioPos: '', isplay: false, //是否默认播放, myAudioCurrent: '00:00', // 当前播放进度 showData: '', speed: 1.0, }); myAudio.playbackRate = this.data.speed; // 停止音频播放 myAudio.stop(); // 销毁 InnerAudioContext 实例 // myAudio.destroy(); this.setPlayerList() }, count(timeStr) { const data = { appRefCode: app.config.appRefCode, type: 'LearningTime', //统计类型--阅读时长 data: timeStr + '', //统计内容--时长毫秒 event: 'LearningTime', sysType: 'App' } //阅读商品的id if (this.data.bookId) { data.productId = this.data.bookId } //阅读资源的id if (this.data.cmsId) { data.cmsItemId = this.data.cmsId } app.MG.job.newJobWithApiNewEvent(data).then((res) => {}) }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { }, onTabsChange(event) {}, onTabsClick(event) {}, handleChange(e) { this.setData({ activeValues: e.detail.value, }); }, onTakeNotes() {}, showDialog(e) { this.setData({ submitTitle: this.data.titleName, dialogKey: true, textvalue: '' }); }, closeDialog() { this.setData({ dialogKey: false }); }, goBack() { wx.navigateBack(); }, resourceDetailsData() { let query = { path: '*', queryType: '*', productId: this.data.bookId, cmsPath: this.data.parentProductLinkPath, itemFields: { SysType: 'CmsFolder', selectType: [], freeFile: [], file: [], protectedFile: [], resourcesClassification: [], isDownload: [], jsek_resourceBrief: [], jsek_link: [], jsek_questionBank: [], learnSelectType: [], learnSelectType: [] }, pading: { start: 0, size: 999 } } if (this.data.storeInfo) { query.storeInfo = this.data.storeInfo } app.MG.store.getProductDetail(query).then(res => { let selectedId = -1; // 初始化选中项索引 let showDataUrl = ''; let titleName = ''; res.datas.cmsDatas[0].datas.forEach((item, index) => { if (item.selectType === "audio" || item.learnSelectType === "audio") { this.data.threeLeveData.push(item); } }); this.data.threeLeveData.forEach((items, indexs) => { if (this.data.productLinkPath == items.productLinkPath) { selectedId = indexs; } }) if (selectedId !== -1) { let datas = this.data.threeLeveData[selectedId]; if (this.data.formPath == 'jsek_cloudLearning') { let file = datas.protectedFile ? datas.protectedFile : datas.file showDataUrl = app.config.requestCtx + '/file/api/ApiDownloadForAuthorize?md5=' + file + '&token=' + wx.getStorageSync(app.config.tokenKey); } else { showDataUrl = datas.file ? app.config.requestCtx + '/file/api/ApiDownload?md5=' + datas.file : app.config.requestCtx + '/file/api/ApiDownload?md5=' + datas.freeFile } titleName = datas.name; } this.setData({ threeLeveData: this.data.threeLeveData, selectedId: selectedId, showData: showDataUrl, titleName: titleName, loading: false, hidden: false }); this.pubulicPlayFun(); }); }, onVideo(e) { this.setPlayerList() this.setData({ myAudioCurrent: '00:00', myAudioPos: '', isplay: false }) const item = e.currentTarget.dataset.item console.log(item, 222) if (this.data.showData != '') { this.setData({ titleName: item.name, selectId: item.id, selectedId: e.currentTarget.dataset.index, showData: '', activeId: item.id }) if (item.selectType == "audio" || item.learnSelectType === "audio") { if (this.data.formPath == 'jsek_cloudLearning') { let file = item.protectedFile ? item.protectedFile : item.file // 这里处理云学习的 this.setData({ showData: app.config.requestCtx + '/file/api/ApiDownloadForAuthorize?md5=' + file + '&token=' + wx.getStorageSync(app.config.tokenKey) }) this.pubulicPlayFun() } else { this.setData({ showData: item.file ? app.config.requestCtx + '/file/api/ApiDownload?md5=' + item.file : app.config.requestCtx + '/file/api/ApiDownload?md5=' + item.freeFile }) this.pubulicPlayFun() } } } }, getProductUserSubmitTopicGet() { app.MG.ugc.getProductUserSubmitTopic({ productId: this.data.bookId, appRefCode: app.config.appRefCode }).then((res) => { this.setData({ topicId: res.id }) }) }, newTopicMessageGet() { let query = { topicIdOrRefCode: topicId + '', name: titleText.value, content: form.value.noteContent, type: 'note', cmsTypeRefCode: '', newDataListRequest: [] } app.MG.ugc.newTopicMessage(query).then(res => { }) }, // 标题改变 changeTitle(e) { this.setData({ flag: e.currentTarget.dataset.value }) }, // 标题输入框值 inputChange(e) { this.setData({ submitTitle: e.detail.value }) }, confirmSuggest() { if (!this.data.textvalue.trim()) { return wx.showToast({ icon: 'error', title: '请填写笔记内容', }) } else if (!this.data.submitTitle) { return wx.showToast({ icon: 'error', title: '请填写笔记标题', }) } if (this.data.submitType == 'new') { this.makeNote() } else if (this.data.submitType == 'edit') { this.updateNote() } this.setData({ dialogKey: false }); this.getNoteList() }, onTextarea() {}, textareaChange(e) { this.setData({ textvalue: e.detail.value }) }, // 获取笔记列表 async getNoteList() { // this.setData({ // loading: true // }) let topicId await app.MG.ugc .getProductUserSubmitTopic({ productId: this.data.bookId, appRefCode: app.config.appRefCode }) .then((res) => { if (res) { topicId = res.id } else { return wx.showToast({ icon: "error", title: '查询失败', }) } }) // loadings.value.bookResource = true let query = { start: 0, size: 999, messageType: 'note', sort: { type: 'Desc', field: 'CreateDate' }, appRefCode: app.config.appRefCode, topicIdOrRefCode: topicId + '' } await app.MG.ugc.getTopicMessageList(query).then((res) => { res.datas.forEach((item) => { item.createDate = this.convertTimestamp(item.createDate) }) this.setData({ "pageCount.total": res.totalSize, noteList: res.datas, }) }) }, // 编辑按钮 editNote(e) { const note = e.currentTarget.dataset.note this.setData({ submitType: "edit", textvalue: note.content, submitTitle: note.name, noteId: note.id, dialogKey: true, }) // this.showDialog() }, // 删除笔记 deleteNote(e) { const id = e.currentTarget.dataset.id const messageIds = [] messageIds.push(id) wx.showModal({ title: '提示', content: '确认删除该笔记吗?', //editable如果为true,这就是输入框的内容 editable: false, //是否显示输入框 placeholderText: '请输入内容吧', //输入框的默认内容 success: (res) => { if (res.confirm) { app.MG.ugc .delTopicMessage({ messageIds }) .then((res) => { wx.showToast({ title: '删除成功', }) // if ((notePage.value.total % 3) - 1 == 0) { // notePage.value.page -= 1 // } this.getNoteList() }) } else if (res.cancel) { // console.log('用户点击取消') } } }) }, // 新建笔记接口 async makeNote() { let topicId await app.MG.ugc .getProductUserSubmitTopic({ productId: this.data.bookId, appRefCode: app.config.appRefCode }) .then((res) => { if (res) { topicId = res.id } else { return wx.showToast({ icon: 'error', title: '新建失败', }) } }) let query = { topicIdOrRefCode: topicId + '', name: this.data.submitTitle, content: this.data.textvalue, type: 'note', cmsTypeRefCode: '', newDataListRequest: [] } await app.MG.ugc.newTopicMessage(query).then((res) => { wx.showToast({ title: '新建成功', }) this.closeDialog() this.getNoteList() }) }, // 编辑笔记接口 updateNote() { const token = wx.getStorageSync('jsek-token') if (!token) { return wx.getUserProfile({ desc: '用户登录', success: (res) => { // console.log(res); } }) } if (!this.data.submitTitle) { return wx.showToast({ icon: 'error', title: '请填写笔记标题', }) } else if (!this.data.textvalue) { return wx.showToast({ icon: 'error', title: '请填写笔记内容', }) } let query = { id: this.data.noteId, name: this.data.submitTitle, description: 'string', icon: 'string', type: 'note', content: this.data.textvalue, newDataRequests: [], updateDataRequests: [] } app.MG.ugc.updateTopicMessage(query).then((res) => { wx.showToast({ title: '编辑成功', }) this.closeDialog() this.getNoteList() }) this.setData({ submitType: "new" }) }, // 播放公共代码 pubulicPlayFun() { // debugger this.setData({ speed: 1.0, }) myAudio.playbackRate = this.data.speed; myAudio.src = this.data.showData // 在onCanplay里获取并设置音频时长和播放进度 myAudio.onCanplay(() => { myAudio.duration; //必须写,不然获取不到 setTimeout(() => { // 要初始化音频的时间 // myAudio.startTime = myAudio.currentTime //开始时间 this.setData({ myAudioDuration: this.format(myAudio.duration), myAudioCurrent: this.format(myAudio.currentTime) }); }, 100); }); //播放事件 myAudio.play(); // 播放完成处理,按钮变一下 myAudio.onEnded((res) => { this.setData({ speed: 1.0, }) myAudio.playbackRate = this.data.speed; this.setData({ isplay: true, myAudioCurrent: '00:00', myAudioPos: '', }) }); //进度条变化 myAudio.onTimeUpdate(() => { myAudio.startTime = 0 this.setData({ myAudioPos: myAudio.currentTime / myAudio.duration * 100, myAudioCurrent: this.format(myAudio.currentTime), myAudioDuration: this.format(myAudio.duration), progress: ((myAudio.currentTime / myAudio.duration) * 100).toFixed(2) }); // console.log(myAudio.currentTime.toFixed(3), myAudio.duration); }) }, //播放 play() { myAudio.startTime = this.data.myAudioCurrent; //考虑到进度条被拖动,不一定从00:00:00开始 myAudio.play(); this.setData({ isplay: false }); }, // 停止 stop() { myAudio.pause(); this.setData({ isplay: true }); }, //右切换 onLeftSwitch() { this.setData({ speed: 1.0, myAudioCurrent: '00:00' }) const index = this.data.threeLeveData.findIndex((item) => item.id == this.data.selectId) if (this.data.threeLeveData[index - 1]) { this.changeItem(this.data.threeLeveData[index - 1]) this.setData({ selectedId: index - 1, }) } else { console.log('已经是第一首了'); } }, //右切换 onRightSwitch() { this.setData({ speed: 1.0, myAudioCurrent: '00:00' }) const index = this.data.threeLeveData.findIndex((item) => item.id == this.data.selectId) if (this.data.threeLeveData[index + 1]) { this.changeItem(this.data.threeLeveData[index + 1]) this.setData({ selectedId: index + 1, }) } else { console.log('已经是最后一首了'); } }, // 左右切换 changeItem(item) { if (this.data.showData != '') { this.setData({ showData: '' }) } this.setData({ titleName: item.name, selectId: item.id }) if (item.selectType == "audio") { this.setData({ showData: app.config.requestCtx + '/file/api/ApiDownload?md5=' + item.file }) this.pubulicPlayFun() } }, // 播放倍速 onSpeed() { let c = this.data.speed; c += 0.5; if (c <= 2) { this.setData({ speed: c, }) } else { c = 0.5; this.setData({ speed: c, }) } setTimeout(() => { myAudio.startTime = this.data.myAudioDuration //开始时间 myAudio.playbackRate = this.data.speed; // 播放速率 }, 200); }, // 拖动进度条,到指定位置 hanle_slider_change(e) { const position = e.detail.value; var currentTime = position / 100 * myAudio.duration; myAudio.seek(currentTime); this.setData({ myAudioPos: position, myAudioCurrent: this.format(currentTime) }) }, toggleDropdown() { this.setData({ showDropdown: !this.data.showDropdown }); }, smallSpeed() { this.setData({ speed: 0.5, showDropdown: !this.data.showDropdown }) setTimeout(() => { myAudio.startTime = this.data.myAudioDuration //开始时间 myAudio.playbackRate = this.data.speed; // 播放速率 }, 200); }, centreSpeed() { this.setData({ speed: 1.5, showDropdown: !this.data.showDropdown }) setTimeout(() => { myAudio.startTime = this.data.myAudioDuration //开始时间 myAudio.playbackRate = this.data.speed; // 播放速率 }, 200); }, bigSpeed() { this.setData({ speed: 2, showDropdown: !this.data.showDropdown }) setTimeout(() => { myAudio.startTime = this.data.myAudioDuration //开始时间 myAudio.playbackRate = this.data.speed; // 播放速率 }, 200); }, smallSpeeDmultiple() { this.setData({ speed: 1, showDropdown: !this.data.showDropdown }) setTimeout(() => { myAudio.startTime = this.data.myAudioDuration //开始时间 myAudio.playbackRate = this.data.speed; // 播放速率 }, 200); }, //获取音频学习 getPlayerList() { app.MG.identity .getUserKey({ domain: 'videoPlayer', keys: [this.data.bookId] }) .then((res) => { if (res.length > 0) { this.setData({ playerList: JSON.parse(res[0].value) }) } }) }, setPlayerList() { let that = this if (that.data.progress > 0) { let index = that.data.playerList.findIndex((itemData) => itemData.cmsItemId == that.data.selectId) if (index > -1) { that.data.playerList.splice(index, 1) } that.data.playerList.push({ cmsItemId: that.data.selectId, progress: that.data.progress }) app.MG.identity .setUserKey({ setKeyRequests: [{ domain: 'videoPlayer', key: that.data.bookId, value: JSON.stringify(that.data.playerList) }] }) .then((res) => {}) } }, })