# Mall-webApp
**Repository Path**: xxljunjun/Mall-webApp
## Basic Information
- **Project Name**: Mall-webApp
- **Description**: webApp---vue2.0结合vant-UI组件库的仿京东电商类webapp
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-07-20
- **Last Updated**: 2022-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 一、环境搭建的方法
```
//创建项目
//安装node.js
node -v:检测nodejs版本
npm -v:检测npm版本
npm install -g nrm
nrm ls:查看镜像地址
nrm use taobao
npm install @vue/cli -g
vue create vue-jindong
"start":"npm run serve"
//配置路由
npm install vue-router -S
//配置状态管理
npm install vuex -S
//配置sass
npm install sass-loader -D
npm install node-sass -D
//配置UI组件库
npm install vant -S
npm i babel-plugin-import -D
// 在.babelrc 中添加配置
// 注意:webpack 1 无需设置 libraryDirectory
{
"plugins": [
["import", {
"libraryName": "vant",
"libraryDirectory": "es",
"style": true
}]
]
}
```
# 二、书写静态页面
+ 首页
+ 发现页
+ 购物车页
+ 用户页
# 三、接口粘条
```
//配置axios.js
npm install axios -S
```
```
//跨域vue脚手架cli自带的方法vue.config.js
//文件API 请求代理到 API 服务器
module.exports={
devServer:{
port:8090,
open:true,
proxy:{
'/api':{
target:'http://10.20.158.29:9000',
ws:true,
changeOrigin: true
// http://10.20.158.29:9000
// 后端提供的api接口:/api/v1/user/login
}
}
}
}
```
+ 书写请求后端接口的方法
# 四、重点小知识点总结
+ 1、按需引入vantUI组件库
```
import { Button } from 'vant';
export default{
components:{
[Button.name]:Button
}
}
```
+ 2、keep-alive需要被缓存的页面,建议使用视图命名来解决
```
```
+ 3、下拉刷新
```
下拉刷新时可以触发refresh事件(vant组件库自带)
```
+ 4、List列表的触底加载功能
```
//@load="onLoad"
//滚动条与底部距离小于 offset 时触发
onLoad(){
console.log('触底加载')
//判断数据已到底
if(this.goodArr.length{
let token =localStorage.getItem('token')
let pageArr=['/cart','/user']
if(pageArr.includes(to.path)){
if(token){
next()
}else{
next('/login')
}
}else{
next()
}
})
```
+ 8、发现页面----利用状态管理缓存数据
```
namespaced:true,
state:{
goodObj:{}
},
mutations:{
updateGoodObj(state,payload){
state.goodObj[payload.k]=payload.v
// 深复制,让Vuex知道goodObj发生了变化
state.goodObj=JSON.parse(JSON.stringify(state.goodObj))
},
//用于清楚缓存
clearGoodObj(state){
state.goodObj={}
}
},
actions:{
fetchList(store,params){
//调取接口获取当前品类下的商品列表
fetchGoodList(params).then(res=>{
console.log('当前品类下的商品列表', res)
let payload={
k:params.index,
v:res.list
}
store.commit('updateGoodObj',payload)
})
}
},
```
# 五、项目总结
路由怎么安装和使用的?
Vuex怎么安装和使用的?
怎么支持Sass的?
REM布局怎么搞的?(引入rem.js文件,在编辑器中安装 cssrem 插件,并设置转化尺寸为 75。
Vant-UI怎么安装的?(注意babel.config.js文件的配置)
#项目总结
1、技术栈(REM)vue vue-router vuex sass vant(至少10个组件)
2、团队:前端1人,后端1人
3、功能模块:商品展示模块(首页、广告页、促销页、商品详情页)、购物车模块、个人中心模块、订单模块
4、必问技术:性能优化、SEO优化、图片优化、埋点、下拉刷新、触底加载
5、项目亮点:
6、项目难点:UI还原度很高、交互体验要求高
+ 这是一个电商类Web移动app的to B产品,采用的开发框架是vue框架,UI组件库是vantUI组件库。
+ 主要运用的技术栈是vue.CLI脚手架,vuex(状态管理),vue-router,axios,sass,,(REM),
vantUI组件库:layout布局组件,Search搜索组件,loading加载组件,pullrefresh下拉刷新组件,Swiper轮播组件,TabBar组件,Toast轻提示组件,Icon图标组件,Form表单组件。业务组件:Card商品卡片组件,SubmitBar组件。
+ 该项目是由1名前端和1名后端配合完成的to B类的电商类web移动app,里面的功能模块主要有首页模块,商品展示模块,个人中心模块(登录和注册模块),订单模块和购物车模块。项目开发时间总共用了3个多月
+ 项目开发初期:配置相关环境:(1)检查电脑是否安装nodejs环境,nrm的镜像地址是否为国内地址;通过安装node-sass和sass-loader来支持sass文件的编写;(2)通过安装vuex状态管理和main.js入口文件配置vuex挂载到#app实例中;(3)通过安装vue-router和配置路由匹配规则,在main.js入口文件挂载到#app实例中;(4)通过安装axios和配置aixos.js文件(请求拦截器和响应拦截器),通过封装的api.js中的方法进行数据的接口联调;(5)通过安装babel-plugin-import和配置 babel.config.js文件来实现vantUI组件库的按需引入。
+ 项目开发中期:完成项目中的模块布局和交互,例如模块与模块之间的跳转链接。再进行数据的接口联调。例如(1)首页模块中的下拉刷新,通过vantUI组件库中的pullrefresh下拉刷新组件,调取后端接口获取后端商品数据。(2)首页模块中List列表的触底加载功能,通过组件生命周期中的mounted获取数据的数量,再判断数据是否已经全部加装完成。(3)首页模块通过动态路由的方式传递数据(id),接收数据的组件再通过this.$route.params接收数据(id),模块再通过id去获取后端数据。(4)商品展示模块中用vantUI组件库中的sidebar侧边导航组件中的,再通过相对定位进行左右布局,组件中的change 方法来监听切换导航项时的事件;在mounted中初始化页面,通过async...awiat方法先调接口获取品类列表,再调接口获取当前品类的商品详情。(5)商品展示模块通过vuex状态管理存储数据,访问品类时,先去vuex中看看是否有当前品类的数据,如果有就不需要再次调接口,直接展示渲染数据。mutations无法改变state中的数据时,要采用深复制的方法:this.list = JSON.parse(JSON.stringify(this.list))(6)购物车模块中,通过数组的方法map,foreach,filter等处理数据。(7)用户模块中的登录和注册模块,需要用到token技术,setItem,removeItem,getItem。
+ 项目开发后期:对项目进行优化:(1)图片优化,在utils中建立img.js文件,再在原型链中Vue.prototype.$img=img,这样整个项目的的图片都可以通过this.$img去访问,便于图片的统一化管理在img.js中管理路径。在工程化环境中,尽可能地避免使用 background-image 来展示图片。当图片很小、并且几乎不用考虑图片优化时,可以把图片放在assets目录,它会成为代码的一部分。当图片不是特别小、未来项目上线时有可能要进行CDN加速等优化,建议放在public目录中,当项目打包时,不会改变public的图片。代码中使用图片,建议使用模块化来管理,不要在组件中使用相对路径、绝对路径来引入图片。(2)数据接口联调的方法可以通过绑在原型链上,Vue.prototype.$api=api,通过this.$api去调取方法。(3)SEO优化:搜索引擎优化,让用户更多地找到你,SEO优化的原则:尽量减少js、css功能,尽可能多地使用静态html,EO策略:官网、移动官网;数据能用静态渲染,尽量使用渲染,h1-h6 ,尽量不要都使用div,html5语义化标签 header footer article nav aside,加上title属性,加上图片alt属性, meta 元数据、关键词,title 标签。(4)网站上线的三个条件:已备案的域名、稳定的服务器、代码。(5)打包时要考虑以下问题:api baseURL,img baseURL,publicPath。(6)通过路由命名的方式需要被缓存的页面。(7)在全局的router.js中设置路由守卫,阻止未登录用户进入需要权限的页面router.beforeEach((to,from,next)=>{}
+ 在项目的开发过程中,也遇到了许多问题,但在前端和后端的密切沟通配合下,顺利的解决了遇到的项目bug和项目难点。例如:(1)在做数据的接口联调时,后端数据接口复杂繁多,但是在与后端工程师沟通,实时跟进后端开发的进度和了解项目接口的变化之后,问题也就迎刃而解了。(2)还有后端返回的数据不是前段想要的数据类型,需要前端工程师对后端返回的数据进行处理后在渲染到页面中。(3)UI要求还原度要高,其中的交互体验也是十分的复杂,在开发过程中,需要要求前端工程师正确使用vantUI组件库,并通过sass修改其的css样式,来达到还原UI设计稿的目的。