(function($, kr, websql) { var DB_VERSION_NUMBER = '1.0'; var TIME_UPDATE = 'TIME_UPDATE'; var TIME_PUBDATE = 'TIME_PUBDATE'; var TIME_UPDATE_SLIDER = 'TIME_UPDATE_SLIDER'; var LAST_ID = "LAST_ID"; var TIME_INTERVAL = 1000 * 60 * 10; //更新间隔(默认十分钟) var TIME_INTERVAL_SLIDER = 1000 * 60 * 60; //更新间隔(默认一小时) var SLIDER_GUID = 'SLIDER_GUID'; var PAGE_SIZE = 10; var MAX_INTEGER = Number.MAX_VALUE; var REGEX_SRC = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; var IMAGE_DOWNLOAD = "IMAGE_DOWNLOAD"; var IMAGE_DOWNLOAD_WHEN_WIFI = "true"; var DIR_IMAGE = "_doc/image/news/"; var SLIDER_URL = 'http://demo.dcloud.net.cn/36kr/slider.json'; var FEED_URL = 'http://spider.dcloud.net.cn/api/news'; //'http://www.36kr.com/feed'; var SQL_TABLE = 'DROP TABLE IF EXISTS kr_news;CREATE TABLE kr_news (guid TEXT PRIMARY KEY, title TEXT,author TEXT,link TEXT,cover TEXT,image TEXT,pubDate INTEGER,description TEXT);'; var SQL_SELECT = 'SELECT guid,title,author,pubDate,cover,image FROM kr_news WHERE pubDate < ? ORDER BY pubDate DESC LIMIT ?;'; var SQL_INSERT = 'INSERT INTO kr_news(title,author,link,guid,cover,pubDate,description) VALUES(?,?,?,?,?,?,?);'; var SQL_SELECT_DETAIL = 'SELECT * FROM kr_news WHERE guid = ? LIMIT 1;'; var SQL_UPDATE = 'UPDATE kr_news SET image = ? WHERE guid = ?'; var SQL_DELETE = 'DELETE FROM kr_news'; var UNITS = { '年': 31557600000, '月': 2629800000, '天': 86400000, '小时': 3600000, '分钟': 60000, '秒': 1000 }; kr.humanize = function(milliseconds) { var humanize = ''; $.each(UNITS, function(unit, value) { if (milliseconds >= value) { humanize = Math.floor(milliseconds / value) + unit + '前'; return false; } return true; }); return humanize || '刚刚'; }; kr.format = function(milliseconds) { var diff = Date.now() - milliseconds; if (diff < UNITS['天']) { return kr.humanize(diff); } var date = new Date(milliseconds); var _format = function(number) { return (number < 10 ? ('0' + number) : number); }; return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDay()) + '-' + _format(date.getHours()) + ':' + _format(date.getMinutes()); }; kr.dbReady = function(successCallback, errorCallback) { html5sql.openDatabase("kr", "36Kr", 5 * 1024 * 1024); if (html5sql.database.version === '') { html5sql.changeVersion('', DB_VERSION_NUMBER, SQL_TABLE, function() { successCallback && successCallback(true); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); } else { successCallback && successCallback(false); } }; kr.toggleDownloadWhenWifi = function(whenWifi) { if (whenWifi) { localStorage.setItem(IMAGE_DOWNLOAD, IMAGE_DOWNLOAD_WHEN_WIFI); } else { localStorage.removeItem(IMAGE_DOWNLOAD); } }; kr.isDownloadWhenWifi = function() { return !!localStorage.getItem(IMAGE_DOWNLOAD); }; kr.isDownloadImage = function() { var currentType = plus.networkinfo.getCurrentType(); if (currentType === plus.networkinfo.CONNECTION_NONE) { return false; } else if (currentType !== plus.networkinfo.CONNECTION_WIFI) { if (localStorage.getItem(IMAGE_DOWNLOAD)) { return false; } } return true; }; kr.isDownloadImageAsync = function(callback) { callback = callback || mui.noop; mui.plusReady(function() { var currentType = plus.networkinfo.getCurrentType(); if (currentType === plus.networkinfo.CONNECTION_NONE) { callback(false); } else if (currentType !== plus.networkinfo.CONNECTION_WIFI) { if (localStorage.getItem(IMAGE_DOWNLOAD)) { callback(false); } } callback(true); }); }; kr.clearCache = function() { plus.nativeUI.showWaiting('正在删除缓存...'); kr.deleteNews(function() { //清除图片缓存 plus.io.resolveLocalFileSystemURL(DIR_IMAGE, function(entry) { entry.removeRecursively(function() { plus.nativeUI.closeWaiting(); plus.nativeUI.toast("缓存删除成功"); }, function() { plus.nativeUI.closeWaiting(); }); }, function(e) { plus.nativeUI.closeWaiting(); }); //通知首页重新拉取最新 localStorage.removeItem(TIME_UPDATE); //移除上次更新时间 localStorage.removeItem(TIME_PUBDATE); //移除最新的feed更新时间 localStorage.removeItem(TIME_UPDATE_SLIDER); //移除上次slider更新时间 localStorage.removeItem(SLIDER_GUID); //移除上次slider的guid localStorage.removeItem(LAST_ID); plus.webview.getWebviewById("news").evalJS('getFeed("true")'); }, function() {}); }; kr.downloadImage = function(name, imgUrl, successCallback, errorCallback) { var url = DIR_IMAGE + name + ".png"; return plus.downloader.createDownload(imgUrl, { filename: url }, function(download, status) { if (status != '200') { return successCallback(null); } successCallback(download.filename); }); }; kr.getSlider = function(isLocal, successCallback) { //若缓存本地,则直接显示 if (isLocal === true) { successCallback(localStorage.getItem(SLIDER_GUID)); return; } successCallback = successCallback || isLocal; //当前没有网络,显示本地缓存 if (plus.networkinfo.getCurrentType() === plus.networkinfo.CONNECTION_NONE) { successCallback(localStorage.getItem(SLIDER_GUID)); return; } var update = parseFloat(localStorage.getItem(TIME_UPDATE_SLIDER)); //屏蔽频繁刷新,若尚未过期,则直接显示本地缓存 if (update && (update + TIME_INTERVAL_SLIDER) > Date.parse(new Date())) { successCallback(localStorage.getItem(SLIDER_GUID)); return; } $.getJSON(SLIDER_URL, function(response) { if (response) { localStorage.setItem(SLIDER_GUID, response.guid); localStorage.setItem(TIME_UPDATE_SLIDER, Date.parse(new Date()) + ''); //本地更新时间 kr.getNewsByGuid(response.guid, function(item) { if (!item) { //首页封面DB中未存储,insert response.pubDate = Date.parse(response.pubDate); if (response.cover) { response.description = response.description.replace('', ''); } response.description = response.description.replace('36氪官方iOS应用正式上线,支持『一键下载36氪报道的移动App』和『离线阅读』 立即下载!', ''); kr.addNews([ [response.title, response.author, response.link, response.guid, response.cover, response.pubDate, response.description] ], function() { successCallback(response); }, function() { //TODO 存储失败的回调,有待商榷 successCallback(response); }); } else { //db中已存储,直接返回本地存储 successCallback(item); } }); } else { //请求失败,直接显示本地缓存 successCallback(localStorage.getItem(SLIDER_GUID)); } }); }; /** * 通过rss获取新闻数据 * @param {Function} successCallback * @param {Function} errorCallback */ kr.getFeed = function(successCallback, errorCallback) { //若没有网络,则显示之前缓存数据,并给与提示 if (plus.networkinfo.getCurrentType() === plus.networkinfo.CONNECTION_NONE) { plus.nativeUI.toast('似乎已断开与互联网的连接', { verticalAlign: 'top' }); successCallback(false); return; } // //避免频繁刷新,默认最短刷新间隔为10分钟 // var update = parseFloat(localStorage.getItem(TIME_UPDATE)); // if (update && (update + TIME_INTERVAL) > Date.parse(new Date())) { // successCallback(false); // return; // } var lastId = localStorage.getItem(LAST_ID) || ''; $.getFeed(FEED_URL + '?lastId=' + lastId, function(feed) { if (feed.items) { var news = []; var pubDate = parseFloat(localStorage.getItem(TIME_PUBDATE)); $.each(feed.items, function(index, item) { news.push([item.title, item.author, item.link, item.guid, item.cover, Date.parse(item.pubDate), item.description]); }); news.reverse(); if (news.length > 0) { kr.addNews(news, function() { successCallback(news.length); }, function() { successCallback(false); }); } else { successCallback(false); } if (feed.items[0]) { localStorage.setItem(LAST_ID, feed.items[0].guid); } } localStorage.setItem(TIME_PUBDATE, Date.parse(feed.pubDate) + ''); //订阅发布时间 localStorage.setItem(TIME_UPDATE, Date.parse(new Date()) + ''); //本地更新时间 }, function(xhr) { errorCallback && errorCallback(); }); }; kr.getNewsByGuid = function(guid, successCallback, errorCallback) { websql.process([{ "sql": SQL_SELECT_DETAIL, "data": [guid] }], function(tx, results) { successCallback(results.rows.length > 0 && results.rows.item(0)); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); }; kr.getNews = function(latestId, pageSize, successCallback, errorCallback) { if (typeof latestId === 'function') { successCallback = latestId; latestId = MAX_INTEGER; pageSize = PAGE_SIZE; } else if (typeof pageSize === 'function') { successCallback = pageSize; latestId = latestId || MAX_INTEGER; pageSize = PAGE_SIZE; } else { latestId = latestId || MAX_INTEGER; pageSize = pageSize || PAGE_SIZE; } websql.process([{ "sql": SQL_SELECT, "data": [latestId, pageSize] }], function(tx, results) { successCallback(results.rows); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); }; kr.addNews = function(news, successCallback, errorCallback) { var sqls = []; $.each(news, function(index, item) { sqls.push({ "sql": SQL_INSERT, "data": item }) }); websql.process(sqls, function(tx, results) { successCallback(true); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); }; kr.updateNews = function(guid, image, successCallback, errorCallback) { websql.process([{ "sql": SQL_UPDATE, "data": [image, guid], }], function(tx, results) { successCallback && successCallback(); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); }; kr.deleteNews = function(successCallback, errorCallback) { websql.process(SQL_DELETE, function(tx, results) { successCallback && successCallback(); }, function(error, failingQuery) { errorCallback && errorCallback(error, failingQuery); }); }; })(mui, kr, html5sql);