完成每个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.getSnapByTimer();
api.getFaviconByTimer();
api.getHotBookmarks();
api.getHotBookmarksByTimer();
module.exports = app;

View File

@ -776,26 +776,27 @@ db.updateBookmarkFaviconState = function(id, faviconState) {
}
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) {
client.query(selectSql, (err, result) => {
if (err) {
reject(err);
} else {
if (result.length >= 1) {
resolve(result[0].id);
} else {
client.query(insertSql, (err, result) => {
client.query(sql, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result.insertId);
}
});
}
});
};
db.hotBookmarks = function(date) {
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({
closable: false,
}).modal('setting', 'transition', transition()).modal('show');
bookmark.favicon = bookmark.favicon || ('http://g.soz.im/'+bookmark.url +'/cdn.ico');
bookmark.image = bookmark.image || ('./images/snap/'+bookmark.id+'.png');
bookmark.favicon_url = bookmark.favicon_url || ('http://g.soz.im/'+bookmark.url +'/cdn.ico');
bookmark.snap_url = bookmark.snap_url || ('./images/snap/'+bookmark.id+'.png');
$scope.bookmark = bookmark;
$scope.bookmark.description = $sce.trustAsHtml(bookmark.description);
$scope.content = '';

View File

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

View File

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

View File

@ -312,6 +312,20 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
});
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;

View File

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

View File

@ -7,12 +7,12 @@
</div>
</div>
<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 class="extra content" ng-show="!bookmark.edit">
<img class="ui avatar image" style="width:16px;height:16px;" ng-src="{{bookmark.favicon}}">
<span class="sourceName">{{ bookmark.from }}</span>
<span class="favCount">·{{ bookmark.click_count }}人收藏</span>
<img class="ui avatar image" style="width:16px;height:16px;" ng-src="{{bookmark.favicon_url}}">
<span class="sourceName">{{ bookmark.created_by }}</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>
</div>
<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) {
console.log('hello bookmarksByTag', JSON.stringify(req.query), req.session.username);
@ -1007,9 +1022,9 @@ api.getFaviconByTimer = function() {
}, timeout);
}
api.getHotBookmarks = function() {
api.getHotBookmarksByTimer = function() {
console.log('getHotBookmarks...........');
var timeout = 1000 * 20;
var timeout = 1000 * 60 * 10; // 10分钟更新一遍
var busy = false;
setInterval(function() {
if (busy) {
@ -1017,6 +1032,7 @@ api.getHotBookmarks = function() {
return;
}
busy = true;
console.log('begin getHotBookmarks...');
var today = new Date();
var requireData = {
idfa: "d4995f8a0c9b2ad9182369016e376278",
@ -1039,8 +1055,14 @@ api.getHotBookmarks = function() {
form: requireData
}, function(error, response, body) {
if (response && response.statusCode == 200) {
var inserCnt = 0;
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) => {
var bookmark = {};
bookmark.id = b.articleId;
@ -1057,18 +1079,25 @@ api.getHotBookmarks = function() {
bookmark.snap_url = defaultSnap;
}
bookmark.favicon_url = b.sourceLogo || defaultFavicon;
bookmarks.push(bookmark);
if (bookmarks.length == 1) {
db.addHotBookmark(bookmark)
.then((id) => {
console.log(id);
inserCnt++;
if (inserCnt == data.list.length) {
busy = false;
}
})
.catch((err) => {
console.log('getHotBookmarks err', 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);

View File

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