UNPKG

visop

Version:

A simple CLI for scaffolding visible operation projects.

474 lines (422 loc) 16.7 kB
/** * Created by achar on 2016/12/5. */ /** * Created by Administrator on 2015/4/18. */ //邮件发送插件 var nodemailer = require("nodemailer"); //文件操作对象 var fs = require('fs'); var url = require('url'); var stat = fs.stat; //数据库操作对象 //var DbOpt = require("../models/Dbopt"); //数据操作日志 //var DataOptionLog = require("../models/DataOptionLog"); //时间格式化 //var moment = require('moment'); //站点配置 //var settings = require("../models/db/settings"); //var siteFunc = require("../models/db/siteFunc"); //var adminFunc = require("../models/db/adminFunc"); //文件压缩 var fs = require('fs'); var child = require('child_process'); var archiver = require('archiver'); var formidable = require('formidable') var mime = require('../util/mime').types; var iconv = require('iconv-lite'); var system = { sendEmail : function(key,obj,callBack){ var emailTitle = "Hello"; var emailSubject = "Hello"; var emailContent = "Hello"; var toEmail; if(key == settings.email_findPsd){ toEmail = obj.email; var oldLink = obj.password +'$'+ obj.email +'$'+ settings.session_secret; var newLink = DbOpt.encrypt(oldLink,settings.encrypt_key); emailSubject = emailTitle = '['+settings.SITETITLE +'] 通过激活链接找回密码'; emailContent = siteFunc.setConfirmPassWordEmailTemp(obj.userName,newLink); }else if(key == settings.email_notice_contentMsg){ emailSubject = emailTitle = '['+settings.SITETITLE +'] 用户留言提醒'; emailContent = siteFunc.setNoticeToAdminEmailTemp(obj); toEmail = settings.site_email; }else if(key == settings.email_notice_user_contentMsg){ emailSubject = emailTitle = '['+settings.SITETITLE +'] 有人给您留言啦'; emailContent = siteFunc.setNoticeToUserEmailTemp(obj); toEmail = obj.replyAuthor.email; }else if(key == settings.email_notice_contentBug){ emailSubject = emailTitle = '['+settings.SITETITLE +'] 有人给您提bug啦'; emailContent = siteFunc.setBugToAdminEmailTemp(obj); toEmail = settings.site_email; }else if(key == settings.email_notice_user_reg){ emailSubject = emailTitle = '['+settings.SITETITLE +'] 恭喜您,注册成功!'; emailContent = siteFunc.setNoticeToUserRegSuccess(obj); toEmail = obj.email; } // 发送邮件 var transporter = nodemailer.createTransport({ service: 'QQ', auth: { user: settings.site_email, pass: settings.site_email_psd } }); var mailOptions = { from: settings.site_email, // sender address to: toEmail, // list of receivers subject: emailSubject, // Subject line text: emailTitle, // plaintext body html: emailContent // html body }; transporter.sendMail(mailOptions, function(error, info){ if(error){ console.log('邮件发送失败:'+error); callBack('notCurrentEmail'); }else{ console.log('Message sent: ' + info.response); callBack(); } }); }, scanFolder : function(basePath,path){ //文件夹列表读取 // 记录原始路径 var oldPath = path; var filesList = []; var fileList = [], folderList = [], walk = function(path, fileList, folderList){ files = fs.readdirSync(basePath + path); files.forEach(function(item) { var tmpPath = basePath + path + '/' + item, relativePath = path + '/' + item, stats = fs.statSync(tmpPath); var typeKey = "folder"; if(oldPath === path){ if (stats.isDirectory()) { walk(relativePath, fileList, folderList); } else { var fileType = item.split('.')[1]; if(fileType){ var ltype = fileType.toLowerCase(); if(ltype.indexOf("jpg")>=0 || ltype.indexOf("gif")>=0 || ltype.indexOf("png")>=0 || ltype.indexOf("pdf")>=0){ typeKey = "image"; }else if(ltype.indexOf("htm")>=0){ typeKey = "html"; }else if(ltype.indexOf("js") == 0){ typeKey = "js"; }else if(ltype.indexOf("ejs") == 0){ typeKey = "ejs"; }else if(ltype.indexOf("css")>=0){ typeKey = "css"; }else if(ltype.indexOf("txt")>=0){ typeKey = "txt"; }else if(ltype.indexOf("mp4")>=0 || ltype.indexOf("mp3")>=0){ typeKey = "video"; }else{ typeKey = "others"; } } } var fileInfo = { "name" : item, "type" : typeKey, "path" : relativePath, "size" : stats.size, "date" : stats.mtime }; filesList.push(fileInfo); } }); }; walk(path, fileList, folderList); // console.log('扫描' + path +'成功----'+ filesList.join()); return filesList; }, scanJustFolder : function(path){ //只读取文件夹,不做递归 var folderList = []; var files = fs.readdirSync(path); files.forEach(function(item) { var tmpPath = path + '/' + item, stats = fs.statSync(tmpPath); if (stats.isDirectory()) { var fileInfo = { "name" : item, "type" : "folder", "size" : stats.size, "date" : stats.mtime }; folderList.push(fileInfo); } }); return folderList; }, deleteFolder : function(req, res,path,callBack){ var files = []; console.log("---del path--"+path); if( fs.existsSync(path) ) { console.log("---begin to del--"); if(fs.statSync(path).isDirectory()) { var walk = function(path){ files = fs.readdirSync(path); files.forEach(function(file,index){ var curPath = path + "/" + file; if(fs.statSync(curPath).isDirectory()) { // recurse walk(curPath); } else { // delete file fs.unlinkSync(curPath); } }); fs.rmdirSync(path); }; walk(path); console.log("---del folder success----"); callBack(); }else{ fs.unlink(path, function(err){ if(err){ console.log(err) }else{ console.log('del file success') ; callBack(); } }) ; } }else{ res.end("success"); } }, reNameFile : function(req,res,path,newPath){ if( fs.existsSync(path) ) { fs.rename(path,newPath,function(err){ if(err){ console.log("重命名失败!"); res.end("error"); }else{ console.log("重命名成功!"); res.end("success"); } }); } }, readFile : function(req,res,path){ // 文件读取 if( fs.existsSync(path) ) { fs.readFile(path,"binary",function (error,data){ if(error){ console.log(err) }else{ //处理中文乱码问题 var buf = new Buffer(data, 'binary'); var newData = iconv.decode(buf, 'utf-8'); return res.json({ fileData : newData }) } }) ; }else{ res.end(settings.system_illegal_param); } }, writeFile : function(req,res,path,content){ if( fs.existsSync(path) ) { //写入文件 var newContent = iconv.encode(content, 'utf-8'); fs.writeFile(path,newContent,function (err) { if(err){ console.log(err) }else{ console.log("----文件写入成功-----") res.end("success"); } }) ; } }, backUpData : function(res,req){ // 数据备份 var date = new Date(); var ms = moment(date).format('YYYYMMDDHHmmss').toString(); var dataPath = settings.DATABACKFORDER + ms; // var cmdstr = 'mongodump -o "'+dataPath+'"'; var cmdstr = settings.MONGODBEVNPATH + 'mongodump -u '+settings.USERNAME+' -p '+settings.PASSWORD+' -d '+settings.DB+' -o "'+dataPath+'"'; if(!fs.existsSync(settings.DATABACKFORDER)){ fs.mkdirSync(settings.DATABACKFORDER); } if (fs.existsSync(dataPath)) { console.log('已经创建过备份了'); } else { fs.mkdir(dataPath,0777,function(err1){ if (err1) throw err1; child.exec(cmdstr,function (error, stdout, stderr) { if (error !== null) { console.log('exec error: ' + error); }else{ console.log('数据备份成功'); //生成压缩文件 var output = fs.createWriteStream(settings.DATABACKFORDER + ms +'.zip'); var archive = archiver('zip'); archive.on('error', function(err){ throw err; }); archive.pipe(output); archive.bulk([ { src: [dataPath+'/**']} ]); archive.finalize(); // 操作记录入库 var optLog = new DataOptionLog(); optLog.logs = "数据备份"; optLog.path = dataPath; optLog.fileName = ms +'.zip'; optLog.save(function(err3){ if (err3) throw err3; res.end("success"); }) } }); }) } }, //文件夹复制 copyForder : function(fromPath,toPath){ /* * 复制目录中的所有文件包括子目录 * @param{ String } 需要复制的目录 * @param{ String } 复制到指定的目录 */ var copy = function( src, dst ){ // 读取目录中的所有文件/目录 fs.readdir( src, function( err, paths ){ if( err ){ throw err; } paths.forEach(function( path ){ var _src = src + '/' + path, _dst = dst + '/' + path, readable, writable; stat( _src, function( err, st ){ if( err ){ throw err; } // 判断是否为文件 if( st.isFile() ){ // 创建读取流 readable = fs.createReadStream( _src ); // 创建写入流 writable = fs.createWriteStream( _dst ); // 通过管道来传输流 readable.pipe( writable ); } // 如果是目录则递归调用自身 else if( st.isDirectory() ){ exists( _src, _dst, copy ); } }); }); }); }; // 在复制目录前需要判断该目录是否存在,不存在需要先创建目录 var exists = function( src, dst, callback ){ fs.exists( dst, function( exists ){ // 已存在 if( exists ){ callback( src, dst ); } // 不存在 else{ fs.mkdir( dst, function(){ callback( src, dst ); }); } }); }; // 复制目录 exists(fromPath,toPath,copy ); }, //获取文件真实类型 getFileMimeType : function(filePath){ var buffer = new Buffer(8); var fd = fs.openSync(filePath, 'r'); fs.readSync(fd, buffer, 0, 8, 0); var newBuf = buffer.slice(0, 4); var head_1 = newBuf[0].toString(16); var head_2 = newBuf[1].toString(16); var head_3 = newBuf[2].toString(16); var head_4 = newBuf[3].toString(16); var typeCode = head_1 + head_2 + head_3 + head_4; var filetype = ''; var mimetype; switch (typeCode){ case 'ffd8ffe1': filetype = 'jpg'; mimetype = ['image/jpeg', 'image/pjpeg']; break; case 'ffd8ffe0': filetype = 'jpg'; mimetype = ['image/jpeg', 'image/pjpeg']; break; case '47494638': filetype = 'gif'; mimetype = 'image/gif'; break; case '89504e47': filetype = 'png'; mimetype = ['image/png', 'image/x-png']; break; case '504b34': filetype = 'zip'; mimetype = ['application/x-zip', 'application/zip', 'application/x-zip-compressed']; break; case '2f2aae5': filetype = 'js'; mimetype = 'application/x-javascript'; break; case '2f2ae585': filetype = 'css'; mimetype = 'text/css'; break; case '5b7bda': filetype = 'json'; mimetype = ['application/json', 'text/json']; break; case '3c212d2d': filetype = 'ejs'; mimetype = 'text/html'; break; default: filetype = 'unknown'; break; } fs.closeSync(fd); return { fileType : filetype, mimeType : mimetype }; }, uploadTemp : function(req,res,callBack){ var form = new formidable.IncomingForm(),files=[],fields=[],docs=[]; //存放目录 var forderName; form.uploadDir = 'views/web/temp/'; form.parse(req, function(err, fields, files) { if(err){ res.end(err); }else{ fs.rename(files.Filedata.path, 'views/web/temp/' + files.Filedata.name,function(err1){ if(err1){ res.end(err1); }else{ forderName = files.Filedata.name.split('.')[0]; console.log('parsing done'); callBack(forderName); } }); } }); } }; module.exports = system;