vue+vant 移动端H5 商城项目_02

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文章目录

          • 一、路由规划
            • 1. 新建路由配置
            • 2. 下载vue-router
            • 3. 路由注册
            • 4. 路由基础配置
            • 5. 路由挂载
            • 6. AppTabBar
            • 7.
          • 二、移动端首页
            • 2.1.首页效果
            • 2.2. 首页接口请求
            • 2.3. 首页页面
            • 2.4. 首页页面
          • 三、首页组件
            • 3.1. 轮播图SwiperCom
            • 3.2. Grid 居家-志趣组件
            • 3.3. 类别页组件
            • 3.4. 品牌制造商直供
            • 3.5. 品牌详情页
            • 3.6. 周一周四新品首发
            • 3.7. 人气推荐 top组件
            • 3.8. 专题精选TopicBox

技术选型

组件版本说明
vue^2.6.11数据处理框架
vue-router^3.5.3动态路由
vant^2.12.37移动端UI
axios^0.24.0前后端交互
amfe-flexible^2.2.1Rem 布局适配
postcss-pxtorem^5.1.1Rem 布局适配
less^4.1.2css编译
less-loader^5.0.0css编译
vue/cli~4.5.0项目脚手架

vue-cli + vant+ less +axios 开发

一、路由规划

项目路由规划配置
如果项目中所有的路由都写在入口文件中,那么将不便于编写项目和后期维护。因此路由需要进行模块化处理。

1. 新建路由配置

在src目录下创建router目录,该目录下新建index.js 用于 编写路由配置

2. 下载vue-router
npm install vue-router
3. 路由注册

在index.js 文件中安装使用vue-router
router/index.js 内容:

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
4. 路由基础配置

在index.js文件中编写项目路由基础配置

  • List item
  • 首页模块
  • 专题模块
  • 分类模块
  • 购物车模块
  • 我的模块

在这里插入图片描述
router/index.js 新增基础路由内容:

// 配置项目路由
const router = new VueRouter({routes: [{path: '/',redirect: '/home' // 重定向},{path: '/home', //首页name: 'Home',component: () => import('@/views/home/Home'),children: [ // 二级路由 不能加'/''/'表示一级路由{path: 'searchPopup',component:  () => import('@/views/home/search/searchPopup.vue'),name: 'searchpopup',meta: {isshowtabbar: false},}],meta: {isShowTabbar: true}},{path: '/topic', //专题name: 'Topic',component: () => import('@/views/topic/Topic'),meta: {isShowTabbar: true}},{path: '/category', //分类name: 'Category',component: () => import('@/views/category/Category'),meta: {isShowTabbar: true}},{path: '/cart', //购物车name: 'Cart',component: () => import('@/views/cart/Cart'),meta: {isShowTabbar: true}},{path: '/user', //我的name: 'User',component: () => import('@/views/user/User'),meta: {isShowTabbar: true}},{path: '/productDetail', //产品详情name: 'ProductDetail',component: () => import('@/views/productdetail/ProductDetail')},{path: '/channel', // 产品分类页面(从首页类别点进去如 居家-餐厨-配件。。。 )name: 'Channel',component: () => import('@/views/channel/Channel.vue')},{path: '/brand', // 品牌name: 'brand',component: () => import('@/views/brand/Brand.vue')},]
})export default router
5. 路由挂载

main.js: router 挂载到根实例对象上
根据路由配置,在src目录下的views 文件中,分别创建tabbar 对应的组件文件。

在main.js 文件中引入router 文件下的index.js 路由配置文件,并在根实例中注册。


// 在 入口文件mian.js 引入路由文件
import router from '@/router/index.js';
new Vue({render: h => h(App),router  // router 挂载到根实例对象上
}).$mount('#app')
6. AppTabBar

components /AppTabBar.vue
在这里插入图片描述
在components 文件中,创建一个AppTabBar.vue组件,配置底部tabbar,直接可以使用vant的tabbar组件
在这里插入图片描述

<template><div class="app-tab-bar"><!-- 下方导航 --><van-tabbarv-model="active"active-color="#ee0a24"inactive-color="#000"@change="onChange"shape="round"route><van-tabbar-item icon="home-o" to="/home">首页</van-tabbar-item><van-tabbar-item icon="label-o" to="/topic">专题</van-tabbar-item><van-tabbar-item icon="apps-o" to="/category">分类</van-tabbar-item><van-tabbar-item icon="shopping-cart-o" to="/cart">购物车</van-tabbar-item><van-tabbar-item icon="user-o" to="/user">我的</van-tabbar-item></van-tabbar></div>
</template>
<script>
export default {name: "app-tab-bar",data () {return {active:0}},methods: {onChange(m) {this.active = m},},
};
</script><style lang='less' scoped></style>

将AppTabBar.vue导入app.vue 跟组件

<template><div id="app"><!-- 路由对应的组件存放到router-view中--><router-view></router-view><!-- 底部tabbar 组件 --><AppTabBar v-show="$route.meta.isShowTabbar"></AppTabBar></div>
</template><script>
// 引入底部tabbar 组件
import AppTabBar from './components/AppTabBar.vue';export default {name: 'App',components: {AppTabBar,},
};
</script><style lang='less' scoped></style>
7.

在这里插入图片描述
在这里插入图片描述

二、移动端首页
2.1.首页效果

在这里插入图片描述
首页展示的数据
在这里插入图片描述

2.2. 首页接口请求

http.js文件中的接口请求

//1. 首页 Home
// 获取首页数据列表
export function getIndexList() {return instance.get('/index/index')
}
2.3. 首页页面

home/home.vue
在这里插入图片描述

2.4. 首页页面
<template><div class="home"><!-- 二级路由坑 --><router-view v-if="$route.path === '/home/searchPopup'"></router-view><main v-else><!--搜索框 --><van-searchshape="round"v-model="value"show-actionplaceholder="请输入搜索关键词"@search="onSearch"@cancel="onCancel"@click="$router.push('/home/searchPopup')"/><!-- 轮播图 --><SwiperCom :banner="banner"></SwiperCom><!-- grid 居家-志趣组件 --><Grid :channel="channel"></Grid><!-- 品牌制造商直供  --><Support :brandList="brandList"></Support><!-- 周一周四新品首发 --><Weekproduct:newGoodsList="newGoodsList"title="周一周四新品首发"></Weekproduct><!-- 人气推荐 top组件 --><!-- v-if 保证了有数据才渲染该组件,等渲染该组件的时候,才执行该组件的生命周期函数--><Top :hotGoodsList="hotGoodsList" v-if="hotGoodsList.length>0"></Top><!-- 专题精选 --><TopicBox :topicList="topicList" title="专题精选"></TopicBox><!-- 产品列表 --><Weekproductv-for="item in categoryList":key="item.id":newGoodsList="item.goodsList":title="item.name"></Weekproduct></main></div>
</template><script>
// 导入轮播图组件
import SwiperCom from "@/components/SwiperCom";
import { getIndexList } from "@/https/http.js";
// 引入 grid  居家-志趣组件
import Grid from "@/views/home/Grid";
// 引入support 组件-品牌制造商直供
import Support from "@/views/home/Support";
import Weekproduct from "@/views/home/Weekproduct";
import TopicBox from "@/views/home/TopicBox";
import Top from '@/views/home/Top'
export default {name: "home",data() {return {value: "",banner: [],  //轮播图channel: [],  //居家-志趣数据brandList: [],  // 品牌制造商数据newGoodsList: [],  // 周一周四新品首发数据hotGoodsList:[],  // 人气推荐topicList: [],  // 专题精选categoryList: []  //产品列表};},components: {SwiperCom,Grid,Support,Weekproduct,TopicBox,Top,},created() {// 发送请求,获取数据getIndexList().then((res) => {console.log("res", res);this.banner = res.data.banner;this.channel = res.data.channel;this.brandList = res.data.brandList;this.newGoodsList = res.data.newGoodsList;this.topicList = res.data.topicList;this.categoryList = res.data.categoryList;this.hotGoodsList = res.data.hotGoodsList;});},methods: {onSearch() { },onCancel() { },},
};
</script><style lang="less" scoped>
.home {padding-bottom: 100px;box-sizing: border-box;
}
</style>
三、首页组件
3.1. 轮播图SwiperCom

在这里插入图片描述
在这里插入图片描述

<template><!-- 轮播图 --><div class="swiper-com"><van-swipe class="my-swipe" :autoplay="1000" indicator-color="white"><van-swipe-item v-for="item in banner" :key="item.id" ><img :src="item.image_url" alt=""></van-swipe-item></van-swipe></div>
</template><script>
export default {name:'swiper-com',props:['banner'],}
</script><style lang="less" scoped>.swiper-com{width: 100%;img{width: 100%;}}
</style>
3.2. Grid 居家-志趣组件

在这里插入图片描述

在这里插入图片描述

<template><div class="gird"><van-grid :column-num="5" channel.length><van-grid-itemv-for="item in channel":key="item.id":icon="item.icon_url":text="item.name"@click="btn(item.id)"/></van-grid></div>
</template><script>
export default {name: "gird",props: ["channel"],methods: {btn(id){this.$router.push({path: '/channel', query:{id: id}})}}
};
</script><style>
</style>
3.3. 类别页组件

在这里插入图片描述
Channel.vue
在这里插入图片描述

<template><div class="channel-box"><van-tabs sticky @change="changeFn"><van-tab v-for="item in brotherCategory" :key="item.id" :title="item.name" ><h4>{{ item.name }}</h4><p>{{ front_desc }}</p><!-- 产品列表 --><Products :goodsList="goodsList" /></van-tab></van-tabs></div>
</template><script>
import { GetCateGoryData, GetCateGoryList } from "@/https/http";
import Products from "@/components/Products";export default {name: "channel",data() {return {id_: "0", // 当前类别的idpage: 1, // 当前页数size: 1000, //每页显示条数brotherCategory: [], // 分类数组goodsList: [], //当前类别对应的商品列表front_desc: "",};},created() {this.id_ = this.$route.query.id;this.getCategoryData();  //获取所有分类数据this.getCategoryListData();  //获取当前类别对应的产品数组}, methods: {//获取所有分类数据getCategoryData() {GetCateGoryData({ id: this.id_ }).then((res) => {this.brotherCategory = res.data.brotherCategory; // 全部分类数组this.currentCategory = res.data.currentCategory; // 当前分类对象this.front_desc = this.currentCategory.front_desc; // 当前类别文字描述});},//获取当前类别对应的产品数组getCategoryListData() {GetCateGoryList({categoryId: this.id_,page: this.page,size: this.size,}).then((res) => {console.log(33, res);if (res.errno == 0) {this.goodsList = res.data.goodsList;}});},// / 切换分类changeFn(title, name) {// title 下标// name: 分类标题this.brotherCategory.forEach((item) => {if (item.name == name) {this.id_ = item.id;}});this.getCategoryListData();this.getCategoryData();},},components: {Products,},
};
</script><style lang="less" scoped>
.channel-box {text-align: center;font-size: 16px;line-height: 40px;p {color: #666;}
}
</style>
3.4. 品牌制造商直供

在这里插入图片描述
在这里插入图片描述

<template><div class="support"><ul><li v-for="item in brandList" :key="item.id" @click="clickFn(item.id)"><img :src="item.pic_url" alt=""><h4>{{item.name}}</h4><p>{{item.floor_price|moneyFlrmat}}</p></li></ul></div>
</template><script>
export default {name:'support',props:['brandList'],methods: {clickFn(id){this.$router.push({path:'/brand', query:{id: id}})}}
}
</script><style lang="less" scoped>.support>ul{width: 100%;display: flex;justify-content: space-between;flex-wrap: wrap;li{width: 49%;position: relative;img{width: 100%;}h4 {font-size: 16px;position: absolute;left: 20px;top: 30px;}p {font-size: 15px;position: absolute;left: 30px;top: 60px;color: red;}}}
</style>
3.5. 品牌详情页

在这里插入图片描述
在这里插入图片描述

<template><div class="brand-box"><h4>{{ name }}</h4><img :src="list_pic_url" alt="" /><p>{{ simple_desc }}</p></div>
</template><script>
import { GetBrandList } from '@/https/http'
export default {name: 'brand',data() {return {name: '',simple_desc: '',list_pic_url: '',page: 1,size: 1000,}},created() {this.getBrandData()},methods: {// 发送请求,获取品牌详情页数据getBrandData() {GetBrandList({ id: this.$route.query.id }).then((res) => {console.log(res);this.name = res.data.brand.namethis.simple_desc = res.data.brand.simple_descthis.list_pic_url = res.data.brand.list_pic_url})},}
}
</script><style lang="less" scoped>
.brand-box {text-align: center;font-size: 16px;line-height: 40px;img {width: 100%;}
}
</style>
3.6. 周一周四新品首发

在这里插入图片描述
在这里插入图片描述

<template><div class="week-product"><div class="mytitle"><span></span><h3>{{ title }}</h3></div><ul><li v-for="item in newGoodsList" :key="item.id" @click="clickFn(item.id)"><img :src="item.list_pic_url" alt="" /><p>{{ item.name }}</p><p>{{ item.retail_price }}</p></li></ul></div>
</template><script>
export default {name: 'week-product',props: ['newGoodsList', 'title'],methods: {clickFn(id) {this.$router.push({ path: '/productDetail', query: { id: id } })}}
}
</script><style lang="less" scoped>
.week-product {.mytitle {text-align: center;font-size: 16px;margin-top: 20px;position: relative;height: 50px;span {width: 50%;height: 2px;background-color: #ccc;display: inline-block;position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);}h3 {width: 30%;background-color: #fff;position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);}}ul {display: flex;justify-content: space-between;flex-wrap: wrap;li {width: 49%;img {width: 100%;}p {text-align: center;font-size: 16px;}}}
}
</style>
3.7. 人气推荐 top组件

在这里插入图片描述
在这里插入图片描述

<template><div class="top-box"><h3>人气推荐</h3><div class="content" v-for="item in hotGoodsList" :key="item.id"><van-card:key="item.id":price="item.retail_price":desc="item.goods_brief":title="item.name":thumb="item.list_pic_url"@click="clickFn(item.id)"/></div></div><!-- v-for="item in hotGoodsList -->
</template><script>
export default {name: 'top',props: ['hotGoodsList'],created() {console.log(555, this.hotGoodsList);},methods: {clickFn(id) {this.$router.push({ path: '/productDetail', query: { id: id } })}}
}
</script><style lang="less" scoped>
.top-box {h3 {font-size: 22px;line-height: 60px;text-align: center;}
}
</style>
3.8. 专题精选TopicBox

在这里插入图片描述
在这里插入图片描述

<template><div class="topic"><h3>{{ title }}</h3><van-swipe class="my-swipe" :autoplay="1000" indicator-color="white"><van-swipe-itemv-for="item in topicList":key="item.id"><img :src="item.item_pic_url" alt="" /><p>{{ item.title }}</p><p>{{ item.subtitle }}</p></van-swipe-item></van-swipe></div>
</template><script>
export default {name: 'topic',props: ['topicList', 'title'],}
</script><style lang="less" scoped>
.topic {width: 100%;text-align: center;font-size: 16px;h3 {font-size: 22px;line-height: 60px;text-align: center;}.my-swipe {display: flex;img {width: 100%;height: 200px;}}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MaxCompute规格详解 让您花更低的成本获得更高的业务价值

精彩视频回看请点击&#xff1a;MaxCompute规格详解 以下为精彩视频内容整理&#xff1a; 在用户使用MaxCompute之前&#xff0c;都会考虑成本和业务两大问题。有些企业处在快速的发展期&#xff0c;在业务上对性能的要求比较高&#xff0c;例如计算业务对资源的需求是弹性的&…

翼方健数邓振:“DRG+AI”助力实现医院精细化管理

日前&#xff0c;第十四届中国医院院长年会在厦门举行&#xff0c;从宏观与微观、管理与学科等不同维度&#xff0c;跟进解读了后疫情时代中国医疗健康行业、中国医院发展的挑战、机遇与对策。 2020年是全面建成小康社会决胜之年&#xff0c;也是“十四五”规划之年。中国医疗…

全自动化虽然还早,但机器人劳力确实越来越便宜了

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 编者按&#xff1a;本文来自爱范儿&#xff0c;作者 吴羚&#xff0c;36氪经授权发布。 电影《终结者&#xff1a;黑暗命运》…

vue+vant 移动端H5 商城项目_03

文章目录一、首页搜索功能1. 搜索页面2. 历史记录和热门搜索组件3. 搜索框提示列表组件4. 综合-价格-分类5. 搜索出的产品展示6. 异常修复7. 路由拦截/路由守卫二、详情页2.1. 效果图2.2. 详情api2.3. 配置路由2.4. 详情页面2.5. 详情页源码技术选型组件版本说明vue^2.6.11数据…

一家典型的云原生企业,如何在创业早期数次“弯道超车”?

作者 | 禾易受访 | 张淼&#xff0c;玩物得志 App CTO来源 | 阿里巴巴中间件引言前几天&#xff0c;阿里云研究员毕玄分享了自己作为阿里云技术人的一个感受&#xff1a;做基础技术的同学&#xff0c;当越来越好地满足了业务发展的诉求后&#xff0c;会发现业务方对基础技术的唯…

“黑天鹅”,正在改变 AI 落地医疗领域的加速度

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 编者按&#xff1a;本文来自微信公众号“极客公园”&#xff0c;作者 在野&#xff0c;36氪经授权转载。 三月中旬&#xff…

vue+vant 移动端H5 商城项目_04

文章目录一、专题页1. 效果图2. 专题api2.Topic.vue 组件3. 专题源码二、分类页2.1. 效果图2.2. 分类api2.3. Category.vue 组件三、购物车页3.1. 效果图3.2. 购物车api3.3. 购物车页面四、我的页4.1. 效果图4.2. 定义api4.3. User.vue五、路由守卫和异常处理5.1. 编写路由守卫…

Azure Arc 正式商用、Power Platform+GitHub 世纪牵手,一文看懂 Ignite 2020

戳 https://t.csdnimg.cn/dRjD 报名每年科技巨头微软举办 Ignite 大会&#xff0c;发布其最新技术、产品、服务和解决方案。今年 Ignite 2020 大会在 9 月 22 日如约而至&#xff0c;除了将线下会议搬到线上外&#xff0c;微软一如既往地推出众多重磅技术&#xff1a;如被福布斯…

战“疫”期,阿里云云效团队在家高效开发实录

【以下内容为分享实录&#xff0c;有删节】 如何解决在家办公时 “团队沟通”和“研发流程”问题 软件研发团队在家办公时&#xff0c;会遇到的两个核心问题&#xff1a;团队沟通和研发流程。因为云效团队原本就分布在多个城市&#xff0c;平时的沟通方式也经常采用“在线会议…

当 Mars 遇上 RAPIDS:用 GPU 以并行的方式加速数据科学

背景 在数据科学世界&#xff0c;Python 是一个不可忽视的存在&#xff0c;且有愈演愈烈之势。而其中主要的使用工具&#xff0c;包括 Numpy、Pandas 和 Scikit-learn 等。 Numpy Numpy 是数值计算的基础包&#xff0c;内部提供了多维数组&#xff08;ndarray&#xff09;这…

vue2.x vant2.x H5 移动端脚手架

文章目录一、前置准备1. 技术选型2. 创建vue项目二、Rem 布局适配2.1. px转rem2.2. 设置 rem 基准值2.3. 配置vue.config.js2.4. 重置样式表2.5. 配置样式表2.6. 安装less2.7. 注册less2.8. 代码中使用三、vant安装/配置/测试3.1. 安装vant-ui3.2. 引入与注册3.3. vant测试四、…

相见恨晚!遗憾仅有不到1% 的人知道

广泛在各领域被应用的数据分析&#xff0c;现在已经是任何岗位任何职业都需要用到的技能。即便不从事职业的数据分析&#xff0c;掌握一定的数据处理能力也将成为你职场中绝对的加分项。为了跟上人才市场的能力需求&#xff0c;许多做技术开发的同学也加入了数据分析的学习热潮…

【机器人】标记不友好评论,AI工作效果是人类的4.4倍

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 不友好的评论对于系统而言是一个大问题&#xff0c;因为他们的语气会影响被评论者和未来读者对 Stack Overflow 的贡献意愿。…

VBA 常用代码及自定义函数备忘

文章目录 1. 函数1.1 Windows API1.1.1 改变当前鼠标指针形状1.1.2 Sleep 程序休眠1.2 自定义函数1.2.1 去除空格1.2.2 测试图片格式1.2.3 获取打印机信息1.2.4 GB/T 8170 修约1.2.5 邮箱格式检查1.2.6 汉字转拼音1.2.7 列标签字母与列序号数值转换1.2.8 大小写金额转换1.2.9 分…

2020年云计算的十大新兴趋

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 人们将在2020年可能会看到一些顶级云计算趋势主题&#xff0c;其中包括人工智能、自动化和多云的更大发展。 随着越来越多的…

各企业正在纷纷向“云”,背后有着哪些原因?

撰者 | Emil Sayegh译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在全球大流行的初期&#xff0c;各地企业的目标很简单&#xff1a;继续运营。社交隔离要求使得零售&#xff0c;银行&#xff0c;医疗&#xff0c;教…

如何在Java代码中去掉烦人的“!=null”

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 问题 为了避免空指针调用&#xff0c;我们经常会看到这样的语句 if (someobject ! null) {someobject.doCalc(); } 最终&a…

vue TypeError: Cannot read property ‘upgrade‘ of undefined

这个错误的原因是&#xff1a; vue.config.js 中配置的 proxy 中的 target 上设置的 process.env.xxxxx 不存在。

吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…