Vue2.0+Node.js+MongoDB全栈打造商城系统

释放双眼,带上耳机,听听看~!

Vue2.0+Node.js+MongoDB全栈打造商城系统

第7章 Node.js基础


第9章 基于Node.js开发商品列表接口


【9-1】 Node的启动和调试方式

  • node命令启动, node server/bin/www
  • webstorm配置启动入口 ,可以进行调试。

【9-2】 基于Express实现商品列表查询接口

  • 安装Mongoose,cnpm install mongoose,mongoose是nodeJS提供连接 mongodb的一个库

  • 创建Goods Model,新建server/models/goods.js,

  • 创建路由:

(1)引入router和mongoose数据模块,
(2)使用mongoose连接MongoDB数据库,
(3)路由获取router.get('/',(req,res,next)=>{}),
(4)基于mongoose查询mongoDB的goods数据 ,
(5)暴露路由

  • 入口文件修改app.js

导入goods路由,var usersRouter = require('./routes/users');
使用路由,app.use('/goods', goodsRouter);

  • 启动项目

config/index.js proxyTable 中添加服务器
GoodsList.vue中axios.get()请求数据,注意axios不能跨域,所以需要使用proxy代理
启动MongoDB
启动Node.js服务器
启动项目
页面渲染成功

  • BUG

Vue2.0+Node.js+MongoDB全栈打造商城系统
【解决】在npm run dev前启动Node.js服务器pm2 start serve/bin/www

【9-3】商品列表分页和排序功能实现(上)

(1)商品排序:在前端发送排序请求;服务器端实现商品按价格排序,通过mongoose中的sort()对数据库查询结果按salePrice关键字排序,之后返回给前端。

  • Node.js后端实现

通过req.param()来获取前端传过来的参数,let sort = parseInt(req.param('sort'));
声明对salePrice字段进行升序(sort=1)/降序(sort=-1)排序 ,Goods.find({}).sort({'salePrice':sort});

  • Vue.js前端实现

排序之后需要将页码page置1,然后重新请求商品列表


1
2
3
4
5
6
7
1sortPrice(){        //按价格排序
2     this.sortFlag=this.sortFlag==1?-1:1;
3     this.page=1;
4     this.getGoodsList();
5  }
6
7

(2)商品列表分页

  • Node.js后台,根据前端请求的页面大小pageSize、页码page,去数据库中查询指定位置的数据然后返回给前端。比如页面大小为8,要查第3页的数据,则跳过2*8条数据,然后返回接下来的8条数据。let goodsModel = Goods.find({}).skip(skip).limit(pageSize); goodsModel.sort({'salePrice':sort});

  • Vue前端,vue-infinite-scroll分页插件实现滚动加载:页面刚加载时不需要请求所有数据,只显示一部分。当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中。


1
2
3
4
5
1 <div class="load-more" v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="50">
2                加载中。。。
3 </div>
4
5

?v-infinite-scroll=“loadMore” , 滚动时加载loadMore()

?infinite-scroll-disabled=“busy” , 是否需要禁用此方法,如果busy是true,滚动就失效

?infinite-scroll-distance=“10” ,设置滚动距离来触发加载


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
1    mounted () {
2        this.getGoodsList()
3    },
4    ....
5   getGoodsList (flag) {
6          var param = {
7            page:this.page,
8            pageSize: this.pageSize,
9            sort:this.sortFlag ? 1 : -1
10          }
11          // axios不支持跨域,需要proxy代理插件
12          axios.get('/goods',{params:param})
13            .then((result)=>{
14              var res = result.data
15              if(res.status=='0'){
16                if(flag){
17                  // 如果不是首次进来,需要累加数据
18                  this.goodsList = this.goodsList.concat(res.result.list)
19                  if(res.result.count == 0){
20                    this.busy = true ; // 没有数据了就禁用滚动,不要再后续请求数据
21                  }
22                  else{
23                    this.busy = false ;
24                  }
25                }
26                else{
27                  this.goodsList = res.result.list
28                  // 如果是首次进来,需要设置busy为false,否则后续就无法实现滚动加载功能了
29                  this.busy = false;
30                }
31              }
32              else{
33                this.goodsList = []
34              }
35            })
36   },
37   loadMore(){
38          // 滚动加载操作
39          this.busy = true;
40          //通过setTimeout按时间间隔响应加载请求,防止滚动条滚动时的频繁请求数据
41          setTimeout(() => {
42            this.page++;
43            this.getGoodsList(true)
44          }, 500);
45    }
46
47

给TA打赏
共{{data.count}}人
人已打赏
安全技术

AES 加密解密 (javascript, java,php,c#)

2021-8-18 16:36:11

安全技术

C++ 高性能服务器网络框架设计细节

2022-1-11 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索