项目--6

1、回顾

1.1 不允许用户缩放页面

userscable=no

<meta name="viewport" content="width=device-width,initial-scale=1.0,userscable=no">

1.2 分类的状态管理

1.3 mapActions辅助函数

methods: {
  ...mapActions({
    getKindlist: 'getKindlist' // 自动生成一个函数 this.$store.dispatch('getKindlist') key值为组件自定义的函数,value为状态管理器action的名字,在需要的地方触发 自定义的函数即可
  }),
}
// 在需要的地方 直接通过 this.getKindlist() 调用即可

1.4 命名空间

  • 如果多个模块的actions的名字相同,谁最后引入,就用谁的,为了避免此种情况,定义store时添加属性 namespaced: true,调用时前面加 模块,比如 '/kind/getProlist'

2、提交订单

  • 获取产品id,获取用户id,获取商品的数量 ---- 生成订单
  • 购物车id --- 删除

点击提交订单,通过flag获取选中的数据,先清空再获取

<li @click="submitOrder">
  提交订单
</li>

data () {
  return {
    cartlist: [],
    arr: [], // 用来保存选中的信息 // +++++++++++++++++++++
    flag: false, // false 表示没有数据
    all: true
  }
},
methods: {
  submitOrder () {
    this.arr = []
    this.cartlist.map(item => {
      if (item.flag) {
        this.arr.push(item)
      }
    })
    console.log(this.arr)
  }
}

3、订单相关接口

3.1 day06/myapp/routes/order.js + app.js

3.2 设计数据库集合 sql/collection/orders.js

const mongoose = require('../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象

// 设计用户表的集合
const orderSchema = new Schema({ // 设计用户集合的字段以及数据类型
  orderid: {type: String },
  userid: { type: String },
  status: { type: Number }, // 订单状态 0 待付款 1 待收货(已支付) 2 待评价 3 全部订单
  list: { type: Array }
})

module.exports = mongoose.model('Order', orderSchema);

3.3 生成订单接口

router.get('/add', (req, res, next) => {
  // res.send(req.query)
  // 1、获取前端提交的订单数据 "[{},{},{}]" -- 转成对象
  let list = JSON.parse(req.query.str)
  let userid = req.query.userid // 获取用户id
  let orderid = 'order_' + uuid.v1() // 生成订单的id
  let arr = [] // 订单列表数据
  // res.send(list)
  list.map(item => { // 遍历数据,获取订单的信息
    arr.push({
      proid: item.proid,
      proimg: item.proimg,
      proname: item.proname,
      price: item.price * 1,
      num: item.num * 1
    })
  })
  // 插入数据库
  sql.insert(Order, {
    orderid: orderid,
    userid: userid,
    status: 0, // 订单状态 0 待付款 1 待收货(已支付) 2 待评价
    list: arr
  }).then(() => {
    res.send({
      code: '200',
      message: '生成订单'
    })
  })
})

3.4 生成订单删除购物车 --- promise.all 解决异步循环问题

router.get('/add', (req, res, next) => {
  // res.send(req.query)
  // 1、获取前端提交的订单数据 "[{},{},{}]" -- 转成对象
  let list = JSON.parse(req.query.str)
  let userid = req.query.userid // 获取用户id
  let orderid = 'order_' + uuid.v1() // 生成订单的id
  let arr = [] // 订单列表数据
  // res.send(list)
  list.map(item => { // 遍历数据,获取订单的信息
    arr.push({
      proid: item.proid,
      proimg: item.proimg,
      proname: item.proname,
      price: item.price * 1,
      num: item.num * 1
    })
  })
  // 插入数据库
  sql.insert(Order, {
    orderid: orderid,
    userid: userid,
    status: 0, // 订单状态 0 待付款 1 待收货(已支付) 2 待评价
    list: arr
  }).then(() => {
    // 生成订单后要删除购物车的数据
    let p1 = list.map(item => {
      return sql.delete(Cart, { cartid: item.cartid })
    })

    return Promise.all(p1)
  }).then(() => {
    res.send({
      code: '200',
      message: '生成订单',
      data: { // 用于在确认订单页面 查询订单的信息
        orderid: orderid
      }
    })
  })
})

3.5 查看订单

// 订单
router.get('/', function(req, res, next) {
  // 获取订单的状态
  let status = req.query.status
  // 查询订单的信息 用户id和订单的id
  let findData = { userid: req.query.userid, orderid: req.query.orderid }
  if (status) { // 如果没有传值,那么查询全部的数据
    findData.status = status
  }
  sql.find(Order, findData, { _id: 0 }).then(data => {
    res.send({
      code: '200',
      message: '订单列表',
      len: data.length,
      data: data
    })
  })
});

4、订单页面

4.1 购物车页面提交订单

views/cart/index.vue

submitOrder () {
  this.arr = [] // 生成订单所要使用的数据
  this.cartlist.map(item => { // 遍历购物车的数据
    if (item.flag) { // 如果当前是选中的数据
      this.arr.push(item) // 更新订单的数据
    }
  })
  console.log(this.arr)
  if (this.arr.length === 0) { // 如果没有选中商品
    Toast('请先添加商品')
    return
  }
  // 将此数据提交到服务器 ---- 产品的信息和 用户的id
  axios.get('/order/add?str=' + JSON.stringify(this.arr) + '&userid=' + localStorage.getItem('userid')).then(res => {
    console.log('order', res.data)
    // 提交订单成功 --- 跳转到订单页面 ---- 基础一定要传递 orderid
    this.$router.push('/order?orderid=' + res.data.data.orderid)
  })
}

4.2 订单页面

views/order/index.vue

  • 基本结构

  • js

import axios from '@/utils/request'
export default {
  data () {
    return {
      orderlist: []
    }
  },
  created () {
    console.log(this.$route.query)
    // 用户id
    const userid = localStorage.getItem('userid')
    // 依据用户id以及订单id 查询获取订单列表的信息
    // 订单id由this.$route.query
    axios.get('/order?userid=' + userid + '&orderid=' + this.$route.query.orderid).then(res => {
      console.log('order111', res.data)
      // 更新订单的信息 -- 一定要注意层级关系----各个字段代表的含义
      this.orderlist = res.data.data[0].list
    })
  }
}

5、确认订单页面需要 收货人姓名、联系方式、收获地址、备注

5.1 修改数据库集合 sql/collection/orders.js

const mongoose = require('../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象

// 设计用户表的集合
const orderSchema = new Schema({ // 设计用户集合的字段以及数据类型
  orderid: {type: String },
  userid: { type: String },
  status: { type: Number }, // 订单状态 0 待付款 1 待收货(已支付) 2 待评价 3 全部订单
  name: { type: String }, // 收货人
  tel: { type: String }, // 手机
  address: { type: String }, // 地址
  note: { type: String }, // 备注
  list: { type: Array }
})

module.exports = mongoose.model('Order', orderSchema);

5.2 修改提交订单的接口 routes/order.js

router.get('/add', (req, res, next) => {
  // res.send(req.query)
  // 1、获取前端提交的订单数据 "[{},{},{}]" -- 转成对象
  let list = JSON.parse(req.query.str)
  let userid = req.query.userid // 获取用户id
  let orderid = 'order_' + uuid.v1() // 生成订单的id
  let arr = [] // 订单列表数据
  // res.send(list)
  list.map(item => { // 遍历数据,获取订单的信息
    arr.push({
      proid: item.proid,
      proimg: item.proimg,
      proname: item.proname,
      price: item.price * 1,
      num: item.num * 1
    })
  })
  // 插入数据库
  sql.insert(Order, { // **************************
    orderid: orderid,
    userid: userid,
    status: 0, // 订单状态 0 待付款 1 待收货(已支付) 2 待评价
    name: '', // +++++++++
    tel: '', // +++++++++
    address: '', // +++++++++
    note: '', // +++++++++
    list: arr
  }).then(() => {
    // 生成订单后要删除购物车的数据
    let p1 = list.map(item => {
      return sql.delete(Cart, { cartid: item.cartid })
    })

    return Promise.all(p1)
  }).then(() => {
    res.send({
      code: '200',
      message: '生成订单',
      data: { // 用于在确认订单页面 查询订单的信息
        orderid: orderid
      }
    })
  })
})

6、添加地址管理

  • routes/address.js + sql/collection/addresss.js + app.js

6.1 sql/collection/addresss.js

const mongoose = require('../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象

// 地址集合
const addressSchema = new Schema({ // 地址集合
  addressid: {type: String },
  userid: { type: String },
  name: { type: String },
  tel: { type: String },
  address: { type: String },
  flag: { type: Number } // 是不是默认地址 1 表示默认地址 0 不是默认地址
})

module.exports = mongoose.model('Address', addressSchema);

6.2 设计后端的地址添加的路由

router.post('/add', (req, res, next) => {
  let { userid, name, tel, address, flag } = req.body
  flag = flag * 1 || 0
  let addressid = 'address_' + uuid.v1()
  sql.insert(Address, { userid, name, tel, address, flag, addressid }).then(() => {
    res.send({
      code: '200',
      message: '添加地址成功'
    })
  })
})

6.3 实现前端的添加地址界面

views/address/add.vue + router/index.js

<template>
  <div class="box">
    <header class="header">添加地址</header>
    <div class="content">
      <van-address-edit
        :area-list="areaList"
        show-postal
        show-delete
        show-set-default
        show-search-result
        :search-result="searchResult"
        area-columns-placeholder="['请选择', '请选择', '请选择']"
        @save="onSave"
        @delete="onDelete"
        @change-detail="onChangeDetail"
      />
    </div>
  </div>
</template>

<script>
import Vue from 'vue'
import { AddressEdit, Toast } from 'vant'
import city from '@/utils/city'
Vue.use(AddressEdit)

export default {
  data () {
    return {
      areaList: city,
      searchResult: []
    }
  },
  methods: {
    onSave (content) {
      console.log(content)
      Toast('save')
    },
    onDelete () {
      Toast('delete')
    },
    onChangeDetail (val) {
    }
  }
}
</script>

<style lang="scss" scoped>
</style>

6.4提交地址

onSave (content) {
  console.log(content)
  axios.post('/address/add', {
    userid: localStorage.getItem('userid'),
    name: content.name,
    tel: content.tel,
    address: content.province + content.city + content.county + content.addressDetail,
    flag: content.isDefault
  }).then(() => {
    Toast('添加地址成功')
    // this.$router.back()
  })
},

6.5 获取默认地址 以及获取地址列表接口

router.get('/', function(req, res, next) {
  let { userid, flag } = req.query
  flag = flag * 1 || 0
  sql.find(Address, { userid, flag }, { _id: 0 }).then(data => {
    if (data.length === 0) {
      res.send({
        code: '30000',
        message: '没有默认地址'
      })
    } else {
      res.send({
        code: '200',
        message: '获取地址',
        data: data
      })
    }
    
  })
});

7、确认订单页面显示地址信息

<ul v-if="flag">
  <li v-for="item of addresslist" :key="item.addressid">
    {{ item.name }} - {{ item.tel }} - {{ item.address }}
  </li>
</ul>
<div v-else>没有默认地址
  <router-link to="/addAddress">添加地址</router-link>
</div>
data () {
  return {
    orderlist: [],
    addresslist: [],
    flag: false
  }
},
created () {
  console.log(this.$route.query)
  const userid = localStorage.getItem('userid')
  axios.get('/order?userid=' + userid + '&orderid=' + this.$route.query.orderid).then(res => {
    console.log('order111', res.data.data[0].list)
    this.orderlist = res.data.data[0].list
  })

  // +++++++++++++++++++++++++ 
  axios.get('/address?userid=' + userid + '&flag=1').then(res => {
    console.log('addresss', res.data.data)
    if (res.data.code === '30000') {
      this.flag = false
    } else {
      this.flag = true
      this.addresslist = res.data.data
    }
  })
}
原文地址:https://www.cnblogs.com/hy96/p/11800916.html