前端时间有个需求,领导让做个上传下载的页面,好适配他后台c语言生成license的功能,需要独立部署到Linux服务器。我思考许久,因为就一个页面部署,所以采用传统的Tomcat部署的工程肯定是不适合需求的,并且一般的js不能直接在linux服务器执行后台命令,所以我再查询前端技术后,觉得用node js 是最合适的,因为这样既不用麻烦前端容器,并且还能执行后台命令,最主要的是对流的操作有着相当的性能(nodejs相对于需要使用大量的计算的工程,性能不是很好),因此准备做一个nodejs的页面工程。
下面是我的页面的截图(该图片已经运用于项目,请勿直接套用商业用途):
主要功能介绍,上传一个请求文件,然后日期在不手动填写的情况下,默认是当天至一百年后。然后点击生成license按钮,实现上传并生成license,最后把生成好得license下载下来。
下面我们介绍一下怎样搭建nodejs工程(webstorm):
注意:创建nodejs前,需要先添加nodejs和express。请参考其他文档
因为我们只有一个页面,和一个server。所以我们可以删除路由和其余相关的文件夹,并且改造app.js,下面是我工程server的全部代码:
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// 此方法用于在浏览器访问我们的IP时所要反回的界面
app.get("/", function (req, res) {
res.sendFile(__dirname + "/Index.html");
});
app.get("/Images/logo.png", function (req, res) {
res.sendFile(__dirname + "/Images/logo.png");
});
//此方法用于返回一个yyyyMMdd格式的日期
function getyyyyMMdd(date){
var d = new Date(date);
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1;
var curr_year = d.getFullYear();
String(curr_month).length < 2 ? (curr_month = "0" + curr_month): curr_month;
String(curr_date).length < 2 ? (curr_date = "0" + curr_date): curr_date;
var yyyyMMdd = curr_year + "" + curr_month +""+ curr_date;
return yyyyMMdd;
}
//用于生产license的方法
function creatlicense(time,deadtime,req,res,currentTime,filename) {
console.log("进入了生成license方法:"+time);
console.log(deadtime);
console.log(currentTime);
//1.首先判断是否有生成license必备的文件
var Uploder = __dirname +'/Images/imgUploader_'+currentTime+'_'+filename;
if(!fs.existsSync(Uploder)){
return res.end("Please upload the file");
}else{
//2.判断时间使用期限是否正确
var olddate = new Date(time);
var olddeaddate = new Date(deadtime);
var date = getyyyyMMdd(olddate.getTime());
var deaddate = getyyyyMMdd(olddeaddate.getTime());
console.log(date);
console.log(deaddate)
if(olddate.getTime() > olddeaddate.getTime()){
return res.end("Time error");
}else{
//用于生成license
var name='license_'+currentTime+'.pem';
var shell = “此处填写需要执行的后台命令”
console.log(shell);
//nodejs用于执行linux命令
process.exec(shell,function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}else{
console.log(__dirname + '/license/'+name);
//下载(对,你没有看错,就是这一句代码)
res.download(__dirname + '/license/'+name, 'license', function(err){
if (err) {
return res.end("Something went wrong!");
}})
}
});
}
}
}
//点击创建按钮后....
app.post("/api/Upload", function (req, res) {
var currentTime=null;
var time=null;
var deadtime=null;
var currentTime = null;
var filename = null;
var form = new formidable.IncomingForm();
//form表单提交的编码为二进制,enctype="multipart/form-data",接收后转成json格式
form.parse(req, function(err, fields, files) {
console.log('fields',fields);//表单传递的input数据
console.log(fields.otime);
console.log(fields.deadtime);
time = fields.otime
deadtime=fields.deadtime
});
//上传文件的编码
var Storage = multer.diskStorage({
//上传后需要放文件的地址
destination: function (req, file, callback) {
callback(null, "./Images");
},
//上传后的文件名
filename: function (req, file, callback) {
currentTime=Date.now()
console.log(currentTime)
filename = file.originalname
callback(null, file.fieldname + "_" + currentTime +"_"+ file.originalname);
}
});
var upload = multer({ storage: Storage }).array("imgUploader", 3);
upload(req, res, function (err) {
if (err) {
return res.end("Something went wrong!");
}
});
//上传后延迟执行生成license的方法
setTimeout(function () {
creatlicense(time,deadtime,req,res,currentTime,filename)
},500)
});
//启动8080端口
app.listen(8080, function (a) {
console.log("Listening to port 8080");
});
下面是html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>License</title>
<script language="javascript" type="text/javascript">
window.onload= function(){
var now = new Date();
var year = now.getFullYear(); //得到年份
var month = now.getMonth();//得到月份
var date = now.getDate();//得到日期
month = month + 1;
if (month < 10) month = "0" + month;
if (date < 10) date = "0" + date;
var time = "";
var deadtime = "",
time = year + "-" + month + "-" + date;
document.getElementById("otime").value=time;
var years=parseInt(year)
years = years+100;
deadtime = years + "-" + month + "-" + date;
document.getElementById("deadtime").value=deadtime;
var fileUploader = document.getElementById('FileUploader');
var pathDisplayer = document.getElementById('PathDisplayer');
if(fileUploader.addEventListener){
fileUploader.addEventListener('change', fileUploaderChangeHandler, false);
}else if(fileUploader.attachEvent){
fileUploader.attachEvent('onclick', fileUploaderClickHandler);
}else{
fileUploader.onchange = fileUploaderChangeHandler;
}
function fileUploaderChangeHandler(){
pathDisplayer.value = fileUploader.value;
}
function fileUploaderClickHandler(){
setTimeout(function(){
fileUploaderChangeHandler();
}, 0);
}
}
</script>
<style>
.body {
background: #393946;
min-height: 720px;
min-width: 1200px;
}
.banner{
height: 70px;
padding-top: 70px;
padding-right: 0px;
padding-left: 150px;
}
.div-box{
background: #FFFFFF;
height: 350px;
width: 640px;
margin-top: 70px;
margin-right: auto;
margin-bottom: 0px;
margin-left: auto;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
text-align: center;
}
.div-box h1{
font-size: 35px;
text-align: center;
color: #6D6D6D;
padding-top: 30px;
font-weight: normal;
}
.div-box form{
padding-top: 10px;
}
.input-text1{
margin-bottom: 10px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
background: #FFFFFF;
border:1px solid #d4d4d4;
}
.input-text{
margin-bottom: 10px;
border-top-left-radius: 5px;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
background: #FFFFFF;
border:1px solid #d4d4d4;
padding-left: 80px;
}
.btn{
width: 180px;
border-radius: 5px;
background: #bdc2ca;
color: #fff;
font-size: 25px;
text-align: center;
line-height: 35px;
padding: 0;
border: none;
margin-top: 10px;
}
</style>
</head>
<body class = "body">
<div class="banner">
<img src="Images/logo.png">
</div>
<div class="div-box">
<h1>License</h1>
<div class="form">
<form id="frmUploader" enctype="multipart/form-data" action="/api/Upload" method="post">
<div class="file-uploader-wrap">
<span id="span">上传证书: <input type="text" id="PathDisplayer" style="width:240px;line-height: 22px;"class="input-text1" disabled /></span>
<input type="file" name="imgUploader" style="width:70px" id="FileUploader" />
</div>
<p>生效日期: <input type="date" id="otime" style="width:235px;line-height: 22px;" class="input-text" name="otime" ></input></p>
<p>失效日期: <input type="date" id="deadtime"style="width:235px;line-height: 22px;" class="input-text"name="deadtime" ></input></p>
<input id="create" class="btn" type="submit" name="submito" value=" create license" />
</form>
</div>
</div>
</body>
</html>
主体代码就是这样,剩下的就是建立好相应的文件夹,然后需要注意的是nodejs工程在部署后
(部署需要安装相应的第三文件,此处不做介绍),在文件目录下找到appjs,运行node app.js 看到端口
启动成功没有报错就可以访问了。
注意:上面那样执行后,你会发现如果你的xshell断掉,就会发现再也没有这个端口,也就不能访问了,
因此我们需要实现在xshell启动后,可以关闭连接的窗口后同样能访问程序。
nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人。如何让nodejs应用当成服务,在后台执行呢?
最简单的办法:
$ nohup node app.js &
但是,forever能做更多的事情,比如分别记录输出和错误日志,比如可以在js中作为api使用。
$ sudo npm install forever -g #安装
$ forever start app.js #启动
$ forever stop app.js #关闭
$ forever start -l forever.log -o out.log -e err.log app.js #输出日志和错误
命令语法及使用 https://github.com/nodejitsu/forever
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://mp.csdn.net/postedit/80477620