Commit cb3a5090 by lixinming

no message

parent e220b10c
{
"name": "gameserver",
"name": "tikeyi",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
......@@ -33,8 +33,8 @@
},
"@alicloud/pop-core": {
"version": "1.7.10",
"resolved": "https://registry.npm.taobao.org/@alicloud/pop-core/download/@alicloud/pop-core-1.7.10.tgz?cache=0&sync_timestamp=1603357203292&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40alicloud%2Fpop-core%2Fdownload%2F%40alicloud%2Fpop-core-1.7.10.tgz",
"integrity": "sha1-0OIhA227DM3kU90Jsc+r2DQbemk=",
"resolved": "https://registry.npmjs.org/@alicloud/pop-core/-/pop-core-1.7.10.tgz",
"integrity": "sha512-9/aLWgmgaAdB1ERNTpdOvF7wueLY5CDTRxKZr93x542iuYRA1NDpcKslFqLOy5CUOa0CbopET3JGaHSAz5qv9g==",
"requires": {
"debug": "^3.1.0",
"httpx": "^2.1.2",
......@@ -45,16 +45,16 @@
"dependencies": {
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1607566580543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz",
"integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.3.tgz?cache=0&sync_timestamp=1607433905701&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.3.tgz",
"integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI="
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}
}
},
......@@ -191,9 +191,9 @@
}
},
"bignumber.js": {
"version": "9.0.1",
"resolved": "https://registry.npm.taobao.org/bignumber.js/download/bignumber.js-9.0.1.tgz",
"integrity": "sha1-jXuhJMiCv9jkMmDGdHVRjQaJ5OU="
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
"integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw=="
},
"bl": {
"version": "2.2.1",
......@@ -490,6 +490,11 @@
"resolved": "https://registry.npm.taobao.org/express-async-handler/download/express-async-handler-1.1.4.tgz",
"integrity": "sha1-IlqEkI32OzWunflLbw8a8GEmZCY="
},
"express-history-api-fallback": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
"integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc="
},
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
......@@ -682,8 +687,8 @@
},
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/json-bigint/download/json-bigint-1.0.0.tgz",
"integrity": "sha1-rlR4I6wMrYOYZn+M2e9HMPWwH/E=",
"resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"requires": {
"bignumber.js": "^9.0.0"
}
......
{
"name": "gameserver",
"name": "tikeyi",
"version": "1.0.0",
"description": "",
"main": "main.ts",
"dependencies": {
"@alicloud/pop-core": "^1.7.10",
"@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",
"express-history-api-fallback": "^2.2.1",
"formidable": "^1.2.1",
"lru-cache": "^4.1.5",
"md5": "^2.2.1",
......
export function getKeyValueListData(title, data) {
let result = {title, dataList:[]}
for (let key in data) {
result.dataList.push({
key,
value:data[key]
});
}
return result;
}
export function getReflectionData(title, data, reflectionInfo) {
let result = {title, dataList:[]};
for (let i = 0; i < data.length; i++) {
let info = data[i];
let addInfo:any = {};
for (let key in info) {
let reflectionKey = reflectionInfo[key] || key;
let value = info[key];
addInfo[reflectionKey] = value;
}
result.dataList.push(addInfo);
}
return result;
}
import { getSzjltxData } from "../data/interface/data";
import { getKeyValueListData, getReflectionData } from "./out";
export async function getData(req, res) {
let ret:any = {};
let {sjlyInfo, sjzc, sjzl} = await getSzjltxData();
ret["sjly"] = getKeyValueListData("数据来源", sjlyInfo);
ret["sjzl"] = getReflectionData("数据治理", sjzl, {t_num:"tableNum", name:"key", row_num:"dataNum"});
ret["sjzc"] = getReflectionData("数据资产", sjzc, { name:"key"});
res.send(ret);
}
\ No newline at end of file
import { getZtyxtsData } from "../data/interface/data";
import { statsQueue } from "../data/interface/queueData";
import { getKeyValueListData, getReflectionData } from "./out";
export async function getData(req, res) {
let ret:any = {};
let {dqjxzhd, dqhdrs, bndhds, cyhdrs, ztyxtszjdt, zcyh, dqhds} = await getZtyxtsData();
ret["zcyh"] = getKeyValueListData("注册用户", zcyh);
ret["dqjxzhd"] = getReflectionData("当前进行中活动", dqjxzhd, { hdmc:"key", num:"value"});
ret["dqhdrs"] = getReflectionData("当前活动人数", dqhdrs, { district:"key", num:"value"});
ret["bndhds"] = getReflectionData("本年度活动数", bndhds, { month:"key", hd_num:"value"});
ret["cyhdrs"] = getReflectionData("参与活动人数", cyhdrs, { month:"key",r_num:"value"});
ret["ztyxtszjdt"] = getReflectionData("中间地图数据", ztyxtszjdt, {num:"value", district:"key" });
ret["dqhds"] = {title:"当前活动数", data: parseInt(dqhds["num_dqhds"] || 0) };
ret["ndhds"] = {title:"年度活动数", data: parseInt(dqhds["num_ndhds"] || 0) };
ret["cyhdrc"] = {title:"参与活动人次", data: parseInt(dqhds["num_cyhdrc"] || 0) };
ret["yyjk"] = {
title:"应用监控",
data:statsQueue["应用监控"]
};
ret["yyxt"] = {
title:"应用系统",
data:statsQueue["应用系统数"]
}
res.send(ret);
}
\ No newline at end of file
import { getBaiduStats, getUV } from "../data/interface/baiduStats";
import { getZyhdbzData } from "../data/interface/data";
import { statsQueue } from "../data/interface/queueData";
import { getKeyValueListData, getReflectionData } from "./out";
export async function getData(req, res) {
let ret:any = {};
let {zcyh, yjbzya, bzry, hdcyd, yhtsl, zyhdbzzjdt, yhtslzs} = await getZyhdbzData();
ret["zcyh"] = getKeyValueListData("注册用户", zcyh);
ret["yjbzya"] = getKeyValueListData("应急保障预案", yjbzya);
ret["bzry"] = getReflectionData("保障人员",bzry, {name:"key", info:"value"});
ret["hdcyd"] = getReflectionData("活动参与度", hdcyd, {district:"key", hdcyd:"value"});
ret["yhtsl"] = getKeyValueListData("用户投诉量", yhtsl);
ret["zyhdbzzjdt"] = getReflectionData("中间地图数据", zyhdbzzjdt, {num:"value", district:"key"});
let {monthStatsData, dayStatsData} = statsQueue["日活月活"];
ret["dau"] = getReflectionData("日活", dayStatsData, {});
ret["mau"] = getReflectionData("月活", monthStatsData, {});
ret["yhtslzs"] = {title:"用户投诉总数", data:parseInt(yhtslzs["用户投诉总数"] || 0)};
let uv = statsQueue["uv"];
ret["hdzfwrs"] = {title:"活动总访问人数", data:uv || 0};
//应用系统监控
ret["yyxtjk"] = {
title:"页面系统监控",
data:statsQueue["应用系统监控"]
};
ret["ymcglqs"] = {
title:"页面成功率趋势",
data:statsQueue["应用系统监控趋势"]
}
res.send(ret);
}
\ No newline at end of file
import moment = require("moment");
const Core = require('@alicloud/pop-core');
export async function getALYStats(isFirst) {
let nowTime = new Date().valueOf();
let startTime = new Date(moment().format("YYYY-MM-DD 00:00:00")).valueOf();
let alyData:any = await getAL("Availability", startTime, nowTime, 3600 );
if (isFirst) console.log("初始化进度 10%");
let timeData:any = await getAL("ResponseTime", startTime, nowTime, 3600);
if (isFirst) console.log("初始化进度 20%");
if (alyData.Code != "200" || timeData.Code != "200") {
return "timeOut";
}
let availabilityData = JSON.parse(alyData.Datapoints);
let resTimeData = JSON.parse(timeData.Datapoints);
let alyStatsData = taskCountAvg(availabilityData, resTimeData);
let taskIdList = Object.keys(alyStatsData);
let taskInfoList = [];
for (let i = 0; i < taskIdList.length; i++) {
let onceTaskId = taskIdList[i];
let info = await getTaskInfo(onceTaskId);
if (info) taskInfoList.push(info);
}
// let todayTime = new Date(moment().format("YYYY-MM-DD 00:00:00")).valueOf();
// let todayAlyData:any = await getAL("Availability", todayTime, nowTime, 3600);
// if (isFirst) console.log("初始化进度 30%");
// let todayTimeData:any = await getAL("ResponseTime", todayTime, nowTime, 3600);
// if (isFirst) console.log("初始化进度 40%");
// let todayAvailabilityData = JSON.parse(todayAlyData.Datapoints);
// let todayResTimeData = JSON.parse(todayTimeData.Datapoints);
// let todayStatsData = taskCountAvg(todayAvailabilityData, todayResTimeData);
//董老师说这里留个坑 2021-12-22 下午 15:09 这里暂时留 日常体育成绩 0dcce666-691b-422f-9e1d-7301b9d5164e 需要更换添加或者全部,就替换checkKeyList即可
let checkKeyList = ["0dcce666-691b-422f-9e1d-7301b9d5164e"];
let alyDataCount = 0;
let alyDataNumber = 0;
let timeDataCount = 0;
let timeDataNumber = 0;
for (let key in alyStatsData) {
if (checkKeyList.indexOf(key) == -1) continue;
let {ab, rt} = alyStatsData[key];
alyDataCount += 1;
alyDataNumber += parseFloat(ab);
timeDataCount += 1;
timeDataNumber += parseFloat(rt);
}
let todayAlyStatsData = {ab:Math.ceil(alyDataNumber/alyDataCount * 100)/100, rt:Math.ceil(timeDataNumber/timeDataCount * 100)/100}
let todayAvailabilityList = [];
availabilityData.forEach(info => {
let {timestamp, taskId, Availability} = info;
if (checkKeyList.indexOf(taskId) == -1 ) return;
todayAvailabilityList.push({value:Availability, key:parseInt(timestamp)});
});
todayAvailabilityList.sort((a, b) => {return a-b});
todayAvailabilityList.forEach(info => {info.key = moment(info.key).format("HH:mm")});
return {taskInfoList, alyStatsData, todayAlyStatsData, todayAvailabilityList };
}
//求总和的平均
function taskCountAvg(availabilityData, resTimeData) {
let taskMap = {};
availabilityData.forEach(info => {
let taskId = info.taskId;
let timestamp = info.timestamp;
if (!timestamp) return;
if (!taskMap[taskId]) taskMap[taskId] = {count:0, availability:0, resCount:0, resTime:0 };
taskMap[taskId].count += 1;
taskMap[taskId].availability += parseFloat(info.Availability || 0);
});
resTimeData.forEach(info => {
let taskId = info.taskId;
if (!taskMap[taskId]) return;
taskMap[taskId].resCount += 1;
taskMap[taskId].resTime += parseFloat(info.Average);
});
let alyStatsData = {};
for (let key in taskMap) {
let {count, availability, resCount, resTime} = taskMap[key];
alyStatsData[key] = {
ab:Math.ceil(availability/count * 100)/100,
rt:Math.ceil(resTime/resCount * 100)/100,
}
}
return alyStatsData
}
const accessKeyId = 'LTAI4Fp5YFFscbiMjsMXcvsP';
const accessKeySecret = 'Lfj458KmSQJ4s63xqugtLfL9Fgah9d';
async function getAL(MetricName, startTime, endTime, period) {
let params = {
"Namespace": "acs_networkmonitor",
"MetricName":MetricName,
"Period": period,
"StartTime": startTime+'',
"EndTime": endTime+''
}
return await alyPost(params, 'DescribeMetricList');
}
async function getTaskInfo(taskId) {
let params = {
"TaskId": taskId
};
let result:any = await alyPost(params, 'DescribeSiteMonitorAttribute');
if (result["Code"] != "200") return null;
return result.SiteMonitors;
}
function alyPost(params, path) {
return new Promise((res, rej) => {
var client = new Core({
accessKeyId,
accessKeySecret,
endpoint: 'https://metrics.cn-hangzhou.aliyuncs.com',
apiVersion: '2019-01-01'
});
var requestOption = {
method: 'POST'
};
client.request(path, params, requestOption).then((result) => {
res(result);
}, (ex) => {
res(ex);
});
});
}
\ No newline at end of file
import moment = require("moment");
import { post } from "../../util/request";
function statsDataFormat() {
let dayStartTime = moment().add(-6, 'days');
let monthStart = moment().add(-5, 'months');
return {
thisMonthStartTime:moment(dayStartTime).format('YYYYMMDD'),
startTime: moment(monthStart).format('YYYYMMDD'),
endTime:moment().format('YYYYMMDD'),
};
}
export async function getBaiduStats() {
const site_id = 17390867;
let {startTime, endTime, thisMonthStartTime} = statsDataFormat();
let url = "https://api.baidu.com/json/tongji/v1/ReportService/getData";
let header = {
"username": "shkyzx",
"password": "Support01",
"token": "2444afaabacc40a0819a15815d7ec10f",
"account_type": 1
};
let body = {
"site_id": `${site_id}`,
"start_date": startTime,
"end_date": endTime,
"metrics": "pv_count",
"method": "trend/time/a",
"gran": "month",
"area": "china"
}
let monthResult:any = await post(url, {body, header}, {});
let monthStatsData = [];
let dayStatsData = [];
if ( !(!monthResult || !monthResult.body || !monthResult.body.data[0] || !monthResult.body.data[0].result || !monthResult.body.data[0].result.items) ) {
let titleLis = monthResult.body.data[0].result.items[0];
let valueList = monthResult.body.data[0].result.items[1];
titleLis.forEach((info, index) => {
let key = info[0] || "";
key = key.substring(0, 11);
let value = 0;
if (valueList[index] && valueList[index][0] && typeof valueList[index][0] == 'number' ) value = valueList[index][0];
monthStatsData.push({key, value});
});
}
body.gran = "day";
body.start_date = thisMonthStartTime;
let dayResult:any = await post(url,{body, header}, {});
if ( !(!dayResult || !dayResult.body || !dayResult.body.data[0] || !dayResult.body.data[0].result || !dayResult.body.data[0].result.items) ) {
let titleLis = dayResult.body.data[0].result.items[0];
let valueList = dayResult.body.data[0].result.items[1];
titleLis.forEach((info, index) => {
let key = info[0] || "";
let value = 0;
if (valueList[index] && valueList[index][0] && typeof valueList[index][0] == 'number' ) value = valueList[index][0];
dayStatsData.push({key, value});
});
}
dayStatsData.sort((a, b) => {return new Date(a.key).valueOf() - new Date(b.key).valueOf() });
monthStatsData.sort((a, b) => {return new Date(a.key).valueOf() - new Date(b.key).valueOf() });
dayStatsData.forEach(info => {
info.key = parseInt(info.key.substring(5,7)) +'/'+ parseInt(info.key.substring(8,10));
});
monthStatsData.forEach(info => {
info.key = parseInt(info.key.substring(5,7))+"月";
});
return{monthStatsData, dayStatsData};
}
function uvDataFormat() {
let time = new Date();
let month = (time.getMonth() + 1) <= 9 ? `0${time.getMonth() + 1}` : `${time.getMonth() + 1}`;
let day = time.getDate() <= 9 ? `0${time.getDate()}` : `${time.getDate()}`;
return {startTime:`${time.getFullYear()}0101`, endTime:`${time.getFullYear()}${month}${day}`};
}
export async function getUV() {
const site_id = 17390867;
let {startTime, endTime} = uvDataFormat();
let url = "https://api.baidu.com/json/tongji/v1/ReportService/getData";
let header = {
"username": "shkyzx",
"password": "Support01",
"token": "2444afaabacc40a0819a15815d7ec10f",
"account_type": 1
};
let body = {
"site_id": `${site_id}`,
"start_date": startTime,
"end_date": endTime,
"metrics": "pv_count",
"method": "visit/toppage/a"
}
let uvResult:any = await post(url, {body, header}, {});
let uv = 0;
if ( !(!uvResult || !uvResult.body || !uvResult.body.data[0] || !uvResult.body.data[0].result || !uvResult.body.data[0].result.items) ) {
let valueList = uvResult.body.data[0].result.items[1] || [];
valueList.forEach( info => {
if (info[0] && typeof info[0] == 'number' ) uv = info[0];
});
}
return uv;
}
export async function getBaiduSiteList() {
let url = "https://api.baidu.com/json/tongji/v1/ReportService/getSiteList";
let header = {
"username": "shkyzx",
"password": "Support01",
"token": "2444afaabacc40a0819a15815d7ec10f",
"account_type": 1
};
let body = {}
let uvResult:any = await post(url, {body, header}, {});
if (!uvResult.body || !uvResult.body.data || !uvResult.body.data[0] || !uvResult.body.data[0].list) return [];
return uvResult.body.data[0].list;
}
export async function getPVCountBySiteId(siteId) {
let url = "https://api.baidu.com/json/tongji/v1/ReportService/getData";
let header = {
"username": "shkyzx",
"password": "Support01",
"token": "2444afaabacc40a0819a15815d7ec10f",
"account_type": 1
};
let body = {
"site_id": `${siteId}`,
"start_date": moment().format("YYYYMMDD"),
"end_date": moment().add(1, 'days').format("YYYYMMDD"),//这里改成了当日的
"metrics": "pv_count",
"method": "overview/getTimeTrendRpt",
"area": "china"
}
let uvResult:any = await post(url, {body, header}, {});
if (!uvResult.body || !uvResult.body.data || !uvResult.body.data[0] || !uvResult.body.data[0].result || !uvResult.body.data[0].result.items || !uvResult.body.data[0].result.items[1]) return 0;
let count = 0;
uvResult.body.data[0].result.items[1].forEach(info => {
if (!info || info == "--" || isNaN(info)) return;
count += parseInt(info);
});
return count;
}
\ No newline at end of file
import { requestConfig } from "../../serverConfig";
import { BizError } from "../../util/bizError";
import { get, post, postForm } from "../../util/request";
import { getUrl, urlEnum } from "./url";
let token = "";
let tokenTime = 0;//有效时间
let lastTime = 0;//上一次时间
const timeOutTime = 50;//超时时间s
async function get获取token() {
let time = new Date().valueOf();
if ( (Math.ceil((time - lastTime)/1000 ) + timeOutTime )> tokenTime ) {
let url = getUrl(urlEnum.获取token);
let head = {};
let body = {client_id:requestConfig.client_id, client_secret:requestConfig.client_secret};
let result:any = await postForm(url, body, head );
if (!result || !result.access_token || !result.expires_in) {
throw new BizError(`获取token 失败: ${JSON.stringify(result)}`, );
}
token = result.access_token;
tokenTime = result.expires_in;
lastTime = time;
console.log("获取一次token",`token${token}, lastTime ${lastTime}, time ${time}, tokenTime ${tokenTime}, `);
}
}
//数据治理体系
export async function getSzjltxData() {
await get获取token();
let body = {
client_id:requestConfig.client_id,
access_token:token,
};
let sjzl = await post(getUrl(urlEnum.数据治理), body, {} );
let sjzc = await post(getUrl(urlEnum.数据资产), body, {} );
let departmentList = [
{name:"信息管理部", str:"xxglb"},
{name:"师训部", str:"sxb"},
{name:"体育活动部", str:"tyhdb"},
{name:"健康教育部", str:"jkjyb"},
{name:"艺术教育部", str:"ysjyb"},
{name:"科技教育部", str:"kjjyb"},
{name:"综合办公室", str:"zhbgs"}
];
let sjlyInfo = {};
for (let i = 0; i < departmentList.length; i++) {
let {name, str} = departmentList[i];
let thisBody = {department:str, client_id:requestConfig.client_id, access_token:token }
let onceSjly:any = await post(getUrl(urlEnum.数据来源), thisBody, {});
if (!sjlyInfo[name]) sjlyInfo[name] = [];
onceSjly.forEach(onceItem => {
if (onceItem.system != "/") sjlyInfo[name].push(onceItem.system);
});
}
return { sjzl, sjzc, sjlyInfo };
}
//整体运行态势
export async function getZtyxtsData() {
await get获取token();
let body = {
client_id:requestConfig.client_id,
access_token:token,
};
let dqjxzhd = await post(getUrl(urlEnum.当前进行中活动), body, {});
let dqhdrs = await post(getUrl(urlEnum.当前活动人数), body, {});
let bndhds:any = await post(getUrl(urlEnum.本年度活动数), body, {});
bndhds.forEach(info => {
info.month = `${info.month}月`
});
let cyhdrs:any = await post(getUrl(urlEnum.参与活动人数), body, {});
cyhdrs.forEach(info => {
info.month = `${info.month}月`
});
let ztyxtszjdt = await post(getUrl(urlEnum.整体运行地图数据), body, {});
let zcyh = await post(getUrl(urlEnum.注册用户), body, {} );
let dqhds = await post(getUrl(urlEnum.整体运行态势当前活动数), body, {} );
return { dqjxzhd,dqhdrs,bndhds,cyhdrs, ztyxtszjdt, zcyh:listMappingObject(zcyh, {zcyh:"注册用户"}),
dqhds:listMappingObject(dqhds, {num_dqhds:"num_dqhds", num_ndhds:"num_ndhds", num_cyhdrc:"num_cyhdrc" }) };
}
//重要活动保障
export async function getZyhdbzData() {
await get获取token();
let body = {
client_id:requestConfig.client_id,
access_token:token,
};
let zcyh = await post(getUrl(urlEnum.注册用户), body, {} );
let yjbzya = await post(getUrl(urlEnum.应急保障预案), body, {} );
let bzry = await post(getUrl(urlEnum.保障人员), body, {} );
let hdcyd = await post(getUrl(urlEnum.活动参与度), body, {} );
let yhtsl = await post(getUrl(urlEnum.用户投诉量), body, {} );
let zyhdbzzjdt:any = await post(getUrl(urlEnum.重要活动地图数据), body, {} );
return {
zcyh: listMappingObject(zcyh, {zcyh:"注册用户"}),
yjbzya: listMappingObject(yjbzya, {hdmc:"活动名称", bzdx:"保障对象", bzsj:"保障时间", bzyq:"保障要求"}),
bzry, hdcyd, zyhdbzzjdt,
yhtsl: listMappingObject(yhtsl, { zcdl:"注册登录", wzdbk:"网站打不开", sfzcw:"身份证填写错误", qt:"其他"}),
yhtslzs: listMappingObject(yhtsl, {yhts:"用户投诉总数"}),
};
}
function listMappingObject(dataList, mappingInfo) {
let map = {};
dataList.forEach(info => {
for (let key in info) {
map[key] = info[key];
}
});
let result = {};
for (let key in mappingInfo) {
let mappingKey = mappingInfo[key];
let value = map[key];
if (value) result[mappingKey] = value;
else console.log(`${JSON.stringify(mappingInfo)}${key} 在数据中找不到映射`);
}
return result
}
//以下要涉及到百度和阿里的关联 双方用域名关联
import moment = require("moment");
import { getALYStats } from "./aliyunStats";
import { getBaiduSiteList, getBaiduStats, getPVCountBySiteId, getUV } from "./baiduStats";
const bdyAndAlyConfig = {
"科创实践工作站": {alyName:"正汇实践工作站", alyUrl:"secsa.shec.edu.cn/kc/", baiduUrl:"" },
"青少年科学研究院": {alyName:"正汇青少年研究院", alyUrl:"secsa.shec.edu.cn/qsnkxyjy/", baiduUrl:"" },
"体育日常成绩": {alyName:"正汇日常体育成绩", alyUrl:"secsa.shec.edu.cn/tyjs/", baiduUrl:"" },
"学生体育网": {alyName:"正汇学生体育网", alyUrl:"secsa.shec.edu.cn/xstyw/", baiduUrl:"" },
"综评": {alyName:"正汇综评系统", alyUrl:"shsunshine-zp.shec.edu.cn/shjw/", baiduUrl:"shsunshine-zp.shec.edu.cn/shjw" },
"上海市学生体育艺术科技教育活动": {alyName:"玑脉大平台", alyUrl:"shsunshine-zp.shec.edu.cn/", baiduUrl:"shsunshine-zp.shec.edu.cn" },
"因病缺课缺勤网络直报系统": {alyName:"玑脉直报系统", alyUrl:"shxxybqq.shec.edu.cn/", baiduUrl:"shxxybqq.shec.edu.cn" },
"OA办事管理系统":{baiduUrl:'secsagl.shec.edu.cn'},
"教软子系统":{baiduUrl:'shsunshine1-zp.shec.edu.cn'},
"精英足球训练营":{baiduUrl:''},
"明日科技之星":{baiduUrl:''},
"学生活动网及教软负责子系统":{baiduUrl:''},
};
export let statsQueue = {};
async function getSiteInfoStats(isFirst) {
let alyData:any = await getALYStats(isFirst);
if (alyData == "timeOut") {
return false;
}
let alySiteUrlAndNameMap = {};
alyData.taskInfoList.forEach(info => {
let checkStr = info.Address.replace(/http:\/\//,'')
checkStr = checkStr.replace(/https:\/\//,'')
alySiteUrlAndNameMap[checkStr] = info['TaskId'];
});
let siteList = await getBaiduSiteList();
let baiduSiteUrlAndSiteIdMap = {};
siteList.forEach(info => {
let str = info.domain;
baiduSiteUrlAndSiteIdMap[str] = info.site_id;
if (info.sub_dir_list.length) {
info.sub_dir_list.forEach(subInfo => {
baiduSiteUrlAndSiteIdMap[subInfo.name] = subInfo.sub_dir_id;
});
}
});
let statsData = {};
let rateOfProgress = Object.keys(bdyAndAlyConfig).length;
let rateOfProgressIndex = 1;
let onceRateOfProgressIndex = Math.ceil(30 / rateOfProgress);
for (let siteName in bdyAndAlyConfig) {
let info = bdyAndAlyConfig[siteName];
let baiduSiteUrlAndIdMapKey = info.baiduUrl ? info.baiduUrl : siteName;
if (!baiduSiteUrlAndIdMapKey) continue;
let siteId = baiduSiteUrlAndSiteIdMap[baiduSiteUrlAndIdMapKey];
let count = await getPVCountBySiteId(siteId);
if (isFirst && !(rateOfProgressIndex % 3)) console.log(`初始化进度 ${50 + (rateOfProgressIndex * onceRateOfProgressIndex)}%`);
rateOfProgressIndex += 1;
let time = '0ms';
let availability = '0%';
if (info.alyUrl) {
let taskId = alySiteUrlAndNameMap[info.alyUrl];
let {ab, rt} = alyData.alyStatsData[taskId];
availability = `${ab}%`;
time = `${rt}ms`;
}
statsData[siteName] = {count, time, availability };
}
let statsList = [];
for (let key in statsData) {
let {count, time, availability } = statsData[key];
statsList.push({key, count, time, availability });
}
statsList.sort( (a, b) => {return b.count - a.count});
statsQueue["应用监控"] = statsList;
statsQueue["应用系统数"] = statsList.length;
statsQueue["应用系统监控趋势"] = alyData.todayAvailabilityList;
let todayAlyStatsData = [
{key:"页面响应时间", value:alyData.todayAlyStatsData.rt, unit:'ms'},
{key:"成功率", value:alyData.todayAlyStatsData.ab, unit:'%'}
]
statsQueue["应用系统监控"] = todayAlyStatsData;
return true;
}
async function statsBaiduData(isFirst) {
let uv = await getUV();
if (isFirst) console.log("初始化进度 90%");
statsQueue["uv"] = uv;
let 日活月活 = await getBaiduStats();
if (isFirst) console.log("初始化进度 100%");
statsQueue["日活月活"] = 日活月活;
}
export async function initQueueData() {
console.log("开始初始化阿里云与百度云数据");
let result = await getSiteInfoStats(true);
await statsBaiduData(true);
if (result) {
console.log("初始化缓存数据成功");
//隔一个小时统计数据
setInterval( async () => {
let result = await getSiteInfoStats(false);
await statsBaiduData(false);
if (!result) console.log(moment().format("YYYY-MM-DD hh:mm:ss"), " 请求 阿里云超时 将在一小时后重试" );
}, 600* 1000);
}
return result;
}
\ No newline at end of file
import { requestConfig } from "../../serverConfig";
export enum urlEnum {
获取token = "/oauth/token",
数据治理="/service/api/kyzx/sjzl",
数据资产="/service/api/kyzx/sjzc",
数据来源="/service/api/kyzx/sjlyn",
当前进行中活动="/service/api/kyzx/dqhd",
当前活动人数="/service/api/kyzx/dqhdrs",
本年度活动数="/service/api/kyzx/bndhds",
参与活动人数="/service/api/kyzx/cyhdrs",
注册用户="/service/api/kyzx/zcyh",
应急保障预案="/service/api/kyzx/yjbzya",
保障人员="/service/api/kyzx/bzry",
活动参与度="/service/api/kyzx/hdcyd",
用户投诉量="/service/api/kyzx/yhts",
重要活动地图数据="/service/api/kyzx/zyhdbzzjdt",
整体运行地图数据="/service/api/kyzx/ztyxtszjdt",
整体运行态势当前活动数="/service/api/kyzx/dqhds",
};
export function getUrl(urlName) {
return `${requestConfig.url}${urlName}`
}
\ 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 { initQueueData } from "./data/interface/queueData";
import { httpServer } from "./net/http_server";
import { getPort } from "./serverConfig";
async function lanuch() {
//逻辑
test();
let initResult = await initQueueData();
if (!initResult) {
console.log("请求阿里云数据失败,请检查网络 重新启动");
return;
}
httpServer.createServer(getPort());
}
function test() {
// testMaxMin();
}
lanuch();
lanuch();
\ No newline at end of file
......@@ -5,7 +5,8 @@ import routers = require('../routers/router');
import compression = require('compression');
import { encryptionReturn } from '../middleware/encryptionReturn';
import { getEnv } from '../serverConfig';
import * as fallback from 'express-history-api-fallback';
import * as path from "path";
export class httpServer {
static createServer(port:number) {
......@@ -36,7 +37,13 @@ export class httpServer {
httpServer.use(encryptionReturn);
}
routers.setRouter(httpServer);
const root = path.join(__dirname, "../../public/")
httpServer.use(express.static(root))
httpServer.use(fallback('index.html', { root }))
console.log('web listen on port:'+port);
httpServer.listen(port);
console.log('server listen on port:'+port);
......
export function setRouter(httpServer) {
import * as asyncHandler from 'express-async-handler'
import * as sjzltxBiz from '../biz/sjzltx';
import * as ztyxtsBiz from '../biz/ztyxts';
import * as zyhdbzBiz from '../biz/zyhdbz';
export function setRouter(httpServer){
httpServer.get('/sjzltx', asyncHandler(sjzltxBiz.getData));
httpServer.post('/sjzltx', asyncHandler(sjzltxBiz.getData));
httpServer.get('/ztyxts', asyncHandler(ztyxtsBiz.getData));
httpServer.post('/ztyxts', asyncHandler(ztyxtsBiz.getData));
httpServer.get('/zyhdbz', asyncHandler(zyhdbzBiz.getData));
httpServer.post('/zyhdbz', asyncHandler(zyhdbzBiz.getData));
}
\ No newline at end of file
//端口
export function getPort() : number {
return Number(process.env.PORT) || Number(process.argv[3]) || 7536;
return Number(process.env.PORT) || Number(process.argv[3]) || 7474;
}
// sit 测试环境 prod 生产环境 dem 演示环境(测试数据,前端无密码访问)
......@@ -9,27 +9,8 @@ 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
export let requestConfig = {
url:'http://61.171.4.98:9090',
client_id:'75cb2a016ec640a886f681b2d3ae6f3c',
client_secret:'df795bea090e441fba6361645d18d5de'
};
\ 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, reqBody, 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: reqBody
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
}
else {
reject(error || `${url} => ${JSON.stringify(body)}`)
}
});
})
}
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,
headers
}, function(error, response, res) {
if (!error) {
resolve(res);
}
else {
reject(error)
}
});
})
}
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