Vue2+Vant+mock实现商城项目(下)

上次实现了,四个导航页面,这次实现下面的分页

Vue2+Vant+mock实现商城项目(上)-CSDN博客

一,登录页面

任何一个软件都有要有登录,注册的,这个简单的项目也有

注册登录界面,由上面的头部引用已经写好的SimpleHeader组件

中间部分由输入框组成,用组件封装的比较简单,自己写比较麻烦  用vant封装的form

<van-form @submit="onSubmit">
  <van-cell-group inset>
    <van-field
      v-model="username"
      name="用户名"
      label="用户名"
      placeholder="用户名"
      :rules="[{ required: true, message: '请填写用户名' }]"
    />
    <van-field
      v-model="password"
      type="password"
      name="密码"
      label="密码"
      placeholder="密码"
      :rules="[{ required: true, message: '请填写密码' }]"
    />
  </van-cell-group>
  <div style="margin: 16px;">
    <van-button round block type="primary" native-type="submit">
      提交
    </van-button>
  </div>
</van-form>

下面的验证码也是一个组件,verify是一款纯前端验证码组件,使用npm i vue2-verify命令安装

可以实现以下验证方式

常规验证码picture 常规的验证码由数字和字母构成,输入不区分大小写,可变形成汉字验证。
运算验证码compute 运算验证码主要通过给出数字的加减乘运算,填写运算结果进行验证。
滑动验证码slide 通过简单的滑动即可完成验证,应用与移动端体验很好。
拼图验证码puzzle 拼图。
选字验证码pick 通过按顺序点选图中的汉字完成验证,ie浏览器要求9或以上。

使用方式:设置success和error,分别代表验证码输入成功和输入错误时的回调

<script>
    import Verify from 'vue2-verify'
    export default {
        components: {
            Verify,
        },
        methods: {
            onVerifySuccess(obj) {
                //验证码正确回调
                console.log('verify success');
                //todo
            },
            onVerifyError(obj) {
                //验证码错误回调
                console.log('verify error');
                //错误刷新验证码
                obj.refresh();
                //todo
            }
        }
    }
</script>

二,搜索界面

搜索界面的也使用了组件,vant的List 列表

这个页面使用了无限滚动

van-pull-refresh 组件为列表下拉刷新功能,接受 refresh 属性作为触发刷新回调的方法,将刷新方法 onLoad 放置于 onRefresh 下,作用是在触发下拉刷新时,重新请求第一页的数据。 van-list 组件接受 load 属性,refreshing 为 false ,说明不是下拉刷新出发的 onLoad 函数,page 页数往上加 1,再调用 init 方法,获取列表数据。(获取的数据都是moke生成的)

<script>
import { search } from '../service/good';
import { Toast } from 'vant';
export default {
  data () {
    return {
      keyword: this.$route.query.keyword || '', // 关键词搜索
      refreshing: false, // 是否是下拉刷新
      loading: false,
      finished: false, // 是否没有更多
      productList: [], // 列表数据
      totalPage: 0, // 页码总数
      page: 1, // 页码
      orderBy: '',
    };
  },
  mounted () { },
  methods: {
    //页面初始化
    async init () {
      const { categoryId, from } = this.$route.query;
      console.log(categoryId, "categoryId");
      if (!categoryId && !this.keyword) {
        // Toast.fail('请输入关键词')
        this.finished = true;
        this.loading = false;
        return;
      }
      const {
        data,
        data: { list },
      } = await search({
        pageNumber: this.page,
        goodsCategoryId: categoryId,
        keyword: this.keyword,
        orderBy: this.orderBy,
      });
      console.log(data, list, "data");
      this.productList = this.productList.concat(list);
      // console.log(this.productList, "this.productList ");
      this.totalPage = data.totalPage;
      this.loading = false;
      if (this.page >= data.totalPage) this.finished = true;
    },
    //回退
    goBack () {
      this.$router.go(-1);
    },
    //跳转至详细商品界面
    productDetail (item) {
      console.log(`product/${item.goodsId}`, "item");
      this.$router.push({ path: `product/${item.goodsId}` });
    },
    //搜索
    getSearch () {
      this.onRefresh();
    },
    //刷新
    onLoad () {
      if (!this.refreshing && this.page < this.totalPage) {
        this.page = this.page + 1;
      }
      if (this.refreshing) {
        this.productList = [];
        this.refreshing = false;
      }
      this.init();
    },
    //下拉刷新
    onRefresh () {
      this.refreshing = true;
      this.finished = false;
      this.loading = true;
      this.page = 1;
      this.onLoad();
    },
    changeTab (name, title) {
      this.orderBy = name;
      this.onRefresh();
    },
  },
};
</script>

三,商品详情

 

从搜索页面点击商品就跳转到了商品详情页面,商品详情页面的主要功能是添加购物车,和立即购买,添加购物车,购物车上面出现数字,

使用vant的GoodsAction 商品导航组件可以出来这种效果

<van-goods-action>
  <van-goods-action-icon icon="chat-o" text="客服" @click="onClickIcon" />
  <van-goods-action-icon icon="cart-o" text="购物车" @click="onClickIcon" />
  <van-goods-action-icon icon="shop-o" text="店铺" @click="onClickIcon" />
  <van-goods-action-button
    type="danger"
    text="立即购买"
    @click="onClickButton"
  />
</van-goods-action>
import { Toast } from 'vant';

export default {
  methods: {
    onClickIcon() {
      Toast('点击图标');
    },
    onClickButton() {
      Toast('点击按钮');
    },
  },
};

点击立即购买可以跳转到购物车界面,购物车上次讲过了

四:订单界面

购物车界面点击购买就可以直接跳转到订单界面,订单界面和购物车里面的商品相通

点击生成订单,下面弹出支付,通过vant组件的popup实现

<van-cell is-link @click="showPopup">展示弹出层</van-cell>
<van-popup v-model="show">内容</van-popup>
export default {
  data() {
    return {
      show: false,
    };
  },

  methods: {
    showPopup() {
      this.show = true;
    },
  },
};

在设置两个button,即上图的微信支付和支付宝支付,点击跳转到我的订单界面

五,我的订单

我的订单是结算后的界面,由于数据是生成的,所以和前面的数据看着不相同

六,地址管理

从订单界面的上面的地址栏可以跳转到地址管理,实现地址的修改,与添加还有设为默认地址

使用了vant的AddressList 地址列表

<van-address-list
  v-model="chosenAddressId"
  :list="list"
  :disabled-list="disabledList"
  disabled-text="以下地址超出配送范围"
  default-tag-text="默认"
  @add="onAdd"
  @edit="onEdit"
/>
import { Toast } from 'vant';

export default {
  data() {
    return {
      chosenAddressId: '1',
      list: [
        {
          id: '1',
          name: '张三',
          tel: '13000000000',
          address: '浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室',
          isDefault: true,
        },
        {
          id: '2',
          name: '李四',
          tel: '1310000000',
          address: '浙江省杭州市拱墅区莫干山路 50 号',
        },
      ],
      disabledList: [
        {
          id: '3',
          name: '王五',
          tel: '1320000000',
          address: '浙江省杭州市滨江区江南大道 15 号',
        },
      ],
    };
  },
  methods: {
    onAdd() {
      Toast('新增地址');
    },
    onEdit(item, index) {
      Toast('编辑地址:' + index);
    },
  },
};

七,修改地址

也是用了vant 的组件AddressEdit 地址编辑

<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"
/>
import { Toast } from 'vant';

export default {
  data() {
    return {
      areaList,
      searchResult: [],
    };
  },
  methods: {
    onSave() {
      Toast('save');
    },
    onDelete() {
      Toast('delete');
    },
    onChangeDetail(val) {
      if (val) {
        this.searchResult = [
          {
            name: '黄龙万科中心',
            address: '杭州市西湖区',
          },
        ];
      } else {
        this.searchResult = [];
      }
    },
  },
};

由于没有后端所以我们要自己调地址接口,common里面存放了全国各省市的地址

八,评价一下

使用了vant的uploader组件,文件上传

<van-uploader :after-read="afterRead" />
export default {
  methods: {
    afterRead(file) {
      // 此时可以自行将文件上传至服务器
      console.log(file);
    },
  },
};

以及使用了Rate 评分组件

<van-rate v-model="value" />
export default {
  data() {
    return {
      value: 3,
    };
  },
};

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值