@jikeytang
2022-02-22T00:50:33.000000Z
字数 5644
阅读 990
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神,由于目前这个版本并不复杂,并没有出现这样的场景。
登,这中间并没有动画的过渡,右下角不仔细看并不容易发现,容易引起用户思考。构想:点击关闭之后,像一般购物车处理有个抛物线到右下角的效果。