图片同步

未解决: 从本地获取
This commit is contained in:
life
2015-01-23 20:43:21 +08:00
parent f6cc411735
commit 245bbb0236
13 changed files with 306 additions and 71 deletions

1
.gitignore vendored
View File

@@ -17,4 +17,5 @@ app/tmp/main.go
.settings .settings
.project .project
public/config.codekit public/config.codekit
/data

35
node_modules/api.js generated vendored
View File

@@ -11,6 +11,7 @@ function log(o) {
// 远程数据服务 // 远程数据服务
var Api = { var Api = {
leanoteUrl: 'http://localhost:9000',
baseUrl: 'http://localhost:9000/api', baseUrl: 'http://localhost:9000/api',
getUrl: function(url, param) { getUrl: function(url, param) {
var url = this.baseUrl + '/' + url; var url = this.baseUrl + '/' + url;
@@ -131,7 +132,10 @@ var Api = {
// 将https://leanote.com/api/resource/getImage?imageId=xx // 将https://leanote.com/api/resource/getImage?imageId=xx
// 转成app://leanote/public/files, 内部可以是个服务器吗? 请求内部的controller // 转成app://leanote/public/files, 内部可以是个服务器吗? 请求内部的controller
getImage: function(fileId, callback) { getImage: function(fileId, callback) {
needle.get('http://localhost:9000/images/logo.png', function(err, resp) { var me = this;
var url = me.getUrl('file/getImage', {fileId: fileId});
log(url);
needle.get(url, function(err, resp) {
// log(resp.body); // log(resp.body);
/* /*
{ 'accept-ranges': 'bytes', { 'accept-ranges': 'bytes',
@@ -141,7 +145,34 @@ var Api = {
date: 'Mon, 19 Jan 2015 15:01:47 GMT', date: 'Mon, 19 Jan 2015 15:01:47 GMT',
*/ */
// log(resp.headers); // log(resp.headers);
fs.writeFile('/Users/life/Desktop/aa.png', resp.body); if(err) {
callback(false);
} else {
var typeStr = resp.headers['content-type'];
log(resp.headers);
log(typeStr);
var type = 'png';
if(typeStr) {
var typeArr = typeStr.split('/');
if(typeStr.length > 1) {
type = typeArr[1];
}
}
var filename = Common.uuid() + '.' + type;
var imagePath = User.getCurUserImagesPath();
var imagePathAll = imagePath + '/' + filename;
log(imagePathAll);
fs.writeFile(imagePathAll, resp.body, function(err) {
if(err) {
log(err);
log('local save image failed 本地保存失败');
callback(false);
} else {
callback(imagePathAll, filename);
}
});
}
}); });
}, },
}; };

4
node_modules/common.js generated vendored
View File

@@ -1,6 +1,6 @@
var fs = require('fs'); var fs = require('fs');
var User = require('user'); var User = require('user');
var Image = require('image'); var File = require('file');
var Evt = require('evt'); var Evt = require('evt');
var ObjectId = require('objectid'); var ObjectId = require('objectid');
@@ -77,7 +77,7 @@ var Common = {
} }
// 保存 // 保存
var relativePath = User.getCurUserImagesAppPath() + '/' + filename; var relativePath = User.getCurUserImagesAppPath() + '/' + filename;
Image.addImage(relativePath); File.addImage(relativePath);
callback && callback('app://leanote/' + relativePath); callback && callback('app://leanote/' + relativePath);
}); });

4
node_modules/evt.js generated vendored
View File

@@ -6,6 +6,10 @@ var Evt = {
// 项目绝对地址 // 项目绝对地址
getBasePath: function() { getBasePath: function() {
return process.cwd(); return process.cwd();
},
getAbsolutePath: function(relative) {
var me = this;
return me.getBasePath() + '/' + relative;
} }
}; };
module.exports = Evt; module.exports = Evt;

View File

@@ -1,7 +1,9 @@
var db = require('db'); var db = require('db');
var fs = require('fs'); var fs = require('fs');
var path = require('path');
var Evt = require('evt'); var Evt = require('evt');
var User = require('user'); var User = require('user');
var Common = require('common');
var Images = db.images; var Images = db.images;
function log(o) { function log(o) {
@@ -25,19 +27,26 @@ type File struct {
*/ */
// 图片服务 // 文件服务
var Image = { var File = {
// path是相对于项目路径 // path是相对于项目路径
addImage: function(path, callback) { addImage: function(path, callback) {
var me = this;
var absolutePath = Evt.getBasePath() + '/' + path; var absolutePath = Evt.getBasePath() + '/' + path;
me._addImage(Common.objectId(), absolutePath, callback);
},
_addImage: function(fileId, absolutePath, callback) {
// var absolutePath = Evt.getBasePath() + '/' + path;
// 得到文件大小 // 得到文件大小
var stat = fs.statSync(absolutePath); var stat = fs.statSync(absolutePath);
var paths = path.split('/'); var paths = absolutePath.split('/');
var name = paths[paths.length-1]; var name = paths[paths.length-1];
var names = name.split('.'); var names = name.split('.');
var ext = names[names.length-1]; var ext = names[names.length-1];
var image = { var image = {
Path: path, FileId: fileId,
Path: absolutePath,
Name: name, Name: name,
UserId: User.getCurActiveUserId(), UserId: User.getCurActiveUserId(),
Title: name, Title: name,
@@ -53,7 +62,26 @@ var Image = {
callback && callback(doc); callback && callback(doc);
} }
}) })
},
addImageForce: function(fileId, path, callback) {
var me = this;
// 先删除之, 可能是本地有记录, 但是文件没了
Images.remove({FileId: fileId}, function() {
me._addImage(fileId, path, callback);
});
},
// 获取图片本地路径
getImageLocalPath: function(fileId, callback) {
Images.findOne({FileId: fileId}, function(err, doc) {
if(!err && doc && doc.Path) { // FileLocalPath是相对于项目的路径
callback(true, doc.Path);
} else {
callback(false, false);
}
});
} }
}; };
module.exports = Image; module.exports = File;

49
node_modules/mime.js generated vendored
View File

@@ -1,49 +0,0 @@
var fs = require('fs');
var path = require('path');
var _ = require('underscore');
var map = {
'compressed': ['zip', 'rar', 'gz', '7z'],
'text': ['txt', 'md', ''],
'image': ['jpg', 'jpge', 'png', 'gif', 'bmp'],
'pdf': ['pdf'],
'css': ['css'],
'html': ['html'],
'word': ['doc', 'docx'],
'powerpoint': ['ppt', 'pptx'],
'movie': ['mkv', 'avi', 'rmvb'],
};
var cached = {};
exports.stat = function(filepath) {
var result = {
name: path.basename(filepath),
path: filepath,
};
try {
var stat = fs.statSync(filepath);
if (stat.isDirectory()) {
result.type = 'folder';
} else {
var ext = path.extname(filepath).substr(1);
result.type = cached[ext];
if (!result.type) {
for (var key in map) {
if (_.include(map[key], ext)) {
cached[ext] = result.type = key;
break;
}
}
if (!result.type)
result.type = 'blank';
}
}
} catch (e) {
window.alert(e);
}
return result;
}

41
node_modules/note.js generated vendored
View File

@@ -3,6 +3,7 @@ var User = require('user');
var Notebook = require('notebook'); var Notebook = require('notebook');
var Tag = require('tag'); var Tag = require('tag');
var Api = require('api'); var Api = require('api');
var Server = require('server');
var Common = require('common'); var Common = require('common');
var Notes = db.notes; var Notes = db.notes;
@@ -98,17 +99,6 @@ var Note = {
}, },
// 远程修改本地内容
updateNoteContentForce: function(noteId, content) {
Notes.update({NoteId: noteId}, { $set: {Content: content, IsContentDirty: false} }, {}, function (err, numReplaced) {
if(err) {
log(err);
callback && callback(false);
} else {
callback && callback(true);
}
});
},
// 获取笔记列表 // 获取笔记列表
getNotes: function(notebookId, callback) { getNotes: function(notebookId, callback) {
@@ -154,8 +144,33 @@ var Note = {
}); });
}, },
// 远程修改本地内容
updateNoteContentForce: function(noteId, content, callback) {
// <img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">
// 改成<img src="http://localhost:3232/api/file/getImage?fileId=xxx"
var reg = new RegExp('<img *src="' + Api.leanoteUrl + '/api/file/getImage', 'g');
content = content.replace(reg, '<img src="' + Server.localUrl + '/api/file/getImage');
log("----<>");
log(content);
Notes.update({NoteId: noteId}, { $set: {Content: content, InitSync: false, IsContentDirty: false} }, {}, function (err, numReplaced) {
if(err) {
log(err);
callback && callback(false);
} else {
callback && callback(content);
}
});
},
/*
// 同步内容 // 同步内容
updateNoteContentForce: function(noteId, content, callback) { updateNoteContentForce: function(noteId, content, callback) {
// 将笔记内容中
Notes.update({NoteId: noteId}, { $set: {Content: content, InitSync: false} }, {}, function (err, numReplaced) { Notes.update({NoteId: noteId}, { $set: {Content: content, InitSync: false} }, {}, function (err, numReplaced) {
if(err) { if(err) {
log(err); log(err);
@@ -165,6 +180,7 @@ var Note = {
} }
}); });
}, },
*/
// 得到笔记内容 // 得到笔记内容
getNoteContent: function(noteId, callback) { getNoteContent: function(noteId, callback) {
@@ -183,7 +199,8 @@ var Note = {
Api.getNoteContent(noteId, function(noteContent) { Api.getNoteContent(noteId, function(noteContent) {
// 同步到本地 // 同步到本地
if(Common.isOk(noteContent)) { if(Common.isOk(noteContent)) {
me.updateNoteContentForce(noteId, noteContent.Content, function(ret) { me.updateNoteContentForce(noteId, noteContent.Content, function(content) {
noteContent.Content = content;
callback && callback(noteContent); callback && callback(noteContent);
}); });
} else { } else {

176
node_modules/server.js generated vendored Normal file
View File

@@ -0,0 +1,176 @@
var Evt = require('evt');
var Common = require('common');
var File = require('file');
var Api = require('api');
var db = require('db');
var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
function log(o) {
console.log(o);
}
// http server, 处理笔记图片
var Server = {
port: 8008,
localUrl: 'http://127.0.0.1:8008',
_started: false,
_req: null,
mime: {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml"
},
start: function() {
var me = this;
if(me._started) {
return;
}
var basePath = process.cwd();
var server = http.createServer(function (request, response) {
var pathname = url.parse(request.url).pathname;
me._req = request;
if(!pathname) {
return me.e404(response);
}
while(pathname[0] == '/') {
pathname = pathname.substr(1);
}
if(pathname == 'api/file/getImage') {
return me.getImage(request, response);
} else {
response.end();
return false;
}
var realPath = basePath + pathname;
var ext = path.extname(realPath);
ext = ext ? ext.slice(1) : 'unknown';
fs.exists(realPath, function (exists) {
if (!exists) {
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write("This request URL " + pathname + " was not found on this server.");
response.end();
} else {
fs.readFile(realPath, "binary", function (err, file) {
if (err) {
response.writeHead(500, {
'Content-Type': 'text/plain'
});
response.end(err);
} else {
var contentType = me.mime[ext] || "text/plain";
response.writeHead(200, {'Content-Type': contentType});
response.write(file, "binary");
response.end();
}
});
}
});
});
server.listen(me.port);
console.log("Server runing at port: " + me.port + ".");
me.localUrl = 'http://127.0.0.1:' + me.port;
me._started = true;
},
e404: function(res) {
var me = this;
res.writeHead(404, {
'Content-Type': 'text/plain'
});
res.write("This request URL " + me._req.url + " was not found on this server.");
res.end();
},
// 返回图片
retImage: function(filePath, res) {
var me = this;
var ext = path.extname(filePath);
ext = ext ? ext.slice(1) : 'unknown';
fs.readFile(filePath, "binary", function (err, file) {
if (err) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end();
} else {
var contentType = me.mime[ext] || "text/plain";
res.writeHead(200, {'Content-Type': contentType});
res.write(file, "binary");
res.end();
}
});
},
// 处理用户图片
getImage: function(req, res) {
var me = this;
// fileId
var fileId = url.parse(req.url, true).query['fileId'];
if(!fileId) {
return me.e404(res);
}
// 先查看本地是否有该文件
// has表示本地数据库有记录
File.getImageLocalPath(fileId, function(has, fileLocalPath) {
// 本地有
if(has && fileLocalPath && path.exists(fileLocalPath) ) {
if(fileLocalPath) {
me.retImage(fileLocalPath, res);
// 本地没有路径
} else {
// 这里不会执行, 会执行下面的, 本地没有图片, 要从远程获取
// 是否需要重新从远程获取呢?
log('本地有数据, 但是图片找不到了, 可能自己删除了图片?');
me.e404(res);
}
} else {
// 访问api, 得到图片
Api.getImage(fileId, function(fileLocalPath, filename) {
if(fileLocalPath) {
log('图片保存到本地成功');
// 保存到本地数据库中
File.addImageForce(fileId, fileLocalPath, function(doc) {
if(doc) {
log('保存到本地数据库成功');
} else {
log('保存到数据库失败');
}
return me.retImage(fileLocalPath, res);
});
} else {
// 远程取不到图片, 是没有网络? 还是远程真的没有了
// TODO
log('取不远程的图片' + fileId);
return me.e404(res);
}
});
}
});
}
};
module.exports = Server;

1
node_modules/user.js generated vendored
View File

@@ -59,6 +59,7 @@ var User = {
}, },
// 打开软件时, 从db中获取当前用户 // 打开软件时, 从db中获取当前用户
init: function(callback) { init: function(callback) {
console.log("......user init.......")
var me = this; var me = this;
db.users.findOne({IsActive: true}, function(err, doc) { db.users.findOne({IsActive: true}, function(err, doc) {
if(err || !doc) { if(err || !doc) {

17
public/js/app/launch.js Normal file
View File

@@ -0,0 +1,17 @@
/**
* 入口, 转发
*/
// 服务器开启
ServerService.start();
// 判断是否登录
UserService.init(function(userInfo) {
if(userInfo) {
UserInfo = userInfo;
location.href = 'note.html';
} else {
alert(2);
location.href = 'login.html';
}
});

View File

@@ -15,10 +15,13 @@ var Service = {
var ApiService = Service.apiService; var ApiService = Service.apiService;
var UserService = Service.userService; var UserService = Service.userService;
var SyncService = Service.syncServie; var SyncService = Service.syncServie;
var ServerService = require('server');
// 分发服务 // 分发服务
// route = /note/notebook // route = /note/notebook
// 过时 // 过时
Service.dispatch = function() {};
/*
Service.dispatch = function(router, param, callback) { Service.dispatch = function(router, param, callback) {
var me = this; var me = this;
router = $.trim(router); router = $.trim(router);
@@ -35,6 +38,7 @@ Service.dispatch = function(router, param, callback) {
callback && callback(false); callback && callback(false);
} }
}; };
*/
// 右键菜单 // 右键菜单
$(document).on('contextmenu', function (e) { $(document).on('contextmenu', function (e) {

View File

@@ -3,6 +3,7 @@
var Notebook = require('notebook'); var Notebook = require('notebook');
var Note = require('note'); var Note = require('note');
var Api = require('api'); var Api = require('api');
var Server = require('server');
/* /*
Notebook.addNotebook("1", "life"); Notebook.addNotebook("1", "life");
@@ -14,4 +15,8 @@ Notebook.addNotebook("4", "life2", "1");
// Notebook.reCountNotebookNumberNotes('54bb2e89c596f2239a000000'); // Notebook.reCountNotebookNumberNotes('54bb2e89c596f2239a000000');
Api.auth('c@a.com', 'abc123'); // Api.auth('c@a.com', 'abc123');
var content = '<img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001"> <img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">' + "\n" + '<img src="http://localhost:9000/api/file/getImage?fileId=54c2083f99c37bea5f000001">';
var reg = new RegExp('<img *src="' + Api.leanoteUrl + '/api/file/getImage', 'g');
content = content.replace(reg, '<img src="' + Server.localUrl + '/api/file/getImage');
console.log(content);