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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM