完成每个10分钟,自动获取热门标签

This commit is contained in:
luchenqun 2017-03-17 11:19:37 +08:00
parent 0b91f30cd2
commit b44b841241
10 changed files with 152 additions and 70 deletions

2
app.js
View File

@ -78,6 +78,6 @@ app.use(function(err, req, res, next) {
api.checkSnapFaviconState(); api.checkSnapFaviconState();
api.getSnapByTimer(); api.getSnapByTimer();
api.getFaviconByTimer(); api.getFaviconByTimer();
api.getHotBookmarks(); api.getHotBookmarksByTimer();
module.exports = app; module.exports = app;

View File

@ -776,26 +776,27 @@ db.updateBookmarkFaviconState = function(id, faviconState) {
} }
db.addHotBookmark = function(bookmark) { db.addHotBookmark = function(bookmark) {
var insertSql = "INSERT INTO `hot_bookmarks` (`id`, `date`, `title`, `url`, `fav_count`, `created_by`, `created_at`, `last_click`, `snap_url`, `favicon_url`) VALUES ('" + client.escape(bookmark.id) + "', '" + client.escape(bookmark.date) + "', '" + client.escape(bookmark.title) + "', '" + client.escape(bookmark.url) + "', '" + client.escape(bookmark.fav_count) + "', '" + client.escape(bookmark.created_by) + "', '" + client.escape(bookmark.created_at) + "', '" + client.escape(bookmark.last_click) + "', '" + client.escape(bookmark.snap_url) + "', '" + client.escape(bookmark.favicon_url) + "')"; var sql = "REPLACE INTO `hot_bookmarks` (`id`, `date`, `title`, `url`, `fav_count`, `created_by`, `created_at`, `last_click`, `snap_url`, `favicon_url`) VALUES ('" + bookmark.id + "', '" + bookmark.date + "', " + client.escape(bookmark.title) + ", " + client.escape(bookmark.url) + ", '" + bookmark.fav_count + "', " + client.escape(bookmark.created_by) + ", '" + bookmark.created_at + "', '" + bookmark.last_click + "', " + client.escape(bookmark.snap_url) + ", " + client.escape(bookmark.favicon_url) + ")";
var selectSql = "SELECT * FROM `bookmarks` WHERE `id` = '" + bookmark.id + "' OR `url` = '" + bookmark.url + "'";
console.log(insertSql, selectSql);
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
client.query(selectSql, (err, result) => { client.query(sql, (err, result) => {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
if (result.length >= 1) { resolve(result.insertId);
resolve(result[0].id); }
} else { });
client.query(insertSql, (err, result) => { });
if (err) { };
reject(err);
} else { db.hotBookmarks = function(date) {
resolve(result.insertId); var sql = "SELECT * FROM `hot_bookmarks` WHERE `date` = "+ date +" AND `status` = 0"
} return new Promise(function(resolve, reject) {
}); client.query(sql, (err, result) => {
} if (err) {
reject(err);
} else {
resolve(result);
} }
}); });
}); });

View File

@ -9,8 +9,8 @@ app.controller('bookmarkInfoCtr', ['$scope', '$state', '$timeout', '$sce', '$win
$('.ui.modal.js-bookmark-info').modal({ $('.ui.modal.js-bookmark-info').modal({
closable: false, closable: false,
}).modal('setting', 'transition', transition()).modal('show'); }).modal('setting', 'transition', transition()).modal('show');
bookmark.favicon = bookmark.favicon || ('http://g.soz.im/'+bookmark.url +'/cdn.ico'); bookmark.favicon_url = bookmark.favicon_url || ('http://g.soz.im/'+bookmark.url +'/cdn.ico');
bookmark.image = bookmark.image || ('./images/snap/'+bookmark.id+'.png'); bookmark.snap_url = bookmark.snap_url || ('./images/snap/'+bookmark.id+'.png');
$scope.bookmark = bookmark; $scope.bookmark = bookmark;
$scope.bookmark.description = $sce.trustAsHtml(bookmark.description); $scope.bookmark.description = $sce.trustAsHtml(bookmark.description);
$scope.content = ''; $scope.content = '';

View File

@ -198,7 +198,9 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', '$document', 'bookmar
$scope.autoGettitle = false; $scope.autoGettitle = false;
$scope.url = bookmark.url; $scope.url = bookmark.url;
$scope.title = bookmark.title; $scope.title = bookmark.title;
$scope.newTags = bookmark.tags.map((item) => item.name).toString(); if(bookmark.tags && bookmark.tags.length >= 1){
$scope.newTags = bookmark.tags.map((item) => item.name).toString();
}
}); });
// 在输入文字的时候也会触发所以不要用Ctrl,Shift之类的按键 // 在输入文字的时候也会触发所以不要用Ctrl,Shift之类的按键

View File

@ -24,7 +24,7 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
console.log('autoLogin err', err) console.log('autoLogin err', err)
}); });
getBookmarks(); getHotBookmarks();
$scope.jumpToUrl = function(url) { $scope.jumpToUrl = function(url) {
$window.open(url, '_blank'); $window.open(url, '_blank');
@ -66,6 +66,9 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
$scope.toastrId = toastr.info('请先登录再转存书签!', "提示"); $scope.toastrId = toastr.info('请先登录再转存书签!', "提示");
} else { } else {
var b = $.extend(true, {}, bookmark); // 利用jQuery执行深度拷贝 var b = $.extend(true, {}, bookmark); // 利用jQuery执行深度拷贝
b.tags = [{
name: b.created_by
}]
pubSubService.publish('TagCtr.storeBookmark', b); pubSubService.publish('TagCtr.storeBookmark', b);
} }
} }
@ -91,6 +94,7 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
$scope.detailBookmark = function(b) { $scope.detailBookmark = function(b) {
var bookmark = $.extend(true, {}, b); // 利用jQuery执行深度拷贝 var bookmark = $.extend(true, {}, b); // 利用jQuery执行深度拷贝
bookmark.own = false; bookmark.own = false;
bookmark.own = false;
bookmark.tags = [{ bookmark.tags = [{
id: -1, id: -1,
name: '热门收藏' name: '热门收藏'
@ -100,12 +104,12 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
} }
$scope.loadCardData = function() { $scope.loadCardData = function() {
console.log('loadCardData.........')
if (!$scope.loadBusy) { if (!$scope.loadBusy) {
console.log('loadCardData.........')
var menusScope = $('div[ng-controller="menuCtr"]').scope(); var menusScope = $('div[ng-controller="menuCtr"]').scope();
var login = (menusScope && menusScope.login) || false; var login = (menusScope && menusScope.login) || false;
if (login) { if (login) {
getBookmarks(); getHotBookmarks();
} else { } else {
toastr.remove(); toastr.remove();
$scope.toastrId = toastr.info('想要查看更多热门标签,请先登录!', "提示"); $scope.toastrId = toastr.info('想要查看更多热门标签,请先登录!', "提示");
@ -113,7 +117,19 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
} }
} }
function getBookmarks() { function getHotBookmarks() {
getHotBookmarksbyAPI(); // 先实时获取,实时获取失败再从缓存中获取
var menusScope = $('div[ng-controller="menuCtr"]').scope();
var login = (menusScope && menusScope.login) || false;
var index = login ? 4 : 2;
pubSubService.publish('Common.menuActive', {
login: login,
index: index
});
}
function getHotBookmarksbyAPI() {
$scope.loadBusy = true; $scope.loadBusy = true;
var requireData = { var requireData = {
userId: null, userId: null,
@ -122,7 +138,7 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
pageSize: 1000, pageSize: 1000,
sort: 'desc', sort: 'desc',
renderType: 0, renderType: 0,
date: CurentDate($scope.curDay), date: curentDate($scope.curDay, "yyyy年M月d日"),
idfa: "d4995f8a0c9b2ad9182369016e376278", idfa: "d4995f8a0c9b2ad9182369016e376278",
os: "ios", os: "ios",
osv: "9.3.5" osv: "9.3.5"
@ -144,13 +160,14 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
var b = {}; var b = {};
b.title = bookmark.title; b.title = bookmark.title;
b.url = bookmark.url; b.url = bookmark.url;
b.favicon = bookmark.sourceLogo; b.favicon_url = bookmark.sourceLogo;
b.from = bookmark.sourceName; b.created_by = bookmark.sourceName;
b.image = alterImg;
if (bookmark.imageList.length >= 1) { if (bookmark.imageList.length >= 1) {
b.image = (json.data.pageNo == 1 ? (bookmark.imageList[0].url.match(alterRex) != null ? alterImg : bookmark.imageList[0].url) : alterImg); b.snap_url = (json.data.pageNo == 1 ? (bookmark.imageList[0].url.match(alterRex) != null ? alterImg : bookmark.imageList[0].url) : alterImg);
} else {
b.snap_url = alterImg;
} }
b.click_count = bookmark.favCount; b.fav_count = bookmark.favCount;
b.created_at = $filter('date')(new Date(bookmark.updatetime), "yyyy-MM-dd HH:mm:ss"); b.created_at = $filter('date')(new Date(bookmark.updatetime), "yyyy-MM-dd HH:mm:ss");
b.last_click = $filter('date')(new Date(bookmark.createtime), "yyyy-MM-dd HH:mm:ss"); b.last_click = $filter('date')(new Date(bookmark.createtime), "yyyy-MM-dd HH:mm:ss");
b.id = bookmark.id; b.id = bookmark.id;
@ -160,36 +177,53 @@ app.controller('hotCtr', ['$scope', '$state', '$stateParams', '$filter', '$windo
}) })
$scope.curDay--; $scope.curDay--;
} else { } else {
toastr.error('获取热门书签失败!失败原因:' + json.message, "提示"); toastr.error('获取热门书签失败!失败原因:' + json.message + "。将尝试从缓存中获取!", "提示");
getHotBookmarksbyCache();
} }
}, 100); }, 100);
}, },
error: function(json) { error: function(json) {
toastr.error('获取热门书签失败!失败原因:' + json.message, "提示"); toastr.error('获取热门书签失败!失败原因:' + json.message + "。将尝试从缓存中获取!", "提示");
$scope.loadBusy = false; $scope.loadBusy = false;
getHotBookmarksbyCache();
} }
}); });
var menusScope = $('div[ng-controller="menuCtr"]').scope();
var login = (menusScope && menusScope.login) || false;
var index = login ? 4 : 2;
pubSubService.publish('Common.menuActive', {
login: login,
index: index
});
} }
function CurentDate(i) { function getHotBookmarksbyCache() {
var params = {
date: curentDate($scope.curDay, "yyyyMMdd"),
}
$scope.loadBusy = true;
bookmarkService.getHotBookmarks(params)
.then((data) => {
data.forEach((bookmark) => {
bookmark.created_at = $filter('date')(new Date(bookmark.updatetime), "yyyy-MM-dd HH:mm:ss");
bookmark.last_click = $filter('date')(new Date(bookmark.createtime), "yyyy-MM-dd HH:mm:ss");
bookmark.edit = false;
$scope.bookmarks.push(bookmark);
})
$scope.curDay--;
$scope.loadBusy = false;
})
.catch((err) => {
toastr.error("getHotBookmarksbyCache: " + JSON.stringify(err), "提示");
$scope.curDay--;
$scope.loadBusy = false;
});
}
function curentDate(i, format) {
if (i == undefined) { if (i == undefined) {
i = 0; i = 0;
} }
if (format == undefined) {
format = 'yyyyMMddhhmmss'
}
var now = new Date(); var now = new Date();
now.setTime(now.getTime() + i * 24 * 60 * 60 * 1000); now.setTime(now.getTime() + i * 24 * 60 * 60 * 1000);
var year = now.getFullYear(); //年 clock = $filter('date')(now, format);
var month = now.getMonth() + 1; //月 return clock;
var day = now.getDate(); //日
var clock = year + "年" + month + "月" + day + "日";
return (clock);
} }
function transition() {} function transition() {}

View File

@ -312,6 +312,20 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
}); });
return def.promise; return def.promise;
}, },
getHotBookmarks: function(params) {
var def = $q.defer();
$http.get('/api/hotBookmarks/', {
params: params
})
.success(function(data) {
def.resolve(data);
})
.error(function(data, status) {
def.reject('getHotBookmarks error');
});
return def.promise;
},
}; };
return service; return service;

View File

@ -6,7 +6,7 @@
<div class="content"> <div class="content">
<div class="ui grid"> <div class="ui grid">
<div class="six wide column"> <div class="six wide column">
<img class="bordered" ng-src="{{bookmark.image}}" err-src="./images/snap/default.png"/> <img class="bordered" ng-src="{{bookmark.snap_url}}" err-src="./images/snap/default.png"/>
</div> </div>
<div class="one wide column"></div> <div class="one wide column"></div>
<div class="nine wide column"> <div class="nine wide column">
@ -15,7 +15,7 @@
<div class="column"> <div class="column">
<img <img
class="ui middle aligned mini image" class="ui middle aligned mini image"
ng-src="{{bookmark.favicon}}" ng-src="{{bookmark.favicon_url}}"
style="width:16px;height:16px;padding:0;cursor:pointer;" style="width:16px;height:16px;padding:0;cursor:pointer;"
ng-click="jumpToUrl(bookmark.url, bookmark.id)" ng-click="jumpToUrl(bookmark.url, bookmark.id)"
favicon-err="./images/favicon/{{bookmark.id}}.ico" favicon-err="./images/favicon/{{bookmark.id}}.ico"
@ -32,9 +32,12 @@
</div> </div>
</div> </div>
<div class="two column row"> <div class="two column row">
<div class="column"> <div class="column" ng-if="bookmark.click_count">
<i class="hand pointer icon"></i>点击次数:{{bookmark.click_count}} <i class="hand pointer icon"></i>点击次数:{{bookmark.click_count}}
</div> </div>
<div class="column" ng-if="bookmark.fav_count">
<i class="heart icon"></i>收藏人数:{{bookmark.fav_count}}
</div>
<div class="column"> <div class="column">
<i class="tags icon"></i>书签分类: <i class="tags icon"></i>书签分类:
<div class="ui label" ng-repeat="tag in bookmark.tags"> <div class="ui label" ng-repeat="tag in bookmark.tags">

View File

@ -7,12 +7,12 @@
</div> </div>
</div> </div>
<div class="image hot-image" href="{{ bookmark.url }}" style="cursor:pointer" ng-click="jumpToUrl(bookmark.url)"> <div class="image hot-image" href="{{ bookmark.url }}" style="cursor:pointer" ng-click="jumpToUrl(bookmark.url)">
<img ng-src="{{bookmark.image}}" err-src="./images/snap/default.png" /> <img ng-src="{{bookmark.snap_url}}" err-src="./images/snap/default.png" />
</div> </div>
<div class="extra content" ng-show="!bookmark.edit"> <div class="extra content" ng-show="!bookmark.edit">
<img class="ui avatar image" style="width:16px;height:16px;" ng-src="{{bookmark.favicon}}"> <img class="ui avatar image" style="width:16px;height:16px;" ng-src="{{bookmark.favicon_url}}">
<span class="sourceName">{{ bookmark.from }}</span> <span class="sourceName">{{ bookmark.created_by }}</span>
<span class="favCount">·{{ bookmark.click_count }}人收藏</span> <span class="favCount">·{{ bookmark.fav_count }}人收藏</span>
<i class="ellipsis horizontal icon right floated" style="margin-top:6px;"ng-mouseover="bookmark.edit=true;"></i> <i class="ellipsis horizontal icon right floated" style="margin-top:6px;"ng-mouseover="bookmark.edit=true;"></i>
</div> </div>
<div class="extra content" ng-show="bookmark.edit" ng-mouseleave="bookmark.edit=false;"> <div class="extra content" ng-show="bookmark.edit" ng-mouseleave="bookmark.edit=false;">

View File

@ -344,6 +344,21 @@ api.get('/bookmarks', function(req, res) {
} }
}); });
api.get('/hotBookmarks', function(req, res) {
console.log('hello hotBookmarks', JSON.stringify(req.query), req.session.username);
if (!req.session.user) {
res.send(401);
return;
}
var userId = req.session.user.id;
var params = req.query;
var date = params.date || new Date().format('yyyyMMdd');;
db.hotBookmarks(date)
.then((bookmarks) => {
res.json(bookmarks);
})
.catch((err) => console.log('hotBookmarks err', err))
});
api.get('/bookmarksByTag', function(req, res) { api.get('/bookmarksByTag', function(req, res) {
console.log('hello bookmarksByTag', JSON.stringify(req.query), req.session.username); console.log('hello bookmarksByTag', JSON.stringify(req.query), req.session.username);
@ -1007,9 +1022,9 @@ api.getFaviconByTimer = function() {
}, timeout); }, timeout);
} }
api.getHotBookmarks = function() { api.getHotBookmarksByTimer = function() {
console.log('getHotBookmarks...........'); console.log('getHotBookmarks...........');
var timeout = 1000 * 20; var timeout = 1000 * 60 * 10; // 10分钟更新一遍
var busy = false; var busy = false;
setInterval(function() { setInterval(function() {
if (busy) { if (busy) {
@ -1017,6 +1032,7 @@ api.getHotBookmarks = function() {
return; return;
} }
busy = true; busy = true;
console.log('begin getHotBookmarks...');
var today = new Date(); var today = new Date();
var requireData = { var requireData = {
idfa: "d4995f8a0c9b2ad9182369016e376278", idfa: "d4995f8a0c9b2ad9182369016e376278",
@ -1039,8 +1055,14 @@ api.getHotBookmarks = function() {
form: requireData form: requireData
}, function(error, response, body) { }, function(error, response, body) {
if (response && response.statusCode == 200) { if (response && response.statusCode == 200) {
var inserCnt = 0;
var data = JSON.parse(body).data; var data = JSON.parse(body).data;
var bookmarks = [];
console.log("getHotBookmarks request call back", data.list.length);
if (data.list.length == 0) {
busy = false;
}
data.list.forEach((b) => { data.list.forEach((b) => {
var bookmark = {}; var bookmark = {};
bookmark.id = b.articleId; bookmark.id = b.articleId;
@ -1057,18 +1079,25 @@ api.getHotBookmarks = function() {
bookmark.snap_url = defaultSnap; bookmark.snap_url = defaultSnap;
} }
bookmark.favicon_url = b.sourceLogo || defaultFavicon; bookmark.favicon_url = b.sourceLogo || defaultFavicon;
bookmarks.push(bookmark);
if (bookmarks.length == 1) {
db.addHotBookmark(bookmark)
.then((id) => {
console.log(id);
})
.catch((err) => {
console.log('getHotBookmarks err', err);
});
}
}) db.addHotBookmark(bookmark)
.then((id) => {
inserCnt++;
if (inserCnt == data.list.length) {
busy = false;
}
})
.catch((err) => {
inserCnt++;
console.log('insertHotBookmarks err ', id, err);
if (inserCnt == data.list.length) {
busy = false;
}
});
});
} else {
console.log("HotBookmarks request is error", error, response && response.statusCode);
busy = false;
} }
}); });
}, timeout); }, timeout);

View File

@ -75,9 +75,8 @@ CREATE TABLE `hot_bookmarks` (
`created_by` varchar(64) DEFAULT NULL, -- 创建者(sourceName) `created_by` varchar(64) DEFAULT NULL, -- 创建者(sourceName)
`created_at` bigint DEFAULT 0, -- 创建时间(updatetime) `created_at` bigint DEFAULT 0, -- 创建时间(updatetime)
`last_click` bigint DEFAULT 0, -- 最后一次点击时间(createtime) `last_click` bigint DEFAULT 0, -- 最后一次点击时间(createtime)
`snap_url` varchar(2048) DEFAULT NULL, -- 截图链接(imageList[0]) `snap_url` varchar(1024) DEFAULT NULL, -- 截图链接(imageList[0])
`favicon_url` varchar(2048) DEFAULT NULL, -- icon链接(sourceLogo) `favicon_url` varchar(1024) DEFAULT NULL, -- icon链接(sourceLogo)
`status` tinyint(4) DEFAULT '0', -- 状态 `status` tinyint(4) DEFAULT '0', -- 状态
PRIMARY KEY (`id`), PRIMARY KEY (`id`)
KEY `urlIdx` (`url`)
); );