Commit 83927e18 authored by 温海元's avatar 温海元

Initial commit

parents
Pipeline #892 failed with stages
module.exports = {
"extends": "airbnb-base"
};
\ No newline at end of file
/node_modules
/logs
package-lock.json
\ No newline at end of file
# ${ip}:3333/testdata/getall?count=2
\ No newline at end of file
const Koa = require('koa');
const path = require('path');
const cors = require('kcors');
const log4js = require('koa-log4');
const favicon = require('koa-favicon');
const controller = require('./app/controller');
// const Middles = require('./middleware');
global.config = require('./config/app.conf');
const { config } = global;
const faviconPath = path.resolve(__dirname, './public/favicon.ico');
const logFormat = ':remote-addr - - ":method :url HTTP/:http-version" :status :content-length ":referrer" ":user-agent" :response-time ms';
const app = new Koa();
const logDir = path.join(__dirname, 'logs');
log4js.configure(config.log4js.conf, { cwd: logDir });
app.use(favicon(faviconPath))
.use(log4js.koaLogger(log4js.getLogger('http'), { level: 'auto', format: logFormat }))
.use(cors({
maxAge: 86400, // options请求缓存24小时
origin(req) {
return req.header.origin;
},
}))
// .use(Middles.router(app, { root: './app/controller' }))
.use(controller());
app.listen(3333);
const fs = require('fs');
const Router = require('koa-router');
const router = new Router();
const log4js = require('koa-log4');
const logger = log4js.getLogger('router');
// 解析规则 {'GET /': homepage}
function addRule(_router, rule) {
Object.keys(rule).forEach((key) => {
// key = 'GET /' rule = {'GET /': homepage}
if (key.startsWith('GET ')) {
const path = key.substring(4);
_router.get(path, rule[key]);
logger.info(`register URL mapping: GET ${path}`);
} else if (key.startsWith('POST ')) {
const path = key.substring(5);
_router.post(path, rule[key]);
logger.info(`register URL mapping: POST ${path}`);
} else {
logger.info(`invalid URL: ${key}`);
}
});
}
// 自动导入controller文件夹下所有的路由规则
function addRules(_router) {
// 得到 /controller 所有以js结尾的文件
const files = fs.readdirSync(`${__dirname}/controller`);
const jsFiles = files.filter(f => f.endsWith('.js'));
// 添加规则
jsFiles.forEach((jsFile) => {
// console.log(`process controller: ${f}...`);
logger.info(`process controller: ${jsFile}...`);
const rule = require(`${__dirname}/controller/${jsFile}`);
addRule(_router, rule);
});
}
module.exports = () => {
addRules(router);
return router.routes();
};
const bankID = require('../services/bankID');
const IDCard = require('../services/IDCard');
const mobile = require('../services/mobile');
// const createNameService = require('../services/CreateNameService')
const address = require('../services/address');
const name = require('../services/name');
const email = require('../services/email');
exports.createBankID = async () => {
const req = this.query;
let { bank } = req;
bank = bank ? bank.toUpperCase() : bankID.randomBank();
this.body = { code: '0000', bank: bankID.RandomCreateBankID(bank) };
};
// 获取银行列表
exports.getBankList = async function () {
this.body = bankID.bankList();
};
// 生成随机手机号
exports.getMoble = async function () {
this.body = { mobile: mobile.getMoble() };
};
// 生成地址
exports.getAddress = async function () {
const { province } = this.query;
this.body = { address: address.fullAddress(province) };
};
// 生成名字
exports.getName = async function () {
this.body = { name: name.getName() };
};
// 生成电子邮箱
exports.getEmail = async function () {
this.body = { email: email.email() };
};
exports.getID = async function () {
this.body = { IDCardNo: IDCard.RandomCreateID() };
};
exports.getAll = async function () {
const { province, bank } = this.query;
const count = this.query.count || 1;
const re = [];
for (let i = 0; i < count; i += 1) {
const ID = IDCard.RandomCreateID(province);
const item = {
name: name.getName(),
IDCardNo: ID,
sex: IDCard.getSex(ID),
birthday: IDCard.getBirthday(ID),
address: address.fullAddress(province),
mobile: mobile.getMoble(),
email: email.email(),
};
Object.assign(item, bankID.RandomCreateBankID(bank));
re.push(item);
}
this.body = { code: '0000', data: re };
};
const bankID = require('../services/bankID');
const IDCard = require('../services/IDCard');
const mobile = require('../services/mobile');
const address = require('../services/address');
const name = require('../services/name');
const email = require('../services/email');
const checkService = require('../services/checkService');
// 生成银行卡
async function getBankID(ctx) {
let { bank } = ctx.query;
bank = bank ? bank.toUpperCase() : bankID.randomBank();
ctx.body = { code: '0000', data: [bankID.RandomCreateBankID(bank)] };
}
// 获取银行列表
const getBankList = async (ctx) => {
ctx.body = { code: '0000', data: bankID.bankList() };
};
async function getProvinceList(ctx) {
ctx.body = { code: '0000', data: address.allProvince() };
}
async function getCountyList(ctx) {
ctx.body = address.allCounty();
}
// 生成随机手机号
async function getMoble(ctx) {
ctx.body = { mobile: mobile.getMoble() };
}
// 生成地址
async function getAddress(ctx) {
ctx.body = { address: address.address() };
}
// 生成名字
async function getName(ctx) {
ctx.body = { name: name.getName() };
}
// 生成电子邮箱
async function getEmail(ctx) {
ctx.body = { email: email.email() };
}
// 生成身份证
async function getID(ctx) {
const province = ctx.query.province || address.province();
const city = address.city(province);
const county = address.county(province, city);
ctx.body = {
IDCardNo: IDCard.randomCreateID(county.code),
province,
city,
county: county.name,
};
}
// 生成所有
async function getAll(ctx) {
const { bank } = ctx.query;
const count = ctx.query.count || 1;
const re = [];
for (let i = 0; i < count; i += 1) {
const province = ctx.query.province ? address.allProvince()
.filter(item => item.indexOf(ctx.query.province) !== -1)[0] : address.province();
const city = address.city(province);
const county = address.county(province, city);
const fullAddress = province + city + county.name;
const ID = IDCard.randomCreateID(county.code);
const item = {
name: name.getName(),
IDCardNo: ID,
sex: IDCard.getSex(ID),
birthday: IDCard.getBirthday(ID),
address: fullAddress + address.streetAddress(),
mobile: mobile.getMoble(),
email: email.email(),
};
Object.assign(item, bankID.RandomCreateBankID(bank));
re.push(item);
}
ctx.body = { code: '0000', count: re.length, data: re };
}
async function checkID(ctx) {
const ID = ctx.query.id || ctx.query.ID;
ctx.body = { data: checkService.ParseID(ID) };
}
async function chekBankCardID(ctx) {
const ID = ctx.query.id || ctx.query.ID;
ctx.body = { data: checkService.luhnCheck(ID) };
}
module.exports = {
'GET /testdata/getID': getID,
'GET /testdata/getAll': getAll,
'GET /testdata/getEmail': getEmail,
'GET /testdata/getName': getName,
'GET /testdata/getAddress': getAddress,
'GET /testdata/getBankID': getBankID,
'GET /testdata/getMoble': getMoble,
'GET /testdata/getBankList': getBankList,
'GET /testdata/getProvinceList': getProvinceList,
'GET /testdata/getCountyList': getCountyList,
'GET /testdata/checkID': checkID,
'GET /testdata/chekBankCardID': chekBankCardID,
};
// const checkService = require('./checkService')
const _ = require('lodash');
const address = require('./address');
// 根据15位身份证或者18位身份证的前17位生成18位身份证号码
function getCheckID(_pid) {
const arrVerifyCode = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
const wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
if (_pid.length !== 15 && _pid.length !== 17) return (false);
let ai = (_pid.length === 17) ? _pid : `${_pid.substr(0, 6)}19${_pid.substr(6)}`;
if (!/^\d+$/.test(ai)) {
return (false);
}
const yyyy = parseInt(ai.substr(6, 4), 10);
const mm = parseInt(ai.substr(10, 2) - 1, 10);
const dd = parseInt(ai.substr(12, 2), 10);
const d = new Date(yyyy, mm, dd); const year = d.getFullYear();
const mon = d.getMonth(); const day = d.getDate(); const now = new Date();
if (year !== yyyy || mon !== mm || day !== dd || d > now || now.getFullYear() - year > 140) {
return (false);
}
let ret = 0;
for (let i = 0; i < 17; i += 1) {
ret += ai.charAt(i) * wi[i];
}
ai += arrVerifyCode[ret %= 11];
return (ai);
}
// 随机生成一个身份证
function randomCreateID(_countyCode) {
let ff = false;
const countyCode = parseInt(_countyCode, 10) && _countyCode.length === 12
? _countyCode.substr(0, 6) : address.county().code.substr(0, 6);
while (!ff) {
let yyyy = 0; let mm = 0; let dd = 0; let rnd = 0;
yyyy = _.random(1960, 1990); mm = _.random(1, 12); dd = _.random(1, 31);
rnd = `${_.random(0, 9)}${_.random(0, 9)}${_.random(0, 9)}`;
if ((mm === 2) && (dd > 28)) {
dd = _.random(1, 28);
}
if (((mm === 4) || (mm === 6) || (mm === 9) || (mm === 11)) && (dd === 31)) {
dd -= 1;
}
mm = (mm < 10) ? (`0${mm}`) : mm;
dd = (dd < 10) ? (`0${dd}`) : dd;
const re = `${countyCode}${yyyy}${mm}${dd}${rnd}`;
ff = getCheckID(re);
}
return ff;
}
function getBirthday(_id) {
// let _id = checkService.ParseID(pid);
const id = `${_id}`;
if (id.length < 17) return 0;
const birthday = (new Date(id.substr(6, 4), id.substr(10, 2) - 1, id.substr(12, 2)))
.toLocaleDateString();
return birthday;
}
function getSex(_id) {
// let _id = checkService.ParseID(pid);
const id = _id.toString();
if (id.length < 17) return 0;
const sex = _id.substr(16, 1) % 2 ? '' : '';
return sex;
}
module.exports = {
randomCreateID,
getBirthday,
getSex,
};
const _ = require('lodash');
const random = require('./random');
const helpers = require('./helpers');
const allData = require('./mockz').data;
// 全部数据
const allCounty = () => allData;
// 全部省份
const allProvince = () => allData.map(item => item.name);
// 省级
const province = () => {
const idx = _.random(allData.length - 1);
return allData[idx].name;
};
// 市级
const city = (provName) => {
const pArr = _.filter(allData, { name: provName });
let prov;
if (pArr.length > 0) {
[prov] = pArr;
} else {
const pidx = _.random(allData.length - 1);
prov = allData[pidx];
}
const cidx = _.random(prov.children.length - 1);
return prov.children[cidx].name;
};
// 县级
const county = (provName, cityName) => {
const pidx = _.random(allData.length - 1);
let prov = allData[pidx];
const pArr = _.filter(allData, { name: provName });
if (pArr.length > 0) {
[prov] = pArr;
}
const cidx = _.random(prov.children.length - 1);
let ct = prov.children[cidx];
const cArr = _.filter(prov.children, { name: cityName });
if (cArr.length > 0) {
[ct] = cArr;
}
const idx = _.random(ct.children.length - 1);
return ct.children[idx];
};
function secondaryAddress() {
return helpers.replaceSymbolWithNumber(random.array_element(
[
'##栋#0#屋',
'##号楼#门#0#',
'#排#0#室',
],
));
}
function streetName() {
let result;
switch (random.number(2)) {
case 0:
result = random.first_name() + random.street_suffix();
break;
case 1:
result = `${random.first_name().substr(1, 1)}${random.last_name().substr(0, 1)}${random.street_suffix()}`;
break;
default:
}
return result;
}
function streetAddress() {
let address = '';
switch (random.number(3)) {
case 0:
address = `${streetName() + helpers.replaceSymbolWithNumber('###')}${random.last_name()}${random.last_name()}小区`;
break;
case 1:
address = `${streetName() + helpers.replaceSymbolWithNumber('##')}${random.first_name()}苑`;
break;
default:
address = `${streetName() + helpers.replaceSymbolWithNumber('#')}号院`;
break;
}
return address + secondaryAddress();
}
// 地址
const address = () => {
const pidx = _.random(allData.length - 1);
const prov = allData[pidx];
const cidx = _.random(prov.children.length - 1);
const ct = prov.children[cidx];
const cyidx = _.random(ct.children.length - 1);
const cy = ct.children[cyidx];
return `${prov.name}${ct.name}${cy.name}${streetAddress()}`;
};
module.exports = {
address,
province,
city,
county,
streetAddress,
allProvince,
allCounty,
};
const checkService = require('./checkService');
const banklist = require('./definitions').cn_bank;
const bankList = () => banklist;
const randomBank = () => banklist[Math.floor(Math.random() * banklist.length)];
// 随机生成一个卡号
const RandomCreateBankID = (_bankType) => {
const bankTypeName = _bankType ? banklist
.filter(item => item.indexOf(_bankType) !== -1)[0] : randomBank();
const [, bankType] = bankTypeName.split(' ');
let bankNo = '';
let flag = true;
while (flag) {
const cardPrefix = [];
if (
bankType === 'ICBC'
|| bankType === 'CCB'
|| bankType === 'ABC'
|| bankType === 'PSBC'
|| bankType === 'BCOM'
|| bankType === 'GDB'
|| bankType === 'BOC'
) {
for (let j = 0; j < 13; j += 1) {
cardPrefix.push(parseInt(Math.random() * 10, 10));
}
} else {
for (let j = 0; j < 10; j += 1) {
cardPrefix.push(parseInt(Math.random() * 10, 10));
}
}
const cardPrefixs = cardPrefix.join('');
switch (bankType) {
case 'CCB':
bankNo = `621700${cardPrefixs}`;
break;
case 'CMBC':
bankNo = `621691${cardPrefixs}`;
break;
case 'ABC':
bankNo = `622827${cardPrefixs}`;
break;
case 'BCOM':
bankNo = `622262${cardPrefixs}`;
break;
case 'CMB':
bankNo = `621486${cardPrefixs}`;
break;
case 'SPDB':
bankNo = `622521${cardPrefixs}`;
break;
case 'GDB':
bankNo = `622568${cardPrefixs}`;
break;
case 'HXB':
bankNo = `622632${cardPrefixs}`;
break;
// case 'PAB':
// bankNo = `622298${cardPrefixs}`;
// break;
case 'CITIC':
bankNo = `622696${cardPrefixs}`;
break;
case 'ICBC':
bankNo = `620058${cardPrefixs}`;
break;
case 'BOC':
bankNo = `620061${cardPrefixs}`;
break;
case 'CIB':
bankNo = `622908${cardPrefixs}`;
break;
case 'CEB':
bankNo = `622660${cardPrefixs}`;
break;
case 'PSBC':
bankNo = `621799${cardPrefixs}`;
break;
default:
bankNo = `621700${cardPrefixs}`;
}
if (checkService.luhnCheck(bankNo)) {
flag = false;
}
}
return { bankType: bankTypeName, bankNo };
};
module.exports = {
RandomCreateBankID,
bankList,
randomBank,
};
// 判断输入的15位或者18位身份证号码是否合法
function ParseID(pId) {
const arrVerifyCode = [1, 0, 'x', 9, 8, 7, 6, 5, 4, 3, 2];
const wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
if (pId.length !== 15 && pId.length !== 18) {
return ('身份证号码只能是15位或18位!');
}
let ai = (pId.length === 18) ? pId.substr(0, 17) : `${pId.substr(0, 6)}19${pId.substr(6)}`;
if (!/^\d+$/.test(ai)) {
return ('身份证除最后一位外,必须为数字!');
}
const yyyy = ai.substr(6, 4);
const mm = ai.substr(10, 2) - 1;
const dd = ai.substr(12, 2);
const d = new Date(yyyy, mm, dd);
const year = d.getFullYear();
const mon = d.getMonth();
const day = d.getDate();
const now = new Date();
if (year != yyyy || mon != mm || day != dd || d > now || now.getFullYear() - year > 140) {
return ('身份证出生年月日输入错误!');
}
let ret = 0;
for (let i = 0; i < 17; i += 1) {
ret += ai.charAt(i) * wi[i];
}
ai += arrVerifyCode[ret %= 11];
return ((pId.length === 18 && pId.toLowerCase() !== ai) ? `身份证输入错误,正确的为\n${ai}!` : ai);
}
// luhn校验规则:16位银行卡号(19位通用):
// 1.将未带校验位的 15(或18)位卡号从右依次编号 1 到 15(18),位于奇数位号上的数字乘以 2。
// 2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字。
// 3.将加法和加上校验位能被 10 整除。
function luhnCheck(_bankNo) {
const bankNo = `${_bankNo}`;
if (!(bankNo.length === 16 || bankNo.length === 19)) {
return `卡号位数不正确:${_bankNo}`;
}
// 取出最后一位(与luhn进行比较)
const lastNum = bankNo.substr(bankNo.length - 1, 1);
// 前15或18位
const first15Num = bankNo.substr(0, bankNo.length - 1);
const newArr = [];
// 前15或18位倒序存进数组
for (let i = first15Num.length - 1; i > -1; i -= 1) {
newArr.push(parseInt(first15Num.substr(i, 1), 10));
}
// 奇数位*2的积 <9
const arrJiShu = [];
// 奇数位*2的积 >9
const arrJiShu2 = [];
// 偶数位数组
const arrOuShu = [];
for (let i = 0; i < newArr.length; i += 1) {
if ((i + 1) % 2 === 1) {
if (newArr[i] * 2 < 9) {
arrJiShu.push(newArr[i] * 2);
} else {
arrJiShu2.push(newArr[i] * 2);
}
} else {
arrOuShu.push(newArr[i]);
}
}
// 奇数位*2 >9 的分割之后的数组个位数
const jishuChildOne = [];
// 奇数位*2 >9 的分割之后的数组十位数
const jishuChileTwo = [];
arrJiShu2.forEach((item) => {
jishuChildOne.push(item % 10);
jishuChileTwo.push(parseInt(item / 10, 10));
});
// 奇数位*2 < 9 的数组之和
const sumJiShu = arrJiShu.reduce((x, y) => x + y, 0);
// 偶数位数组之和
const sumOuShu = arrOuShu.reduce((x, y) => x + y, 0);
// 奇数位*2 >9 的分割之后的数组个位数之和
const sumJiShuChild1 = jishuChildOne.reduce((x, y) => x + y, 0);
// 奇数位*2 >9 的分割之后的数组十位数之和
const sumJiShuChild2 = jishuChileTwo.reduce((x, y) => x + y, 0);
// 计算总和
const sumTotal = sumJiShu + sumOuShu + sumJiShuChild1 + sumJiShuChild2;
// 计算luhn值
const k = sumTotal % 10 === 0 ? 10 : sumTotal % 10;
const luhn = `${10 - k}`;
if (lastNum === luhn) {
return true;
}
return false;
}
module.exports = {
ParseID,
luhnCheck,
};
const randomHz = () => {
eval('var word=' + '"\\u' + (Math.round(Math.random() * 20901) + 19968).toString(16) + '"');
return word;
};
const getName = () => {
const familyNames = ['', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'', '', '', '', '', '', '', '', '', '',
'欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫', '万俟', '闻人', '夏侯', '诸葛', '尉迟',
'公羊', '赫连', '澹台', '皇甫', '宗政', '濮阳', '公冶', '太叔', '申屠', '公孙', '慕容', '仲孙',
'钟离', '长孙', '宇文', '司徒', '鲜于', '司空', '闾丘', '子车', '亓官', '司寇', '巫马', '公西',
'颛孙', '壤驷', '公良', '漆雕', '乐正', '宰父', '谷梁', '拓跋', '夹谷', '轩辕', '令狐', '段干',
'百里', '呼延', '东郭', '南门', '羊舌', '微生', '公户', '公玉', '公仪', '梁丘', '公仲', '公上',
'公门', '公山', '公坚', '左丘', '公伯', '西门', '公祖', '第五', '公乘', '贯丘', '公皙', '南荣',
'东里', '东宫', '仲长', '子书', '子桑', '即墨', '达奚', '褚师', '吴铭'];
const givenNames = ['子璇', '', '国栋', '夫子', '瑞堂', '', '', '', '国贤', '贺祥', '晨涛',
'昊轩', '易轩', '益辰', '益帆', '益冉', '瑾春', '瑾昆', '春齐', '', '文昊',
'东东', '雄霖', '浩晨', '熙涵', '溶溶', '冰枫', '欣欣', '宜豪', '欣慧', '建政',
'美欣', '淑慧', '文轩', '文杰', '欣源', '忠林', '榕润', '欣汝', '慧嘉', '新建',
'建林', '亦菲', '', '冰洁', '佳欣', '涵涵', '禹辰', '淳美', '泽惠', '伟洋',
'涵越', '润丽', '', '淑华', '晶莹', '凌晶', '苒溪', '雨涵', '嘉怡', '佳毅',
'子辰', '佳琪', '紫轩', '瑞辰', '昕蕊', '', '明远', '欣宜', '泽远', '欣怡',
'佳怡', '佳惠', '晨茜', '晨璐', '运昊', '汝鑫', '淑君', '晶滢', '润莎', '榕汕',
'佳钰', '佳玉', '晓庆', '一鸣', '语晨', '添池', '添昊', '雨泽', '雅晗', '雅涵',
'清妍', '诗悦', '嘉乐', '晨涵', '天赫', '玥傲', '佳昊', '天昊', '萌萌', '若萌'];
const i = parseInt(Math.floor(Math.random() * familyNames.length), 10);
const familyName = familyNames[i];
const j = parseInt(Math.floor(Math.random() * givenNames.length), 10);
const givenName = givenNames[j] + randomHz();
// let givenName = randomHz() + randomHz()
const name = familyName + givenName;
return name;
};
module.exports = {
getName,
};
// bankID.js definitions
exports.cn_bank = ['中国银行 BOC', '中国农业银行 ABC', '中国工商银行 ICBC', '中国建设银行 CCB', '交通银行 BCOM',
'招商银行 CMB', '中信银行 CITIC','华夏银行 HXB'];
// name.js definitions
exports.first_name = ['安邦', '安福', '安歌', '安国', '安和', '安康', '安澜', '安民', '安宁', '安平', '安然', '安顺', '安翔', '安晏', '安宜', '安怡', '安易', '安志', '昂然', '昂雄', '宾白', '宾鸿', '宾实', '彬彬', '彬炳', '彬郁', '斌斌', '斌蔚', '滨海', '波光', '波鸿', '波峻', '波涛', '博瀚', '博超', '博达', '博厚', '博简', '博明', '博容', '博赡', '博涉', '博实', '博涛', '博文', '博学', '博雅', '博延', '博艺', '博易', '博裕', '博远', '才捷', '才良', '才艺', '才英', '才哲', '才俊', '成和', '成弘', '成化', '成济', '成礼', '成龙', '成仁', '成双', '成天', '成文', '成业', '成益', '成荫', '成周', '承安', '承弼', '承德', '承恩', '承福', '承基', '承教', '承平', '承嗣', '承天', '承望', '承宣', '承颜', '承业', '承悦', '承允', '承运', '承载', '承泽', '承志', '德本', '德海', '德厚', '德华', '德辉', '德惠', '德容', '德润', '德寿', '德水', '德馨', '德曜', '德业', '德义', '德庸', '德佑', '德宇', '德元', '德运', '德泽', '德明', '飞昂', '飞白', '飞飙', '飞掣', '飞尘', '飞沉', '飞驰', '飞光', '飞翰', '飞航', '飞翮', '飞鸿', '飞虎', '飞捷', '飞龙', '飞鸾', '飞鸣', '飞鹏', '飞扬', '飞文', '飞翔', '飞星', '飞翼', '飞英', '飞宇', '飞羽', '飞雨', '飞语', '飞跃', '飞章', '飞舟', '风华', '丰茂', '丰羽', '刚豪', '刚洁', '刚捷', '刚毅', '高昂', '高岑', '高畅', '高超', '高驰', '高达', '高澹', '高飞', '高芬', '高峯', '高峰', '高歌', '高格', '高寒', '高翰', '高杰', '高洁', '高峻', '高朗', '高丽', '高邈', '高旻', '高明', '高爽', '高兴', '高轩', '高雅', '高扬', '高阳', '高义', '高谊', '高逸', '高懿', '高原', '高远', '高韵', '高卓', '光赫', '光华', '光辉', '光济', '光霁', '光亮', '光临', '光明', '光启', '光熙', '光耀', '光誉', '光远', '国安', '国兴', '国源', '冠宇', '冠玉', '晗昱', '晗日', '涵畅', '涵涤', '涵亮', '涵忍', '涵容', '涵润', '涵涵', '涵煦', '涵蓄', '涵衍', '涵意', '涵映', '涵育', '翰采', '翰池', '翰飞', '翰海', '翰翮', '翰林', '翰墨', '翰学', '翰音', '瀚玥', '翰藻', '瀚海', '瀚漠', '昊苍', '昊昊', '昊空', '昊乾', '昊穹', '昊然', '昊然', '昊天', '昊焱', '昊英', '浩波', '浩博', '浩初', '浩大', '浩宕', '浩荡', '浩歌', '浩广', '浩涆', '浩瀚', '浩浩', '浩慨', '浩旷', '浩阔', '浩漫', '浩淼', '浩渺', '浩邈', '浩气', '浩然', '浩穰', '浩壤', '浩思', '浩言', '皓轩', '和蔼', '和安', '和璧', '和昶', '和畅', '和风', '和歌', '和光', '和平', '和洽', '和惬', '和顺', '和硕', '和颂', '和泰', '和悌', '和通', '和同', '和煦', '和雅', '和宜', '和怡', '和玉', '和裕', '和豫', '和悦', '和韵', '和泽', '和正', '和志', '鹤轩', '弘博', '弘大', '弘方', '弘光', '弘和', '弘厚', '弘化', '弘济', '弘阔', '弘亮', '弘量', '弘深', '弘盛', '弘图', '弘伟', '弘文', '弘新', '弘雅', '弘扬', '弘业', '弘义', '弘益', '弘毅', '弘懿', '弘致', '弘壮', '宏伯', '宏博', '宏才', '宏畅', '宏达', '宏大', '宏放', '宏富', '宏峻', '宏浚', '宏恺', '宏旷', '宏阔', '宏朗', '宏茂', '宏邈', '宏儒', '宏深', '宏胜', '宏盛', '宏爽', '宏硕', '宏伟', '宏扬', '宏义', '宏逸', '宏毅', '宏远', '宏壮', '鸿宝', '鸿波', '鸿博', '鸿才', '鸿彩', '鸿畅', '鸿畴', '鸿达', '鸿德', '鸿飞', '鸿风', '鸿福', '鸿光', '鸿晖', '鸿朗', '鸿文', '鸿熙', '鸿羲', '鸿禧', '鸿信', '鸿轩', '鸿煊', '鸿煊', '鸿雪', '鸿羽', '鸿远', '鸿云', '鸿运', '鸿哲', '鸿祯', '鸿振', '鸿志', '鸿卓', '华奥', '华采', '华彩', '华灿', '华藏', '华池', '华翰', '华皓', '华晖', '华辉', '华茂', '华美', '华清', '华荣', '华容', '嘉赐', '嘉德', '嘉福', '嘉良', '嘉茂', '嘉木', '嘉慕', '嘉纳', '嘉年', '嘉平', '嘉庆', '嘉荣', '嘉容', '嘉瑞', '嘉胜', '嘉石', '嘉实', '嘉树', '嘉澍', '嘉熙', '嘉禧', '嘉祥', '嘉歆', '嘉许', '嘉勋', '嘉言', '嘉谊', '嘉懿', '嘉颖', '嘉佑', '嘉玉', '嘉誉', '嘉悦', '嘉运', '嘉泽', '嘉珍', '嘉祯', '嘉志', '嘉致', '坚白', '坚壁', '坚秉', '坚成', '坚诚', '建安', '建白', '建柏', '建本', '建弼', '建德', '建华', '建明', '建茗', '建木', '建树', '建同', '建修', '建业', '建义', '建元', '建章', '建中', '健柏', '金鑫', '锦程', '瑾瑜', '晋鹏', '经赋', '经亘', '经国', '经略', '经纶', '经纬', '经武', '经业', '经义', '经艺', '景澄', '景福', '景焕', '景辉', '景辉', '景龙', '景明', '景山', '景胜', '景铄', '景天', '景同', '景曜', '靖琪', '君昊', '君浩', '俊艾', '俊拔', '俊弼', '俊才', '俊材', '俊驰', '俊楚', '俊达', '俊德', '俊发', '俊风', '俊豪', '俊健', '俊杰', '俊捷', '俊郎', '俊力', '俊良', '俊迈', '俊茂', '俊美', '俊民', '俊名', '俊明', '俊楠', '俊能', '俊人', '俊爽', '俊悟', '俊晤', '俊侠', '俊贤', '俊雄', '俊雅', '俊彦', '俊逸', '俊英', '俊友', '俊语', '俊誉', '俊远', '俊哲', '俊喆', '俊智', '峻熙', '季萌', '季同', '开畅', '开诚', '开宇', '开济', '开霁', '开朗', '凯安', '凯唱', '凯定', '凯风', '凯复', '凯歌', '凯捷', '凯凯', '凯康', '凯乐', '凯旋', '凯泽', '恺歌', '恺乐', '康安', '康伯', '康成', '康德', '康复', '康健', '康乐', '康宁', '康平', '康胜', '康盛', '康时', '康适', '康顺', '康泰', '康裕', '乐安', '乐邦', '乐成', '乐池', '乐和', '乐家', '乐康', '乐人', '乐容', '乐山', '乐生', '乐圣', '乐水', '乐天', '乐童', '乐贤', '乐心', '乐欣', '乐逸', '乐意', '乐音', '乐咏', '乐游', '乐语', '乐悦', '乐湛', '乐章', '乐正', '乐志', '黎昕', '黎明', '力夫', '力强', '力勤', '力行', '力学', '力言', '立诚', '立果', '立人', '立辉', '立轩', '立群', '良奥', '良弼', '良才', '良材', '良策', '良畴', '良工', '良翰', '良吉', '良骥', '良俊', '良骏', '良朋', '良平', '良哲', '理群', '理全', '茂才', '茂材', '茂德', '茂典', '茂实', '茂学', '茂勋', '茂彦', '敏博', '敏才', '敏达', '敏叡', '敏学', '敏智', '明诚', '明达', '明德', '明辉', '明杰', '明俊', '明朗', '明亮', '明旭', '明煦', '明轩', '明远', '明哲', '明喆', '明知', '明志', '明智', '明珠', '朋兴', '朋义', '彭勃', '彭薄', '彭湃', '彭彭', '彭魄', '彭越', '彭泽', '彭祖', '鹏程', '鹏池', '鹏飞', '鹏赋', '鹏海', '鹏鲸', '鹏举', '鹏鹍', '鹏鲲', '鹏涛', '鹏天', '鹏翼', '鹏云', '鹏运', '濮存', '溥心', '璞玉', '璞瑜', '浦和', '浦泽', '奇略', '奇迈', '奇胜', '奇水', '奇思', '奇邃', '奇伟', '奇玮', '奇文', '奇希', '奇逸', '奇正', '奇志', '奇致', '祺福', '祺然', '祺祥', '祺瑞', '琪睿', '庆生', '荣轩', '锐达', '锐锋', '锐翰', '锐进', '锐精', '锐立', '锐利', '锐思', '锐逸', '锐意', '锐藻', '锐泽', '锐阵', '锐志', '锐智', '睿博', '睿才', '睿诚', '睿慈', '睿聪', '睿达', '睿德', '睿范', '睿广', '睿好', '睿明', '睿识', '睿思', '绍辉', '绍钧', '绍祺', '绍元', '升荣', '圣杰', '晟睿', '思聪', '思淼', '思源', '思远', '思博', '斯年', '斯伯', '泰初', '泰和', '泰河', '泰鸿', '泰华', '泰宁', '泰平', '泰清', '泰然', '天材', '天成', '天赋', '天干', '天罡', '天工', '天翰', '天和', '天华', '天骄', '天空', '天禄', '天路', '天瑞', '天睿', '天逸', '天佑', '天宇', '天元', '天韵', '天泽', '天纵', '同方', '同甫', '同光', '同和', '同化', '同济', '巍昂', '巍然', '巍奕', '伟博', '伟毅', '伟才', '伟诚', '伟茂', '伟懋', '伟祺', '伟彦', '伟晔', '伟泽', '伟兆', '伟志', '温纶', '温茂', '温书', '温韦', '温文', '温瑜', '文柏', '文昌', '文成', '文德', '文栋', '文赋', '文光', '文翰', '文虹', '文华', '文康', '文乐', '文林', '文敏', '文瑞', '文山', '文石', '文星', '文轩', '文宣', '文彦', '文曜', '文耀', '文斌', '文彬', '文滨', '向晨', '向笛', '向文', '向明', '向荣', '向阳', '翔宇', '翔飞', '项禹', '项明', '晓博', '心水', '心思', '心远', '欣德', '欣嘉', '欣可', '欣然', '欣荣', '欣怡', '欣怿', '欣悦', '新翰', '新霁', '新觉', '新立', '新荣', '新知', '信鸿', '信厚', '信鸥', '信然', '信瑞', '兴安', '兴邦', '兴昌', '兴朝', '兴德', '兴发', '兴国', '兴怀', '兴平', '兴庆', '兴生', '兴思', '兴腾', '兴旺', '兴为', '兴文', '兴贤', '兴修', '兴学', '兴言', '兴业', '兴运', '星波', '星辰', '星驰', '星光', '星海', '星汉', '星河', '星华', '星晖', '星火', '星剑', '星津', '星阑', '星纬', '星文', '星宇', '星雨', '星渊', '星洲', '修诚', '修德', '修杰', '修洁', '修谨', '修筠', '修明', '修能', '修平', '修齐', '修然', '修为', '修伟', '修文', '修雅', '修永', '修远', '修真', '修竹', '修贤', '旭尧', '炫明', '学博', '学海', '学林', '学民', '学名', '学文', '学义', '学真', '雪松', '雪峰', '雪风', '雅昶', '雅畅', '雅达', '雅惠', '雅健', '雅珺', '雅逸', '雅懿', '雅志', '炎彬', '阳飙', '阳飇', '阳冰', '阳波', '阳伯', '阳成', '阳德', '阳华', '阳晖', '阳辉', '阳嘉', '阳平', '阳秋', '阳荣', '阳舒', '阳朔', '阳文', '阳曦', '阳夏', '阳旭', '阳煦', '阳炎', '阳焱', '阳曜', '阳羽', '阳云', '阳泽', '阳州', '烨赫', '烨华', '烨磊', '烨霖', '烨然', '烨烁', '烨伟', '烨烨', '烨熠', '烨煜', '毅然', '逸仙', '逸明', '逸春', '宜春', '宜民', '宜年', '宜然', '宜人', '宜修', '意远', '意蕴', '意致', '意智', '熠彤', '懿轩', '英飙', '英博', '英才', '英达', '英发', '英范', '英光', '英豪', '英华', '英杰', '英朗', '英锐', '英睿', '英叡', '英韶', '英卫', '英武', '英悟', '英勋', '英彦', '英耀', '英奕', '英逸', '英毅', '英哲', '英喆', '英卓', '英资', '英纵', '永怡', '永春', '永安', '永昌', '永长', '永丰', '永福', '永嘉', '永康', '永年', '永宁', '永寿', '永思', '永望', '永新', '永言', '永逸', '永元', '永贞', '咏德', '咏歌', '咏思', '咏志', '勇男', '勇军', '勇捷', '勇锐', '勇毅', '宇达', '宇航', '宇寰', '宇文', '宇荫', '雨伯', '雨华', '雨石', '雨信', '雨星', '雨泽', '玉宸', '玉成', '玉龙', '玉泉', '玉山', '玉石', '玉书', '玉树', '玉堂', '玉轩', '玉宇', '玉韵', '玉泽', '煜祺', '元白', '元德', '元化', '元基', '元嘉', '元甲', '元驹', '元凯', '元恺', '元魁', '元良', '元亮', '元龙', '元明', '元青', '元思', '元纬', '元武', '元勋', '元正', '元忠', '元洲', '远航', '苑博', '苑杰', '越彬', '蕴涵', '蕴和', '蕴藉', '展鹏', '哲瀚', '哲茂', '哲圣', '哲彦', '振海', '振国', '正诚', '正初', '正德', '正浩', '正豪', '正平', '正奇', '正青', '正卿', '正文', '正祥', '正信', '正雅', '正阳', '正业', '正谊', '正真', '正志', '志诚', '志新', '志勇', '志明', '志国', '志强', '志尚', '志专', '志文', '志行', '志学', '志业', '志义', '志用', '志泽', '致远', '智明', '智鑫', '智勇', '智敏', '智志', '智渊', '子安', '子晋', '子民', '子明', '子默', '子墨', '子平', '子琪', '子石', '子实', '子真', '子濯', '子昂', '子轩', '子瑜', '自明', '自强', '作人', '自怡', '自珍', '曾琪', '泽宇', '泽语', '碧灵', '诗柳', '夏柳', '采白', '慕梅', '乐安', '冬菱', '紫安', '宛凝', '雨雪', '易真', '安荷', '静竹', '代柔', '丹秋', '绮梅', '依白', '凝荷', '幼珊', '忆彤', '凌青', '之桃', '芷荷', '听荷', '代玉', '念珍', '梦菲', '夜春', '千秋', '白秋', '谷菱', '飞松', '初瑶', '惜灵', '恨瑶', '梦易', '新瑶', '曼梅', '碧曼', '友瑶', '雨兰', '夜柳', '香蝶', '盼巧', '芷珍', '香卉', '含芙', '夜云', '凝雁', '以莲', '易容', '元柳', '安南', '幼晴', '尔琴', '飞阳', '白凡', '沛萍', '雪瑶', '向卉', '采文', '乐珍', '寒荷', '觅双', '白桃', '安卉', '迎曼', '盼雁', '乐松', '涵山', '恨寒', '问枫', '以柳', '含海', '秋春', '翠曼', '忆梅', '涵柳', '梦香', '海蓝', '晓曼', '代珊', '春冬', '恨荷', '忆丹', '静芙', '绮兰', '梦安', '紫丝', '千雁', '凝珍', '香萱', '梦容', '飞柏', '天真', '翠琴', '寄真', '秋荷', '代珊', '初雪', '雅柏', '怜容', '如风', '南露', '紫易', '冰凡', '海雪', '语蓉', '碧玉', '翠岚', '语风', '盼丹', '痴旋', '凝梦', '从雪', '白枫', '傲云', '白梅', '念露', '慕凝', '雅柔', '盼柳', '半青', '从霜', '怀柔', '怜晴', '夜蓉', '代双', '以南', '若菱', '芷文', '寄春', '南晴', '恨之', '梦寒', '初翠', '灵波', '巧春', '问夏', '凌春', '惜海', '亦旋', '沛芹', '幼萱', '白凝', '初露', '迎海', '绮玉', '凌香', '寻芹', '秋柳', '尔白', '映真', '含雁', '寒松', '友珊', '寻雪', '忆柏', '秋柏', '巧风', '恨蝶', '青烟', '问蕊', '灵阳', '春枫', '又儿', '雪巧', '丹萱', '凡双', '孤萍', '紫菱', '寻凝', '傲柏', '傲儿', '灵枫', '尔丝', '曼凝', '若蕊', '问丝', '思枫', '水卉', '问梅', '念寒', '诗双', '翠霜', '夜香', '寒蕾', '凡阳', '冷玉', '平彤', '语薇', '幻珊', '紫夏', '凌波', '芷蝶', '丹南', '之双', '凡波', '思雁', '白莲', '从菡', '如容', '采柳', '沛岚', '惜儿', '夜玉', '水儿', '半凡', '语海', '听莲', '幻枫', '念柏', '冰珍', '思山', '凝蕊', '天玉', '问香', '思萱', '向梦', '夏旋', '之槐', '元灵', '以彤', '采萱', '巧曼', '绿兰', '平蓝', '问萍', '绿蓉', '碧曼', '思卉', '白柏', '妙菡', '怜阳', '雨柏', '雁菡', '梦之', '又莲', '乐荷', '寒天', '凝琴', '书南', '映天', '白梦', '初瑶', '恨竹', '平露', '含巧', '慕蕊', '半莲', '醉卉', '天菱', '青雪', '雅旋', '巧荷', '飞丹', '恨云', '若灵', '尔云', '幻天', '诗兰', '青梦', '灵槐', '忆秋', '寒凝', '凝芙', '绮山', '静白', '尔蓉', '尔冬', '映萱', '白筠', '冰双', '访彤', '绿柏', '夏云', '笑翠', '晓灵', '含双', '盼波', '以云', '怜翠', '雁风', '之卉', '平松', '问儿', '绿柳', '如蓉', '曼容', '天晴', '丹琴', '惜天', '寻琴', '痴春', '依瑶', '涵易', '忆灵', '从波', '依柔', '问兰', '山晴', '怜珊', '之云', '飞双', '傲白', '沛春', '雨南', '梦之', '笑阳', '代容', '友琴', '雁梅', '友桃', '从露', '语柔', '傲玉', '觅夏', '晓蓝', '新晴', '雨莲', '凝旋', '绿旋', '幻香', '觅双', '冷亦', '忆雪', '友卉', '幻翠', '靖柔', '寻菱', '丹翠', '安阳', '雅寒', '惜筠', '尔安', '雁易', '飞瑶', '夏兰', '沛蓝', '静丹', '山芙', '笑晴', '新烟', '笑旋', '雁兰', '凌翠', '秋莲', '书桃', '傲松', '语儿', '映菡', '初曼', '听云', '孤松', '初夏', '雅香', '语雪', '初珍', '白安', '冰薇', '诗槐', '冷玉', '冰巧', '之槐', '香柳', '问春', '夏寒', '半香', '诗筠', '新梅', '白曼', '安波', '从阳', '含桃', '曼卉', '笑萍', '晓露', '寻菡', '沛白', '平灵', '水彤', '安彤', '涵易', '乐巧', '依风', '紫南', '亦丝', '易蓉', '紫萍', '惜萱', '诗蕾', '寻绿', '诗双', '寻云', '孤丹', '谷蓝', '惜香', '谷枫', '山灵', '幻丝', '友梅', '从云', '雁丝', '盼旋', '幼旋', '尔蓝', '沛山', '代丝', '痴梅', '觅松', '冰香', '依玉', '冰之', '妙梦', '以冬', '碧春', '曼青', '冷菱', '雪曼', '安白', '香桃', '安春', '千亦', '凌蝶', '又夏', '沛凝', '翠梅', '书文', '雪卉', '乐儿', '傲丝', '安青', '初蝶', '寄灵', '惜寒', '雨竹', '冬莲', '绮南', '翠柏', '平凡', '亦玉', '孤兰', '秋珊', '新筠', '半芹', '夏瑶', '念文', '晓丝', '涵蕾', '雁凡', '谷兰', '灵凡', '凝云', '曼云', '丹彤', '夜梦', '从筠', '雁芙', '语蝶', '依波', '晓旋', '念之', '盼芙', '曼安', '采珊', '盼夏', '初柳', '迎天', '曼安', '南珍', '妙芙', '语柳', '含莲', '晓筠', '夏山', '尔容', '采春', '念梦', '傲南', '问薇', '雨灵', '凝安', '冰海', '初珍', '宛菡', '冬卉', '盼晴', '冷荷', '寄翠', '幻梅', '如凡', '语梦', '易梦', '千柔', '向露', '梦玉', '傲霜', '依霜', '灵松', '诗桃', '书蝶', '恨真', '冰蝶', '山槐', '以晴', '友易', '梦桃', '香菱', '孤云', '水蓉', '雅容', '飞烟', '雁荷', '代芙', '醉易', '夏烟', '山梅', '若南', '恨桃', '依秋', '依波', '香巧', '紫萱', '涵易', '忆之', '幻巧', '水风', '安寒', '白亦', '惜玉', '碧春', '怜雪', '听南', '念蕾', '梦竹', '千凡', '寄琴', '采波', '元冬', '思菱', '平卉', '笑柳', '雪卉', '南蓉', '谷梦', '巧兰', '绿蝶', '飞荷', '平安', '孤晴', '芷荷', '曼冬', '寻巧', '尔槐', '以旋', '绿蕊', '初夏', '依丝', '怜南', '千山', '雨安', '水风', '寄柔', '念巧', '幼枫', '凡桃', '新儿', '春翠', '夏波', '雨琴', '静槐', '元槐', '映阳', '飞薇', '小凝', '映寒', '傲菡', '谷蕊', '笑槐', '飞兰', '笑卉', '迎荷', '元冬', '书竹', '半烟', '绮波', '小之', '觅露', '夜雪', '春柔', '寒梦', '尔风', '白梅', '雨旋', '芷珊', '山彤', '尔柳', '沛柔', '灵萱', '沛凝', '白容', '乐蓉', '映安', '依云', '映冬', '凡雁', '梦秋', '醉柳', '梦凡', '秋巧', '若云', '元容', '怀蕾', '灵寒', '天薇', '白风', '访波', '亦凝', '易绿', '夜南', '曼凡', '亦巧', '白萱', '友安', '诗翠', '雪珍', '海之', '小蕊'];
exports.last_name = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '羿', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '宿', '', '怀', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '寿', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '广', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '万俟', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫', '尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于', '太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐', '徐离', '宇文', '长孙', '慕容', '司徒', '司空'];
exports.name_prefix = ['', ''];
exports.name_suffix = ['先生', '小姐', '女士', '', '', '', '', '老板', '阿姨', '大叔', '大爷', '小妹', '大姐'];
// address.js definitions
exports.br_state = [
'Acre',
'Alagoas',
'Amapá',
'Amazonas',
];
exports.br_state_abbr = [
'AC',
'AL',
];
exports.cn_city = [
'黑龙江省齐齐哈尔市',
'黑龙江省黑河市',
'黑龙江省鹤岗市',
'黑龙江省鸡西市',
'黑龙江省绥化市',
'黑龙江省牡丹江市',
'黑龙江省大庆市',
'黑龙江省大兴安岭地区',
'黑龙江省哈尔滨市',
'黑龙江省双鸭山市',
'黑龙江省佳木斯市',
'黑龙江省伊春市',
'黑龙江省七台河市',
'香港特别行政区',
'青海省黄南藏族自治州',
'青海省西宁市',
'青海省玉树藏族自治州',
'青海省海西蒙古族藏族自治州',
'青海省海南藏族自治州',
'青海省海北藏族自治州',
'青海省海东地区',
'青海省果洛藏族自治州',
'陕西省铜川市',
'陕西省西安市',
'陕西省渭南市',
'陕西省汉中市',
'陕西省榆林市',
'陕西省延安市',
'陕西省宝鸡市',
'陕西省安康市',
'陕西省商洛市',
'陕西省咸阳市',
'重庆市',
'辽宁省鞍山市',
'辽宁省阜新市',
'辽宁省锦州市',
'辽宁省铁岭市',
'辽宁省辽阳市',
'辽宁省葫芦岛市',
'辽宁省营口市',
'辽宁省盘锦市',
'辽宁省沈阳市',
'辽宁省本溪市',
'辽宁省朝阳市',
'辽宁省抚顺市',
'辽宁省大连市',
'辽宁省丹东市',
'贵州省黔西南布依族苗族自治州',
'贵州省黔南布依族苗族自治州',
'贵州省黔东南苗族侗族自治州',
'贵州省铜仁地区',
'贵州省遵义市',
'贵州省贵阳市',
'贵州省毕节地区',
'贵州省安顺市',
'贵州省六盘水市',
'西藏自治区阿里地区',
'西藏自治区那曲地区',
'西藏自治区林芝地区',
'西藏自治区昌都地区',
'西藏自治区日喀则地区',
'西藏自治区拉萨市',
'西藏自治区山南地区',
'福建省龙岩市',
'福建省莆田市',
'福建省福州市',
'福建省漳州市',
'福建省泉州市',
'福建省宁德市',
'福建省厦门市',
'福建省南平市',
'福建省三明市',
'甘肃省陇南市',
'甘肃省金昌市',
'甘肃省酒泉市',
'甘肃省白银市',
'甘肃省甘南藏族自治州',
'甘肃省武威市',
'甘肃省张掖市',
'甘肃省庆阳市',
'甘肃省平凉市',
'甘肃省定西市',
'甘肃省天水市',
'甘肃省嘉峪关市',
'甘肃省兰州市',
'甘肃省临夏回族自治州',
'澳门特别行政区',
'湖南省长沙市',
'湖南省郴州市',
'湖南省邵阳市',
'湖南省衡阳市',
'湖南省益阳市',
'湖南省湘西土家族苗族自治州',
'湖南省湘潭市',
'湖南省永州市',
'湖南省株洲市',
'湖南省怀化市',
'湖南省张家界市',
'湖南省常德市',
'湖南省岳阳市',
'湖南省娄底市',
'湖北省黄石市',
'湖北省黄冈市',
'湖北省随州市',
'湖北省鄂州市',
'湖北省襄樊市',
'湖北省荆门市',
'湖北省荆州市',
'湖北省神农架',
'湖北省武汉市',
'湖北省恩施土家族苗族自治州',
'湖北省宜昌市',
'湖北省孝感市',
'湖北省咸宁市',
'湖北省十堰市',
'海南省海口市',
'海南省三亚市',
'浙江省金华市',
'浙江省衢州市',
'浙江省舟山市',
'浙江省绍兴市',
'浙江省湖州市',
'浙江省温州市',
'浙江省杭州市',
'浙江省宁波市',
'浙江省嘉兴市',
'浙江省台州市',
'浙江省丽水市',
'河南省鹤壁市',
'河南省驻马店市',
'河南省郑州市',
'河南省许昌市',
'河南省焦作市',
'河南省濮阳市',
'河南省漯河市',
'河南省洛阳市',
'河南省新乡市',
'河南省开封市',
'河南省平顶山市',
'河南省安阳市',
'河南省商丘市',
'河南省周口市',
'河南省南阳市',
'河南省信阳市',
'河南省三门峡市',
'河北省邯郸市',
'河北省邢台市',
'河北省衡水市',
'河北省秦皇岛市',
'河北省石家庄市',
'河北省沧州市',
'河北省承德市',
'河北省张家口市',
'河北省廊坊市',
'河北省唐山市',
'河北省保定市',
'江西省鹰潭市',
'江西省赣州市',
'江西省萍乡市',
'江西省景德镇市',
'江西省新余市',
'江西省抚州市',
'江西省宜春市',
'江西省吉安市',
'江西省南昌市',
'江西省九江市',
'江西省上饶市',
'江苏省镇江市',
'江苏省连云港市',
'江苏省苏州市',
'江苏省盐城市',
'江苏省淮安市',
'江苏省泰州市',
'江苏省无锡市',
'江苏省扬州市',
'江苏省徐州市',
'江苏省常州市',
'江苏省宿迁市',
'江苏省南通市',
'江苏省南京市',
'新疆维吾尔自治区阿拉尔市',
'新疆维吾尔自治区阿勒泰地区',
'新疆维吾尔自治区阿克苏地区',
'新疆维吾尔自治区石河子市',
'新疆维吾尔自治区昌吉回族自治州',
'新疆维吾尔自治区巴音郭楞蒙古自治州',
'新疆维吾尔自治区塔城地区',
'新疆维吾尔自治区图木舒克市',
'新疆维吾尔自治区喀什地区',
'新疆维吾尔自治区哈密地区',
'新疆维吾尔自治区和田地区',
'新疆维吾尔自治区吐鲁番地区',
'新疆维吾尔自治区博尔塔拉蒙古自治州',
'新疆维吾尔自治区克拉玛依市',
'新疆维吾尔自治区克孜勒苏柯尔克孜自治州',
'新疆维吾尔自治区伊犁哈萨克自治州',
'新疆维吾尔自治区五家渠市',
'新疆维吾尔自治区乌鲁木齐市',
'广西壮族自治区防城港市',
'广西壮族自治区钦州市',
'广西壮族自治区贺州市',
'广西壮族自治区贵港市',
'广西壮族自治区百色市',
'广西壮族自治区玉林市',
'广西壮族自治区河池市',
'广西壮族自治区梧州市',
'广西壮族自治区桂林市',
'广西壮族自治区柳州市',
'广西壮族自治区来宾市',
'广西壮族自治区崇左市',
'广西壮族自治区南宁市',
'广西壮族自治区北海市',
'广东省韶关市',
'广东省阳江市',
'广东省茂名市',
'广东省肇庆市',
'广东省珠海市',
'广东省潮州市',
'广东省湛江市',
'广东省清远市',
'广东省深圳市',
'广东省河源市',
'广东省江门市',
'广东省汕尾市',
'广东省汕头市',
'广东省梅州市',
'广东省揭阳市',
'广东省惠州市',
'广东省广州市',
'广东省佛山市',
'广东省云浮市',
'广东省中山市',
'广东省东莞市',
'山西省阳泉市',
'山西省长治市',
'山西省运城市',
'山西省朔州市',
'山西省晋城市',
'山西省晋中市',
'山西省忻州市',
'山西省太原市',
'山西省大同市',
'山西省吕梁市',
'山西省临汾市',
'山东省青岛市',
'山东省菏泽市',
'山东省莱芜市',
'山东省聊城市',
'山东省烟台市',
'山东省潍坊市',
'山东省滨州市',
'山东省淄博市',
'山东省济宁市',
'山东省济南市',
'山东省泰安市',
'山东省枣庄市',
'山东省日照市',
'山东省德州市',
'山东省威海市',
'山东省临沂市',
'山东省东营市',
'安徽省黄山市',
'安徽省马鞍山市',
'安徽省阜阳市',
'安徽省铜陵市',
'安徽省蚌埠市',
'安徽省芜湖市',
'安徽省滁州市',
'安徽省淮南市',
'安徽省淮北市',
'安徽省池州市',
'安徽省巢湖市',
'安徽省宿州市',
'安徽省宣城市',
'安徽省安庆市',
'安徽省合肥市',
'安徽省六安市',
'安徽省亳州市',
'宁夏回族自治区银川市',
'宁夏回族自治区石嘴山市',
'宁夏回族自治区固原市',
'宁夏回族自治区吴忠市',
'宁夏回族自治区中卫市',
'天津市',
'四川省雅安市',
'四川省阿坝藏族羌族自治州',
'四川省遂宁市',
'四川省达州市',
'四川省资阳市',
'四川省自贡市',
'四川省绵阳市',
'四川省眉山市',
'四川省甘孜藏族自治州',
'四川省泸州市',
'四川省攀枝花市',
'四川省成都市',
'四川省德阳市',
'四川省广安市',
'四川省广元市',
'四川省巴中市',
'四川省宜宾市',
'四川省南充市',
'四川省凉山彝族自治州',
'四川省内江市',
'四川省乐山市',
'吉林省长春市',
'吉林省通化市',
'吉林省辽源市',
'吉林省白山市',
'吉林省白城市',
'吉林省松原市',
'吉林省延边朝鲜族自治州',
'吉林省四平市',
'吉林省吉林市',
'台湾省台湾省',
'北京市',
'内蒙古自治区阿拉善盟',
'内蒙古自治区锡林郭勒盟',
'内蒙古自治区鄂尔多斯市',
'内蒙古自治区通辽市',
'内蒙古自治区赤峰市',
'内蒙古自治区巴彦淖尔市',
'内蒙古自治区呼和浩特市',
'内蒙古自治区呼伦贝尔市',
'内蒙古自治区包头市',
'内蒙古自治区兴安盟',
'内蒙古自治区乌海市',
'内蒙古自治区乌兰察布市',
'云南省迪庆藏族自治州',
'云南省西双版纳傣族自治州',
'云南省红河哈尼族彝族自治州',
'云南省玉溪市',
'云南省楚雄彝族自治州',
'云南省曲靖市',
'云南省普洱市',
'云南省昭通市',
'云南省昆明市',
'云南省文山壮族苗族自治州',
'云南省怒江傈僳族自治州',
'云南省德宏傣族景颇族自治州',
'云南省大理白族自治州',
'云南省保山市',
'云南省丽江市',
'云南省临沧市',
'上海市',
];
exports.cn_state_abbr = ['', '', '', '', '内蒙古', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '陕、秦', '', '', '', '', '', '', ''];
exports.city_prefix = [''];
exports.city_suffix = ['', ''];
exports.street_suffix = ['', '大街', '', '', ''];
// exports.street_suffix = ["路", "大街", "弄", "新村", "花苑", "花园", "小区", "站", "村", "园"];
exports.uk_county = ['Avon', 'Bedfordshire', 'Berkshire', 'Borders', 'Buckinghamshire', 'Cambridgeshire', 'Central', 'Cheshire', 'Cleveland', 'Clwyd', 'Cornwall', 'County Antrim', 'County Armagh', 'County Down', 'County Fermanagh', 'County Londonderry', 'County Tyrone', 'Cumbria', 'Derbyshire', 'Devon', 'Dorset', 'Dumfries and Galloway', 'Durham', 'Dyfed', 'East Sussex', 'Essex', 'Fife', 'Gloucestershire', 'Grampian', 'Greater Manchester', 'Gwent', 'Gwynedd County', 'Hampshire', 'Herefordshire', 'Hertfordshire', 'Highlands and Islands', 'Humberside', 'Isle of Wight', 'Kent', 'Lancashire', 'Leicestershire', 'Lincolnshire', 'Lothian', 'Merseyside', 'Mid Glamorgan', 'Norfolk', 'North Yorkshire', 'Northamptonshire', 'Northumberland', 'Nottinghamshire', 'Oxfordshire', 'Powys', 'Rutland', 'Shropshire', 'Somerset', 'South Glamorgan', 'South Yorkshire', 'Staffordshire', 'Strathclyde', 'Suffolk', 'Surrey', 'Tayside', 'Tyne and Wear', 'Warwickshire', 'West Glamorgan', 'West Midlands', 'West Sussex', 'West Yorkshire', 'Wiltshire', 'Worcestershire'];
exports.uk_country = ['England', 'Scotland', 'Wales', 'Northern Ireland'];
// internet.js definitions
exports.catch_phrase_adjective = ['Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Face to face', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented'];
exports.catch_phrase_descriptor = ['24 hour', '24/7', '3rd generation', '4th generation', '5th generation', '6th generation', 'actuating', 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', 'eco-centric', 'empowering', 'encompassing', 'even-keeled', 'executive', 'explicit', 'exuding', 'fault-tolerant', 'foreground', 'fresh-thinking', 'full-range', 'global', 'grid-enabled', 'heuristic', 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leading edge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', 'multi-tasking', 'national', 'needs-based', 'neutral', 'next generation', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', 'well-modulated', 'zero administration', 'zero defect', 'zero tolerance'];
exports.catch_phrase_noun = ['ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', 'architecture', 'archive', 'artificial intelligence', 'array', 'attitude', 'benchmark', 'budgetary management', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', 'concept', 'conglomeration', 'contingency', 'core', 'customer loyalty', 'database', 'data-warehouse', 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focus group', 'forecast', 'frame', 'framework', 'function', 'functionalities', 'Graphic Interface', 'groupware', 'Graphical User Interface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', 'infrastructure', 'initiative', 'installation', 'instruction set', 'interface', 'internet solution', 'intranet', 'knowledge user', 'knowledge base', 'local area network', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', 'open architecture', 'open system', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', 'pricing structure', 'process improvement', 'product', 'productivity', 'project', 'projection', 'protocol', 'secured line', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', 'success', 'superstructure', 'support', 'synergy', 'system engine', 'task-force', 'throughput', 'time-frame', 'toolset', 'utilisation', 'website', 'workforce'];
exports.bs_adjective = ['宋 朱熹', '沈从文', '鲁迅', '', '', '众多', '出色', '优秀', '', '', '', '', '', '绿', '', '', '', '直接', '热情', '最大', '', '形容词', '区别词'];
exports.bs_buzz = ['宋 朱熹', '沈从文', '鲁迅', '', '', '众多', '出色', '优秀', '', '', '', '', '', '绿', '', '', '', '直接', '热情', '最大', '', '形容词', '区别词'];
exports.bs_noun = ['回民', '小学', '教师', '党支部', '应聘者', '青年', '小伙子', '教师', '乡党', '支部', '', '人民政府', '情况', '', '姑娘', '文化', '夜校', '', '青年', '文化学', '技术', '小学', '教师', '', '牡丹', '被单'];
exports.domain_suffix = ['com', 'cn', 'net', 'biz', 'info', 'name', 'io', 'org', 'biz', 'tv', 'me'];
// lorem.js definitions
exports.lorem = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '使', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '广', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '西', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '西', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '西', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '怀', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '怀', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '广', '西', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
// phone_number.js definitions
exports.phone_formats = [
'0###-#######',
'0###-########',
'0###-#######-###',
'#######',
'########',
'13#########',
'15#########',
'18#########',
'0##-########',
'+8613#########',
'+8615#########',
'+8618#########',
'400-####-####',
'800-####-####',
'1####',
];
const Random = require('./random');
const Helpers = require('./helpers');
const getEmail = {
email() {
return `${Helpers.slugify(this.userName())}@${Helpers.slugify(this.domainName())}`;
},
userName() {
let result;
switch (Random.number(2)) {
case 0:
result = Random.first_name();
break;
default:
result = Random.first_name() + Random.array_element(['.', '_']) + Random.last_name();
break;
}
return result;
},
domainName() {
return `${this.domainWord()}.${Random.domain_suffix()}`;
},
domainWord() {
return Random.first_name().toLowerCase();
},
ip() {
const randNum = () => (Math.random() * 254 + 1).toFixed(0);
const result = [];
for (let i = 0; i < 4; i += 1) {
result[i] = randNum();
}
return result.join('.');
},
};
module.exports = getEmail;
const pinyin = require('pinyin');
const _ = require('lodash');
// parses string for a symbol and replace it with a random number from 1-10
exports.replaceSymbolWithNumber = (string, _symbol) => {
// default symbol is '#'
const symbol = _symbol || '#';
return string.split('').map((item) => {
if (item === symbol) {
return _.random(1, 9);
}
return item;
}).join('');
};
// slugifies string
exports.slugify = string => pinyin(string)
.join('')
.toLowerCase()
.replace(/ /g, '-')
.replace(/[^\w.-]+/g, '');
module.exports.getMoble = () => {
const prefixArray = ['130', '131', '132', '133', '135', '137', '138', '170', '187', '189'];
let prefix = prefixArray[parseInt(prefixArray.length * Math.random(), 10)];
for (let j = 0; j < 8; j += 1) {
prefix += Math.floor(Math.random() * 10);
}
return prefix;
};
This source diff could not be displayed because it is too large. You can view the blob instead.
const Random = require('./random');
const name = {
firstName() {
return Random.first_name();
},
lastName() {
return Random.last_name();
},
getName() {
return this.lastName() + this.firstName();
},
};
module.exports = name;
const definitions = require('./definitions');
const random = {
// returns a single random number based on a range
number(range) {
return Math.floor(Math.random() * range);
},
// 生成一定范围的随机数
randomBy(under, over) {
switch (arguments.length) {
case 1:
return parseInt(Math.random() * under + 1, 10);
case 2:
return parseInt(Math.random() * (over - under + 1) + under, 10);
default:
return 0;
}
},
// takes an array and returns the array randomly sorted
array_element(array) {
const r = Math.floor(Math.random() * array.length);
return array[r];
},
city_prefix() {
return this.array_element(definitions.city_prefix);
},
city_suffix() {
return this.array_element(definitions.city_suffix);
},
street_suffix() {
return this.array_element(definitions.street_suffix);
},
br_state() {
return this.array_element(definitions.br_state);
},
br_state_abbr() {
return this.array_element(definitions.br_state_abbr);
},
cn_state() {
return this.array_element(definitions.cn_state);
},
cn_city(filter) {
return this.array_element(definitions.cn_city.filter(item => item.indexOf(filter || '') !== -1));
},
cn_state_abbr() {
return this.array_element(definitions.cn_state_abbr);
},
uk_county() {
return this.array_element(definitions.uk_county);
},
uk_country() {
return this.array_element(definitions.uk_country);
},
first_name() {
return this.array_element(definitions.first_name);
},
last_name() {
return this.array_element(definitions.last_name);
},
name_prefix() {
return this.array_element(definitions.name_prefix);
},
name_suffix() {
return this.array_element(definitions.name_suffix);
},
catch_phrase_adjective() {
return this.array_element(definitions.catch_phrase_adjective);
},
catch_phrase_descriptor() {
return this.array_element(definitions.catch_phrase_descriptor);
},
catch_phrase_noun() {
return this.array_element(definitions.catch_phrase_noun);
},
bs_adjective() {
return this.array_element(definitions.bs_adjective);
},
bs_buzz() {
return this.array_element(definitions.bs_buzz);
},
bs_noun() {
return this.array_element(definitions.bs_noun);
},
phone_formats() {
return this.array_element(definitions.phone_formats);
},
domain_suffix() {
return this.array_element(definitions.domain_suffix);
},
};
module.exports = random;
const path = require('path');
const logPath = path.resolve(__dirname, '../logs');
// const layout = { type: 'pattern', pattern: '%d{yyyy-MM-dd hh:mm:ss.SSS} %p %c %m%n' };
module.exports = {
log4js: {
path: logPath,
conf: {
appenders: {
default: { type: 'console' },
file: {
type: 'dateFile',
filename: `${logPath}/sys-api.log`,
pattern: '.yyyy-MM-dd',
keepFileExt: true,
},
},
categories: {
default: { appenders: ['default', 'file'], level: 'info' },
file: { appenders: ['file'], level: 'info' },
},
},
},
};
'use strict';
const fs = require('fs');
const curPath = __dirname;
fs.readdirSync(curPath).forEach((item) => {
let filePath = `${curPath}/${item}/index.js`;
if (fs.existsSync(filePath)) {
exports[item] = require(filePath)
}
})
'use strict';
import path from 'path'
import http from 'http'
import Koa from 'koa'
import router from '../index'
const app = new Koa()
app.use(router(app, {
root: path.resolve(__dirname, './controller'),
default_path: '/index',
default_jump: true,
domain: '127.0.0.1',
errorPath: '/error/404'
}))
module.exports = http.createServer(app.callback());
module.exports = function*() {
function getData() {
return function(callback) {
setTimeout(function() {
callback(0, { data: 'this is defaultCtrl!' });
}, 100)
}
}
return yield getData();
}
exports['404'] = function* () {
this.body = '这是自定义的404页';
}
\ No newline at end of file
exports.generator = function*() {
this.body = 'hello world!';
}
exports.await = async function() {
this.body = 'hello world!';
}
exports.bindDefault = function*(argument) {
let result = yield this.bindDefault();
this.body = result.data;
}
exports.param = async function() {
this.body = this.params;
}
exports.param.__regular__ = '/:id1/:id2'
exports.post = function() {
this.body = 'hello world!';
}
exports.post.__method__ = 'post'
exports.test1 = {
aj_1: function() {
this.body = this.request.url;
},
aj_2: {
aj_2_1: function() {
this.body = this.request.url;
},
aj_2_2: function() {
this.body = this.request.url;
}
},
aj_3: {
aj_3_1: {
// 该路由层级超过三级,生成路由失败
aj_3_1_1: function() {
this.body = this.request.url;
}
}
}
}
exports.test2 = function*() {
this.body = this.request.url;
}
exports.test3 = function*() {
this.body = this.request.url;
}
exports.index = function*() {
this.body = this.request.url;
}
exports.index = function*() {
this.body = 'hello world!';
}
exports.index.__controller__ = false;
\ No newline at end of file
exports.index = function* () {
this.body = this.request.url;
}
exports.order = function* () {
this.body = this.request.url;
}
\ No newline at end of file
'use strict';
require("babel-register")({
"presets": ["es2015-node5"],
"plugins": [
"transform-async-to-generator",
"syntax-async-functions"
]
});
const app = require('./app');
app.listen(3001)
'use strict';
const path = require('path');
const fs = require('fs');
const _ = require('lodash');
const router = require('./lib/router');
const debug = require('debug')('koa-grace:router');
const error = require('debug')('koa-grace-error:router');
/**
* [_routerVerb 可以注册的方法]
* all = ['acl', 'bind', 'checkout', 'connect', 'copy', 'delete', 'get', 'head', 'link', 'lock', 'm-search', 'merge', 'mkactivity', 'mkcalendar', 'mkcol', 'move', 'notify', 'options', 'patch', 'post', 'propfind', 'proppatch', 'purge', 'put', 'rebind', 'report', 'search', 'subscribe', 'trace', 'unbind', 'unlink', 'unlock', 'unsubscribe' ]
* @all {会注册33个verb, 慎用!!!}
* delete {作为保留词,推荐使用别称:del}
*/
const _routerVerb = ['get', 'post', 'put', 'patch', 'del', 'head', 'delete', 'all', 'options'];
/**
* 生成路由控制
* @param {string} app context
* @param {object} options 配置项
* {string} options.root controller路径
* {string} options.defualt_jump 如果访问路径为纯域名是否做跳转,默认为false
* {string} options.default_path 默认路径
* {string} options.domain 请求域名,可不传
* @return {function}
*
* @todo lib/router.js this.MATCHS 中如果配置的规则路由特别多,内存溢出的风险
*/
module.exports = function graceRouter(app, options) {
if (typeof options === 'string') {
options = { root: options }
} else if (!options || !options.root) {
throw new Error('`root` config required.');
}
const Router = router(options);
const Domain = options.domain || '';
// app的默认路由
if (options.default_jump !== false && options.default_path) {
Router.redirect('/', options.default_path);
}
let root = options.root;
// 如果root不存在则直接跳过
if (!fs.existsSync(root)) {
error('error : can\'t find route path ' + root);
return function* ctrl(next) { yield next; };
}
_ls(root).forEach((filePath) => {
if (!/([a-zA-Z0-9_\-]+)(\.js)$/.test(filePath)) {
return;
}
try {
var exportFuncs = require(filePath);
} catch (err) {
console.error(`error: require ${filePath} error ${err}`);
return;
}
let pathRegexp = _formatPath(filePath, root);
getRoute(exportFuncs, (exportFun, ctrlpath) => {
_setRoute(Router, {
domain: Domain,
method: exportFun.__method__,
regular: exportFun.__regular__,
ctrlpath: ctrlpath,
ctrl: exportFun
}, options);
}, [pathRegexp]);
});
// 添加bindDefault方法
// 如果defaultCtrl文件存在则注入,否则忽略
let defaultCtrlRoot = options.defaultCtrlRoot || options.root;
let defaultCtrlPath = path.resolve(defaultCtrlRoot, 'defaultCtrl.js')
app.context.__defineGetter__("bindDefault", () => {
try {
return require(defaultCtrlPath);
} catch (err) {
return new Promise((resolve) => {
error(`Cannot find default controller '${defaultCtrlPath}'`)
resolve();
})
}
});
return async function graceRouter(ctx, next) {
await Router.routes()(ctx, next);
await next();
}
}
/**
* 递归生成路由,层级不超过3级
* @param {Object|Function} exportFuncs 获取到的路由
* @param {Array} ctrlpath 路由记录
* @return
*/
function getRoute(exportFuncs, cb, ctrlpath, curCtrlname) {
ctrlpath = ctrlpath || [];
// 如果当前设置了不是路由,则直接返回
if (exportFuncs.__controller__ === false) {
return;
}
let totalCtrlname = curCtrlname ? ctrlpath.concat([curCtrlname]) : ctrlpath;
// 只允许3级路由层级
if (ctrlpath.length > 3) {
debug(`嵌套路由对象层级不能超过3级:${totalCtrlname.join('/')}`);
return;
}
// 如果是一个方法就直接执行cb
if (typeof exportFuncs === 'function') {
cb(exportFuncs, totalCtrlname);
} else {
// 否则进行循环递归查询
for (let ctrlname in exportFuncs) {
if (!exportFuncs.hasOwnProperty(ctrlname)) {
continue
}
getRoute(exportFuncs[ctrlname], cb, totalCtrlname, ctrlname);
}
}
}
/**
* 查找目录中的所有文件
* @param {string} dir 查找路径
* @param {init} _pending 递归参数,忽略
* @param {array} _result 递归参数,忽略
* @return {array} 文件list
*/
function _ls(dir, _pending, _result) {
_pending = _pending ? _pending++ : 1;
_result = _result || [];
if (!path.isAbsolute(dir)) {
dir = path.join(process.cwd(), dir);
}
// if error, throw it
let stat = fs.lstatSync(dir);
if (stat.isDirectory()) {
let files = fs.readdirSync(dir);
files.forEach(function (part) {
_ls(path.join(dir, part), _pending, _result);
});
if (--_pending === 0) {
return _result;
}
} else {
_result.push(dir);
if (--_pending === 0) {
return _result;
}
}
}
/**
* 格式化文件路径为koa-router的path
* @param {string} filePath 文件路径
* @param {string} root router路径
* @return {string} 过滤之后的path
*/
function _formatPath(filePath, root) {
let dir = root;
if (!path.isAbsolute(root)) {
dir = path.join(process.cwd(), root);
}
// 修复windows下的\路径问题
dir = dir.replace(/\\/g, '/');
return filePath
.replace(/\\/g, '/')
.replace(dir, '')
.split('.')[0];
}
/**
* 设置路由
* @param {string} path 当前文件路径
* @param {object} config 配置项
* {string} config.method 当前请求方法:get,post等
* {string} config.regular 参考:https://github.com/alexmingoia/koa-router#nested-routers
* {string} config.ctrlname 当前controller名称
* {funtion} config.ctrl controller方法
* @param {Obejct} options grace router配置
*/
function _setRoute(Router, config, options) {
let paths = [];
// let method = config.method || 'get';
// let method = (_routerVerb.indexOf(config.method) > -1) ? [config.method] : ['get', 'post'];
let method = _.isArray(config.method) ? config.method :
(_routerVerb.indexOf(config.method) > -1) ? [config.method] : ['get'];
let ctrlpath = config.ctrlpath.join('/');
// 加入当前路由
paths.push(ctrlpath)
// 如果当前路由配置方案为不跳转,则设置路由'/'为options.default_path路由
if (options.default_jump === false && ctrlpath == options.default_path) {
paths.push('/');
}
// 如果当前路由是以index结尾,则把其父路由也加入路由
if (config.ctrlpath.slice(-1)[0] === 'index') {
let parpath = config.ctrlpath.slice(0, -1);
paths.push(parpath.join('/'));
}
// 如果有regular则加入regular路由
if (config.regular) {
paths.push(ctrlpath + config.regular);
}
// 对每一个method,有定义时唯一,默认post/get
method.forEach((_method) => {
// 注入路由
paths.forEach((pathItem) => {
debug(_method + ':' + config.domain + pathItem);
Router[_method](pathItem, config.ctrl);
});
});
}
var debug = require('debug')('koa-router');
var pathToRegExp = require('path-to-regexp');
module.exports = Layer;
/**
* Initialize a new routing Layer with given `method`, `path`, and `middleware`.
*
* @param {String|RegExp} path Path string or regular expression.
* @param {Array} methods Array of HTTP verbs.
* @param {Array} middleware Layer callback/middleware or series of.
* @param {Object=} opts
* @param {String=} opts.name route name
* @param {String=} opts.sensitive case sensitive (default: false)
* @param {String=} opts.strict require the trailing slash (default: false)
* @returns {Layer}
* @private
*/
function Layer(path, methods, middleware, opts) {
this.opts = opts || {};
this.name = this.opts.name || null;
this.methods = [];
this.paramNames = [];
this.stack = Array.isArray(middleware) ? middleware : [middleware];
methods.forEach(function(method) {
var l = this.methods.push(method.toUpperCase());
if (this.methods[l-1] === 'GET') {
this.methods.unshift('HEAD');
}
}, this);
// ensure middleware is a function
this.stack.forEach(function(fn) {
var type = (typeof fn);
if (type !== 'function') {
throw new Error(
methods.toString() + " `" + (this.opts.name || path) +"`: `middleware` "
+ "must be a function, not `" + type + "`"
);
}
}, this);
this.path = path;
this.regexp = pathToRegExp(path, this.paramNames, this.opts);
debug('defined route %s %s', this.methods, this.opts.prefix + this.path);
};
/**
* Returns whether request `path` matches route.
*
* @param {String} path
* @returns {Boolean}
* @private
*/
Layer.prototype.match = function (path) {
return this.regexp.test(path);
};
/**
* Returns map of URL parameters for given `path` and `paramNames`.
*
* @param {String} path
* @param {Array.<String>} captures
* @param {Object=} existingParams
* @returns {Object}
* @private
*/
Layer.prototype.params = function (path, captures, existingParams) {
var params = existingParams || {};
for (var len = captures.length, i=0; i<len; i++) {
if (this.paramNames[i]) {
var c = captures[i];
params[this.paramNames[i].name] = c ? safeDecodeURIComponent(c) : c;
}
}
return params;
};
/**
* Returns array of regexp url path captures.
*
* @param {String} path
* @returns {Array.<String>}
* @private
*/
Layer.prototype.captures = function (path) {
return path.match(this.regexp).slice(1);
};
/**
* Generate URL for route using given `params`.
*
* @example
*
* ```javascript
* var route = new Layer(['GET'], '/users/:id', fn);
*
* route.url({ id: 123 }); // => "/users/123"
* ```
*
* @param {Object} params url parameters
* @returns {String}
* @private
*/
Layer.prototype.url = function (params) {
var args = params;
var url = this.path;
var toPath = pathToRegExp.compile(url);
// argument is of form { key: val }
if (typeof params != 'object') {
args = Array.prototype.slice.call(arguments);
}
if (args instanceof Array) {
var tokens = pathToRegExp.parse(url);
var replace = {};
for (var len = tokens.length, i=0, j=0; i<len; i++) {
if (tokens[i].name) replace[tokens[i].name] = args[j++];
}
return toPath(replace);
}
else {
return toPath(params);
}
};
/**
* Run validations on route named parameters.
*
* @example
*
* ```javascript
* router
* .param('user', function *(id, next) {
* this.user = users[id];
* if (!user) return this.status = 404;
* yield next;
* })
* .get('/users/:user', function *(next) {
* this.body = this.user;
* });
* ```
*
* @param {String} param
* @param {Function} middleware
* @returns {Layer}
* @private
*/
Layer.prototype.param = function (param, fn) {
var stack = this.stack;
var params = this.paramNames;
var middleware = function *(next) {
next = fn.call(this, this.params[param], next);
if (typeof next.next === 'function') {
yield *next;
} else {
yield Promise.resolve(next);
}
};
middleware.param = param;
params.forEach(function (p, i) {
var prev = params[i - 1];
if (param === p.name) {
// insert param middleware in order params appear in path
if (prev) {
if (!stack.some(function (m, i) {
if (m.param === prev.name) {
return stack.splice(i, 0, middleware);
}
})) {
stack.some(function (m, i) {
if (!m.param) {
return stack.splice(i, 0, middleware);
}
});
}
} else {
stack.unshift(middleware);
}
}
});
return this;
};
/**
* Prefix route path.
*
* @param {String} prefix
* @returns {Layer}
* @private
*/
Layer.prototype.setPrefix = function (prefix) {
if (this.path) {
this.path = prefix + this.path;
this.paramNames = [];
this.regexp = pathToRegExp(this.path, this.paramNames, this.opts);
}
return this;
};
/**
* Safe decodeURIComponent, won't throw any error.
* If `decodeURIComponent` error happen, just return the original value.
*
* @param {String} text
* @returns {String} URL decode original string.
* @private
*/
function safeDecodeURIComponent(text) {
try {
return decodeURIComponent(text);
} catch (e) {
return text;
}
}
/**
* RESTful resource routing middleware for koa.
*
* @author Alex Mingoia <talk@alexmingoia.com>
* @link https://github.com/alexmingoia/koa-router
*/
'use strict';
const debug = require('debug')('koa-router');
const co = require('co');
const methods = require('methods');
const Layer = require('./layer');
/**
* @module koa-router
*/
module.exports = Router;
/**
* Create a new router.
*
* @example
*
* Basic usage:
*
* ```javascript
* var app = require('koa')();
* var router = require('koa-router')();
*
* router.get('/', function *(next) {...});
*
* app
* .use(router.routes())
* .use(router.allowedMethods());
* ```
*
* @alias module:koa-router
* @param {Object=} opts
* @param {String=} opts.prefix prefix router paths
* @constructor
*/
function Router(opts) {
if (!(this instanceof Router)) {
return new Router(opts);
}
this.opts = opts || {};
this.methods = this.opts.methods || [
'HEAD',
'OPTIONS',
'GET',
'PUT',
'PATCH',
'POST',
'DELETE'
];
this.params = {};
this.stack = [];
this.MATCHS = {};
};
methods.forEach((method) => {
Router.prototype[method] = function (name, path, middleware) {
var middleware;
if (typeof path === 'string' || path instanceof RegExp) {
middleware = Array.prototype.slice.call(arguments, 2);
} else {
middleware = Array.prototype.slice.call(arguments, 1);
path = name;
name = null;
}
this.register(path, [method], middleware, {
name: name
});
return this;
};
});
// Alias for `router.delete()` because delete is a reserved word
Router.prototype.del = Router.prototype['delete'];
/**
* Set the path prefix for a Router instance that was already initialized.
*
* @example
*
* ```javascript
* router.prefix('/things/:thing_id')
* ```
*
* @param {String} prefix
* @returns {Router}
*/
Router.prototype.prefix = function (prefix) {
prefix = prefix.replace(/\/$/, '');
this.opts.prefix = prefix;
this.stack.forEach(function (route) {
route.setPrefix(prefix);
});
return this;
};
/**
* Returns router middleware which dispatches a route matching the request.
*
* @returns {Function}
*/
Router.prototype.routes = Router.prototype.middleware = function () {
var router = this;
return async function dispatch(ctx, next) {
debug('%s %s', ctx.method, ctx.path);
var path = router.opts.routerPath || ctx.routerPath || ctx.path;
var matched = router.match(path, ctx.method);
// 如果匹配不到任何路由,则定位到错误页的控制器
if (!matched.route && ctx.method == 'GET' && router.opts.errorPath) {
path = router.opts.errorPath;
matched = router.match(path, ctx.method);
}
// 如果匹配到则逐一执行控制器
if (matched.pathAndMethod.length) {
let i = matched.pathAndMethod.length;
var mostSpecificPath = matched.pathAndMethod[i - 1].path
ctx._matchedRoute = mostSpecificPath
while (matched.route && i--) {
let layer = matched.pathAndMethod[i];
let ii = layer.stack.length;
ctx.captures = layer.captures(path, ctx.captures);
ctx.params = layer.params(path, ctx.captures, ctx.params);
debug('dispatch %s %s', layer.path, layer.regexp);
while (ii--) {
if (layer.stack[ii].constructor.name === 'GeneratorFunction') {
await co(layer.stack[ii].bind(ctx))
} else {
await layer.stack[ii].call(ctx);
}
}
}
}
}
};
/**
* Register route with all methods.
*
* @param {String} name Optional.
* @param {String} path
* @param {Function=} middleware You may also pass multiple middleware.
* @param {Function} callback
* @returns {Router}
* @private
*/
Router.prototype.all = function (name, path, middleware) {
var middleware;
if (typeof path === 'string') {
middleware = Array.prototype.slice.call(arguments, 2);
} else {
middleware = Array.prototype.slice.call(arguments, 1);
path = name;
name = null;
}
this.register(path, methods, middleware, {
name: name
});
return this;
};
/**
* Redirect `source` to `destination` URL with optional 30x status `code`.
*
* Both `source` and `destination` can be route names.
*
* ```javascript
* router.redirect('/login', 'sign-in');
* ```
*
* This is equivalent to:
*
* ```javascript
* router.all('/login', function *() {
* this.redirect('/sign-in');
* this.status = 301;
* });
* ```
*
* @param {String} source URL or route name.
* @param {String} destination URL or route name.
* @param {Number} code HTTP status code (default: 301).
* @returns {Router}
*/
Router.prototype.redirect = function (source, destination, code) {
// lookup source route by name
if (source[0] !== '/') {
source = this.url(source);
}
// lookup destination route by name
if (destination[0] !== '/') {
destination = this.url(destination);
}
return this.all(source, function () {
this.redirect(destination);
this.status = code || 301;
});
};
/**
* Create and register a route.
*
* @param {String} path Path string.
* @param {Array.<String>} methods Array of HTTP verbs.
* @param {Function} middleware Multiple middleware also accepted.
* @returns {Layer}
* @private
*/
Router.prototype.register = function (path, methods, middleware, opts) {
opts = opts || {};
let stack = this.stack;
// create route
let route = new Layer(path, methods, middleware, {
end: opts.end === false ? opts.end : true,
name: opts.name,
sensitive: opts.sensitive || this.opts.sensitive || false,
strict: opts.strict || this.opts.strict || false,
prefix: opts.prefix || this.opts.prefix || "",
});
if (this.opts.prefix) {
route.setPrefix(this.opts.prefix);
}
// add parameter middleware
Object.keys(this.params).forEach((param) => {
route.param(param, this.params[param]);
});
// register route with router
if (methods.length || !stack.length) {
// if we don't have parameters, put before any with same route
// nesting level but with parameters
let added = false;
if (!route.paramNames.length) {
let routeNestingLevel = route.path.toString().split('/').length;
added = stack.some((m, i) => {
let mNestingLevel = m.path.toString().split('/').length;
let isParamRoute = !!m.paramNames.length;
if (routeNestingLevel === mNestingLevel && isParamRoute) {
return stack.splice(i, 0, route);
}
});
}
if (!added) stack.push(route);
} else {
stack.some((m, i) => {
if (!m.methods.length && i === stack.length - 1) {
return stack.push(route);
} else if (m.methods.length) {
if (stack[i - 1]) {
return stack.splice(i, 0, route);
} else {
return stack.unshift(route);
}
}
});
}
return route;
};
/**
* Lookup route with given `name`.
*
* @param {String} name
* @returns {Layer|false}
*/
Router.prototype.route = function (name) {
var routes = this.stack;
for (var len = routes.length, i = 0; i < len; i++) {
if (routes[i].name && routes[i].name === name) {
return routes[i];
}
}
return false;
};
/**
* Generate URL for route. Takes a route name and map of named `params`.
*
* ```javascript
* router.get('user', '/users/:id', function *(next) {
* // ...
* });
*
* router.url('user', 3);
* // => "/users/3"
*
* router.url('user', { id: 3 });
* // => "/users/3"
* ```
*
* @param {String} name route name
* @param {Object} params url parameters
* @returns {String|Error}
*/
Router.prototype.url = function (name, params) {
var route = this.route(name);
if (route) {
var args = Array.prototype.slice.call(arguments, 1);
return route.url.apply(route, args);
}
return new Error("No route found for name: " + name);
};
/**
* Match given `path` and return corresponding routes.
*
* @param {String} path
* @param {String} method
* @returns {Object.<path, pathAndMethod>} returns layers that matched path and
* path and method.
* @private
*/
Router.prototype.match = function (path, method) {
var layers = this.stack;
var matched = {
path: [],
pathAndMethod: [],
route: false
};
let flag = `${method}:${path}`;
// 如果存在缓存的路径,则直接返回缓存的路由状态
// TODO: 如果配置的规则路由特别多,内存溢出的风险
if (this.MATCHS[flag]) return this.MATCHS[flag];
for (var len = layers.length, i = 0; i < len; i++) {
let layer = layers[i];
debug('test %s %s', layer.path, layer.regexp);
if (layer.match(path)) {
matched.path.push(layer);
if (layer.methods.length === 0 || ~layer.methods.indexOf(method)) {
matched.pathAndMethod.push(layer);
matched.route = true;
}
}
}
this.MATCHS[flag] = matched;
return matched;
};
/**
* Run middleware for named route parameters. Useful for auto-loading or
* validation.
*
* @example
*
* ```javascript
* router
* .param('user', function *(id, next) {
* this.user = users[id];
* if (!this.user) return this.status = 404;
* yield next;
* })
* .get('/users/:user', function *(next) {
* this.body = this.user;
* })
* .get('/users/:user/friends', function *(next) {
* this.body = yield this.user.getFriends();
* })
* // /users/3 => {"id": 3, "name": "Alex"}
* // /users/3/friends => [{"id": 4, "name": "TJ"}]
* ```
*
* @param {String} param
* @param {Function} middleware
* @returns {Router}
*/
Router.prototype.param = function (param, middleware) {
this.params[param] = middleware;
this.stack.forEach((route) => {
route.param(param, middleware);
});
return this;
};
/**
* Generate URL from url pattern and given `params`.
*
* @example
*
* ```javascript
* var url = Router.url('/users/:id', {id: 1});
* // => "/users/1"
* ```
*
* @param {String} path url pattern
* @param {Object} params url parameters
* @returns {String}
*/
Router.url = function (path, params) {
return Layer.prototype.url.call({ path: path }, params);
};
{
"name": "testdata-koa",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "./node_modules/.bin/nodemon app.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"kcors": "^2.2.2",
"koa": "^2.5.2",
"koa-favicon": "^2.0.1",
"koa-log4": "^2.3.0",
"koa-router": "^7.4.0",
"lodash": "^4.17.10",
"methods": "^1.1.2",
"path-to-regexp": "^2.4.0",
"pinyin": "^2.8.3"
},
"devDependencies": {
"eslint": "^5.5.0",
"eslint-config-airbnb-base": "^13.1.0",
"eslint-plugin-import": "^2.14.0",
"nodemon": "^1.18.4"
}
}
#!/bin/sh
source /etc/profile
pm2 start app.js --node-args="--harmony" -n testdata
\ No newline at end of file
#!/bin/sh
source /etc/profile
pm2 stop testdata
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment