@jikeytang
2019-06-19T15:01:22.000000Z
字数 5796
阅读 2177
2019-blog
自从上次学习了Vue-cli之后,了解了一些简单的vue基础用法,但离真正的熟练还有很大的差距,本着通过实践来有效成长加深了解学习Vue的战略小目标,经过一段时间的沉淀和项目立意的准备,这个以Element-UI
为UI组件的微信商城跃然纸上,由Vue-5群『7561206』
管理雨生
架构,其它群管理参与的名为:微燕商城
的开源项目正式拉开了序幕,因为本着学习的目的所以这次准备微信、小程序的商城分别开发,着重熟悉微信的开发模式。经过一段时间的开发,微燕商城管理系统0.1.0
版本告一段落,至此先总结记录一下。此版本开发目标为:通过mock数据提供一个基础模板,保证页面的完整性,整体功能比较简单,基于阶段性的成果,还是记录一下。
能力有限,不足之外还有很多,正在努力完善中,路过的大佬多多指点。
先看一下我们完成的效果
目前暂时不支持移动端,Login
视频耗流量,也没有适配。
参考自:
微燕商城
名字唯一为便于搜索引擎和Github搜索直达,区别于其它开源项目,同时组成整个动物系列开源项目。技术 | 说明 | 官网 |
---|---|---|
Vue-CLI-3 | Vue脚手架工具 | https://cli.vuejs.org/zh/guide/ |
Vue | 渐进式JavaScript 框架 | https://vuejs.org/ |
Vue-router | 官方的路由管理器 | https://router.vuejs.org/ |
Vuex | 全局状态管理模式 | https://vuex.vuejs.org/ |
Axios | 基于promise 的HTTP 库 | https://github.com/axios/axios |
Element-UI | 前端UI组件库 *1 | https://element.eleme.io/ |
vue-echarts | Baidu EFE 基于Echarts的图表库 *2 |
https://github.com/ecomfe/vue-echarts |
Mockjs | 生成数据 | http://mockjs.com/ |
Momentjs | JavaScript 日期处理类库 *3 | http://momentjs.cn/ |
SCSS | CSS预处理器 | https://sass-lang.com/ |
Tinymce | 可视化HTML编辑器 | https://www.tiny.cloud/ |
Fontawesome | 图标字体库 *4 | http://www.fontawesome.com.cn/ |
1. 虽然采用Element,但整体样式风格趋向于 ant-design,目的就是区别于大多数admin
2. v-charts
为ElemeFE团队基于 Vue2.0
和 ECharts
开发的图表组件
3. 备选 Day.js 轻量的时间日期处理库
4. 图标并不清晰放大之后边缘模糊,下次准备使用 IconFont
系统 | 工具 | 官网 |
---|---|---|
VScode | 主开发工具 | https://code.visualstudio.com/ |
Webstorm | 开发工具(兼Git提交) | https://www.jetbrains.com/webstorm/ |
Atom | 源码阅读工具 | https://atom.io/ |
Cmder | Cmd替代工具[windows] | https://cmder.net/ |
Notepad2 | 临时单文件编辑[windows] | http://www.flos-freeware.ch/notepad2.html |
Chrome | 调试工具 | https://www.google.com/intl/zh-CN/chrome/ |
├─dist // 上线发布目录
├─public // 公共资源目录
└─/
├─api // 所有请求方法
├─assets // 资源目录
├─components // 全局组件
├─config // 全局配置
├─layout // 布局文件
├─mock // mock数据
├─plugins // 插件目录
├─router // 路由
├─store // Vuex
├─styles // CSS
├─utils // 公共方法目录
└─views // 页面
├─common // 常用操作
├─dashboard // 首页
├─login // 登录
├─order // 订单管理
├─other // 其它
├─product // 商品管理
├─system // 系统设置
└─user // 用户设置
需要注意的点:
@/components
其中使用了webpack require.context - [En-api],[Zh-api],该方法支持三个参数,require.context(要搜索的目录,是否继续搜索其子目录,匹配文件的正则表达式)。
requireComponents导出的方法有 3 个属性: resolve, keys, id:
require.context('./', true, /\.vue/) // 搜索当前目录下所有子文件夹.vue结尾文件
但得到的并不是我们期望的数组对象,需要转换之后forEach,
requireComponents.keys().forEach(fileName => {
// 组件实例
const reqCom = requireComponents(fileName)
// 截取路径作为组件名
const reqComName = reqCom.default.name || fileName.split('/')[1]
// 组件挂载
Vue.component(reqComName, reqCom.default || reqCom)
})
因为需要处理 @/components/AppFilter/index.vue
这个一个文件下的单组件,也需要处理@/components/Upload/MultiUpload.vue, @/components/Upload/SingleUpload.vue
,一个文件夹下多组件,所以组件名称为.vue文件内的name,比如AppFilter的name为AppFilter:
export default {
name: 'AppFilter'
}
如果缺少name则取文件名为组件名,此项目全部采用default.name为组件名。
最后在总结一下,如果不用此方法,那注入全局组件就需要这样写:
import Vue from 'vue'
import Copyright from './Copyright/'
import ToBack from './ToBack/'
……
Vue.component('copyright', Copyright)
Vue.component('to-back', SendSms)
……
最主要的增加一个组件,需要手动修改这个文件,而上面的处理是避免过多手动操作的解决办法。
此方法还在store中也有用到@/store/index.js
,读出所有modules下的文件,然后绑定modules对象最后通过store入口注入。
const files = require.context('./modules', false, /\.js$/)
const modules = {}
files.keys().forEach(key => {
modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})
@/config/app.js
:所有后期不会变化的数据@/layout
登录之后整个页面的组件放置处,比如头部导航@/layout/pages/Navbar.vue
,左侧菜单@/layout/pages/Sidebar.vue
,中间主区域的
@/layout/pages/AppMain.vue
router-view
占位,@/layout/pages/AppSettings.vue
等等。@/main.js 中 render
函数已经渲染一个视图提供给el挂载,对应的路由就是根级路由,对应的视图就是@/App.vue
当中router-view
,而AppMain.vue
中对应的路由应该是children
,视图就是component: () => import('@/views/dashboard/index')
:
const pre = '/index/'
export default [
{
path: '/',
component: Layout,
redirect: { name: 'dashboard' },
children: [
{
path: `/dashboard`,
name: 'dashboard',
title: '公告板',
component: () => import('@/views/dashboard/index'),
meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
}
]
}
]
router
export default [
{
path: '/404',
component: () => import('@/views/other/404'),
hidden: true
},
{
path: '*',
redirect: '/404',
hidden: true
}
]
store
不建议把所有的数据都放到store中来管理,无跨组件单路由数据就在当前路由处理。plugins
为vue-cli3 vue-cli-plugin-element 插件 vue add element
之后自动添加目录。styles
为了方便全局引入相关的scss变量,vuecli3也提供了相应的方法addStyleResource(),此项目中引入了:_variables.scss, mixins.scss
方便全局内直接引用文件中的变量。utils
是所有公共方法集合,基本为业务无关方法。views
所有routes对应页面集合env
官方的规定:名字development, production
不可更改,且其中变量名以VUE_APP_
起始。除了eslint之外的约定(若第三方参数违反约定,可以单行关闭/*eslint-disable */
):
@/components
中按驼峰式命名填加,其它的文件不用修改。pages
文件中单词用驼峰式,且首字母大写,文件名小写字母为路由映射文件,大写字母为组件引用文件。<app-view />
就单一组件名称,<div class="app-login"/>
为login容器,备选名称为:vyan
。此页面大体结构参考:vue-element-admin
admin
其实从逻辑及视图结构上可以分为前后两部分,前部分为Login
登录页面,所有用户登录前的信息获取都在这块处理,后部分为通过Login
登录之后的内页面,所有业务方面的操作需要经过Login过滤才能看到,为了防止内页面数据读取错误及一般安全浏览问题,所以通过url访问内页面登录地址需要进行统一拦截处理,这个在router/index.js
的beforeEach
里边处理。
而Login相关的处理在:@/views/login/index.vue
中,其中@/views
与@/components
中的.vue文件
区别在于:views为路由文件(@/router/index.js
)对应的视图页面,components
全局共用组件,可多次复用。
@/components/AppView/index.vue
,app-filter: @/components/AppFilter/index.vue
,当中也使用的 具名插槽的缩写。@/views/other/test.vue
满足路由测试时的占位页面文件夹名字采用中划线 (kebab-case)命名连接,参考pan神,由于目前这个版本并不复杂,并没有出现这样的场景。
登
,这中间并没有动画的过渡,右下角不仔细看并不容易发现,容易引起用户思考。构想:点击关闭之后,像一般购物车处理有个抛物线到右下角的效果。