Browse Source

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

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

30
extension/popup.js

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

3
server/.gitignore vendored

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

86
server/db.js

@ -1,40 +1,68 @@ @@ -1,40 +1,68 @@
const MongoClient = require('mongodb').MongoClient
// const MongoClient = require('mongodb').MongoClient
const assert = require('assert')
const fs = require('fs')
const path = require('path')
const DATABASE_NAME = 'bookmarksdb'
const DATABASE_SERVER = '192.168.31.201'
const DATABASE_PORT = 27017
const USER = encodeURIComponent('root');
const PASSWORD = encodeURIComponent('root123');
const AUTHMECHANISM = 'SCRAM-SHA-1';
// const DATABASE_NAME = 'bookmarksdb'
// const DATABASE_SERVER = '192.168.31.201'
// const DATABASE_PORT = 27017
// const USER = encodeURIComponent('root');
// const PASSWORD = encodeURIComponent('root123');
// const AUTHMECHANISM = 'SCRAM-SHA-1';
// 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 COLLECTION = 'bookmarks'
// const DATABASE_URL = `mongodb://${DATABASE_SERVER}:${DATABASE_PORT}/${DATABASE_NAME}`
// const COLLECTION = 'bookmarks'
const inertData = (db, callback) => {
const collection = db.collection('bookmarks')
let data = [{
id: '0',
title: "根书签"
}]
collection.insertMany(data, (error, result) => {
assert.equal(null, error)
assert(1, result.result.n)
assert(1, result.ops.length)
callback(result)
})
// const inertData = (db, callback) => {
// const collection = db.collection('bookmarks')
// let data = [{
// id: '0',
// title: "根书签"
// }]
// collection.insertMany(data, (error, result) => {
// assert.equal(null, error)
// assert(1, result.result.n)
// assert(1, result.ops.length)
// 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 = ( ) => {
const client = new MongoClient(DATABASE_URL)
exports.save = (bookmarkArray, callback) => {
console.log('save data')
const bookmarkStr = JSON.stringify(bookmarkArray)
fs.writeFile(path.join('database', Date.now() + '.json'), bookmarkStr, err => {
callback(err)
});
}
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.get = callback => {
console.log('get latest bookmarks')
fs.readdir(path.join('database'), (err, files ) => {
if (err) throw err
console.log(files)
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 @@ @@ -1,28 +1,47 @@
const express = require('express');
const cors = require('cors');
const app = express();
const path = require('path');
const fs = require('fs');
const port = 3000;
// const db = require('./db')
// db.connect()
const SUCCESS_CODE = 0
const db = require('./db')
db.connect()
app.use(cors())
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
app.get('/', (req, res) => {
res.send('Hello World!')
res.json({
code: SUCCESS_CODE,
data: {
version: '0.1'
}
})
})
app.get('/bookmarks', function (req, res) {
console.log('download bookmarks')
db.get((error, bookmarkArray) => {
if (error) throw error
res.json({
id: '0',
title: '标题'
code: SUCCESS_CODE,
data: bookmarkArray
})
})
})
app.post('/bookmarks', function (req, res) {
console.log('upload bookmarks')
console.log(req.body)
const bookmarkArray = 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) })

1
server/package.json

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

15
server/yarn.lock

@ -76,6 +76,14 @@ core-util-is@~1.0.0: @@ -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"
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:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -291,6 +299,11 @@ negotiator@0.6.2: @@ -291,6 +299,11 @@ negotiator@0.6.2:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
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:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@ -475,7 +488,7 @@ utils-merge@1.0.1: @@ -475,7 +488,7 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
vary@~1.1.2:
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=

Loading…
Cancel
Save