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 eb6ed2b..0000000 Binary files a/docs/.vuepress/public/abstract-table.png and /dev/null differ diff --git a/docs/.vuepress/public/search-form_1.png b/docs/.vuepress/public/search-form_1.png index ddf656c..ccb2059 100644 Binary files a/docs/.vuepress/public/search-form_1.png and b/docs/.vuepress/public/search-form_1.png differ diff --git a/docs/.vuepress/public/search-form_2.png b/docs/.vuepress/public/search-form_2.png index 2d198e6..af94420 100644 Binary files a/docs/.vuepress/public/search-form_2.png and b/docs/.vuepress/public/search-form_2.png differ 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`方法来重新设置高亮菜单。 :::