diff --git a/database/db.js b/database/db.js index bb98eb8..df4fb02 100644 --- a/database/db.js +++ b/database/db.js @@ -291,6 +291,20 @@ db.resetPassword = function(userId, password) { }); } +db.updateShowStyle = function(userId, show_style) { + console.log('updateUserLastLogin'); + var sql = "UPDATE `users` SET `show_style` = '" + show_style + "' WHERE(`id` = '" + userId + "')"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result.affectedRows); + } + }); + }); +} + db.register = function(user) { console.log('register'); var sql = "INSERT INTO `users` (`username`, `password`, `email`) VALUES ('" + user.username + "', '" + user.password + "', '" + user.email + "')"; @@ -518,6 +532,24 @@ db.getBookmarksNavigate = function(tags) { }); }; +db.getBookmarksCostomTag = function(user_id) { + console.log('getBookmarksCostomTag'); + var sql1 = "(SELECT id, user_id, title, description, url, public, click_count, DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as created_at, DATE_FORMAT(last_click, '%Y-%m-%d %H:%i:%s') as last_click FROM `bookmarks` WHERE `user_id` = '" + user_id + "' ORDER BY `click_count` DESC LIMIT 0, 68)"; + var sql2 = "(SELECT id, user_id, title, description, url, public, click_count, DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as created_at, DATE_FORMAT(last_click, '%Y-%m-%d %H:%i:%s') as last_click FROM `bookmarks` WHERE `user_id` = '" + user_id + "' ORDER BY `created_at` DESC LIMIT 0, 68)"; + var sql3 = "(SELECT id, user_id, title, description, url, public, click_count, DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s') as created_at, DATE_FORMAT(last_click, '%Y-%m-%d %H:%i:%s') as last_click FROM `bookmarks` WHERE `user_id` = '" + user_id + "' ORDER BY `last_click` DESC LIMIT 0, 68)"; + + var sql = sql1 + " UNION " + sql2 + " UNION " + sql3; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); +}; + db.getBookmarksTable = function(params) { var user_id = params.userId; params.currentPage = params.currentPage || 1; diff --git a/public/scripts/app-angular.js b/public/scripts/app-angular.js index f8ee529..3aa53e1 100644 --- a/public/scripts/app-angular.js +++ b/public/scripts/app-angular.js @@ -10,7 +10,7 @@ app.config(function($stateProvider, $urlRouterProvider, $httpProvider) { url: '/bookmarks', templateUrl: '/views/bookmarks.html', params: { - showStyle: 'navigate', + showStyle: null, }, controller: 'bookmarksCtr' }) diff --git a/public/scripts/controllers/bookmarks-controller.js b/public/scripts/controllers/bookmarks-controller.js index 4bf0b23..519a5e1 100644 --- a/public/scripts/controllers/bookmarks-controller.js +++ b/public/scripts/controllers/bookmarks-controller.js @@ -4,8 +4,8 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' $scope.showSearch = false; // 搜索对话框 $scope.bookmarkNormalHover = false; $scope.bookmarkEditHover = false; - $scope.showStyle = ($stateParams && $stateParams.showStyle) || 'navigate'; // 显示风格'navigate', 'card', 'table' - $('.js-radio-' + $scope.showStyle).checkbox('set checked'); + var menusScope = $('div[ng-controller="menuCtr"]').scope(); + $scope.showStyle = ($stateParams && $stateParams.showStyle) || (menusScope && menusScope.showStyle); // 显示风格'navigate', 'costomTag', 'card', 'table' $scope.edit = false; const perPageItems = 20; var dialog = null; @@ -17,6 +17,22 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' $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: '最多使用' + }] + + updateShowStyle(); + getBookmarks(); $scope.changeCurrentPage = function(currentPage) { currentPage = parseInt(currentPage) || 0; @@ -25,17 +41,12 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' $scope.loadBusy = true; $scope.currentPage = currentPage; $scope.inputPage = ''; - getBookmarks(params); + getBookmarks(); } else { $scope.currentPage = $scope.totalPages } } - var params = { - showStyle: $scope.showStyle, - } - getBookmarks(params); - $scope.jumpToUrl = function(url, id) { if (!$scope.edit) { $window.open(url, '_blank'); @@ -43,7 +54,7 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' id: id }); - if (params.showStyle != 'navigate') { + if ($scope.showStyle != 'navigate') { $scope.bookmarks.forEach(function(bookmark) { if (bookmark.id == id) { bookmark.click_count += 1; @@ -181,91 +192,136 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', ' } } + $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((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; + } + }) + } + $scope.bookmarks = $scope.bookmarkData.slice(0, 68); + } + pubSubService.subscribe('EditCtr.inserBookmarsSuccess', $scope, function(event, data) { console.log('subscribe EditCtr.inserBookmarsSuccess', params); var menusScope = $('div[ng-controller="menuCtr"]').scope(); if (menusScope.login && menusScope.selectLoginIndex == 0) { - params.showStyle = $scope.showStyle; - params.forbidTransition = true; + $scope.showStyle = $scope.showStyle; + $scope.forbidTransition = true; if ($scope.showStyle == 'card') { $scope.currentPage = 1; $scope.bookmarks = []; } - getBookmarks(params); + getBookmarks(); } }); - function getBookmarks(params) { - if (params.showStyle != 'navigate') { - params.currentPage = $scope.currentPage; - params.perPageItems = perPageItems; - } + function getBookmarks() { + var params = {} + params.showStyle = $scope.showStyle + params.currentPage = $scope.currentPage; + params.perPageItems = perPageItems; - var sendData = { - totalItems: 0, - bookmarksClickCount: [], - bookmarksCreatedAt: [], - bookmarksLatestClick: [], - } - - 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') { - data.bookmarksCreatedAt.forEach(bookmark => { - bookmark.edit = false; - $scope.bookmarks.push(bookmark); - }) - $scope.loadBusy = false; - } 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: 0 + if (!params.showStyle) { + bookmarkService.userInfo({}) + .then((user) => { + $scope.showStyle = user && user.show_style; + updateShowStyle(); + getBookmarks(); // 拿到默认显示风格了,继续取获取书签 + }) + .catch((err) => { + toastr.error('获取信息失败。错误信息:' + JSON.stringify(err), "错误"); }); - if (!(params.forbidTransition && params.forbidTransition == true)) { - transition(); - } - }) - .catch((err) => console.log('getBookmarks err', err)); + } else { + 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') { + data.bookmarksCreatedAt.forEach(bookmark => { + bookmark.edit = false; + $scope.bookmarks.push(bookmark); + }) + $scope.loadBusy = false; + } else if (params.showStyle == 'costomTag') { + $scope.costomTags.forEach((tag) => { + console.log('tag', 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: 0 + }); + if (!($scope.forbidTransition && $scope.forbidTransition == true)) { + transition(); + } + }) + .catch((err) => console.log('getBookmarks err', err)); + } } + 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'); + } + }, 100) + } function transition() { if ($scope.showStyle == 'card' && $scope.currentPage > 1) { return; } - 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' - ]; - var t = data[parseInt(Math.random() * 1000) % data.length]; - 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: t, + animation: animation(), duration: 500, }); } diff --git a/public/scripts/controllers/home-controller.js b/public/scripts/controllers/home-controller.js index ec07259..83dc6bb 100644 --- a/public/scripts/controllers/home-controller.js +++ b/public/scripts/controllers/home-controller.js @@ -8,7 +8,7 @@ app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$wind 'login': data.logined, }); $state.go('bookmarks', { - showStyle: 'navigate', + showStyle: (data.user && data.user.show_style) || 'costomTag', }) toastr.success('自动登陆成功,系统将自动跳转到主页', "提示"); } else { diff --git a/public/scripts/controllers/menus-controller.js b/public/scripts/controllers/menus-controller.js index 59ddfa2..309d7cb 100644 --- a/public/scripts/controllers/menus-controller.js +++ b/public/scripts/controllers/menus-controller.js @@ -4,6 +4,7 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService', $scope.selectLoginIndex = 0; /**< 默认登陆之后的选择的菜单索引,下表从 0 开始 */ $scope.selectNotLoginIndex = 0; /**< 默认未登陆之后的选择的菜单索引,下表从 0 开始 */ $scope.searchWord = ''; /**< 搜索关键字 */ + $scope.showStyle = null; // 防止在登陆的情况下,在浏览器里面直接输入url,这时候要更新菜单选项 pubSubService.subscribe('Common.menuActive', $scope, function(event, params) { console.log("subscribe Common.menuActive", params) @@ -49,15 +50,16 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService', $scope.searchBookmarks = function(searchWord) { $state.go('search', { searchWord: searchWord, - },{ - reload:true, + }, { + reload: true, }) $scope.login = true; updateMenuActive($scope.selectLoginIndex = 0); } $scope.updateShowStyle = function(showStyle) { - console.log('updateShowStyle', showStyle) + console.log('updateShowStyle', showStyle); + $scope.showStyle = showStyle; $('.js-radio-' + showStyle).checkbox('set checked'); $state.go('bookmarks', { showStyle: showStyle, @@ -70,10 +72,7 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService', }); } $scope.logout = function() { - var params = { - userName: 'luchenqun' - }; - bookmarkService.logout(params) + bookmarkService.logout({}) .then((data) => { console.log('logout..........', data) $scope.login = false; diff --git a/public/scripts/controllers/settings-controller.js b/public/scripts/controllers/settings-controller.js index 0e24ead..8ef69d4 100644 --- a/public/scripts/controllers/settings-controller.js +++ b/public/scripts/controllers/settings-controller.js @@ -10,32 +10,39 @@ app.controller('settingsCtr', ['$scope', '$stateParams', '$filter', '$state', '$ $scope.form[($stateParams && $stateParams.formIndex) || 0] = true; $scope.changeForm = function(index) { + console.log("changeForm = ", index); $scope.form = $scope.form.map(() => false); $scope.form[index] = true; - if (index == 1) { + if (index <= 1) { bookmarkService.userInfo({}) .then((data) => { $scope.user = data; + if (index == 0) { + updateShowStyle($scope.user && $scope.user.show_style); + } }) .catch((err) => { toastr.error('获取信息失败。错误信息:' + JSON.stringify(err), "错误"); }); - - bookmarkService.getTags({}) - .then((data) => { - $scope.tagCnt = data.length; - $scope.bookmarkCnt = 0; - data.forEach((tag) => { - $scope.bookmarkCnt += tag.cnt; + if (index == 1) { + bookmarkService.getTags({}) + .then((data) => { + $scope.tagCnt = data.length; + $scope.bookmarkCnt = 0; + data.forEach((tag) => { + $scope.bookmarkCnt += tag.cnt; + }) }) - }) - .catch((err) => { - console.log('getTags err', err); - }); + .catch((err) => { + console.log('getTags err', err); + }); + } } } + $scope.changeForm($scope.form.indexOf(true)); // 马上调用一次 + $scope.resetPassword = function() { if (!$scope.passwordOrgin || !$scope.passwordNew1 || !$scope.passwordNew2) { toastr.error('原密码跟新密码不能为空', "错误"); @@ -51,12 +58,18 @@ app.controller('settingsCtr', ['$scope', '$stateParams', '$filter', '$state', '$ bookmarkService.resetPassword(parmes) .then((data) => { if (data.retCode == 0) { - toastr.success('密码更新成功', "提示"); - pubSubService.publish('Common.menuActive', { - login: false, - index: 0 - }); - $state.go('/', {}); + toastr.success('密码更新成功,请重新登陆!', "提示"); + // 注销登陆 + bookmarkService.logout({}) + .then((data) => { + console.log('logout..........', data) + pubSubService.publish('Common.menuActive', { + login: false, + index: 1 + }); + $state.go('login', {}) + }) + .catch((err) => console.log('logout err', err)); } else { toastr.error('密码更新失败。错误信息:' + data.msg, "错误"); } @@ -69,6 +82,33 @@ app.controller('settingsCtr', ['$scope', '$stateParams', '$filter', '$state', '$ } } + $scope.updateDefaultShowStyle = function(showStyle) { + console.log(showStyle) + var parmes = { + showStyle: showStyle, + }; + bookmarkService.updateShowStyle(parmes) + .then((data) => { + if (data.retCode == 0) { + toastr.success('书签默认显示风格配置更新成功', "提示"); + } else { + toastr.error('书签默认显示风格配置。错误信息:' + data.msg, "错误"); + } + }) + .catch((err) => { + toastr.error('书签默认显示风格配置。错误信息:' + JSON.stringify(err), "错误"); + }); + } + + function updateShowStyle(showStyle) { + setTimeout(function() { + if (showStyle) { + $('.js-default-show-style' + ' .radio.checkbox').checkbox('set unchecked'); + $('.js-radio-default-' + showStyle).checkbox('set checked'); + } + }, 100) + } + setTimeout(function() { $("#fileuploader").uploadFile({ url: "/api/uploadBookmarkFile", @@ -95,7 +135,6 @@ app.controller('settingsCtr', ['$scope', '$stateParams', '$filter', '$state', '$ $(".ui.pointing.menu .item").removeClass("selected"); }, 500); - pubSubService.publish('Common.menuActive', { login: true, index: 3 diff --git a/public/scripts/services/bookmark-service.js b/public/scripts/services/bookmark-service.js index 3714775..5ec00d3 100644 --- a/public/scripts/services/bookmark-service.js +++ b/public/scripts/services/bookmark-service.js @@ -300,6 +300,19 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) { }); return def.promise; }, + updateShowStyle: function(params) { + var def = $q.defer(); + $http.post('/api/updateShowStyle/', { + params: params + }) + .success(function(data) { + def.resolve(data); + }) + .error(function(data) { + def.reject('updateShowStyle error'); + }); + return def.promise; + }, getAdvices: function getAdvices(params) { var def = $q.defer(); $http.get('/api/advices/', { diff --git a/public/views/bookmarks.html b/public/views/bookmarks.html index e1b243f..2822f18 100644 --- a/public/views/bookmarks.html +++ b/public/views/bookmarks.html @@ -47,6 +47,37 @@
+