diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index e7eb629..f4591fb 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -24,7 +24,6 @@ module.exports = { 'start', { title: '前端', - collapsable: false, children: [ '/frontend/', '/frontend/icon', @@ -35,20 +34,18 @@ module.exports = { '/frontend/deploy', { title: '组件', - collapsable: false, children: [ - '/frontend/components/abstract-table', - '/frontend/components/region-selector', - '/frontend/components/search-form', - '/frontend/components/upload-file', - '/frontend/components/tree-select', + '/frontend/component/abstract-table', + '/frontend/component/region-selector', + '/frontend/component/search-form', + '/frontend/component/upload-file', + '/frontend/component/tree-select', ] }, '/frontend/directives', '/frontend/filters', { title: '全局方法', - collapsable: false, children: [ '/frontend/global-methods/bottom-tip', '/frontend/global-methods/guide', @@ -64,9 +61,8 @@ module.exports = { }, { title:'后端', - collapsable: false, children: [ - '/backend/', + '/backend/' ] } ] diff --git a/docs/.vuepress/public/布局-设置面板.png b/docs/.vuepress/public/布局-设置面板.png new file mode 100644 index 0000000..b4273b2 Binary files /dev/null and b/docs/.vuepress/public/布局-设置面板.png differ diff --git a/docs/.vuepress/public/布局.png b/docs/.vuepress/public/布局.png new file mode 100644 index 0000000..187c674 Binary files /dev/null and b/docs/.vuepress/public/布局.png differ diff --git a/docs/.vuepress/public/路由和菜单-首屏加载效果.png b/docs/.vuepress/public/路由和菜单-首屏加载效果.png new file mode 100644 index 0000000..3575973 Binary files /dev/null and b/docs/.vuepress/public/路由和菜单-首屏加载效果.png differ diff --git a/docs/.vuepress/public/路由和菜单-骨架屏.png b/docs/.vuepress/public/路由和菜单-骨架屏.png new file mode 100644 index 0000000..d39b434 Binary files /dev/null and b/docs/.vuepress/public/路由和菜单-骨架屏.png differ diff --git a/docs/frontend/README.md b/docs/frontend/README.md index be7f195..6c6505a 100644 --- a/docs/frontend/README.md +++ b/docs/frontend/README.md @@ -13,25 +13,16 @@ - 动态路由、动态菜单 -- 布局功能 +- 布局 - 异步路由组件loading骨架屏 - - 响应式的顶部菜单 - - 多级侧边栏 - - 面包屑 + - 多种导航模式 + - 仿ant design响应式的顶部菜单(虽然存在问题,目前推测是ele的问题) + - 无限级递归菜单 - 多页签(支持详情页缓存) - 支持移动端 - - 导航栏、侧边栏可隐藏 - - 侧边栏折叠时可显示上级 - Excel导出,支持多级表头、合并行 -- 组件 - - 用户导航 - - 行政区划选择器,支持树形和选项卡型 - - 封装的上传组件,整合七牛云,支持多种格式的文件预览 - - 封装了antd风格的dialog,可拖拽、超出可滚动 - - 手写签名 - - element-ui增强 - message支持分组、进度条功能 ``` @@ -45,24 +36,25 @@ │ ├── api # 数据请求集合 │ │ │── request.js # axios封装 │ ├── asset -│ │ │── icon # 项目所有svg icons +│ │ │── icon # 项目所有svg图标 │ │ └── style # 样式集合 │ ├── component # 公用组件 │ ├── config │ │ │── index.js # 基础配置项 │ ├── directive # 自定义指令集合 │ ├── filter # 自定义过滤器集合 -│ ├── globalMethod # 全局方法,使用this.$xx调用 +│ ├── globalMethod # 全局方法,已挂载到Vue原型上,使用this.$xx调用 │ ├── layout # 布局文件夹,包含了导航栏、侧边栏、多页签、全局页脚 │ ├── mixin # 公用混入 │ ├── plugin # 一些插件,均使用import()来动态引入 │ ├── router -│ │ │── module # 前端静态路由定义 +│ │ │── guardian # 路由守卫集合 +│ │ │── module # 前端定义的静态路由 │ │ │── define.js # 静态路由导出 │ │ │── index.js │ │ └── util.js │ ├── store # vuex配置 -│ ├── utils # 工具类 +│ ├── util # 工具类 │ ├── view # 路由页面集合 │ ├── App.vue │ └── main.js diff --git a/docs/frontend/components/abstract-table.md b/docs/frontend/components/abstract-table.md index b8dbb0f..623f50d 100644 --- a/docs/frontend/components/abstract-table.md +++ b/docs/frontend/components/abstract-table.md @@ -18,7 +18,7 @@ ### 引入: -`@/components/AbstractTable`。 +`@/component/AbstractTable`。 ### 使用: diff --git a/docs/frontend/components/region-selector.md b/docs/frontend/components/region-selector.md index 99850ec..ac2e57d 100644 --- a/docs/frontend/components/region-selector.md +++ b/docs/frontend/components/region-selector.md @@ -1,12 +1,12 @@ # 行政区划选择器 -目前分 `树型` 和 `选项卡型` 两种,由于 `树型` 不完善,所以这里只介绍 `选项卡型`,有兴趣的可以查看源码`@/components/RegionSelector/Tree`。 +目前分 `树型` 和 `选项卡型` 两种,由于 `树型` 不完善,所以这里只介绍 `选项卡型`,有兴趣的可以查看源码`@/component/RegionSelector/Tree`。 ### 引入: -`@/components/RegionSelector` +`@/component/RegionSelector` ### 使用: ```html diff --git a/docs/frontend/components/search-form.md b/docs/frontend/components/search-form.md index 42063f0..ee1e3be 100644 --- a/docs/frontend/components/search-form.md +++ b/docs/frontend/components/search-form.md @@ -7,7 +7,7 @@ ### 引入: -`@/components/SearchForm`,`@/components/SearchFormItem` +`@/component/SearchForm`,`@/component/SearchFormItem` ### 使用: ```html diff --git a/docs/frontend/components/tree-select.md b/docs/frontend/components/tree-select.md index cbe0245..ab04aa7 100644 --- a/docs/frontend/components/tree-select.md +++ b/docs/frontend/components/tree-select.md @@ -10,7 +10,7 @@ ### 引入: -`@/components/TreeSelect` +`@/component/TreeSelect` ### 使用: ```html diff --git a/docs/frontend/components/upload-file.md b/docs/frontend/components/upload-file.md index cdbc1e0..720b2c9 100644 --- a/docs/frontend/components/upload-file.md +++ b/docs/frontend/components/upload-file.md @@ -6,7 +6,7 @@ ### 引入: -`@/components/UploadFile` +`@/component/UploadFile` ### 使用: ```html diff --git a/docs/frontend/deploy.md b/docs/frontend/deploy.md index 19c1879..cba4f0a 100644 --- a/docs/frontend/deploy.md +++ b/docs/frontend/deploy.md @@ -1,6 +1,6 @@ # 构建和发布 -## 构建 +### 构建 当项目开发完毕,只需要运行一行命令就可以打包你的应用: ```shell script @@ -12,7 +12,7 @@ npm run build 如果需要指定`dist`目录等,则需要通过`vue.config.js`的`outputDir`进行配置。 -## 发布 +### 发布 如果静态文件不是部署在根目录下,比如想部署在 `/app` 下,那么需要将 `@/config/index.js` 中的 `contextPath` 改为 `/app/`。 @@ -24,7 +24,7 @@ npm run build `contextPath` 应始终以 `/` 开头,以 `/` 结束。 ::: -## 路由模式 +### 路由模式 项目提供了动态修改路由模式的功能,只需要修改 `@/config/index.js` 中的 `route.mode` 即可。 diff --git a/docs/frontend/directives.md b/docs/frontend/directives.md index a194416..baacd17 100644 --- a/docs/frontend/directives.md +++ b/docs/frontend/directives.md @@ -3,7 +3,7 @@ ## el-dialog拖拽 已全局注册,使用方式: -```js +```html ``` @@ -11,7 +11,7 @@ 从[quasar](https://quasar.dev/vue-directives/material-ripple)处搬运 已全局注册,使用方式: -```js +```html
``` 更多细节请根据quasar文档使用 diff --git a/docs/frontend/icon.md b/docs/frontend/icon.md index cf4a9cc..dc8139f 100644 --- a/docs/frontend/icon.md +++ b/docs/frontend/icon.md @@ -1,5 +1,5 @@ # 图标 -组件已全局注册,以``来使用。 +组件已全局注册,以``来使用。 当`icon`属性以`svg-`开头时,将渲染为`svg`,否则为`i`标签。 svg的引入与[vue-element-admin](https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/icon.html)相同。 diff --git a/docs/frontend/layout.md b/docs/frontend/layout.md index 87770fd..0e59691 100644 --- a/docs/frontend/layout.md +++ b/docs/frontend/layout.md @@ -1,6 +1,10 @@ # 布局 -此布局是在vue-element-admin的基础上改造而来。 + + +文件目录:`@/layout/index.vue`。 + +此布局是在vue-element-admin的基础上改造而来,并且模仿and design pro实现了三种导航模式。 实际上这个布局算是二级路由,一级路由是App.vue,这就是为什么经常会看到路由会这么写的原因: ```json @@ -17,37 +21,109 @@ ] } ``` -`Layout` 填充到 `App.vue` 里的 ``,而真正的路由页面 `@/views/index` 则填充到 `Layout` 里的 ``。 +`Layout`(指`@/layout/index.vue`) 填充到 `App.vue` 里的 ``, +而真正的路由页面 `Page` 则填充到 `Layout` 里的 ``。 +当然,如果 `Layout` 中**没有写** ``,那么只会显示布局组件。 + +项目中没有用到 `Layout` 的页面只有 `@/router/define.js` 里的 `login`、`403`、`404`、`500`。 + +此外,在写`Layout`这个重型组件时,已经尽可能地进行独立化(拥有作为独立组件的可能性)。 +目前`Layout`的数据控制基本由`Vue.observable`实现(文件都在`@/layout/store`下), +仅有*未读消息数*、*用户信息*需要使用`vuex`。 + +## 侧边栏 + +文件目录:`@/layout/component/Aside/index.vue`。 +扩展了抽屉模式、自动隐藏这两个功能。 + +侧边栏**不会**在以下情形渲染: +- PC端下选择了顶部导航模式 +- 没有需要显示的菜单(仅不渲染dom) + +### 侧边栏LOGO + +文件目录:`@/layout/component/Aside/Logo.vue`。 +想更改logo地址的请修改 `@/config/index.js` 中的 `sidebarLogoUrl`,或者自己重写(需要注意侧边栏的折叠情况) + +### 侧边栏菜单 + +侧边栏菜单借助了 `@/component/menu/NavMenu/item.vue` 来渲染菜单项,具体配置请查看[路由配置](./router/.html)。 + +侧边栏菜单扩展了以下功能: +- 点击已激活的菜单可刷新路由 +- 折叠时可显示父级菜单 +- 菜单激活时自动滚动到可视区域 + +## 头部导航栏 + +文件目录:`@/layout/component/Header/component/Navbar/index.vue`。 -项目中没有用到 `Layout` 的页面只有 `@/router/define.js` 里的 `login`、`403`、`404` 这三个。 +### 汉堡包 -## 面包屑 +文件目录:`@/layout/component/Header/component/Navbar/Hamburger.vue`。 -摆设,放在那里充充数,正在研究是不是要移到页面里去,因为感觉和顶部菜单冲突。 +PC端的行为是切换侧边栏的折叠状态,移动端是切换侧边栏在抽屉模式下的显示状态。 +当侧边栏无需渲染时,汉堡包同样不会渲染。 -## 顶部菜单 +### 导航菜单 -响应式设计,能够使菜单部分隐藏或全部隐藏,参考了ant design。 -由路由配置项数组中的根节点组成,根据路由地址自动高亮。 +文件目录:`@/layout/component/Header/component/Navbar/HeadMenu.vue`。 -## 多页签 +头部导航菜单基本可以视为垂直版的侧边栏菜单,也具有*点击已激活的菜单可刷新路由*的功能,此外还扩展了以下功能: +- 仿ant design的响应式(目前还存在组件未更新的问题,初步判断是element-ui的问题) -增加了平滑滚动功能,增加了快捷键功能:`ctrl + → 下一个页签`、`ctrl + ← 上一个页签` +头部导航菜单**不会**在以下情形渲染: +- 是移动端 +- PC端下选择了侧边栏导航模式 + +### 设置面板 + + + +文件目录:`@/layout/component/Header/component/Navbar/SettingDrawer.vue`。 + +设置面板的数据与`Layout`的数据是相互独立的,这么做是为了`Layout`的独立性。 +在设置面板中修改数据后,会将配置写入localStorage。 +在面板mounted时,会将localStorage中的配置数据同步到`Layout`的store中 + +::: tip 注意 +设置面板中的主题色修改功能默认只在dev环境下生效,为啥呢,因为还在研究原理。 +想放开限制需要: +1. 修改`@/layout/component/header/navbar/component/SettingDrawer`中的`changeThemeColor`方法 +2. 修改`vue.config.js`中的`configureWebpack.plugins`配置项 +::: + +## 头部多页签 + +文件目录:`@/layout/component/Header/component/Tagsview/index.vue`。 + +在原版的基础上扩展了以下功能: +- 平滑滚动 +- 快捷键响应:`ctrl + → 下一个页签`、`ctrl + ← 上一个页签` ::: warning 注意 多页签在 启用 / 停用 之间切换时,之前缓存的页签实例会清空,也就是说再次打开时会是新的页面 ::: -## 侧边栏 +## 路由页面 + +文件目录:`@/layout/component/Page/index.vue`。 + +### 页头 + +文件目录:`@/layout/component/Page/PageHeader.vue`。 + +将原先在头部导航栏的面包屑挪到了这里(参考[dcat-admin](https://github.com/jqhph/dcat-admin))。 +这里说明一下面包屑的实现,是直接用$route.matched做的,没有考虑其他特殊情况。 + +不想显示页头的可以将路由配置项的`meta.pageHeader`设为`false`。 -重复点击菜单可刷新路由,折叠时可以选择是否在折叠菜单上显示父级。 +### 页脚 -侧边栏的滚动分两种情况,一种是整体的滚动,这是用 `` 做的。 -另一种是弹出菜单的滚动,这是用 `css` 做的,不用 `` 是因为没办法避免bug, -具体原因可以去看element-ui的 ` #handleMouseleave`。 +文件目录:`@/layout/component/Page/component/PageFooter.vue`。 -## 全局页脚 +只是一个静态dom,想咋改就咋改。 -想改啥去 `@/layout/component/Footer.vue` 里改,妥妥的。 +目前页脚全局显示,没有提供配置来隐藏。 diff --git a/docs/frontend/new.md b/docs/frontend/new.md index d0cf087..83e09bb 100644 --- a/docs/frontend/new.md +++ b/docs/frontend/new.md @@ -1,19 +1,19 @@ # 新增页面 -1. 把数据请求api创建出来,在 `@/api`下根据模块区分。 +1. 把数据请求api创建出来,在`@/api`下根据模块区分。 -2. 在 `@/views` 下创建路由页面,根据模块区分,页面务必以`Page.vue`结尾。 +2. 在`@/view`下创建路由页面,根据模块区分,页面务必以`Page.vue`结尾。 3. 如果页面过大过复杂,建议按功能拆分,放在当前页面的文件夹里。 -4. 独有的样式同样放在当前页面的文件夹里,能公用的提取到 `@/asset/style` 里。 +4. 独有的样式同样放在当前页面的文件夹里,能公用的提取到`@/asset/style`里。 5. 路由定义 - - 5.1 如果使用静态路由,在 `@/router/modules` 下创建路由文件,这个文件夹下的js会被`@/router/define.js`自动导出。 + - 5.1 如果使用静态路由,在`@/router/module`下参考预设路由创建文件,并在`@/router/module/index.js`中导出。 - 5.2 如果使用动态路由,需要在数据库或`系统管理 -> 菜单管理`中添加路由信息。 -6. 如果需要创建vuex模块,请在 `@/store/modules` 下创建,同样的,该文件夹下的js会被自动导出。 +6. 如果需要创建vuex模块,请在`@/store/module`下创建,该文件夹下的js会被自动导出。 -7. 如果页面之间存在公共组件,建议抽取出来放到 `@/component` 中 +7. 如果页面之间存在公共组件,建议抽取出来放到`@/component`中 -8. 如果页面之间存在公共逻辑,建议抽取出来放到 `@/mixin` 中 +8. 如果页面之间存在公共逻辑,建议抽取出来放到`@/mixin`中 diff --git a/docs/frontend/permission.md b/docs/frontend/permission.md index e5adbe1..4bd41ad 100644 --- a/docs/frontend/permission.md +++ b/docs/frontend/permission.md @@ -4,13 +4,12 @@ 鉴权方法为 `@/util/auth.js #auth`。 -鉴权前的准备工作: +### 鉴权前的准备工作 登陆成功后,后台返回用户所拥有的资源,构造出用户的权限树。 -之后用户在进入系统的任意一个非白名单内的路由时,会向后台获取 -所有的资源,构造出总权限树。 +之后用户在进入系统的任意一个非白名单内的路由时,会向后台获取所有的资源,构造出总权限树。 -鉴权流程: +### 鉴权流程 1. 如果用户是`admin`身份,那么直接放行。 @@ -20,7 +19,7 @@ 4. 否则拦截,如果是在路由的拦截器中则会跳转至403页面。 -当然前端的权限控制只是过滤一小部分,对接口的过滤工作还是得由后端完成。 +此流程与后端的流程行为一致。当然前端的权限控制只是过滤一小部分,对接口的过滤工作还是得由后端完成。 ### 如何移除权限控制? @@ -31,14 +30,13 @@ 首先只有两种情况前端会用RBAC: -**1.角色固定**: +**1. 角色固定**: 比如接口管理平台YAPI,角色就是固定的那三四个,前端可以直接写死,这种是最最适合的。 -**2.角色不固定,但是后端可以返回角色-资源的映射表:** +**2. 角色不固定,但是后端可以返回角色-资源的映射表:** -映射表规定了页面上所有的资源(路由页面、数据接口、按钮等等)被哪些角色所拥有,这样 -只需要凭一个用户的角色就能控制资源的访问。但是嗦实话,所有开源的纯vue管理后台全部 -不是这样搞的。 +映射表规定了页面上所有的资源(路由页面、数据接口、按钮等等)被哪些角色所拥有。 +这样只需要凭一个用户的角色就能控制资源的访问,但是绝大部分开源的纯vue管理后台都偷懒没做这部分的工作。 所以这里偷懒,直接把用户拥有的所有资源返回给前端。不过这也导致了不好用无状态的jwt来代替session。 diff --git a/docs/frontend/plugins.md b/docs/frontend/plugins.md index 3c6947c..2b86189 100644 --- a/docs/frontend/plugins.md +++ b/docs/frontend/plugins.md @@ -9,7 +9,7 @@ ## 图片压缩 -支持 `png`、`jpg` 两种格式的图片,使用方法参考 `@/views/example/developingTest/components/ImageCompressTest.vue`。 +支持 `png`、`jpg` 两种格式的图片,使用方法参考 `@/view/example/test/develop/component/ImageCompressTest.vue`。 ::: tip 由于是以 `worker` 的形式调用,所以需要准备 `cjpeg.min.js` 和 `pngquant.min.js`,这两个文件都放在项目的 `public`下。 diff --git a/docs/frontend/router.md b/docs/frontend/router.md index f4c3f17..1e753f1 100644 --- a/docs/frontend/router.md +++ b/docs/frontend/router.md @@ -1,10 +1,10 @@ -# 路由 +# 路由和菜单 项目中默认使用了前端预设的静态路由, -要使用后端返回的动态路由的话需要打开 `@/config/index.js` 中的 `route.useBackendDataAsRoute` 选项。 +要使用后端返回的数据来生成动态路由和菜单的话需要将 `@/config/index.js` 中的 `route.useBackendDataAsRoute` 设为 `true`。 -本项目不支持二级以上的路由,虽然路由配置可以无限级,但是实际上是二级路由的效果,因为在处理路由 -数据时会将二级以上的路由缩减为其叶子节点,也就是说如果有如下路由: +本项目不支持二级以上的路由,虽然路由配置可以无限级,但是实际上是二级路由的效果。 +因为在处理路由数据时会将二级以上的路由缩减为其叶子节点,也就是说如果有如下路由: ```js const routes = [ { @@ -48,21 +48,20 @@ const routes = [ } ] ``` -这样做的目的是为了避免多级路由缓存失效的问题,而且大部分情况下,三级路由(或更高)可以借助动态组件 -来实现同样的效果, +这样做的目的是为了避免多级路由缓存失效的问题,而且大部分情况下,三级路由(或更高)可以借助动态组件来实现同样的效果。 ## 路由配置项 -路由配置项不光参与路由的生成,也参与侧边栏的生成。 +本项目的路由配置除了`component`以外,与`vue-router`没有区别,仅在`meta`中添加了一些用于生成路由和菜单的字段。 -这里约定,配置项中只有根节点(即顶部菜单)的path以'/'开头。 -并且,只有根节点和叶子节点可以自定义component。 -目前根节点的component固定为`Layout` +这里约定,配置项中只有根节点(即顶部菜单)的path以'/'开头,并且,只有根节点和叶子节点可以自定义`component`。 -此外,所有根节点(经过缩减)的redirect属性都将设为其第一个子节点的fullPath,目前不支持自定义。 +目前根节点的`component`固定为`'Layout'`。 + +此外,所有根节点(经过降级缩减)的`redirect`属性都将设为其第一个子节点的`fullPath`,目前不支持自定义。 ::: warning 注意 -项目中,路由配置项中的component是字符串,比如组件路径是`@/views/test/indexPage.vue`,那么component可以是 +路由配置项中的`component`是字符串,比如组件路径是`@/view/test/indexPage.vue`,那么component可以是 `test/`、`test/index`、`test/indexPage`、`test/indexPage.vue`,具体可以看`@/router/util.js` 中的 `generateRoutes` 方法。 ::: @@ -73,18 +72,18 @@ const routes = [ | :------------: | :--------------------------------------------------: | :--------: | :---: | | title | 路由在侧边栏、面包屑、页签 | `string` | - | | dynamicTitle | 路由在面包屑、页签中的动态名称,参数为(to,from) | `function` | - | -| hidden | 是否在侧边栏中显示 | `boolean` | - | -| alwaysShow | 是否总是把只有一个子级的菜单以嵌套模式在侧边栏中展示 | `boolean` | - | +| hidden | 是否在菜单中隐藏 | `boolean` | - | +| alwaysShow | 是否总是把只有一个子级的菜单以嵌套模式展示 | `boolean` | - | | sort | 侧边栏的排序值,值越小越靠前 | `number` | 10000 | -| icon | 图标名,的icon属性 | `string` | - | +| icon | 图标名,``的icon属性 | `string` | - | | affix | 是否在多页签中固定显示 | `boolean` | - | -| noCache | true时缓存页面 | `boolean` | - | -| activeMenu | 侧边栏当前激活菜单的index | `string` | - | +| noCache | true时不缓存页面 | `boolean` | - | +| activeMenu | 当前激活菜单的index,因为激活菜单可能并非当前路由 | `string` | - | | noAuth | true时路由不需要鉴权 | `boolean` | - | | iframe | 需要打开的iframe的地址 | `string` | - | | usePathKey | 是否使用$route.path作为组件缓存的key | `boolean` | - | | useFullPathKey | 是否使用$route.fullPath作为组件缓存的key | `boolean` | - | -| commonModule | 共用组件的唯一标识 | `any` | - | +| commonModule | 共用组件的唯一标识,用于判断路由是否复用组件 | `any` | - | ::: tip 注意 路由meta上的noAuth、noCache会被子路由继承,优先使用子路由的值 @@ -113,20 +112,37 @@ const routes = [ 所以在 `router.beforeEach` 中做了判断,如果跳转前后的路由的 `meta.commonModule` 相同的话,那么借助 `/redirect` 跳转一次,从而避免组件复用的问题 ::: warning 注意 -如果使用 `name`,需要缓存的页面的 `name` 必须和路由的 `name` 一致 +如果使用`name`作为组件缓存的标识,那么缓存的页面的`name`必须和路由的`name`一致 ::: ## 路由白名单 -在 `@/router/index.js` 中有这么一句: +在 `@/router/guardian/security.js` 中有这么一句: ```js -const whiteList = transformWhiteList(['/login', '/register', '/404', '/403']) +const whiteList = ['/login', '/register', '/403', '/404', '/500'].map(url => pathToRegexp(url)) ``` -这个 `whiteList` 就是白名单,里面的值会被转为正则表达式,详细请查看[path-to-regexp文档](https://github.com/pillarjs/path-to-regexp)。 -被`whiteList` 匹配的路由不需要验证,直接放行。 +这个`whiteList`就是白名单,里面的值会被转为正则表达式,详细请查看[path-to-regexp文档](https://github.com/pillarjs/path-to-regexp)。 +被白名单匹配的路由不需要验证,直接放行。 + +## 路由守卫 + +所有路由守卫全部位于`@/router/guardian`中。 + +预设的路由守卫如下: +- nprogress进度条守卫 +- 防止路由复用组件的守卫 +- 修改页面标题信息的守卫 +- 登陆和权限守卫 +- 控制iframe显隐的守卫 + +::: warning 注意 +路由守卫是有先后顺序的,请查看`@/router/guardian/index.js` +::: ## 首屏加载效果 + + 想体验的可以把 `network` 设为 `slow 3g` 就可以在在线实例看到效果。 原理很简单,在 `index.html` 里有这么一段: @@ -142,6 +158,8 @@ const whiteList = transformWhiteList(['/login', '/register', '/404', '/403']) ## 骨架屏 + + 通常情况下,路由组件都是以 `import(...)` 的形式异步引入, 如果想让路由在加载异步组件时显示,可以使用以下方式: ```js @@ -160,7 +178,7 @@ component: lazyLoadView(import(...)) ``` 项目中具体的使用方式可以查看 `@/router/util #generateRoutes`方法。 -关于 `AsyncHandler` 的更多选项,可以查看[官方文档](https://cn.vuejs.org/v2/guide/components-dynamic-async.html#%E5%A4%84%E7%90%86%E5%8A%A0%E8%BD%BD%E7%8A%B6%E6%80%81) +关于 `AsyncHandler` 的更多选项,可以查看[官方文档](https://cn.vuejs.org/v2/guide/component-dynamic-async.html#%E5%A4%84%E7%90%86%E5%8A%A0%E8%BD%BD%E7%8A%B6%E6%80%81) ## 过渡动画 diff --git a/docs/frontend/utils.md b/docs/frontend/utils.md index 6fce687..9181f5c 100644 --- a/docs/frontend/utils.md +++ b/docs/frontend/utils.md @@ -36,9 +36,9 @@ const tree2 = createTree(arr2, 0, 'xid', 'ypid') ## 纯前端导出excel -依赖exceljs(实际上项目中还有xlsx-style的实现版本,见 `@/utils/excel/xlsx`,不过存在问题,所以弃用了)。 +依赖exceljs,项目中使用script引入。 ```js -import {json2workbook, exportExcelByJs} from '@/utils/excel' +import {json2workbook, workbook2excel} from '@/utils/excel' const column = [ {header: ['合并表头演示', '序号'], prop: 'no', merge: true}, @@ -52,33 +52,29 @@ const arr = [ const workbook = json2workbook(arr, column) -exportExcelByJs(workbook, '测试导出.xlsx') +workbook2excel(workbook, '测试导出.xlsx') ``` ### json2workbook(data, columns, merge) : workbook - `data` : `array`,json数组。 - - `columns` : `array`,列配置项数组,列配置详细如下: -```js -{ - header : string | array,表头名称,通过使用'-'分隔符或者传入array来实现多级表头 - prop : string,表头对应的 json 字段名称,如果为空,则该字段不会写入excel表格 - merge : boolean,是否需要合并,true的话会从上至下合并值相同的相邻单元格 - width : number,单元格宽度,默认 20 -} -``` + +| 参数 | 说明 | 类型 | 默认 | +| :----: | :-----------------------------------------------------------: | :------------: | :--: | +| header | 表头名称,通过使用'-'分隔符或者传入array来实现多级表头 | `string|array` | - | +| prop | 表头对应的 json 字段名称,如果为空,则该字段不会写入excel表格 | `string` | - | +| merge | 是否需要合并,true的话会从上至下合并值相同的相邻单元格 | `boolean` | - | +| width | 单元格宽度 | `number` | 20 | - `merge` : `object`,合并配置项,详细如下: -```js -{ - primaryKey : string,每行json数据的唯一标识字段名称 - orderKey : string,每行json数据的序号字段名称 -} -``` -### exportExcelByJs(workbook, filename) +| 参数 | 说明 | 类型 | 默认 | +| :--------: | :----------------------------: | :------: | :--: | +| primaryKey | 每行json数据的唯一标识字段名称 | `string` | - | +| orderKey | 每行json数据的序号字段名称 | `string` | - | -- `workbook`,json2workbook的返回结果 +### workbook2excel(workbook, filename) +- `workbook`,exceljs的workbook对象 - `filename` : `string`,导出的文件名称,需要带上.xlsx后缀