-
-
- 您可以将您的IE浏览器或者谷歌浏览器上面的书签导入系统!现在就去 -
- 您也可以点击菜单栏上面的图标进行添加。也可以使用快捷键:Insert键打开添加页面,再次按Insert键保存书签,Esc取消添加。 -
diff --git a/www/scripts/controllers/bookmarks-controller.js b/www/scripts/controllers/bookmarks-controller.js index 05c56ba..3a67b8b 100644 --- a/www/scripts/controllers/bookmarks-controller.js +++ b/www/scripts/controllers/bookmarks-controller.js @@ -4,406 +4,4 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' $window.location = "http://m.mybookmark.cn/#/tags"; return; } - - $scope.bookmarks = []; // 书签数据 - $scope.showSearch = false; // 搜索对话框 - $scope.bookmarkNormalHover = false; - $scope.bookmarkEditHover = false; - $scope.hoverBookmark = null; - var menusScope = $('div[ng-controller="menuCtr"]').scope(); - $scope.showStyle = ($stateParams && $stateParams.showStyle) || (menusScope && menusScope.showStyle); // 显示风格'navigate', 'costomTag', 'card', 'table' - const perPageItems = 20; - var dialog = null; - $scope.totalPages = 0; - $scope.currentPage = 1; - $scope.inputPage = ''; - $scope.loadBusy = false; - $scope.waitDelBookmark = {}; - $scope.order = [false, false, false]; - $scope.order[($stateParams && $stateParams.orderIndex) || 0] = true; - $scope.bookmarkData = {}; - $scope.costomTags = [{ - index: 0, - clicked: true, - name: '最近使用' - }, { - index: 1, - clicked: false, - name: '最近添加' - }, { - index: 2, - clicked: false, - name: '最多使用' - }] - var timeagoInstance = timeago(); - - updateShowStyle(); - getBookmarks(); - - $scope.changeCurrentPage = function (currentPage) { - currentPage = parseInt(currentPage) || 0; - console.log('currentPage = ', currentPage); - if (currentPage <= $scope.totalPages && currentPage >= 1) { - $scope.currentPage = currentPage; - $scope.inputPage = ''; - getBookmarks(); - } else { - $scope.currentPage = $scope.totalPages - } - } - - $scope.jumpToUrl = async function (url, id) { - $window.open(url, '_blank'); - await post("clickBookmark", { id }); - - - if ($scope.showStyle != 'navigate') { - var bookmarks = $scope.showStyle == 'table' ? $scope.bookmarkData.bookmarks : $scope.bookmarkData; - bookmarks.forEach(function (bookmark) { - if (bookmark.id == id) { - bookmark.click_count += 1; - bookmark.last_click = $filter("date")(new Date(), "yyyy-MM-dd HH:mm:ss"); - } - }) - } else { - - } - - $timeout(function () { - timeagoInstance.cancel(); - timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); - }, 100) - } - - $scope.delBookmark = function (bookmark) { - console.log('delBookmark..........') - $scope.waitDelBookmark = $.extend(true, {}, bookmark); // 利用jQuery执行深度拷贝 - dialog = ngDialog.open({ - template: './views/dialog-del-bookmark.html', - className: 'ngdialog-theme-default', - scope: $scope - }); - } - - $scope.confirmDelBookmark = function (bookmarkId) { - var params = { - id: bookmarkId - } - ngDialog.close(dialog); - bookmarkService.delBookmark(params) - .then((data) => { - $("#" + bookmarkId).transition({ - animation: dataService.animation(), - duration: 500, - onComplete: function () { - $("#" + bookmarkId).remove(); - } - }); - toastr.success($scope.waitDelBookmark.title + ' 书签删除成功!', "提示"); - }) - .catch((err) => { - toastr.error($scope.waitDelBookmark.title + ' 书签删除失败!错误提示:' + JSON.stringify(err), "提示"); - }); - } - - $scope.editBookmark = function (id) { - pubSubService.publish('bookmarksCtr.editBookmark', { id }); - } - - $scope.detailBookmark = async function (b) { - var bookmark = $.extend(true, {}, b); // 利用jQuery执行深度拷贝 - bookmark.own = true; - if ($scope.showStyle == 'navigate') { - bookmark.tags = [{ - id: bookmark.tag_id, - name: bookmark.tag_name - }]; - } - pubSubService.publish('TagCtr.showBookmarkInfo', bookmark); - await post("clickBookmark", { id: bookmark.id }); - } - - $scope.copy = function (url) { - dataService.clipboard(url); - } - - $scope.jumpToTags = function (tagId) { - $state.go('tags', { - tagId: tagId, - }) - } - - $scope.addBookmarkbyFile = function () { - console.log("addBookmarkbyFile"); - $state.go('settings', { - formIndex: 2, - }); - pubSubService.publish('Common.menuActive', { - login: true, - index: dataService.LoginIndexSettings - }); - } - - $scope.closeMsg = function () { - $('.js-msg').transition({ - animation: dataService.animation(), - duration: '500ms', - onComplete: function () { - $(".js-msg").remove(); - } - }); - } - - $scope.loadCardData = function () { - console.log('loadCardData.........') - if (!$scope.loadBusy) { - $scope.changeCurrentPage($scope.currentPage += 1) - } - } - - $scope.changeOrder = function (index) { - if (index < 0 || index >= $scope.order.length) { - return; - } - $scope.order = $scope.order.map(() => false); - $scope.order[index] = true; - $scope.bookmarks = []; - if ($scope.order[0]) { - $scope.bookmarkData.bookmarks.sort(clickCmp) - $scope.bookmarkData.bookmarks.forEach((bookmark) => { - if (bookmark.type == 1) { - $scope.bookmarks.push(bookmark); - } - }) - } else if ($scope.order[1]) { - $scope.bookmarkData.bookmarks.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); - $scope.bookmarkData.bookmarks.forEach((bookmark) => { - if (bookmark.type == 2) { - $scope.bookmarks.push(bookmark); - } - }) - } else { - $scope.bookmarkData.bookmarks.sort((a, b) => a.last_click >= b.last_click ? -1 : 1); - $scope.bookmarkData.bookmarks.forEach((bookmark) => { - if (bookmark.type == 3) { - $scope.bookmarks.push(bookmark); - } - }) - } - $timeout(function () { - timeagoInstance.cancel(); - timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); - }, 100) - } - - $scope.updateCostomTagBookmarks = function (index) { - console.log('updateCostomTagBookmarks index = ' + index); - $scope.costomTags.forEach((tag, i) => { - $scope.costomTags[i].clicked = false; - }) - $scope.costomTags[index].clicked = true; - - if (index == 0) { - $scope.bookmarkData.sort((a, b) => a.last_click >= b.last_click ? -1 : 1); - } else if (index == 1) { - $scope.bookmarkData.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); - } else { - $scope.bookmarkData.sort(clickCmp) - } - $scope.bookmarks = $scope.bookmarkData.slice(0, 79); - } - - pubSubService.subscribe('EditCtr.inserBookmarsSuccess', $scope, function (event, data) { - console.log('subscribe EditCtr.inserBookmarsSuccess', JSON.stringify(data)); - - var menusScope = $('div[ng-controller="menuCtr"]').scope(); - if (menusScope.login && menusScope.selectLoginIndex == 0) { - $scope.forbidTransition = true; - if ($scope.showStyle == 'card') { - var find = false; - $scope.bookmarks.forEach((bookmark) => { - if (bookmark.id == data.id) { - bookmark.title = data.title; - bookmark.url = data.url; - bookmark.tags = data.tags; - bookmark.description = data.description; - find = true; - } - }) - if (!find) { - $scope.bookmarks.unshift(data); - $timeout(function () { - timeagoInstance.cancel(); - timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); - }, 100) - } - } else { - $scope.forbidTransition = true; - getBookmarks(); - } - } - }); - - $scope.setHoverBookmark = function (bookmark) { - $scope.hoverBookmark = bookmark; - } - - // 在输入文字的时候也会触发,所以不要用Ctrl,Shift之类的按键 - $document.bind("keydown", function (event) { - $scope.$apply(function () { - var key = event.key.toUpperCase(); - console.log(key); - if ($scope.hoverBookmark && dataService.keyShortcuts()) { - if (key == 'E') { - $scope.editBookmark($scope.hoverBookmark.id) - } else if (key == 'I') { - $scope.detailBookmark($scope.hoverBookmark) - } else if (key == 'D') { - $scope.delBookmark($scope.hoverBookmark) - } else if (key == 'C') { - $scope.copy($scope.hoverBookmark.url) - } - } - }) - }); - - async function getBookmarks() { - var params = {} - params.showStyle = $scope.showStyle - params.currentPage = $scope.currentPage; - params.perPageItems = perPageItems; - - if (!params.showStyle) { - bookmarkService.userInfo({}) - .then((user) => { - $scope.showStyle = (user && user.show_style) || 'navigate'; - updateShowStyle(); - getBookmarks(); // 拿到默认显示风格了,继续取获取书签 - }) - .catch((err) => dataService.netErrorHandle(err, $state)); - } else { - $scope.loadBusy = true; - if (params.showStyle == 'table' && (!$scope.forbidTransition)) { - $('.js-table-bookmarks').transition('hide'); - } - bookmarkService.getBookmarks(params) - .then((data) => { - if (params.showStyle != 'navigate') { - $scope.bookmarkData = data; - $scope.totalPages = Math.ceil(data.totalItems / perPageItems); - if (data.totalItems == 0) { - toastr.info('您还没有书签,请点击菜单栏的添加按钮进行添加', "提示"); - } - if (params.showStyle == 'card') { - $scope.bookmarkData.bookmarks.sort((a, b) => a.created_at >= b.created_at ? -1 : 1); - $scope.bookmarkData.bookmarks.forEach(bookmark => { - if (bookmark.type == 2) { - bookmark.edit = false; - $scope.bookmarks.push(bookmark); - } - }) - $timeout(function () { - timeagoInstance.cancel(); - timeagoInstance.render(document.querySelectorAll('.need_to_be_rendered'), 'zh_CN'); - }, 100) - } else if (params.showStyle == 'costomTag') { - $scope.costomTags.forEach((tag) => { - if (tag.clicked) { - $scope.updateCostomTagBookmarks(tag.index) - } - }) - } else { - $scope.changeOrder($scope.order.indexOf(true)); - } - } else { - $scope.bookmarks = data; - if ($scope.bookmarks.length <= 2) { - $(".js-msg").removeClass("hidden"); - } - if ($scope.bookmarks.length == 0) { - toastr.info('您还没有书签,请点击菜单栏的添加按钮进行添加', "提示"); - } - } - - pubSubService.publish('Common.menuActive', { - login: true, - index: dataService.LoginIndexBookmarks - }); - if (!$scope.forbidTransition) { - transition(); - } - $scope.forbidTransition = false; - $scope.loadBusy = false; - }) - .catch((err) => { - dataService.netErrorHandle(err, $state); - $scope.loadBusy = false; - }); - } - } - - function updateShowStyle() { - $timeout(function () { - if ($scope.showStyle) { - $('.js-bookmark-dropdown' + ' .radio.checkbox').checkbox('set unchecked'); - $('.js-radio-' + $scope.showStyle).checkbox('set checked'); - $('.js-bookmark-dropdown' + ' .field.item').removeClass('active selected'); - $('.js-field-' + $scope.showStyle).addClass('active selected'); - } - }, 1000) - } - - function transition() { - if ($scope.showStyle == 'card' && $scope.currentPage > 1) { - return; - } - var className = 'js-segment-navigate'; - if ($scope.showStyle == 'card') { - className = 'js-segment-card' - } else if ($scope.showStyle == 'table') { - className = 'js-table-bookmarks' - } else if ($scope.showStyle == 'costomTag') { - className = 'js-segment-costomTag' - } - $('.' + className).transition('hide'); - $('.' + className).transition({ - animation: dataService.animation(), - duration: 500, - }); - } - - // TODO: 我要将编辑按钮固定在容器的右上角 - $(window).resize(updateEditPos); - updateEditPos(); - - function updateEditPos() { - if ($scope.showStyle == 'navigate') { - for (var i = 1; i <= 100; i += 10) { - setTimeout(function () { - var offset = $('.js-segment-navigate').offset(); - if (offset) { - var t = offset.top; - var l = offset.left; - var w = $('.js-segment-navigate').width(); - $('.js-bookmark-edit').offset({ - top: t + 10, - left: l + w - 10, - }) - } - }, 100 * i) - } - } - } - - 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; - } - } }]); diff --git a/www/scripts/services/data-service.js b/www/scripts/services/data-service.js index da80010..d0e45b6 100644 --- a/www/scripts/services/data-service.js +++ b/www/scripts/services/data-service.js @@ -1,165 +1,165 @@ -app.factory('dataService', [function () { - const service = { - // 登陆索引 - LoginIndexBookmarks: 0, - LoginIndexTags: 1, - LoginIndexNote: 2, - LoginIndexHot: 3, - LoginIndexSettings: 4, - LoginIndexAdvice: 5, - LoginIndexPraise: 6, - - // 非登陆索引 - NotLoginIndexHome: 0, - NotLoginIndexLogin: 1, - NotLoginIndexHot: 2, - NotLoginIndexPraise: 3, - - loginMenus: [{ - uiSref: 'bookmarks', - title: '书签' - }, { - uiSref: 'tags', - title: '分类' - }, { - uiSref: 'note', - title: '备忘' - }, { - uiSref: 'weixin-article', - title: '热门' - }, { - uiSref: 'settings', - title: '设置' - }, { - uiSref: 'advice', - title: '留言' - }], - notLoginMenus: [{ - uiSref: '/', - title: '首页' - }, { - uiSref: 'login', - title: '登录' - }, { - uiSref: 'weixin-article', - title: '热门' - }], - animationIndex: 0, - animation: function () { - var data = ['scale', 'fade', 'fade up', 'fade down', 'fade left', 'fade right', 'horizontal flip', - 'vertical flip', 'drop', 'fly left', 'fly right', 'fly up', 'fly down', 'swing left', 'swing right', 'swing up', 'swing down', - 'browse', 'browse right', 'slide down', 'slide up', 'slide left', 'slide right', 'jiggle', 'shake', 'pulse', 'tada', 'bounce' - ]; - - var t = data[parseInt(Math.random() * 1000) % data.length]; - return 'fade' || t; // 去掉一些有攻击性的动画 - }, - transition: function (selector, params) { - var data = {}; - data.animation = (params && params.animation) ? params.animation : service.animation(); - data.duration = (params && params.duration) ? params.duration : 500; - data.onComplete = function () { - if (params) { - if (params.state == 'hide') { - $(selector).hide(); - } else if (params.state == 'show') { - $(selector).show(); - } else if (params.state == 'remove') { - $(selector).remove(); - } else { - $(selector).show(); - } - params.cb && params.cb(); // 完成之后回调! - } else { - $(selector).show(); - } - - } - $(selector).transition('hide'); // 不管怎样,先隐藏 - $(selector).transition(data); //这个执行完之后一定是show - - return $(selector).length >= 1; - }, - historyTypes: ['书签', '谷歌', 'Github', '栈溢出', '百度', '备忘录'], - showStyles: ['navigate', 'costomTag', 'card', 'table'], - forbidQuickKey: { - 'A': '在任意界面,已用做新增备忘录', - 'C': '在有关书签页面,用作复制书签链接', - 'E': '在有关书签页面,用作编辑书签', - 'D': '在有关书签页面,用作删除书签', - 'I': '在有关书签页面,用作查看书签详情', - 'R': '在热门收藏界面,已用作随机查看热门收藏', - 'S': '在任意界面,已用做快速进入搜索页面', - 'INSERT': '全局页面,已用做添加书签', - 'ESC': '全局页面,已用做退出弹窗', - ',': '跳转到分类定制点击次数', - '.': '跳转到分类定制添加日期', - '/': '跳转到分类定制最后点击', - }, - keyShortcuts: function () { // 判断快捷方式是否生效 - var ret = true; - var menusScope = $('div[ng-controller="menuCtr"]').scope(); - var login = (menusScope && menusScope.login); - var longPress = (menusScope && menusScope.longPress); - - if (login && (!longPress)) { - do { - // 如果有对话框(删除,备忘录详情等) - ret = $(".ngdialog").length == 0; - if (!ret) break; - - // 如果有对话框(新增书签,更新书签,书签详情) - ret = $(".ui.modals.visible").length == 0; - if (!ret) break; - - // 输入框是否聚焦 - ret = !($('input').is(':focus')); - if (!ret) break; - - // textarea 是否聚焦 - ret = !($('textarea').is(':focus')); - if (!ret) break; - - } while (false); - } else { - ret = false; - } - - return ret; - }, - clipboard: function (text) { - $("#clipboard").attr("data-clipboard-text", text); - document.getElementById("clipboard").click(); - }, - smallDevice: function () { - var u = navigator.userAgent; - var app = navigator.appVersion; - var device = { //移动终端浏览器版本信息 - trident: u.indexOf('Trident') > -1, //IE内核 - presto: u.indexOf('Presto') > -1, //opera内核 - webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 - gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 - mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 - ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 - android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 - iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器 - iPad: u.indexOf('iPad') > -1, //是否iPad - webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 - }; - - if ((device.mobile && !device.iPad) || (screen && screen.availWidth < 768)) { - return true; - } - - return false; - }, - netErrorHandle(err, $state) { - if (err == "Unauthorized") { - $state.go("login"); - toastr.error('您好像没有登陆,或者登陆session过期了,请重新登陆!', "提示"); - } - } - }; - - return service; -}]); +app.factory('dataService', [function () { + const service = { + // 登陆索引 + LoginIndexBookmarks: 0, + LoginIndexTags: 1, + LoginIndexNote: 2, + LoginIndexHot: 3, + LoginIndexSettings: 4, + LoginIndexAdvice: 5, + LoginIndexPraise: 6, + + // 非登陆索引 + NotLoginIndexHome: 0, + NotLoginIndexLogin: 1, + NotLoginIndexHot: 2, + NotLoginIndexPraise: 3, + + loginMenus: [{ + uiSref: 'bookmarks', + title: '导航' + }, { + uiSref: 'tags', + title: '分类' + }, { + uiSref: 'note', + title: '备忘' + }, { + uiSref: 'weixin-article', + title: '热门' + }, { + uiSref: 'settings', + title: '设置' + }, { + uiSref: 'advice', + title: '留言' + }], + notLoginMenus: [{ + uiSref: '/', + title: '首页' + }, { + uiSref: 'login', + title: '登录' + }, { + uiSref: 'weixin-article', + title: '热门' + }], + animationIndex: 0, + animation: function () { + var data = ['scale', 'fade', 'fade up', 'fade down', 'fade left', 'fade right', 'horizontal flip', + 'vertical flip', 'drop', 'fly left', 'fly right', 'fly up', 'fly down', 'swing left', 'swing right', 'swing up', 'swing down', + 'browse', 'browse right', 'slide down', 'slide up', 'slide left', 'slide right', 'jiggle', 'shake', 'pulse', 'tada', 'bounce' + ]; + + var t = data[parseInt(Math.random() * 1000) % data.length]; + return 'fade' || t; // 去掉一些有攻击性的动画 + }, + transition: function (selector, params) { + var data = {}; + data.animation = (params && params.animation) ? params.animation : service.animation(); + data.duration = (params && params.duration) ? params.duration : 500; + data.onComplete = function () { + if (params) { + if (params.state == 'hide') { + $(selector).hide(); + } else if (params.state == 'show') { + $(selector).show(); + } else if (params.state == 'remove') { + $(selector).remove(); + } else { + $(selector).show(); + } + params.cb && params.cb(); // 完成之后回调! + } else { + $(selector).show(); + } + + } + $(selector).transition('hide'); // 不管怎样,先隐藏 + $(selector).transition(data); //这个执行完之后一定是show + + return $(selector).length >= 1; + }, + historyTypes: ['书签', '谷歌', 'Github', '栈溢出', '百度', '备忘录'], + showStyles: ['navigate', 'costomTag', 'card', 'table'], + forbidQuickKey: { + 'A': '在任意界面,已用做新增备忘录', + 'C': '在有关书签页面,用作复制书签链接', + 'E': '在有关书签页面,用作编辑书签', + 'D': '在有关书签页面,用作删除书签', + 'I': '在有关书签页面,用作查看书签详情', + 'R': '在热门收藏界面,已用作随机查看热门收藏', + 'S': '在任意界面,已用做快速进入搜索页面', + 'INSERT': '全局页面,已用做添加书签', + 'ESC': '全局页面,已用做退出弹窗', + ',': '跳转到分类定制点击次数', + '.': '跳转到分类定制添加日期', + '/': '跳转到分类定制最后点击', + }, + keyShortcuts: function () { // 判断快捷方式是否生效 + var ret = true; + var menusScope = $('div[ng-controller="menuCtr"]').scope(); + var login = (menusScope && menusScope.login); + var longPress = (menusScope && menusScope.longPress); + + if (login && (!longPress)) { + do { + // 如果有对话框(删除,备忘录详情等) + ret = $(".ngdialog").length == 0; + if (!ret) break; + + // 如果有对话框(新增书签,更新书签,书签详情) + ret = $(".ui.modals.visible").length == 0; + if (!ret) break; + + // 输入框是否聚焦 + ret = !($('input').is(':focus')); + if (!ret) break; + + // textarea 是否聚焦 + ret = !($('textarea').is(':focus')); + if (!ret) break; + + } while (false); + } else { + ret = false; + } + + return ret; + }, + clipboard: function (text) { + $("#clipboard").attr("data-clipboard-text", text); + document.getElementById("clipboard").click(); + }, + smallDevice: function () { + var u = navigator.userAgent; + var app = navigator.appVersion; + var device = { //移动终端浏览器版本信息 + trident: u.indexOf('Trident') > -1, //IE内核 + presto: u.indexOf('Presto') > -1, //opera内核 + webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 + gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 + mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 + ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 + android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 + iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器 + iPad: u.indexOf('iPad') > -1, //是否iPad + webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 + }; + + if ((device.mobile && !device.iPad) || (screen && screen.availWidth < 768)) { + return true; + } + + return false; + }, + netErrorHandle(err, $state) { + if (err == "Unauthorized") { + $state.go("login"); + toastr.error('您好像没有登陆,或者登陆session过期了,请重新登陆!', "提示"); + } + } + }; + + return service; +}]); diff --git a/www/views/bookmarks.html b/www/views/bookmarks.html index 8520d8b..df584d4 100644 --- a/www/views/bookmarks.html +++ b/www/views/bookmarks.html @@ -1,135 +1,3 @@ -
-| 标题 | -链接 | -点击次数 | -创建日期 | -最后点击 | -分类 | -操作 | -
|---|---|---|---|---|---|---|
|
- |
- - {{ bookmark.url }} - | -{{ bookmark.click_count }} | -- - | -- - | -
-
- {{ tag.name }}
-
- |
-
- |
-
|
- |
- ||||||