From 1f6c7bb2fb104f992ac54beeb116268cdd4a0389 Mon Sep 17 00:00:00 2001 From: luchenqun Date: Fri, 10 Feb 2017 14:04:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=87=E4=BB=B6=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=EF=BC=8C=E5=B0=86=E6=96=87=E4=BB=B6=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E6=8F=92=E5=85=A5=E5=88=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 11 -- database/db.js | 40 +++-- package.json | 1 + public/css/externe/uploadfile.css | 146 ++++++++++++++++++ public/index.html | 4 +- .../controllers/settings-controller.js | 8 +- .../scripts/externe/jquery.uploadfile.min.js | 8 + public/views/settings.html | 2 +- routes/api.js | 132 ++++++++++++++++ 9 files changed, 323 insertions(+), 29 deletions(-) create mode 100644 public/css/externe/uploadfile.css create mode 100644 public/scripts/externe/jquery.uploadfile.min.js diff --git a/app.js b/app.js index 91818f9..fe91d77 100644 --- a/app.js +++ b/app.js @@ -6,7 +6,6 @@ var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var mongoStore = require('connect-mongo')(session); -var mount_uploadify = require('uploadify'); var routes = require('./routes/index'); var users = require('./routes/users'); @@ -43,16 +42,6 @@ app.use(session({ app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); -mount_uploadify(app, { - path: '/fileupload', - fileKey: 'myfile', - multer: { - dest: 'uploads/' - }, - callback: function(req) { - return req.files - } -}); app.use('/api', api); app.use('/users', users); diff --git a/database/db.js b/database/db.js index d6df30a..56568c6 100644 --- a/database/db.js +++ b/database/db.js @@ -1,7 +1,7 @@ var mysql = require('mysql'); var client = mysql.createConnection({ host: '127.0.0.1', - user: 'test', // mysql的账号 + user: 'test', // mysql的账号 password: '123456', // mysql 的密码 database: 'mybookmarks', multipleStatements: true, @@ -42,15 +42,27 @@ var db = { // }); 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')"; + var insertSql = "INSERT INTO `bookmarks` (`user_id`, `title`, `description`, `url`, `public`, `click_count`) VALUES ('" + user_id + "', '" + bookmark.title + "', '" + bookmark.description + "', '" + bookmark.url + "', '" + bookmark.public + "', '1')"; + var selectSql = "SELECT * FROM `bookmarks` WHERE `user_id` = '" + user_id + "' AND `url` = '" + bookmark.url + "'" return new Promise(function(resolve, reject) { - client.query(sql, (err, result) => { + client.query(selectSql, (err, result) => { if (err) { reject(err); } else { - resolve(result.insertId); + if (result.length >= 1) { + resolve(result[0].id); + } else { + client.query(insertSql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result.insertId); + } + }); + } } }); + }); }; @@ -294,7 +306,7 @@ db.getAdvices = function(params) { db.addAdvice = function(params) { console.log('addAdvice'); - var sql = "INSERT INTO `advices` (`user_id`, `comment`, `category`) VALUES ('"+ params.user_id +"', '"+ params.comment +"', '"+ params.category +"')"; + var sql = "INSERT INTO `advices` (`user_id`, `comment`, `category`) VALUES ('" + params.user_id + "', '" + params.comment + "', '" + params.category + "')"; return new Promise(function(resolve, reject) { client.query(sql, (err, result) => { if (err) { @@ -330,13 +342,17 @@ db.addTags = function(user_id, tags_name) { sql += "('" + user_id + "', '" + name + "')"; }); return new Promise(function(resolve, reject) { - client.query(sql, (err, result) => { - if (err) { - reject(err); - } else { - resolve(result.insertId); - } - }); + if (tags_name.length == 0) { + reject("tags_name is empty"); + } else { + client.query(sql, (err, result) => { + if (err) { + reject(err); + } else { + resolve(result.insertId); + } + }); + } }); }; diff --git a/package.json b/package.json index 8fe8801..15d95cd 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "express": "~4.13.4", "express-session": "^1.14.1", "morgan": "~1.7.0", + "multer": "^1.3.0", "mysql": "^2.11.1", "node-readability": "^2.2.0", "serve-favicon": "~2.3.0", diff --git a/public/css/externe/uploadfile.css b/public/css/externe/uploadfile.css new file mode 100644 index 0000000..e22bafb --- /dev/null +++ b/public/css/externe/uploadfile.css @@ -0,0 +1,146 @@ +.ajax-file-upload-statusbar { +border: 1px solid #0ba1b5; +margin-top: 10px; +width: 420px; +margin-right: 10px; +margin: 5px; +-moz-border-radius: 4px; +-webkit-border-radius: 4px; +border-radius: 4px; +padding: 5px 5px 5px 15px +} + +.ajax-file-upload-filename { +width: 300px; +height: auto; +margin: 0 5px 5px 0px; + +} + +.ajax-file-upload-filesize { +width: 50px; +height: auto; +margin: 0 5px 5px 0px; +display: inline-block; +vertical-align:middle; +} +.ajax-file-upload-progress { +margin: 5px 10px 5px 0px; +position: relative; +width: 250px; +border: 1px solid #ddd; +padding: 1px; +border-radius: 3px; +display: inline-block; +color:#FFFFFF; + +} +.ajax-file-upload-bar { +background-color: #0ba1b5; +width: 0; +height: 20px; +border-radius: 3px; +color:#FFFFFF; + +} +.ajax-file-upload-percent { +position: absolute; +display: inline-block; +top: 3px; +left: 48% +} +.ajax-file-upload-red { +-moz-box-shadow: inset 0 39px 0 -24px #e67a73; +-webkit-box-shadow: inset 0 39px 0 -24px #e67a73; +box-shadow: inset 0 39px 0 -24px #e67a73; +background-color: #e4685d; +-moz-border-radius: 4px; +-webkit-border-radius: 4px; +border-radius: 4px; +display: inline-block; +color: #fff; +font-family: arial; +font-size: 13px; +font-weight: normal; +padding: 4px 15px; +text-decoration: none; +text-shadow: 0 1px 0 #b23e35; +cursor: pointer; +vertical-align: top; +margin: 5px 10px 5px 0px; +} +.ajax-file-upload-green { +background-color: #77b55a; +-moz-border-radius: 4px; +-webkit-border-radius: 4px; +border-radius: 4px; +margin: 0; +padding: 0; +display: inline-block; +color: #fff; +font-family: arial; +font-size: 13px; +font-weight: normal; +padding: 4px 15px; +text-decoration: none; +cursor: pointer; +text-shadow: 0 1px 0 #5b8a3c; +vertical-align: top; +margin: 5px 10px 5px 0px; +} +.ajax-file-upload { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + font-weight: bold; + padding: 15px 20px; + cursor:pointer; + line-height:20px; + height:25px; + margin:0 10px 10px 0; + display: inline-block; + background: #fff; + border: 1px solid #e8e8e8; + color: #888; + text-decoration: none; + border-radius: 3px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -moz-box-shadow: 0 2px 0 0 #e8e8e8; + -webkit-box-shadow: 0 2px 0 0 #e8e8e8; + box-shadow: 0 2px 0 0 #e8e8e8; + padding: 6px 10px 4px 10px; + color: #fff; + background: #2f8ab9; + border: none; + -moz-box-shadow: 0 2px 0 0 #13648d; + -webkit-box-shadow: 0 2px 0 0 #13648d; + box-shadow: 0 2px 0 0 #13648d; + vertical-align: middle; + } + +.ajax-file-upload:hover { + background: #3396c9; + -moz-box-shadow: 0 2px 0 0 #15719f; + -webkit-box-shadow: 0 2px 0 0 #15719f; + box-shadow: 0 2px 0 0 #15719f; +} + +.ajax-upload-dragdrop +{ + + border:2px dotted #A5A5C7; + width:420px; + color: #DADCE3; + text-align:left; + vertical-align:middle; + padding:10px 10px 0px 10px; +} + +.state-hover +{ + border:2px solid #A5A5C7; +} +.ajax-file-upload-container +{ + margin:20px 0px 20px 0px; +} \ No newline at end of file diff --git a/public/index.html b/public/index.html index e41f7eb..17f1890 100644 --- a/public/index.html +++ b/public/index.html @@ -10,7 +10,7 @@ - + @@ -55,6 +55,6 @@ - + diff --git a/public/scripts/controllers/settings-controller.js b/public/scripts/controllers/settings-controller.js index 3930b29..9459ab1 100644 --- a/public/scripts/controllers/settings-controller.js +++ b/public/scripts/controllers/settings-controller.js @@ -45,10 +45,12 @@ app.controller('settingsCtr', ['$scope', '$stateParams', '$filter', '$state', '$ setTimeout(function() { $("#fileuploader").uploadFile({ - url: "fileupload", - multiple: true, + url: "/api/uploadBookmarkFile", + multiple: false, dragDrop: true, - fileName: "myfile", + fileName: "bookmark", + acceptFiles: "text/html", + maxFileSize: 10 * 1024 * 1024, // 最大10M onSuccess: function(files, response, xhr, pd) { console.log(JSON.stringify(response[0])); }, diff --git a/public/scripts/externe/jquery.uploadfile.min.js b/public/scripts/externe/jquery.uploadfile.min.js new file mode 100644 index 0000000..51efaa6 --- /dev/null +++ b/public/scripts/externe/jquery.uploadfile.min.js @@ -0,0 +1,8 @@ +/*! + * jQuery Upload File Plugin + * version: 4.0.10 + * @requires jQuery v1.5 or later & form plugin + * Copyright (c) 2013 Ravishanker Kusuma + * http://hayageek.com/ + */ +!function(e){void 0==e.fn.ajaxForm&&e.getScript(("https:"==document.location.protocol?"https://":"http://")+"malsup.github.io/jquery.form.js");var a={};a.fileapi=void 0!==e("").get(0).files,a.formdata=void 0!==window.FormData,e.fn.uploadFile=function(t){function r(){S||(S=!0,function e(){if(w.sequential||(w.sequentialCount=99999),0==x.length&&0==D.length)w.afterUploadAll&&w.afterUploadAll(C),S=!1;else{if(D.length1?void(t.showError&&e("
"+t.multiDragErrorStr+"
").appendTo(a.errorLog)):void(0!=t.onSelect(o)&&l(t,a,o))}),r.on("dragleave",function(a){e(this).removeClass(t.dragDropHoverClass)}),e(document).on("dragenter",function(e){e.stopPropagation(),e.preventDefault()}),e(document).on("dragover",function(a){a.stopPropagation(),a.preventDefault();var r=e(this);r.hasClass(t.dragDropContainerClass)||r.removeClass(t.dragDropHoverClass)}),e(document).on("drop",function(a){a.stopPropagation(),a.preventDefault(),e(this).removeClass(t.dragDropHoverClass)})}function s(e){var a="",t=e/1024;if(parseInt(t)>1024){var r=t/1024;a=r.toFixed(2)+" MB"}else a=t.toFixed(2)+" KB";return a}function i(a){var t=[];t="string"==jQuery.type(a)?a.split("&"):e.param(a).split("&");var r,o,s=t.length,i=[];for(r=0;s>r;r++)t[r]=t[r].replace(/\+/g," "),o=t[r].split("="),i.push([decodeURIComponent(o[0]),decodeURIComponent(o[1])]);return i}function l(a,t,r){for(var o=0;oa.maxFileSize)a.showError&&e("
"+r[o].name+" "+a.sizeErrorStr+s(a.maxFileSize)+"
").appendTo(t.errorLog);else if(-1!=a.maxFileCount&&t.selectedFiles>=a.maxFileCount)a.showError&&e("
"+r[o].name+" "+a.maxFileCountErrorStr+a.maxFileCount+"
").appendTo(t.errorLog);else{t.selectedFiles++,t.existingFileNames.push(r[o].name);var l=a,p=new FormData,u=a.fileName.replace("[]","");p.append(u,r[o]);var c=a.formData;if(c)for(var h=i(c),f=0;f");C.appendTo("body");var b=[];b.push(r[o].name),v(C,l,w,b,t,r[o]),t.fileCounter++}else a.showError&&e("
"+r[o].name+" "+a.duplicateErrorStr+"
").appendTo(t.errorLog);else a.showError&&e("
"+r[o].name+" "+a.extErrorStr+a.allowedTypes+"
").appendTo(t.errorLog)}function n(e,a,t){var r=a.allowedTypes.toLowerCase().split(/[\s,]+/g),o=t.split(".").pop().toLowerCase();return"*"!=a.allowedTypes&&jQuery.inArray(o,r)<0?!1:!0}function d(e,a){var t=!1;if(e.existingFileNames.length)for(var r=0;r"),p="";o.multiple&&(o.fileName.indexOf("[]")!=o.fileName.length-2&&(o.fileName+="[]"),p="");var u=e(p).appendTo(d);u.change(function(){t.errorLog.html("");var i=(o.allowedTypes.toLowerCase().split(","),[]);if(this.files){for(g=0;g"+p+" "+o.extErrorStr+o.allowedTypes+"").appendTo(t.errorLog));if(u.push({name:p,size:"NA"}),0==o.onSelect(u))return}if(c(o,t),s.unbind("click"),d.hide(),h(t,r,o,s),d.addClass(r),o.serialize&&a.fileapi&&a.formdata){d.removeClass(r);var f=this.files;d.remove(),l(o,t,f)}else{for(var w="",g=0;g":i[g]+"
",t.fileCounter++;if(-1!=o.maxFileCount&&t.selectedFiles+i.length>o.maxFileCount)return void(o.showError&&e("
"+w+" "+o.maxFileCountErrorStr+o.maxFileCount+"
").appendTo(t.errorLog));t.selectedFiles+=i.length;var C=new m(t,o);C.filename.html(w),v(d,o,C,i,t,null)}}),o.nestedForms?(d.css({margin:0,padding:0}),s.css({position:"relative",overflow:"hidden",cursor:"default"}),u.css({position:"absolute",cursor:"pointer",top:"0px",width:"100%",height:"100%",left:"0px","z-index":"100",opacity:"0.0",filter:"alpha(opacity=0)","-ms-filter":"alpha(opacity=0)","-khtml-opacity":"0.0","-moz-opacity":"0.0"}),d.appendTo(s)):(d.appendTo(e("body")),d.css({margin:0,padding:0,display:"block",position:"absolute",left:"-250px"}),-1!=navigator.appVersion.indexOf("MSIE ")?s.attr("for",i):s.click(function(){u.click()}))}function f(a,t){return this.statusbar=e("
").width(t.statusBarWidth),this.preview=e("").width(t.previewWidth).height(t.previewHeight).appendTo(this.statusbar).hide(),this.filename=e("
").appendTo(this.statusbar),this.progressDiv=e("
").appendTo(this.statusbar).hide(),this.progressbar=e("
").appendTo(this.progressDiv),this.abort=e("
"+t.abortStr+"
").appendTo(this.statusbar).hide(),this.cancel=e("
"+t.cancelStr+"
").appendTo(this.statusbar).hide(),this.done=e("
"+t.doneStr+"
").appendTo(this.statusbar).hide(),this.download=e("
"+t.downloadStr+"
").appendTo(this.statusbar).hide(),this.del=e("
"+t.deletelStr+"
").appendTo(this.statusbar).hide(),this.abort.addClass("ajax-file-upload-red"),this.done.addClass("ajax-file-upload-green"),this.download.addClass("ajax-file-upload-green"),this.cancel.addClass("ajax-file-upload-red"),this.del.addClass("ajax-file-upload-red"),this}function m(a,t){var r=null;return r=t.customProgressBar?new t.customProgressBar(a,t):new f(a,t),r.abort.addClass(a.formGroup),r.abort.addClass(t.abortButtonClass),r.cancel.addClass(a.formGroup),r.cancel.addClass(t.cancelButtonClass),t.extraHTML&&(r.extraHTML=e("
"+t.extraHTML()+"
").insertAfter(r.filename)),"bottom"==t.uploadQueueOrder?e(a.container).append(r.statusbar):e(a.container).prepend(r.statusbar),r}function v(t,o,s,l,n,d){var h={cache:!1,contentType:!1,processData:!1,forceSync:!1,type:o.method,data:o.formData,formData:o.fileData,dataType:o.returnType,beforeSubmit:function(a,r,d){if(0!=o.onSubmit.call(this,l)){if(o.dynamicFormData){var u=i(o.dynamicFormData());if(u)for(var h=0;h"+o.uploadErrorStr+"
"),s.cancel.show(),t.remove(),s.cancel.click(function(){x.splice(x.indexOf(t),1),p(n,l),s.statusbar.remove(),o.onCancel.call(n,l,s),n.selectedFiles-=l.length,c(o,n)}),!1},beforeSend:function(e,t){s.progressDiv.show(),s.cancel.hide(),s.done.hide(),o.showAbort&&(s.abort.show(),s.abort.click(function(){p(n,l),e.abort(),n.selectedFiles-=l.length,o.onAbort.call(n,l,s)})),a.formdata?s.progressbar.width("1%"):s.progressbar.width("5%")},uploadProgress:function(e,a,t,r){r>98&&(r=98);var i=r+"%";r>1&&s.progressbar.width(i),o.showProgress&&(s.progressbar.html(i),s.progressbar.css("text-align","center"))},success:function(a,r,i){if(s.cancel.remove(),D.pop(),"json"==o.returnType&&"object"==e.type(a)&&a.hasOwnProperty(o.customErrorKeyStr)){s.abort.hide();var d=a[o.customErrorKeyStr];return o.onError.call(this,l,200,d,s),o.showStatusAfterError?(s.progressDiv.hide(),s.statusbar.append("ERROR: "+d+"")):(s.statusbar.hide(),s.statusbar.remove()),n.selectedFiles-=l.length,void t.remove()}n.responses.push(a),s.progressbar.width("100%"),o.showProgress&&(s.progressbar.html("100%"),s.progressbar.css("text-align","center")),s.abort.hide(),o.onSuccess.call(this,l,a,i,s),o.showStatusAfterSuccess?(o.showDone?(s.done.show(),s.done.click(function(){s.statusbar.hide("slow"),s.statusbar.remove()})):s.done.hide(),o.showDelete?(s.del.show(),s.del.click(function(){p(n,l),s.statusbar.hide().remove(),o.deleteCallback&&o.deleteCallback.call(this,a,s),n.selectedFiles-=l.length,c(o,n)})):s.del.hide()):(s.statusbar.hide("slow"),s.statusbar.remove()),o.showDownload&&(s.download.show(),s.download.click(function(){o.downloadCallback&&o.downloadCallback(a)})),t.remove()},error:function(e,a,r){s.cancel.remove(),D.pop(),s.abort.hide(),"abort"==e.statusText?(s.statusbar.hide("slow").remove(),c(o,n)):(o.onError.call(this,l,a,r,s),o.showStatusAfterError?(s.progressDiv.hide(),s.statusbar.append("ERROR: "+r+"")):(s.statusbar.hide(),s.statusbar.remove()),n.selectedFiles-=l.length),t.remove()}};o.showPreview&&null!=d&&"image"==d.type.toLowerCase().split("/").shift()&&u(d,s.preview),o.autoSubmit?(t.ajaxForm(h),x.push(t),r()):(o.showCancel&&(s.cancel.show(),s.cancel.click(function(){x.splice(x.indexOf(t),1),p(n,l),t.remove(),s.statusbar.remove(),o.onCancel.call(n,l,s),n.selectedFiles-=l.length,c(o,n)})),t.ajaxForm(h))}var w=e.extend({url:"",method:"POST",enctype:"multipart/form-data",returnType:null,allowDuplicates:!0,duplicateStrict:!1,allowedTypes:"*",acceptFiles:"*",fileName:"file",formData:!1,dynamicFormData:!1,maxFileSize:-1,maxFileCount:-1,multiple:!0,dragDrop:!0,autoSubmit:!0,showCancel:!0,showAbort:!0,showDone:!1,showDelete:!1,showError:!0,showStatusAfterSuccess:!0,showStatusAfterError:!0,showFileCounter:!0,fileCounterStyle:"). ",showFileSize:!0,showProgress:!1,nestedForms:!0,showDownload:!1,onLoad:function(e){},onSelect:function(e){return!0},onSubmit:function(e,a){},onSuccess:function(e,a,t,r){},onError:function(e,a,t,r){},onCancel:function(e,a){},onAbort:function(e,a){},downloadCallback:!1,deleteCallback:!1,afterUploadAll:!1,serialize:!0,sequential:!1,sequentialCount:2,customProgressBar:!1,abortButtonClass:"ajax-file-upload-abort",cancelButtonClass:"ajax-file-upload-cancel",dragDropContainerClass:"ajax-upload-dragdrop",dragDropHoverClass:"state-hover",errorClass:"ajax-file-upload-error",uploadButtonClass:"ajax-file-upload",dragDropStr:"Drag & Drop Files",uploadStr:"Upload",abortStr:"Abort",cancelStr:"Cancel",deletelStr:"Delete",doneStr:"Done",multiDragErrorStr:"Multiple File Drag & Drop is not allowed.",extErrorStr:"is not allowed. Allowed extensions: ",duplicateErrorStr:"is not allowed. File already exists.",sizeErrorStr:"is not allowed. Allowed Max size: ",uploadErrorStr:"Upload is not allowed",maxFileCountErrorStr:" is not allowed. Maximum allowed files are:",downloadStr:"Download",customErrorKeyStr:"jquery-upload-file-error",showQueueDiv:!1,statusBarWidth:400,dragdropWidth:400,showPreview:!1,previewHeight:"auto",previewWidth:"100%",extraHTML:!1,uploadQueueOrder:"top"},t);this.fileCounter=1,this.selectedFiles=0;var g="ajax-file-upload-"+(new Date).getTime();this.formGroup=g,this.errorLog=e("
"),this.responses=[],this.existingFileNames=[],a.formdata||(w.dragDrop=!1),a.formdata||(w.multiple=!1),e(this).html("");var C=this,b=e("
"+w.uploadStr+"
");e(b).addClass(w.uploadButtonClass),function F(){if(e.fn.ajaxForm){if(w.dragDrop){var a=e('
').width(w.dragdropWidth);e(C).append(a),e(a).append(b),e(a).append(e(w.dragDropStr)),o(C,w,a)}else e(C).append(b);e(C).append(C.errorLog),w.showQueueDiv?C.container=e("#"+w.showQueueDiv):C.container=e("
").insertAfter(e(C)),w.onLoad.call(this,C),h(C,g,w,b)}else window.setTimeout(F,10)}(),this.startUpload=function(){e("form").each(function(a,t){e(this).hasClass(C.formGroup)&&x.push(e(this))}),x.length>=1&&r()},this.getFileCount=function(){return C.selectedFiles},this.stopUpload=function(){e("."+w.abortButtonClass).each(function(a,t){e(this).hasClass(C.formGroup)&&e(this).click()}),e("."+w.cancelButtonClass).each(function(a,t){e(this).hasClass(C.formGroup)&&e(this).click()})},this.cancelAll=function(){e("."+w.cancelButtonClass).each(function(a,t){e(this).hasClass(C.formGroup)&&e(this).click()})},this.update=function(a){w=e.extend(w,a)},this.reset=function(e){C.fileCounter=1,C.selectedFiles=0,C.errorLog.html(""),0!=e&&C.container.html("")},this.remove=function(){C.container.html(""),e(C).remove()},this.createProgress=function(e,a,t){var r=new m(this,w);r.progressDiv.show(),r.progressbar.width("100%");var o="";return o=w.showFileCounter?C.fileCounter+w.fileCounterStyle+e:e,w.showFileSize&&(o+=" ("+s(t)+")"),r.filename.html(o),C.fileCounter++,C.selectedFiles++,w.showPreview&&(r.preview.attr("src",a),r.preview.show()),w.showDownload&&(r.download.show(),r.download.click(function(){w.downloadCallback&&w.downloadCallback.call(C,[e])})),w.showDelete&&(r.del.show(),r.del.click(function(){r.statusbar.hide().remove();var a=[e];w.deleteCallback&&w.deleteCallback.call(this,a,r),C.selectedFiles-=1,c(w,C)})),r},this.getResponses=function(){return this.responses};var x=[],D=[],S=!1;return this}}(jQuery); \ No newline at end of file diff --git a/public/views/settings.html b/public/views/settings.html index b939bb6..34adf65 100644 --- a/public/views/settings.html +++ b/public/views/settings.html @@ -30,7 +30,7 @@ 书签显示设置
-
Upload
+
点我上传
diff --git a/routes/api.js b/routes/api.js index 7686251..1d64432 100644 --- a/routes/api.js +++ b/routes/api.js @@ -3,6 +3,36 @@ var mysql = require('mysql'); var crypto = require('crypto'); var read = require('node-readability'); var db = require('../database/db.js'); +var multer = require('multer'); + +var storage = multer.diskStorage({ + destination: function(req, file, cb) { + cb(null, './uploads') + }, + filename: function(req, file, cb) { + var now = new Date().format('yyyyMMddhhmmss') + if (req.session.user) { + cb(null, req.session.username + '-' + now + '.html') + } else { + cb(null, "UnknowUser" + '-' + now + '.html') + } + } +}) + +var upload = multer({ + storage: storage, + limits: { + fileSize: 10 * 1024 * 2014, // 最大值接受10M + }, + fileFilter: function(req, file, cb) { + console.log("fileFilter file = ", file) + if (file.mimetype == "text/html'") { + return cb(null, true); + } else { + return cb(null, false); + } + }, +}) api.post('/logout', function(req, res) { var params = req.body.params; @@ -439,6 +469,104 @@ api.post('/addAdvice', function(req, res) { }); }); +api.post('/uploadBookmarkFile', upload.single('bookmark'), function(req, res) { + console.log('hello uploadBookmarkFile'); + if (!req.session.user) { + res.send(401); + return; + } + + var file = req.file; + var bookmarks = [{ + "url": "https://www.163.com/", + "name": "Bookmarks", + "add_date": "1432116178", + "tags": [] + }, { + "url": "https://github.com/aponxi/npm-bookmark-parser", + "name": "aponxi/npm-bookmark-parser: Node plugin to parse Chrome bookmarks into usable JSON format, via javascript.", + "add_date": "1486615941", + "tags": ["测试栏目2", "测试栏目1"] + }, { + "url": "http://stackoverflow.com/questions/26673837/parsing-bookmark-html-in-node-js", + "name": "parsing bookmark.html in node.js - Stack Overflow", + "add_date": "1486614926", + "tags": ["测试栏目1"] + }, { + "url": "http://stackoverflow.com/", + "name": "dddddddddddddd", + "add_date": "1486614926", + "tags": ["测试栏目3"] + }]; + + var tagsName = ['测试栏目1', '测试栏目2', '测试栏目3']; + var userId = req.session.user.id; + var addTagNames = []; + + db.getTags(userId) + // 先插入分类 + .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) => { + if (newTagNames.length > 0) { + return db.addTags(userId, newTagNames) + } else { + return Promise.resolve(); + } + }) + .then(() => db.getTags(userId)) + .then((allTags) => { + bookmarks.forEach((item, index) => { + var count = 0; + + var bookmark = {}; + bookmark.title = item.name; + bookmark.description = ""; + bookmark.url = item.url; + bookmark.public = '1'; + if (item.tags.length == 0) { + item.tags.push("未分类") + } + + var tags = []; + item.tags.forEach((tag) => { + allTags.forEach((at) => { + if (at.name == tag) { + tags.push(at.id); + } + }) + }) + // 插入书签 + db.addBookmark(userId, bookmark) // 插入书签 + .then((bookmark_id) => { + db.delBookmarkTags(bookmark_id); // 不管3721,先删掉旧的分类 + return bookmark_id; + }) // 将之前所有的书签分类信息删掉 + .then((bookmark_id) => db.addTagsBookmarks(tags, bookmark_id)) // 插入分类 + .then(() => db.updateLastUseTags(userId, tags)) // 更新最新使用的分类 + .then(() => { + count++ + }) // 运气不错 + .catch((err) => console.log('uploadBookmarkFile addBookmark err', err)); // oops! + if ((index + 1) == bookmarks.length) { + // 通知前台 + } + }) + }) + .catch((err) => console.log('uploadBookmarkFile err', err)); + res.json(file); +}); + api.post('/addBookmark', function(req, res) { console.log('hello addBookmark', JSON.stringify(req.body)); if (!req.session.user) { @@ -449,6 +577,10 @@ api.post('/addBookmark', function(req, res) { var userId = req.session.user.id; var tags = bookmark.tags; db.addBookmark(userId, bookmark) // 插入书签 + .then((bookmark_id) => { + db.delBookmarkTags(bookmark_id); // 不管3721,先删掉旧的分类 + return bookmark_id; + }) // 将之前所有的书签分类信息删掉 .then((bookmark_id) => db.addTagsBookmarks(tags, bookmark_id)) // 插入分类 .then(() => db.updateLastUseTags(userId, tags)) // 更新最新使用的分类 .then(() => res.json({})) // 运气不错