为了可以统一管理和集中控制数据模拟接口,我们对mock模块进行了封装,可以方便地定制模拟接口的统一开关和个体开关。
1.文件结构
在mock目录下新建一个index.js,创建modules目录并在里面创建子模块的*.js文件.
1.1 index.js
index.js是聚合模块,统一导入所有子模块并通过调用mock进行数据模拟。
import Mock from 'mockjs' import { baseUrl } from '@/utils/global' import * as login from './modules/login' import * as user from './modules/user' import * as role from './modules/role' import * as dept from './modules/dept' import * as menu from './modules/menu' import * as dict from './modules/dict' import * as config from './modules/config' import * as log from './modules/log' import * as loginlog from './modules/loginlog' // 1. 开启/关闭[所有模块]拦截, 通过调[openMock参数]设置. // 2. 开启/关闭[业务模块]拦截, 通过调用fnCreate方法[isOpen参数]设置. // 3. 开启/关闭[业务模块中某个请求]拦截, 通过函数返回对象中的[isOpen属性]设置. let openMock = true // let openMock = false fnCreate(login, openMock) fnCreate(user, openMock) fnCreate(role, openMock) fnCreate(dept, openMock) fnCreate(menu, openMock) fnCreate(dict, openMock) fnCreate(config, openMock) fnCreate(log, openMock) fnCreate(loginlog, openMock) /** * 创建mock模拟数据 * @param {*} mod 模块 * @param {*} isOpen 是否开启? */ function fnCreate (mod, isOpen = true) { if (isOpen) { for (var key in mod) { ((res) => { if (res.isOpen !== false) { let url = baseUrl if(!url.endsWith("/")) { url = url + "/" } url = url + res.url Mock.mock(new RegExp(url), res.type, (opts) => { opts['data'] = opts.body ? JSON.parse(opts.body) : null delete opts.body console.log(' ') console.log('%cmock拦截, 请求: ', 'color:blue', opts) console.log('%cmock拦截, 响应: ', 'color:blue', res.data) return res.data }) } })(mod[key]() || {}) } } }
1.2 user.js
子模块modules下的代码太多,这里以用户管理模块为例,格式跟后台接口保持一致。
/* * 用户管理模块 */ // 保存 export function save() { return { url: 'user/save', type: 'post', data: { "code": 200, "msg": null, "data": 1 } } } // 批量删除 export function batchDelete() { return { url: 'user/delete', type: 'post', data: { "code": 200, "msg": null, "data": 1 } } } // 分页查询 export function findPage(params) { let findPageData = { "code": 200, "msg": null, "data": {} } let pageNum = 1 let pageSize = 8 if(params !== null) { // pageNum = params.pageNum } if(params !== null) { // pageSize = params.pageSize } let content = this.getContent(pageNum, pageSize) findPageData.data.pageNum = pageNum findPageData.data.pageSize = pageSize findPageData.data.totalSize = 50 findPageData.data.content = content return { url: 'user/findPage', type: 'post', data: findPageData } } export function getContent(pageNum, pageSize) { let content = [] for(let i=0; i<pageSize; i++) { let obj = {} let index = ((pageNum - 1) * pageSize) + i + 1 obj.id = index obj.name = 'mango' + index obj.password = '9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d' obj.salt = 'YzcmCZNvbXocrsz9dm8e' obj.email = 'mango' + index +'@qq.com' obj.mobile = '18688982323' obj.status = 1 obj.deptId = 12 obj.deptName = '技术部' obj.status = 1 if(i % 2 === 0) { obj.deptId = 13 obj.deptName = '市场部' } obj.createBy= 'admin' obj.createTime= '2018-08-14 11:11:11' obj.createBy= 'admin' obj.createTime= '2018-09-14 12:12:12' content.push(obj) } return content } // 查找用户的菜单权限标识集合 export function findPermissions() { let permsData = { "code": 200, "msg": null, "data": [ null, "sys:user:view", "sys:menu:delete", "sys:dept:edit", "sys:dict:edit", "sys:dict:delete", "sys:menu:add", "sys:user:add", "sys:log:view", "sys:dept:delete", "sys:role:edit", "sys:role:view", "sys:dict:view", "sys:user:edit", "sys:user:delete", "sys:dept:view", "sys:dept:add", "sys:role:delete", "sys:menu:view", "sys:menu:edit", "sys:dict:add", "sys:role:add" ] } return { url: 'user/findPermissions', type: 'get', data: permsData } }
修改登录界面,包括导入语句和返回数据格式的获取。
<script> import mock from '@/mock/index.js' import Cookies from "js-cookie" import router from '@/router' export default { name: 'Login', methods: { login() { this.$api.login.login().then(function(res) {
//res是指response alert(res.data.token) Cookies.set('token', res.data.token) // 放置token到Cookie router.push('/') // 登录成功,跳转到主页 }).catch(function(res) { alert(res); }); } } } </script>
3.主页界面
修改主页界面,替换导入mock文件的语句
<script> import axios from 'axios' import mock from '@/mock/index.js' export default { name: 'Home', methods: { testAxios() { axios.get('http://localhost:8080').then(res => { alert(res.data) }) }, getUser() { axios.get('http://localhost:8080/user').then(res => { alert(JSON.stringify(res.data)) }) }, getMenu() { axios.get('http://localhost:8080/menu').then(res => { alert(JSON.stringify(res.data)) }) } } } </script>
在浏览器访问localhost:8080/#/login