@jikeytang
2022-02-22T08:50:33.000000Z
字数 5644
阅读 675
2020-blog
国庆期间完成了一个小项目送给大家,react-tool-admin,走过路过不要错过。react以前看的文档,这个小项目近2月前开始提交代码,就这点界面上看起来不多的东西前前后后搞了2个月,是边学习边借鉴,边开发边挖掘,一把辛酸泪,满纸荒唐言。回头来看,继承了我暂时看不懂的,修改了我能修改的。那总结一句话就是:看官方文档,然后看别人的项目源码,然后建仓库开撸,最后发布到gitee pages上,模拟上线。
先看一下我们完成的效果
目前暂时不支持移动端,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/ |
.
├── config-overrides.js
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
├── src
│ ├── App.js
│ ├── App.test.js
│ ├── assets
│ ├── components
│ ├── config
│ ├── index.js
│ ├── layouts
│ ├── lib
│ ├── logo.svg
│ ├── router
│ ├── serviceWorker.js
│ ├── setupTests.js
│ ├── store
│ ├── styles
│ ├── utils
│ └── views
需要注意的点:
@/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神,由于目前这个版本并不复杂,并没有出现这样的场景。
登
,这中间并没有动画的过渡,右下角不仔细看并不容易发现,容易引起用户思考。构想:点击关闭之后,像一般购物车处理有个抛物线到右下角的效果。