基本能用了

This commit is contained in:
luchenqun 2016-11-13 21:48:06 +08:00
parent eb0322f509
commit 67c93c4b68
19 changed files with 417 additions and 416 deletions

1
public/css/externe/toastr.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -53,3 +53,12 @@ body {
.js-navigate-bookmark a{
color:#212121;
}
.ui.menu .selected.item {
background: rgba(1, 1, 1, 0.05);
}
img.operator{
width:16px;
height:16px
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

BIN
public/images/detail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

View File

@ -1,47 +1,47 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="bookmark">
<meta name="author" content="luchenqun">
<title>我的书签</title>
<link href="/css/externe/semantic.min.css " rel="stylesheet" />
<link href="/css/externe/calendar.min.css" rel="stylesheet" />
<link href="/css/style.css " rel="stylesheet" />
<base href="/">
</head>
<body ng-app="bookmarkApp">
<div class="ui container ">
<!-- directive菜单 -->
<menus></menus>
<div class="ui container" style="width:100%;height:20px"></div>
<div class="ui container">
<div ui-view></div>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="bookmark">
<meta name="author" content="luchenqun">
<title>我的书签</title>
<link href="/css/externe/semantic.min.css " rel="stylesheet"/>
<link href="/css/externe/calendar.min.css" rel="stylesheet"/>
<link href="/css/externe/toastr.min.css" rel="stylesheet"/>
<link href="/css/style.css " rel="stylesheet"/>
<base href="/">
</head>
<body ng-app="bookmarkApp">
<div class="ui container ">
<!-- directive菜单 -->
<menus></menus>
<div class="ui container" style="width:100%;height:20px"></div>
<div class="ui container">
<div ui-view></div>
</div>
<div class="foot"></div>
<!-- directive书签编辑 -->
<edit></edit>
</div>
<div class="foot"></div>
<!-- directive书签编辑 -->
<edit></edit>
</div>
<script src="/scripts/externe/jquery-3.1.1.min.js"></script>
<script src="/scripts/externe/angular.min.js"></script>
<script src="/scripts/externe/angular-ui-router.min.js"></script>
<script src="/scripts/app-angular.js"></script>
<script src="/scripts/services/bookmark-service.js"></script>
<script src="/scripts/services/data-service.js"></script>
<script src="/scripts/services/pub-sub-service.js"></script>
<script src="/scripts/directives/edit-directive.js"></script>
<script src="/scripts/directives/menus-directive.js"></script>
<script src="/scripts/controllers/bookmarks-controller.js"></script>
<script src="/scripts/controllers/home-controller.js"></script>
<script src="/scripts/controllers/login-controller.js"></script>
<script src="/scripts/controllers/tags-controller.js"></script>
<script src="/scripts/controllers/menus-controller.js"></script>
<script src="/scripts/controllers/edit-controller.js"></script>
<script src="/scripts/externe/semantic.min.js"></script>
<script src="/scripts/externe/calendar.min.js"></script>
</body>
<script src="/scripts/externe/jquery-3.1.1.min.js"></script>
<script src="/scripts/externe/toastr.min.js"></script>
<script src="/scripts/externe/angular.min.js"></script>
<script src="/scripts/externe/angular-ui-router.min.js"></script>
<script src="/scripts/app-angular.js"></script>
<script src="/scripts/services/bookmark-service.js"></script>
<script src="/scripts/services/data-service.js"></script>
<script src="/scripts/services/pub-sub-service.js"></script>
<script src="/scripts/directives/edit-directive.js"></script>
<script src="/scripts/directives/menus-directive.js"></script>
<script src="/scripts/directives/element-render-finish-directive.js"></script>
<script src="/scripts/controllers/bookmarks-controller.js"></script>
<script src="/scripts/controllers/home-controller.js"></script>
<script src="/scripts/controllers/login-controller.js"></script>
<script src="/scripts/controllers/tags-controller.js"></script>
<script src="/scripts/controllers/menus-controller.js"></script>
<script src="/scripts/controllers/edit-controller.js"></script>
<script src="/scripts/externe/semantic.min.js"></script>
<script src="/scripts/externe/calendar.min.js"></script>
</body>
</html>

View File

@ -1,6 +1,7 @@
var app = angular.module('bookmarkApp', ['ui.router']);
app.config(function($stateProvider, $urlRouterProvider) {
app.config(function($stateProvider, $urlRouterProvider, $httpProvider) {
$httpProvider.interceptors.push('httpInterceptor');
$urlRouterProvider.otherwise("/");
@ -11,7 +12,7 @@ app.config(function($stateProvider, $urlRouterProvider) {
params: {
foo: null,
bar: null,
showStyle: 'table',
showStyle: 'navigate',
},
controller: 'bookmarksCtr'
})
@ -48,7 +49,3 @@ app.config(function($stateProvider, $urlRouterProvider) {
controller: 'homeCtr'
});
});
app.config(function ($httpProvider) {
$httpProvider.interceptors.push('TokenInterceptor');
});

View File

@ -1,56 +1,57 @@
app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '$window', 'bookmarkService', 'pubSubService', function($scope, $state, $stateParams, $filter, $window, bookmarkService, pubSubService) {
app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '$window', '$timeout', 'bookmarkService', 'pubSubService', function($scope, $state, $stateParams, $filter, $window, $timeout, bookmarkService, pubSubService) {
console.log("Hello bookmarksCtr...", $stateParams);
$scope.bookmarks = []; // 书签数据
$scope.showSearch = false; // 书签数据
$scope.showSearch = false; // 搜索对话框
$scope.bookmarkNormalHover = false;
$scope.bookmarkEditHover = false;
$scope.showStyle = 'navigate'; // 显示风格'navigate', 'card', 'table'
$scope.edit = false;
semanticInit();
var params = {
show: $scope.showStyle,
showStyle: $scope.showStyle,
}
getBookmarks(params);
$scope.jumpToUrl = function(url, id) {
if(!$scope.edit){
if (!$scope.edit) {
$window.open(url, '_blank');
bookmarkService.clickBookmark({
id: id
});
}
}
$scope.toggleMode = function(){
console.log('toggleMode..........');
$scope.toggleMode = function() {
$scope.edit = !$scope.edit
};
$scope.delBookmark = function(bookmarkId){
var params = {
id:bookmarkId
}
bookmarkService.delBookmark(params).then(
function(data) {
console.log(data);
$("#"+bookmarkId).remove();
},
function(data) {
console.log(data);
}
);
$scope.delBookmark = function(bookmarkId) {
var params = {
id: bookmarkId
}
bookmarkService.delBookmark(params)
.then((data) => $("#" + bookmarkId).remove())
.catch((err) => {
console.log('delBookmark err ', err)
});
}
$scope.editBookmark = function(bookmarkId){
$scope.editBookmark = function(bookmarkId) {
pubSubService.publish('bookmarksCtr.editBookmark', {
'bookmarkId': bookmarkId
});
}
getBookmarks(params);
pubSubService.subscribe('MenuCtr.bookmarks', $scope, function(event, params) {
console.log('subscribe MenuCtr.bookmarks', params);
$scope.detailBookmark = function(bookmarkId) {
}
pubSubService.subscribe('MenuCtr.searchDetail', $scope, function(event, params) {
$scope.showSearch = (params && params.showSearch)
});
pubSubService.subscribe('MenuCtr.updateShowStyle', $scope, function(event, params) {
$scope.showStyle = (params && params.showStyle);
getBookmarks(params);
});
pubSubService.subscribe('MenuCtr.searchBookmarks', $scope, function(event, params) {
console.log('subscribe MenuCtr.searchBookmarks', params);
getBookmarks(params);
@ -62,52 +63,44 @@ app.controller('bookmarksCtr', ['$scope', '$state', '$stateParams', '$filter', '
});
function getBookmarks(params) {
bookmarkService.getBookmarks(params).then(
function(data) {
bookmarkService.getBookmarks(params)
.then((data) => {
$scope.bookmarks = data;
pubSubService.publish('loginCtr.login', {
'login': true,
pubSubService.publish('Common.menuActive', {
login: true,
index: 0
});
},
function(data) {
console.log(data);
$state.go('/');
pubSubService.publish('loginCtr.login', {
'login': false,
});
}
);
})
.catch((err) => console.log('getBookmarks err', err));
}
function semanticInit() {
setTimeout(() => {
$('.ui.dropdown').dropdown();
$('.ui.calendar.js-date-begin').calendar({
type: 'date',
formatter: {
date: function(date, settings) {
if (!date) return '';
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
return year + '/' + month + '/' + day;
}
},
endCalendar: $('.ui.calendar.js-date-end')
});
$('.ui.calendar.js-date-end').calendar({
type: 'date',
formatter: {
date: function(date, settings) {
if (!date) return '';
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
return year + '/' + month + '/' + day;
}
},
startCalendar: $('.ui.calendar.js-date-begin')
});
}, 100);
}
$scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
$('.ui.dropdown').dropdown();
$('.ui.calendar.js-date-begin').calendar({
type: 'date',
formatter: {
date: function(date, settings) {
if (!date) return '';
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
return year + '/' + month + '/' + day;
}
},
endCalendar: $('.ui.calendar.js-date-end')
});
$('.ui.calendar.js-date-end').calendar({
type: 'date',
formatter: {
date: function(date, settings) {
if (!date) return '';
var day = date.getDate();
var month = date.getMonth() + 1;
var year = date.getFullYear();
return year + '/' + month + '/' + day;
}
},
startCalendar: $('.ui.calendar.js-date-begin')
});
});
}]);

View File

@ -1,8 +1,7 @@
app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'pubSubService', function($scope, $state, $timeout, bookmarkService, pubSubService) {
console.log("Hello editCtr");
var maxSelections = 3;
console.log("Hello , editCtr...");
init();
semanticInit();
$scope.$watch('url', function(newUrl, oldUrl, scope) {
$timeout(function() {
@ -14,13 +13,9 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
var params = {
url: newUrl,
}
bookmarkService.getTitle(params).then(
function(data) {
console.log(JSON.stringify(data));
$scope.title = data.title;
},
function(errorMsg) {}
);
bookmarkService.getTitle(params)
.then((data) => $scope.title = data.title)
.catch((err) => console.log('getTitle err', err))
}
}
});
@ -46,16 +41,15 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
}
});
bookmarkService.addTags(params).then(
function(data) {
bookmarkService.addTags(params)
.then((data) => {
$scope.tags = data;
console.log(JSON.stringify(data));
$timeout(function() {
$timeout(() => {
// 将新增加的分类自动添加到下啦列表中
var count = 0;
params.forEach(function(tagName) {
data.forEach(function(tag) {
params.forEach((tagName) => {
data.forEach((tag) => {
if (tagName == tag.name) {
console.log(tag.id);
if (count < maxSelections) {
$('.ui.fluid.search.dropdown').dropdown('set selected', tag.id);
}
@ -64,9 +58,8 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
});
});
});
},
function(errorMsg) {}
);
})
.catch((err) => console.log('addTags err', err));
}
$scope.cancel = function() {
console.log('Hello , you have click cancel btn......');
@ -76,9 +69,8 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
init();
}
$scope.ok = function() {
console.log('Hello , you have click ok btn......');
var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
console.log($scope.url, $scope.title, $scope.description, $scope.public, selectedTags);
console.log('Hello ok clicked', $scope.url, $scope.title, $scope.description, $scope.public, selectedTags);
$scope.urlError = $scope.url == '';
$scope.titleError = $scope.title == '';
$scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections);
@ -91,40 +83,19 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
description: $scope.description
}
if ($scope.add) {
bookmarkService.addBookmark(params).then(
function(data) {
console.log(data);
bookmarkService.addBookmark(params)
.then((data) => {
$('.ui.modal.js-add-bookmark').modal('hide');
$state.go('bookmarks', {
foo: 'i love you',
bar: 'hello world'
});
pubSubService.publish('EditCtr.inserBookmarsSuccess', {
show: 'navigate'
});
},
function(errorMsg) {
console.log(errorMsg);
}
);
pubSubService.publish('EditCtr.inserBookmarsSuccess', data);
})
.catch((err) => console.log('addBookmark err', err));
} else {
console.log('updateBookmark...........', params)
bookmarkService.updateBookmark(params).then(
function(data) {
console.log(data);
bookmarkService.updateBookmark(params)
.then((data) => {
$('.ui.modal.js-add-bookmark').modal('hide');
$state.go('bookmarks', {
foo: 'i love you',
bar: 'hello world'
});
pubSubService.publish('EditCtr.inserBookmarsSuccess', {
show: 'navigate'
});
},
function(errorMsg) {
console.log(errorMsg);
}
);
pubSubService.publish('EditCtr.inserBookmarsSuccess', data);
})
.catch((err) => console.log('updateBookmark err', err));
}
}
@ -149,17 +120,18 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
}).modal('show');
$('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('clear');
$('.ui.modal.js-add-bookmark .ui.dropdown').addClass('loading');
bookmarkService.getBookmark(params).then(
function(data) {
var bookmark = data.bookmark;
$scope.add = false;
$scope.add = false;
bookmarkService.getBookmark(params)
.then((data) => {
console.log('getBookmark ', data);
var bookmark = data.bookmark;
$scope.id = (bookmark && bookmark.id) || '';
$scope.url = (bookmark && bookmark.url) || '';
$scope.title = (bookmark && bookmark.title) || '';
$scope.description = (bookmark && bookmark.description) || '';
// $scope.newTags = bookmark && bookmark.url && '';
$scope.tags = data.tags;
$scope.public = (bookmark && bookmark.id) || '1';
$timeout(function() {
data.bookmarkTags.forEach((tagId) => {
@ -167,44 +139,34 @@ app.controller('editCtr', ['$scope', '$state', '$timeout', 'bookmarkService', 'p
});
});
$scope.public = '1';
console.log(data);
$('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('updateBookmark err', err));
});
function getTags(params) {
bookmarkService.getTags(params).then(
function(data) {
bookmarkService.getTags(params)
.then((data) => {
$scope.tags = data;
semanticInit();
$('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('getTags err', err));
}
function semanticInit() {
setTimeout(() => {
$('.ui.dropdown').dropdown({
forceSelection: false,
maxSelections: maxSelections,
onChange: function(value, text, $choice) {
var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
$timeout(function() {
$scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections) && ($('.ui.modal.js-add-bookmark').modal('is active'));
});
}
});
}, 1000);
}
// 元素构造完成之后开始使用jquery初始化
$scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
console.log('edit ui dropdown elementRenderFinished')
$('.ui.modal.js-add-bookmark .ui.dropdown').removeClass('loading');
$('.ui.dropdown').dropdown({
forceSelection: false,
maxSelections: maxSelections,
onChange: function(value, text, $choice) {
var selectedTags = $('.ui.modal.js-add-bookmark .ui.dropdown').dropdown('get value');
$timeout(function() {
$scope.tagsError = (selectedTags.length == 0 || selectedTags.length > maxSelections) && ($('.ui.modal.js-add-bookmark').modal('is active'));
});
}
});
});
function init() {
$scope.add = true;

View File

@ -1,14 +1,15 @@
app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$window', 'bookmarkService', 'pubSubService', function($scope, $stateParams, $filter, $state, $window, bookmarkService, pubSubService) {
console.log('Hello homeCtr......');
var debug = true;
var debug = false;
if (debug) {
bookmarkService.login({
var params = {
username: 'luchenqun',
password: 'fendoubuxi',
password: 'fendoubuxi1',
autoLogin: true,
}).then(
function(data) {
console.log(data);
};
bookmarkService.login(params)
.then((data) => {
if (data.logined) {
pubSubService.publish('loginCtr.login', {
'login': data.logined,
@ -19,14 +20,11 @@ app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$wind
} else {
console.log('login failed......................')
}
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('login err', err));
} else {
bookmarkService.autoLogin().then(
function(data) {
bookmarkService.autoLogin()
.then((data) => {
if (data.logined || debug) {
pubSubService.publish('loginCtr.login', {
'login': debug || data.logined,
@ -35,12 +33,9 @@ app.controller('homeCtr', ['$scope', '$stateParams', '$filter', '$state', '$wind
showStyle: 'navigate',
})
} else {
console.log('login failed......................')
console.log('autoLogin failed......................')
}
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('autoLogin err', err));
}
}]);

View File

@ -1,6 +1,11 @@
app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'pubSubService', function($scope, $filter, $state, bookmarkService, pubSubService) {
console.log("Hello loginCtr...");
pubSubService.publish('Common.menuActive', {
login: false,
index: 1
});
$scope.username = "luchenqun";
$scope.password = "fendoubuxi";
$scope.showErr = false;
@ -17,11 +22,11 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'p
console.log($scope.username, $scope.password, autoLogin);
var params = {
username: $scope.username,
password:$scope.password,
autoLogin:autoLogin,
password: $scope.password,
autoLogin: autoLogin,
};
bookmarkService.login(params).then(
function(data) {
bookmarkService.login(params)
.then((data) => {
console.log(data);
if (data.logined) {
pubSubService.publish('loginCtr.login', {
@ -33,11 +38,8 @@ app.controller('loginCtr', ['$scope', '$filter', '$state', 'bookmarkService', 'p
} else {
console.log('login failed......................')
}
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('login err', err));
}
}
}]);

View File

@ -1,27 +1,18 @@
app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService', 'bookmarkService', function($scope, $stateParams, $state, pubSubService, bookmarkService) {
$scope.login = $stateParams.login && false; /**< 是否登陆 */
console.log("Hello menuCtr")
$scope.login = false; /**< 是否登陆 */
$scope.selectLoginIndex = 0; /**< 默认登陆之后的选择的菜单索引,下表从 0 开始 */
$scope.selectNotLoginIndex = 0; /**< 默认未登陆之后的选择的菜单索引,下表从 0 开始 */
$scope.keyword = ''; /**< 搜索关键字 */
semanticInit();
/**
* @todo http://stackoverflow.com/questions/31449948/ui-router-state-go-not-working
*/
// if ($scope.login) {
// setTimeout(() => {
// $state.go('bookmarks', {
// foo: 'i love you',
// bar: 'hello world'
// })
// }, 0);
// }
pubSubService.subscribe('loginCtr.login', $scope, function(event, params) {
$scope.login = params.login;
$scope.showSearch = false;
// 防止在登陆的情况下在浏览器里面直接输入url这时候要更新菜单选项
pubSubService.subscribe('Common.menuActive', $scope, function(event, params) {
console.log("subscribe Common.menuActive", params)
$scope.login = (params && params.login) || false;
var index = $scope.login ? ($scope.selectLoginIndex = (params && params.index) || 0) : ($scope.selectNotLoginIndex = (params && params.index) || 0);
updateMenuActive(index);
});
// 登陆之后显示的菜单数据。uiSerf内部跳转链接。
$scope.loginMenus = [{
uiSref: 'bookmarks',
@ -35,9 +26,6 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
}, {
uiSref: 'settings',
title: '设置'
}, {
uiSref: 'intro',
title: '说明'
}];
// 未登陆显示的菜单数据
@ -64,12 +52,24 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
/**
* @func
* @desc 点击下拉列表详情搜索
* @warn 不要使用$('js-checkbox-search').checkbox('is checked')去取因为dom元素还没更新的
*/
$scope.searchDetail = function() {
$scope.showSearch = !$scope.showSearch;
console.log('searchDetail ', $scope.showSearch)
pubSubService.publish('MenuCtr.searchDetail', {
'key': 'JavaScript'
'showSearch': $scope.showSearch,
});
}
$scope.updateShowStyle = function(showStyle) {
console.log('updateShowStyle', showStyle)
$('.js-radio-' + showStyle).checkbox('set checked');
pubSubService.publish('MenuCtr.updateShowStyle', {
'showStyle': showStyle,
});
}
$scope.showAddBookmarkMoadl = function() {
pubSubService.publish('MenuCtr.showAddBookmarkMoadl', {
'action': 'add'
@ -79,34 +79,55 @@ app.controller('menuCtr', ['$scope', '$stateParams', '$state', 'pubSubService',
var params = {
userName: 'luchenqun'
};
bookmarkService.logout(params).then(
function(data) {
bookmarkService.logout(params)
.then((data) => {
console.log('logout..........', data)
$scope.login = false;
$state.go('login', {
foo: 'i love you',
bar: 'hello world'
})
},
function(errorMsg) {
console.log(errorMsg);
}
);
})
.catch((err) => console.log('logout err', err));
}
function semanticInit() {
setTimeout(() => {
$('.ui.dropdown').dropdown({
action: 'nothing',
});
$('.ui.checkbox').checkbox();
$('.ui.checkbox.js-radio-navigate').checkbox('check');
$('.ui.menu a.item').on('click', function() {
$(this)
.addClass('active')
.siblings()
.removeClass('active');
});
}, 100);
// 元素构造完成之后开始使用jquery初始化
$scope.$on('elementRenderFinished', function(elementRenderFinishedEvent) {
console.log('menus elementRenderFinished')
$scope.showSearch = $('.js-checkbox-search').checkbox('is checked');
$('.js-bookmark-dropdown').dropdown({
action: 'hide',
});
$('.ui.dropdown').dropdown({
on: 'hover',
});
$('.ui.checkbox').checkbox();
$('.ui.checkbox.js-radio-navigate').checkbox('check');
$('.ui.menu a.item').on('click', function() {
$(this).addClass('selected').siblings().removeClass('selected');
});
$(".ui.menu a.item:first").hover(
function() {
$('.js-bookmark-dropdown').dropdown('show');
},
function() {
setTimeout(() => {
if ($('.js-menu-option:hover').length === 0) {
$('.js-bookmark-dropdown').dropdown('hide');
}
}, 100)
}
);
$('.ui.menu a.item').on('click', function() {
$(this).addClass('selected').siblings().removeClass('selected');
});
});
function updateMenuActive(index) {
$('.ui.menu a.item').removeClass('selected');
$('.ui.menu a.item:eq(' + index + ')').addClass('selected');
}
}]);

View File

@ -1,25 +1,24 @@
app.controller('tagsCtr', ['$scope', '$filter', 'bookmarkService', 'pubSubService', function($scope, $filter, bookmarkService, pubSubService) {
console.log("Hello tagsCtr...");
getTags({a:1, b:2, c:3});
getTags({
user_id: '1'
});
$scope.tags = []; // 书签数据
pubSubService.subscribe('MenuCtr.tags', $scope, function(event, data) {
console.log('subscribe MenuCtr.tags', data);
var params = {a:1, b:2, c:3};
var params = {
a: 1,
b: 2,
c: 3
};
getTags(params);
});
function getTags(params){
bookmarkService.getTags(params).then(
function(data) {
console.log(data);
$scope.tags = data;
},
function(errorMsg) {
console.log(errorMsg);
}
);
function getTags(params) {
bookmarkService.getTags(params)
.then((data) => $scope.tags = data)
.catch((err) => console.log('getTags err', err));
}
}]);

View File

@ -0,0 +1,12 @@
app.directive('onFinishRenderFilters', ['$timeout', function($timeout) {
return {
restrict: 'A',
link: function(scope, element, attr) {
if (scope.$last === true) {
$timeout(function() {
scope.$emit('elementRenderFinished');
});
}
}
};
}]);

2
public/scripts/externe/toastr.min.js vendored Normal file
View File

@ -0,0 +1,2 @@
!function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return g({type:O.error,iconClass:m().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=m()),v=e("#"+t.containerId),v.length?v:(n&&(v=u(t)),v)}function i(e,t,n){return g({type:O.info,iconClass:m().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return g({type:O.success,iconClass:m().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return g({type:O.warning,iconClass:m().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e,t){var i=m();v||n(i),l(e,i,t)||d(i)}function c(t){var i=m();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function d(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n,i){var o=i&&i.force?i.force:!1;return t&&(o||0===e(":focus",t).length)?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function u(t){return v=e("<div/>").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,closeMethod:!1,closeDuration:!1,closeEasing:!1,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",escapeHtml:!1,target:"body",closeHtml:'<button type="button">&times;</button>',newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function f(e){w&&w(e)}function g(t){function i(e){return null==e&&(e=""),new String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function o(){r(),d(),l(),u(),p(),c()}function s(){y.hover(b,O),!x.onclick&&x.tapToDismiss&&y.click(w),x.closeButton&&k&&k.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),w(!0)}),x.onclick&&y.click(function(e){x.onclick(e),w()})}function a(){y.hide(),y[x.showMethod]({duration:x.showDuration,easing:x.showEasing,complete:x.onShown}),x.timeOut>0&&(H=setTimeout(w,x.timeOut),q.maxHideTime=parseFloat(x.timeOut),q.hideEta=(new Date).getTime()+q.maxHideTime,x.progressBar&&(q.intervalId=setInterval(D,10)))}function r(){t.iconClass&&y.addClass(x.toastClass).addClass(E)}function c(){x.newestOnTop?v.prepend(y):v.append(y)}function d(){t.title&&(I.append(x.escapeHtml?i(t.title):t.title).addClass(x.titleClass),y.append(I))}function l(){t.message&&(M.append(x.escapeHtml?i(t.message):t.message).addClass(x.messageClass),y.append(M))}function u(){x.closeButton&&(k.addClass("toast-close-button").attr("role","button"),y.prepend(k))}function p(){x.progressBar&&(B.addClass("toast-progress"),y.prepend(B))}function g(e,t){if(e.preventDuplicates){if(t.message===C)return!0;C=t.message}return!1}function w(t){var n=t&&x.closeMethod!==!1?x.closeMethod:x.hideMethod,i=t&&x.closeDuration!==!1?x.closeDuration:x.hideDuration,o=t&&x.closeEasing!==!1?x.closeEasing:x.hideEasing;return!e(":focus",y).length||t?(clearTimeout(q.intervalId),y[n]({duration:i,easing:o,complete:function(){h(y),x.onHidden&&"hidden"!==j.state&&x.onHidden(),j.state="hidden",j.endTime=new Date,f(j)}})):void 0}function O(){(x.timeOut>0||x.extendedTimeOut>0)&&(H=setTimeout(w,x.extendedTimeOut),q.maxHideTime=parseFloat(x.extendedTimeOut),q.hideEta=(new Date).getTime()+q.maxHideTime)}function b(){clearTimeout(H),q.hideEta=0,y.stop(!0,!0)[x.showMethod]({duration:x.showDuration,easing:x.showEasing})}function D(){var e=(q.hideEta-(new Date).getTime())/q.maxHideTime*100;B.width(e+"%")}var x=m(),E=t.iconClass||x.iconClass;if("undefined"!=typeof t.optionsOverride&&(x=e.extend(x,t.optionsOverride),E=t.optionsOverride.iconClass||E),!g(x,t)){T++,v=n(x,!0);var H=null,y=e("<div/>"),I=e("<div/>"),M=e("<div/>"),B=e("<div/>"),k=e(x.closeHtml),q={intervalId:null,hideEta:null,maxHideTime:null},j={toastId:T,state:"visible",startTime:new Date,options:x,map:t};return o(),a(),s(),f(j),x.debug&&console&&console.log(j),y}}function m(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&(v.remove(),C=void 0))}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:c,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.2",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)});
//# sourceMappingURL=toastr.js.map

View File

@ -10,8 +10,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get getTitle');
def.reject('getTitle error');
});
return def.promise;
},
@ -24,8 +23,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('login error');
});
return def.promise;
},
@ -38,7 +36,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('clickBookmark error');
});
return def.promise;
},
@ -51,8 +49,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('logout error');
});
return def.promise;
},
@ -63,8 +60,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('autoLogin error');
});
return def.promise;
},
@ -83,8 +79,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data, status) {
console.log('Error: ' + data, status);
def.reject('Failed to get todos');
def.reject('getBookmarks error');
});
return def.promise;
},
@ -98,7 +93,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data, status) {
console.log('Error: ' + data, status);
def.reject('getBookmark error');
});
return def.promise;
},
@ -111,13 +106,11 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('addBookmark error');
});
return def.promise;
},
updateBookmark: function(params) {
console.log('service updateBookmark')
var def = $q.defer();
$http.post('/api/updateBookmark/', {
params: params
@ -126,8 +119,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('updateBookmark error');
});
return def.promise;
},
@ -140,13 +132,9 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('delBookmark fail');
def.reject('delBookmark error');
});
return def.promise;
},
editBookmark: function(params) {
},
/**
* @func
@ -162,8 +150,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('getTags error');
});
return def.promise;
},
@ -176,8 +163,7 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
def.resolve(data);
})
.error(function(data) {
console.log('Error: ' + data);
def.reject('Failed to get todos');
def.reject('addTags error');
});
return def.promise;
},
@ -186,47 +172,27 @@ app.factory('bookmarkService', ['$http', '$q', function($http, $q) {
return service;
}]);
app.factory('AuthenticationService', function() {
var auth = {
isAuthenticated: false,
isAdmin: false
}
return auth;
});
app.factory('TokenInterceptor', function($q, $window, $location, AuthenticationService) {
return {
app.factory('httpInterceptor', ['$q', '$injector', function($q, $injector) {
var defered = $q.defer();
var httpInterceptor = {
request: function(config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
requestError: function(err) {
return $q.reject(err);
},
/* Set Authentication.isAuthenticated to true if 200 received */
response: function(response) {
if (response != null && response.status == 200 && $window.sessionStorage.token && !AuthenticationService.isAuthenticated) {
AuthenticationService.isAuthenticated = true;
}
return response || $q.when(response);
response: function(res) {
return $q.resolve(res);
},
/* Revoke client authentication if 401 is received */
responseError: function(rejection) {
if (rejection != null && rejection.status === 401 && ($window.sessionStorage.token || AuthenticationService.isAuthenticated)) {
delete $window.sessionStorage.token;
AuthenticationService.isAuthenticated = false;
// $location.path("/admin/login");
console.log('responseError')
responseError: function(err) {
if (401 === err.status) {
toastr["error"]("警告", "您需要先登录才能使用该功能");
$injector.get('$state').go('login', {})
} else {
toastr["error"]("警告", JSON.stringify(err));
}
return $q.reject(rejection);
return $q.reject(err);
}
};
});
}
return httpInterceptor;
}]);

View File

@ -1,35 +1,4 @@
<div class="ui segment" ng-if="showStyle === 'navigate'">
<div class="ui container" ng-repeat="tag in bookmarks" ng-init="tagIndex=$index">
<div class="ui grid">
<div class=" row">
<div class="wrap" style="width:88px;color:#0aa770;text-align:left;margin-left:20px;">
<span title="{{ tag.name }}">{{ tag.name }}</span>
</div>
<div class="fourteen wide column">
<div class="ui grid container">
<div
class="two wide column js-navigate-bookmark"
ng-class="{bookmarkNormalHover:bookmarkNormalHover, bookmarkEditHover:bookmarkEditHover, bookmark:(!bookmarkNormalHover && !bookmarkEditHover)}"
ng-mouseover="edit ? (bookmarkEditHover=true) : (bookmarkNormalHover=true)"
ng-mouseleave="edit ? (bookmarkEditHover=false) : (bookmarkNormalHover=false)"
ng-repeat="bookmark in tag.bookmarks"
ng-click="jumpToUrl(bookmark.url, bookmark.id)"
title="{{ bookmark.title }}"
id="{{bookmark.id}}">
<img class="ui ui middle aligned tiny image bookmarkOperaterHover" style="width:16px;height:16px" src="./images/{{ bookmarkEditHover ? 'delete-hover' : 'delete'}}.png" ng-if="edit" ng-click="delBookmark(bookmark.id)">
<img class="ui ui middle aligned tiny image bookmarkOperaterHover" style="width:16px;height:16px;float:right;" src="./images/{{ bookmarkEditHover ? 'edit-bookmark-hover' : 'edit-bookmark'}}.png" ng-if="edit" ng-click="editBookmark(bookmark.id)">
<img class="ui ui middle aligned tiny image" src="http://www.google.com/s2/favicons?domain={{ bookmark.url }}" style="width:16px;height:16px" ng-if="!edit">
<span>{{ bookmark.title}}</span>
</div>
</div>
</div>
<div ng-if="tagIndex === 0" style="width:32px;height:32px;padding-right:10px;" ng-click="toggleMode()" title="{{edit ? '退出编辑模式' : '点我进入编辑模式'}}"><img class="ui ui middle aligned tiny image" src="./images/{{ edit ? 'back' : 'edit'}}.png"></div>
</div>
</div>
<div class="ui divider"></div>
</div>
</div>
<div class="ui small menu js-search-detail" ng-if="showSearch">
<div class="ui small menu js-search-detail" ng-show="showSearch" ng-repeat="justSureRendered in [1]" on-finish-render-filters>
<div class="ui dropdown item">
<div class="text">搜索范围</div>
<i class="dropdown icon"></i>
@ -75,6 +44,51 @@
<div class="ui button">搜索</div>
</div>
</div>
<div class="ui segment" ng-if="showStyle === 'navigate'">
<div class="ui container" ng-repeat="tag in bookmarks" ng-init="tagIndex=$index">
<div class="ui grid">
<div class=" row">
<div class="wrap" style="width:88px;color:#0aa770;text-align:left;margin-left:20px;">
<span title="{{ tag.name }}">{{ tag.name }}</span>
</div>
<div class="fourteen wide column" ng-if="tag.bookmarks.length">
<div class="ui grid container">
<div
class="two wide column js-navigate-bookmark"
ng-class="{bookmarkNormalHover:bookmarkNormalHover, bookmarkEditHover:bookmarkEditHover, bookmark:(!bookmarkNormalHover && !bookmarkEditHover)}"
ng-mouseover="edit ? (bookmarkEditHover=true) : (bookmarkNormalHover=true)"
ng-mouseleave="edit ? (bookmarkEditHover=false) : (bookmarkNormalHover=false)"
ng-repeat="bookmark in tag.bookmarks"
ng-click="jumpToUrl(bookmark.url, bookmark.id)"
title="{{ bookmark.title }}"
id="{{bookmark.id}}">
<img class="ui ui middle aligned tiny image bookmarkOperaterHover" style="width:16px;height:16px" ng-src="./images/{{ bookmarkEditHover ? 'delete-hover' : 'delete'}}.png" ng-if="edit" ng-click="delBookmark(bookmark.id)">
<img class="ui ui middle aligned tiny image bookmarkOperaterHover" style="width:16px;height:16px;float:right;" ng-src="./images/{{ bookmarkEditHover ? 'edit-bookmark-hover' : 'edit-bookmark'}}.png" ng-if="edit" ng-click="editBookmark(bookmark.id)">
<img class="ui ui middle aligned tiny image" ng-src="http://www.google.com/s2/favicons?domain={{ bookmark.url }}" style="width:16px;height:16px" ng-if="!edit">
<span>{{ bookmark.title}}</span>
</div>
</div>
</div>
<div ng-if="tagIndex === 0" style="width:32px;height:32px;padding-right:10px;" ng-click="toggleMode()" title="{{edit ? '退出编辑模式' : '点我进入编辑模式'}}"><img class="ui ui middle aligned tiny image" ng-src="./images/{{ edit ? 'back' : 'edit'}}.png"></div>
</div>
</div>
<div class="ui divider"></div>
</div>
<div style="height:45px;">
<div class="ui right floated pagination menu">
<a class="icon item">
<i class="left chevron icon"></i>
</a>
<a class="item">1</a>
<a class="item">2</a>
<a class="item">3</a>
<a class="item">4</a>
<a class="icon item">
<i class="right chevron icon"></i>
</a>
</div>
</div>
</div>
<table class="ui celled table" ng-if="showStyle === 'table'">
<thead>
<tr>
@ -84,18 +98,18 @@
<th>创建日期</th>
<th>最后点击日期</th>
<th>分类</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="bookmark in bookmarks">
<tr ng-repeat="bookmark in bookmarks" id="{{ bookmark.id }}">
<td>
<img class="ui ui middle aligned tiny image" src="http://api.byi.pw/favicon/?url={{bookmark.url}}" style="width:16px;height:16px">
<span>
<a href="{{ bookmark.url }}" target="_blank">{{ bookmark.title }}
</a>
<img class="ui ui middle aligned tiny image" src="http://www.google.com/s2/favicons?domain={{bookmark.url}}" style="width:16px;height:16px">
<span ng-click="jumpToUrl(bookmark.url, bookmark.id)">
{{ bookmark.title }}
</span>
</td>
<td>{{ bookmark.url }}</td>
<td ng-click="jumpToUrl(bookmark.url, bookmark.id)">{{ bookmark.url }}</td>
<td>{{ bookmark.click_count }}</td>
<td>{{ bookmark.created_at }}</td>
<td>{{ bookmark.last_click }}</td>
@ -104,11 +118,16 @@
{{ tag.name }}
</div>
</td>
<td>
<img class="ui mini spaced image" style="width:16px;height:16px;margin:0 5px" ng-src="./images/delete.png" ng-click="delBookmark(bookmark.id)">
<img class="ui mini spaced image" style="width:16px;height:16px;margin:0 5px" ng-src="./images/edit-bookmark.png" ng-click="editBookmark(bookmark.id)">
<img class="ui mini spaced image" style="width:16px;height:16px;margin:0 5px" ng-src="./images/detail.png" ng-click="detailBookmark(bookmark.id)">
</td>
</tr>
</tbody>
<tfoot>
<tr>
<th colspan="6">
<th colspan="7">
<div class="ui right floated pagination menu">
<a class="icon item">
<i class="left chevron icon"></i>
@ -125,3 +144,4 @@
</tr>
</tfoot>
</table>
<div class="ui segment" ng-if="showStyle === 'card'">正在开发中,尽请期待。。。。。。</div>

View File

@ -19,7 +19,7 @@
<div class="eight wide field" ng-class="{error:tagsError }">
<select class="ui fluid search dropdown js-tags" multiple="">
<option value="">选择已有分类,可以搜索已有标签,最多选择三个</option>
<option value="{{ tag.id }}" ng-repeat="tag in tags">{{ tag.name }}</option>
<option value="{{ tag.id }}" ng-repeat="tag in tags" on-finish-render-filters>{{ tag.name }}</option>
</select>
</div>
<div class="eight wide field">

View File

@ -1,35 +1,35 @@
<div class="js-menu" ng-controller="menuCtr">
<div class="ui menu js-login-in" ng-if="login">
<a class="item" ng-class="{active:$index==selectLoginIndex}" ui-sref="{{ menu.uiSref }}" ui-sref-opts="{reload: true}" ng-repeat="menu in loginMenus">
<div class="ui large menu js-login-in" ng-if="login">
<a class="item" ng-class="{selected:$index===selectLoginIndex}" ui-sref="{{ menu.uiSref }}" ui-sref-opts="{reload: true}" ng-repeat="menu in loginMenus" on-finish-render-filters>
<div>{{ menu.title }}</div>
<div class="ui floating dropdown icon js-bookmark-dropdown" ng-if="$index==0">
<div class="ui floating simple dropdown icon js-bookmark-dropdown" ng-if="$index==0" ng-click="$event.stopPropagation();">
<i class="dropdown icon"></i>
<div class="menu">
<div class="menu js-menu-option">
<div class="header">显示方式</div>
<div class="divider"></div>
<div class="field item">
<div class="ui radio checkbox js-radio-navigate">
<input type="radio" name="fruit">
<div class="field item" ng-click="updateShowStyle('navigate')">
<div class="ui radio checkbox checked js-radio-navigate">
<input type="radio" name="show-style" checked="">
<label>导航</label>
</div>
</div>
<div class="field item">
<div class="field item" ng-click="updateShowStyle('table')">
<div class="ui radio checkbox js-radio-table">
<input type="radio" name="fruit">
<input type="radio" name="show-style">
<label>表格</label>
</div>
</div>
<div class="field item">
<div class="field item" ng-click="updateShowStyle('card')">
<div class="ui radio checkbox js-radio-card">
<input type="radio" name="fruit">
<input type="radio" name="show-style">
<label>卡片</label>
</div>
</div>
<div class="divider"></div>
<div class="header">搜索选项</div>
<div class="item">
<div class="ui checkbox" ng-click="searchDetail()">
<input type="checkbox" name="fun">
<div class="ui checkbox js-checkbox-search" ng-click="searchDetail()">
<input type="checkbox">
<label>显示详细搜索</label>
</div>
</div>
@ -52,7 +52,7 @@
</div>
</div>
</div>
<div class="ui small menu js-not-login-in" ng-if="!login">
<a class="item" ng-class="{active:$index==selectNotLoginIndex}" ui-sref="{{ menu.uiSref}}" ui-sref-opts="{reload: true}" ng-click="selectMenu($index, login)" ng-repeat="menu in notLoginMenus">{{ menu.title}}</a>
<div class="ui large menu js-not-login-in" ng-if="!login">
<a class="item" ng-class="{selected:$index==selectNotLoginIndex}" ui-sref="{{ menu.uiSref}}" ui-sref-opts="{reload: true}" ng-click="selectMenu($index, login)" ng-repeat="menu in notLoginMenus" on-finish-render-filters>{{ menu.title}}</a>
</div>
</div>

View File

@ -71,6 +71,10 @@ api.get('/autoLogin', function(req, res) {
});
api.delete('/delBookmark', function(req, res) {
if (!req.session.username) {
res.send(401);
return;
}
var bookmarkId = req.query.id;
db.delBookmarkTags(bookmarkId)
.then(() => db.delBookmark(bookmarkId))
@ -81,6 +85,10 @@ api.delete('/delBookmark', function(req, res) {
})
api.post('/updateBookmark', function(req, res) {
if (!req.session.username) {
res.send(401);
return;
}
var bookmark = req.body.params;
console.log('hello updateBookmark', JSON.stringify(bookmark));
var bookmark = req.body.params;
@ -95,6 +103,10 @@ api.post('/updateBookmark', function(req, res) {
})
api.get('/bookmark', function(req, res) {
if (!req.session.username) {
res.send(401);
return;
}
var bookmarkId = req.query.bookmarkId;
var userId = '1';
var ret = {
@ -123,9 +135,10 @@ api.get('/bookmarks', function(req, res) {
console.log('hello bookmarks', JSON.stringify(req.query), req.session.username);
if (!req.session.username) {
res.send(401);
return;
}
var userId = '1';
if (req.query.show === 'navigate') {
if (req.query.showStyle === 'navigate') {
db.getBookmarksNavigate(userId)
.then((result) => {
var data = [];
@ -166,10 +179,7 @@ api.get('/bookmarks', function(req, res) {
db.getBookmarksTable(userId)
.then((bms) => {
bookmarks = bms;
var bookmarkIds = []
bookmarks.forEach((bookmark) => {
bookmarkIds.push(bookmark.id);
})
var bookmarkIds = bookmarks.map((bookmark) => bookmark.id);
return db.getTagsBookmarks(bookmarkIds);
})
.then((tbs) => {
@ -180,17 +190,17 @@ api.get('/bookmarks', function(req, res) {
var data = [];
// 获取每个书签的所有分类标签
bookmarks.forEach(function(bookmark) {
var tags = [];
var bookmarkTags = [];
tagsBookmarks.forEach(function(tb) {
if (tb.bookmark_id == bookmark.id) {
tags.forEach(function(tag) {
if (tb.tag_id == tag.id) {
tags.push(tag)
bookmarkTags.push(tag)
}
})
}
});
bookmark.tags = tags;
bookmark.tags = bookmarkTags;
data.push(bookmark);
})
res.json(data);
@ -200,6 +210,10 @@ api.get('/bookmarks', function(req, res) {
});
api.get('/tags', function(req, res) {
if (!req.session.username) {
res.send(401);
return;
}
db.getTags(req.query.user_id)
.then((tags) => res.json(tags))
.catch((err) => console.log('tags', err));
@ -207,6 +221,10 @@ api.get('/tags', function(req, res) {
api.post('/addBookmark', function(req, res) {
console.log('hello addBookmark', JSON.stringify(req.body));
if (!req.session.username) {
res.send(401);
return;
}
var bookmark = req.body.params;
var user_id = '1';
var tags = bookmark.tags;
@ -219,6 +237,10 @@ api.post('/addBookmark', function(req, res) {
api.post('/addTags', function(req, res) {
console.log('hello addTags', JSON.stringify(req.query), JSON.stringify(req.body));
if (!req.session.username) {
res.send(401);
return;
}
var tagsName = req.body.params;
var user_id = '1';
var addTagNames = [];