From 7532c837a17ad4ba11ce369c032cdf5bdd20a9ff Mon Sep 17 00:00:00 2001 From: toesbieya <1647775459@126.com> Date: Thu, 15 Oct 2020 08:11:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.js | 2 +- docs/.vuepress/public/abstract-table.png | Bin 6185 -> 0 bytes docs/.vuepress/public/search-form_1.png | Bin 9937 -> 13365 bytes docs/.vuepress/public/search-form_2.png | Bin 3325 -> 4357 bytes docs/backend/README.md | 2 +- docs/frontend/components/abstract-table.md | 26 -------- docs/frontend/components/abstract.md | 63 ++++++++++++++++++ docs/frontend/components/region-selector.md | 1 + docs/frontend/components/search-form.md | 68 ++++++++------------ docs/frontend/layout.md | 15 ++--- docs/frontend/mock.md | 7 +- docs/frontend/permission.md | 16 +++-- docs/frontend/plugins.md | 6 +- docs/frontend/router.md | 52 ++++++++------- 14 files changed, 147 insertions(+), 111 deletions(-) delete mode 100644 docs/.vuepress/public/abstract-table.png delete mode 100644 docs/frontend/components/abstract-table.md create mode 100644 docs/frontend/components/abstract.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 3b02818..5f85dcd 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -35,7 +35,7 @@ module.exports = { { title: '组件', children: [ - '/frontend/components/abstract-table', + '/frontend/components/abstract', '/frontend/components/region-selector', '/frontend/components/search-form', '/frontend/components/upload-file', diff --git a/docs/.vuepress/public/abstract-table.png b/docs/.vuepress/public/abstract-table.png deleted file mode 100644 index eb6ed2b3691804688d419c9d8d69555de3d42017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6185 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 diff --git a/docs/.vuepress/public/search-form_1.png b/docs/.vuepress/public/search-form_1.png index ddf656c6f690ada54d9c15ba986aad5da3537273..ccb2059fc407e61ccf1dc4b9b8003f8fb1bacfae 100644 GIT binary patch literal 13365 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 lxl#Y&^CIQ@dPtT`m+1;zB^&LwG@4>CNusRJ-e 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 literal 9937 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 A{{R30 diff --git a/docs/.vuepress/public/search-form_2.png b/docs/.vuepress/public/search-form_2.png index 2d198e6ae4cac31cafdc5f602e6d674e40170419..af944202ce9749c33477ba0899d6857133ecdf96 100644 GIT binary patch literal 4357 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 JCso_f{{jCh`K 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 diff --git a/docs/backend/README.md b/docs/backend/README.md index a3d38e0..3b3f49e 100644 --- a/docs/backend/README.md +++ b/docs/backend/README.md @@ -10,4 +10,4 @@ cloud版基于SpringBoot、SpringCloud、SpringCloudAlibaba、SpringMVC、Mybati 目前两者在功能上的差别就是local版支持动态修改资源的限流设置,而cloud版由于还在研究sentinel中, 所以还未实现,暂时以gateway的 `default-filters` 作为替代。 -*文档完善中。。。* +具体文档不写啦,代码写得太垃圾了。。。 diff --git a/docs/frontend/components/abstract-table.md b/docs/frontend/components/abstract-table.md deleted file mode 100644 index 623f50d..0000000 --- a/docs/frontend/components/abstract-table.md +++ /dev/null @@ -1,26 +0,0 @@ -# Abstract Table - - - -给``设置了一些默认属性,设置了`empty`插槽。 -```html - - {children} - - -``` - -### 引入: - -`@/component/AbstractTable`。 - -### 使用: - -照着官方文档,当成 `` 用就行。 - diff --git a/docs/frontend/components/abstract.md b/docs/frontend/components/abstract.md new file mode 100644 index 0000000..0505bee --- /dev/null +++ b/docs/frontend/components/abstract.md @@ -0,0 +1,63 @@ +# 二次封装的element-ui组件 + +这些组件位于 `@/component/abstract` 下,均为函数式组件,无特殊声明时与原始的 `element-ui` 组件没有区别。 + +## Dialog + +位于 `@/component/abstract/Dialog/index.vue`。 + +可拖拽,超出滚动(使用 `el-scrollbar`),使用 `value`(支持 `v-model`) 代替 `visible`,新增了 `loading` 属性。 + +## Form + +位于 `@/component/abstract/Form`。 + +对 `el-form` 和 `el-form-item` 做了默认封装(`index.vue` 和 `item.vue`),使用 `el-row` 和 `el-col` 包裹。 + +用法: +```vue + + + + + +``` + +`abstract-form` 的其他用法与 `el-form` 没有区别,`abstract-form-item` 参数如下: + +| 名称 | 说明 | 类型 | 默认值 | +|:-----:|:--------------------------------------:|:-------:|:------:| +| full | 为 `true` 时,将占满一行 | Boolean | - | +| thin | 为 `true` 时,屏幕宽度>=1200px下占12列 | Boolean | - | +| label | 等同于 `el-form-item` 的 `label` | String | - | +| prop | 等同于 `el-form-item` 的 `prop` | String | - | + +::: tip 注意 +当 `abstract-form-item` 的 `full` 为 `true` 时,可以认为是 `el-form-item` 的子集 +::: + +## Pagination + +位于 `@/component/abstract/Pagination/index.vue`。 + +设置了一些默认属性,与 `el-pagination` 的区别是增加了 `model` 属性, +`model` 是一个 `{total, page, pageSize}` 对象,对应 `el-pagination` 的 `total`、`current-page`、`page-size` 属性 + +## Table + +位于 `@/component/abstract/Table/index.vue`。 + +给 `` 设置了一些默认属性,设置了 `empty` 插槽(位于 `@/component/Empty`)。 +```html + + {children} + + +``` + diff --git a/docs/frontend/components/region-selector.md b/docs/frontend/components/region-selector.md index ac2e57d..5d39bb7 100644 --- a/docs/frontend/components/region-selector.md +++ b/docs/frontend/components/region-selector.md @@ -20,6 +20,7 @@ | 参数 | 说明 | 类型 | 默认 | | :-----------------: | :-------------------------------------: | :--------------: | :-----: | | type | 选择器类型,`tab / tree` | `string` | `'tab'` | +| regionDataUrl | 行政区域json的请求地址 | `string` | `${process.env.BASE_URL}static/json/region-pca.json` | | value / v-model | 绑定值 | `string / array` | - | | readonly | 等同于`el-select`的`disabled` | `boolean` | - | | size | 等同于`el-select`的`size` | `string` | - | diff --git a/docs/frontend/components/search-form.md b/docs/frontend/components/search-form.md index ee1e3be..fa4cde9 100644 --- a/docs/frontend/components/search-form.md +++ b/docs/frontend/components/search-form.md @@ -1,59 +1,45 @@ # Search Form -一个自适应的表单容器,根据父元素的内宽来确定一行渲染多少个表单控件,同时确定是否需要折叠。 +一个自适应的搜索表单,模仿ant-design-pro,根据父元素的内宽来确定一行渲染多少个表单控件,同时确定是否需要折叠。 ### 引入: -`@/component/SearchForm`,`@/component/SearchFormItem` +`@/component/SearchForm` ### 使用: ```html - - + + - - + + - - - - - - - - - - - - - - - - + ``` ### SearchForm Attributes: -| 参数 | 说明 | 类型 | 默认 | -| :-----------------: | :----------------------------------: | :------: | :-------: | -| label-width | 等同于`el-form`的`label-width` | `string` | `'120px'` | -| xs | 父元素内宽<768px时,每行渲染多少空间 | `number` | `1` | -| sm | >=768px | `number` | `2` | -| md | >=998px | `number` | `3` | -| lg | >=1200px | `number` | `4` | - -### SearchForm Slots: - -| 名称 | 说明 | -| :------: | :---------------------------------------------------------------------: | -| collapse | 折叠按钮,参数为 `{collapse:展开为true否则false,handle:展开折叠的方法}` | - -### SearchFormItem Attributes: - -| 参数 | 说明 | 类型 | 默认 | -| :---: | :---------------------------: | :------: | :-------: | -| label | 等同于`el-form-item`的`label` | `string` | - | +| 参数 | 说明 | 类型 | 默认 | +| :---------: | :----------------------------------: | :------: | :-------: | +| model | 表单数据,支持v-model,用于重置表单 | `object` | - | +| label-width | 等同于 `el-form` 的 `label-width` | `string` | `'120px'` | +| xs | 父元素内宽<768px时,每行渲染多少空间 | `number` | `1` | +| sm | >=768px | `number` | `2` | +| md | >=998px | `number` | `3` | +| lg | >=1200px | `number` | `4` | + +### SearchForm Events: + +| 名称 | 说明 | +| :----: | :--------------------------------: | +| search | 点击查询按钮触发 | +| reset | 点击重置按钮触发,参数为表单初始值 | + +::: tip 注意 +`` 算是对 `` 的封装,其 `label-suffix` 属性为`':'`, +也就是说 `` 下的所有 `` 项的label后缀为`':'` +::: diff --git a/docs/frontend/layout.md b/docs/frontend/layout.md index 8e9ce76..81b9ec5 100644 --- a/docs/frontend/layout.md +++ b/docs/frontend/layout.md @@ -2,11 +2,11 @@ -文件目录:`@/layout/index.vue`。 +布局也是一个组件,比较重型而已,文件目录:`@/layout/index.vue`。 此布局是在vue-element-admin的基础上改造而来,并且模仿and design pro实现了三种导航模式。 -实际上这个布局算是二级路由,一级路由是App.vue,这就是为什么经常会看到路由会这么写的原因: +实际上这个布局算是二级路由,一级路由是 `App.vue`,这就是为什么经常会看到路由会这么写的原因: ```json { "path": "/", @@ -15,8 +15,7 @@ { "path": "index", "name": "index", - "component": Page, - "meta": {"title": "首页"} + "component": Page } ] } @@ -27,9 +26,9 @@ 项目中没有用到 `Layout` 的页面只有 `@/router/define.js` 里的 `login`、`403`、`404`、`500`。 -此外,在写`Layout`这个重型组件时,已经尽可能地进行独立化(拥有作为独立组件的可能性)。 -目前`Layout`的数据控制基本由`Vue.observable`实现(文件都在`@/layout/store`下), -仅有*未读消息数*、*用户信息*需要使用`vuex`。 +此外,在写 `Layout` 这个重型组件时,已经尽可能地进行独立化(拥有作为独立组件的可能性)。 +目前 `Layout` 的数据控制基本由 `Vue.observable` 实现(文件都在 `@/layout/store` 下), +仅有*未读消息数*、*用户信息*需要使用 `vuex`。 ## 侧边栏 @@ -124,6 +123,6 @@ PC端的行为是切换侧边栏的折叠状态,移动端是切换侧边栏在 只是一个静态dom,想咋改就咋改。 -目前页脚全局显示,没有提供配置来隐藏。 +目前页脚全局显示,没有提供配置来隐藏,不想显示的直接删除即可。 diff --git a/docs/frontend/mock.md b/docs/frontend/mock.md index ebea203..5166dfb 100644 --- a/docs/frontend/mock.md +++ b/docs/frontend/mock.md @@ -1,8 +1,7 @@ # mock 如果不想依赖后端的话,需要将 `@/config` 中的 `useMock` 设为true, -同时在 `@/mock/controller` 里写对应的处理路由,项目中预先写了三个 -基础的路由,可以让你进行 *登陆-登出* 的基础操作,可以照着代码自行扩展。 +同时在 `@/mock/controller` 里写对应的处理路由,项目中预先写了三个基础的路由, +可以让你进行 *登陆-登出* 的基础操作,可以照着代码自行扩展。 -目前mock和代理不能共存,如果真想要这个功能的话,需要自己在`vue.config.js` -中的 `devServer.proxy` 设置拦截路径。 +目前mock和代理不能共存,如果真想要这个功能的话,需要自己在`vue.config.js` 中的 `devServer.proxy` 设置拦截路径。 diff --git a/docs/frontend/permission.md b/docs/frontend/permission.md index 4bd41ad..dee78dc 100644 --- a/docs/frontend/permission.md +++ b/docs/frontend/permission.md @@ -1,17 +1,25 @@ # 权限 +本前端项目里需要用到权限控制的地方有两个: + + 1. 路由页面的跳转 + 源码位于 `@/router/guardian/accessControl.js`,再说明一点,不需要登录的路由也不需要进行权限控制 + + 2. 按钮 + 一般使用 `v-if` 或者 `render` 做,尽量不使用 `display: none`,如果不得已那么需要在按钮方法里控制 + 项目使用基于资源url的形式来实现权限控制,说白点就是用户的所有操作都可以用一个url来标识。 鉴权方法为 `@/util/auth.js #auth`。 ### 鉴权前的准备工作 -登陆成功后,后台返回用户所拥有的资源,构造出用户的权限树。 -之后用户在进入系统的任意一个非白名单内的路由时,会向后台获取所有的资源,构造出总权限树。 +登陆成功时,后台返回用户所拥有的资源,构造出用户的权限树。 +之后用户在进入系统的任意一个需要登录才可访问的路由时,会向后台获取所有的资源,构造出总权限树(同时渲染菜单)。 ### 鉴权流程 -1. 如果用户是`admin`身份,那么直接放行。 +1. 如果用户是 `admin` 身份,那么直接放行。 2. 如果访问的 `url` 不在总权限树内,说明该操作无需权限,放行。 @@ -23,7 +31,7 @@ ### 如何移除权限控制? -前端的权限控制的方法全在 `@/util/auth.js` 里面,哪里引入就改哪里,粗暴点直接把`# auth`方法返回true就完事了。 +前端的权限控制的方法全在 `@/util/auth.js` 里面,哪里引入就改哪里,粗暴点直接让 `# auth` 方法返回true就完事了。 后端的权限控制由拦截器实现,同样的改造原理,easy啦。 ### 为什么不是RBAC? diff --git a/docs/frontend/plugins.md b/docs/frontend/plugins.md index 2b86189..c981326 100644 --- a/docs/frontend/plugins.md +++ b/docs/frontend/plugins.md @@ -1,11 +1,11 @@ # 插件 -这里放的是即使删掉也不会影响运行的东东,基本都通过`import().then()`的方式来引用。 +`@/plugin` 中放的是即使删掉也不会影响运行的东东,都通过`import().then()`的方式来引用。 ## canvas动画 -所有动画位于 `@/plugin/canvasAnimation`下,使用 `new Animation(canvas)`的方式来创建一个动画。 -想停止的话调用 `Animation.stop()` 即可。 +所有动画位于 `@/plugin/canvasAnimation`下,每一个文件夹都会导出一个`Animation`对象, +使用 `new Animation(canvas)`的方式来创建一个动画,想停止的话调用 `Animation.stop()` 即可。 ## 图片压缩 diff --git a/docs/frontend/router.md b/docs/frontend/router.md index 1e753f1..9375ae0 100644 --- a/docs/frontend/router.md +++ b/docs/frontend/router.md @@ -54,23 +54,25 @@ const routes = [ 本项目的路由配置除了`component`以外,与`vue-router`没有区别,仅在`meta`中添加了一些用于生成路由和菜单的字段。 -这里约定,配置项中只有根节点(即顶部菜单)的path以'/'开头,并且,只有根节点和叶子节点可以自定义`component`。 +当使用前端定义路由时(`@/config`中`route.useBackendDataAsRoute`为`false`),`component`可以是字符串, +也可以是一个返回`Promise`的函数,比如`() => import('xxx')`,否则只能为字符串。 -目前根节点的`component`固定为`'Layout'`。 +当`component`为字符串时,比如组件路径是`@/view/test/indexPage.vue`, +那么值可以是`test/`、`test/index`、`test/indexPage`、`test/indexPage.vue`, +具体可以看`@/router/util.js` 中的 `generateRoutes` 方法。 -此外,所有根节点(经过降级缩减)的`redirect`属性都将设为其第一个子节点的`fullPath`,目前不支持自定义。 +这里约定,配置项中只有根节点的path以'/'开头(这也是`vue-router`所要求的),并且只有根节点和叶子节点可以自定义`component`。 -::: warning 注意 -路由配置项中的`component`是字符串,比如组件路径是`@/view/test/indexPage.vue`,那么component可以是 -`test/`、`test/index`、`test/indexPage`、`test/indexPage.vue`,具体可以看`@/router/util.js` 中的 `generateRoutes` 方法。 -::: +目前根节点的`component`固定为`Layout`。 + +此外,所有根节点(经过降级缩减)的`redirect`属性都将设为其第一个子节点的`fullPath`,`redirect`有值的不作处理。 ### Route.meta Attributes: | 参数 | 说明 | 类型 | 默认 | | :------------: | :--------------------------------------------------: | :--------: | :---: | -| title | 路由在侧边栏、面包屑、页签 | `string` | - | +| title | 路由在侧边栏、面包屑、页签的名称 | `string` | - | | dynamicTitle | 路由在面包屑、页签中的动态名称,参数为(to,from) | `function` | - | | hidden | 是否在菜单中隐藏 | `boolean` | - | | alwaysShow | 是否总是把只有一个子级的菜单以嵌套模式展示 | `boolean` | - | @@ -92,7 +94,7 @@ const routes = [ ## 页面缓存 先总结一下路由页面被缓存的条件: -- 启用了多页签 +- 启用了多页签(`@/layout/store/tagsView.js`中的`enabled`为`true`) - `(route.name || route.meta.usePathKey || route.meta.useFullPathKey) && !route.meta.noCache && !route.meta.iframe` 通常情况路由想做缓存都是通过 ``,但是如果是像 `/edit/1`、`/edit/2` 这样的共用路由页面的详情页的话, @@ -109,20 +111,22 @@ const routes = [ ] ``` 先访问 `/foo`,然后将输入框的值改为100,再访问 `/bar` ,会发现输入框的值还是100。 -所以在 `router.beforeEach` 中做了判断,如果跳转前后的路由的 `meta.commonModule` 相同的话,那么借助 `/redirect` 跳转一次,从而避免组件复用的问题 +所以在 `router.beforeEach` 中做了判断,如果跳转前后的路由的 `meta.commonModule` 相同的话, +那么借助 `/redirect` 跳转一次,从而避免组件复用的问题 ::: warning 注意 如果使用`name`作为组件缓存的标识,那么缓存的页面的`name`必须和路由的`name`一致 ::: -## 路由白名单 +## 路由免登陆 -在 `@/router/guardian/security.js` 中有这么一句: +在 `@/router/guardian/accessControl.js` 中有这么一句: ```js -const whiteList = ['/login', '/register', '/403', '/404', '/500'].map(url => pathToRegexp(url)) +const noLoginList = ['/login', '/register', '/403', '/404', '/500'] ``` -这个`whiteList`就是白名单,里面的值会被转为正则表达式,详细请查看[path-to-regexp文档](https://github.com/pillarjs/path-to-regexp)。 -被白名单匹配的路由不需要验证,直接放行。 +被`noLoginList`匹配的路由不需要登录(同样也不需要鉴权),直接放行。 + +一般来说,不需要登录即可访问的路由都不以`Layout`作为组件,并且这东东基本不需要修改。 ## 路由守卫 @@ -160,7 +164,7 @@ const whiteList = ['/login', '/register', '/403', '/404', '/500'].map(url => pat -通常情况下,路由组件都是以 `import(...)` 的形式异步引入, +通常情况下,路由组件都是以 `() => import(...)` 的形式异步引入, 如果想让路由在加载异步组件时显示,可以使用以下方式: ```js function lazyLoadView(component) { @@ -176,9 +180,9 @@ function lazyLoadView(component) { //将路由配置中的component项改为以下形式 component: lazyLoadView(import(...)) ``` -项目中具体的使用方式可以查看 `@/router/util #generateRoutes`方法。 +[这是vue-router的官方文档](https://github.com/vuejs/vue-router/pull/2140/files) ,项目中具体的使用方式可以查看 `@/router/util #generateRoutes`方法。 -关于 `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) +关于 `AsyncHandler` 的更多选项,可以查看[vue官方文档](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) ## 过渡动画 @@ -193,8 +197,8 @@ component: lazyLoadView(import(...)) 但是由于项目中使用了自定义的 ``,所以就变成这样的: ```html - - + + @@ -202,7 +206,7 @@ component: lazyLoadView(import(...)) 具体原因是 `` 中的代码硬编码了 ``,导致如果按照往常写法的话,过渡动画不会生效。 -项目中是根据页签的前后位置来决定路由动画的,比如从前面的页签跳转到后面的,那么动画是从左滑出,反之是从右滑出。 +项目中是根据页签的前后位置来决定路由动画的,比如从前面的页签跳转到后面的,那么动画是从左滑出,反之是从右滑出,源码位于`@/layout/mixin/decideRouterTransition.js`。 ::: warning 注意 只有在启用了多页签的时候才会有上面的效果,否则默认是 `@/config/index.js` 中的 `route.animate.default` 动画。 @@ -227,7 +231,9 @@ iframe页面的缓存与普通页面相同,都是使用 `meta.noCache` 控制 ## 外链 -也可以在路由中配置一个外链,只要在 path 中填写了合法的 url 路径,当你点击该路由菜单时就会新开这个页面。 +也可以在路由中配置一个外链,只要在 `path` 中填写了以 `'http'` 开头的路径,当你点击该路由菜单时就会新开这个页面。 + +外链**只**存在与菜单中,**不会**被 `vue-router` 识别。 例如: ```json @@ -241,5 +247,5 @@ iframe页面的缓存与普通页面相同,都是使用 `meta.noCache` 控制 ::: tip 注意 由于在``中,菜单(``)只要被点击就会高亮,所以如果不希望外链菜单被高亮, -那么需要在点击后通过调用``的`updateActiveIndex`方法来设置高亮菜单。 +那么需要在点击后通过调用``的`updateActiveIndex`方法来重新设置高亮菜单。 :::