node 练习
一、需求:实现用户的增删改查以及列表展示。
【目录结构】
【服务器代码】
const express=require('express'); // 引入用户路由器 const userRouter=require('./routers/user.js'); // 引入第三方中间件 const bodyParser=require('body-parser'); // 创建web服务器 var server=express(); server.listen(3001); // 托管静态资源到public目录下ister.html server.use(express.static('public')); // 使用body-parser中间件将post请求数据解析为对象 server.use(bodyParser.urlencoded({ extended:false })); // 把用户路由器挂载到/user server.use('/user',userRouter);
【浏览器代码】
1、【user_delete.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h2>删除用户</h2> <form action="/user/delete" method="get"> 编号:<input type="text" name="id"><br> <input type="submit"> </form> </body> </html>
2、【user_detail.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/user/detail" method="get"> 名字:<input type="text" name="uname"><br> <input type="submit"> </form> </body> </html>
3、【user_list.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h2>用户列表</h2> <form action="/user/list" method="get"> 页码:<input type="text" name="pno"><br> 数量:<input type="text" name="count"><br> <input type="submit"> </form> </body> </html>
4、【user_login.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h2>用户登录</h2> <form action="/user/login" method="post"> 用户名:<input type="text" name="uname"><br> 密码:<input type="text" name="upwd"><br> <input type="submit"> </form> </body> </html>
5、【user_register.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/user/register" method="post"> 用户:<input type="text" name="uname"><br> 密码:<input type="text" name="upwd"><br> 邮箱:<input type="text" name="email"><br> 手机:<input type="text" name="phone"><br> <input type="submit"> </form> </body> </html>
6、【user_update.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h2>用户修改</h2> <form action="/user/update" method="post"> 编号:<input type="text" name="id"><br> 邮箱:<input type="text" name="email"><br> 手机:<input type="text" name="phone"><br> 姓名:<input type="text" name="uname"><br> <input type="submit"> </form> </body> </html>
【路由器代码】
//引入mysql的连接池对象 const pool=require('../pool.js'); const express=require('express'); // 创建空路由器 var router=express.Router(); // 添加路由 // 1、用户注册 router.post('/register',(req,res)=>{ // 获取post请求的数据 var obj=req.body; console.log(obj); // 判断用户名是否为空 var $uname=obj.uname; if(!$uname){ res.send({code:401,msg:'uname requires'}); // 阻止继续往后执行 return; } // 判断密码是否为空 var $upwd=obj.upwd; if(!$upwd){ res.send({code:402,msg:'upwd requires'}); return; } // 判断邮箱否为空 var $email=obj.email; if(!$email){ res.send({code:403,msg:'email requires'}); return; } // 判断手机是否为空 var $phone=obj.phone; if(!$phone){ res.send({code:404,msg:'phone requires'}); return; } // 执行sql语句,将注册的数据插入到xz_user数据表中,成功响应{code:200,msg:"register suc"} pool.query("insert into demp(uname,upwd,email,phone) values(?,?,?,?)",[obj.uname,obj.upwd,obj.email,obj.phone],(err,result)=>{ if (err) throw err; console.log(result); if(result.affectedRows>0){ res.send({code:200,msg:"register success"}); } }); }); // 2、用户登录的路由 router.post('/login',(req,res)=>{ // 获取post请求的数据 var obj=req.body; console.log(obj); // 判断数据是否为空 var $uname=obj.uname; if(!$uname){ res.send({code:401,msg:'uname requires'}); // 阻止继续往后执行 return; } var $upwd=obj.upwd; if(!$upwd){ res.send({code:401,msg:'upwd requires'}); return; } // 执行sql语句,查看是否登录成功(使用用户名和密码两个条件能查询到语句) pool.query("select * from demp where uname=? and upwd=?",[$uname,$upwd],(err,result)=>{ if(err) throw err; console.log(result); // 判断查询的结果(数组)长度是否为0,如果大于0,说明查询到数据了 if(result.length>0){ res.send({code:200,msg:'login success'}); }else{ res.send({code:301,msg:'login err'}); } }); }); // 3、检索用户 router.get('/detail',(req,res)=>{ var obj=req.query; console.log(obj); // 判断是否为空uname var $uname=obj.uname; if(!$uname){ res.send({code:401,msg:'uname requires'}); // 阻止继续往后执行 return; } // 响应查询到的用户对象 pool.query("select * from demp where uname=?",[$uname],(err,result)=>{ if(err) throw err; console.log(result); // 判断查询的结果(数组)长度是否为0,如果大于0,说明查询到数据了 if(result.length>0){ res.send(result); }else{ res.send({code:301,msg:'detail err'}); } }); }); // 4、修改用户信息 router.post('/update',(req,res)=>{ var obj=req.body; console.log(obj); // 判断是否为空 var $id=obj.id; var $email=obj.email; var $phone=obj.phone; var $uname=obj.uname; // 判断数据是否为空 if(!$id){ res.send({code:401,msg:'id requires'}); // 阻止继续往后执行 return; } if(!$email){ res.send({code:402,msg:'email requires'}); // 阻止继续往后执行 return; } if(!$phone){ res.send({code:403,msg:'phone requires'}); // 阻止继续往后执行 return; } if(!$uname){ res.send({code:405,msg:'uname requires'}); // 阻止继续往后执行 return; } // 执行sql语句 pool.query('update demp set email=?,phone=?,uname=? where id=?',[$email,$phone,$uname,$id],(err,result)=>{ if(err) throw err; console.log(result); // 判断是否更改成功 if(result.affectedRows>0){ res.send({cede:200,meg:'update success'}); }else{ res.send({code:301,msg:'update err'}); } }); }); // 5、用户列表 router.get('/list',(req,res)=>{ var obj=req.query; console.log(obj); // 将数据转为数值型 var $pno=parseInt(obj.pno); var $count=parseInt(obj.count); // 如果页码和每页的数量为空,设置默认值 if(!$pno){ // 如果页码为空,默认第一页 $pno=1; } if(!$count){ // 如果每页数量为空,默认显示3条记录 $count=3; } // 计算开始查询到值 var start=($pno-1)*$count; // 执行sql语句,返回商品列表数据 pool.query('select * from demp limit ?,?',[start,$count],(err,result)=>{ if(err) throw err; res.send(result); }); }); // 6、删除用户 router.get('/delete',(req,res)=>{ var obj=req.query; console.log(obj); // 验证是否为空 var $id=obj.id; if(!$id){ res.send({code:401,msg:'id requires'}); // 阻止继续往后执行 return; } // 执行sql语句 pool.query('delete from demp where id=?',[$id],(err,result)=>{ if(err) throw err; if(result.affectedRows>0){ res.send({code:200,msg:"delete success"}); }else{ res.send({code:200,msg:"delete err"}); } }); }); // 导出 module.exports = router;
二、需求:实现商品的增删改查以及列表展示。
【目录结构】
【服务器代码】
const express=require('express'); // 引入用户路由器 const userRouter=require('./routers/user.js'); // 引入商品路由器文件 const productRouter=require('./routers/product.js'); // 引入第三方中间件 const bodyParser=require('body-parser'); // 创建web服务器 var server=express(); server.listen(3001); // 托管静态资源到public目录下ister.html server.use(express.static('public')); // 使用body-parser中间件将post请求数据解析为对象 server.use(bodyParser.urlencoded({ extended:false })); // 把用户路由器挂载到/user server.use('/user',userRouter); // 把商品路由器挂载到/product server.use('/product',productRouter);
【浏览器代码】
【product_add.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/product/add" method="post"> 商品名称:<input type="text" name="pname"><br> 商品价格:<input type="text" name="price"><br> 商品保修:<input type="text" name="promise"><br> 商品标题:<input type="text" name="title"><br> <input type="submit"> </form> </body> </html>
【product_delete.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/product/delete" method="get"> 名称:<input type="text" name="pname"><br> <input type="submit"> </form> </body> </html>
【product_detail.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/product/detail" method="get"> 商品名称:<input type="text" name="pname"><br> <input type="submit"> </form> </body> </html>
【product_list.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/product/list" method="get"> 页码:<input type="text" name="page"><br> 数量:<input type="text" name="count"><br> <input type="submit"> </form> </body> </html>
【product_update.html】
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/product/update" method="post"> 名称:<input type="text" name="pname"><br> 价格:<input type="text" name="price"><br> 保修:<input type="text" name="promise"><br> 标题:<input type="text" name="title"><br> <input type="submit"> </form> </body> </html>
【路由器代码】
const express=require('express'); // 引入连接池 const pool=require('../pool.js'); // 创建空的路由器 var router=express.Router(); // 创建路由 // 1、商品列表 router.get('/list',(req,res)=>{ var obj=req.query; console.log(obj); // 判断不为空,并设置默认值 var $page=parseInt(obj.page); var $count=parseInt(obj.count); if(!$page) $page=1; if(!$count) $count=10; console.log($page,$count); // 计算开始查询到值 var start=($page-1)*$count; // 执行sql语句,响应查询到的数据 pool.query('select * from laptop limit ?,?',[start,$count],(err,result)=>{ if(err) throw err; res.send(result); }); }); // 2、商品详情 router.get('/detail',(req,res)=>{ var obj=req.query; console.log(obj); // 判断为空 var $pname=obj.pname; if($pname){ res.send({code:401,msg:"pname requires"}); return; } // 执行sql语句 pool.query('select * from laptop where pname=?',[$pname],(err,result)=>{ if(err) throw err; // 判断数据是否为空 if(result.length>0){ res.send(result); }else{ res.send({code:301,msg:'detail err'}); } }); }); // 3、删除商品 router.get('/delete',(req,res)=>{ var obj=req.query; console.log(obj); // 判断为空 var $pname=obj.pname; if(!$pname){ res.send({code:401,msg:"pname requires"}); return; } // 执行sql语句 pool.query('delete from laptop where pname=?',[$pname],(err,result)=>{ if(err) throw err; if(result.affectedRows>0){ res.send({code:200,msg:"delete success"}); }else{ res.send({code:302,msg:"delete err"}); } }); }); // 4、商品添加 router.post('/add',(req,res)=>{ var obj=req.body; console.log(obj); // 遍历对象的属性批量验证是否为空 var $code=400; for(var key in obj){ $code++; console.log(key+'---'+obj[key]) if(!obj[key]){ res.send({code:$code,msg:key+" required"}); return; } } // 执行sql语句 pool.query('insert into laptop set ?',[obj],(err,result)=>{ if(err) throw err; if(result.affectedRows>0){ res.send({code:200,msg:"add success"}); }else{ res.send({code:302,msg:"add err"}); } }); }); // 5、商品的更改 router.post('/update',(req,res)=>{ var obj=req.body; console.log(obj); // 遍历对象的属性批量验证是否为空 var $pname=obj.pname; var $code=400; for(var key in obj){ $code++; console.log(key+'---'+obj[key]) if(!obj[key]){ res.send({code:$code,msg:key+" required"}); return; } } // 执行sql pool.query('update laptop set ? where pname=?',[obj,$pname],(err,result)=>{ if(err) throw err; if(result.affectedRows>0){ res.send({code:200,msg:"update success"}); }else{ res.send({code:302,msg:"update err"}); } }); }); // 导出路由器 module.exports=router; // 在app.js服务器文件中挂载到/product下;