From 25bb330afeb694083fe1f54f867de49c8271a605 Mon Sep 17 00:00:00 2001 From: Aaron <427787340@qq.com> Date: Thu, 29 Aug 2019 16:49:52 +0800 Subject: [PATCH] 增加mockjs,更新Scheme文档,优化Scheme静态数据处理逻辑 --- examples/api-mock/index.js | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ examples/api-mock/module/index.js | 25 +++++++++++++++++++++++++ examples/api-mock/util.js | 32 ++++++++++++++++++++++++++++++++ examples/main.js | 18 +++++++----------- examples/views/docs/component/scheme.md | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 + packages/scheme/index.vue | 22 ++++++++++++---------- yarn.lock | 12 ++++++++++++ 8 files changed, 274 insertions(+), 23 deletions(-) create mode 100644 examples/api-mock/index.js create mode 100644 examples/api-mock/module/index.js create mode 100644 examples/api-mock/util.js diff --git a/examples/api-mock/index.js b/examples/api-mock/index.js new file mode 100644 index 0000000..ae031fa --- /dev/null +++ b/examples/api-mock/index.js @@ -0,0 +1,102 @@ +import Mock from 'mockjs'; +import { parse } from './util'; +import moduleAPI from '@/api-mock/module'; + +let MockCache = {}; + +const MockBot = { + // 通用模板API + fastAPI: { + // 获取数据列表 + page: (base) => config => { + const list = MockCache[base] || []; + const param = parse(config.url) || {}; + const { page = 1, size = 10, ...query } = param; + // 计算有几个搜索条件 + let queryCount = false; + for (let key in query) { + if (query[key]) { + queryCount += 1; + break; + } + } + // 根据搜索条件过滤结果 + const filteredList = queryCount > 0 ? list.filter(data => { + let result = false; + for (let key in query) { + if (data[key] === query[key]) { + result = true; + break; + } + } + return result; + }) : list; + // 根据结果处理分页数据 + const _page = Number(page); + const _limit = Number(size); + const pageList = filteredList.filter((item, index) => index < _limit * _page && index >= _limit * (_page - 1)); + const response = { + page: _page, + size: _limit, + result: { + list: pageList, + total: filteredList.length, + }, + code: 0, + }; + return response; + }, + // 查询数据详情 + get: (base) => config => { + const list = MockCache[base] || []; + const arr = config.url.split('/'); + const id = arr[arr.length - 1]; + const result = list.find((item) => item.id == id); + return { + result: result, + code: 0, + }; + }, + // 新增数据 + add: (base) => config => { + const param = JSON.parse(config.body); + MockCache[base].unshift(param); + return { + code: 0, + }; + }, + // 编辑数据 + update: (base) => config => { + const param = JSON.parse(config.body); + const index = MockCache[base].findIndex(item => item.id === param.id); + MockCache[base][index] = param; + return { + code: 0, + }; + }, + // 删除数据 + delete: (base) => config => { + const ids = JSON.parse(config.body); + ids.forEach(id => { + MockCache[base] = MockCache[base].filter(item => item.id !== id); + }); + return { + code: 0, + }; + } + }, + // 根据通用模板API快速创建模拟接口 + fastMock: (url, list) => { + MockCache[url] = list; + Mock.mock(new RegExp(`\/${url}\/page`), 'get', MockBot.fastAPI.page(url)); + Mock.mock(new RegExp(`\/${url}\/get`), 'get', MockBot.fastAPI.get(url)); + Mock.mock(new RegExp(`\/${url}\/get/id`), 'get', MockBot.fastAPI.get(url)); + Mock.mock(new RegExp(`\/${url}\/info/id`), 'get', MockBot.fastAPI.get(url)); + Mock.mock(new RegExp(`\/${url}\/add`), 'post', MockBot.fastAPI.add(url)); + Mock.mock(new RegExp(`\/${url}\/update`), 'post', MockBot.fastAPI.update(url)); + Mock.mock(new RegExp(`\/${url}\/delete`), 'post', MockBot.fastAPI.delete(url)); + }, +} + +// 产品管理 +MockBot.fastMock('product', moduleAPI.product); \ No newline at end of file diff --git a/examples/api-mock/module/index.js b/examples/api-mock/module/index.js new file mode 100644 index 0000000..01675cb --- /dev/null +++ b/examples/api-mock/module/index.js @@ -0,0 +1,25 @@ +import Mock from 'mockjs'; +import MockUtil from '@/api-mock/util'; + +export default { + // 产品管理 + product: MockUtil.fastList({ + id: '@guid()', + code: '@string(16)', + name: '@cword(3, 12)', + 'type|1': ['TYPE_A', 'TYPE_B', 'TYPE_C', 'TYPE_D'], + "status|0-1": 1, + remark: '@csentence(0, 30)', + cities: '@zip()', + // cities: ['110000', '310000'], + picUrl: Mock.Random.image('1080x720'), + thumbnalUrl: Mock.Random.image('120x80'), + serviceDescription: '
这里是标题
这是内容第一段。
这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段,这是内容第二段。
', + // "isActive|0-1": 1, + isActive: '@boolean()', + createTime: '@datetime()', + createUser: '@cname()', + modifyTime: '@datetime()', + modifyUser: '@cname()' + }, 43), +} \ No newline at end of file diff --git a/examples/api-mock/util.js b/examples/api-mock/util.js new file mode 100644 index 0000000..f41c451 --- /dev/null +++ b/examples/api-mock/util.js @@ -0,0 +1,32 @@ +import Mock from 'mockjs'; + +export const parse = (url) => { + let obj = {};// 创建一个Object + let reg = /[?&][^?&]+=[^?&]+/g;// 正则匹配 ?&开始 =拼接 非?&结束 的参数 + let arr = url.match(reg);// match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。 + // arr数组形式 ['?id=12345','&a=b'] + if (arr) { + arr.forEach((item) => { + /** + * tempArr数组 ['id','12345']和['a','b'] + * 第一个是key,第二个是value + * */ + let tempArr = item.substring(1).split('='); + let key = decodeURIComponent(tempArr[0]); + let val = decodeURIComponent(tempArr[1]); + obj[key] = val; + }); + } + return obj; +} + +export default { + // 根据配置文件和数量快速生成数据列表 + fastList: (config, count) => { + const list = [] + for (let i = 0; i < count; i++) { + list.push(Mock.mock(config)); + } + return list; + }, +} \ No newline at end of file diff --git a/examples/main.js b/examples/main.js index 82b4b8c..cf7701f 100644 --- a/examples/main.js +++ b/examples/main.js @@ -3,6 +3,7 @@ import App from '@/App.vue'; import router from '@/router'; import store from '@/store'; import axios from 'axios'; +import '@/api-mock'; import ElementUI from 'element-ui'; import EagleWebToolkit from '../packages'; @@ -14,33 +15,28 @@ import '@/styles/index.scss'; import "highlight.js/styles/github.css"; const request = axios.create({ - baseURL: 'http://47.110.137.80:7104/cbin/', + baseURL: 'http://localhost', timeout: 1000 * 60, withCredentials: true, - headers: { - token: 'ca2bd2fbc89ee1fdf26c975255905f8b', - 'Accept-Language': 'zh-CN' - } }); // respone 拦截器 request.interceptors.response.use( response => { const { data = {}, config } = response; - const { code } = data; + const { code = 0 } = data; if (config && config.interceptors === false) { // 请求配置不做返回拦截的情况 return response; } else { - if (`${code}` === '0') { + if (`${code}` === '0' || `${code}` === '200') { // 请求成功 return data; - } else { - return false; + } else { // 其它错误,开发环境提示 + return { code }; } } }, error => { - console.error(error); - return { success: false }; + return { code: 404 }; }); Vue.prototype.$axios = request; diff --git a/examples/views/docs/component/scheme.md b/examples/views/docs/component/scheme.md index 744091b..0a79699 100644 --- a/examples/views/docs/component/scheme.md +++ b/examples/views/docs/component/scheme.md @@ -10,7 +10,7 @@ Scheme是一个数据驱动的解决方案,通过既定的业务配置参数 ```html -