利用nodejs实现商品管理系统(二)
下面实现商品管理系统
第一步:对应的ejs与数据交换的编写格式。
商品列表界面product.ejs
<% for(var i=0;i<list.length;i++){%>
<tr>
<td><%=i+1%></td>
<td><img width="100" src="<%=list[i].pic%>" alt=""/></td>
<td><%=list[i].title%></td>
<td><%=list[i].price%></td>
<td><%=list[i].fee%></td>
<td class="text-center">
<a href="/productedit?id=<%=list[i]._id%>" class="btn btn-success">修改</a>
<a href="/productdelete?id=<%=list[i]._id%>" class="btn btn-danger">删除</a>
</td>
</tr>
<%}%>
商品编辑页面
<form action="/doProductEdit" method="post" enctype="multipart/form-data">
<ul>
<input type="hidden" name="_id" value="<%=list._id%>"/> <input type="hidden" name="pic" value="<%=list.pic%>"/>
<li> 商品名称: <input type="text" name="title" value="<%=list.title%>"/></li> <li> 商品图片: <input type="file" name="pic"/>
<br/> <br/>
<img src="<%=list.pic%>" width="100"/>
<br/> <br/>
</li> <li> 商品价格: <input type="text" name="price" value="<%=list.price%>"/></li>
<li> 商品邮费: <input type="text" name="fee" value="<%=list.fee%>"/></li> <li>
商品描述:
<textarea name="description" id="" cols="60" rows="8"><%=list.description%></textarea>
</li> <li>
<br/>
<button type="submit" class="btn btn-default">提交</button>
</li>
</ul>
</form>
商品增加页面productadd.ejs
<form action="/doProductAdd" method="post" enctype="multipart/form-data">
<ul>
<li> 商品名称: <input type="text" name="title"/></li>
<li> 商品图片: <input type="file" name="pic"/></li>
<li> 商品价格: <input type="text" name="price"/></li>
<li> 商品邮费: <input type="text" name="fee"/></li>
<li>
商品描述:
<textarea name="description" id="" cols="60" rows="8"></textarea>
</li>
<li>
<br/>
<button type="submit" class="btn btn-default">提交</button>
</li>
</ul>
</form>
第二步:由于商品的增删改查都要用到数据库,所以第二步应该讲数据库封装起来,接着在app.js中引用相应的模块。
新建db.js,开始判断是否连接数据库成功。
var MongoClient=require('mongodb').MongoClient;
var DbUrl='mongodb://localhost:27017/productmanage';
var ObjectID = require('mongodb').ObjectID;
function __connectDb(callback){
MongoClient.connect(DbUrl,function(err,db){
if(err){
console.log('数据库连接失败');
return;
}
//增加 修改 删除
callback(db);
})
}
exports.ObjectID=ObjectID; //查找数据
exports.find=function(collectionname,json,callback){ __connectDb(function(db){ var result=db.collection(collectionname).find(json); result.toArray(function(error,data){ db.close();/*
关闭数据库*/
callback(error,data);/*拿到数据执行回调函数*/
}) }) } //插入数据
exports.insert=function(collectionname,json,callback){ __connectDb(function(db){ db.collection(collectionname).insertOne(json,function(error,data){ callback(error,data);
})
}) } //更新数据
exports.update=function(collectionname,json1,json2,callback){ __connectDb(function(db){
db.collection(collectionname).updateOne(json1,{$set:json2},function(error,data){ callback(error,data);
})
}) } //删除数据
exports.deleteOne=function(collectionname,json,callback){ __connectDb(function(db){
db.collection(collectionname).deleteOne(json,function(error,data){
callback(error,data);
})
}) }
第三步:编辑相应的路由
3.1商品增加路由
//商品列表
app.get('/product',function(req,res){ DB.find('product',{},function(err,data){ res.render('product',{ list:data
});
}) })
//显示增加商品的页面
app.get('/productadd',function(req,res){
res.render('productadd'); })
当点击增加商品时,跳转到doProductAdd路由上
<form action="/doProductAdd" method="post" enctype="multipart/form-data">
在第一篇的时候使用body-parser来接收用户密码和用户名,但是在商品增加编辑中存在图片上传问题,body-parser无法实现,所以改用multiparty模块。
先安装multiparty
npm install multiparty --save
在引入:
var multiparty = require('multiparty');
使用post获取商品增加提交的数据
app.post('/doProductAdd',function(req,res){
//获取表单的数据 以及post过来的图片
var form = new multiparty.Form();
form.uploadDir='upload' //上传图片保存的地址 upload目录必须存在
form.parse(req, function(err, fields, files) {
//获取提交的数据以及图片上传成功返回的图片信息
//fields获取表单的数据 files得到图片上传成功返回的信息
var title=fields.title[0];
var price=fields.price[0];
var fee=fields.fee[0];
var description=fields.description[0];
var pic=files.pic[0].path;
//在数据库中插入数据
DB.insert('product',{
title:title,
price:price,
fee,//效果与上面一致
description,
pic
},function(err,data){
if(!err){
res.redirect('/product'); /*上传成功跳转到首页*/
}
})
}); })
此时添加/upload路由获取图片信息,因为此时图片的地址是/upload/xxxxxxx.jpg,否则默认从public从查找资源。
app.use('/upload',express.static('upload'));
拓展:如果此时图片的地址是 /xxxxxxx.jpg,可以直接配置,注意路由!
app.use(express.static('upload'));
3.2商品编辑路由
注意:无论是商品编辑还是删除都是通过get传值来获取商品的数据库id号
<a href="/productedit?id=<%=list[i]._id%>" class="btn btn-success">修改</a>
<a href="/productdelete?id=<%=list[i]._id%>" class="btn btn-danger">删除</a>
app.js中
app.get('/productedit',function(req,res){
//获取get传值 id
var id=req.query.id;
console.log(id);
//去数据库查询这个id对应的数据 自增长的id 要用{"_id":new DB.ObjectID(id)
DB.find('product',{"_id":new DB.ObjectID(id)},function(err,data){
//console.log(data);
res.render('productedit',{
list:data[0]
});
});
})
在修改商品form表格上依然使用post来提交数据
<form action="/doProductEdit" method="post" enctype="multipart/form-data">
在编辑/doProductEdit路由的时候,如果并没有修改图片信息,此时我们需要作出判断,否则会在upload文件上存在一串非图片信息的字符串,最终返回/product界面时,没有出现并没有修改的商品图片。
最终在修改的商品信息返回到product页面
app.post('/doProductEdit',function(req,res) {
var form = new multiparty.Form();
form.uploadDir = 'upload' // 上传图片保存的地址
form.parse(req, function (err, fields, files) {
//获取提交的数据以及图片上传成功返回的图片信息
//console.log(fields);
console.log(files);
var _id = fields._id[0];
/*修改的条件*/
var title = fields.title[0];
var price = fields.price[0];
var fee = fields.fee[0];
var description = fields.description[0]; var originalFilename = files.pic[0].originalFilename;
var pic = files.pic[0].path; if (originalFilename) { /*修改了图片*/
var setData = {
title,
price,
fee,
description,
pic
};
} else { /*没有修改图片*/
var setData = {
title,
price,
fee,
description
};
//删除生成的临时文件
fs.unlink(pic);
}
DB.update('product', {"_id": new DB.ObjectID(_id)}, setData, function (err, data) { if (!err) {
res.redirect('/product');
} })
});
})
3.3商品删除
app.get('/productdelete',function(req,res){
//获取id
var id=req.query.id;
DB.deleteOne('product',{"_id":new DB.ObjectID(id)},function(err){
if(!err){
res.redirect('/product');
}
})
})
最后的最后,奉上项目的源码地址:https://github.com/xinhua6/productManage.git
利用nodejs实现商品管理系统(二)的更多相关文章
- 利用nodejs实现商品管理系统(一)
一.界面分类:用户登录界面,商品管理界面(包含商品编辑,创建,删除,列表界面) 功能实现:1.用户输入用户名与密码,通过加密,与数据库校验,如果正确,则跳转到商品管理界面,否则一直停留在用户界面. 2 ...
- 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...
- 利用nodejs实现登录并转码视频(原创)
nodejs的出现让前端人员可以使用js打造后台,也许哪天就真的摆脱了对java或者php的依赖了. 今天跟大家分享一个利用nodejs接受前端post请求,并实现视频转码的这样一个例子.视频转码用到 ...
- 利用Nodejs快速构建应用原型
利用Nodejs快速构建应用原型 开发一个应用往往需要快速的构建原型,然后在此基础上设计和改进,前端可能立马能看到效果,但是后端业务逻辑不会那么快,这个时候其实我们需要额只是一些模拟数据,所以不需要真 ...
- 利用C#进行AUTOCAD的二次开发
众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...
- php利用array_search与array_column实现二维数组查找
利用array_search与array_column实现二维数组查找,不用自己写个循环,减少工作量. <?php $userdb = array( 0 => array( 'uid' = ...
- windows下利用nodejs压缩.min文件
利用nodejs中的npm工具,压缩文件,必须在node环境下 压缩js文件 1.在全局中安装uglify-js模块 npm install uglify-js -g 2.可以直接使用uglifyjs ...
- 在nodeJS中操作文件系统(二)
在nodeJS中操作文件系统(二) 1. 移动文件或目录 在fs模块中,可以使用rename方法移动文件或目录,使用方法如下: fs.rename(oldPath,newPath,call ...
- 利用PHP QR Code生成二维码(带logo)
转自:http://www.cnblogs.com/txw1958/p/phpqrcode.html HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示 ...
随机推荐
- 【Leetcode】【Easy】Balanced Binary Tree
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- SpringCloud实战3-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 最重要的“快捷键” IntelliJ IDEA
转载:http://www.youmeek.com/intellij-idea-part-iii-hotkeys-explain/ @IntelliJ IDEA第三部分视频教程:最重要的“快捷键”专讲 ...
- 【[SDOI2009]晨跑】
板子 题意就是每个点只能经过一次 所以非常显然拆点,除去\(1,n\)每个点\(i\)向\(i'\)连一条容量为\(1\)费用为\(0\)的边 剩下的边按照输入给出的建就好了 代码 #include& ...
- pocsuite 实现一个verify检测功能
今天在测试中发现一个命令执行漏洞,尝试用创宇的pocsuite框架实现.说实话,这玩意儿确实没有自己写POC顺手,非得就着他的标准来,就很难受,以至于耽误了很多时间在规范上.. 影响参数后直接用||连 ...
- 2018.12.19 Struts2 框架总复习
总结Struts2 框架 struts2技术的优势 项目开源,使用及拓展方便 提供Exception处理机制 Result方式的页面导航,通过Result标签很方便的实现重定向和页面跳转 通过简单.集 ...
- 使用vue自定义组件以及动态时间
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C++工程文件夹中的bin和obj文件夹有何用处?(补充多文件结构)
博主在使用Code::Blocks创建一个工程之后,正准备新建一个头文件,细心的博主发现,在工程文件夹中有两个子文件夹,分别是bin和obj.好奇心驱使下,想知道这两个文件夹用来干嘛的,网上搜了下,整 ...
- HDU 1111 Secret Code(数论的dfs)
Secret Code Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- UGUI防止点击穿透
if (!IsPointerOverGameObject(Input.mousePosition)) { } public static bool IsPointerOverGameObject(Ve ...