[关闭]
@jikeytang 2022-02-22T08:50:33.000000Z 字数 5644 阅读 637

react-tool-admin

2020-blog


国庆期间完成了一个小项目送给大家,react-tool-admin,走过路过不要错过。react以前看的文档,这个小项目近2月前开始提交代码,就这点界面上看起来不多的东西前前后后搞了2个月,是边学习边借鉴,边开发边挖掘,一把辛酸泪,满纸荒唐言。回头来看,继承了我暂时看不懂的,修改了我能修改的。那总结一句话就是:看官方文档,然后看别人的项目源码,然后建仓库开撸,最后发布到gitee pages上,模拟上线。

先看一下我们完成的效果

目前暂时不支持移动端,Login视频耗流量,也没有适配。

参考自:

1. 相关介绍

1.1 基本介绍

1.2 技术栈

技术 说明 官网
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.0ECharts 开发的图表组件
3. 备选 Day.js 轻量的时间日期处理库
4. 图标并不清晰放大之后边缘模糊,下次准备使用 IconFont

1.3 开发工具

系统 工具 官网
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/

1.4 文件结构

  1. .
  2. ├── config-overrides.js
  3. ├── package.json
  4. ├── public
  5.    ├── favicon.ico
  6.    ├── index.html
  7. ├── src
  8.    ├── App.js
  9.    ├── App.test.js
  10.    ├── assets
  11.    ├── components
  12.    ├── config
  13.    ├── index.js
  14.    ├── layouts
  15.    ├── lib
  16.    ├── logo.svg
  17.    ├── router
  18.    ├── serviceWorker.js
  19.    ├── setupTests.js
  20.    ├── store
  21.    ├── styles
  22.    ├── utils
  23.    └── views

需要注意的点:

  1. require.context('./', true, /\.vue/) // 搜索当前目录下所有子文件夹.vue结尾文件

但得到的并不是我们期望的数组对象,需要转换之后forEach,

  1. requireComponents.keys().forEach(fileName => {
  2. // 组件实例
  3. const reqCom = requireComponents(fileName)
  4. // 截取路径作为组件名
  5. const reqComName = reqCom.default.name || fileName.split('/')[1]
  6. // 组件挂载
  7. Vue.component(reqComName, reqCom.default || reqCom)
  8. })

因为需要处理 @/components/AppFilter/index.vue这个一个文件下的单组件,也需要处理@/components/Upload/MultiUpload.vue, @/components/Upload/SingleUpload.vue,一个文件夹下多组件,所以组件名称为.vue文件内的name,比如AppFilter的name为AppFilter:

  1. export default {
  2. name: 'AppFilter'
  3. }

如果缺少name则取文件名为组件名,此项目全部采用default.name为组件名。
最后在总结一下,如果不用此方法,那注入全局组件就需要这样写:

  1. import Vue from 'vue'
  2. import Copyright from './Copyright/'
  3. import ToBack from './ToBack/'
  4. ……
  5. Vue.component('copyright', Copyright)
  6. Vue.component('to-back', SendSms)
  7. ……

最主要的增加一个组件,需要手动修改这个文件,而上面的处理是避免过多手动操作的解决办法。

此方法还在store中也有用到@/store/index.js,读出所有modules下的文件,然后绑定modules对象最后通过store入口注入。

  1. const files = require.context('./modules', false, /\.js$/)
  2. const modules = {}
  3. files.keys().forEach(key => {
  4. modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
  5. })

@/main.js 中 render函数已经渲染一个视图提供给el挂载,对应的路由就是根级路由,对应的视图就是@/App.vue 当中router-view,而AppMain.vue中对应的路由应该是children,视图就是component: () => import('@/views/dashboard/index')

  1. const pre = '/index/'
  2. export default [
  3. {
  4. path: '/',
  5. component: Layout,
  6. redirect: { name: 'dashboard' },
  7. children: [
  8. {
  9. path: `/dashboard`,
  10. name: 'dashboard',
  11. title: '公告板',
  12. component: () => import('@/views/dashboard/index'),
  13. meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
  14. }
  15. ]
  16. }
  17. ]
  1. export default [
  2. {
  3. path: '/404',
  4. component: () => import('@/views/other/404'),
  5. hidden: true
  6. },
  7. {
  8. path: '*',
  9. redirect: '/404',
  10. hidden: true
  11. }
  12. ]

2. 开发约定

除了eslint之外的约定(若第三方参数违反约定,可以单行关闭/*eslint-disable */):

3. Login页面

此页面大体结构参考:vue-element-admin

admin其实从逻辑及视图结构上可以分为前后两部分,前部分为Login登录页面,所有用户登录前的信息获取都在这块处理,后部分为通过Login登录之后的内页面,所有业务方面的操作需要经过Login过滤才能看到,为了防止内页面数据读取错误及一般安全浏览问题,所以通过url访问内页面登录地址需要进行统一拦截处理,这个在router/index.jsbeforeEach里边处理。

而Login相关的处理在:@/views/login/index.vue中,其中@/views@/components中的.vue文件区别在于:views为路由文件(@/router/index.js)对应的视图页面,components全局共用组件,可多次复用。

4. Views

5. 待开发的

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注