利用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

原文地址:https://www.cnblogs.com/lanhuo666/p/10035679.html

时间: 2024-11-06 03:46:34

利用nodejs实现商品管理系统(二)的相关文章

国庆续写商品管理系统(二)

国庆有点懒散更新的内容不多,大家国庆快乐 一.做的事情 上次写到点我查看 设置中国时区 修改表单存储位置 设计商品相关的表,主要是总库存,退货,进货,销售 优化登入验证码,去除1iO0这些让人难以区分的内容 重新设计文件目录 二.配置相关 setting.py """ Django settings for drf_test project. Generated by 'django-admin startproject' using Django 1.11.22. For

利用nodejs二次开发kibana4.4.2之环境搭建

最近利用ELK做一套日志分析平台,但kibana并不能满足需求,因此需要对kibana做二次开发,搭建windows环境时遇到的各种问题,查阅了比较多的资料,发现教程都比较零散,最后通过几天的摸索,将问题最终解决,下面做一个汇总: 1.首先就是kibana4.4.2的nodejs必须是4.3.2的版本: 2. 其次需要下载Visual Studio Express 2013 with Update 5,地址: https://go.microsoft.com/fwlink/?LinkId=532

文献综述十三:超市商品管理系统的设计与实现

一.基本信息 标题:超市商品管理系统的设计与实现 时间:2016 出版源:古林大学 文件分类:对商品管理系统的研究 二.研究背景 采用计算机和通讯技术来对超市的商品进行科学规范的管理和经营,用来满足超市日常所需,节约人力物力. 三.具体内容 论文的内容分为6个部分.分别是绪论.超市商品管理系统的开发方法和工具.系统分析.系统概要设计.系统详 细设计以及系统测试. 绪论:论述了超市商品管理系统的开发背景.开发意义以及国内外发展现状. 超市商品管理系统的开发方法和工具:采用 C#编程语言作为前端开发

国庆手撸商品管理系统(三)

之前的内容 点我管理系统(一) 点我管理系统(二) 一.实现的内容 商品退货 商品库存 商品进货 商品删除 商品还原 时钟 优化模型 二.后续内容准备优化内容 把数据库查询的内容存在缓存中 增加按日期,按商品名查询 增加快捷商品增加 优化代码 优化界面 三.目录结构 drf_test |___drf_api | |___admin.py | |___apps.py | |___migrations | |___models.py | |___tests.py | |___userinfo_for

C++超市商品管理系统

一.C++语言程序设计------<超市商品管理系统设计>问题分析 这个超市商品管理系统的主要功能是为超市的管理层提供货物查询及银行转帐货物管理服务,方便超市管理层工作,提高管理层的服务质量和服务效率. 超市商品的信息必须经由各部门及人事初及时汇总到财务处,管理处结合提供的的有关超市商品的信息,并把信息及时反馈给后勤所在部门方便补货,最后管理和后勤部可以方便.快捷的管理超市的货物. 超市的服务器的管理员享有对入库货物的管理与修改. 系统实现后,提高超市的服务效率.降低分发货物的错误发生率,减少

购物商场--前台系统与后台商品管理系统 (需求与表分析)

前台系统-- 购物商场1.购物首页查询商品分类及商品信息2.注册3.登陆4.个人资料修改5.修改密码6.充值.提现7.加入购物车8.付款生成订单 后台管理系统--- 购物商城商品管理系统1.分类管理: 增删查改2.商品管理: 新增.下架,上架,修改库存,修改单价, 商品编辑, 商品查询 3.统计 一周内销售额 一月内销售额 表分析:管理员表(编号,用户名,密码)商品分类(编号,分类名称,上级分类编号)商品表(商品编号.商品分类编号, 商品名称,商品参考价,商品售价, 商品折扣价, 商品数量,商品

利用nodejs实现登录并转码视频(原创)

nodejs的出现让前端人员可以使用js打造后台,也许哪天就真的摆脱了对java或者php的依赖了. 今天跟大家分享一个利用nodejs接受前端post请求,并实现视频转码的这样一个例子.视频转码用到的是ffmpeg,nodejs取到表单的参数采用的是目录multiparty;具体实现如下: 1.项目主要文件结构 2.ffmpeg.js文件是启动文件 const express = require('express'); const path = require('path'); const m

java利用zxing生成仿新浪微博二维码

原文:java利用zxing生成仿新浪微博二维码 源代码下载地址:http://www.zuidaima.com/share/1550463729896448.htm 效果图: 说明在readme.txt文件

java利用zxing开源工具生成二维码QRCode

原文:java利用zxing开源工具生成二维码QRCode 源代码下载地址:http://www.zuidaima.com/share/1550463727340544.htm