From 6043d892cb21076defad75d86d968c36285874be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=9F=E8=B4=A4?= Date: Wed, 29 May 2019 14:18:08 +0800 Subject: [PATCH] use defult mock --- .gitignore | 1 - lambda/mock/index.js | 4130 +++++++++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/generateMock.js | 3 - 4 files changed, 4131 insertions(+), 5 deletions(-) create mode 100644 lambda/mock/index.js delete mode 100644 scripts/generateMock.js diff --git a/.gitignore b/.gitignore index 253591b5..67e95cb3 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,6 @@ package-lock.json .history *.log functions/* -lambda/mock/index.js .temp/** # umi diff --git a/lambda/mock/index.js b/lambda/mock/index.js new file mode 100644 index 00000000..719a566d --- /dev/null +++ b/lambda/mock/index.js @@ -0,0 +1,4130 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('mockjs'), require('moment')) : + typeof define === 'function' && define.amd ? define(['mockjs', 'moment'], factory) : + (global = global || self, global.mock = factory(global.mockjs, global.moment)); +}(this, function (mockjs, moment) { 'use strict'; + + mockjs = mockjs && mockjs.hasOwnProperty('default') ? mockjs['default'] : mockjs; + moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment; + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + const titles = ['Alipay', 'Angular', 'Ant Design', 'Ant Design Pro', 'Bootstrap', 'React', 'Vue', 'Webpack']; + const avatars = ['https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay + 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular + 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design + 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro + 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap + 'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React + 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue + 'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png']; + const avatars2 = ['https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', 'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png', 'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png', 'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png', 'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png', 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png', 'https://gw.alipayobjects.com/zos/rmsportal/psOgztMplJMGpVEqfcgF.png', 'https://gw.alipayobjects.com/zos/rmsportal/ZpBqSxLxVEXfcUNoPKrz.png', 'https://gw.alipayobjects.com/zos/rmsportal/laiEnJdGHVOhJrUShBaJ.png', 'https://gw.alipayobjects.com/zos/rmsportal/UrQsqscbKEpNuJcvBZBu.png']; + const covers = ['https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png', 'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png', 'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png', 'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png']; + const desc = ['那是一种内在的东西, 他们到达不了,也无法触及的', '希望是一个好东西,也许是最好的,好东西是不会消亡的', '生命就像一盒巧克力,结果往往出人意料', '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', '那时候我只会想自己想要什么,从不想自己拥有什么']; + const user = ['付小小', '曲丽丽', '林东东', '周星星', '吴加好', '朱偏右', '鱼酱', '乐哥', '谭小仪', '仲尼']; + + function fakeList(count) { + const list = []; + + for (let i = 0; i < count; i += 1) { + list.push({ + id: `fake-list-${i}`, + owner: user[i % 10], + title: titles[i % 8], + avatar: avatars[i % 8], + cover: parseInt(i / 4, 10) % 2 === 0 ? covers[i % 4] : covers[3 - i % 4], + status: ['active', 'exception', 'normal'][i % 3], + percent: Math.ceil(Math.random() * 50) + 50, + logo: avatars[i % 8], + href: 'https://ant.design', + updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i), + createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i), + subDescription: desc[i % 5], + description: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。', + activeUser: Math.ceil(Math.random() * 100000) + 100000, + newUser: Math.ceil(Math.random() * 1000) + 1000, + star: Math.ceil(Math.random() * 100) + 100, + like: Math.ceil(Math.random() * 100) + 100, + message: Math.ceil(Math.random() * 10) + 10, + content: '段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。', + members: [{ + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', + name: '曲丽丽', + id: 'member1' + }, { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', + name: '王昭君', + id: 'member2' + }, { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', + name: '董娜娜', + id: 'member3' + }] + }); + } + + return list; + } + + let sourceData; + + function getFakeList(req, res) { + const params = req.query; + const count = params.count * 1 || 20; + const result = fakeList(count); + sourceData = result; + return res.json(result); + } + + function postFakeList(req, res) { + const { + /* url = '', */ + body + } = req; // const params = getUrlParams(url); + + const { + method, + id + } = body; // const count = (params.count * 1) || 20; + + let result = sourceData; + + switch (method) { + case 'delete': + result = result.filter(item => item.id !== id); + break; + + case 'update': + result.forEach((item, i) => { + if (item.id === id) { + result[i] = Object.assign(item, body); + } + }); + break; + + case 'post': + result.unshift({ + body, + id: `fake-list-${result.length}`, + createdAt: new Date().getTime() + }); + break; + + default: + break; + } + + return res.json(result); + } + + const getNotice = [{ + id: 'xxx1', + title: titles[0], + logo: avatars[0], + description: '那是一种内在的东西,他们到达不了,也无法触及的', + updatedAt: new Date(), + member: '科学搬砖组', + href: '', + memberLink: '' + }, { + id: 'xxx2', + title: titles[1], + logo: avatars[1], + description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', + updatedAt: new Date('2017-07-24'), + member: '全组都是吴彦祖', + href: '', + memberLink: '' + }, { + id: 'xxx3', + title: titles[2], + logo: avatars[2], + description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', + updatedAt: new Date(), + member: '中二少女团', + href: '', + memberLink: '' + }, { + id: 'xxx4', + title: titles[3], + logo: avatars[3], + description: '那时候我只会想自己想要什么,从不想自己拥有什么', + updatedAt: new Date('2017-07-23'), + member: '程序员日常', + href: '', + memberLink: '' + }, { + id: 'xxx5', + title: titles[4], + logo: avatars[4], + description: '凛冬将至', + updatedAt: new Date('2017-07-23'), + member: '高逼格设计天团', + href: '', + memberLink: '' + }, { + id: 'xxx6', + title: titles[5], + logo: avatars[5], + description: '生命就像一盒巧克力,结果往往出人意料', + updatedAt: new Date('2017-07-23'), + member: '骗你来学计算机', + href: '', + memberLink: '' + }]; + const getActivities = [{ + id: 'trend-1', + updatedAt: new Date(), + user: { + name: '曲丽丽', + avatar: avatars2[0] + }, + group: { + name: '高逼格设计天团', + link: 'http://github.com/' + }, + project: { + name: '六月迭代', + link: 'http://github.com/' + }, + template: '在 @{group} 新建项目 @{project}' + }, { + id: 'trend-2', + updatedAt: new Date(), + user: { + name: '付小小', + avatar: avatars2[1] + }, + group: { + name: '高逼格设计天团', + link: 'http://github.com/' + }, + project: { + name: '六月迭代', + link: 'http://github.com/' + }, + template: '在 @{group} 新建项目 @{project}' + }, { + id: 'trend-3', + updatedAt: new Date(), + user: { + name: '林东东', + avatar: avatars2[2] + }, + group: { + name: '中二少女团', + link: 'http://github.com/' + }, + project: { + name: '六月迭代', + link: 'http://github.com/' + }, + template: '在 @{group} 新建项目 @{project}' + }, { + id: 'trend-4', + updatedAt: new Date(), + user: { + name: '周星星', + avatar: avatars2[4] + }, + project: { + name: '5 月日常迭代', + link: 'http://github.com/' + }, + template: '将 @{project} 更新至已发布状态' + }, { + id: 'trend-5', + updatedAt: new Date(), + user: { + name: '朱偏右', + avatar: avatars2[3] + }, + project: { + name: '工程效能', + link: 'http://github.com/' + }, + comment: { + name: '留言', + link: 'http://github.com/' + }, + template: '在 @{project} 发布了 @{comment}' + }, { + id: 'trend-6', + updatedAt: new Date(), + user: { + name: '乐哥', + avatar: avatars2[5] + }, + group: { + name: '程序员日常', + link: 'http://github.com/' + }, + project: { + name: '品牌迭代', + link: 'http://github.com/' + }, + template: '在 @{group} 新建项目 @{project}' + }]; + + function getFakeCaptcha(req, res) { + return res.json('captcha-xxx'); + } + + var api = { + 'GET /api/project/notice': getNotice, + 'GET /api/activities': getActivities, + 'POST /api/forms': (req, res) => { + res.send({ + message: 'Ok' + }); + }, + 'GET /api/tags': mockjs.mock({ + 'list|100': [{ + name: '@city', + 'value|1-100': 150, + 'type|0-2': 1 + }] + }), + 'GET /api/fake_list': getFakeList, + 'POST /api/fake_list': postFakeList, + 'GET /api/captcha': getFakeCaptcha + }; + + const visitData = []; + const beginDay = new Date().getTime(); + const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5]; + + for (let i = 0; i < fakeY.length; i += 1) { + visitData.push({ + x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'), + y: fakeY[i] + }); + } + + const visitData2 = []; + const fakeY2 = [1, 6, 4, 8, 3, 7, 2]; + + for (let i = 0; i < fakeY2.length; i += 1) { + visitData2.push({ + x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'), + y: fakeY2[i] + }); + } + + const salesData = []; + + for (let i = 0; i < 12; i += 1) { + salesData.push({ + x: `${i + 1}月`, + y: Math.floor(Math.random() * 1000) + 200 + }); + } + + const searchData = []; + + for (let i = 0; i < 50; i += 1) { + searchData.push({ + index: i + 1, + keyword: `搜索关键词-${i}`, + count: Math.floor(Math.random() * 1000), + range: Math.floor(Math.random() * 100), + status: Math.floor(Math.random() * 10 % 2) + }); + } + + const salesTypeData = [{ + x: '家用电器', + y: 4544 + }, { + x: '食用酒水', + y: 3321 + }, { + x: '个护健康', + y: 3113 + }, { + x: '服饰箱包', + y: 2341 + }, { + x: '母婴产品', + y: 1231 + }, { + x: '其他', + y: 1231 + }]; + const salesTypeDataOnline = [{ + x: '家用电器', + y: 244 + }, { + x: '食用酒水', + y: 321 + }, { + x: '个护健康', + y: 311 + }, { + x: '服饰箱包', + y: 41 + }, { + x: '母婴产品', + y: 121 + }, { + x: '其他', + y: 111 + }]; + const salesTypeDataOffline = [{ + x: '家用电器', + y: 99 + }, { + x: '食用酒水', + y: 188 + }, { + x: '个护健康', + y: 344 + }, { + x: '服饰箱包', + y: 255 + }, { + x: '其他', + y: 65 + }]; + const offlineData = []; + + for (let i = 0; i < 10; i += 1) { + offlineData.push({ + name: `Stores ${i}`, + cvr: Math.ceil(Math.random() * 9) / 10 + }); + } + + const offlineChartData = []; + + for (let i = 0; i < 20; i += 1) { + offlineChartData.push({ + x: new Date().getTime() + 1000 * 60 * 30 * i, + y1: Math.floor(Math.random() * 100) + 10, + y2: Math.floor(Math.random() * 100) + 10 + }); + } + + const radarOriginData = [{ + name: '个人', + ref: 10, + koubei: 8, + output: 4, + contribute: 5, + hot: 7 + }, { + name: '团队', + ref: 3, + koubei: 9, + output: 6, + contribute: 3, + hot: 1 + }, { + name: '部门', + ref: 4, + koubei: 1, + output: 6, + contribute: 5, + hot: 7 + }]; + const radarData = []; + const radarTitleMap = { + ref: '引用', + koubei: '口碑', + output: '产量', + contribute: '贡献', + hot: '热度' + }; + radarOriginData.forEach(item => { + Object.keys(item).forEach(key => { + if (key !== 'name') { + radarData.push({ + name: item.name, + label: radarTitleMap[key], + value: item[key] + }); + } + }); + }); + const getFakeChartData = { + visitData, + visitData2, + salesData, + searchData, + offlineData, + offlineChartData, + salesTypeData, + salesTypeDataOnline, + salesTypeDataOffline, + radarData + }; + var chart = { + 'GET /api/fake_chart_data': getFakeChartData + }; + + var city = { + "110000": [ + { + province: "北京市", + name: "市辖区", + id: "110100" + } + ], + "120000": [ + { + province: "天津市", + name: "市辖区", + id: "120100" + } + ], + "130000": [ + { + province: "河北省", + name: "石家庄市", + id: "130100" + }, + { + province: "河北省", + name: "唐山市", + id: "130200" + }, + { + province: "河北省", + name: "秦皇岛市", + id: "130300" + }, + { + province: "河北省", + name: "邯郸市", + id: "130400" + }, + { + province: "河北省", + name: "邢台市", + id: "130500" + }, + { + province: "河北省", + name: "保定市", + id: "130600" + }, + { + province: "河北省", + name: "张家口市", + id: "130700" + }, + { + province: "河北省", + name: "承德市", + id: "130800" + }, + { + province: "河北省", + name: "沧州市", + id: "130900" + }, + { + province: "河北省", + name: "廊坊市", + id: "131000" + }, + { + province: "河北省", + name: "衡水市", + id: "131100" + }, + { + province: "河北省", + name: "省直辖县级行政区划", + id: "139000" + } + ], + "140000": [ + { + province: "山西省", + name: "太原市", + id: "140100" + }, + { + province: "山西省", + name: "大同市", + id: "140200" + }, + { + province: "山西省", + name: "阳泉市", + id: "140300" + }, + { + province: "山西省", + name: "长治市", + id: "140400" + }, + { + province: "山西省", + name: "晋城市", + id: "140500" + }, + { + province: "山西省", + name: "朔州市", + id: "140600" + }, + { + province: "山西省", + name: "晋中市", + id: "140700" + }, + { + province: "山西省", + name: "运城市", + id: "140800" + }, + { + province: "山西省", + name: "忻州市", + id: "140900" + }, + { + province: "山西省", + name: "临汾市", + id: "141000" + }, + { + province: "山西省", + name: "吕梁市", + id: "141100" + } + ], + "150000": [ + { + province: "内蒙古自治区", + name: "呼和浩特市", + id: "150100" + }, + { + province: "内蒙古自治区", + name: "包头市", + id: "150200" + }, + { + province: "内蒙古自治区", + name: "乌海市", + id: "150300" + }, + { + province: "内蒙古自治区", + name: "赤峰市", + id: "150400" + }, + { + province: "内蒙古自治区", + name: "通辽市", + id: "150500" + }, + { + province: "内蒙古自治区", + name: "鄂尔多斯市", + id: "150600" + }, + { + province: "内蒙古自治区", + name: "呼伦贝尔市", + id: "150700" + }, + { + province: "内蒙古自治区", + name: "巴彦淖尔市", + id: "150800" + }, + { + province: "内蒙古自治区", + name: "乌兰察布市", + id: "150900" + }, + { + province: "内蒙古自治区", + name: "兴安盟", + id: "152200" + }, + { + province: "内蒙古自治区", + name: "锡林郭勒盟", + id: "152500" + }, + { + province: "内蒙古自治区", + name: "阿拉善盟", + id: "152900" + } + ], + "210000": [ + { + province: "辽宁省", + name: "沈阳市", + id: "210100" + }, + { + province: "辽宁省", + name: "大连市", + id: "210200" + }, + { + province: "辽宁省", + name: "鞍山市", + id: "210300" + }, + { + province: "辽宁省", + name: "抚顺市", + id: "210400" + }, + { + province: "辽宁省", + name: "本溪市", + id: "210500" + }, + { + province: "辽宁省", + name: "丹东市", + id: "210600" + }, + { + province: "辽宁省", + name: "锦州市", + id: "210700" + }, + { + province: "辽宁省", + name: "营口市", + id: "210800" + }, + { + province: "辽宁省", + name: "阜新市", + id: "210900" + }, + { + province: "辽宁省", + name: "辽阳市", + id: "211000" + }, + { + province: "辽宁省", + name: "盘锦市", + id: "211100" + }, + { + province: "辽宁省", + name: "铁岭市", + id: "211200" + }, + { + province: "辽宁省", + name: "朝阳市", + id: "211300" + }, + { + province: "辽宁省", + name: "葫芦岛市", + id: "211400" + } + ], + "220000": [ + { + province: "吉林省", + name: "长春市", + id: "220100" + }, + { + province: "吉林省", + name: "吉林市", + id: "220200" + }, + { + province: "吉林省", + name: "四平市", + id: "220300" + }, + { + province: "吉林省", + name: "辽源市", + id: "220400" + }, + { + province: "吉林省", + name: "通化市", + id: "220500" + }, + { + province: "吉林省", + name: "白山市", + id: "220600" + }, + { + province: "吉林省", + name: "松原市", + id: "220700" + }, + { + province: "吉林省", + name: "白城市", + id: "220800" + }, + { + province: "吉林省", + name: "延边朝鲜族自治州", + id: "222400" + } + ], + "230000": [ + { + province: "黑龙江省", + name: "哈尔滨市", + id: "230100" + }, + { + province: "黑龙江省", + name: "齐齐哈尔市", + id: "230200" + }, + { + province: "黑龙江省", + name: "鸡西市", + id: "230300" + }, + { + province: "黑龙江省", + name: "鹤岗市", + id: "230400" + }, + { + province: "黑龙江省", + name: "双鸭山市", + id: "230500" + }, + { + province: "黑龙江省", + name: "大庆市", + id: "230600" + }, + { + province: "黑龙江省", + name: "伊春市", + id: "230700" + }, + { + province: "黑龙江省", + name: "佳木斯市", + id: "230800" + }, + { + province: "黑龙江省", + name: "七台河市", + id: "230900" + }, + { + province: "黑龙江省", + name: "牡丹江市", + id: "231000" + }, + { + province: "黑龙江省", + name: "黑河市", + id: "231100" + }, + { + province: "黑龙江省", + name: "绥化市", + id: "231200" + }, + { + province: "黑龙江省", + name: "大兴安岭地区", + id: "232700" + } + ], + "310000": [ + { + province: "上海市", + name: "市辖区", + id: "310100" + } + ], + "320000": [ + { + province: "江苏省", + name: "南京市", + id: "320100" + }, + { + province: "江苏省", + name: "无锡市", + id: "320200" + }, + { + province: "江苏省", + name: "徐州市", + id: "320300" + }, + { + province: "江苏省", + name: "常州市", + id: "320400" + }, + { + province: "江苏省", + name: "苏州市", + id: "320500" + }, + { + province: "江苏省", + name: "南通市", + id: "320600" + }, + { + province: "江苏省", + name: "连云港市", + id: "320700" + }, + { + province: "江苏省", + name: "淮安市", + id: "320800" + }, + { + province: "江苏省", + name: "盐城市", + id: "320900" + }, + { + province: "江苏省", + name: "扬州市", + id: "321000" + }, + { + province: "江苏省", + name: "镇江市", + id: "321100" + }, + { + province: "江苏省", + name: "泰州市", + id: "321200" + }, + { + province: "江苏省", + name: "宿迁市", + id: "321300" + } + ], + "330000": [ + { + province: "浙江省", + name: "杭州市", + id: "330100" + }, + { + province: "浙江省", + name: "宁波市", + id: "330200" + }, + { + province: "浙江省", + name: "温州市", + id: "330300" + }, + { + province: "浙江省", + name: "嘉兴市", + id: "330400" + }, + { + province: "浙江省", + name: "湖州市", + id: "330500" + }, + { + province: "浙江省", + name: "绍兴市", + id: "330600" + }, + { + province: "浙江省", + name: "金华市", + id: "330700" + }, + { + province: "浙江省", + name: "衢州市", + id: "330800" + }, + { + province: "浙江省", + name: "舟山市", + id: "330900" + }, + { + province: "浙江省", + name: "台州市", + id: "331000" + }, + { + province: "浙江省", + name: "丽水市", + id: "331100" + } + ], + "340000": [ + { + province: "安徽省", + name: "合肥市", + id: "340100" + }, + { + province: "安徽省", + name: "芜湖市", + id: "340200" + }, + { + province: "安徽省", + name: "蚌埠市", + id: "340300" + }, + { + province: "安徽省", + name: "淮南市", + id: "340400" + }, + { + province: "安徽省", + name: "马鞍山市", + id: "340500" + }, + { + province: "安徽省", + name: "淮北市", + id: "340600" + }, + { + province: "安徽省", + name: "铜陵市", + id: "340700" + }, + { + province: "安徽省", + name: "安庆市", + id: "340800" + }, + { + province: "安徽省", + name: "黄山市", + id: "341000" + }, + { + province: "安徽省", + name: "滁州市", + id: "341100" + }, + { + province: "安徽省", + name: "阜阳市", + id: "341200" + }, + { + province: "安徽省", + name: "宿州市", + id: "341300" + }, + { + province: "安徽省", + name: "六安市", + id: "341500" + }, + { + province: "安徽省", + name: "亳州市", + id: "341600" + }, + { + province: "安徽省", + name: "池州市", + id: "341700" + }, + { + province: "安徽省", + name: "宣城市", + id: "341800" + } + ], + "350000": [ + { + province: "福建省", + name: "福州市", + id: "350100" + }, + { + province: "福建省", + name: "厦门市", + id: "350200" + }, + { + province: "福建省", + name: "莆田市", + id: "350300" + }, + { + province: "福建省", + name: "三明市", + id: "350400" + }, + { + province: "福建省", + name: "泉州市", + id: "350500" + }, + { + province: "福建省", + name: "漳州市", + id: "350600" + }, + { + province: "福建省", + name: "南平市", + id: "350700" + }, + { + province: "福建省", + name: "龙岩市", + id: "350800" + }, + { + province: "福建省", + name: "宁德市", + id: "350900" + } + ], + "360000": [ + { + province: "江西省", + name: "南昌市", + id: "360100" + }, + { + province: "江西省", + name: "景德镇市", + id: "360200" + }, + { + province: "江西省", + name: "萍乡市", + id: "360300" + }, + { + province: "江西省", + name: "九江市", + id: "360400" + }, + { + province: "江西省", + name: "新余市", + id: "360500" + }, + { + province: "江西省", + name: "鹰潭市", + id: "360600" + }, + { + province: "江西省", + name: "赣州市", + id: "360700" + }, + { + province: "江西省", + name: "吉安市", + id: "360800" + }, + { + province: "江西省", + name: "宜春市", + id: "360900" + }, + { + province: "江西省", + name: "抚州市", + id: "361000" + }, + { + province: "江西省", + name: "上饶市", + id: "361100" + } + ], + "370000": [ + { + province: "山东省", + name: "济南市", + id: "370100" + }, + { + province: "山东省", + name: "青岛市", + id: "370200" + }, + { + province: "山东省", + name: "淄博市", + id: "370300" + }, + { + province: "山东省", + name: "枣庄市", + id: "370400" + }, + { + province: "山东省", + name: "东营市", + id: "370500" + }, + { + province: "山东省", + name: "烟台市", + id: "370600" + }, + { + province: "山东省", + name: "潍坊市", + id: "370700" + }, + { + province: "山东省", + name: "济宁市", + id: "370800" + }, + { + province: "山东省", + name: "泰安市", + id: "370900" + }, + { + province: "山东省", + name: "威海市", + id: "371000" + }, + { + province: "山东省", + name: "日照市", + id: "371100" + }, + { + province: "山东省", + name: "莱芜市", + id: "371200" + }, + { + province: "山东省", + name: "临沂市", + id: "371300" + }, + { + province: "山东省", + name: "德州市", + id: "371400" + }, + { + province: "山东省", + name: "聊城市", + id: "371500" + }, + { + province: "山东省", + name: "滨州市", + id: "371600" + }, + { + province: "山东省", + name: "菏泽市", + id: "371700" + } + ], + "410000": [ + { + province: "河南省", + name: "郑州市", + id: "410100" + }, + { + province: "河南省", + name: "开封市", + id: "410200" + }, + { + province: "河南省", + name: "洛阳市", + id: "410300" + }, + { + province: "河南省", + name: "平顶山市", + id: "410400" + }, + { + province: "河南省", + name: "安阳市", + id: "410500" + }, + { + province: "河南省", + name: "鹤壁市", + id: "410600" + }, + { + province: "河南省", + name: "新乡市", + id: "410700" + }, + { + province: "河南省", + name: "焦作市", + id: "410800" + }, + { + province: "河南省", + name: "濮阳市", + id: "410900" + }, + { + province: "河南省", + name: "许昌市", + id: "411000" + }, + { + province: "河南省", + name: "漯河市", + id: "411100" + }, + { + province: "河南省", + name: "三门峡市", + id: "411200" + }, + { + province: "河南省", + name: "南阳市", + id: "411300" + }, + { + province: "河南省", + name: "商丘市", + id: "411400" + }, + { + province: "河南省", + name: "信阳市", + id: "411500" + }, + { + province: "河南省", + name: "周口市", + id: "411600" + }, + { + province: "河南省", + name: "驻马店市", + id: "411700" + }, + { + province: "河南省", + name: "省直辖县级行政区划", + id: "419000" + } + ], + "420000": [ + { + province: "湖北省", + name: "武汉市", + id: "420100" + }, + { + province: "湖北省", + name: "黄石市", + id: "420200" + }, + { + province: "湖北省", + name: "十堰市", + id: "420300" + }, + { + province: "湖北省", + name: "宜昌市", + id: "420500" + }, + { + province: "湖北省", + name: "襄阳市", + id: "420600" + }, + { + province: "湖北省", + name: "鄂州市", + id: "420700" + }, + { + province: "湖北省", + name: "荆门市", + id: "420800" + }, + { + province: "湖北省", + name: "孝感市", + id: "420900" + }, + { + province: "湖北省", + name: "荆州市", + id: "421000" + }, + { + province: "湖北省", + name: "黄冈市", + id: "421100" + }, + { + province: "湖北省", + name: "咸宁市", + id: "421200" + }, + { + province: "湖北省", + name: "随州市", + id: "421300" + }, + { + province: "湖北省", + name: "恩施土家族苗族自治州", + id: "422800" + }, + { + province: "湖北省", + name: "省直辖县级行政区划", + id: "429000" + } + ], + "430000": [ + { + province: "湖南省", + name: "长沙市", + id: "430100" + }, + { + province: "湖南省", + name: "株洲市", + id: "430200" + }, + { + province: "湖南省", + name: "湘潭市", + id: "430300" + }, + { + province: "湖南省", + name: "衡阳市", + id: "430400" + }, + { + province: "湖南省", + name: "邵阳市", + id: "430500" + }, + { + province: "湖南省", + name: "岳阳市", + id: "430600" + }, + { + province: "湖南省", + name: "常德市", + id: "430700" + }, + { + province: "湖南省", + name: "张家界市", + id: "430800" + }, + { + province: "湖南省", + name: "益阳市", + id: "430900" + }, + { + province: "湖南省", + name: "郴州市", + id: "431000" + }, + { + province: "湖南省", + name: "永州市", + id: "431100" + }, + { + province: "湖南省", + name: "怀化市", + id: "431200" + }, + { + province: "湖南省", + name: "娄底市", + id: "431300" + }, + { + province: "湖南省", + name: "湘西土家族苗族自治州", + id: "433100" + } + ], + "440000": [ + { + province: "广东省", + name: "广州市", + id: "440100" + }, + { + province: "广东省", + name: "韶关市", + id: "440200" + }, + { + province: "广东省", + name: "深圳市", + id: "440300" + }, + { + province: "广东省", + name: "珠海市", + id: "440400" + }, + { + province: "广东省", + name: "汕头市", + id: "440500" + }, + { + province: "广东省", + name: "佛山市", + id: "440600" + }, + { + province: "广东省", + name: "江门市", + id: "440700" + }, + { + province: "广东省", + name: "湛江市", + id: "440800" + }, + { + province: "广东省", + name: "茂名市", + id: "440900" + }, + { + province: "广东省", + name: "肇庆市", + id: "441200" + }, + { + province: "广东省", + name: "惠州市", + id: "441300" + }, + { + province: "广东省", + name: "梅州市", + id: "441400" + }, + { + province: "广东省", + name: "汕尾市", + id: "441500" + }, + { + province: "广东省", + name: "河源市", + id: "441600" + }, + { + province: "广东省", + name: "阳江市", + id: "441700" + }, + { + province: "广东省", + name: "清远市", + id: "441800" + }, + { + province: "广东省", + name: "东莞市", + id: "441900" + }, + { + province: "广东省", + name: "中山市", + id: "442000" + }, + { + province: "广东省", + name: "潮州市", + id: "445100" + }, + { + province: "广东省", + name: "揭阳市", + id: "445200" + }, + { + province: "广东省", + name: "云浮市", + id: "445300" + } + ], + "450000": [ + { + province: "广西壮族自治区", + name: "南宁市", + id: "450100" + }, + { + province: "广西壮族自治区", + name: "柳州市", + id: "450200" + }, + { + province: "广西壮族自治区", + name: "桂林市", + id: "450300" + }, + { + province: "广西壮族自治区", + name: "梧州市", + id: "450400" + }, + { + province: "广西壮族自治区", + name: "北海市", + id: "450500" + }, + { + province: "广西壮族自治区", + name: "防城港市", + id: "450600" + }, + { + province: "广西壮族自治区", + name: "钦州市", + id: "450700" + }, + { + province: "广西壮族自治区", + name: "贵港市", + id: "450800" + }, + { + province: "广西壮族自治区", + name: "玉林市", + id: "450900" + }, + { + province: "广西壮族自治区", + name: "百色市", + id: "451000" + }, + { + province: "广西壮族自治区", + name: "贺州市", + id: "451100" + }, + { + province: "广西壮族自治区", + name: "河池市", + id: "451200" + }, + { + province: "广西壮族自治区", + name: "来宾市", + id: "451300" + }, + { + province: "广西壮族自治区", + name: "崇左市", + id: "451400" + } + ], + "460000": [ + { + province: "海南省", + name: "海口市", + id: "460100" + }, + { + province: "海南省", + name: "三亚市", + id: "460200" + }, + { + province: "海南省", + name: "三沙市", + id: "460300" + }, + { + province: "海南省", + name: "儋州市", + id: "460400" + }, + { + province: "海南省", + name: "省直辖县级行政区划", + id: "469000" + } + ], + "500000": [ + { + province: "重庆市", + name: "市辖区", + id: "500100" + }, + { + province: "重庆市", + name: "县", + id: "500200" + } + ], + "510000": [ + { + province: "四川省", + name: "成都市", + id: "510100" + }, + { + province: "四川省", + name: "自贡市", + id: "510300" + }, + { + province: "四川省", + name: "攀枝花市", + id: "510400" + }, + { + province: "四川省", + name: "泸州市", + id: "510500" + }, + { + province: "四川省", + name: "德阳市", + id: "510600" + }, + { + province: "四川省", + name: "绵阳市", + id: "510700" + }, + { + province: "四川省", + name: "广元市", + id: "510800" + }, + { + province: "四川省", + name: "遂宁市", + id: "510900" + }, + { + province: "四川省", + name: "内江市", + id: "511000" + }, + { + province: "四川省", + name: "乐山市", + id: "511100" + }, + { + province: "四川省", + name: "南充市", + id: "511300" + }, + { + province: "四川省", + name: "眉山市", + id: "511400" + }, + { + province: "四川省", + name: "宜宾市", + id: "511500" + }, + { + province: "四川省", + name: "广安市", + id: "511600" + }, + { + province: "四川省", + name: "达州市", + id: "511700" + }, + { + province: "四川省", + name: "雅安市", + id: "511800" + }, + { + province: "四川省", + name: "巴中市", + id: "511900" + }, + { + province: "四川省", + name: "资阳市", + id: "512000" + }, + { + province: "四川省", + name: "阿坝藏族羌族自治州", + id: "513200" + }, + { + province: "四川省", + name: "甘孜藏族自治州", + id: "513300" + }, + { + province: "四川省", + name: "凉山彝族自治州", + id: "513400" + } + ], + "520000": [ + { + province: "贵州省", + name: "贵阳市", + id: "520100" + }, + { + province: "贵州省", + name: "六盘水市", + id: "520200" + }, + { + province: "贵州省", + name: "遵义市", + id: "520300" + }, + { + province: "贵州省", + name: "安顺市", + id: "520400" + }, + { + province: "贵州省", + name: "毕节市", + id: "520500" + }, + { + province: "贵州省", + name: "铜仁市", + id: "520600" + }, + { + province: "贵州省", + name: "黔西南布依族苗族自治州", + id: "522300" + }, + { + province: "贵州省", + name: "黔东南苗族侗族自治州", + id: "522600" + }, + { + province: "贵州省", + name: "黔南布依族苗族自治州", + id: "522700" + } + ], + "530000": [ + { + province: "云南省", + name: "昆明市", + id: "530100" + }, + { + province: "云南省", + name: "曲靖市", + id: "530300" + }, + { + province: "云南省", + name: "玉溪市", + id: "530400" + }, + { + province: "云南省", + name: "保山市", + id: "530500" + }, + { + province: "云南省", + name: "昭通市", + id: "530600" + }, + { + province: "云南省", + name: "丽江市", + id: "530700" + }, + { + province: "云南省", + name: "普洱市", + id: "530800" + }, + { + province: "云南省", + name: "临沧市", + id: "530900" + }, + { + province: "云南省", + name: "楚雄彝族自治州", + id: "532300" + }, + { + province: "云南省", + name: "红河哈尼族彝族自治州", + id: "532500" + }, + { + province: "云南省", + name: "文山壮族苗族自治州", + id: "532600" + }, + { + province: "云南省", + name: "西双版纳傣族自治州", + id: "532800" + }, + { + province: "云南省", + name: "大理白族自治州", + id: "532900" + }, + { + province: "云南省", + name: "德宏傣族景颇族自治州", + id: "533100" + }, + { + province: "云南省", + name: "怒江傈僳族自治州", + id: "533300" + }, + { + province: "云南省", + name: "迪庆藏族自治州", + id: "533400" + } + ], + "540000": [ + { + province: "西藏自治区", + name: "拉萨市", + id: "540100" + }, + { + province: "西藏自治区", + name: "日喀则市", + id: "540200" + }, + { + province: "西藏自治区", + name: "昌都市", + id: "540300" + }, + { + province: "西藏自治区", + name: "林芝市", + id: "540400" + }, + { + province: "西藏自治区", + name: "山南市", + id: "540500" + }, + { + province: "西藏自治区", + name: "那曲地区", + id: "542400" + }, + { + province: "西藏自治区", + name: "阿里地区", + id: "542500" + } + ], + "610000": [ + { + province: "陕西省", + name: "西安市", + id: "610100" + }, + { + province: "陕西省", + name: "铜川市", + id: "610200" + }, + { + province: "陕西省", + name: "宝鸡市", + id: "610300" + }, + { + province: "陕西省", + name: "咸阳市", + id: "610400" + }, + { + province: "陕西省", + name: "渭南市", + id: "610500" + }, + { + province: "陕西省", + name: "延安市", + id: "610600" + }, + { + province: "陕西省", + name: "汉中市", + id: "610700" + }, + { + province: "陕西省", + name: "榆林市", + id: "610800" + }, + { + province: "陕西省", + name: "安康市", + id: "610900" + }, + { + province: "陕西省", + name: "商洛市", + id: "611000" + } + ], + "620000": [ + { + province: "甘肃省", + name: "兰州市", + id: "620100" + }, + { + province: "甘肃省", + name: "嘉峪关市", + id: "620200" + }, + { + province: "甘肃省", + name: "金昌市", + id: "620300" + }, + { + province: "甘肃省", + name: "白银市", + id: "620400" + }, + { + province: "甘肃省", + name: "天水市", + id: "620500" + }, + { + province: "甘肃省", + name: "武威市", + id: "620600" + }, + { + province: "甘肃省", + name: "张掖市", + id: "620700" + }, + { + province: "甘肃省", + name: "平凉市", + id: "620800" + }, + { + province: "甘肃省", + name: "酒泉市", + id: "620900" + }, + { + province: "甘肃省", + name: "庆阳市", + id: "621000" + }, + { + province: "甘肃省", + name: "定西市", + id: "621100" + }, + { + province: "甘肃省", + name: "陇南市", + id: "621200" + }, + { + province: "甘肃省", + name: "临夏回族自治州", + id: "622900" + }, + { + province: "甘肃省", + name: "甘南藏族自治州", + id: "623000" + } + ], + "630000": [ + { + province: "青海省", + name: "西宁市", + id: "630100" + }, + { + province: "青海省", + name: "海东市", + id: "630200" + }, + { + province: "青海省", + name: "海北藏族自治州", + id: "632200" + }, + { + province: "青海省", + name: "黄南藏族自治州", + id: "632300" + }, + { + province: "青海省", + name: "海南藏族自治州", + id: "632500" + }, + { + province: "青海省", + name: "果洛藏族自治州", + id: "632600" + }, + { + province: "青海省", + name: "玉树藏族自治州", + id: "632700" + }, + { + province: "青海省", + name: "海西蒙古族藏族自治州", + id: "632800" + } + ], + "640000": [ + { + province: "宁夏回族自治区", + name: "银川市", + id: "640100" + }, + { + province: "宁夏回族自治区", + name: "石嘴山市", + id: "640200" + }, + { + province: "宁夏回族自治区", + name: "吴忠市", + id: "640300" + }, + { + province: "宁夏回族自治区", + name: "固原市", + id: "640400" + }, + { + province: "宁夏回族自治区", + name: "中卫市", + id: "640500" + } + ], + "650000": [ + { + province: "新疆维吾尔自治区", + name: "乌鲁木齐市", + id: "650100" + }, + { + province: "新疆维吾尔自治区", + name: "克拉玛依市", + id: "650200" + }, + { + province: "新疆维吾尔自治区", + name: "吐鲁番市", + id: "650400" + }, + { + province: "新疆维吾尔自治区", + name: "哈密市", + id: "650500" + }, + { + province: "新疆维吾尔自治区", + name: "昌吉回族自治州", + id: "652300" + }, + { + province: "新疆维吾尔自治区", + name: "博尔塔拉蒙古自治州", + id: "652700" + }, + { + province: "新疆维吾尔自治区", + name: "巴音郭楞蒙古自治州", + id: "652800" + }, + { + province: "新疆维吾尔自治区", + name: "阿克苏地区", + id: "652900" + }, + { + province: "新疆维吾尔自治区", + name: "克孜勒苏柯尔克孜自治州", + id: "653000" + }, + { + province: "新疆维吾尔自治区", + name: "喀什地区", + id: "653100" + }, + { + province: "新疆维吾尔自治区", + name: "和田地区", + id: "653200" + }, + { + province: "新疆维吾尔自治区", + name: "伊犁哈萨克自治州", + id: "654000" + }, + { + province: "新疆维吾尔自治区", + name: "塔城地区", + id: "654200" + }, + { + province: "新疆维吾尔自治区", + name: "阿勒泰地区", + id: "654300" + }, + { + province: "新疆维吾尔自治区", + name: "自治区直辖县级行政区划", + id: "659000" + } + ] + }; + + var province = [ + { + "name": "北京市", + "id": "110000" + }, + { + "name": "天津市", + "id": "120000" + }, + { + "name": "河北省", + "id": "130000" + }, + { + "name": "山西省", + "id": "140000" + }, + { + "name": "内蒙古自治区", + "id": "150000" + }, + { + "name": "辽宁省", + "id": "210000" + }, + { + "name": "吉林省", + "id": "220000" + }, + { + "name": "黑龙江省", + "id": "230000" + }, + { + "name": "上海市", + "id": "310000" + }, + { + "name": "江苏省", + "id": "320000" + }, + { + "name": "浙江省", + "id": "330000" + }, + { + "name": "安徽省", + "id": "340000" + }, + { + "name": "福建省", + "id": "350000" + }, + { + "name": "江西省", + "id": "360000" + }, + { + "name": "山东省", + "id": "370000" + }, + { + "name": "河南省", + "id": "410000" + }, + { + "name": "湖北省", + "id": "420000" + }, + { + "name": "湖南省", + "id": "430000" + }, + { + "name": "广东省", + "id": "440000" + }, + { + "name": "广西壮族自治区", + "id": "450000" + }, + { + "name": "海南省", + "id": "460000" + }, + { + "name": "重庆市", + "id": "500000" + }, + { + "name": "四川省", + "id": "510000" + }, + { + "name": "贵州省", + "id": "520000" + }, + { + "name": "云南省", + "id": "530000" + }, + { + "name": "西藏自治区", + "id": "540000" + }, + { + "name": "陕西省", + "id": "610000" + }, + { + "name": "甘肃省", + "id": "620000" + }, + { + "name": "青海省", + "id": "630000" + }, + { + "name": "宁夏回族自治区", + "id": "640000" + }, + { + "name": "新疆维吾尔自治区", + "id": "650000" + }, + { + "name": "台湾省", + "id": "710000" + }, + { + "name": "香港特别行政区", + "id": "810000" + }, + { + "name": "澳门特别行政区", + "id": "820000" + } + ] + ; + + function getProvince(req, res) { + return res.json(province); + } + + function getCity(req, res) { + return res.json(city[req.params.province]); + } + + var geographic = { + 'GET /api/geographic/province': getProvince, + 'GET /api/geographic/city/:province': getCity + }; + + const getNotices = (req, res) => res.json([{ + id: '000000001', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '你收到了 14 份新周报', + datetime: '2017-08-09', + type: 'notification' + }, { + id: '000000002', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png', + title: '你推荐的 曲妮妮 已通过第三轮面试', + datetime: '2017-08-08', + type: 'notification' + }, { + id: '000000003', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png', + title: '这种模板可以区分多种通知类型', + datetime: '2017-08-07', + read: true, + type: 'notification' + }, { + id: '000000004', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png', + title: '左侧图标用于区分不同的类型', + datetime: '2017-08-07', + type: 'notification' + }, { + id: '000000005', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '内容不要超过两行字,超出时自动截断', + datetime: '2017-08-07', + type: 'notification' + }, { + id: '000000006', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '曲丽丽 评论了你', + description: '描述信息描述信息描述信息', + datetime: '2017-08-07', + type: 'message', + clickClose: true + }, { + id: '000000007', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '朱偏右 回复了你', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: 'message', + clickClose: true + }, { + id: '000000008', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '标题', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: 'message', + clickClose: true + }, { + id: '000000009', + title: '任务名称', + description: '任务需要在 2017-01-12 20:00 前启动', + extra: '未开始', + status: 'todo', + type: 'event' + }, { + id: '000000010', + title: '第三方紧急代码变更', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '马上到期', + status: 'urgent', + type: 'event' + }, { + id: '000000011', + title: '信息安全考试', + description: '指派竹尔于 2017-01-09 前完成更新并发布', + extra: '已耗时 8 天', + status: 'doing', + type: 'event' + }, { + id: '000000012', + title: 'ABCD 版本发布', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '进行中', + status: 'processing', + type: 'event' + }]); + + var notices = { + 'GET /api/notices': getNotices + }; + + const basicGoods = [{ + id: '1234561', + name: '矿泉水 550ml', + barcode: '12421432143214321', + price: '2.00', + num: '1', + amount: '2.00' + }, { + id: '1234562', + name: '凉茶 300ml', + barcode: '12421432143214322', + price: '3.00', + num: '2', + amount: '6.00' + }, { + id: '1234563', + name: '好吃的薯片', + barcode: '12421432143214323', + price: '7.00', + num: '4', + amount: '28.00' + }, { + id: '1234564', + name: '特别好吃的蛋卷', + barcode: '12421432143214324', + price: '8.50', + num: '3', + amount: '25.50' + }]; + const basicProgress = [{ + key: '1', + time: '2017-10-01 14:10', + rate: '联系客户', + status: 'processing', + operator: '取货员 ID1234', + cost: '5mins' + }, { + key: '2', + time: '2017-10-01 14:05', + rate: '取货员出发', + status: 'success', + operator: '取货员 ID1234', + cost: '1h' + }, { + key: '3', + time: '2017-10-01 13:05', + rate: '取货员接单', + status: 'success', + operator: '取货员 ID1234', + cost: '5mins' + }, { + key: '4', + time: '2017-10-01 13:00', + rate: '申请审批通过', + status: 'success', + operator: '系统', + cost: '1h' + }, { + key: '5', + time: '2017-10-01 12:00', + rate: '发起退货申请', + status: 'success', + operator: '用户', + cost: '5mins' + }]; + const advancedOperation1 = [{ + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-' + }, { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + memo: '不通过原因' + }, { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-' + }, { + key: 'op4', + type: '提交订单', + name: '林东东', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '很棒' + }, { + key: 'op5', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-' + }]; + const advancedOperation2 = [{ + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-' + }]; + const advancedOperation3 = [{ + key: 'op1', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-' + }]; + const getProfileAdvancedData = { + advancedOperation1, + advancedOperation2, + advancedOperation3 + }; + const { + Random + } = mockjs; + var profile = { + 'GET /api/profile/advanced': getProfileAdvancedData, + 'GET /api/profile/basic': (req, res) => { + const { + id + } = req.query; + const application = { + id, + status: '已取货', + orderNo: Random.id(), + childOrderNo: Random.id() + }; + const userInfo = { + name: Random.cname(), + tel: '18100000000', + delivery: '菜鸟物流', + addr: '浙江省杭州市西湖区万塘路18号', + remark: '备注' + }; + res.json({ + userInfo, + application, + basicGoods, + basicProgress + }); + } + }; + + /*! https://mths.be/punycode v1.4.1 by @mathias */ + + /** Highest positive signed 32-bit float value */ + var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + + var base = 36; + var tMin = 1; + var tMax = 26; + var skew = 38; + var damp = 700; + var initialBias = 72; + var initialN = 128; // 0x80 + + var delimiter = '-'; // '\x2D' + var regexNonASCII = /[^\x20-\x7E]/; // unprintable ASCII chars + non-ASCII chars + + var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + + /** Error messages */ + + var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }; + /** Convenience shortcuts */ + + var baseMinusTMin = base - tMin; + var floor = Math.floor; + var stringFromCharCode = String.fromCharCode; + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + + function error(type) { + throw new RangeError(errors[type]); + } + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + + + function map(array, fn) { + var length = array.length; + var result = []; + + while (length--) { + result[length] = fn(array[length]); + } + + return result; + } + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + + + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } // Avoid `split(regex)` for IE8 compatibility. See #17. + + + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + + + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + + while (counter < length) { + value = string.charCodeAt(counter++); + + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + + if ((extra & 0xFC00) == 0xDC00) { + // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + + return output; + } + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + + + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + + + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + + for (; + /* no initialization */ + delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; // Convert the input in UCS-2 to Unicode + + input = ucs2decode(input); // Cache the length + + inputLength = input.length; // Initialize the state + + n = initialN; + delta = 0; + bias = initialBias; // Handle the basic code points + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + // Finish the basic string - if it is not empty - with a delimiter + + if (basicLength) { + output.push(delimiter); + } // Main encoding loop: + + + while (handledCPCount < inputLength) { + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + + + handledCPCountPlusOne = handledCPCount + 1; + + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base;; + /* no condition */ + k += base) { + t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (q < t) { + break; + } + + qMinusT = q - t; + baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + } + + return output.join(''); + } + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + + function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); + } + + // shim for using process in browser + + if (typeof global.setTimeout === 'function') ; + + if (typeof global.clearTimeout === 'function') ; + + var performance = global.performance || {}; + + var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function () { + return new Date().getTime(); + }; // generate timestamp or delta + + // Copyright Joyent, Inc. and other Node contributors. + function isNull(arg) { + return arg === null; + } + function isNullOrUndefined(arg) { + return arg == null; + } + function isString(arg) { + return typeof arg === 'string'; + } + function isObject(arg) { + return typeof arg === 'object' && arg !== null; + } + + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + // If obj.hasOwnProperty has been overridden, then calling + // obj.hasOwnProperty(prop) will break. + // See: https://github.com/joyent/node/issues/1707 + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; + }; + + function stringifyPrimitive(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } + } + + function stringify(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return map$1(objectKeys(obj), function (k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + + if (isArray(obj[k])) { + return map$1(obj[k], function (v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj)); + } + + function map$1(xs, f) { + if (xs.map) return xs.map(f); + var res = []; + + for (var i = 0; i < xs.length; i++) { + res.push(f(xs[i], i)); + } + + return res; + } + + var objectKeys = Object.keys || function (obj) { + var res = []; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); + } + + return res; + }; + + function parse(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + var maxKeys = 1000; + + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; // maxKeys <= 0 means that we should not limit keys count + + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, + vstr, + k, + v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; + } + + // Copyright Joyent, Inc. and other Node contributors. + function Url() { + this.protocol = null; + this.slashes = null; + this.auth = null; + this.host = null; + this.port = null; + this.hostname = null; + this.hash = null; + this.search = null; + this.query = null; + this.pathname = null; + this.path = null; + this.href = null; + } // Reference: RFC 3986, RFC 1808, RFC 2396 + // define these here so at least they only have to be + // compiled once on the first module load. + + var protocolPattern = /^([a-z0-9.+-]+:)/i, + portPattern = /:[0-9]*$/, + // Special case for a simple path URL + simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, + // RFC 2396: characters reserved for delimiting URLs. + // We actually just auto-escape these. + delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], + // RFC 2396: characters not allowed for various reasons. + unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), + // Allowed by RFCs, but cause of XSS attacks. Always escape these. + autoEscape = ['\''].concat(unwise), + // Characters that are never ever allowed in a hostname. + // Note that any invalid chars are also handled, but these + // are the ones that are *expected* to be seen, so we fast-path + // them. + nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), + hostEndingChars = ['/', '?', '#'], + hostnameMaxLen = 255, + hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, + hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, + // protocols that can allow "unsafe" and "unwise" chars. + unsafeProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that never have a hostname. + hostlessProtocol = { + 'javascript': true, + 'javascript:': true + }, + // protocols that always contain a // bit. + slashedProtocol = { + 'http': true, + 'https': true, + 'ftp': true, + 'gopher': true, + 'file': true, + 'http:': true, + 'https:': true, + 'ftp:': true, + 'gopher:': true, + 'file:': true + }; + + function urlParse(url, parseQueryString, slashesDenoteHost) { + if (url && isObject(url) && url instanceof Url) return url; + var u = new Url(); + u.parse(url, parseQueryString, slashesDenoteHost); + return u; + } + + Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) { + return parse$1(this, url, parseQueryString, slashesDenoteHost); + }; + + function parse$1(self, url, parseQueryString, slashesDenoteHost) { + if (!isString(url)) { + throw new TypeError('Parameter \'url\' must be a string, not ' + typeof url); + } // Copy chrome, IE, opera backslash-handling behavior. + // Back slashes before the query string get converted to forward slashes + // See: https://code.google.com/p/chromium/issues/detail?id=25916 + + + var queryIndex = url.indexOf('?'), + splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#', + uSplit = url.split(splitter), + slashRegex = /\\/g; + uSplit[0] = uSplit[0].replace(slashRegex, '/'); + url = uSplit.join(splitter); + var rest = url; // trim before proceeding. + // This is to support parse stuff like " http://foo.com \n" + + rest = rest.trim(); + + if (!slashesDenoteHost && url.split('#').length === 1) { + // Try fast path regexp + var simplePath = simplePathPattern.exec(rest); + + if (simplePath) { + self.path = rest; + self.href = rest; + self.pathname = simplePath[1]; + + if (simplePath[2]) { + self.search = simplePath[2]; + + if (parseQueryString) { + self.query = parse(self.search.substr(1)); + } else { + self.query = self.search.substr(1); + } + } else if (parseQueryString) { + self.search = ''; + self.query = {}; + } + + return self; + } + } + + var proto = protocolPattern.exec(rest); + + if (proto) { + proto = proto[0]; + var lowerProto = proto.toLowerCase(); + self.protocol = lowerProto; + rest = rest.substr(proto.length); + } // figure out if it's got a host + // user@server is *always* interpreted as a hostname, and url + // resolution will treat //foo/bar as host=foo,path=bar because that's + // how the browser resolves relative URLs. + + + if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { + var slashes = rest.substr(0, 2) === '//'; + + if (slashes && !(proto && hostlessProtocol[proto])) { + rest = rest.substr(2); + self.slashes = true; + } + } + + var i, hec, l, p; + + if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) { + // there's a hostname. + // the first instance of /, ?, ;, or # ends the host. + // + // If there is an @ in the hostname, then non-host chars *are* allowed + // to the left of the last @ sign, unless some host-ending character + // comes *before* the @-sign. + // URLs are obnoxious. + // + // ex: + // http://a@b@c/ => user:a@b host:c + // http://a@b?@c => user:a host:c path:/?@c + // v0.12 TODO(isaacs): This is not quite how Chrome does things. + // Review our test case against browsers more comprehensively. + // find the first instance of any hostEndingChars + var hostEnd = -1; + + for (i = 0; i < hostEndingChars.length; i++) { + hec = rest.indexOf(hostEndingChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; + } // at this point, either we have an explicit point where the + // auth portion cannot go past, or the last @ char is the decider. + + + var auth, atSign; + + if (hostEnd === -1) { + // atSign can be anywhere. + atSign = rest.lastIndexOf('@'); + } else { + // atSign must be in auth portion. + // http://a@b/c@d => host:b auth:a path:/c@d + atSign = rest.lastIndexOf('@', hostEnd); + } // Now we have a portion which is definitely the auth. + // Pull that off. + + + if (atSign !== -1) { + auth = rest.slice(0, atSign); + rest = rest.slice(atSign + 1); + self.auth = decodeURIComponent(auth); + } // the host is the remaining to the left of the first non-host char + + + hostEnd = -1; + + for (i = 0; i < nonHostChars.length; i++) { + hec = rest.indexOf(nonHostChars[i]); + if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec; + } // if we still have not hit it, then the entire thing is a host. + + + if (hostEnd === -1) hostEnd = rest.length; + self.host = rest.slice(0, hostEnd); + rest = rest.slice(hostEnd); // pull out port. + + parseHost(self); // we've indicated that there is a hostname, + // so even if it's empty, it has to be present. + + self.hostname = self.hostname || ''; // if hostname begins with [ and ends with ] + // assume that it's an IPv6 address. + + var ipv6Hostname = self.hostname[0] === '[' && self.hostname[self.hostname.length - 1] === ']'; // validate a little. + + if (!ipv6Hostname) { + var hostparts = self.hostname.split(/\./); + + for (i = 0, l = hostparts.length; i < l; i++) { + var part = hostparts[i]; + if (!part) continue; + + if (!part.match(hostnamePartPattern)) { + var newpart = ''; + + for (var j = 0, k = part.length; j < k; j++) { + if (part.charCodeAt(j) > 127) { + // we replace non-ASCII char with a temporary placeholder + // we need this to make sure size of hostname is not + // broken by replacing non-ASCII by nothing + newpart += 'x'; + } else { + newpart += part[j]; + } + } // we test again with ASCII char only + + + if (!newpart.match(hostnamePartPattern)) { + var validParts = hostparts.slice(0, i); + var notHost = hostparts.slice(i + 1); + var bit = part.match(hostnamePartStart); + + if (bit) { + validParts.push(bit[1]); + notHost.unshift(bit[2]); + } + + if (notHost.length) { + rest = '/' + notHost.join('.') + rest; + } + + self.hostname = validParts.join('.'); + break; + } + } + } + } + + if (self.hostname.length > hostnameMaxLen) { + self.hostname = ''; + } else { + // hostnames are always lower case. + self.hostname = self.hostname.toLowerCase(); + } + + if (!ipv6Hostname) { + // IDNA Support: Returns a punycoded representation of "domain". + // It only converts parts of the domain name that + // have non-ASCII characters, i.e. it doesn't matter if + // you call it with a domain that already is ASCII-only. + self.hostname = toASCII(self.hostname); + } + + p = self.port ? ':' + self.port : ''; + var h = self.hostname || ''; + self.host = h + p; + self.href += self.host; // strip [ and ] from the hostname + // the host field still retains them, though + + if (ipv6Hostname) { + self.hostname = self.hostname.substr(1, self.hostname.length - 2); + + if (rest[0] !== '/') { + rest = '/' + rest; + } + } + } // now rest is set to the post-host stuff. + // chop off any delim chars. + + + if (!unsafeProtocol[lowerProto]) { + // First, make 100% sure that any "autoEscape" chars get + // escaped, even if encodeURIComponent doesn't think they + // need to be. + for (i = 0, l = autoEscape.length; i < l; i++) { + var ae = autoEscape[i]; + if (rest.indexOf(ae) === -1) continue; + var esc = encodeURIComponent(ae); + + if (esc === ae) { + esc = escape(ae); + } + + rest = rest.split(ae).join(esc); + } + } // chop off from the tail first. + + + var hash = rest.indexOf('#'); + + if (hash !== -1) { + // got a fragment string. + self.hash = rest.substr(hash); + rest = rest.slice(0, hash); + } + + var qm = rest.indexOf('?'); + + if (qm !== -1) { + self.search = rest.substr(qm); + self.query = rest.substr(qm + 1); + + if (parseQueryString) { + self.query = parse(self.query); + } + + rest = rest.slice(0, qm); + } else if (parseQueryString) { + // no query string, but parseQueryString still requested + self.search = ''; + self.query = {}; + } + + if (rest) self.pathname = rest; + + if (slashedProtocol[lowerProto] && self.hostname && !self.pathname) { + self.pathname = '/'; + } //to support http.request + + + if (self.pathname || self.search) { + p = self.pathname || ''; + var s = self.search || ''; + self.path = p + s; + } // finally, reconstruct the href based on what has been validated. + + + self.href = format(self); + return self; + } // format a parsed object into a url string + + function format(self) { + var auth = self.auth || ''; + + if (auth) { + auth = encodeURIComponent(auth); + auth = auth.replace(/%3A/i, ':'); + auth += '@'; + } + + var protocol = self.protocol || '', + pathname = self.pathname || '', + hash = self.hash || '', + host = false, + query = ''; + + if (self.host) { + host = auth + self.host; + } else if (self.hostname) { + host = auth + (self.hostname.indexOf(':') === -1 ? self.hostname : '[' + this.hostname + ']'); + + if (self.port) { + host += ':' + self.port; + } + } + + if (self.query && isObject(self.query) && Object.keys(self.query).length) { + query = stringify(self.query); + } + + var search = self.search || query && '?' + query || ''; + if (protocol && protocol.substr(-1) !== ':') protocol += ':'; // only the slashedProtocols get the //. Not mailto:, xmpp:, etc. + // unless they had them to begin with. + + if (self.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + + if (hash && hash.charAt(0) !== '#') hash = '#' + hash; + if (search && search.charAt(0) !== '?') search = '?' + search; + pathname = pathname.replace(/[?#]/g, function (match) { + return encodeURIComponent(match); + }); + search = search.replace('#', '%23'); + return protocol + host + pathname + search + hash; + } + + Url.prototype.format = function () { + return format(this); + }; + + Url.prototype.resolve = function (relative) { + return this.resolveObject(urlParse(relative, false, true)).format(); + }; + + Url.prototype.resolveObject = function (relative) { + if (isString(relative)) { + var rel = new Url(); + rel.parse(relative, false, true); + relative = rel; + } + + var result = new Url(); + var tkeys = Object.keys(this); + + for (var tk = 0; tk < tkeys.length; tk++) { + var tkey = tkeys[tk]; + result[tkey] = this[tkey]; + } // hash is always overridden, no matter what. + // even href="" will remove it. + + + result.hash = relative.hash; // if the relative url is empty, then there's nothing left to do here. + + if (relative.href === '') { + result.href = result.format(); + return result; + } // hrefs like //foo/bar always cut to the protocol. + + + if (relative.slashes && !relative.protocol) { + // take everything except the protocol from relative + var rkeys = Object.keys(relative); + + for (var rk = 0; rk < rkeys.length; rk++) { + var rkey = rkeys[rk]; + if (rkey !== 'protocol') result[rkey] = relative[rkey]; + } //urlParse appends trailing / to urls like http://www.example.com + + + if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) { + result.path = result.pathname = '/'; + } + + result.href = result.format(); + return result; + } + + var relPath; + + if (relative.protocol && relative.protocol !== result.protocol) { + // if it's a known url protocol, then changing + // the protocol does weird things + // first, if it's not file:, then we MUST have a host, + // and if there was a path + // to begin with, then we MUST have a path. + // if it is file:, then the host is dropped, + // because that's known to be hostless. + // anything else is assumed to be absolute. + if (!slashedProtocol[relative.protocol]) { + var keys = Object.keys(relative); + + for (var v = 0; v < keys.length; v++) { + var k = keys[v]; + result[k] = relative[k]; + } + + result.href = result.format(); + return result; + } + + result.protocol = relative.protocol; + + if (!relative.host && !hostlessProtocol[relative.protocol]) { + relPath = (relative.pathname || '').split('/'); + + while (relPath.length && !(relative.host = relPath.shift())); + + if (!relative.host) relative.host = ''; + if (!relative.hostname) relative.hostname = ''; + if (relPath[0] !== '') relPath.unshift(''); + if (relPath.length < 2) relPath.unshift(''); + result.pathname = relPath.join('/'); + } else { + result.pathname = relative.pathname; + } + + result.search = relative.search; + result.query = relative.query; + result.host = relative.host || ''; + result.auth = relative.auth; + result.hostname = relative.hostname || relative.host; + result.port = relative.port; // to support http.request + + if (result.pathname || result.search) { + var p = result.pathname || ''; + var s = result.search || ''; + result.path = p + s; + } + + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + } + + var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/', + isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/', + mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname, + removeAllDots = mustEndAbs, + srcPath = result.pathname && result.pathname.split('/') || [], + psychotic = result.protocol && !slashedProtocol[result.protocol]; + relPath = relative.pathname && relative.pathname.split('/') || []; // if the url is a non-slashed url, then relative + // links like ../.. should be able + // to crawl up to the hostname, as well. This is strange. + // result.protocol has already been set by now. + // Later on, put the first path part into the host field. + + if (psychotic) { + result.hostname = ''; + result.port = null; + + if (result.host) { + if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host); + } + + result.host = ''; + + if (relative.protocol) { + relative.hostname = null; + relative.port = null; + + if (relative.host) { + if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host); + } + + relative.host = null; + } + + mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); + } + + var authInHost; + + if (isRelAbs) { + // it's absolute. + result.host = relative.host || relative.host === '' ? relative.host : result.host; + result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname; + result.search = relative.search; + result.query = relative.query; + srcPath = relPath; // fall through to the dot-handling below. + } else if (relPath.length) { + // it's relative + // throw away the existing file, and take the new path instead. + if (!srcPath) srcPath = []; + srcPath.pop(); + srcPath = srcPath.concat(relPath); + result.search = relative.search; + result.query = relative.query; + } else if (!isNullOrUndefined(relative.search)) { + // just pull out the search. + // like href='?foo'. + // Put this after the other two cases because it simplifies the booleans + if (psychotic) { + result.hostname = result.host = srcPath.shift(); //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + + authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; + + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + + result.search = relative.search; + result.query = relative.query; //to support http.request + + if (!isNull(result.pathname) || !isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); + } + + result.href = result.format(); + return result; + } + + if (!srcPath.length) { + // no path at all. easy. + // we've already handled the other stuff above. + result.pathname = null; //to support http.request + + if (result.search) { + result.path = '/' + result.search; + } else { + result.path = null; + } + + result.href = result.format(); + return result; + } // if a url ENDs in . or .., then it must get a trailing slash. + // however, if it ends in anything else non-slashy, + // then it must NOT get a trailing slash. + + + var last = srcPath.slice(-1)[0]; + var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === ''; // strip single dots, resolve double dots to parent dir + // if the path tries to go above the root, `up` ends up > 0 + + var up = 0; + + for (var i = srcPath.length; i >= 0; i--) { + last = srcPath[i]; + + if (last === '.') { + srcPath.splice(i, 1); + } else if (last === '..') { + srcPath.splice(i, 1); + up++; + } else if (up) { + srcPath.splice(i, 1); + up--; + } + } // if the path is allowed to go above the root, restore leading ..s + + + if (!mustEndAbs && !removeAllDots) { + for (; up--; up) { + srcPath.unshift('..'); + } + } + + if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) { + srcPath.unshift(''); + } + + if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') { + srcPath.push(''); + } + + var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/'; // put the host back + + if (psychotic) { + result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : ''; //occationaly the auth can get stuck only in host + //this especially happens in cases like + //url.resolveObject('mailto:local1@domain1', 'local2@domain2') + + authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false; + + if (authInHost) { + result.auth = authInHost.shift(); + result.host = result.hostname = authInHost.shift(); + } + } + + mustEndAbs = mustEndAbs || result.host && srcPath.length; + + if (mustEndAbs && !isAbsolute) { + srcPath.unshift(''); + } + + if (!srcPath.length) { + result.pathname = null; + result.path = null; + } else { + result.pathname = srcPath.join('/'); + } //to support request.http + + + if (!isNull(result.pathname) || !isNull(result.search)) { + result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : ''); + } + + result.auth = relative.auth || result.auth; + result.slashes = result.slashes || relative.slashes; + result.href = result.format(); + return result; + }; + + Url.prototype.parseHost = function () { + return parseHost(this); + }; + + function parseHost(self) { + var host = self.host; + var port = portPattern.exec(host); + + if (port) { + port = port[0]; + + if (port !== ':') { + self.port = port.substr(1); + } + + host = host.substr(0, host.length - port.length); + } + + if (host) self.hostname = host; + } + + let tableListDataSource = []; + + for (let i = 0; i < 46; i += 1) { + tableListDataSource.push({ + key: i, + disabled: i % 6 === 0, + href: 'https://ant.design', + avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2], + name: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + desc: '这是一段描述', + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 4, + updatedAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`), + createdAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`), + progress: Math.ceil(Math.random() * 100) + }); + } + + function getRule(req, res, u) { + let url = u; + + if (!url || Object.prototype.toString.call(url) !== '[object String]') { + url = req.url; // eslint-disable-line + } + + const params = urlParse(url, true).query; + let dataSource = tableListDataSource; + + if (params.sorter) { + const s = params.sorter.split('_'); + dataSource = dataSource.sort((prev, next) => { + if (s[1] === 'descend') { + return next[s[0]] - prev[s[0]]; + } + + return prev[s[0]] - next[s[0]]; + }); + } + + if (params.status) { + const status = params.status.split(','); + let filterDataSource = []; + status.forEach(s => { + filterDataSource = filterDataSource.concat(dataSource.filter(data => parseInt(data.status, 10) === parseInt(s[0], 10))); + }); + dataSource = filterDataSource; + } + + if (params.name) { + dataSource = dataSource.filter(data => data.name.indexOf(params.name) > -1); + } + + let pageSize = 10; + + if (params.pageSize) { + pageSize = params.pageSize * 1; + } + + const result = { + list: dataSource, + pagination: { + total: dataSource.length, + pageSize, + current: parseInt(params.currentPage, 10) || 1 + } + }; + return res.json(result); + } + + function postRule(req, res, u, b) { + let url = u; + + if (!url || Object.prototype.toString.call(url) !== '[object String]') { + url = req.url; // eslint-disable-line + } + + const body = b && b.body || req.body; + const { + method, + name, + desc, + key + } = body; + + switch (method) { + /* eslint no-case-declarations:0 */ + case 'delete': + tableListDataSource = tableListDataSource.filter(item => key.indexOf(item.key) === -1); + break; + + case 'post': + const i = Math.ceil(Math.random() * 10000); + tableListDataSource.unshift({ + key: i, + href: 'https://ant.design', + avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2], + name: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + desc, + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 2, + updatedAt: new Date(), + createdAt: new Date(), + progress: Math.ceil(Math.random() * 100) + }); + break; + + case 'update': + tableListDataSource = tableListDataSource.map(item => { + if (item.key === key) { + Object.assign(item, { + desc, + name + }); + return item; + } + + return item; + }); + break; + + default: + break; + } + + return getRule(req, res, u); + } + + var rule = { + 'GET /api/rule': getRule, + 'POST /api/rule': postRule + }; + + // 代码中会兼容本地 service mock 以及部署站点的静态数据 + var user$1 = { + // 支持值为 Object 和 Array + 'GET /api/currentUser': { + name: 'Serati Ma', + avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'antdesign@alipay.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [{ + key: '0', + label: '很有想法的' + }, { + key: '1', + label: '专注设计' + }, { + key: '2', + label: '辣~' + }, { + key: '3', + label: '大长腿' + }, { + key: '4', + label: '川妹子' + }, { + key: '5', + label: '海纳百川' + }], + notifyCount: 12, + unreadCount: 11, + country: 'China', + geographic: { + province: { + label: '浙江省', + key: '330000' + }, + city: { + label: '杭州市', + key: '330100' + } + }, + address: '西湖区工专路 77 号', + phone: '0752-268888888' + }, + // GET POST 可省略 + 'GET /api/users': [{ + key: '1', + name: 'John Brown', + age: 32, + address: 'New York No. 1 Lake Park' + }, { + key: '2', + name: 'Jim Green', + age: 42, + address: 'London No. 1 Lake Park' + }, { + key: '3', + name: 'Joe Black', + age: 32, + address: 'Sidney No. 1 Lake Park' + }], + 'POST /api/login/account': (req, res) => { + const { + password, + userName, + type + } = req.body; + + if (password === 'ant.design' && userName === 'admin') { + res.send({ + status: 'ok', + type, + currentAuthority: 'admin' + }); + return; + } + + if (password === 'ant.design' && userName === 'user') { + res.send({ + status: 'ok', + type, + currentAuthority: 'user' + }); + return; + } + + res.send({ + status: 'error', + type, + currentAuthority: 'guest' + }); + }, + 'POST /api/register': (req, res) => { + res.send({ + status: 'ok', + currentAuthority: 'user' + }); + }, + 'GET /api/500': (req, res) => { + res.status(500).send({ + timestamp: 1513932555104, + status: 500, + error: 'error', + message: 'error', + path: '/base/category/list' + }); + }, + 'GET /api/404': (req, res) => { + res.status(404).send({ + timestamp: 1513932643431, + status: 404, + error: 'Not Found', + message: 'No message available', + path: '/base/category/list/2121212' + }); + }, + 'GET /api/403': (req, res) => { + res.status(403).send({ + timestamp: 1513932555104, + status: 403, + error: 'Unauthorized', + message: 'Unauthorized', + path: '/base/category/list' + }); + }, + 'GET /api/401': (req, res) => { + res.status(401).send({ + timestamp: 1513932555104, + status: 401, + error: 'Unauthorized', + message: 'Unauthorized', + path: '/base/category/list' + }); + } + }; + + const data = _objectSpread({}, api, chart, geographic, notices, profile, rule, user$1); + + return data; + +})); diff --git a/package.json b/package.json index c8fedcb1..cd91ec7d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint:style": "stylelint --fix 'src/**/*.less' --syntax less", "lint:ts": "tslint -p . -c tslint.yml", "prettier": " check-prettier write", - "site": "npm run fetch:blocks && umi build && npm run functions:build", + "site": "npm run fetch:blocks && umi build", "start": "umi dev", "start:no-mock": "cross-env MOCK=none umi dev", "test": "umi test", diff --git a/scripts/generateMock.js b/scripts/generateMock.js deleted file mode 100644 index e8600caf..00000000 --- a/scripts/generateMock.js +++ /dev/null @@ -1,3 +0,0 @@ -const generateMock = require('merge-umi-mock-data'); -const path = require('path'); -generateMock(path.join(__dirname, '../mock'), path.join(__dirname, '../lambda/mock/index.js')); -- GitLab