继上一篇设置端口之后,公司又有了新的开发需求了,原来用java写过一套的升级包管理服务,现在因为新的项目需要,java代码太冗余了,所有要求用nodejs来完成升级包管理和运维服务,这个新的任务,自然而然就落到我身上了。
还好之前接触过nodejs的东西,做起来不至于一脸懵逼,这次也算是深入学习一下nodejs,数据库用的是Mysql。
主要上床这一块的主要代码了
页面的布局的布局代码
{{"uploadPackage"|translate}}
{{"upgradePackageInfo"|translate}}
{{"productType"|translate}}:
{{"search"|translate}}
因为项目不同的产品类型有不同的输入内容,所以每一次选择不同的产品,有不同的界面布局
不同的产品升级包采用表格的形式来呈现和管理
function createTable(url) {
var $table = $('#table');
$table.bootstrapTable('destroy');
$table.bootstrapTable({
url: url,
queryParams: function (params) {//请求服务器时所传的参数
return {
pageSize: params.limit, //每一页的数据行数,默认是上面设置的10(pageSize)
pageIndex: params.offset + 1, //当前页面,默认是上面设置的1(pageNumber)
}
},
pageNumber: 1,
cache: false,
pageSize: 5,
pageList: [2, 5, 10, 15, 20, 25],//分页步进值
pagination: true,
sidePagination: 'server',//指定服务器端分页
locale: language.tableLanguage,//en-US英文,zh-CN中文
columns: [
{
title: language.productType,
field: 'productType',
align: 'center',
},
{
title: language.versionNum,
field: 'versionNum',
align: 'center',
},
{
title: language.packageSize,
field: 'packageSize',
align: 'center'
},
{
title: language.packageName,
field: 'packageName',
align: 'center'
},
{
title: language.uploadPath,
field: 'uploadPath',
align: 'center'
},
{
title: language.uploadTime,
field: 'uploadTime',
align: 'center'
},
{
title: language.downloadTimes,
field: 'downloadTimes',
align: 'center'
},
{
title: language.fileDesc,
field: 'packageDesc',
align: 'center'
},
{
title: language.versionDesc,
field: 'versionDesc',
align: 'center'
},
{
title: language.operation,
field: 'operate',
align: 'center',
formatter: operateFormatter,
events: operateEvents
}
],
});
}
这就是创建表格的方法,不过还有删除功能,所以还有一些辅助的方法
function operateFormatter(val, row, index) {
if (lang == "zh" || lang == "zh-cn") {
return ' ';
} else {
return ' ';
}
};
//删除行数据后,重建表格
function deletePackageInfo(productType, versionNum) {
var productionType;
for (var i in productionAllDta) {
if (productionAllDta[i].typeName == productType) {
productionType = productionAllDta[i].typeCode;
break;
}
}
createTable("/fxrest/packages/" + productionType + "/" + versionNum);
};
//按产品类型查询,并在表格中显示
$scope.productTypeSelect = "";
$scope.search = function () {
var productionType;
for (var i in productionAllDta) {
if (productionAllDta[i].typeName == $scope.productTypeSelect) {
productionType = productionAllDta[i].typeCode;
break;
}
}
createTable("/fxrest/packages/" + productionType);
};
//动态设置表格所在div高度
var hh = document.body.clientHeight;
var packageInfoHeight = hh * 0.9 - 180;
var packageInfoTableHeight = packageInfoHeight - 40;
$("#package_info").height(packageInfoHeight);
$("#package_info_table").height(packageInfoTableHeight);
window.onresize = function () {
var hh = document.body.clientHeight;
var packageInfoHeight = hh * 0.9 - 180;
var packageInfoTableHeight = packageInfoHeight - 40;
$("#package_info").height(packageInfoHeight);
$("#package_info_table").height(packageInfoTableHeight);
}
//响应点击事件
window.operateEvents = {
'click .del': function (e, value, row, index) {
if (confirm(language.deleteConfirm)) {
deletePackageInfo(row.productType, row.versionNum);
}
}
};
主要就是上传部分了,上传部分的代码其实很简单
$scope.upload = function (productType, fileDesc, versionDesc, upFileValue, versionCode, productDevice, file) {
console.log("----------uploadFlag---------" + uploadFlag);
if (uploadFlag == "" || uploadFlag == "uploadSuccess") {
var obj = productType + ":" + fileDesc + ":" + versionDesc + ":" + upFileValue + ":" + versionCode + ":" + productDevice;
$('#progress').show();
var schedule = 0;
var up = Upload.upload({
//请求接收的地址
url: '/fxrest/UpgradePackageUpload' + obj,
//上传的文件
method: 'POST',
file: file
}).progress(function (evt) {
//进度条
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
// console.log('progess:' + progressPercentage + '%' + evt.config.file.name);
schedule = progressPercentage;
$('#bar').css('width', schedule + '%');
$('#bar')[0].innerHTML = schedule + '%';
console.log("================uploadFlag==========" + schedule);
uploadFlag = "uploading";
if (schedule == 99) {
$('#bar').css('width', '100%');
$('#bar')[0].innerHTML = '100%';
uploadFlag = "uploadSuccess";
} else if (schedule == 100) {
$('#bar').css('width', '100%');
$('#bar')[0].innerHTML = '100%';
uploadFlag = "uploadSuccess";
}
}).success(function (data, status, headers, config) {
//上传成功
$('#progress').hide();
console.log('file ' + config.file.name + 'uploaded. Response: ' + JSON.stringify(data));
if (data.result == "0") {
alert(language.uploadFail);
} else if (data.result == "1") {
alert(language.uploadSuccess);
console.log("uploadFlag1:" + uploadFlag);
clear();
console.log("uploadFlag2:" + uploadFlag);
createTable('/fxrest/packages');
} else if (data.result == "3") {
alert(language.fileNameExits);
}
}).error(function (data, status, headers, config) {
//上传失败
// console.log('error status: ' + status);
alert(language.uploadFail);
});
$scope.cancelFile = up.abort;
} else if (uploadFlag == "uploading") {
alert(language.fileIsUploading);
}
};
这里是请求的部分,下面看看服务器是这么接收的
router.post('/UpgradePackageUpload:obj', function (req, res) {
logger.info("mainController 请求升级");
var param = req.params.obj;
logger.info("param>>>>>" + param);
var productType = param.split(":")[0];
var fileDesc = param.split(":")[1];
var versionDesc = param.split(":")[2];
var upFileValue = param.split(":")[3];
var versionCode = param.split(":")[4];
//var md5 = param.split(":")[5];
var productDevice = param.split(":")[5];
mainService.UpgradePackageUpload(productType, fileDesc, versionDesc, upFileValue, versionCode, productDevice, req, res);
});
这里是控制器的部分,将字段都处理好
module.exports.UpgradePackageUpload = function (productType, fileDesc, versionDesc, upFileValue, versionCode, productDevice, req, res) {
//上传文件到服务器
console.log(upFileValue);
upload(productType, fileDesc, versionDesc, upFileValue, versionCode, productDevice, req, res);
};
function upload(productType, fileDesc, versionDesc, upFileValue, versionCode, productDevice, req, res) {
var flag;
var uploadDir = "";
var linux = os.platform() == 'linux' ? 1 : 0;
if (linux) {
uploadDir = "/etc/sysconfig/workspace";
} else {
uploadDir = "E:/workspace";//测试路径
}
var exists = fs.existsSync(uploadDir);
console.log(exists ? "目录存在" : "目录不存在");
if (!exists) {
fs.mkdirSync(uploadDir);
}
var form = new formidable.IncomingForm();
form.uploadDir = uploadDir;//必须设置
form.encoding = 'utf-8';
form.multiples = true;//设置为多文件上传
form.keepExtensions = true;
var selectPackageName, packageName;
var downloadTimes = "0", versionNum = "1";
var allFiles = [];
// var fileInfo={
// productType : "",
// packageDesc:"",
// versionDesc:"",
// packageName : "",
// uploadPath : "",
// packageSize : "",
// versionNum:"",
// downloadTimes:"",
// };
form.on('file', function (name, file) {
// packageName = file.name;
// var fileInfo={};
// fileInfo.packageName = packageName;
// fileInfo.uploadPath = uploadDir + "/" + file.name;
// fileInfo.packageSize = (file.size/1024).toFixed(2);
// fileInfo.productType = productType;
// fileInfo.packageDesc = fileDesc;
// fileInfo.versionDesc = versionDesc;
// fileInfo.downloadTimes = downloadTimes;
// fileInfo.versionNum = versionNum;
allFiles.push(file);
});
form.parse(req, function (error, fields, files) {
if (error) {
flag = false;
} else {
allFiles.forEach(function (file, index) {
console.log("file:" + JSON.stringify(file));
var oldPath = file.path;
var newPath = uploadDir + "/" + file.name;
var md5;
fs.rename(oldPath, newPath, function (err) {
if (err) {
logger.info("改名失败");
} else {
fileUploadDao.selectUpGradePackagePackageName(upFileValue, function (err, vals) {
if (err) {
flag = false;
logger.info("查询文件名失败:" + err);
res.send({result: 0});
} else if (vals.length == 0) {
if (productType == "IPVT-ROM-01") {
var rs = fs.createReadStream(newPath);
var hash = crypto.createHash('md5');
rs.on('data', hash.update.bind(hash));
rs.on('end', function () {
md5 = hash.digest('hex');
fileUploadDao.getNodeIp(function (err, vals) {
if (vals && vals.length > 0) {
console.log(vals);
var url = "http://" + vals[0].node_ip + ":6061/download/" + file.name
var result = {
productDevice: productDevice,
fileUrl: url,
fileSize: file.size,
md5: md5,
release_note: versionDesc,
versionCode: versionCode
}
logger.info("rom上传信息>>>>>>>>" + JSON.stringify(result))
var postUrl = "http://" + vals[0].node_ip + ":9003/uploadRomByUrl";
postUrl = postUrl + "?&productDevice=" + productDevice + "&fileUrl=" + url + "&fileSize=" + file.size + "&md5=" + md5 + "&release_note=" + versionDesc + "&versionCode=" + versionCode
rest.postRes(postUrl, result, function (data) {
if (data.result == true) {
logger.info("上传请求发送成功");
fileUploadDao.selectUpGradePackageVersionNum(productType, function (err, vals) {
logger.info("start db operation....")
if (err) {
flag = false;
logger.info("查询数据库失败=" + err);
if (flag) {
res.send({result: 1});
} else {
res.send({result: 0});
}
}
var fileInfo = {};
fileInfo.packageName = file.name;
fileInfo.uploadPath = uploadDir + "/" + file.name;
fileInfo.packageSize = (file.size / 1024).toFixed(2);
fileInfo.productType = productType;
fileInfo.packageDesc = fileDesc;
fileInfo.versionDesc = versionDesc;
fileInfo.downloadTimes = downloadTimes;
fileInfo.versionNum = versionNum;
if (vals && vals.length == 0) {
fileUploadDao.insertUpGradePackageInfo(fileInfo, function (err, vals) {
if (err) {
logger.info("保存数据库失败:" + err);
res.send({result: 0})
} else {
fileUploadDao.insertUpGradePackageRomInfo(productType, fileInfo.versionNum, productDevice, versionCode, function (err, vals) {
if (err) {
logger.error("insertUpGradePackageRomInfo失败:" + err);
deletePackInfo(productType, fileInfo.versionNum, res);
res.send({result: 0});
} else {
res.send({result: 1});
}
});
}
});
} else {
fileInfo.versionNum = vals[vals.length - 1].versionNum + 1;
fileUploadDao.insertUpGradePackageInfo(fileInfo, function (err, vals) {
if (err) {
logger.info("更新数据库失败:" + err);
res.send({result: 0})
} else {
fileUploadDao.insertUpGradePackageRomInfo(productType, fileInfo.versionNum, productDevice, versionCode, function (err, vals) {
if (err) {
logger.error("insertUpGradePackageRomInfo失败:" + err);
deletePackInfo(productType, fileInfo.versionNum, res);
res.send({result: 0});
} else {
res.send({result: 1});
}
});
}
});
}
});
} else {
logger.info("上传请求发送失败")
res.send({result: 0});
}
});
} else {
logger.info("查询本级节点IP失败")
res.send({result: 0});
}
});
});
} else {
fileUploadDao.selectUpGradePackageVersionNum(productType, function (err, vals) {
if (err) {
flag = false;
logger.info("查询数据库失败=" + err);
if (flag) {
res.send({result: 1});
} else {
res.send({result: 0});
}
}
var fileInfo = {};
fileInfo.packageName = file.name;
fileInfo.uploadPath = uploadDir + "/" + file.name;
fileInfo.packageSize = (file.size / 1024).toFixed(2);
fileInfo.productType = productType;
fileInfo.packageDesc = fileDesc;
fileInfo.versionDesc = versionDesc;
fileInfo.downloadTimes = downloadTimes;
fileInfo.versionNum = versionNum;
if (vals && vals.length == 0) {
fileUploadDao.insertUpGradePackageInfo(fileInfo, function (err, vals) {
flag = true;
if (err) {
logger.info("保存数据库失败:" + err);
flag = false;
}
if (flag) {
res.send({result: 1});
} else {
res.send({result: 0});
}
});
} else {
fileInfo.versionNum = vals[vals.length - 1].versionNum + 1;
fileUploadDao.insertUpGradePackageInfo(fileInfo, function (err, vals) {
flag = true;
if (err) {
flag = false;
logger.info("更新数据库失败:" + err);
}
if (flag) {
res.send({result: 1});
} else {
res.send({result: 0});
}
});
}
});
}
} else {
res.send({result: 3});
}
});
}
});
});
}
});
form.on("end", function () {
});
function deletePackInfo(productType, versionNum, res) {
suspend(function*() {
try {
yield upgradePackageInfoDao.deletePackageInfo(productType, versionNum, resume())
res.send({result: 0});
} catch (e) {
res.send({result: 0});
}
})();
}
这是服务的部分,代码很多很长,因为要处理不同的产品,还有一个产品需要和另外一台服务器连接,有别人的服务区管理,所以还得将问价转给别人一份
接下来是删除上传的文件
module.exports.deletePackageInfo = function (productType, versionNum, pageSize, pageIndex, res) {
logger.info("按条件删除升级包信息,productType:" + productType + "versionNum:" + versionNum + ",pageSize:" + pageSize + ",pageIndex:" + pageIndex);
var uploadDir = "";
var linux = os.platform() == 'linux' ? 1 : 0;
if (linux) {
uploadDir = "/etc/sysconfig/workspace";
} else {
uploadDir = "E:\\workspace";//测试路径
}
if (productType == "IPVT-ROM-01") {
logger.info("进入IPVT-ROM-01 删除操作")
suspend(function*() {
try {
var romInfo = yield upgradePackageInfoDao.getRomInfoByProductTypeAndVersionNum(productType, versionNum, resume());
logger.info("romInfo>>>" + JSON.stringify(romInfo))
logger.info("romInfo.length>>>" + romInfo.length)
if (romInfo && romInfo.length > 0) {
fileUploadDao.getNodeIp(function (err, vals) {
if (vals && vals.length > 0) {
logger.info("节点IP:" + vals);
var postUrl = "http://" + vals[0].node_ip + ":9003/delVersionByVcode";
postUrl = postUrl + "?&productDevice=" + romInfo[0].productDevice + "&versionCode=" + romInfo[0].versionCode
rest.postRes(postUrl, null, function (data) {
if (data.result == true) {
logger.info("删除请求发送成功");
suspend(function*() {
try {
//删除上传路径下的升级包
var packageName = yield upgradePackageInfoDao.getPackageNameByProductTypeAndVersionNum(productType, versionNum, resume());
fs.unlinkSync(uploadDir + "/" + packageName);
//删除数据库里记录信息
yield upgradePackageInfoDao.deleteRomInfo(productType, versionNum, resume())
var result = yield upgradePackageInfoDao.deletePackageInfo(productType, versionNum, pageSize, pageIndex, resume());
var allDatas = yield upgradePackageInfoDao.getAllPackageInfos(resume());
var data = {};
data.total = allDatas.length;
data.rows = result;
res.json(data);
} catch (e) {
res.json({total: 0, rows: []});
}
})();
} else {
logger.info("删除请求发送失败")
res.json({total: 0, rows: []});
}
});
}
});
} else {
suspend(function*() {
try {
logger.info("没有找到rom表对应的信息")
var packageName = yield upgradePackageInfoDao.getPackageNameByProductTypeAndVersionNum(productType, versionNum, resume());
fs.unlinkSync(uploadDir + "/" + packageName);
//删除数据库里记录信息
var result = yield upgradePackageInfoDao.deletePackageInfo(productType, versionNum, pageSize, pageIndex, resume());
var allDatas = yield upgradePackageInfoDao.getAllPackageInfos(resume());
var data = {};
data.total = allDatas.length;
data.rows = result;
res.json(data);
} catch (e) {
logger.info("删除失败")
res.json({total: 0, rows: []});
}
})();
}
} catch (e) {
res.json({total: 0, rows: []});
}
})();
} else {
suspend(function*() {
try {
logger.info("进入非 IPVT-ROM-01 删除操作")
//删除上传路径下的升级包
var packageName = yield upgradePackageInfoDao.getPackageNameByProductTypeAndVersionNum(productType, versionNum, resume());
fs.unlinkSync(uploadDir + "/" + packageName);
//删除数据库里记录信息
var result = yield upgradePackageInfoDao.deletePackageInfo(productType, versionNum, pageSize, pageIndex, resume());
var allDatas = yield upgradePackageInfoDao.getAllPackageInfos(resume());
var data = {};
data.total = allDatas.length;
data.rows = result;
res.json(data);
} catch (e) {
logger.info("删除失败")
res.json({total: 0, rows: []});
}
})();
}
};
基本就完成基本功能啦,具体详细的代码,等我写完下一篇关于下载的部分之后,可以看我的git项目。