前端手册
#通用方法
#$tab对象
$tab对象用于做页签操作、刷新页签、关闭页签、打开页签、修改页签等,它定义在plugins/tab.js文件中,它有如下方法
- 打开页签
| 1 | this.$tab.openPage("用户管理", "/system/user"); | 
- 修改页签
| 1 | const obj = Object.assign({}, this.$route, { title: "自定义标题" }) | 
- 关闭页签
| 1 | // 关闭当前tab页签,打开新页签 | 
- 刷新页签
| 1 | // 刷新当前页签 | 
- 关闭所有页签
| 1 | this.$tab.closeAllPage(); | 
- 关闭左侧页签
| 1 | this.$tab.closeLeftPage(); | 
- 关闭右侧页签
| 1 | this.$tab.closeRightPage(); | 
- 关闭其他tab页签
| 1 | this.$tab.closeOtherPage(); | 
#$modal对象
$modal对象用于做消息提示、通知提示、对话框提醒、二次确认、遮罩等,它定义在plugins/modal.js文件中,它有如下方法
- 提供成功、警告和错误等反馈信息
| 1 | this.$modal.msg("默认反馈"); | 
- 提供成功、警告和错误等提示信息
| 1 | this.$modal.alert("默认提示"); | 
- 提供成功、警告和错误等通知信息
| 1 | this.$modal.notify("默认通知"); | 
- 提供确认窗体信息
| 1 | this.$modal.confirm('确认信息').then(function() { | 
- 提供遮罩层信息
| 1 | // 打开遮罩层 | 
#$auth对象
$auth对象用于验证用户是否拥有某(些)权限或角色,它定义在plugins/auth.js文件中,它有如下方法
- 验证用户权限
| 1 | // 验证用户是否具备某权限 | 
- 验证用户角色
| 1 | // 验证用户是否具备某角色 | 
#$cache对象
$cache对象用于处理缓存。我们并不建议您直接使用sessionStorage或localStorage,因为项目的缓存策略可能发生变化,通过$cache对象做一层调用代理则是一个不错的选择。$cache提供session和local两种级别的缓存,如下:
| 对象名称 | 缓存类型 | 
|---|---|
| session | 会话级缓存,通过sessionStorage实现 | 
| local | 本地级缓存,通过localStorage实现 | 
示例
| 1 | // local 普通值 | 
#$download对象
$download对象用于文件下载,它定义在plugins/download.js文件中,它有如下方法
- 根据请求地址下载zip包
| 1 | const url = "/tool/gen/batchGenCode?tables=" + tableNames; | 
- 更多文件下载操作
| 1 | // 自定义文本保存 | 
#开发规范
#新增 view
在 @/views (opens new window)文件下 创建对应的文件夹,一般性一个路由对应一个文件, 该模块下的功能就建议在本文件夹下创建一个新文件夹,各个功能模块维护自己的utils或components组件。
#新增 api
在 @/api (opens new window)文件夹下创建本模块对应的 api 服务。
#新增组件
在全局的 @/components (opens new window)写一些全局的组件,如富文本,各种搜索组件,封装的分页组件等等能被公用的组件。 每个页面或者模块特定的业务组件则会写在当前 @/views (opens new window)下面。
如:@/views/system/user/components/xxx.vue。这样拆分大大减轻了维护成本。
#新增样式
页面的样式和组件是一个道理,全局的 @/style (opens new window)放置一下全局公用的样式,每一个页面的样式就写在当前 views下面,请记住加上scoped 就只会作用在当前组件内了,避免造成全局的样式污染。
| 1 | /* 编译前 */ | 
#请求流程
#交互流程
一个完整的前端 UI 交互到服务端处理流程是这样的:
- UI 组件交互操作;
- 调用统一管理的 api service 请求函数;
- 使用封装的 request.js 发送请求;
- 获取服务端返回;
- 更新 data;
为了方便管理维护,统一的请求处理都放在 @/src/api (opens new window)文件夹中,并且一般按照 model 维度进行拆分文件,如:
| 1 | api/ | 
提示
其中,@/src/utils/request.js (opens new window)是基于 axios 的封装,便于统一处理 POST,GET 等请求参数,请求头,以及错误提示信息等。 它封装了全局request拦截器、response拦截器、统一的错误处理、统一做了超时处理、baseURL设置等。
#请求示例
| 1 | // api/system/user.js | 
提示
如果有不同的baseURL,直接通过覆盖的方式,让它具有不同的baseURL。
| 1 | export function listUser(query) { | 
#引入依赖
除了 element-ui 组件以及脚手架内置的业务组件,有时我们还需要引入其他外部组件,这里以引入 vue-count-to (opens new window)为例进行介绍。
在终端输入下面的命令完成安装:
| 1 | $ npm install vue-count-to --save | 
加上
--save参数会自动添加依赖到 package.json 中去。
#路由使用
框架的核心是通过路由自动生成对应导航,所以除了路由的基本配置,还需要了解框架提供了哪些配置项。
#路由配置
| 1 | // 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 | 
普通示例
| 1 | { | 
外链示例
| 1 | { | 
#静态路由
代表那些不需要动态判断权限的路由,如登录页、404、等通用页面,在@/router/index.js (opens new window)配置对应的公共路由。
#动态路由
代表那些需要根据用户动态判断权限并通过addRoutes动态添加的页面,在@/store/modules/permission.js (opens new window)加载后端接口路由配置。
提示
- 动态路由可以在系统管理-菜单管理进行新增和修改操作,前端加载会自动请求接口获取菜单信息并转换成前端对应的路由。
- 动态路由在生产环境下会默认使用路由懒加载,实现方式参考loadView方法的判断。
#常用方法
想要跳转到不同的页面,使用router.push方法
| 1 | this.$router.push({ path: "/system/user" }); | 
跳转页面并设置请求参数,使用query属性
| 1 | this.$router.push({ path: "/system/user", query: {id: "1", name: "若依"} }); | 
更多使用可以参考vue-router (opens new window)官方文档。
#组件使用
vue 注册组件的两种方式
#局部注册
在对应页使用components注册组件。
| 1 | <template> | 
#全局注册
在 @/main.js (opens new window)文件下注册组件。
| 1 | import countTo from 'vue-count-to' | 
| 1 | <template> | 
#创建使用
可以通过创建一个后缀名为vue的文件,在通过components进行注册即可。
例如定义一个a.vue文件
| 1 | <!-- 子组件 --> | 
在其他组件中导入并注册
| 1 | <!-- 父组件 --> | 
#组件通信
通过props来接收外界传递到组件内部的值
| 1 | <!-- 父组件 --> | 
使用$emit监听子组件触发的事件
| 1 | <!-- 父组件 --> | 
#权限使用
封装了一个指令权限,能简单快速的实现按钮级别的权限判断。v-permission(opens new window)
使用权限字符串 v-hasPermi
| 1 | // 单个 | 
使用角色字符串 v-hasRole
| 1 | // 单个 | 
提示
在某些情况下,它是不适合使用v-hasPermi,如元素标签组件,只能通过手动设置v-if。 可以使用全局权限判断函数,用法和指令 v-hasPermi 类似。
| 1 | <template> | 
前端有了鉴权后端还需要鉴权吗?
前端的鉴权只是一个辅助功能,对于专业人员这些限制都是可以轻松绕过的,为保证服务器安全,无论前端是否进行了权限校验,后端接口都需要对会话请求再次进行权限校验!
#多级目录
如果你的路由是多级目录,有三级路由嵌套的情况下,还需要手动在二级目录的根文件下添加一个 <router-view>。
如:@/views/system/log/index.vue (opens new window),原则上有多少级路由嵌套就需要多少个<router-view>。

提示
最新版本多级目录已经支持自动配置组件,无需添加<router-view>。
#页签缓存
由于目前 keep-alive 和 router-view 是强耦合的,而且查看文档和源码不难发现 keep-alive 的 include (opens new window)默认是优先匹配组件的 name ,所以在编写路由 router 和路由对应的 view component 的时候一定要确保 两者的 name 是完全一致的。(切记 name 命名时候尽量保证唯一性 切记不要和某些组件的命名重复了,不然会递归引用最后内存溢出等问题)
DEMO:
| 1 | //router 路由声明 | 
| 1 | //路由对应的view system/config/index | 
一定要保证两者的名字相同,切记写重或者写错。默认如果不写 name 就不会被缓存,详情见issue (opens new window)。
提示
在系统管理-菜单管理-可以配置菜单页签是否缓存,默认为缓存
#使用图标
全局 Svg Icon 图标组件。
默认在 @/icons/index.js (opens new window)中注册到全局中,可以在项目中任意地方使用。所以图标均可在 @/icons/svg (opens new window)。可自行添加或者删除图标,所以图标都会被自动导入,无需手动操作。
#使用方式
| 1 | <!-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class--> | 
#改变颜色
| 1 | svg-icon` 默认会读取其父级的 color `fill: currentColor; | 
你可以改变父级的color或者直接改变fill的颜色即可。
提示
如果你是从 iconfont (opens new window)下载的图标,记得使用如 Sketch 等工具规范一下图标的大小问题,不然可能会造成项目中的图标大小尺寸不统一的问题。 本项目中使用的图标都是 128*128 大小规格的。
#使用字典
字典管理是用来维护数据类型的数据,如下拉框、单选按钮、复选框、树选择的数据,方便系统管理员维护。主要功能包括:字典分类管理、字典数据管理
大于3.1.0版本使用如下方法
1、main.js中引入全局变量和方法(已有)
| 1 | import DictData from '@/components/DictData' | 
2、加载数据字典,可以是多个。
| 1 | export default { | 
3、读取数据字典
| 1 | <el-option | 
4、翻译数据字典
| 1 | // 字典标签组件翻译 | 
小于3.1.0版本使用如下方法
1、main.js中引入全局变量和方法(已有)
| 1 | import { getDicts } from "@/api/system/dict/data"; | 
2、加载数据字典
| 1 | export default { | 
3、读取数据字典
| 1 | <el-option | 
4、翻译数据字典
| 1 | // 字典标签组件翻译 | 
#使用参数
参数设置是提供开发人员、实施人员的动态系统配置参数,不需要去频繁修改后台配置文件,也无需重启服务器即可生效。
1、main.js中引入全局变量和方法(已有)
| 1 | import { getConfigKey } from "@/api/system/config"; | 
2、页面使用参数
| 1 | this.getConfigKey("参数键名").then(response => { | 
#异常处理
@/utils/request.js 是基于 axios 的封装,便于统一处理 POST,GET 等请求参数,请求头,以及错误提示信息等。它封装了全局 request拦截器、response拦截器、统一的错误处理、统一做了超时处理、baseURL设置等。 如果有自定义错误码可以在errorCode.js中设置对应key value值。
| 1 | import axios from 'axios' | 
提示
如果有些不需要传递token的请求,可以设置headers中的属性isToken为false
| 1 | export function login(username, password, code, uuid) { | 
#应用路径
有些特殊情况需要部署到子路径下,例如:https://www.ruoyi.vip/admin,可以按照下面流程修改。
1、修改vue.config.js中的publicPath属性
| 1 | publicPath: process.env.NODE_ENV === "production" ? "/admin/" : "/admin/", | 
2、修改router/index.js,添加一行base属性
| 1 | export default new Router({ | 
3、/index路由添加获取子路径/admin
修改layout/components/Navbar.vue中的location.href
| 1 | location.href = '/admin/index'; | 
修改utils/request.js中的location.href
| 1 | location.href = '/admin/index'; | 
4、修改nginx配置
| 1 | location /admin { | 
打开浏览器,输入:https://www.ruoyi.vip/admin 能正常访问和刷新表示成功。
#内容复制
如果要使用复制功能可以使用指令v-clipboard,示例代码。
| 1 | <el-button | 
| 参数 | 说明 | 
|---|---|
| v-clipboard:copy | 需要复制的内容 | 
| v-clipboard:cat | 需要剪贴的内容 | 
| v-clipboard:success | 复制成功处理函数 | 
| clipboard:error | 复制失败处理函数 | 
 
        