文章目录

  • 1. 项目基础架构
    • 1.1 项目基础架构
    • 1.2 主要插件
    • 1.3 路由封装
    • 1.4 sessionstorage的封装
    • 1.5 接口错误拦截
    • 1.6 接口环境的设置
    • 1.7 MOCK设置
  • 2.首页功能开发
  • 3.登录功能开发
  • 4.产品站功能开发
  • 5.商品详情页面
  • 6.购物车页面
  • 7.ElementUI集成
  • 8.订单确认功能
  • 9.订单支付功能
  • 10.订单列表功能实现
  • 11.源码地址

1. 项目基础架构

项目使用到的技术栈:Vue全家桶,后台接口线上调联,Sass预编译,ElementUI,前端优化,微信支付宝支付…

1.1 项目基础架构

项目的基本结构:

VueProject
└─ mistore├─ babel.config.js├─ package-lock.json├─ package.json├─ public│  ├─ favicon.ico│  └─ index.html├─ README.md└─ src├─ api│  └─ index.js├─ App.vue├─ assets│  └─ logo.png├─ components│  ├─ NavFooter.vue│  └─ NavHeader.vue├─ main.js├─ pages│  ├─ alipay.vue│  ├─ cart.vue│  ├─ detail.vue│  ├─ home.vue│  ├─ index.vue│  ├─ login.vue│  ├─ order.vue│  ├─ orderConfrim.vue│  ├─ orderList.vue│  ├─ orderPay.vue│  └─ product.vue├─ router.js├─ storage│  └─ index.js├─ store└─ util└─ index.js

首先贴出我们项目的几个大体实现效果图

1.2 主要插件

“axios”: “^0.21.1”

“element-ui”: “^2.15.1”,

“node-sass”: “^5.0.0”,

“sass-loader”: “^11.0.1”,

“vue-awesome-swiper”: “^4.1.1”,

“vue-cookie”: “^1.1.4”,

“vue-lazyload”: “^1.3.3”,

1.3 路由封装

使用路由懒加载的方式进行路由的设置,根据我们的项目设计稿封装路由

伪代码如下:

import vue from 'vue';
import Router from "vue-router"
vue.use(Router);
// 使用路由懒加载的方式加载路由
var cart = () => import('./pages/cart.vue');
...
var router=new Router({routes: [// 初始默认路由(home){children: [// 商品详情(动态)// 大图展示(动态)// 首页]},// 购物车路由// order父路由children: [// 订单列表// 订单确认// 订单支付]},//登录],mode:'history'
});
export default router

1.4 sessionstorage的封装

为什么要封装storage:

  1. Storage本身虽然有Api,但是只是简单的键值对的形式
  2. Storage只能存储字符串,需要人工转换成json对象
  3. Storage只能一次性清空,不能单个清空

我们通常在Storage中存储json对象,因此我们需要自己封装Storage方法。

/*
Storage封装
*/
const STORAGE_KEY = 'mall';
export default {// 存储值setItem(key, value, modules_name) {if (modules_name) {var all = this.getItem(modules_name)all[key] = value;// 这里递归本方法将modules_name作为key(已有),再将当前添加进去的all放进此module_name中,此时的val就包含了所有值,最后直接添加即可this.setItem(modules_name, all)} else {//只传入两个参数:let val = this.getStorage();console.log(val);val[key] = value;window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify(val));}},/*获取值(可以传入一个值也可传入两个值)一个参数:没有moudle直接单对象一个参数:获得moudle下的key对应的对象*/getItem(key, modules_name) {if (modules_name) {let val = this.getItem(modules_name);if (val) return val[key]}return this.getStorage()[key];},// 获取整个数据(转为json格式):将数据转换为json格式。getStorage() {return JSON.parse(window.sessionStorage.getItem(STORAGE_KEY) || '{}')},// 删除某一个值clear(key, modules_name) {let val = this.getStorage();if (modules_name) {delete val[modules_name][key]} else {delete val[key]}window.sessionStorage.setItem(STORAGE_KEY, JSON.stringify(val));}
}

使用方法:

// console.log(storage.getStorage());
// storage.setItem('a',1);
// storage.setItem('address','北京','person');
// storage.setItem('abc',{data:88},'person');
storage.clear('a')

这样我们可以将整个项目中使用的storage全部放在一个key/value中,在value中存放所有的data,使用json的形式存储

1.5 接口错误拦截

  1. 统一报错
  2. 未登录统一拦截
  3. 请求值,返回值统一处理

我们通过使用axios的拦截来统一处理请求的情况处理以及对应的返回值。以及处理未登录时进行跳转登录界面等等。还有统一请求值以及返回值的处理(比如表单的格式等等)。

1.6 接口环境的设置

通常请开个下我们项目再不同的阶段有不同的接口

也就是说当我们使用jsonp或者cors跨域的方式来请求接口时,而且我们分环境时会有不同的请求接口,那么我们应该遵循es6模块化的思想,我们将所有的环境变量进行统一的抽取。而避免在业务代码中修改我们的代码而造成一些不可避免的错误。

  1. 开发上线的不同阶段,需要不同的配置(也就是说我们不同阶段所需要的接口也是不一样的)
  2. 不同的跨域方式,配置不同
  3. 打包的时候通过注入环境参数,统一管理环境,输出不同的版本包

当我们在代理中使用不同的环境接口怎么办呢,这时我们就可以直接进行修改vue.config.js的baseurl的可以

一般情况下我们有三套环境,分别是开发,测试,生产。当我们需要再添加环境时需要我们新建.dev.环境名文件进行设置NODE_DEV的值。然后再进行响应配置。

​ 以下是我们的一个实例:

package.json下

"scripts": {"serve": "vue-cli-service serve --mode=development","test": "vue-cli-service serve --mode=test","haha": "vue-cli-service serve --mode=haha","build": "vue-cli-service build --mode=production",},

dev.js模块(不同环境不同接口的配置):

/*
这是当我们的跨域方式为jsonp或者cors时才能使用的baseURL
不同环境下的BaseURL地址模块
process.env.NODE_ENV:获取nodejs进程的一些参数信息
*/
let baseURL;
switch (process.env.NODE_ENV) {case 'development':baseURL = 'http://dev-mall-pre.springboot.cn/api'break;case 'test':baseURL = 'http://test-mall-pre.springboot.cn/api'break;case 'haha':baseURL = 'http://haha-mall-pre.springboot.cn/api'break;case 'production':baseURL = 'http://mall-pre.springboot.cn/api'break;default:baseURL = 'http://mall-pre.springboot.cn/api'break;
}
export default { baseURL }

自定义环境配置(haha).env.haha文件:

NODE_ENV='haha'

1.7 MOCK设置

为什么要使用MOCK:

  1. 开发阶段,为了高效率,需要提前Mock
  2. 减少代码冗余,灵活插拔
  3. 减少沟通,减少接口联调时间

主流的三种MOCK设置:

  1. 本地创建json
  2. easy-mock平台(推荐本地搭建easymock平台)
  3. 继承Mock API(推荐Mock.js)

我们需要注意的是,第一种方式是最简单,不需要任何学习成本的,当时带来的弊端就是不能统一接口,也就是说我们需要改的地方比较多。第二种是发送的真实的请求,第三种是拦截请求,在本地模拟数据,后两种都有一定的学习成本,也推荐使用。

2.首页功能开发

  1. NavHeader开发

  2. HeaderFooter

  3. 首页轮播图(Swiper)

  4. 广告位

  5. 商品展示(axios请求)

  6. 工具model的封装(使用了Vue动画组件)

  7. 图片懒加载 vue-lazyload 插件的使用

3.登录功能开发

  1. 登录注册界面实现

  2. 登录逻辑(设置Cookie缓存用户登录状态)

  3. 注册逻辑(错误拦截的小坑,无法获取msg信息,已处理)

疑问

拉取用户信息和购物车数量到Vuex有什么作用,用户界面刷新Vuex的所有数据都可能清空,拉取这两条数据有什么本质上的做作用?

解答

Vuex中只传输这两条数据(因此需要再次拉去一次),自己想太多,以为Vuex中的用户的信息和后面的接口请求有关系,其实这里Vuex展示保存了这两个数据用于再主页展示而已。

和Cookie的周期搞混乱了。也就是说我们使用这个拉去的前提时我们的状态时登录的,所以才会有数据。因此这个解决的就是页面刷新可能会导致Vuex中的States数据清空。

  1. 添加Vuex进行首页用户名和购物车数量的管理

  2. 退出登录功能的实现

  3. 注册登录状态使用vuex状态托管

注意点:在index刷新时拉去Vuex中的数据,且在index的声明周期再次拉去数据,在声明周期内拉去数据的原因是因为我们使用的是spa模式,因此购物车数据改变并不会刷新,因此我们每次组件进入时再次拉去购物车数据(我认为是有必要的),username可以不采用这种做法

4.产品站功能开发

  1. 顶部吸顶插件及其功能
  2. 产品站布局(包括底部的swiper,以及视频展示)
  3. 视频的动画效果
  4. 接口的请求渲染

5.商品详情页面

  1. 完成界面
  2. 请求数据进行交互
  3. 添加购物车跳转购物车界面

注意:

加入购物车时必须要登录状态才可以完成,这里有当时封装axios时留下的一个坑。就就当状态为10时,应该返回reject状态的promise,

所以当我们未登录时,点击添加到购物车,就会执行我们then里面的代码(Promise如果没有指定返回指定状态会默认返回resolve状态)。造成一些不必要的bug

6.购物车页面

  1. Order-Nav组件的封装
  2. 购物车界面
  3. 购物车接口的请求以一些判断

总结:再实际开发中,为了预防一些安全问题,购物车的逻辑是由后端完成的,我们前端只需要属性接口文档,将各个操作对应即可

7.ElementUI集成

结合官方文档完成Message等插件的按需加载,提高了开发效率

8.订单确认功能

  1. 布局完成
  2. 初始化交互,渲染当前id的收货地址、购物车选中的商品信息等
  3. 完成收货地址的删除、改变、增加
  4. 其中使用到了v-distpicker省市级联动插件,使用方法网上有
  5. 完成订单的结算,生成了订单编号

9.订单支付功能

  1. 完成布局

  2. 实现数据交互

  3. 支付宝支付(后端传html的from表单代码)进行集成

  4. 微信支付,将后端的支付地址转为二维码显示(Native支付)

  5. 微信支付轮询,判断是否支付(若检测到用户已支付则跳转至订单列表页面,关闭则轮询停止)

微信支付:content内容是支付链接,转换为二维码即可扫码支付

支付宝支付:content是html源码,渲染到页面上后自动跳转到支付页面

将url转为二维码使用QRCode插件。

10.订单列表功能实现

  1. 界面实现
  2. 交互
  3. 按需引入elementUI分页器组件并实现分页功能
  4. 排查了一些后端接口的错误,例如,个人地址信息接口中的receiverPhone和支付的接口中的receiverPhone不同步

常见的三种分页功能:
1.分页器

2.按钮加载更多

3.滚动加载更多

11.源码地址

项目源码地址:GitHub传送门

欢迎学习,欢迎star!

开源一个Vue电商项目,欢迎交流相关推荐

  1. Vue电商项目—数据统计—数据报表模块-11

    Vue电商项目-数据统计-数据报表模块-11 1.1 数据统计概述 数据统计模块主要用于统计电商平台运营过程的中的各种统计数据, 并通过直观的可视化方式展示出来, 方便相关运营和管理人员查看. 1.2 ...

  2. Vue 电商项目学习

    Vue 电商项目学习 vue_cli脚手架[^1]初始化项目 项目文件夹 项目的其他配置 项目路由的分析 路由组件 非路由组件 使用组件的步骤(非路由组件) 路由组件的搭建 路由的跳转 组件显示与隐藏 ...

  3. Vue电商项目—订单管理—订单列表模块-10

    Vue电商项目-订单管理-订单列表模块-10 1.1 订单管理概述 订单管理模块用于维护商品的订单信息, 可以查看订单的商品信息.物流信息, 并且可以根据实际的运营情况对订单做适当的调整. 1.2 订 ...

  4. SpringBoot+SpringCloud+Mybatis+Vue 电商项目实战,附视频+源码+文档,包含所有主流技术栈。...

    大家好,我是树哥. 今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主 ...

  5. SpringBoot+SpringCloud+Mybatis+Vue电商项目实战,附视频+源码+文档,包含所有主流技术栈...

    今天给大家分享一个电商项目--- 畅购商城.项目采用前后端分离的技术架构. 采用SpringBoot+SpringCloud+Mybatis+Vue为主要技术栈,包括了大型商城的主要功能.难点功能以及 ...

  6. 《菜狗商城》Springboot+Vue电商项目

    菜狗商城 一 介绍 菜狗商城 一款Springboot+Vue前后端分离架构的网络电商平台购物系统,包括用户登录,商品推荐,商品搜索,用户评价,购物车,添加订单,收货地址及微信支付等功能. 涉及技术: ...

  7. Vue电商项目中遇到的一些问题

    1.为什么vue组件有的写成export default,有什么用? 声明一个vue,相当于 new Vue({}) 达到可复用的目的,也就是说,export default 相当于导出当前vue组件 ...

  8. vue电商项目(二)——完成Home页面

    目录 一.项目开发逻辑 二.拆分搭建Home页面组件 1.注册使用三级联动TypeNav组件(全局组件) (1)注册全局组件 (2)使用全局组件 2.完成Home其余静态组件 (1)静态组件文件夹较少 ...

  9. vue电商项目(一)——项目搭建

    目录 一.项目初始化 1.脚手架目录介绍 2.项目的其他配置 (1)项目运行的时候,让浏览器自动打开 (2)关闭语法检查工具 (3)src文件夹的简写形式,配置别名,方便以后访问. 二.项目路由搭建 ...

最新文章

  1. 完全解读ping命令应用方法
  2. Python的一些小技巧小知识
  3. android java判断字符串是否为空和是否是手机号和是否是数字,数字转中文
  4. 移动研发 DevOps 落地实践
  5. springboot项目发布JAR包
  6. 拆轮子系列--RxJava理解(三)--observeOn
  7. Web端调用Outlook 的发信窗口
  8. android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...
  9. android便签的作用,安卓手机中的便签有什么用?
  10. Git——比较版本区别【git status / git diff】
  11. JDK1.4下载 JRE1.4下载
  12. Mybatis快速入门并实现CRUD操作
  13. 机器学习算法——神经网络4(RBF神经网络)
  14. MacBook安装虚拟机Parallels Desktop
  15. Java实现简易的购物系统
  16. Eloquent: 修改器
  17. Android之提示Could not find com.android.support:appcompat-v7:25.3.1
  18. Google Map开发之实战
  19. Disruptor笔记
  20. 人间简史从动物到上帝读后感_从我的博客到上帝的耳朵...

热门文章

  1. 翻转课堂模拟舞伴配对
  2. 【干货精选】项目管理与跨部门沟通合作
  3. Latex中文模板--适用于{人文课程}
  4. X86架构CPU常识(主频,外频,FSB,cpu位和字长,倍频系数,缓存,CPU扩展指令集,CPU内核和I/O工作电压,制造工艺,指令集,超流水线与超标量)...
  5. 深入理解TCP三次握手
  6. Deepin V20 beta的MAC图标和光标美化(附壁纸)
  7. 『 Spark 』1. spark 简介
  8. 1166 Summit (25 point(s)) PAT甲级
  9. nginx转发导致400错误
  10. 18 哈希算法的应用和一致性哈希