You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
691 lines
17 KiB
691 lines
17 KiB
|
|
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
|
|
}
|