|
|
import { LocalData, getStorage, setStorage, setClass } from '@/utils/global' import store from '../store/store.js'; const url_sync = getApp().globalData.request_url+'/portrait-api/getSync' //获取所有资源接口
const url_confirm = getApp().globalData.request_url+'/portrait-api/getSyncConfirm' //同步结果回送
const url_updateSwap = getApp().globalData.request_url+'/portrait-api/swapUpdate' //更新轮播图
//下载列表
let listBook = [] let listDoc = [] let listVideo = [] let listTheme = [] let listVr = []
//当前下载的个数
let videoIndex = 0 let videochildIndex= 0 let bookIndex = 0 let docIndex = 0 let themeIndex = 0 let vrIndex = 0
//当前下载 成功 的个数
let videodown = 0 let bookdown = 0 let docdown = 0 let themedown = 0 let vrdown = 0
let aiyxliburl="https://qiniu.aiyxlib.com/"; let targetPath ; //存储本地文件路径
let overtime=0; //超时次数
let curVideoDir = 0; //视频子集下载
let backPics = [] //轮播图
let currentSyncNum=0; //总共更新下载资源数
let serialNum=uni.getStorageSync('serialNum')||'';
//分类列表
let bookClass let docClass let videoClass let themeClass let vrClass //删除列表
let delBook = [] let delDoc = [] let delVideo = [] let delTheme = [] let delVr = []
//获取所有资源
const Sync = { start: function(){ serialNum=uni.getStorageSync('serialNum')||''; // console.log(777, serialNum)
showLoading('正在加载') try{ uni.request({ url:`${url_sync}?serialNumber=${serialNum}`, method: 'POST', success: (res) => { console.log(res) uni.hideLoading() let {errCode, data} = res.data if(errCode == 0){ listBook = data.listBook listDoc = data.listDoc listVideo = data.listVideo listTheme = data.listTheme listVr = data.listVr delBook = data.delEbook delDoc = data.delDoc delTheme = data.delTheme delVr = data.delVr delVideo = data.delVideo let classMap = data.classOrderMap; bookClass = classMap[0] ? classMap[0] : []; docClass = classMap[1] ? classMap[1] : []; videoClass = classMap[2] ? classMap[2] : []; themeClass = classMap[3] ? classMap[3] : []; vrClass = classMap[4] ? classMap[4] : []; //当前下载 成功 的个数
videodown = 0 bookdown = 0 docdown = 0 themedown = 0 vrdown = 0 //当前下载到第几个
videoIndex = 0 videochildIndex= 0 bookIndex = 0 docIndex = 0 themeIndex = 0 vrIndex = 0 aiyxliburl=data.url currentSyncNum=data.currentSyncNum console.log(aiyxliburl) // console.log('2222', JSON.stringify(classMap))
//删除
delRes() //正式存储
syncQueue() }else{ uni.showToast({ title: '资源请求失败', icon:'none', duration: 2500 }); } }, fail: (e) => { console.log('fail: ', e) uni.hideLoading() uni.showToast({ title: '接口请求失败', icon:'none', duration: 2000 }); } }) }catch(e){ console.log(e) } } }
function syncQueue() { // console.log(bookIndex, docIndex,themeIndex,vrIndex,videoIndex)
if(bookIndex < listBook.length ){ showLoading('获取图书:' + (bookIndex) + ' / ' + listBook.length) targetPath = "_doc/book/"; getResource(listBook[bookIndex],0) }else if(docIndex < listDoc.length ){ showLoading('获取阅文:' + (docIndex) + ' / ' + listDoc.length) targetPath = "_doc/doc/"; getResource(listDoc[docIndex],1) }else if(themeIndex < listTheme.length){ showLoading('获取阅刊: ' + (themeIndex) + ' / ' + listTheme.length) targetPath = "_doc/theme/"; getResource(listTheme[themeIndex],3) }else if(vrIndex < listVr.length){ showLoading('获取VR: ' + (vrIndex) + ' / ' + listVr.length) targetPath = "_doc/theme/"; getResource(listVr[vrIndex],4) }else if(videoIndex < listVideo.length){ targetPath = "_doc/video/"; getResource(listVideo[videoIndex],2) } else{ uni.hideLoading() //更新轮播图
updateSwap() } } //下载封面
function getResource(resList,savetype) { const that = this; let coverState=resList.coverState||resList.coverCollectionState; console.log("coverState: " + coverState); if(!coverState && resList.cover){ let onurl=aiyxliburl+resList.cover; // console.log("onurl: " + onurl);
try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { if (status==200) { resList.cover = resList.cover.split(".")[0]+".jpg"; console.log("Download success: " + resList.cover); switch(savetype){ case 0://读书
bookIndex++; bookdown++; store.commit("bookData", bookdown); store.commit("bookFalse", listBook.length-bookdown); break; case 1://阅文
docIndex++; docdown++; store.commit("docData", docdown); store.commit("docFalse", listDoc.length-docdown); break; case 3://阅刊
themeIndex++; themedown++; store.commit("themeData", themedown); store.commit("themeFalse", listTheme.length-themedown); break; case 4://vr
vrIndex++; vrdown++; store.commit("vrData", vrdown); store.commit("vrFalse", listVr.length-vrdown); break; case 2://视频
videoIndex++; break; } if(savetype == 2){ curVideoDir = 0 resList.coverCollectionState = true; // console.log(resList);
getVideoDirectory(resList) }else{ resList.coverState = true; syncPush(resList,savetype) syncQueue() } } else { syncQueue() if(savetype == 2){ let videofalse=store.state.videofalse+resList.directory.length; store.commit("videoFalse", videofalse); } console.log("Download failed: " + status); } } ); dtask.start(); } catch (error) { syncQueue() console.log("Download failed: " + error); } }else{ switch(savetype){ case 0://读书
bookIndex++; break; case 1://阅文
docIndex++; break; case 3://阅刊
themeIndex++; break; case 4://vr
vrIndex++; break; case 2://视频
videoIndex++; break; } console.log(coverState ); syncQueue() // resList.localCover =targetPath+resList.cover;
} } //同步推送下载
function syncPush(entity,savetype) { // console.log(entity)
let param = { belongVideoName: entity.name, //(父)资源名称
coverState: entity.coverState||entity.coverCollectionState, //封面下载状况
failType: 0, //失败类别 0成功 1失败 2超时
ok: true, //(是否操作成功)
fileName:entity.cover, //封面地址
resourceId: entity.baseId, //资源id
sn: serialNum, //设备序列号
state: 1, //1.编辑 2.删除
classId:entity.classId, //资源类型
typeId: savetype,//资源类别 0图书 1阅文 2视频 3阅刊 4vr (子视频不填)
videoState: entity.videoCollectionState||""//视频是否下载(子视频是否全部下载)
} // console.log(param)
syncRequest(param,entity,savetype) } //同步推送下载子视频
function syncPushvideo(entity,viedochild,type) { // console.log(entity,viedochild)
if(type==0){ videodown++; store.commit("videoData", videodown); }else{ store.state.videofalse++; } let reason type==0 ? reason="" : type==1 ? reason="失败" : reason="超时" let param = { belongVideoName: entity.name, //(父)资源名称
coverState: viedochild.coverState, //封面下载状况
failType: type, //失败类别 0成功 1失败 2超时
fileName:viedochild.cover, //封面地址
lastWrongReason: reason, ok: true, //(是否操作成功)
resourceId: entity.baseId, //资源id
sn: serialNum, //设备序列号
state: 1, //1.编辑 2.删除
videoId: viedochild.id,//子视频资源id
videoName: viedochild.name, //子视频名称
belongId: viedochild.belongId,//父集合资源id
videoState: viedochild.videoState//视频是否下载(子视频是否全部下载)
} console.log(param) syncRequest(param,entity,6) }
//同步接口请求
function syncRequest(param,entity,savetype) { uni.request({ url:url_confirm, data:param, method: 'POST', success: (res) => { console.log(res) if(res.data.errCode==0){ switch(savetype){ case 0: LocalData.book=categoryFiles(LocalData.book, entity, bookClass) // console.log('存进分类书列表:', LocalData.book)
break; case 1: LocalData.doc=categoryFiles(LocalData.doc, entity, docClass) break; case 3: LocalData.theme=categoryFiles(LocalData.theme, entity, themeClass) break; case 4: LocalData.vr=categoryFiles(LocalData.vr, entity, vrClass) break; case 2: LocalData.video=categoryFiles(LocalData.video, entity, videoClass) break; } setStorage(LocalData) // console.log(LocalData)
console.log('向后台返回成功') }else{ console.log(res.data.errMsg) } }, fail: (err) => { uni.hideLoading() uni.showToast({ title: '推送失败: ' + err, icon:none, duration: 2000 }) } }) } //存进分类列表
function categoryFiles(locData, curData, classArray) { // console.log("存进分类",locData)
if(locData.length < 1||locData==null){ locData.push({id:0, name: '全部', order: -1, list:[]}) classArray.forEach((classItem) => { classItem.list=[]; locData.push(classItem) }) console.log(locData) categoryFiles(locData, curData, classArray) }else{ locData.forEach((classItem) => { if(curData.classId==classItem.id){ classItem.list.push(curData) // console.log(classItem.list)
} if(classItem.id==0){ classItem.list.push(curData) // console.log(classItem)
} }) } locData = locData.sort((a,b) => { return a.order < b.order }) return locData }
function getVideoDirectory (video) { let directory = video.directory // console.log("directory", directory)
if(video.videoCollectionState){ console.log(videoIndex) syncQueue() return ; } curVideoDir++; if(curVideoDir <= directory.length){ console.log(386) showLoading('获取视频:' + ((videoIndex-1)*1+((curVideoDir/directory.length).toFixed(1))*1) +'/ ' + listVideo.length) getFile(video, directory[curVideoDir-1]) return } uni.hideLoading() video.videoCollectionState=video.directory.every((x)=> { return x.videoState; }); console.log("402--", video.videoCollectionState) syncPush(video,2) syncQueue() } //下载视频子集封面
function getFile (video, dir) { if(dir.cover && !dir.coverState){ let onurl=aiyxliburl+dir.cover; try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { // console.log(d.filename, status);
// 下载完成
if (status==200) { dir.cover = dir.cover.split(".")[0]+".jpg"; dir.coverState = true; // console.log("Download success: " + listVideo[videoIndex].directory[curVideoDir].localCover);
} else {dir.localCover ="";} } ); dtask.start(); } catch (error) { dir.localCover =""; console.log("Download failed: " + error); } } if(dir.url && !dir.videoState){ // console.log('dlVideo', dir.url)
let p1 = new Promise((resolve, reject) => { getFilevideo (video, dir,resolve) }); let p2 = new Promise((resolve, reject) => { setTimeout(function () { resolve(2); }, 600000); }); Promise.race([p1, p2]).then( (data) => { if (data == 2) { //超时计次,跳过
that.overtime++; if (that.overtime > 2) { // 超时3次,退出更新?
store.commit("falsepop", true); }else{ getVideoDirectory(video) syncPushvideo(video,dir,2) } } // console.log(data);
}, (err) => { console.log(err); } ); }else{ getVideoDirectory(video) } } //下载视频子集
function getFilevideo (video, dir,resolve) { console.log("下载视频子集",curVideoDir) let onurl=aiyxliburl+dir.url; try { let dtask = plus.downloader.createDownload( onurl, { filename: targetPath }, function (d, status) { console.log(d.filename, status); resolve(1); //下载成功返回Promise状态
// 下载完成
if (status==200) { dir.localUrl = d.filename; dir.videoState = true; // console.log("Download: " ,video.directory[curVideoDir]);
getVideoDirectory(video) syncPushvideo(video,dir,0) } else { dir.localUrl ="" getVideoDirectory(video) syncPushvideo(video,dir,1) } } ); dtask.start(); } catch (error) { dir.localUrl ="" getVideoDirectory(video) console.log("Download failed: " + error); } }
function updateSwap() { // showLoading('同步轮播图...')
uni.request({ url:`${url_updateSwap}?sn=${serialNum}`, method: 'POST', success: (res) => { // console.log(res)
if(res.data.errCode == 0){ let {data, h5ReaderUrl} = res.data console.log(res.data) uni.setStorageSync('deviceTitle', data.title) uni.setStorageSync('h5ReaderUrl', h5ReaderUrl) curVideoDir = 0; if(data.bgUrls!=null){ backPics = [] getSwapPic(data.bgUrls) }else{ if(currentSyncNum){ store.commit("downpop", true); }else{ uni.showToast({ title: '已有全部最新资源~', icon:'none', duration: 3000 }); } } } }, fail: (err) => { uni.showToast({ title:'轮播图同步失败', icon:'none' }) } }) } function getSwapPic(pics) { if(curVideoDir < pics.length){ showLoading('更新轮播图' + (curVideoDir + 1) + ' / ' + pics.length) let onurl = pics[curVideoDir] let bantPath="_doc/theme/"; try { let dtask = plus.downloader.createDownload( onurl, { filename: bantPath }, function (d, status) { if (status==200) { backPics.push(d.filename) curVideoDir ++ getSwapPic(pics) uni.hideLoading() } else { getSwapPic(pics) console.log("Download failed: " + status); } } ); dtask.start(); } catch (error) { getSwapPic(pics) console.log("Download failed: " + error); } }else{ // console.log('9999', backPics)
uni.setStorageSync('backPics', backPics) if(currentSyncNum){ store.commit("downpop", true); }else{ uni.showToast({ title: '轮播图已更新', icon:'none', duration: 3000 }); } } }
//删除
function delRes() { console.log('删除') if(delBook && delBook.length > 0){ console.log(delBook) delResObject(LocalData.book, delBook,0) } if(delDoc && delDoc.length > 0){ // console.log(delDoc)
delResObject(LocalData.doc, delDoc,1) } if(delTheme && delTheme.length > 0){ delResObject(LocalData.theme, delTheme,3) } if(delVr && delVr.length > 0){ delResObject(LocalData.vr, delVr,4) } if(delVideo && delVideo.length > 0){ delResObject(LocalData.video, delVideo,2) } }
function delResObject(locallist, items,savetype){ let classindex; let listindex; console.log(items) items.forEach((arr, num)=>{ locallist.forEach((x, index)=>{ if(x.id==arr.classId){ classindex=index; x.list.forEach((y, ind, b)=>{ if(y.baseId==arr.resourceId){ listindex=ind; locallist[classindex].list.splice(listindex,1) // console.log(locallist)
// setStorage(LocalData)
syncPushdel(items,savetype) } }) } }) locallist[0].list.forEach((x, index)=>{ if(x.baseId==arr.resourceId){ locallist[0].list.splice(index,1) // debugger
// console.log(index,LocalData.book)
setStorage(LocalData) } }) }) } //同步推送删除
function syncPushdel(entity,savetype) { let param = { belongVideoName: entity.name||"", //(父)资源名称
coverState: entity.coverState||entity.coverCollectionState, //封面下载状况
failType: 0, //失败类别 0成功 1失败 2超时
fileName:entity.fileName, //封面地址
ok: true, //(是否操作成功)
resourceId: entity.resourceId, //资源id
sn: serialNum, //设备序列号
state: 2, //1.编辑 2.删除
classId:entity.classId, //资源类型
typeId: savetype, videoState: true,//视频是否下载(子视频是否全部下载)
} // console.log(param)
uni.request({ url:url_confirm, data:param, method: 'POST', success: (res) => { console.log(res) if(res.data.errCode==0){ setStorage(LocalData) }else{ console.log(res.data.errMsg) } }, fail: (err) => { console.log(err) } }) }
const showLoading = function(str) { uni.showLoading({ title:str, mask:true }) }
export { Sync, delRes }
|