美文网首页
地址页面

地址页面

作者: 是新来的啊强呀 | 来源:发表于2020-05-11 21:33 被阅读0次

创建购物车地址前端页面,src/views/Address.vue中

<template>
  <div>
...
    <div class="checkout-page">
          <!-- address list  地址列表, 遍历地址-->
          <div class="page-title-normal checkout-title">
            <h2><span>Shipping address</span></h2>
          </div>
          <div class="addr-list-wrap">
            <div class="addr-list">
              <ul>
                <li v-for="(item,index) in addressListFilter" v-bind:class="{'check':checkedIndex==index}" @click="checkedIndex=index,selectedAddrId=item.addressId">
                  <dl>
                    <dt>{{item.userName}}</dt>
                    <dd class="address">{{item.streetName}}</dd>
                    <dd class="tel">{{item.tel}}</dd>
                  </dl>
                  <div class="addr-opration addr-del">
                    <a href="javascript:;" class="addr-del-btn" @click="delAddressConfirm(item.addressId)">
                      <svg class="icon icon-del"><use xlink:href="#icon-del"></use></svg>
                    </a>
                  </div>
                  <div class="addr-opration addr-set-default">
                    <a href="javascript:;" class="addr-set-default-btn" @click="setDefault(item.addressId)" v-if="!item.isDefault"><i>Set default</i></a>
                  </div>
                  <div class="addr-opration addr-default" v-if="item.isDefault">Default address</div>
                </li>
                <li class="addr-new">
                  <div class="add-new-inner">
                    <i class="icon-add">
                      <svg class="icon icon-add"><use xlink:href="#icon-add"></use></svg>
                    </i>
                    <p>Add new address</p>
                  </div>
                </li>
              </ul>
            </div>
            <!--more列表显示更多地址-->
            <div class="shipping-addr-more">
              <a class="addr-more-btn up-down-btn" href="javascript:;" @click="expend" v-bind:class="{'open':limit>3}">
                more
                <i class="i-up-down">
                  <i class="i-up-down-l"></i>
                  <i class="i-up-down-r"></i>
                </i>
              </a>
            </div>
          </div>

          <!-- shipping method 配送方式-->
          <div class="page-title-normal checkout-title">
            <h2><span>Shipping method</span></h2>
          </div>
          <div class="shipping-method-wrap">
            <div class="shipping-method">
              <ul>
                <li class="check">
                  <div class="name">Standard shipping</div>
                  <div class="price">Free</div>
                  <div class="shipping-tips">
                    <p>Once shipped,Order should arrive in the destination in 1-7 business days</p>
                  </div>
                </li>
              </ul>
            </div>
          </div>
          <div class="next-btn-wrap">
<!-- 添加跳转路由,动态传参需要绑定v-bind:to="{path:'orderConfirm',query:'addressId':selectAddress}"-->
            <router-link class="btn btn--m btn--red" v-bind:to="{path:'orderConfirm',query:{'addressId':selectedAddrId}}">Next</router-link>
          </div>
        </div>
      </div>
    </div>
    <modal v-bind:md-show="ismdShow" @close="closeModal">
      <p slot="message">
        您是否确认要删除地址?
      </p>
      <div slot="btnGroup">
        <a class="btn btn--m" href="javascript:;" @click="delAddress">确认</a>
        <a class="btn btn--m" href="javascript:;" @click="closeModal">取消</a>
      </div>
    </modal>
...
  </div>
</template>
<script>
  import NavFooter from '@/components/NavFooter.vue'
  import NavHeader from '@/components/NavHeader.vue'
  import NavBread from '@/components/NavBread'
  import axios from '../../node_modules/axios/dist/axios.js'
  import {currency} from '@/util/currency.js'
  import Modal from "../components/Modal";
  export default {
        data(){
          return{
            addressList:[],
            limit:3,  // 地址列表中要展示的地址个数
            checkedIndex:0,  // 选中的地址索引
            ismdShow:false,  // 删除地址提示框
            addressId:'',  // 要删除的地址Id
            selectedAddrId:''  // 选中的需要邮寄的地址,用于传递到订单确认界面
          }
        },
        components:{
          Modal,
          NavHeader,
          NavBread,
          NavFooter
        },
        computed:{
          addressListFilter(){
            return this.addressList.slice(0,this.limit);
          }
        },
        mounted() {
          this.init();
        },
        methods:{
          init(){
            axios.get('/users/addressList').then((response)=>{
              let res = response.data;
              this.addressList = res.result;
            })
          },
          // more展开
          expend(){
            if(this.limit==3){
              this.limit = this.addressList.length;
            }else{
              this.limit = 3;
            }
          },
          // 设置默认地址
          setDefault(addressId){
            axios.post('/users/setDefault',{
              addressId:addressId
            }).then((response)=>{
              let res = response.data;
              if(res.status == '0'){
                console.log("setDefault success")
                this.init();
              }
            })
          },
          // 关闭模块组件
          closeModal(){
            this.ismdShow = false;
          },
          // 删除确认弹框
          delAddressConfirm(addressId){
            this.ismdShow = true;
            this.addressId = addressId
          },
          // 删除地址
          delAddress(){
            axios.post('/users/delAddress',{
              addressId:this.addressId
            }).then((response)=>{
              let res = response.data;
              if(res.status=='0'){
                this.ismdShow = false;
                console.log("del suc");
                this.init();
              }
            })
          }
        }
    }
</script>

src/router/index.js中添加address路由

import Vue from 'vue'
import Router from 'vue-router'
import GoodsList from '@/views/GoodsList.vue'
import Cart from "@/views/Cart";
import Address from "../views/Address";

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/goods',
      name: 'GoodsList',
      component: GoodsList
    },
    {
      path: '/cart',
      name: 'Cart',
      component: Cart
    },
    {
      path:'/address',
      name:'Address',
      component:Address
    }
  ]
})

后端,server/models/users.js在user模型中修改地址列表addressList的格式

var moogoose = require('mongoose');
let userSchema = new moogoose.Schema({
  "userId":String,
  "userName":String,
  "userPwd":String,
  "orderList":Array,
  "cartList":[
    {
      "productId":String,
      "productName":String,
      "salePrice":String,
      "productImage":String,
      "checked":String,
      "productNum":String
    }],
  "addressList":[
    {
      "addressId": String,
      "userName": String,
      "streetName": String,
      "postCode": Number,
      "tel": Number,
      "isDefault": Boolean
    }
  ]
});
module.exports = moogoose.model("User",userSchema)

后端创建新接口, server/routes/users.js中添加:查询用户地址接口 、 设置默认地址接口 、 删除地址接口

// 查询用户地址接口
router.get('/addressList',function (req,res,next) {
  var userId = req.cookies.userId
  User.findOne({userId:userId},function (err,doc) {
    if(err){
      res.json({
        status:'1',
        msg:err.message,
        result:''
      })
    }else{
      res.json({
        status:'0',
        msg:'',
        result:doc.addressList
      })
    }
  })
})

// 设置默认地址
router.post("/setDefault",function (req,res,next) {
  var userId = req.cookies.userId;
  var addressId = req.body.addressId;
  if(!addressId){
    res.json({
      status:'1003',
      msg:'addressId is null',
      result:''
    })
  }
  User.findOne({userId:userId},function (err,doc) {
    if(err){
      res.json({
        status:'1',
        msg:err.message,
        result:''
      })
    }else{
      var addressList = doc.addressList;
      addressList.forEach((item)=>{  // 遍历所有的地址
        if(item.addressId == addressId){
          item.isDefault = true;
        }else{
          item.isDefault = false;
        }
      })
      // 参数修改完后需要保存
      doc.save(function (err1,doc1) {
        if(err1){
          res.json({
            status:'1',
            msg:err.message,
            result:''
          })
        }else{
          res.json({
            status:'0',
            msg:'',
            result:''
          })
        }
      })
    }
  })
})

// 删除地址接口
router.post('/delAddress',function (req,res,next) {
  var userId = req.cookies.userId,addressId = req.body.addressId;
  User.update({
    userId:userId
  },{
    $pull:{  // 指向我们要删除的元素
      'addressList':{
        'addressId':addressId
      }
    }
  },function (err,doc) {
    if(err){
      res.json({
        status:'1',
        msg:err.message,
        result:''
      })
    }else{
      res.json({
        status:'0',
        msg:'',
        result:'suc'
      })
    }
  });
})

相关文章

网友评论

      本文标题:地址页面

      本文链接:https://www.haomeiwen.com/subject/kjgpnhtx.html