Browse Source

feat: 完成书签的上传和下载,书签保存在本地文件中

master
Alvis Zhao 5 years ago
parent
commit
f3e6048733
  1. 38
      extension/popup.js
  2. 5
      server/.gitignore
  3. 86
      server/db.js
  4. 35
      server/index.js
  5. 1
      server/package.json
  6. 15
      server/yarn.lock

38
extension/popup.js

@ -43,6 +43,10 @@ function Node() {
let BookmarkTreeNodeList = []; let BookmarkTreeNodeList = [];
const BOOKMARK = 0; const BOOKMARK = 0;
const BOOKEMAR_FOLDER = 1; const BOOKEMAR_FOLDER = 1;
const PROTO = 'http'
const SERVER_ADDRESS = '127.0.0.1'
const SERVER_PORT = '3000'
const SERVER_URL = `${PROTO}://${SERVER_ADDRESS}:${SERVER_PORT}`
function addToList(node) { function addToList(node) {
let bookmarkNode = new Node(); let bookmarkNode = new Node();
@ -66,6 +70,7 @@ function addToList(node) {
} }
function getBookmarkList(callback) { function getBookmarkList(callback) {
BookmarkTreeNodeList = []
chrome.bookmarks.getTree(function(tree) { chrome.bookmarks.getTree(function(tree) {
for (let i = 0; i < tree.length; i++) { for (let i = 0; i < tree.length; i++) {
let node = tree[i]; let node = tree[i];
@ -76,20 +81,29 @@ function getBookmarkList(callback) {
} }
$("#upload").on("click", function() { $("#upload").on("click", function() {
getBookmarkList(function(error, list) { getBookmarkList(function(error, bookmarkArray) {
for (let i = 0; i < list.length; i++) { $.ajax({
$.ajax({ type: "POST",
type: "POST", url: `${SERVER_URL}/bookmarks`,
url: "http://localhost:3000/bookmarks", contentType: 'application/json;charset=utf-8',
data: list[i], dataType: 'json',
success: function(data) { data: JSON.stringify(bookmarkArray),
callback(data); success: function() {
} console.log('上传了 ' + bookmarkArray.length + ' 条书签')
}); },
} error: function() {
console.error('上传失败')
}
});
}); });
}); });
$("#download").on("click", function() { $("#download").on("click", function() {
alert("下载"); $.ajax({
type: "GET",
url: `${SERVER_URL}/bookmarks`,
success: function(bookmarkArray) {
console.log('下载了 ' + bookmarkArray.length + ' 条书签')
}
});
}); });

5
server/.gitignore vendored

@ -1 +1,4 @@
node_modules/ node_modules/
database/
yarn.lock
package-lock.json

86
server/db.js

@ -1,40 +1,68 @@
const MongoClient = require('mongodb').MongoClient // const MongoClient = require('mongodb').MongoClient
const assert = require('assert') const assert = require('assert')
const fs = require('fs') const fs = require('fs')
const path = require('path')
const DATABASE_NAME = 'bookmarksdb' // const DATABASE_NAME = 'bookmarksdb'
const DATABASE_SERVER = '192.168.31.201' // const DATABASE_SERVER = '192.168.31.201'
const DATABASE_PORT = 27017 // const DATABASE_PORT = 27017
const USER = encodeURIComponent('root'); // const USER = encodeURIComponent('root');
const PASSWORD = encodeURIComponent('root123'); // const PASSWORD = encodeURIComponent('root123');
const AUTHMECHANISM = 'SCRAM-SHA-1'; // const AUTHMECHANISM = 'SCRAM-SHA-1';
// const DATABASE_URL = `mongodb://${USER}:${PASSWORD}@${DATABASE_SERVER}:${DATABASE_PORT}/?authMechanism=${AUTHMECHANISM}&authSource=${DATABASE_NAME}` // const DATABASE_URL = `mongodb://${USER}:${PASSWORD}@${DATABASE_SERVER}:${DATABASE_PORT}/?authMechanism=${AUTHMECHANISM}&authSource=${DATABASE_NAME}`
const DATABASE_URL = `mongodb://${DATABASE_SERVER}:${DATABASE_PORT}/${DATABASE_NAME}` // const DATABASE_URL = `mongodb://${DATABASE_SERVER}:${DATABASE_PORT}/${DATABASE_NAME}`
const COLLECTION = 'bookmarks' // const COLLECTION = 'bookmarks'
const inertData = (db, callback) => { // const inertData = (db, callback) => {
const collection = db.collection('bookmarks') // const collection = db.collection('bookmarks')
let data = [{ // let data = [{
id: '0', // id: '0',
title: "根书签" // title: "根书签"
}] // }]
collection.insertMany(data, (error, result) => { // collection.insertMany(data, (error, result) => {
assert.equal(null, error) // assert.equal(null, error)
assert(1, result.result.n) // assert(1, result.result.n)
assert(1, result.ops.length) // assert(1, result.ops.length)
callback(result) // callback(result)
}) // })
// }
exports.connect = () => {
// const client = new MongoClient(DATABASE_URL)
// client.connect((error) => {
// assert.equal(null, error)
// const db = client.db(DATABASE_NAME)
// console.log('connect ' + DATABASE_URL + ' successfully')
// inertData(db, result => {
// client.close()
// })
// })
} }
exports.connect = ( ) => { exports.save = (bookmarkArray, callback) => {
const client = new MongoClient(DATABASE_URL) console.log('save data')
const bookmarkStr = JSON.stringify(bookmarkArray)
fs.writeFile(path.join('database', Date.now() + '.json'), bookmarkStr, err => {
callback(err)
});
}
client.connect((error) => { exports.get = callback => {
assert.equal(null, error) console.log('get latest bookmarks')
const db = client.db(DATABASE_NAME) fs.readdir(path.join('database'), (err, files ) => {
console.log('connect ' + DATABASE_URL + ' successfully') if (err) throw err
inertData(db, result => { console.log(files)
client.close() let latestFile = 0
for (let i = 0; i < files.length; i++) {
let filename = files[i]
const time = filename.substr(0, filename.length - 5)
console.log(time)
if (time > latestFile) {
latestFile = time
}
}
fs.readFile(path.join('database', latestFile + '.json'), (error, data) => {
callback(error, JSON.parse(data.toString()))
}) })
}) })
} }

35
server/index.js

@ -1,28 +1,47 @@
const express = require('express'); const express = require('express');
const cors = require('cors');
const app = express(); const app = express();
const path = require('path');
const fs = require('fs');
const port = 3000; const port = 3000;
// const db = require('./db') const SUCCESS_CODE = 0
// db.connect()
const db = require('./db')
db.connect()
app.use(cors())
app.use(express.json()) // for parsing application/json app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
app.get('/', (req, res) => { app.get('/', (req, res) => {
res.send('Hello World!') res.json({
code: SUCCESS_CODE,
data: {
version: '0.1'
}
})
}) })
app.get('/bookmarks', function (req, res) { app.get('/bookmarks', function (req, res) {
console.log('download bookmarks') db.get((error, bookmarkArray) => {
if (error) throw error
res.json({ res.json({
id: '0', code: SUCCESS_CODE,
title: '标题' data: bookmarkArray
}) })
})
}) })
app.post('/bookmarks', function (req, res) { app.post('/bookmarks', function (req, res) {
console.log('upload bookmarks') const bookmarkArray = req.body
console.log(req.body) db.save(bookmarkArray, err => {
if (err) throw err
})
res.json({
code: SUCCESS_CODE
})
}) })
app.listen(port, () => { console.log("server is running at port " + port) }) app.listen(port, () => { console.log("server is running at port " + port) })

1
server/package.json

@ -10,6 +10,7 @@
"license": "ISC", "license": "ISC",
"description": "", "description": "",
"dependencies": { "dependencies": {
"cors": "^2.8.5",
"express": "4.17.1", "express": "4.17.1",
"mongodb": "3.5.4" "mongodb": "3.5.4"
} }

15
server/yarn.lock

@ -76,6 +76,14 @@ core-util-is@~1.0.0:
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
cors@^2.8.5:
version "2.8.5"
resolved "https://registry.npm.taobao.org/cors/download/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
integrity sha1-6sEdpRWS3Ya58G9uesKTs9+HXSk=
dependencies:
object-assign "^4"
vary "^1"
debug@2.6.9: debug@2.6.9:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -291,6 +299,11 @@ negotiator@0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
object-assign@^4:
version "4.1.1"
resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
on-finished@~2.3.0: on-finished@~2.3.0:
version "2.3.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@ -475,7 +488,7 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
vary@~1.1.2: vary@^1, vary@~1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=

Loading…
Cancel
Save