diff --git a/database/db.js b/database/db.js index 729daf8..c224f47 100644 --- a/database/db.js +++ b/database/db.js @@ -10,11 +10,22 @@ var client = mysql.createConnection({ client.connect(); +// select 最多返回一行的话,返回对象,否则返回数组 +// insert 返回关键字 +// update delete 返回影响的行数 var db = { -} + } + // var sql = "SELECT * FROM `users` WHERE `username` = 'luchenqun'"; + // client.query(sql, (err, result) => { + // if (err) { + // console.log(err); + // } else { + // console.log(result); + // } + // }); -db.insertBookmark = function(user_id, bookmark) { +db.addBookmark = function(user_id, bookmark) { var sql = "INSERT INTO `bookmarks` (`user_id`, `title`, `description`, `url`, `public`, `click_count`) VALUES ('" + user_id + "', '" + bookmark.title + "', '" + bookmark.description + "', '" + bookmark.url + "', '" + bookmark.public + "', '1')"; return new Promise(function(resolve, reject) { client.query(sql, (err, result) => { @@ -27,7 +38,7 @@ db.insertBookmark = function(user_id, bookmark) { }); }; -db.insertTagsBookmarks = function(tags, bookmard_id) { +db.addTagsBookmarks = function(tags, bookmard_id) { sql = "INSERT INTO `tags_bookmarks` (`tag_id`, `bookmark_id`) VALUES"; for (var i = 0; i < tags.length; i++) { if (i >= 1) { @@ -40,27 +51,20 @@ db.insertTagsBookmarks = function(tags, bookmard_id) { if (err) { reject(err); } else { - resolve(); + resolve(result.affectedRows); } }); }); } db.updateLastUseTags = function(user_id, tags) { - sql = "UPDATE tags SET last_use = NOW() WHERE user_id = '" + user_id + "' AND id in ("; - for (var i = 0; i < tags.length; i++) { - if (i >= 1) { - sql += ',' - } - sql += "'" + tags[i] + "'"; - } - sql += ')' + sql = "UPDATE tags SET last_use = NOW() WHERE user_id = '" + user_id + "' AND id in (" + tags.toString() + ")"; return new Promise(function(resolve, reject) { client.query(sql, (err, result) => { if (err) { reject(err); } else { - resolve(); + resolve(result.affectedRows); } }); }); @@ -79,29 +83,6 @@ db.clickBookmark = function(id) { }); }; -db.checkLogin = function(username, password) { - console.log('checkLogin'); - var sql = "SELECT * FROM `users` WHERE `username` = '" + username + "'"; - return new Promise(function(resolve, reject) { - client.query(sql, (err, result) => { - if (err) { - reject(err); - } else { - var ret = { - logined: false, - user: {}, - } - if (password === result[0].password) { - ret.logined = true; - ret.user = result[0]; - } - - resolve(ret); - } - }); - }); -}; - db.updateUserLastLogin = function(id) { console.log('updateUserLastLogin'); var sql = "UPDATE `users` SET `last_login`=now() WHERE (`id`='" + id + "')"; @@ -114,6 +95,114 @@ db.updateUserLastLogin = function(id) { } }); }); +}; + +db.getUser = function(username) { + console.log('getUser'); + var sql = "SELECT * FROM `users` WHERE `username` = '" + username + "'"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result[0]); + } + }); + }); +}; + +db.getTags = function(user_id) { + console.log('getTags'); + var sql = "SELECT * FROM `tags` WHERE `user_id` = '" + user_id + "' ORDER BY last_use DESC"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); +}; + +db.getTagsByNames = function(user_id, tags_name) { + console.log('getTagsByNames'); + var sql = "SELECT * FROM `tags` WHERE `user_id` = '" + user_id + "' AND `name` in (" + tags_name.toString() + ")"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); +}; + +db.addTags = function(user_id, tags_name) { + console.log('addTags', tags_name); + var sql = "INSERT INTO `tags` (`user_id`, `name`) VALUES"; + tags_name.forEach((name, i) => { + if (i >= 1) { + sql += ',' + } + sql += "('" + user_id + "', '" + name + "')"; + }); + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result.affectedRows); + } + }); + }); +}; + +db.getBookmarksNavigate = function(user_id) { + console.log('getBookmarksNavigate'); + var sql = "SELECT t.id as tag_id, t.name as tag_name, b.* FROM `tags` as t LEFT OUTER JOIN tags_bookmarks as tb ON t.id = tb.tag_id LEFT OUTER JOIN bookmarks as b ON tb.bookmark_id = b.id WHERE t.user_id='" + user_id + "' ORDER BY t.id ASC, b.click_count DESC"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); +}; + +db.getBookmarksTable = function(user_id) { + var sql = "SELECT id, user_id, title, description, url, public, click_count, DATE_FORMAT(created_at, '%Y-%m-%d') as created_at, DATE_FORMAT(last_click, '%Y-%m-%d') as last_click FROM `bookmarks` WHERE user_id='" + user_id + "' ORDER BY click_count DESC, created_at DESC LIMIT 0, 50"; + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); + +} + +db.getBookmarksCard = function(user_id) { + return db.getBookmarksTable(user_id); +} + +db.getTagsBookmarks = function(bookmark_ids) { + console.log('getTagsBookmarks'); + var sql = "SELECT * FROM `tags_bookmarks` WHERE bookmark_id in(" + bookmark_ids.toString() + ")" + return new Promise(function(resolve, reject) { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }); + }); } module.exports = db; diff --git a/public/views/bookmarks.html b/public/views/bookmarks.html index f49b126..97b8dff 100644 --- a/public/views/bookmarks.html +++ b/public/views/bookmarks.html @@ -1,19 +1,12 @@
-
-
-     {{ tag.name }} +
+
+ {{ tag.name }}
-
+
{{ bookmark.title}} diff --git a/routes/api.js b/routes/api.js index 6507065..3f1039d 100644 --- a/routes/api.js +++ b/routes/api.js @@ -7,15 +7,6 @@ var cheerio = require('cheerio'); var request = require('request'); var iconv = require('iconv-lite'); var db = require('../database/db.js'); -var client = mysql.createConnection({ - host: '127.0.0.1' || '172.24.13.5', - user: 'lcq' || 'root', - password: 'fendoubuxi596320' || 'root123', - database: 'mybookmarks', - multipleStatements: true, - port: 3306 -}); -client.connect(); api.post('/getTitle', function(req, response) { var params = req.body.params; @@ -24,8 +15,6 @@ api.post('/getTitle', function(req, response) { var options = { url: url, encoding: null, - //代理服务器 - //proxy: 'http://xxx.xxx.xxx.xxx:8888', headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36' } @@ -78,14 +67,20 @@ api.post('/login', function(req, res) { var params = req.body.params; var username = params.username; var password = md5(params.password); - db.checkLogin(username, password) - .then((ret) => { - if (ret.logined) { + db.getUser(username) + .then((user) => { + var ret = { + logined: false, + user: {}, + } + if (user && user.password === password) { + ret.logined = true; + ret.user = user; req.session.username = ret.user.username; req.session.userId = ret.user.id; - db.updateUserLastLogin(ret.user.id); } res.json(ret); + return ret.logined ? db.updateUserLastLogin(ret.user.id) : Promise.resolve(0); }) .then((affectedRows) => { console.log('updateUserLastLogin affectedRows ', affectedRows) @@ -94,222 +89,150 @@ api.post('/login', function(req, res) { }); api.get('/autoLogin', function(req, res) { + var ret = { + logined: false, + user: {}, + } if (req.session.username) { - console.log('session:' + req.session.username); - var sql = "SELECT * FROM `users` WHERE `username` = '" + req.session.username + "'"; - client.query(sql, function(error, result, fields) { - var id = ''; - var logined = false; - if (!error && result.length === 1) { - req.session.username = result[0].username; - req.session.id = result[0].id; - logined = true; - id = result[0].id; - } - res.json({ - logined: logined, - userId: id, - }); - }) + db.getUser(req.session.username) + .then((user) => { + if (user) { + ret.logined = true; + ret.user = user; + } + res.json(ret); + }) + .catch((err) => { + res.json(ret); + }) } else { - res.json({ - logined: false, - userId: '', - }); + res.json(ret); } }); api.get('/bookmarks', function(req, res) { - console.log('hello bookmarks', JSON.stringify(req.query)); + console.log('hello bookmarks', JSON.stringify(req.query), req.session.username); if (!req.session.username) { res.send(401); } + var userId = '1'; if (req.query.show === 'navigate') { - var sql = "SELECT t.id as tag_id, t.name as tag_name, b.* FROM `tags` as t LEFT OUTER JOIN tags_bookmarks as tb ON t.id = tb.tag_id LEFT OUTER JOIN bookmarks as b ON tb.bookmark_id = b.id ORDER BY t.id ASC, b.click_count DESC"; - client.query(sql, function(error, result, fields) { - var data = []; - var tag = { - id: result && result[0] && result[0].tag_id, - name: result && result[0] && result[0].tag_name, - click: 0, - bookmarks: [] - }; - result.forEach(function(bookmark) { - if (tag.id !== bookmark.tag_id) { - data.push({ - id: tag.id, - name: tag.name, - click: tag.click, - bookmarks: tag.bookmarks - }); - tag.id = bookmark.tag_id; - tag.name = bookmark.tag_name; - tag.click = 0; - tag.bookmarks = []; - } - tag.click += bookmark.click_count; - tag.bookmarks.push(bookmark); - }); - if (result && result.length > 0) { - data.push(tag); - } - data.sort(function(a, b) { - return a.click < b.click; - }) - res.json(data); - }) - } else { - var sqlBookmarks = "SELECT id, user_id, title, description, url, public, click_count, DATE_FORMAT(created_at, '%Y-%m-%d') as created_at, DATE_FORMAT(last_click, '%Y-%m-%d') as last_click FROM `bookmarks` WHERE user_id='1' ORDER BY click_count DESC, created_at DESC LIMIT 0, 50"; - var sqlTags = "SELECT id, name FROM `tags` WHERE user_id='1'"; - - client.query(sqlBookmarks, function(error, result1, fields) { - if (error) { - res.json({ - error: "数据查询出错" - }); - } else { - var bookmark_ids = '' - result1.forEach(function(bookmark) { - bookmark_ids += "'" + bookmark.id + "',"; - }) - bookmark_ids = bookmark_ids.slice(0, bookmark_ids.length - 1); - - var sqlTagIdBookmarkId = "SELECT * FROM `tags_bookmarks` WHERE bookmark_id in(" + bookmark_ids + ")"; - client.query(sqlTagIdBookmarkId, function(error, result2, fields) { - // console.log(result2); - if (error) { - res.json({ - error: "数据查询出错" - }); - } else { - client.query(sqlTags, function(error, result3, fields) { - // console.log(result3); - if (error) { - res.json({ - error: "数据查询出错" - }); - } else { - var data = []; - result1.forEach(function(bookmark) { - var tags = []; - result2.forEach(function(bookmark_tag) { - if (bookmark_tag.bookmark_id == bookmark.id) { - result3.forEach(function(tag) { - if (bookmark_tag.tag_id == tag.id) { - tags.push(tag) - } - }) - } - }); - bookmark.tags = tags; - data.push(bookmark); - }) - res.json(data); - } + db.getBookmarksNavigate(userId) + .then((result) => { + var data = []; + var tag = { + id: result && result[0] && result[0].tag_id, + name: result && result[0] && result[0].tag_name, + click: 0, + bookmarks: [] + }; + result.forEach(function(bookmark) { + if (tag.id !== bookmark.tag_id) { + data.push({ + id: tag.id, + name: tag.name, + click: tag.click, + bookmarks: tag.bookmarks }); + tag.id = bookmark.tag_id; + tag.name = bookmark.tag_name; + tag.click = 0; + tag.bookmarks = []; } + tag.click += bookmark.click_count; + tag.bookmarks.push(bookmark); }); - } - }); + if (result && result.length > 0) { + data.push(tag); + } + data.sort(function(a, b) { + return a.click < b.click; + }) + res.json(data); + }) + .catch((err) => console.log('bookmarks navigate err', err)); + } else { + var bookmarks = []; + var tagsBookmarks = []; + + db.getBookmarksTable(userId) + .then((bms) => { + bookmarks = bms; + var bookmarkIds = [] + bookmarks.forEach((bookmark) => { + bookmarkIds.push(bookmark.id); + }) + return db.getTagsBookmarks(bookmarkIds); + }) + .then((tbs) => { + tagsBookmarks = tbs; + return db.getTags(userId); + }) + .then((tags) => { + var data = []; + // 获取每个书签的所有分类标签 + bookmarks.forEach(function(bookmark) { + var tags = []; + tagsBookmarks.forEach(function(tb) { + if (tb.bookmark_id == bookmark.id) { + tags.forEach(function(tag) { + if (tb.tag_id == tag.id) { + tags.push(tag) + } + }) + } + }); + bookmark.tags = tags; + data.push(bookmark); + }) + res.json(data); + }) + .catch((err) => console.log('bookmarks table or card err', err)) } }); api.get('/tags', function(req, res) { - console.log('hello tags', JSON.stringify(req.query)); - var user_id = req.query.user_id; - var sql = "SELECT id, name FROM `tags` WHERE `user_id` = '" + user_id + "' ORDER BY last_use DESC" - client.query(sql, function(error, result, fields) { - if (error) { - res.json({ - error: 'error tags' - }); - } else { - res.json(result); - } - }) + db.getTags(req.query.user_id) + .then((tags) => res.json(tags)) + .catch((err) => console.log('tags', err)); }); api.post('/addBookmark', function(req, res) { console.log('hello addBookmark', JSON.stringify(req.query), JSON.stringify(req.body)); - var params = req.body.params; + var bookmark = req.body.params; var user_id = '1'; - var tags = params.tags; - db.insertBookmark(user_id, params) // 插入书签 - .then((bookmark_id) => db.insertTagsBookmarks(tags, bookmark_id)) // 插入分类 + var tags = bookmark.tags; + db.addBookmark(user_id, params) // 插入书签 + .then((bookmark_id) => db.addTagsBookmarks(tags, bookmark_id)) // 插入分类 .then(() => db.updateLastUseTags(user_id, tags)) // 更新最新使用的分类 .then(() => res.json({})) // 运气不错 - .catch(() => console.log('fail')); // ops! + .catch((err) => console.log('addBookmark err', err)); // oops! }); api.post('/addTags', function(req, res) { console.log('hello addTags', JSON.stringify(req.query), JSON.stringify(req.body)); - var params = req.body.params; + var tagsName = req.body.params; var user_id = '1'; var addTagNames = []; - var sql = "SELECT * FROM `tags` WHERE `user_id` = '" + user_id + "' AND `name` in ("; - for (var i = 0; i < params.length; i++) { - if (i >= 1) { - sql += ',' - } - sql += "'" + params[i] + "'"; - }; - sql += ")"; - console.log(sql); - client.query(sql, function(error, result1, fields) { - if (error) { - res.json({ - error: 'error tags' - }); - } else { - params.forEach(function(name) { - var find = false; - result1.forEach(function(tag) { - if (tag.name == name) { - find = true; - } - }) - if (!find) { - addTagNames.push(name); - } - }) - sql = "INSERT INTO `tags` (`user_id`, `name`) VALUES"; - for (var i = 0; i < addTagNames.length; i++) { - if (i >= 1) { - sql += ',' - } - sql += "('" + user_id + "', '" + addTagNames[i] + "')"; - } - if (addTagNames.length == 0) { - sql = "SELECT id, name FROM `tags` WHERE `user_id` = '" + user_id + "'"; - } - console.log(sql); - client.query(sql, function(error, result, fields) { - if (error) { - res.json({ - error: 'error tags' - }); - } else { - if (addTagNames.length == 0) { - res.json(result); - } else { - sql = "SELECT id, name FROM `tags` WHERE `user_id` = '" + user_id + "' ORDER BY last_use DESC" - client.query(sql, function(error, result, fields) { - if (error) { - res.json({ - error: 'error tags' - }); - } else { - res.json(result); - } - }) + db.getTags(user_id) + .then((tags) => { + // 需要插入的书签是该用户在数据库不存在的书签 + addTagNames = tagsName.filter((name) => { + for (var i = 0; i < tags.length; i++) { + if (tags[i].name.toLowerCase() === name.toLowerCase()) { + return false; } } - }) - } - }) + return true; + }); + return Promise.resolve(addTagNames); + }) + .then((newTagNames) => db.addTags(user_id, newTagNames)) + .then(() => db.getTags(user_id)) + .then((tags) => res.json(tags)) + .catch((err) => console.log('addTags err', err)); }); -// client.end(); function md5(str) { return crypto