实时更新点击时间与点击次数

This commit is contained in:
luchenqun 2017-03-20 11:57:37 +08:00
parent 9bebbb40fc
commit cbcc4f7e23
9 changed files with 179 additions and 94 deletions

View File

@ -564,7 +564,11 @@ db.getBookmarksTable = function(params) {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
var bookmarksClickCount, bookmarksCreatedAt, bookmarksLatestClick; var temp = [];
var bookmarks = [];
var begin = (params.currentPage - 1) * params.perPageItems;
var end = params.currentPage * params.perPageItems;
result.sort((a, b) => { result.sort((a, b) => {
var click1 = parseInt(a.click_count); var click1 = parseInt(a.click_count);
var click2 = parseInt(b.click_count); var click2 = parseInt(b.click_count);
@ -576,19 +580,50 @@ db.getBookmarksTable = function(params) {
return 1; return 1;
} }
}) })
bookmarksClickCount = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
result.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); result.sort((a, b) => a.created_at >= b.created_at ? -1 : 1);
bookmarksCreatedAt = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
result.sort((a, b) => a.last_click >= b.last_click ? -1 : 1); result.sort((a, b) => a.last_click >= b.last_click ? -1 : 1);
bookmarksLatestClick = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
var bookmarksData = { var bookmarksData = {
totalItems: result.length, totalItems: result.length,
bookmarksClickCount: bookmarksClickCount, bookmarks: bookmarks,
bookmarksCreatedAt: bookmarksCreatedAt,
bookmarksLatestClick: bookmarksLatestClick,
} }
resolve(bookmarksData); resolve(bookmarksData);
} }
@ -608,7 +643,11 @@ db.getBookmarksByTag = function(params) {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
var bookmarksClickCount, bookmarksCreatedAt, bookmarksLatestClick; var temp = [];
var bookmarks = [];
var begin = (params.currentPage - 1) * params.perPageItems;
var end = params.currentPage * params.perPageItems;
result.sort((a, b) => { result.sort((a, b) => {
var click1 = parseInt(a.click_count); var click1 = parseInt(a.click_count);
var click2 = parseInt(b.click_count); var click2 = parseInt(b.click_count);
@ -620,19 +659,50 @@ db.getBookmarksByTag = function(params) {
return 1; return 1;
} }
}) })
bookmarksClickCount = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
result.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); result.sort((a, b) => a.created_at >= b.created_at ? -1 : 1);
bookmarksCreatedAt = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
result.sort((a, b) => a.last_click >= b.last_click ? -1 : 1); result.sort((a, b) => a.last_click >= b.last_click ? -1 : 1);
bookmarksLatestClick = result.slice((params.currentPage - 1) * params.perPageItems, params.currentPage * params.perPageItems); temp = result.slice(begin, end);
temp.forEach((b1) => {
var find = false;
bookmarks.forEach((b2) => {
if (b1.id == b2.id) {
find = true;
}
})
if (!find) {
bookmarks.push(b1);
}
})
var bookmarksData = { var bookmarksData = {
totalItems: result.length, totalItems: result.length,
bookmarksClickCount: bookmarksClickCount, bookmarks: bookmarks,
bookmarksCreatedAt: bookmarksCreatedAt,
bookmarksLatestClick: bookmarksLatestClick,
} }
resolve(bookmarksData); resolve(bookmarksData);
} }

View File

@ -43,7 +43,7 @@ app.controller('bookmarkInfoCtr', ['$scope', '$state', '$timeout', '$sce', '$win
id: id id: id
}); });
$scope.bookmark.click_count += 1; $scope.bookmark.click_count += 1;
$scope.bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd"); $scope.bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
} }
} }

View File

@ -30,6 +30,7 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
clicked: false, clicked: false,
name: '最多使用' name: '最多使用'
}] }]
var timeagoInstance = timeago();
updateShowStyle(); updateShowStyle();
getBookmarks(); getBookmarks();
@ -58,7 +59,9 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
$scope.bookmarks.forEach(function(bookmark) { $scope.bookmarks.forEach(function(bookmark) {
if (bookmark.id == id) { if (bookmark.id == id) {
bookmark.click_count += 1; bookmark.click_count += 1;
bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd"); bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
$("#time"+bookmark.id).attr('data-timeago', bookmark.last_click);
timeagoInstance.render(document.querySelectorAll("#time"+bookmark.id), 'zh_CN');
} }
}) })
} }
@ -109,15 +112,10 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
var bookmark = $.extend(true, {}, b); // 利用jQuery执行深度拷贝 var bookmark = $.extend(true, {}, b); // 利用jQuery执行深度拷贝
bookmark.own = true; bookmark.own = true;
if ($scope.showStyle == 'navigate') { if ($scope.showStyle == 'navigate') {
bookmark.last_click = bookmark.last_click.substring(0, 10);
bookmark.created_at = bookmark.created_at.substring(0, 10);
bookmark.tags = [{ bookmark.tags = [{
id: bookmark.tag_id, id: bookmark.tag_id,
name: bookmark.tag_name name: bookmark.tag_name
}]; }];
} else if ($scope.showStyle == 'card') {
bookmark.last_click = bookmark.last_click.substring(0, 10);
bookmark.created_at = bookmark.created_at.substring(0, 10);
} }
pubSubService.publish('TagCtr.showBookmarkInfo', bookmark); pubSubService.publish('TagCtr.showBookmarkInfo', bookmark);
bookmarkService.clickBookmark({ bookmarkService.clickBookmark({
@ -183,16 +181,21 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
} }
$scope.order = $scope.order.map(() => false); $scope.order = $scope.order.map(() => false);
$scope.order[index] = true; $scope.order[index] = true;
var begin = ($scope.currentPage - 1) * perPageItems;
var end = $scope.currentPage * perPageItems;
if ($scope.order[0]) { if ($scope.order[0]) {
$scope.bookmarks = $scope.bookmarkData.bookmarksClickCount; $scope.bookmarkData.bookmarks.sort(clickCmp)
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);
} else if ($scope.order[1]) { } else if ($scope.order[1]) {
$scope.bookmarks = $scope.bookmarkData.bookmarksCreatedAt; $scope.bookmarkData.bookmarks.sort((a, b) => a.created_at >= b.created_at ? -1 : 1);
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);
} else { } else {
$scope.bookmarks = $scope.bookmarkData.bookmarksLatestClick; $scope.bookmarkData.bookmarks.sort((a, b) => a.last_click >= b.last_click ? -1 : 1);
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);
} }
$timeout(function() { $timeout(function() {
var timeagoInstance = timeago(); timeagoInstance.cancel();
timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN');
}, 100) }, 100)
} }
@ -209,17 +212,7 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
} else if (index == 1) { } else if (index == 1) {
$scope.bookmarkData.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); $scope.bookmarkData.sort((a, b) => a.created_at >= b.created_at ? -1 : 1);
} else { } else {
$scope.bookmarkData.sort((a, b) => { $scope.bookmarkData.sort(clickCmp)
var click1 = parseInt(a.click_count);
var click2 = parseInt(b.click_count);
if (click1 > click2) {
return -1;
} else if (click1 == click2) {
return a.created_at >= b.created_at ? -1 : 1;
} else {
return 1;
}
})
} }
$scope.bookmarks = $scope.bookmarkData.slice(0, 68); $scope.bookmarks = $scope.bookmarkData.slice(0, 68);
} }
@ -248,7 +241,7 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
if (!params.showStyle) { if (!params.showStyle) {
bookmarkService.userInfo({}) bookmarkService.userInfo({})
.then((user) => { .then((user) => {
$scope.showStyle = user && user.show_style; $scope.showStyle = (user && user.show_style) || 'navigate';
updateShowStyle(); updateShowStyle();
getBookmarks(); // 拿到默认显示风格了,继续取获取书签 getBookmarks(); // 拿到默认显示风格了,继续取获取书签
}) })
@ -363,4 +356,16 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
} }
} }
} }
function clickCmp(a, b){
var click1 = parseInt(a.click_count);
var click2 = parseInt(b.click_count);
if (click1 > click2) {
return -1;
} else if (click1 == click2) {
return a.created_at >= b.created_at ? -1 : 1;
} else {
return 1;
}
}
}]); }]);

View File

@ -21,6 +21,7 @@ app.controller('searchCtr', ['$scope', '$state', '$stateParams', '$filter', '$wi
$scope.loading = false; $scope.loading = false;
$scope.waitDelBookmark = {}; $scope.waitDelBookmark = {};
$scope.searchHotBookmarks = false; $scope.searchHotBookmarks = false;
var timeagoInstance = timeago();
$scope.changeCurrentPage = function(currentPage) { $scope.changeCurrentPage = function(currentPage) {
currentPage = parseInt(currentPage) || 0; currentPage = parseInt(currentPage) || 0;
@ -62,9 +63,11 @@ app.controller('searchCtr', ['$scope', '$state', '$stateParams', '$filter', '$wi
id: id id: id
}); });
$scope.bookmarks.forEach(function(bookmark) { $scope.bookmarks.forEach(function(bookmark) {
if (bookmark.id == id) { if (bookmark.id == id && bookmark.own) {
bookmark.click_count += 1; bookmark.click_count += 1;
bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd"); bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
$("#time"+bookmark.id).attr('data-timeago', bookmark.last_click);
timeagoInstance.render(document.querySelectorAll("#time"+bookmark.id), 'zh_CN');
} }
}) })
} }
@ -274,7 +277,6 @@ app.controller('searchCtr', ['$scope', '$state', '$stateParams', '$filter', '$wi
function transition() { function transition() {
$timeout(function() { $timeout(function() {
var timeagoInstance = timeago();
timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN');
}, 100) }, 100)
var className = 'js-table-search'; var className = 'js-table-search';

View File

@ -22,6 +22,7 @@ app.controller('tagsCtr', ['$scope', '$filter', '$window', '$stateParams', '$tim
$scope.waitDelTag = {}; $scope.waitDelTag = {};
$scope.waitDelBookmark = {}; $scope.waitDelBookmark = {};
$scope.bookmarkData = {}; $scope.bookmarkData = {};
var timeagoInstance = timeago();
pubSubService.subscribe('MenuCtr.tags', $scope, function(event, data) { pubSubService.subscribe('MenuCtr.tags', $scope, function(event, data) {
console.log('subscribe MenuCtr.tags', data); console.log('subscribe MenuCtr.tags', data);
@ -34,15 +35,21 @@ app.controller('tagsCtr', ['$scope', '$filter', '$window', '$stateParams', '$tim
} }
$scope.order = $scope.order.map(() => false); $scope.order = $scope.order.map(() => false);
$scope.order[index] = true; $scope.order[index] = true;
var begin = ($scope.currentPage - 1) * perPageItems;
var end = $scope.currentPage * perPageItems;
if ($scope.order[0]) { if ($scope.order[0]) {
$scope.bookmarks = $scope.bookmarkData.bookmarksClickCount; $scope.bookmarkData.bookmarks.sort(clickCmp)
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);;
} else if ($scope.order[1]) { } else if ($scope.order[1]) {
$scope.bookmarks = $scope.bookmarkData.bookmarksCreatedAt; $scope.bookmarkData.bookmarks.sort((a, b) => a.created_at >= b.created_at ? -1 : 1);
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);;
} else { } else {
$scope.bookmarks = $scope.bookmarkData.bookmarksLatestClick; $scope.bookmarkData.bookmarks.sort((a, b) => a.last_click >= b.last_click ? -1 : 1);
$scope.bookmarks = $scope.bookmarkData.bookmarks.slice(begin, end);;
} }
$timeout(function() { $timeout(function() {
var timeagoInstance = timeago(); timeagoInstance.cancel();
timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN');
}, 100) }, 100)
} }
@ -104,10 +111,12 @@ app.controller('tagsCtr', ['$scope', '$filter', '$window', '$stateParams', '$tim
bookmarkService.clickBookmark({ bookmarkService.clickBookmark({
id: id id: id
}); });
$scope.bookmarks.forEach(function(bookmark) { $scope.bookmarks.forEach(function(bookmark, index) {
if (bookmark.id == id) { if (bookmark.id == id) {
bookmark.click_count += 1; bookmark.click_count += 1;
bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd"); bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss");
$("#time"+bookmark.id).attr('data-timeago', bookmark.last_click);
timeagoInstance.render(document.querySelectorAll("#time"+bookmark.id), 'zh_CN');
} }
}) })
} }
@ -469,4 +478,16 @@ app.controller('tagsCtr', ['$scope', '$filter', '$window', '$stateParams', '$tim
duration: 500, duration: 500,
}); });
} }
function clickCmp(a, b){
var click1 = parseInt(a.click_count);
var click2 = parseInt(b.click_count);
if (click1 > click2) {
return -1;
} else if (click1 == click2) {
return a.created_at >= b.created_at ? -1 : 1;
} else {
return 1;
}
}
}]); }]);

View File

@ -106,7 +106,7 @@
<span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span> <span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span>
</td> </td>
<td> <td>
<span title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span> <span id="time{{bookmark.id}}" title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span>
</td> </td>
<td> <td>
<div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-click="jumpToTags(tag.id)"> <div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-click="jumpToTags(tag.id)">

View File

@ -157,7 +157,7 @@
<span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span> <span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span>
</td> </td>
<td> <td>
<span title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span> <span id="time{{bookmark.id}}" title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span>
</td> </td>
<td> <td>
<div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-if="!searchHotBookmarks"> <div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-if="!searchHotBookmarks">

View File

@ -76,7 +76,7 @@
<span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span> <span title="{{bookmark.created_at}}" class="need_to_be_rendered" data-timeago="{{bookmark.created_at}}"></span>
</td> </td>
<td> <td>
<span title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span> <span id="time{{bookmark.id}}" title="{{bookmark.last_click}}" class="need_to_be_rendered" data-timeago="{{bookmark.last_click}}"></span>
</td> </td>
<td> <td>
<div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-click="getBookmarks(tag.id, 1)"> <div class="ui label" ng-repeat="tag in bookmark.tags" tag-id="{{ tag.id }}" ng-click="getBookmarks(tag.id, 1)">

View File

@ -315,6 +315,8 @@ api.get('/bookmarks', function(req, res) {
tag.bookmarks = []; tag.bookmarks = [];
} }
tag.click += bookmark.click_count; tag.click += bookmark.click_count;
bookmark.created_at = new Date(bookmark.created_at).format("yyyy-MM-dd hh:mm:ss");
bookmark.last_click = new Date(bookmark.last_click).format("yyyy-MM-dd hh:mm:ss");
tag.bookmarks.push(bookmark); tag.bookmarks.push(bookmark);
}); });
if (result && result.length > 0) { if (result && result.length > 0) {
@ -367,19 +369,14 @@ api.get('/bookmarks', function(req, res) {
var tagsBookmarks = []; var tagsBookmarks = [];
var sendData = { var sendData = {
totalItems: 0, totalItems: 0,
bookmarksClickCount: [], bookmarks: [],
bookmarksCreatedAt: [],
bookmarksLatestClick: [],
} }
params.userId = userId; params.userId = userId;
db.getBookmarksTable(params) db.getBookmarksTable(params)
.then((bookmarksData) => { .then((bookmarksData) => {
sendData = bookmarksData; sendData = bookmarksData;
var bookmarkIds = [] var bookmarkIds = sendData.bookmarks.map((bookmark) => bookmark.id)
.concat(sendData.bookmarksClickCount.map((bookmark) => bookmark.id))
.concat(sendData.bookmarksCreatedAt.map((bookmark) => bookmark.id))
.concat(sendData.bookmarksLatestClick.map((bookmark) => bookmark.id))
return db.getTagsBookmarks(bookmarkIds); return db.getTagsBookmarks(bookmarkIds);
}) })
.then((tbs) => { .then((tbs) => {
@ -387,22 +384,20 @@ api.get('/bookmarks', function(req, res) {
return db.getTags(userId); return db.getTags(userId);
}) })
.then((tags) => { .then((tags) => {
var objectName = ['bookmarksClickCount', 'bookmarksCreatedAt', 'bookmarksLatestClick']; sendData.bookmarks.forEach(function(bookmark, index) {
objectName.forEach((name) => { var bookmarkTags = [];
sendData[name].forEach(function(bookmark, index) { tagsBookmarks.forEach(function(tb) {
var bookmarkTags = []; if (tb.bookmark_id == bookmark.id) {
tagsBookmarks.forEach(function(tb) { tags.forEach(function(tag) {
if (tb.bookmark_id == bookmark.id) { if (tb.tag_id == tag.id) {
tags.forEach(function(tag) { bookmarkTags.push(tag)
if (tb.tag_id == tag.id) { }
bookmarkTags.push(tag) })
} }
}) });
} sendData.bookmarks[index].tags = bookmarkTags;
});
sendData[name][index].tags = bookmarkTags;
})
}) })
res.json(sendData); res.json(sendData);
}) })
.catch((err) => console.log('bookmarks table or card err', err)) .catch((err) => console.log('bookmarks table or card err', err))
@ -440,17 +435,12 @@ api.get('/bookmarksByTag', function(req, res) {
var totalItems = 0; var totalItems = 0;
var sendData = { var sendData = {
totalItems: 0, totalItems: 0,
bookmarksClickCount: [], bookmarks: [],
bookmarksCreatedAt: [],
bookmarksLatestClick: [],
} }
db.getBookmarksByTag(params) db.getBookmarksByTag(params)
.then((bookmarksData) => { .then((bookmarksData) => {
sendData = bookmarksData; sendData = bookmarksData;
var bookmarkIds = [] var bookmarkIds = sendData.bookmarks.map((bookmark) => bookmark.id)
.concat(sendData.bookmarksClickCount.map((bookmark) => bookmark.id))
.concat(sendData.bookmarksCreatedAt.map((bookmark) => bookmark.id))
.concat(sendData.bookmarksLatestClick.map((bookmark) => bookmark.id))
return db.getTagsBookmarks(bookmarkIds); return db.getTagsBookmarks(bookmarkIds);
}) })
.then((tbs) => { .then((tbs) => {
@ -459,25 +449,22 @@ api.get('/bookmarksByTag', function(req, res) {
}) })
.then((tags) => { .then((tags) => {
// 获取每个书签的所有分类标签 // 获取每个书签的所有分类标签
var objectName = ['bookmarksClickCount', 'bookmarksCreatedAt', 'bookmarksLatestClick']; sendData.bookmarks.forEach(function(bookmark, index) {
objectName.forEach((name) => { var bookmarkTags = [];
sendData[name].forEach(function(bookmark, index) { tagsBookmarks.forEach(function(tb) {
var bookmarkTags = []; if (tb.bookmark_id == bookmark.id) {
tagsBookmarks.forEach(function(tb) { tags.forEach(function(tag) {
if (tb.bookmark_id == bookmark.id) { if (tb.tag_id == tag.id) {
tags.forEach(function(tag) { bookmarkTags.push(tag)
if (tb.tag_id == tag.id) { }
bookmarkTags.push(tag) })
} }
}) });
} sendData.bookmarks[index].tags = bookmarkTags;
});
sendData[name][index].tags = bookmarkTags;
})
}) })
res.json(sendData); res.json(sendData);
}) })
.catch((err) => console.log('bookmarks table or card err', err)) .catch((err) => console.log('getBookmarksByTag err', err))
}); });