目录

  • 一、 项目架构
  • 二、项目技术栈
  • 三、项目所有模块及技术点
    • 跨域
    • 登录组件
      • 1. 路由鉴权
      • 2.登录校验
    • 首页
      • 1. 顶部组件
      • 2. 底部组件
      • 3. tab栏
      • 4. 轮播图
    • 商品全局组件
      • 1.注册全局组件
      • 2.点击更多
    • 全部商品
      • 1.tabs
      • 2.分页
    • 详情
      • 1.加入购物车
      • 2. 添加收藏
    • 购物车
      • 1.全选
      • 2.删除
      • 3.总价格和总数量
    • 我的订单
    • 我的收藏
    • 确认订单

一、 项目架构

  1. 封装各个模块的api


例如:

import request from '@/utils/request'
export default {//请求收藏接口getCollect(data) {return request({url: '/api/user/collect/getCollect',method: 'post',data: data})},//删除收藏deleteCollect(data) {return request({url: '/api/user/collect/deleteCollect',method: 'post',data: data})},
}
  1. 整理模块 和命名规范

  1. 路由及懒加载
const routes = [{path: '/',name: 'Home',component: Home,// *重定向redirect: 'HomePage'},//* 首页{path: '/Shoppe',name: 'Shoppe',component: () => import(/* webpackChunkName: "首页" */ '../views/Shoppe.vue'),children: [{path: '/HomePage',name: 'HomePage',component: () => import(/* webpackChunkName: "首页" */ '../views/HomePage.vue'),},{path: '/goods',name: 'goods',component: () => import(/* webpackChunkName: "首页" */ '../views/Goods.vue'),meta: {break: ['全部商品', '分类'],keepAlive: true,}},{path: '/details',name: 'details',component: () => import(/* webpackChunkName: "首页" */ '../components/module/Details.vue'),},{path: '/myerror',name: 'myerror',component: () => import(/* webpackChunkName: "断网" */ '../components/module/myError.vue')},{path: '/collect',name: 'Collect',component: () => import(/* webpackChunkName: "收藏" */ '../views/Collect.vue')},{path: '/shopping',name: 'shopping',component: () => import(/* webpackChunkName: "购物车" */ '../views/Shopping.vue')},{path: '/confirmOrder',name: 'confirmOrder',component: () => import(/* webpackChunkName: "订单" */ '../views/ConfirmOrder.vue')},{path: '/Order',name: 'Order',component: () => import(/* webpackChunkName: "订单" */ '../views/Order.vue')},]}
]

二、项目技术栈

  • axios
  • element-ui
  • vuex
  • xuex-persist
  • node-sass
  • vue-cli

三、项目所有模块及技术点

跨域
  • 通过proxy代理解决跨域
module.exports = {publicPath: './',//*再开开devServer: {open: true,proxy: {'/api':{target: 'http://39.100.7.70:81/',changeOrigin: true,pathRewrite: {'^/api': ''}}}}
}

登录组件
1. 路由鉴权

路由的鉴权,在没有登录的时候跳转购物车,我的收藏时 调用vuex中的方法,弹出登录框

//*路由鉴权
router.beforeEach((to, from, next) => {//*判断有没有登录if (store.state.token == "") {//*去哪些页面if (to.path == "/collect" || to.path == "/shopping") {//*没有登陆就发送vuexstore.commit("uplogin")}}next()
})
2.登录校验
 registerLogin: {userName: [{ validator: validateLogin1, required: true, trigger: "blur" },{pattern: /^[a-zA-Z]([-_a-zA-Z0-9]{5,16})$/,message: "字母开头,长度5-16之间,允许字母数字下划线",},],password: [{ validator: validateLogin2, trigger: "blur" }],},

首页
1. 顶部组件

  • 登录后如果购物车内总条数大于1时,购物车颜色高亮,

  • 登录弹出框需要拆成组件,当没登陆时需要弹出

2. 底部组件

  • 布局及样式
  • 精灵图使用
.elvesFigure {width: 40px;height: 40px;background: url("../../assets/us-icon.png") no-repeat 0px 0px; /* 第一个图标*/}
3. tab栏

  • 点击进行相应的跳转
<el-menu:default-active="activeIndex"class="el-menu-demo"mode="horizontal"active-text-color="red"router><el-menu-item index="/">首页</el-menu-item><el-menu-item index="goods">全部商品</el-menu-item><el-menu-item index="3">关于我们</el-menu-item></el-menu>
  • 搜索框,路由传参,通过监听$route获取数据
determineSearch() {this.$router.push({path: `/goods?search=${this.search}`,});},
$route(val) {if (val.query.categoryID) {this.categoryID = val.query.categoryID;this.getProductByCategory();return;}if (val.query.search) {this.search = val.query.search;this.getProductBySearch();}},
4. 轮播图
 <div class="slideshow"><el-carousel height="460px"><el-carousel-item v-for="(item, index) in carouselData" :key="index"><img class="slideshowImg" :src="'api' + item.imgPath" alt="" /></el-carousel-item></el-carousel></div>

商品全局组件
  • 相应布局
1.注册全局组件

//注册全局组件
import mymodel from './components/module/myModel'
Vue.component(mymodel.name, mymodel)
2.点击更多
BrowseMore() {let arr = [];this.categoryName.forEach((item) => {arr.push(item.category_id);});function data(arr) {return [...new Set(arr)];}let list = data(arr);this.$router.push({path: "/goods?categoryID",query: { categoryID: list },});},

全部商品

1.tabs
<el-tabs v-model="activeName" type="card"><el-tab-panev-for="item in tabList":key="item.category_id":label="item.category_name":name="'' + item.category_id"></el-tab-pane></el-tabs>
  • 将全局组件渲染的数组 换成全部商品里的数据
<mymodelstyle="lll":sTyle="{ width: '19%' }":categoryName="AllProduct":flags="false"></mymodel>
2.分页
<el-pagination@current-change="currentChange":page-size="pageSize"backgroundlayout="prev, pager, next":total="total"></el-pagination>
  • 切换分页
currentChange(currentPage) {this.currentPage = currentPage;},

详情
  • 基本布局

1.加入购物车
  • 加入购物车需要判断用户有无登录token,如果没有需要 弹出登录框
//*加入购物车判断async addShopping() {if (this.$store.state.token == "") {//*发送参数,显示弹框this.$store.commit("uplogin");} else {//*请求数据let { data: item } = await ShoppingApi.addShoppingCart({user_id: this.$store.state.userId,product_id: this.DetailsData.product_id,});this.$notify({title: "成功",message: item.msg,type: "success",});}},
2. 添加收藏
  • 思路同上,判断有无登录
//*添加收藏async fond() {if (this.$store.state.token == "") {this.$store.commit("uplogin");} else {let { data: item } = await DetailsApi.addCollect({user_id: this.$store.state.userId,product_id: this.DetailsData.product_id,});// 添加收藏成功if (item.code == "001") {this.$notify({title: "成功",message: "添加收藏成功",type: "success",});} else {this.$notify.error({title: "错误",message: item.msg,});}}},

购物车
  • 购物车为空时
  • 购物车总条数 > 1
1.全选
  • elementui 自带全选反选,只需将选中的数据发送到vuex中
//*点击单选全选,发送数据到vuex,计算handleSelectionChange(val) {this.multipleSelection = val;if (val.length > 0) {this.flag = true;} else {this.flag = false;}this.$store.commit("handleSelectionChange", val);},
2.删除
  • 删除选中的购物车数据
// *删除async deleteShoppingCart(data) {let { data: item } = await shoppingApi.deleteShoppingCart({user_id: this.$store.state.userId,product_id: data.productID,});if (item.code == "001") {//   删除购物车成功this.$notify({title: "成功",message: item.msg,type: "success",});this.getShoppingCart();}},
3.总价格和总数量
  • 计算属性
getters: {//*总价格totals(state) {let amounts = 0state.handleSelectionChange.forEach(item => {amounts += item.price * item.num})return amounts},//*总个数totalQuantity(state) {let amounts = 0state.handleSelectionChange.forEach(item => {amounts += item.num})return amounts},},
  • 在页面中调用计算属性
<span>{{this.$store.getters.totalQuantity}}</span>

我的订单
  • 渲染

我的收藏
  • 更换全局组件数据

  • 替换全局组件数据
<mymodelstyle="margin-top: 18px"@collectList="collectList":CloseHide="true":sTyle="{ width: '19%' }":categoryName="collectionData":flags="false"></mymodel>

确认订单
  • 数据渲染
  • 结算成功后跳转我的订单
async addOrder() {let { data: item } = await comfirmorderApi.addOrder({products: this.multipleSelection,user_id: this.$store.state.userId,});if (item.code == "001") {this.$notify({title: "成功",message: item.msg,type: "success",});this.$router.push({path: `/Order`,});}},

小米商城项目解析(完)相关推荐

  1. Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(完)...

    原文 http://www.cnblogs.com/mayswind/archive/2013/04/01/2991271.html [题外话] 这是这个系列的最后一篇文章了,为了不让自己觉得少点什么 ...

  2. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  3. html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...

    转载请标明出处:1片枫叶的专栏 上1个github小项目中我们介绍了避免按钮重复点击的小框架,其实现的核心逻辑是重写OnClickListener的onClick方法,添加避免重复点击的逻辑,即为第2 ...

  4. 怎么部署项目解析域名_内部解析服务器部署

    怎么部署项目解析域名 任务概述: (Task Overview :) Here I'm trying to provide an solution for on-premise application ...

  5. 解析完CAD安装包后,如何添加语言?手把手教你~

    2021年,AutoCAD新增了中文支持,这对于外语不好的小伙伴可谓是久旱逢甘霖.由于语音包需要手动安装,很多小伙伴在解析完CAD安装包后对此是束手无策.今天就教你如何下载适用自己的语言产品并管理语言 ...

  6. 视频教程-大型Java项目视频教程_王勇老师DRP项目教程完整版292集-Java

    大型Java项目视频教程_王勇老师DRP项目教程完整版292集 动力节点王勇老师,CCTV<影响力对话>栏目特约嘉宾,Java培训知名讲师,中国Java培训领军人物,北京动力节点创始人,董 ...

  7. MyBatis源码:原来 resultMap 解析完是这样

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:阿进的写字台 www.cnblogs.com/homejim ...

  8. resultmap为list_MyBatis源码:原来 resultMap 解析完是这样

    (给ImportNew加星标,提高Java技能) 作者:阿进的写字台 www.cnblogs.com/homejim/p/9853703.html 目录 1 两个基础类 1.1 列映射类ResultM ...

  9. 《R语言数据挖掘:实用项目解析》——第2章,第2.9节无参数方法

    本节书摘来自华章出版社<R语言数据挖掘:实用项目解析>一书中的第2章,第2.9节无参数方法,作者[印度]普拉迪帕塔·米什拉(Pradeepta Mishra),更多章节内容可以访问云栖社区 ...

最新文章

  1. java.lang.OutOfMemoryError: Java heap space的解决办法
  2. 我们不雇佣数理逻辑不好的学生
  3. SqlServer sa 用户登录失败的解决方法
  4. IOS添加KeyMob广告管理库中文教程
  5. python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
  6. 【PP模块】报废(损耗)类别简介(Scrap Categories and Their Effects)
  7. [原]一些KVM测试过程中的命令笔记(2)分配实例
  8. linux jdk环境变量配置
  9. Java面试题15牛客 以下关于Integer与int的区别错误的是
  10. zipkin brave mysql_zipkin mysql表结构
  11. thinkphp 模板 in
  12. python代码翻译器-利用Python制作一款简单的翻译软件
  13. LAMP架构调优(一)——隐藏Apache版本信息
  14. Javascript常用对象的属性和方法
  15. 面试分享一次失败的经历
  16. 解决 M1 MAC安装软件提示来自身份不明开发者
  17. oracle 导出 数据库
  18. 如何设计出色的网站后台原型?
  19. 弘辽科技:拼多多新店选什么推广方式?
  20. NyistOJ 2 括号匹配(栈)

热门文章

  1. 机器学习实战1--预测链家租房价格
  2. Android安装后没有完成和打开按钮
  3. 【Zookeeper学习】Apache Zookeeper项目简介
  4. Teradata 和Greenplum 的讨论
  5. LG WP7机型工程模式下越狱
  6. 详解Android源码的编译
  7. NUC1421 时间日期格式转换【日期计算】
  8. B00015 C++实现的图类
  9. 视频课程更新,机器学习、数理统计、矩阵分析、运筹视频教程
  10. Spark 调优 ——cache(persist)与 checkpoint