毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目

本框架是基于nodejs express框架二次开发的,本框架包含数据库操作示例和注解。 适合nodejs入门学习或者nodejs开发人员开发中小型web项目。直接在命令窗口运行:npm start,就可启动程序!访问地址:http://127.0.0.1:3000/

nodejs数据库链接相关命令
sqlHelper.js

//封装数据操作模块
//引入mysql模块
var mysql=require('mysql');
//引入数据库配置信息
var dbconf=require('./db');

//封装查询操作
//sqlStr参数为sql语句
//param为数组参数
//返回值
function ExecuteReader(sqlStr,param,callback) {
	//初始化数据库连接对象
    var connection=mysql.createConnection(dbconf.mysql);
	//执行sql语句之前,连接数据库
	connection.connect(function(err) {
	// body...
	        if(err){
		     //err默认返回值是ture
		    console.log('错误信息:'+err);
		    return;
	        }
	        console.log('数据库连接成功!');
        });
	if(param!=null){
		//执行sql语句
	    //sqlStr参数为sql语句,param为传入参数数组,
	    //function为回调函数,也就是sql语句执行后要做的操作
	    connection.query(sqlStr,param,function(err,results){
            //返回结果集
            
            if(results){               
               callback(results);
            }
	    });
	}else{
		//执行不带参数的查询方法
		connection.query(sqlStr,function(err,results){
            //返回结果集
            if(results){
                callback(results);
            }
		});
	}
	
	//执行sql语句之后,断开数据库
	connection.end(function(err) {
	// body...
	    if(err){
		//err默认返回值是ture
		    console.log('错误信息:'+err);
		    return;
	    }
	    console.log('数据库断开成功!');
    });

}

//封装更新操作
//sqlStr参数为sql语句
//param为数组参数
//返回值
function ExecuteUpdate(sqlStr,param,callback){
	//初始化数据库连接对象
    var connection=mysql.createConnection(dbconf.mysql);
    //执行sql语句之前,连接数据库
	connection.connect(function(err) {
	// body...
	        if(err){
		     //err默认返回值是ture
		    console.log('错误信息:'+err);
		    return;
	        }
	        console.log('数据库连接成功!');
        });
    
	if(param!=null){
		//执行sql语句
	    //sqlStr参数为sql语句,param为传入参数数组,
	    //function为回调函数,也就是sql语句执行后要做的操作
	    connection.query(sqlStr,param,function(err,results){
            //返回受影响的行数 int 整型
            callback(results.affectedRows);
            //return results.affectedRows;
	    });
	}else{
		//执行不带参数的查询方法
		connection.query(sqlStr,function(err,results){
            //返回受影响的行数 int 整型
            callback(results.affectedRows);
            //return results.affectedRows;
		});
	}
	
	//执行sql语句之后,断开数据库
	connection.end(function(err) {
	// body...
	        if(err){
		     //err默认返回值是ture
		    console.log('错误信息:'+err);
		    return;
	        }
	        console.log('数据库断开成功!');
        });
}


exports.ExecuteReader=ExecuteReader;
exports.ExecuteUpdate=ExecuteUpdate;

db.js部分代码

// conf/db.js
// mysql数据库配置信息
module.exports={
	//本地数据库
	mysql:{
		host:'127.0.0.1', // 数据库服务器ip
	    user:'root',      //数据库账号
	    password:'root',  //数据库账号密码
	    port:'3306',      //端口号
	    database:'yifanshop'   //数据库名
	},
    
    //虚拟机数据库
	mysqlVM:{
		host:'192.168.52.128', // 数据库服务器ip
	    user:'root',      //数据库账号
	    password:'Pass2017!',  //数据库账号密码
	    port:'3306',      //端口号
	    database:'node'   //数据库名
	}
}

部分页面截图
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目

毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目


var categoryDAL = require('../DAL/categoryDAL');
var productDAL=require('../DAL/productDAL');
var async = require('async');
var randomHelper=require('../util/randomHelper');


function indexController(app) {
	/* GET home page. */
	//app.get方法第一个参数是我们添加网站可以请求的地址
	//首页
	app.get('/', function(req, res) {

		//应用async模块的api:parallel处理并行无关联操作
		async.parallel({ //控制流程1:多级菜单加载
			categorylist: function(done) {
				//处理逻辑
				categoryDAL.getCategoryAll(function(catelist) {
					//循环构造数组对象模型
					var categorylist = create_objectArrayList(catelist, 0);

					done(null, categorylist);
				});

			},//控制流程2:新品发布前五项
            newgoodsTop5: function(done) {
                //处理逻辑
                productDAL.getGoodsTopbyNum(5,function(newtoplist){
                    done(null,newtoplist);
                });
            },
            userInfo:function(done){
            	var userInfo=req.session.customer;
            	done(null,userInfo);
            },//智能净化板块
            jinghualist:function(done){
            	productDAL.getTopNumGoodlistByCategoryId(37,2,function(jinghualist){
            		done(null,jinghualist);
            	});
            },//洗衣机板块
            xiyijilist:function(done){
            	productDAL.getTopNumGoodlistByCategoryId(48,2,function(xiyijilist){            		
            		done(null,xiyijilist);
            	});
            },//女装热卖四项
            nvzhuanglist:function(done){
            	productDAL.getTopNumGoodlistByCategoryId(41,4,function(nvzhuanglist){            		
            		done(null,nvzhuanglist);
            	});
            }
		}, function(err, results) {           
            
			res.render('index', {
				categorylist: results.categorylist,
                newgoodsTop5:results.newgoodsTop5,
                jinghualist:results.jinghualist,
                xiyijilist:results.xiyijilist,
                nvzhuanglist:results.nvzhuanglist,
                userInfo:results.userInfo
			});
			
		});

	});
	
	

	//递归构造树型数组对象
	function create_objectArrayList(data, pid) {
		pid = pid || 0;
		var list = [];
		data.map(function(item) {
			if(item.up_id == pid) {
				item.list = create_objectArrayList(data, item.category_Id);
				list.push(item);
			}
		});
		return list;
	}

	

	//产品页面
	app.get('/product', function(req, res) {
		//res.render方法的第一个参数是我们请求地址对应的网页文件名
		res.render('product');
	});

	//验证码
	app.get('/code', function(req, res) {
		var img = randomHelper.makeCapcha(req); 
        
        //console.log(req.session.CAPTCHA_KEY);     
		res.setHeader('Content-Type', 'image/bmp');
		res.send(img.getFileData());
	});

	//活动页面
	app.get('/discount/1111',function(req,res){
		//应用async模块的api:parallel处理并行无关联操作
		async.parallel({ //控制流程1:多级菜单加载
			categorylist: function(done) {
				//处理逻辑
				categoryDAL.getCategoryAll(function(catelist) {
					//循环构造数组对象模型
					var categorylist = create_objectArrayList(catelist, 0);

					done(null, categorylist);
				});

			},
            userInfo:function(done){
            	var userInfo=req.session.customer;
            	done(null,userInfo);
            }
		}, function(err, results) {           
            
			res.render('discount', {
				categorylist: results.categorylist,
                userInfo:results.userInfo
			});
			
		});
	});
	
	//品牌优选
	app.get('/ppyx',function(req,res){
		//应用async模块的api:parallel处理并行无关联操作
		async.parallel({ //控制流程1:多级菜单加载
			categorylist: function(done) {
				//处理逻辑
				categoryDAL.getCategoryAll(function(catelist) {
					//循环构造数组对象模型
					var categorylist = create_objectArrayList(catelist, 0);

					done(null, categorylist);
				});

			},
            userInfo:function(done){
            	var userInfo=req.session.customer;
            	done(null,userInfo);
            }
		}, function(err, results) {           
            
			res.render('ppyx', {
				categorylist: results.categorylist,
                userInfo:results.userInfo
			});
			
		});
	});

	//测试模块
	app.get('/service/service_online',function(req,res){
		res.render('service/service_online');
	});
}


module.exports = indexController;

毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
代码如下:

var categoryDAL = require('../DAL/categoryDAL');
var productDAL = require('../DAL/productDAL');
var cartDAL = require('../DAL/cartDAL');
var collectDAL = require('../DAL/collectDAL');
var CartInfo = require('../Model/CartInfo');
var async = require('async');

function productController(app) {
	// body...
	/* GET home page. */
	//app.get方法第一个参数是我们添加网站可以请求的地址
	//商品展示页面
	app.get('/product/:id', function(req, res) {
		var product_id = parseInt(req.params.id);

		//res.render方法的第一个参数是我们请求地址对应的网页文件名
		//应用async模块的api:parallel处理并行无关联操作
		async.parallel({ //控制流程1:多级菜单加载
			categorylist: function(done) {
				//处理逻辑
				categoryDAL.getCategoryAll(function(catelist) {
					//循环构造数组对象模型
					var categorylist = create_objectArrayList(catelist, 0);

					done(null, categorylist);
				});

			}, //控制流程2:根据产品ID获取产品所有信息
			product: function(done) {
				productDAL.getGoodsById(product_id, function(product) {
					done(null, product);
				});
			},
			userInfo: function(done) {
				var userInfo = req.session.customer;
				done(null, userInfo);
			}
		}, function(err, results) {

			//console.log(results.product);
			//res.setHeader(200, {"Content-Type": "text/html"});
			res.render('Product/product', {
				categorylist: results.categorylist,
				product: results.product[0],
				userInfo: results.userInfo
			});

		});

	});

	app.get('/search', function(req, res) {

		var q = req.query.q;
		var currentpage = req.query.js;

		if(q == null || currentpage == null) {
			res.redirect('/search?q=&js=1');
		}

		console.log('key:' + q);
		console.log('pager:' + currentpage);

		//分页方法
		//定义分页参数
		//var currentpage = 1; //当前页
		var pagercounts = 1; //页面总数
		var previouspage = 1; //上一页
		var nextpage = 1;
		//设置分页 每页显示数据条数
		var pageSize = 20;
		var userInfo = req.session.customer;

		//如果搜索结果为空则返回空数据集
		if(q == null || q == '') {
			q = '';
			res.render('search', {
				productlist: '',
				currentpage: currentpage,
				previouspage: previouspage,
				nextpage: nextpage,
				pageSum: pagercounts,
				q: q,
				userInfo: userInfo
			});
		} else {
			//应用async模块的api:parallel处理并行无关联操作
			async.parallel({ //控制流程1:搜索
				productlistPager: function(done) {

					productDAL.searchGoodsByKey(q, currentpage, pageSize, function(productlist) {						
						done(null, productlist);
					});
				}, //控制流程2:用户信息
				userInfo: function(done) {					
					var userInfo = req.session.customer;
					done(null, userInfo);
				}, //控制流程3 当前分类商品总数
				goodsCounts: function(done) {
					productDAL.getGoodsCountsByKey(q, function(count) {						
						done(null, count);
					});
				}
			}, function(err, results) {

				//将上面几个步骤数据操作并行处理,然后在这里一起操作,提供运行效率
				var counts = parseInt(results.goodsCounts);

				//分页信息处理
				//计算总页数
				if((counts % pageSize) > 0) {
					//有余数,数据不足一整页
					pagercounts = parseInt(counts / pageSize) + 1;
				} else {
					//数据正好填满整页
					pagercounts = parseInt(counts / pageSize);
				}
				//设置上一页
				if(currentpage <= 1) {
					previouspage = 1;
				} else {
					previouspage = currentpage - 1;
				}
				//设置下一页
				if(currentpage >= pagercounts) {
					nextpage = pagercounts;
				} else {
					nextpage = currentpage + 1;
				}

				res.render('search', {
					productlist: results.productlistPager,
					currentpage: currentpage,
					previouspage: previouspage,
					nextpage: nextpage,
					pageSum: pagercounts,
					q: q,
					userInfo: results.userInfo
				});
			});
		}

	});

	//搜索产品请求方法
	app.post('/searchhandle', function(req, res) {

	});

	//将商品添加到购物车方法
	//ajax
	app.post('/cart/addhandle', function(req, res) {

		//目标跳转页面
		var target_url = '/cart';
		req.session.redirecturl = target_url;

		//用户必须先登录才能从数据库读取购物车记录并进行加载
		//验证登录
		var userInfo = req.session.customer;
		if(!userInfo) {
			res.status(200).send({
				url: '/login',
				message: '未登录'
			});
		} else {
			//获取表单提交数据
			var product_Id = req.body.product_Id;
			var customer_Id = userInfo.customer_Id;
			var num = req.body.goods_num;

			//设置数据对象
			var cartInfo = new CartInfo();
			cartInfo.setproduct_Id(product_Id);
			cartInfo.setcustomer_Id(customer_Id);
			cartInfo.setnum(num);

			//添加购物车数据操作
			cartDAL.addCart(cartInfo, function(message, results) {
				if(results) {
					//加入或者更新成功
					res.status(200).send({
						url: '/cart',
						message: message
					});
				}
			});
		}

	});

	//将指定商品从购物车移除
	app.get('/cart/removeGoodshandle/:id', function(req, res) {
		//验证登录
		var userInfo = req.session.customer;
		if(!userInfo) {
			res.redirect('/login');
		}

		var product_Id = req.params.id;
		var customer_Id = userInfo.customer_Id;
		//处理方法
		cartDAL.removeGoodsFormCart(customer_Id, product_Id, function(results) {
			if(results) {
				//删除成功
				res.redirect('/cart');
			} else {
				//删除失败
				res.redirect('/cart');
			}
		});
	});

	//递归构造树型数组对象
	function create_objectArrayList(data, pid) {
		pid = pid || 0;
		var list = [];
		data.map(function(item) {
			if(item.up_id == pid) {
				item.list = create_objectArrayList(data, item.category_Id);
				list.push(item);
			}
		});
		return list;
	}

	//移动端产品详细页面
	app.get('/mobile/product/:id',function(req,res){
	    var product_Id = req.params.id;	
	    //应用async模块的api:parallel处理并行无关联操作
		async.parallel({ //控制流程1:根据产品ID获取产品所有信息
			product: function(done) {
				productDAL.getGoodsById(product_Id, function(product) {
					done(null, product);
				});
			}
		}, function(err, results) {

			//console.log(results.product);
			//res.setHeader(200, {"Content-Type": "text/html"});
			res.render('mobile/product', {
				product: results.product[0]
			});

		});	   
	});
}

module.exports = productController;

毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目
毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目

毕业设计基于nodejs开发的电商购物商城系统.rar含源码项目

完整项目源码下载地址:请点击:》》》

上一篇:Controller与Service系列(一) Controller基本概念


下一篇:SpringBoot全局线程池和局部线程池的使用