Commit 25cd6869 by lixinming

搭建

parents
.idea
.vscode
/out
/node_modules
/test
*test*
*.log
\ No newline at end of file
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('data-server:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
{
"name": "gameserver",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/sms-sdk": "^1.1.6",
"@types/node": "^10.12.18",
"compression": "^1.7.4",
"express": "^4.17.1",
"express-async-handler": "^1.1.4",
"formidable": "^1.2.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
"moment": "^2.24.0",
"mongoose": "^5.4.0",
"mysql": "^2.18.1",
"node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"ws": "^5.2.2"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["孵化载体"] = get孵化载体();
ret["孵化载体占比数据"] = get孵化载体占比数据();
ret["孵化载体数量趋势"] = get孵化载体数量趋势();
ret["孵化载体投资主体"] = get孵化载体投资主体();
ret["孵化载体行业分类"] = get孵化载体行业分类();
ret["孵化载体运营"] = get孵化载体运营();
ret["平均营收趋势"] = get平均营收趋势();
ret["重要评价指标"] = get重要评价指标();
ret["服务资源"] = get服务资源();
ret["政策服务"] = get政策服务();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get孵化载体() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get孵化载体占比数据() {
return mock键值数据模板(2, 5, 'c', 1, true);
}
function get孵化载体数量趋势() {
return mock柱状图数据模板(11);
}
function get孵化载体投资主体() {
return mock键值数据模板(3, 2, 'c', 2, false);
}
function get孵化载体行业分类() {
return mock键值数据模板(5, 4, 'c', 2, false);
}
function get孵化载体运营() {
return mock键值数据模板(5, 2, 'c', 3, false);
}
function get平均营收趋势() {
return mock柱状图数据模板(7);
}
function get重要评价指标() {
return mock键值数据模板(4, 5, 'c', 3, false);
}
function get服务资源() {
return mock键值数据模板(8, 10, 'c', 3, false);
}
function get政策服务() {
return mock键值数据模板(2, 3, 'c', 4, false);
}
function get地图数据() {
return mock地图数据模板(100);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["上市企业板块分布"] = get上市企业板块分布();
ret["科创版企业"] = get科创版企业();
ret["挂牌企业"] = get挂牌企业();
ret["2020年企业融资情况"] = get2020年企业融资情况();
ret["2020年企业上市情况"] = get2020年企业上市情况();
ret["融资金额趋势"] = get融资金额趋势();
ret["上市企业行业分布"] = get上市企业行业分布();
ret["创投机构"] = get创投机构();
ret["融资企业行业分布"] = get融资企业行业分布();
ret["企业融资阶段分布"] = get企业融资阶段分布();
ret["金融产品担保方式占比"] = get金融产品担保方式占比();
ret["中央球展示数据"] = get中央球展示数据();
res.send(ret);
}
function get上市企业板块分布() {
return mock键值数据模板(8, 4, 'c', 3, true);
}
function get科创版企业() {
return mock键值数据模板(10, 6, 'c', 2, true);
}
function get挂牌企业() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get2020年企业融资情况() {
return mock键值数据模板(3, 4, 'c', 2, false);
}
function get2020年企业上市情况() {
return mock键值数据模板(3, 5, 'c', 2, false);
}
function get融资金额趋势() {
return mock柱状图数据模板(17);
}
function get上市企业行业分布() {
return mock键值数据模板(5, 4, 'c', 2, false);
}
function get创投机构() {
return mock键值数据模板(4, 4, 'c', 2, true);
}
function get融资企业行业分布() {
return mock键值数据模板(8, 7, 'c', 2, true);
}
function get企业融资阶段分布() {
return mock键值数据模板(12, 6, 'c', 3, true);
}
function get金融产品担保方式占比() {
return mock键值数据模板(7, 6, 'c', 2, true);
}
function get中央球展示数据() {
return mock键值数据模板(5, 5, 'c', 3, true);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["企业特征"] = get企业特征();
ret["代表企业"] = get代表企业();
ret["海外项目"] = get海外项目();
ret["人才引进"] = get人才引进();
ret["营业收入TOP5"] = get营业收入TOP5();
ret["净利润TOP5"] = get净利润TOP5();
ret["研发投入TOP5"] = get研发投入TOP5();
ret["入孵企业数量趋势"] = get入孵企业数量趋势();
ret["孵化器2020入驻企业数量排名"] = get孵化器2020入驻企业数量排名();
ret["运营指标趋势"] = get运营指标趋势();
ret["企业运营情况"] = get企业运营情况();
ret["企业运营概况"] = get企业运营概况();
ret["科技创新"] = get科技创新();
ret["发明专利申请与授权数比例"] = get发明专利申请与授权数比例();
ret["高新技术企业数据概况"] = get高新技术企业数据概况();
ret["高新技术企业培育"] = get高新技术企业培育();
ret["企业融资"] = get企业融资();
ret["2020四季度重大融资事件"] = get2020四季度重大融资事件();
res.send(ret);
}
function get企业特征() {
return mock键值数据模板(5, 4, 'c', 3, false);
}
function get代表企业() {
return ;
}
function get海外项目() {
return mock键值数据模板(7, 4, 'c', 2, true);
}
function get人才引进() {
return mock键值数据模板(7, 6, 'c', 4, true);
}
function get营业收入TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get净利润TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get研发投入TOP5() {
return mock键值数据模板(5, 12, 'c', 1, true);
}
function get入孵企业数量趋势() {
return mock柱状图数据模板(11);
}
function get孵化器2020入驻企业数量排名() {
return mock键值数据模板(5, 10, 'c', 3, false);
}
function get运营指标趋势() {
return mock柱状图数据模板(17);
}
function get企业运营情况() {
return mock键值数据模板(5, 5, 'c', 3, true);
}
function get企业运营概况() {
return mock键值数据模板(5, 4, 'c', 5, true);
}
function get科技创新() {
return mock键值数据模板(5, 4, 'c', 5, false);
}
function get发明专利申请与授权数比例() {
return mock柱状图数据模板(6);
}
function get高新技术企业数据概况() {
return mock键值数据模板(3, 4, 'c', 3, true);
}
function get高新技术企业培育() {
return mock柱状图数据模板(5);
}
function get企业融资() {
return mock键值数据模板(4, 4, 'c', 3, false);
}
function get2020四季度重大融资事件() {
return mock键值数据模板(5, 8, 'c', 3, true);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["大中小企业融通发展联盟"] = get大中小企业融通发展联盟();
ret["主要成效"] = get主要成效();
ret["创业加速营"] = get创业加速营();
ret["大企业开放式创新平台"] = get大企业开放式创新平台();
ret["大企业服务和成果"] = get大企业服务和成果();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get大中小企业融通发展联盟() {
return mock键值数据模板(2, 4, 'c', 3, false);
}
function get主要成效() {
return mock键值数据模板(5, 10, 'c', 3, false);
}
function get创业加速营() {
return mock键值数据模板(1, 7, 'c', 1, false);
}
function get大企业开放式创新平台() {
return mock键值数据模板(3, 3, 'c', 1, false);
}
function get大企业服务和成果() {
return mock键值数据模板(4, 4, 'c', 2, false);
}
function get地图数据() {
return mock地图数据模板(22);
}
import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
ret["双创集群"] = get双创集群();
ret["孵化器增长趋势"] = get孵化器增长趋势();
ret["企业培育"] = get企业培育();
ret["行业分布"] = get行业分布();
ret["张江大中小企业融通发展联盟"] = get张江大中小企业融通发展联盟();
ret["大企业开放式创新平台"] = get大企业开放式创新平台();
ret["科技金融"] = get科技金融();
ret["股权融资趋势"] = get股权融资趋势();
ret["地图数据"] = get地图数据();
res.send(ret);
}
function get双创集群() {
return mock键值数据模板(7, 8, 'c', 3, true);
}
function get孵化器增长趋势() {
return mock柱状图数据模板(6);
}
function get企业培育() {
return mock键值数据模板(3, 6, 'c', 3, true);
}
function get行业分布() {
return mock键值数据模板(5, 4, 'c', 3, true);
}
function get张江大中小企业融通发展联盟() {
return mock键值数据模板(2, 4, 'c', 2, false);
}
function get大企业开放式创新平台() {
return mock键值数据模板(3, 6, 'c', 1, true);
}
function get科技金融() {
return mock键值数据模板(3, 6, 'c', 3, true);
}
function get股权融资趋势() {
return mock柱状图数据模板(6);
}
function get地图数据() {
return mock地图数据模板(8);
}
let fs = require('fs');
let apiInfoList = [
{name:"FuHuaZaiTi", dataList:[
{name:"孵化载体", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"孵化载体占比数据", len:2, type:"键值", strType:"c", strLen:5, valLen:1, haveUnit:true},
{name:"孵化载体数量趋势", len:11, type:"柱状"},
{name:"孵化载体投资主体", len:3, type:"键值", strType:"c",strLen:2, valLen:2, haveUnit:false},
{name:"孵化载体行业分类", len:5, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"孵化载体运营", len:5, type:"键值", strType:"c",strLen:2, valLen:3, haveUnit:false},
{name:"平均营收趋势", len:7, type:"柱状"},
{name:"重要评价指标", len:4, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:false},
{name:"服务资源", len:8, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name:"政策服务", len:2, type:"键值", strType:"c",strLen:3, valLen:4, haveUnit:false},
{name:"地图数据", len:100, type:"地图"}
]},
{name:"KeJiJinRong", dataList:[
{name:"上市企业板块分布", len:8, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"科创版企业", len:10, type:"键值", strType:"c",strLen:6, valLen:2, haveUnit:true},
{name:"挂牌企业", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"2020年企业融资情况", len:3, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"2020年企业上市情况", len:3, type:"键值", strType:"c",strLen:5, valLen:2, haveUnit:false},
{name:"融资金额趋势", len:17, type:"柱状"},
{name:"上市企业行业分布", len:5, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"创投机构", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:true},
{name:"融资企业行业分布", len:8, type:"键值", strType:"c",strLen:7, valLen:2, haveUnit:true},
{name:"企业融资阶段分布", len:12, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"金融产品担保方式占比", len:7, type:"键值", strType:"c",strLen:6, valLen:2, haveUnit:true},
{name:"中央球展示数据", len:5, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:true}
]},
{name:"QiYePeiYu", dataList:[
{name:"企业特征", len:5, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name:"代表企业", len:0, type:""},
{name:"海外项目", len:7, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:true},
{name:"人才引进", len:7, type:"键值", strType:"c",strLen:6, valLen:4, haveUnit:true},
{name:"营业收入TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"净利润TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"研发投入TOP5", len:5, type:"键值", strType:"c",strLen:12, valLen:1, haveUnit:true},
{name:"入孵企业数量趋势", len:11, type:"柱状"},
{name:"孵化器2020入驻企业数量排名", len:5, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name:"运营指标趋势", len:17, type:"柱状"},
{name:"企业运营情况", len:5, type:"键值", strType:"c",strLen:5, valLen:3, haveUnit:true},
{name:"企业运营概况", len:5, type:"键值", strType:"c",strLen:4, valLen:5, haveUnit:true},
{name:"科技创新", len:5, type:"键值", strType:"c",strLen:4, valLen:5, haveUnit:false},
{name:"发明专利申请与授权数比例", len:6, type:"柱状"},
{name:"高新技术企业数据概况", len:3, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"高新技术企业培育", len:5, type:"柱状"},
{name:"企业融资", len:4, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name:"2020四季度重大融资事件", len:5, type:"键值", strType:"c",strLen:8, valLen:3, haveUnit:true}
]},
{name:"RongTongHua", dataList:[
{name: "大中小企业融通发展联盟", len:2, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:false},
{name: "主要成效", len:5, type:"键值", strType:"c",strLen:10, valLen:3, haveUnit:false},
{name: "创业加速营", len:1, type:"键值", strType:"c",strLen:7, valLen:1, haveUnit:false},
{name: "大企业开放式创新平台", len:3, type:"键值", strType:"c",strLen:3, valLen:1, haveUnit:false},
{name: "大企业服务和成果", len:4, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name: "地图数据", len:22, type:"地图"}
]},
{name:"ShuangChuangShengTai", dataList:[
{name:"双创集群", len:7, type:"键值", strType:"c",strLen:8, valLen:3, haveUnit:true},
{name:"孵化器增长趋势", len:6, type:"柱状"},
{name:"企业培育", len:3, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"行业分布", len:5, type:"键值", strType:"c",strLen:4, valLen:3, haveUnit:true},
{name:"张江大中小企业融通发展联盟", len:2, type:"键值", strType:"c",strLen:4, valLen:2, haveUnit:false},
{name:"大企业开放式创新平台", len:3, type:"键值", strType:"c",strLen:6, valLen:1, haveUnit:true},
{name:"科技金融", len:3, type:"键值", strType:"c",strLen:6, valLen:3, haveUnit:true},
{name:"股权融资趋势", len:6, type:"柱状"},
{name:"地图数据", len:8, type:"地图"}
]}
];
function createBiz() {
apiInfoList.forEach(apiInfo=>{
let path = `./biz/${apiInfo.name}.ts`;
fs.access(path, (err) => {
if (!err) {
console.error(path, "文件已存在");
return;
}
fs.writeFileSync(path, getBizFileData(apiInfo.dataList));
console.log(path, "创建文件成功")
});
})
}
function createRouter() {
let path = `./routers/router.ts`;
fs.access(path, (err) => {
if (!err) {
console.error(path, "文件已存在");
return;
}
fs.writeFileSync(path, getRouterFileData(apiInfoList));
console.log(path, "创建文件成功")
});
}
function getBizFileData(dataList) {
let funStr = "";
let runFunStr = "";
let mockFunStr = "";
dataList.forEach(dataInfo=>{
let subFunStr = ``;
switch(dataInfo.type) {
case "键值" : subFunStr = `mock键值数据模板(${dataInfo.len}, ${dataInfo.strLen}, '${dataInfo.strType}', ${dataInfo.valLen}, ${dataInfo.haveUnit})`; break;
case "柱状" : subFunStr = `mock柱状图数据模板(${dataInfo.len})`; break;
case "地图" : subFunStr = `mock地图数据模板(${dataInfo.len})`; break;
};
funStr +=
`function get${dataInfo.name}() {
return ${subFunStr};
}
`;
runFunStr +=
` ret["${dataInfo.name}"] = get${dataInfo.name}();
`
});
let allData =
`import { mock柱状图数据模板, mock键值数据模板, mock地图数据模板} from "../util/mockData";
export async function getData(req, res) {
let ret:any = {};
${runFunStr}
res.send(ret);
}
${funStr}
`
return allData;
}
function getRouterFileData(apiInfoList) {
let importStr = "";
let listenStr = "";
apiInfoList.forEach(apiInfo=>{
importStr +=
`import * as ${apiInfo.name}Biz from '../biz/${apiInfo.name}';
`
listenStr +=
` httpServer.get('/${apiInfo.name}', asyncHandler(${apiInfo.name}Biz.getData));
`
})
let allDataStr =
`import * as asyncHandler from 'express-async-handler'
${importStr}
export function setRouter(httpServer) {
${listenStr}
}`
return allDataStr;
}
createBiz();
createRouter();
\ No newline at end of file
export enum ERRORENUM {
参数错误=`参数错误`,
}
\ No newline at end of file
import mongoose = require('mongoose');
import mongoClient = require('mongodb');
let defaultOptions = {
// useNewUrlParser:true,
auto_reconnect:true,
reconnectTries:1000,
reconnectInterval:3000,
keepAlive: 1,
connectTimeoutMS: 30000
};
export async function createDbConnect(connectUrl:string, options?:object) {
if (!connectUrl) throw new Error(`wrong connect url ${connectUrl}`);
if (!options) options = defaultOptions;
console.log("connection mongo=> ",connectUrl);
return await mongoose.createConnection(connectUrl, options).catch((err)=>{throw err});
}
//初始化db
import { mongoServerConstVal } from '../../serverConfig';
import {createDbConnect} from './db_connect';
import { tableInit } from './table_init';
let db;
export async function init() {
console.log('connect to mongodb success');
db = await createDbConnect(mongoServerConstVal.dbUrl).catch((err)=>{throw err;});
process.stdin.emit('dbinit success');
tableInit();
}
export {db};
\ No newline at end of file
export function tableInit() {
console.log("tableinit success");
}
\ No newline at end of file
import * as mysql from 'mysql'
export function createMySqlConnect(host:string, port:number, user:string, password:string, database:string) {
return mysql.createConnection({ host, port, user, password, database });
}
import { mySqlConfig } from '../../serverConfig';
import { createMySqlConnect} from './mysql_connect';
let mysql_ddptDB;
export function initMysqlDB() {
const dataBase = 'ddpt';
mysql_ddptDB = createMySqlConnect(mySqlConfig.mysqlHost, mySqlConfig.mysqlPort, mySqlConfig.mysqlUser, mySqlConfig.mysqlPwd, dataBase);
mysql_ddptDB.connect(handleError);
mysql_ddptDB.on('error', handleError);
}
function handleError (err) {
if (err) {
// 如果是连接断开,自动重新连接
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
initMysqlDB();
} else {
console.error(err.stack || err);
}
}
}
export { mysql_ddptDB };
\ No newline at end of file
import { getPort } from "./serverConfig";
async function lanuch() {
//逻辑
}
function test() {
}
\ No newline at end of file
export async function encryptionReturn(req, res, next) {
res.on('end', function(){
console.log(res.body);
});
let resSend = res.send;
res.send = (obj)=>{
changeNumber(obj);
//递归修改number型
resSend.call(res, obj);
};
next();
}
function changeNumber(obj) {
if (Array.isArray(obj)) {
for (let i = 0; i < obj.length; i++) {
let arrItem = obj[i];
if (typeof arrItem == "number") {
obj[i] = getSameLenNumber(arrItem);
}
else if (typeof arrItem == "object") {
changeNumber(arrItem);
}
}
}
else {
for (let key in obj) {
let objItem = obj[key];
if (typeof objItem == "number") {
if (key == "x" || key == "y") continue;
obj[key] = getSameLenNumber(objItem);
}
else if (typeof objItem == "object") {
changeNumber(objItem);
}
}
}
}
function getSameLenNumber(num) {
let numStr = String(num);
//疑似年份的不做加密
if (numStr.length == 4 && (numStr.indexOf("19") == 0 || numStr.indexOf("20") == 0)) return num;
let str = "";
for (let i = 0; i < numStr.length; i++) {
if (numStr[i] == '.') str += numStr[i];
else str += "6";
}
return Number(str);
}
\ No newline at end of file
var formidable = require("formidable");
export async function parseFormParam(req, res, next) {
    var form = new formidable.IncomingForm();
    form.parse(req, (err, fields, files)=>{
        if (err) {
            next(err)
        }
        else {
            req.fields = fields;
            req.files = files;
            next();
        }
    })
}
\ No newline at end of file
import express = require('express');
import bodyParser = require('body-parser');
import sign = require('../middleware/sign');
import routers = require('../routers/router');
import compression = require('compression');
import { encryptionReturn } from '../middleware/encryptionReturn';
import { getEnv } from '../serverConfig';
export class httpServer {
static createServer(port:number) {
var httpServer = express();
httpServer.all('*',function (req, res, next) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Credentials', true);
res.header("X-Powered-By", ' 3.2.1');
if(req.method === 'OPTIONS'){
res.statusCode = 200;
res.end();
}else{
next();
}
});
httpServer.use(express.static('public') );
httpServer.use(bodyParser.json({limit:"10kb"}));
httpServer.use(compression())
//演示环境加密数据
if (getEnv() == "dem") {
console.log("演示环境 开启数据加密");
httpServer.use(encryptionReturn);
}
routers.setRouter(httpServer);
httpServer.listen(port);
console.log('server listen on port:'+port);
return httpServer;
}
}
export function setRouter(httpServer) {
}
\ No newline at end of file
//端口
export function getPort() : number {
return Number(process.env.PORT) || Number(process.argv[3]) || 9000;
}
// sit 测试环境 prod 生产环境 dem 演示环境(测试数据,前端无密码访问)
export function getEnv() : string {
return process.argv[2] || "sit";
}
//mongo数据库连接字符
export const mongoServerConstVal = {
dbUrl:'mongodb://192.168.12.79:27017/zjsc?w=1&wtimeoutMS=30000'
}
//mysql数据库连接对象
export const mySqlConfig = {
mysqlHost: 'localhost',
mysqlPort: 3306,
mysqlUser: 'root',
mysqlPwd: '123456',
// mysqlHost:'10.96.240.55',
// mysqlPort:3306,
// mysqlUser:'ddtest',
// mysqlPwd:'ddtest123^',
};
export const interfaceConfig = {
企业信息数据列表: '/openapi/company/list',
创投机构数据列表: '/openapi/investorg/list',
科技金融产品: '/openapi/product/list'
}
\ No newline at end of file
//新的解析
const fs = require('fs');
const xlsx = require('node-xlsx');
const path = require('path');
/**
* getExcelDataBySheetName 将excel文件解析成数据块数据
* @param fileName 文件名称
* @param sheetName 表名称
* @returns thisBlockData 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function getExcelDataBySheetName(fileName, sheetName) {
let {sheetMap, sheetList} = getExcel(`${__dirname.substring(0,__dirname.indexOf("out"))}res\\${fileName}`);
let thisBlockData = getBlockData(sheetMap[sheetName]);
return thisBlockData;
}
/**
* getBlockDataByData 将excel解析出来的二维数组解析成数据块模式
* @param dataList excel解出来的数据
* @returns thisBlockData 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
export function getBlockDataByData(dataList) {
let thisBlockData = getBlockData(dataList);
return thisBlockData;
}
/**
* analysisExcelDataOfObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param keyInX 表头是否是很向排列
* @returns 返回 {"数据标题":数据对象 }
*/
export function analysisExcelDataOfObject(dataList, isJumpTitle?, keyInX?) {
let result = {};
if (keyInX) {
let keyList = dataList[0];
let valueList = dataList[1];
let i = isJumpTitle ? 1:0;
for (; i < keyList; i++) {
let key = keyList[i];
let value = valueList[i] || null;
result[key] = value;
}
} else {
let y = isJumpTitle ? 1: 0;
for (; y < dataList.length; y++) {
let childList = dataList[y];
let key = childList[0];
let value = childList[1] || null;
result[key] = value;
}
}
return result;
}
export function testmain() {
let {sheetMap, sheetList} = getExcel(`${__dirname.substring(0,__dirname.indexOf("out"))}res\\数据模板.xlsx`);
//根据配置表解析成对应数据
let resultMap = {};
for (let sheetName in sheetMap) {
let thisSheetBlockList = getBlockData(sheetMap[sheetName]);
resultMap[sheetName] = thisSheetBlockList;
}
console.log(resultMap);
return resultMap;
}
/**
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
*/
function getBlockData(dataList) {
let blockList = [];
for (let i = 0; i < 999; i++) {
let {blockData, blockTitle, notItem, delDataList} = checkBlock(dataList);
if (notItem) break;
dataList = delDataList;
if (blockTitle) blockList.push({blockData, blockTitle});
}
return blockList;
}
function getListFristNotNullItemIndex(list) { //获取起始坐标
if (!list.length) return null;
for (let i = 0; i < list.length; i++) {
if (list[i]) return i;
}
}
function getListFirstNullItemIndex(list) { //获取第一个为空的坐标
if (!list.length) return null;
let checkItem = false;
let firstItemIndex = 0;
for (let i = 0; i <= list.length; i++) {
let item = list[i];
if (!checkItem && item) checkItem = true;
if (checkItem && !item) {
firstItemIndex = i;
break;
}
}
return firstItemIndex;
}
function listRegionIsNull(list, startX, endX) { //指定区间内数据是否未空
let isNull = true;
if ( !list.length ) return isNull;
for (let i = startX; i < endX; i++) {
let item = list[i];
if (item) {
isNull = false;
break;
}
}
return isNull;
}
function thisListNotItem(list) {
for (let i = 0; i < list.length; i++) {
if (list[i]) return false;
}
return true
}
function checkBlock(dataList) {
//纵向有效起始点
let startY = 0;
let startX = 0;
let isNotBlockTitle = false; //没有块标题
let isLook = false;
let endX = 0;//x轴最长结束下标 【包括下标】
let blockTitle = ''; //标题块名称
let notItem = true;
for (let i = 0; i < dataList.length; i++) {
let childList = dataList[i] || [];
if (!thisListNotItem(childList)) {
if ( !isLook ) {
let thisRoowStartX = getListFristNotNullItemIndex(childList);
let thisRoowLastItem = childList[thisRoowStartX + 1];
let LastList = dataList[i+1] || [];
let lastRoowStartX = getListFristNotNullItemIndex(LastList);
if ( thisRoowLastItem || (LastList.length && lastRoowStartX == thisRoowStartX) ) {
if (lastRoowStartX == thisRoowStartX && thisRoowLastItem ) {
isNotBlockTitle = true; //不存在标题块
blockTitle = `${thisRoowStartX}_${i}`;
startY = i;
startX = thisRoowStartX;
}
else {
blockTitle = dataList[i][thisRoowStartX];
dataList[i][thisRoowStartX] = null;
if ( thisRoowLastItem ) { // 同行存在元素 标题在y轴上
startY = i;
startX = thisRoowStartX + 1;
} else { // 同行存在元素 标题在x轴上
startY = i + 1;
startX = thisRoowStartX;
}
}
isLook = true;
} else { //只有标题 无内容
console.log(dataList[i][thisRoowStartX]);
dataList[i][thisRoowStartX] = null;
}
} else {
//测量最大连续长度
let firstNullX = getListFirstNullItemIndex(childList);
if (firstNullX) endX = Math.max(endX, firstNullX-1);
break;
}
notItem = false;
}
}
let endY = 0;//y轴连续下标 【包括下标】
let yInfoStart = false;
let yInfoEnd = false;
for (let y = startY; y < dataList.length; y++) {
//纵向找连续性
let thisRoow = dataList[y];
let regionIsNull = listRegionIsNull(thisRoow, startX, endX);
if (!regionIsNull) {
endY = y;
if (!yInfoStart) yInfoStart = true;
}
if (yInfoStart && regionIsNull) yInfoEnd = true;
if (yInfoEnd) break;
}
let blockData = [];
for (let y = startY; y <= endY; y++) {
let onceList = [];
for (let x = startX; x <= endX; x++) {
onceList.push(dataList[y][x]);
dataList[y][x] = null;
}
blockData.push(onceList);
}
return {blockData, blockTitle, delDataList:dataList,notItem};
}
//获取单个excel文件的数据
function getExcel(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
\ No newline at end of file
export class BizError extends Error {
}
\ No newline at end of file
const fs = require('fs');
const xlsx = require('node-xlsx');
const path = require('path');
//获取单个目录下的单个excel文件数据 只能有一个文件
export function getExcelDataByPath (dir) {
console.log(path.join(__dirname,dir))
let files = fs.readdirSync( path.join(__dirname,dir));
for (let i = 0; i < files.length; i++) {
if (files[i].indexOf('~') == 0 || files[i].indexOf('.') == 0) continue;
const workSheetsFromFile = xlsx.parse(dir+'/'+files[i]);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo.data)
}
return {sheetMap, sheetList}
}
}
export function updateExcel(data, fileName) {
try{
fs.writeFileSync('output.xlsx', xlsx.build(data), "binary");
console.log(`写入 ${fileName} 成功`);
}catch(err) {
console.log(err);
}
}
//获取单个excel文件的数据
export function getExcelDataByFile(filePath) {
const workSheetsFromFile = xlsx.parse(filePath);
let sheetMap = {};
let sheetList = [];
for (let i = 0; i < workSheetsFromFile.length; i++) {
let sheetInfo = workSheetsFromFile[i];
sheetMap[sheetInfo.name] = sheetInfo.data;
sheetList.push(sheetInfo);
}
return {sheetMap, sheetList}
}
export function arrayToObject(dataArr, keyNameArr) {
let obj = {};
for (let i = 0; i < dataArr.length; i++) {
obj[keyNameArr[i]] = dataArr[i];
}
return obj;
}
\ No newline at end of file
/**
*
* @param keyList 要生成的键名称集合 例如: ["键1", "键2"]
* @param valLen 要生成的值的长度 例如 十位数就传1 百位数就传2 例如: 1 则会生成 键1或键2 的数据是1-10的随机数
* @param haveUnit 单位信息: 如果传 % 号则会把生成的随机数再求百分比 传false 则不生成单位 传 数组 例如:["家","个"] 则 键1的单位是 家, 键2的单位是个
* @param title 数据标题
* @param subTitle 数据副标题
* @param total 是否要求和
* @returns
*/
export function mock键值数据模板(keyList, valLen, haveUnit, title, subTitle, total) {
let data = {
"title": "",
"subTitle": "",
"total": 0,
"list": []
};
if (title) data.title = title;
if (subTitle) data.subTitle = subTitle || title;
if ( haveUnit && haveUnit == "%" ) {
let random = Math.ceil( Math.random() * 20 );
let avg = Math.ceil((100 - random) / keyList.length);
keyList.forEach((key, index) => {
let valut = index == 0 ? avg + random : avg;
let onceInfo:any = {
"key":key,
"value": valut,
unit:"%"
};
data.list.push(onceInfo);
});
} else {
let unitIndex = 0;
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
"key":key,
"value": getValueByLength(valLen)
};
if (haveUnit) {
if (typeof haveUnit == "string") onceInfo.unit = haveUnit;
else onceInfo.unit = haveUnit[unitIndex];
}
data.list.push(onceInfo);
unitIndex += 1;
}
if (total) {
data.list.forEach(keyValue=>{
data.total += keyValue.value;
})
}
}
return data;
}
//键值数据 值为字符串
export function mock键值数据字符串模板(title, subTitle, obj) {
let data = { title: "", subTitle: "", total: 0, list: [] };
if (title) data.title = title;
if (subTitle) data.subTitle = subTitle || title;
for (let key in obj) {
data.list.push({
key,
value:obj[key]
});
}
return data;
}
//列表数据 obj:{ "表格1":{title1:1, title2:2, title3:3... } }
export function mock列表模板( obj, number ) {
let tableNumber = Object.keys(obj).length;
if (tableNumber > 1) {
let data = [];
for (let key in obj) {
let onceTable:any = {title:key, total:number, subTitle:key, titleList:[], valueList:[] };
onceTable.titleList = Object.keys(obj[key]);
for (let i = 0; i < number; i++) {
onceTable.valueList.push(Object.values(obj[key]) );
}
data.push(onceTable);
}
return data;
} else {
let onceTable:any = {};
for (let key in obj) {
onceTable = {title:key, total:number, subTitle:key, titleList:[], valueList:[] };
onceTable.titleList = Object.keys(obj[key]);
for (let i = 0; i < number; i++) {
onceTable.valueList.push(Object.values(obj[key]) );
}
}
return onceTable;
}
}
export function mock图形数据模板(keyList, title, number?, subTitleList?) {
if (!number) number = 1;
if (number == 1) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 1,
"list": []
}
}
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
key,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
data.data.list.push(onceInfo)
}
data.data.list.forEach(keyValue=>{
data.data.total += keyValue.value;
});
return data;
} else {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": []
};
for (let y = 0; y < number; y++) {
let onceData = {
"title": subTitleList[y],
"subTitle": subTitleList[y],
"total": 1,
"list": []
}
for (let i = 0; i < keyList.length; i++) {
let key = keyList[i];
let onceInfo:any = {
key,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
onceData.list.push(onceInfo)
}
onceData.list.forEach(keyValue=>{
onceData.total += keyValue.value;
});
data.data.push(onceData);
}
return data;
}
}
// 柱状图数据模板 模拟数据
export function mock柱状图数据模板(len, title?) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 1,
"list": [
]
}
}
for (let i = 0; i < len; i++) {
let onceInfo:any = {
"key": 2010 + i,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
data.data.list.push(onceInfo)
}
data.data.list.forEach(keyValue=>{
data.data.total += keyValue.value;
})
return data;
}
export function mock多柱柱状数据模板(len, 数组长度, title?) {
let data = {
"title": title ? title : "测试标题",
"yMaxValue": 100,
"yMinValue": 0,
"yStepValue": 10,
"unit": "个",
"data": []
}
for (let arrLen = 0; arrLen < 数组长度; arrLen++) {
let obj = {
"title": "测试数据标题",
"subTitle": "测试数据副标题",
"total": 0,
"list": [
]
}
for (let i = 0; i < len; i++) {
let onceInfo:any = {
"key": 2010 + i,
"value": Math.floor(Math.random()*99+1),
"unit": "个"
};
obj.list.push(onceInfo)
}
obj.list.forEach(keyValue=>{
obj.total += keyValue.value;
});
data.data.push(obj);
}
return data;
}
//获取特定长度的测试文字
export function getTestStrByLength(strLen, strType) {
let testStr = ``;
if (strType == 'c') {//中文
if (strLen < 5) {
testStr += `测试文本`.substring(0, strLen);
} else {
testStr += `测试`;
getPlaByLength((strLen - 4), () => {
testStr += '-';
});
testStr += `文本`
}
} else {//英文
testStr += `te`;
getPlaByLength((strLen - 4), () => {
testStr += '-';
});
testStr += `st`
}
return testStr;
}
function getValueByLength(length) {
let i = 1;
getPlaByLength(length, () => {
i= i * 10;
});
return Math.floor(Math.random() * i);
}
//获取特定长度的 占位符号
function getPlaByLength(num, callback) {
for (let i =0; i < num; i++) {
callback();
}
}
// 地图数据模板 模拟数据
export function mock地图数据模板(len) {
let data = {
"typeNameList": [
"type1","type2","type3"
],
"list": [
]
}
for (let i = 0; i < len; i++) {
data.list.push({
"x": Math.floor(Math.random()*500),
"y": Math.floor(Math.random()*500),
"typeName": "type"+(i%3+1),
"title": "测试标题",
"address": "测试地址",
"data": "测试数据<b>加粗</b></br>等等"
})
}
return data;
}
export function mock表数据模板(表头长度, 数据长度) {
let data = {
title:"",
titleList:[],
valueList:[]
}
for (let i = 0; i < 表头长度; i++) {
data.titleList.push("表头"+i);
}
for(let j = 0; j < 数据长度; j++) {
for (let i = 0; i < 表头长度; i++) {
data.titleList.push("数据"+i);
}
}
}
export function randomNumber(max, min=0) {
return Math.floor(Math.random()*(max-min))+min;
}
\ No newline at end of file
import * as request from 'request';
import { BizError } from './bizError';
export function get(url:string, query?, headers?) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
let paramater:any = { url, json:true };
if (query) paramater.qs = query;
if (headers) paramater.headers = headers;
request.get(paramater, function (err, r, body) {
if (err) return reject(err);
if (r && r.statusCode != 200) return reject(new Error('httpError:'+r.statusCode))
resolve(body);
});
})
}
export function post(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
let header = {"content-type": "application/json"};
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
headers: Object.assign(header, headers),
body: body
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error)
}
});
})
}
export function postForm(url, body, headers) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{
request({
url: url,
method: "POST",
json: true,
form:body
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
export function limitEnteNameString(name, number?) {
number = number ? number : 13;
if (name.length > number) return `${name.substring(0,number - 2)}...`;
return name;
}
const moneyStrConfig = {
"万亿": 13,
"萬億": 13,
"千亿": 12,
"千億": 12,
"百亿": 11,
"佰億": 11,
"十亿": 10,
"拾億": 10,
"亿": 9,
"億": 9,
"千万": 8,
"千萬": 8,
"百万": 7,
"佰萬": 7,
"十万": 6,
"拾萬": 6,
"万": 5,
"萬": 5,
"千":4,
"百":3,
"十":2,
"美元":1,
"人名币":1,
"元":1,
};
// 汇率
let dollarRate = 6.4731;
//解析金额
export function analysisMoneyStr(mnyStr:string) {
let zeroNum = 1;
let moneyNumber = 0;
for (let key in moneyStrConfig) {
let checkNum = mnyStr.indexOf(key);
if (checkNum > -1) {
zeroNum = moneyStrConfig[key];
moneyNumber = parseFloat(mnyStr.slice(0, checkNum));
break;
}
}
if (mnyStr.replace(/[^0-9]/ig,"") == "") return 0;
if (zeroNum > 1) {
let count = 1;
for (let i = 1; i < zeroNum; i++) {
count = count * 10;
}
zeroNum = count;
}
let money = parseInt(`${zeroNum * moneyNumber}`);
if (mnyStr.indexOf('美元')) money = parseInt(`${money * dollarRate}`);
return money;
}
//缩略金额
export function simplifyMoney(mny:number, str:string) {
let num = moneyStrConfig[str];
let count = 1;
for (let i = 1; i < num; i++) {
count = count * 10;
}
return mny / count;
}
//分离 带单位的数据
function separateDataAndUint(str) {
if (!str) return {data:0, unit:""};
let data = str.replace(/[\u4E00-\u9FA5a-zA-Z]+/,"");
let unit = str.replace(/^(-)?\d+(\.\d+)?/, "");
return {data, unit};
}
//object key替换 带单位
export function objKeyReplace(object, keyInfo) {
let unitMap = {};
let dataMap = {};
for(let key in object) {
let newKey = keyInfo[key] || key;
let {data, unit} = separateDataAndUint(`${object[key]}` || "");
unitMap[newKey] = unit;
dataMap[newKey] = parseFloat(data);
}
return {dataMap, unitMap};
}
//返回特定key和value的obj
export function objKeyAndValue(dataMap, ...keyList) {
let result = {};
for (let key in dataMap) {
if ( keyList.indexOf(key) > -1 ) result[key] = dataMap[key];
}
return result;
}
//获取键值数据 percent =>为数字的时候 保留几位小数
export function getKeyValue(title, dataMap, unit, total, percent ) {
let data = {
title,
subTitle : title,
total : 0,
list : []
};
let count = 0;
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
count += value;
if (total) data.total += value;
}
for (let key in dataMap) {
let thisUnit = "";
if (unit) {
if (typeof unit == "string") thisUnit = unit;
else thisUnit = unit[key];
}
let value = parseFloat(dataMap[key]);
if (percent) {
thisUnit = '%';
value = getDecimalForN( value/count, percent);
}
let onceInfo:any = { key, value, unit:thisUnit };
data.list.push(onceInfo);
}
return data;
}
export function getChartData(dataMap, unit, percent, title?, subTitle? ) {
unit = unit || "";
let data = {
title, yMaxValue:0, yMinValue:new Date().valueOf(), yStepValue:0, unit : percent ? "%" : unit ,
data: { title: subTitle, subTitle : subTitle, total : 0, list : [ ] }
}
let count = 0;
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
data.yMaxValue = Math.max(data.yMaxValue, value);
data.yMinValue = Math.min(data.yMinValue, value);
count += value;
data.data.total += value;
}
data.yStepValue = Math.ceil(data.yMaxValue - data.yMinValue / count);
for (let key in dataMap) {
let value = parseFloat(dataMap[key]);
let thisUnit = unit;
if (percent) {
thisUnit = '%';
value = getDecimalForN( value/count, percent);
}
let onceInfo = { key, unit:thisUnit, value };
data.data.list.push(onceInfo)
}
return data;
}
//按需取保留小数长度 tenNumber保留小数位 1位就填1
export function getDecimalForN(number, n) {
let ten = 1;
for (let i = 0; i < n; i ++) {
ten = ten * 10;
}
return Math.ceil(number * ten) / ten
}
//生日获取时间段
export function getAgeByBirthday(birthday:string) {
let b = new Date(birthday).valueOf();
let d = new Date().valueOf();
let onceYear = 365 * 24 * 3600 * 1000;
let age = Math.floor( (d - b) / onceYear );
if (age >= 21 && age <= 30 ) return "21-30";
else if (age >= 31 && age <= 40 ) return "35-45";
else if (age >= 41 && age <= 50 ) return "46-55";
else if (age > 50) return "50岁以上";
else return '其他';
}
\ No newline at end of file
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"sourceMap": true,
"rootDir":"./src",
"outDir":"./out"
},
"exclude": [
"node_modules"
]
}
\ 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