commit 5433cf33233c1046a9e8d6808adaa84eb1f0b3f1 Author: pm <362371171@qq.com> Date: Fri Mar 14 17:04:22 2025 +0800 get获取数据已完成 diff --git a/app.js b/app.js new file mode 100644 index 0000000..ca65dca --- /dev/null +++ b/app.js @@ -0,0 +1,54 @@ +var createError = require('http-errors'); +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require('morgan'); + +var missionRouter = require('./routes/Mission'); +var simuRouter = require('./routes/simu'); + +let dataBase = require("./util/dmDB"); +dataBase.initDB(); + +var createServer = require('./controller/socket') + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); + +app.use(logger('dev')); +app.use(express.json()); +app.use(express.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +//设置允许跨域访问该服务. +//设置跨域访问 +app.all('*', function (req, res, next) { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "*"); + next(); +}); + +app.use('/Mission', missionRouter); +app.use('/Simu', simuRouter); + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100644 index 0000000..504189c --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('dmserve: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); +} diff --git a/config/db.json b/config/db.json new file mode 100644 index 0000000..1c7e8cf --- /dev/null +++ b/config/db.json @@ -0,0 +1,8 @@ +{ + "db_config":{ + "host" : "192.168.0.105", + "port" : "30236", + "username" : "SYSDBA", + "password" : "SYSDBA_dm001" + } +} \ No newline at end of file diff --git a/controller/Mission.js b/controller/Mission.js new file mode 100644 index 0000000..ea92962 --- /dev/null +++ b/controller/Mission.js @@ -0,0 +1,673 @@ +const util = require("../util/common"); +let dataBase = require("../util/dmDB"); +const moment = require('moment-timezone'); +var { PlanePoint, entityHJ, simuStatus } = require("../util/variable"); + +//加载航空兵数据 +exports.loadHKBData = (req, res, next) => { + simuStatus["参考时间"] = req.query.RQ; + + var params = ["bdid", "jx", "jh", "qc_dh", "zy", "dwjc", "dwdm", "fxsj_ly", "hc_dm", "hc_xm", "txbg_sk", "rwlx"]; + var whereSql = "RWBS = '" + req.query.RWBS + "' and RQ = '" + req.query.RQ + "' and BC = " + req.query.BC; + dataBase.queryTable("kzdk.RW_FXJC", params, whereSql).then(async (data) => { + var array = []; + + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + console.log(result); + + var bdid = result[0]; + var zy = result[4]; + var qcdh = result[3]; + let obj = {}; + obj["BDID"] = bdid; + obj["型号"] = result[1]; + obj["机号"] = result[2]; + obj["编号"] = qcdh; + obj["阵营"] = zy; + obj["单位简称"] = result[5]; + obj["单位代码"] = result[6]; + obj["数据来源"] = result[7]; + obj["后舱代号"] = result[8]; + obj["后舱姓名"] = result[9]; + obj["体系摧毁时刻"] = result[10]; + obj["装备类别"] = "飞机"; + obj["执行任务"] = result[11]; + obj["体系摧毁文本信息"] = "体系摧毁时间为:" + moment(result[10]).format('HH:mm:ss'); + obj["体系摧毁文本颜色"] = "255,0,0,255"; + + var hj = await getHjFromDb(obj, bdid, "航迹", 1000, 1, "飞机"); + if (!hj) { + hj = await getHjFromDb(obj, bdid, "航迹", 1000, 0, "飞机"); + } + + //存入空空攻击事件map + var kksjlist = await getKkwqsyList(bdid, "有效", qcdh, zy, req.query.RQ, req.query.RWBS); + + //存入空地攻击事件map + var kdsjlist = await getKdwqsyList(bdid, "有效", req.query.RQ); + + //红外弹事件 + var hwdList = await getGrqkList(bdid, "红外弹", qcdh, req.query.RQ); + + //箔条弹事件 + var hwdList = await getGrqkList(bdid, "箔条弹", qcdh, req.query.RQ); + + //有源干扰事件 + var yyList = await getGrqkList(bdid, "有源干扰", qcdh, req.query.RQ); + + //机载雷达事件 + var ldList = await getGrqkList(bdid, "机载雷达", qcdh, req.query.RQ); + + array.push(obj); + + result = await data.getRow(); + } + + res.json(util.getReturnData(1, '查询成功', array)); + }); +} + +//加载飞机航迹 +getHjFromDb = async (obj, bdid, sjlx, sjjd, zsj, zblb) => { + var params = ["nr"]; + var whereSql = "jcid = '" + bdid + "' and sjlx = '" + sjlx + "' and sjjd = " + sjjd + " and zsj = " + zsj; + var data = await dataBase.queryTable("kzdk.rw_fj_sj", params, whereSql); + // 从结果集中获取一行 + var result = await data.getRow(); + if (result) { + var lob = result[0]; + var buffer = await dataBase.readLob(lob); + await lob.close(); + + var points = new Map(); + var size = PlanePoint.length(); + var count = buffer.length / size; + for (let i = 0; i < count; i++) { + var offset = i * size; + const byte = buffer.subarray(offset, offset + size); + PlanePoint.setBuffer(byte); + + let pt = {}; + pt["iNum"] = PlanePoint.get('iNum'); + pt["iRelTime"] = PlanePoint.get('iRelTime'); + pt["空速"] = PlanePoint.get('dAirspeed'); + pt["升降率"] = PlanePoint.get('dSjl'); + pt["过载"] = PlanePoint.get('dOverload'); + pt["马赫数"] = PlanePoint.get('dMach'); + pt["经度"] = PlanePoint.get('dLongitude'); + pt["纬度"] = PlanePoint.get('dLatitude'); + pt["海拔"] = PlanePoint.get('dAlitidude'); + pt["航向角"] = PlanePoint.get('dHxj'); + pt["俯仰角"] = PlanePoint.get('dFyj'); + pt["倾斜角"] = PlanePoint.get('dQxj'); + + if (zblb == "飞机") { + if (i == 0) { + obj["经度"] = PlanePoint.get('dLongitude'); + obj["纬度"] = PlanePoint.get('dLatitude'); + obj["海拔"] = PlanePoint.get('dAlitidude'); + obj["航向角"] = PlanePoint.get('dHxj'); + obj["俯仰角"] = PlanePoint.get('dFyj'); + obj["倾斜角"] = PlanePoint.get('dQxj'); + } + } + + points.set(PlanePoint.get('iRelTime'), pt); + } + + const sortMap = new Map([...points].sort((a, b) => a[0] - b[0])); + + if (sortMap.size > 0) { + var startSimu = simuStatus["开始时间"]; + var endSimu = simuStatus["结束时间"]; + const keysArray = [...sortMap.keys()]; + var start = keysArray[0]; + var end = keysArray[keysArray.length - 1]; + if (startSimu < 0.0) { + startSimu = start; + } + if (start < startSimu) { + startSimu = start; + } + if (end > endSimu) { + endSimu = end; + } + simuStatus["开始时间"] = startSimu; + simuStatus["当前时间"] = startSimu; + simuStatus["结束时间"] = endSimu; + } + + entityHJ.set(bdid, sortMap); + + return points; + } +} + +//空空攻击事件 +getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { + //查询空空武器攻击事件 + var params = ["dx", "fsbh", "GJ_JL", "GJ_FW", "gj_sk", "GJTS", "DMZYSK", "ZD_JSSK", "gjxg_qrmb", "MZYXX", "FS_JH"]; + var whereSql = "sjlx = '空空' and gjxg_qrxg = '" + qrxg + "' and bdid = '" + bdid + "'"; + var data = await dataBase.queryTable("kzdk.rw_fxjc_wqsy", params, whereSql); + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + let sjmap = {}; + var zerotime = moment(rq); + var starttime = moment(result[4]); + var endtime = moment(result[6]); + var jhsk = moment(result[7]); + var dx = result[0]; + var mzyxx = result[9]; + var fsbh = result[1]; + var mbdh = result[8]; + var ddbh = "/" + fsbh + " " + dx + "->" + mbdh; + var gjxx = qcdh + ddbh; + var strNewBH = bdid + "-" + fsbh; + //添加引导发射飞机信息 + var FS_JH = result[10]; + var ts = result[5]; + var jl = result[2]; + + if (mzyxx == "命中") { + //没有结束时间进行简易弹道计算 + if (!endtime) { + var zdsk, mzsk; + var obj = await getDxInfoFromDb(dx, rwbs); + var lb = obj["lb"]; + var mzdjlyt = obj["MZDJL_YT"]; + var mzdjlwh = obj["MZDJL_WH"]; + var dmjjsdyt = obj["DMJJSD_YT"]; + var dmjjsdwh = obj["DMJJSD_WH"]; + var t = 0; + if (lb == "中距") { + if (ts == "尾后") { + if (dmjjsdwh <= 0) { + } + else { + var x = jl - mzdjlyt; + if (x < 0) { + zdsk = starttime; + } + else { + t = Math.round(x / dmjjsdwh); + zdsk = starttime.add(t, 'seconds'); + } + t = Math.round(jl / dmjjsdwh); + mzsk = starttime.add(t, 'seconds'); + } + } + else { + if (dmjjsdyt <= 0) { + } + else { + var x = jl - mzdjlyt; + if (x < 0) { + zdsk = starttime; + } + else { + t = Math.round(x / dmjjsdyt); + zdsk = starttime.add(t, 'seconds'); + } + t = Math.round(jl / dmjjsdyt); + mzsk = starttime.add(t, 'seconds'); + } + } + } + else { + if (ts == "尾后") { + if (dmjjsdwh <= 0) { + + } + else { + zdsk = starttime; + t = Math.round(jl / dmjjsdwh); + mzsk = starttime.add(t, 'seconds'); + } + } + else { + if (dmjjsdyt <= 0) { + } + else { + zdsk = starttime; + t = Math.round(jl / dmjjsdyt); + mzsk = starttime.add(t, 'seconds'); + } + } + } + } + } + else { + endtime = starttime.add(10, 'seconds'); + } + + var startms = zerotime.diff(starttime, 'ms'); + var endms = zerotime.diff(endtime, 'ms'); + + sjmap["开始时间"] = startms; + sjmap["结束时间"] = endms; + sjmap["被攻击目标"] = mbdh; + + //事件附加参数 + let csmap = {}; + var kkddhj = await getKkddFromDb(bdid, fsbh); + if (kkddhj) { + csmap["型号"] = dx; + csmap["编号"] = strNewBH; + csmap["阵营"] = zy; + csmap["攻击目标"] = mbdh; + csmap["装备类别"] = "空空弹"; + csmap["航迹"] = kkddhj; + if (jhsk) { + var jhms = zerotime.diff(jhsk, 'ms'); + + csmap["制导结束时刻"] = jhms + 1; + csmap["攻击开始时刻"] = startms; + csmap["结束时刻"] = endms; + } + + var num = kkddhj.size; + endtime = starttime.add(num * 10, 'ms'); //导弹航迹精度为10ms + var endms = zerotime.diff(endtime, 'ms'); + sjmap["结束时间"] = endms; + } + csmap["标识"] = qcdh + fsbh; + csmap["攻击信息"] = gjxx; + csmap["命中状态"] = mzyxx; + csmap["发射机号"] = FS_JH; + + sjmap["参数"] = csmap; + //传入Gis的事件 + array.push(sjmap); + + result = await data.getRow(); + } + + return array; +} + +//导弹类型信息 +getDxInfoFromDb = async (dx, rwbs) => { + var params = ["lb", "MZDJL_YT", "MZDJL_WH", "DMJJSD_YT", "DMJJSD_WH"]; + var whereSql = "rwbs = '" + rwbs + "' and dx = '" + dx + "'"; + var data = await dataBase.queryTable("kzdk.rw_pggz_kkdcs", params, whereSql); + // 从结果集中获取一行 + var result = await data.getRow(); + var obj = {}; + obj["lb"] = result[0]; + obj["MZDJL_YT"] = result[1]; + obj["MZDJL_WH"] = result[2]; + obj["DMJJSD_YT"] = result[3]; + obj["DMJJSD_WH"] = result[4]; + return obj; +} + +//空空导弹航迹 +getKkddFromDb = async (bdid, gjcx) => { + var params = ["ddsj"]; + var whereSql = "jcid = '" + bdid + "' and gjcx = '" + gjcx + "'"; + var data = await dataBase.queryTable("kzdk.rw_kzdd_sj", params, whereSql); + // 从结果集中获取一行 + var result = await data.getRow(); + if (result) { + var lob = result[0]; + var buffer = await dataBase.readLob(lob); + await lob.close(); + + var points = new Map(); + var size = PlanePoint.length(); + var count = buffer.length / size; + for (let i = 0; i < count; i++) { + var offset = i * size; + const byte = buffer.subarray(offset, offset + size); + PlanePoint.setBuffer(byte); + + points.set(PlanePoint.get('iRelTime'), PlanePoint); + } + + const sortMap = new Map([...points].sort((a, b) => a[0] - b[0])); + return sortMap; + } +} + +//空地攻击事件 +getKdwqsyList = async (bdid, qrxg, rq) => { + //查询空地武器攻击事件 + var params = ["gj_sk", "DMZYSK", "gjxg_qrmb", "dx", "fsbh"]; + var whereSql = "sjlx = '空地' and gjxg_qrxg = '" + qrxg + "' and bdid = '" + bdid + "'"; + var data = await dataBase.queryTable("kzdk.rw_fxjc_wqsy", params, whereSql); + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + let sjmap = {}; + + var zerotime = moment(rq); + var starttime = moment(result[0]); + var endtime = moment(result[1]); + var fsbh = result[4]; + var startms = zerotime.diff(starttime, 'ms'); + var endms = zerotime.diff(endtime, 'ms'); + + if (startms <= endms || endms == 0) { + endms = startms + 10000; + } + + sjmap["开始时间"] = startms; + sjmap["结束时间"] = endms; + sjmap["被攻击目标"] = result[2]; + + //事件附加参数 + let csmap = {}; + csmap["弹型"] = result[3]; + csmap["攻击信息"] = bdid + fsbh; + csmap["事件标识"] = bdid + fsbh; + sjmap["参数"] = csmap; + + //传入Gis的事件 + array.push(sjmap); + + result = await data.getRow(); + } + + return array; +} + +//干扰事件 +getGrqkList = async (bdid, grlx, qcdh, rq) => { + var params = []; + var whereSql = "grlx = '" + grlx + "' and bdid = '" + bdid + "'"; + var data = await dataBase.queryTable("kzdk.rw_fxjc_grqk", params, whereSql); + + var zerotime = moment(rq); + + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + var grsd = moment(result[1]); + var grjs = moment(result[4]); + if (grjs < grsd) { + grjs = grsd.add(30, 'seconds'); + } + + var grSec = zerotime.diff(grsd, 'ms'); + var grjsSec = zerotime.diff(grjs, 'ms'); + var grfx = result[5]; + var tfsl = result[3]; + + let map = {}; + map["干扰时刻"] = grSec; + if (grlx != "有源干扰" && !grjs) { + grjsSec = grSec + 10 * 1000; + } + + map["干扰结束时刻"] = grjsSec; + + let csMap = {}; + csMap["干扰方向"] = grfx; + csMap["干扰类型"] = grlx; + csMap["事件标识"] = qcdh + "-" + grSec + grlx + tfsl; + csMap["编号"] = qcdh; + map["参数"] = csMap; + array.push(map); + + result = await data.getRow(); + } + + return array; +} + +//加载地导部队数据和地导攻击事件 +exports.loadDDData = (req, res, next) => { + var params = ["bdid", "dwjc", "zy", "wqxh", "zdzb_jd", "zdzb_wd", "zdzb_hb", "DYLB", "txbg_sk"]; + var whereSql = "RWBS = '" + req.query.RWBS + "' and RQ = '" + req.query.RQ + "' and BC = " + req.query.BC; + dataBase.queryTable("kzdk.RW_DD_KJJL", params, whereSql).then(async (data) => { + var array = []; + + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + console.log(result); + + var bdid = result[0]; + var dwjc = result[1]; + var zy = result[2]; + var wqxh = result[3]; + var dylb = result[7]; + + let obj = {}; + obj["BDID"] = bdid; + obj["型号"] = dwjc; + obj["编号"] = dwjc; + obj["阵营"] = zy; + obj["经度"] = result[4]; + obj["纬度"] = result[5]; + obj["海拔"] = result[6]; + obj["装备类别"] = "地导阵地"; + obj["武器型号"] = wqxh; + obj["名称"] = "地导阵地"; + obj["体系摧毁时刻"] = result[8]; + obj["体系摧毁文本信息"] = "体系摧毁时间为:" + moment(result[8]).format('HH:mm:ss'); + obj["体系摧毁文本颜色"] = "255,0,0,255"; + //obj["参数"] = "255,0,0,255"; + + if (dylb == "舰艇") { + var hj = await getHjFromDb(obj, bdid, "航迹", 100, 1, "地导阵地"); + if (!hj) { + hj = await getHjFromDb(obj, bdid, "航迹", 100, 0, "地导阵地"); + } + } + + //当前地导阵地所有地空攻击事件 + var dksjlist = await getDkwqsyList(bdid, zy, dwjc, req.query.RQ); + + array.push(obj); + + result = await data.getRow(); + } + + res.json(util.getReturnData(1, '查询成功', array)); + }); +} + +//查询地空武器攻击事件 +//地导武器发射 +getDkwqsyList = async (bdid, zy, dwjc, rq) => { + var params = ["gjcx", "gjd", "qrxg_mbxh", "qrxg_qrmb", "sk", "qrxg_ywx", "ddbh"]; + var whereSql = "jd = '发射' and bdid = '" + bdid + "'"; + var data = await dataBase.queryTable("kzdk.rw_dd_wqgj", params, whereSql); + var array = []; + + var zerotime = moment(rq); + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + var starttime = moment(result[4]); + var gjcx = result[0]; + var gjd = result[1]; + var qrxg_mbxh = result[2]; + var qrxg_qrmb = result[3]; + var qrxg_ywx = result[5]; + var ddbh = result[6]; + if (qrxg_ywx == "有效") { + var endtime = await getDdwqzyList(bdid, gjcx, ddbh, gjd); + if (endtime) { + let sjmap = {}; + + var startms = zerotime.diff(starttime, 'ms'); + var endms = zerotime.diff(endtime, 'ms'); + if (endms == 0 || endms <= startms) { + endms = startms + 10000; + } + //事件附加参数 + let csmap = {}; + var Dkddhj = await getDkddFromDb(bdid, gjcx, ddbh); + if (Dkddhj) { + var wqxh = await getWqXhFromDb(bdid); + if (wqxh) { + csmap["型号"] = wqxh; + } + csmap["编号"] = bdid + "-" + gjcx + "-" + ddbh; + csmap["阵营"] = zy; + csmap["攻击目标"] = qrxg_qrmb; + csmap["装备类别"] = "地空弹"; + csmap["航迹"] = Dkddhj; + } + csmap["攻击信息"] = wqxh + "/" + dwjc + "-" + qrxg_qrmb + "-" + gjcx + "-" + ddbh; + csmap["命中状态"] = "命中"; + csmap["事件标识"] = bdid + gjcx + ddbh; + + sjmap["开始时间"] = startms; + sjmap["结束时间"] = endms; + sjmap["被攻击目标"] = qrxg_qrmb; + sjmap["参数"] = csmap; + + //传入Gis的事件 + array.push(sjmap); + } + } + + result = await data.getRow(); + } + + return array; +} + +//地导武器遭遇 +getDdwqzyList = async (bdid, gjcx, ddbh, gjd) => { + var params = ["sk", "qrxg_ywx"]; + var whereSql = "jd = '遭遇' and bdid = '" + bdid + "' and gjcx = " + gjcx + " and ddbh = " + ddbh + " and gjd = " + gjd; + var data = await dataBase.queryTable("kzdk.rw_dd_wqgj", params, whereSql); + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + var sk = moment(result[0]); + var qrxg_ywx = result[1]; + if (qrxg_ywx == "有效") { + return sk; + } + result = await data.getRow(); + } +} + +//地空导弹轨迹 +getDkddFromDb = async (bdid, gjcx, ddbh) => { + var params = ["ddsj"]; + var whereSql = "bdid = '" + bdid + "' and gjcx = " + gjcx + " and ddbh = " + ddbh; + var data = await dataBase.queryTable("kzdk.RW_DDDD_SJ", params, whereSql); + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + if (result) { + var lob = result[0]; + var buffer = await dataBase.readLob(lob); + await lob.close(); + + var points = new Map(); + var size = PlanePoint.length(); + var count = buffer.length / size; + for (let i = 0; i < count; i++) { + var offset = i * size; + const byte = buffer.subarray(offset, offset + size); + PlanePoint.setBuffer(byte); + + points.set(PlanePoint.get('iRelTime'), PlanePoint); + } + + const sortMap = new Map([...points].sort((a, b) => a[0] - b[0])); + return sortMap; + } +} + +//查询地导武器型号 +getWqXhFromDb = async (bdid) => { + var params = ["WQXH"]; + var whereSql = "bdid = '" + bdid + "'"; + var data = await dataBase.queryTable("kzdk.RW_DD_KJJL", params, whereSql); + var array = []; + // 从结果集中获取一行 + var result = await data.getRow(); + if (result) { + var WQXH = result[0]; + return WQXH; + } +} + +//加载地面目标名称和坐标(包含机动目标和打击目标) +// exports.loadDMMBData = async (req, res, next) => { +// await loadDJMBData(req, res, next); +// await loadJDMBData(req, res, next); +// } + +//加载打击目标数据 +exports.loadDJMBData = (req, res, next) => { + var params = ["mbmc", "mbbh", "mbjd", "mbwd", "mbgd", "ssdw", "mblx"]; + var whereSql = "rwbs = '" + req.query.RWBS + "'"; + dataBase.queryTable("kzdk.rw_djmb", params, whereSql).then(async (data) => { + var array = []; + + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + console.log(result); + + var dwjc = result[0]; + var zy = result[5]; + + let obj = {}; + obj["型号"] = dwjc; + obj["编号"] = result[1]; + obj["阵营"] = zy; + obj["经度"] = result[2]; + obj["纬度"] = result[3]; + obj["海拔"] = result[4]; + obj["装备类别"] = "打击目标"; + //obj["参数"] = "255,0,0,255"; + + array.push(obj); + + result = await data.getRow(); + } + + res.json(util.getReturnData(1, '查询成功', array)); + }); +}; + +//加载机动目标数据 +exports.loadJDMBData = (req, res, next) => { + var params = ["mbmc", "mbbh", "mbjd", "mbwd", "mbgd", "ssdw", "mblx", "ckqx"]; + var whereSql = "rwbs = '" + req.query.RWBS + "' and rwrq = '" + req.query.RQ + "' and bc = " + req.query.BC; + dataBase.queryTable("kzdk.rw_jdmb", params, whereSql).then(async (data) => { + var array = []; + + // 从结果集中获取一行 + var result = await data.getRow(); + while (result) { + console.log(result); + + var dwjc = result[0]; + var zy = result[5]; + + let obj = {}; + obj["型号"] = dwjc; + obj["编号"] = result[1]; + obj["阵营"] = zy; + obj["经度"] = result[2]; + obj["纬度"] = result[3]; + obj["海拔"] = result[4]; + obj["装备类别"] = "机动目标"; + //obj["参数"] = "255,0,0,255"; + + array.push(obj); + + result = await data.getRow(); + } + + res.json(util.getReturnData(1, '查询成功', array)); + }); +}; \ No newline at end of file diff --git a/controller/socket.js b/controller/socket.js new file mode 100644 index 0000000..0ff6c3d --- /dev/null +++ b/controller/socket.js @@ -0,0 +1,123 @@ +const WebSocket = require('ws'); +const util = require("../util/common"); +var { entityHJ, simuStatus } = require("../util/variable"); + +const deltaT = 1000; + +const createServer = () => { + // 创建WebSocket服务器 + const wss = new WebSocket.Server({ port: 9000 }); + + wss.on('connection', function connection(ws) { + console.log('新客户端已连接'); + + // 定时发送消息 + const intervalId = setInterval(() => { + var simType = simuStatus["运行状态"]; + if (simType == 1) { + var currRadio = simuStatus["仿真倍速"]; + var currTime = simuStatus["当前时间"]; + if (entityHJ.size > 0) { + var array = []; + for (const [key, value] of entityHJ) { + const keysArray = [...value.keys()]; + var indexKey = util.lower_bound(keysArray, currTime); + if (indexKey < keysArray.length) { + let point = {}; + var second = keysArray[indexKey]; + if (indexKey == 0) { + point = value.get(second); + } + else { + var first = keysArray[indexKey - 1]; + var delta_time = second - first; + if (delta_time == 0.0) { + point = value.get(first); + } + else { + var pointfirst = value.get(first); + var pointsecond = value.get(second); + + point["空速"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["空速"], + pointsecond["空速"]); + + point["升降率"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["升降率"], + pointsecond["升降率"]); + + point["过载"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["过载"], + pointsecond["过载"]); + + point["马赫数"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["马赫数"], + pointsecond["马赫数"]); + + point["经度"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["经度"], + pointsecond["经度"]); + + point["纬度"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["纬度"], + pointsecond["纬度"]); + + point["海拔"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["海拔"], + pointsecond["海拔"]); + + point["航向角"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["航向角"], + pointsecond["航向角"]); + + point["俯仰角"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["俯仰角"], + pointsecond["俯仰角"]); + + point["倾斜角"] = util.interpolate( + (currTime - first) / delta_time, + pointfirst["倾斜角"], + pointsecond["倾斜角"]); + } + } + + point["BDID"] = key; + array.push(point); + } + } + + const message = { + time: currTime, + data: array + }; + ws.send(JSON.stringify(message)); // 发送JSON格式的消息 + } + + var accTime = deltaT * currRadio; + currTime += accTime; + + simuStatus["当前时间"] = currTime; + } + + }, deltaT); // 每5秒发送一次消息 + + // 可以在这里添加更多的逻辑,例如当客户端关闭连接时清除定时器等 + ws.on('close', () => { + clearInterval(intervalId); // 清除定时器,防止内存泄漏 + console.log('客户端已断开连接'); + }); + }); + + console.log('WebSocket服务器正在运行在ws://localhost:9000'); +} + +module.exports = createServer() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..37adf99 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1249 @@ +{ + "name": "dmserve", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dmserve", + "version": "0.0.0", + "dependencies": { + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "dmdb": "^1.0.33801", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "jade": "~1.11.0", + "moment-timezone": "^0.5.47", + "morgan": "~1.9.1", + "struct": "^0.0.12", + "ws": "^8.18.1" + } + }, + "node_modules/@napi-rs/snappy-android-arm-eabi": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.2.2.tgz", + "integrity": "sha512-H7DuVkPCK5BlAr1NfSU8bDEN7gYs+R78pSHhDng83QxRnCLmVIZk33ymmIwurmoA1HrdTxbkbuNl+lMvNqnytw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-android-arm64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.2.2.tgz", + "integrity": "sha512-2R/A3qok+nGtpVK8oUMcrIi5OMDckGYNoBLFyli3zp8w6IArPRfg1yOfVUcHvpUDTo9T7LOS1fXgMOoC796eQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-darwin-arm64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.2.2.tgz", + "integrity": "sha512-USgArHbfrmdbuq33bD5ssbkPIoT7YCXCRLmZpDS6dMDrx+iM7eD2BecNbOOo7/v1eu6TRmQ0xOzeQ6I/9FIi5g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-darwin-x64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.2.2.tgz", + "integrity": "sha512-0APDu8iO5iT0IJKblk2lH0VpWSl9zOZndZKnBYIc+ei1npw2L5QvuErFOTeTdHBtzvUHASB+9bvgaWnQo4PvTQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-freebsd-x64": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.2.2.tgz", + "integrity": "sha512-mRTCJsuzy0o/B0Hnp9CwNB5V6cOJ4wedDTWEthsdKHSsQlO7WU9W1yP7H3Qv3Ccp/ZfMyrmG98Ad7u7lG58WXA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm-gnueabihf": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.2.2.tgz", + "integrity": "sha512-v1uzm8+6uYjasBPcFkv90VLZ+WhLzr/tnfkZ/iD9mHYiULqkqpRuC8zvc3FZaJy5wLQE9zTDkTJN1IvUcZ+Vcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm64-gnu": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.2.2.tgz", + "integrity": "sha512-LrEMa5pBScs4GXWOn6ZYXfQ72IzoolZw5txqUHVGs8eK4g1HR9HTHhb2oY5ySNaKakG5sOgMsb1rwaEnjhChmQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-arm64-musl": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.2.2.tgz", + "integrity": "sha512-3orWZo9hUpGQcB+3aTLW7UFDqNCQfbr0+MvV67x8nMNYj5eAeUtMmUE/HxLznHO4eZ1qSqiTwLbVx05/Socdlw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-x64-gnu": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.2.2.tgz", + "integrity": "sha512-jZt8Jit/HHDcavt80zxEkDpH+R1Ic0ssiVCoueASzMXa7vwPJeF4ZxZyqUw4qeSy7n8UUExomu8G8ZbP6VKhgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-linux-x64-musl": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.2.2.tgz", + "integrity": "sha512-Dh96IXgcZrV39a+Tej/owcd9vr5ihiZ3KRix11rr1v0MWtVb61+H1GXXlz6+Zcx9y8jM1NmOuiIuJwkV4vZ4WA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-arm64-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.2.2.tgz", + "integrity": "sha512-9No0b3xGbHSWv2wtLEn3MO76Yopn1U2TdemZpCaEgOGccz1V+a/1d16Piz3ofSmnA13HGFz3h9NwZH9EOaIgYA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-ia32-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.2.2.tgz", + "integrity": "sha512-QiGe+0G86J74Qz1JcHtBwM3OYdTni1hX1PFyLRo3HhQUSpmi13Bzc1En7APn+6Pvo7gkrcy81dObGLDSxFAkQQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/snappy-win32-x64-msvc": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.2.2.tgz", + "integrity": "sha512-a43cyx1nK0daw6BZxVcvDEXxKMFLSBSDTAhsFD0VqSKcC7MGUBMaqyoWUcMiI7LBSz4bxUmxDWKfCYzpEmeb3w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==", + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha512-6OEBVBlf/y8LaAphnbAnt743O3zMhlBer+FO5D40H6wqAdU9B1TvuApkejgLW0cvv0tEZNLktv1AnRI+C87ueQ==" + }, + "node_modules/clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", + "dependencies": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "bin": { + "cleancss": "bin/cleancss" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha512-UnEggAQrmhxuTxlb7n1OsTtagNXWUv2CRlOogZhWOU4jLK4EJEbF8UDSNxuGu+jVtWNtO2j51ab2H1wlBIzF/w==", + "deprecated": "Please update to at least constantinople 3.1.1", + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha512-qmTYWhHk910nQWnGqMAiWWPQlB6tESiWgNebQJmiozOAGcBAQ1+U/UzUOkhdrcshlkSRRiKWodwmVvO0OmnIGg==", + "dependencies": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "node_modules/css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha512-pfstzKVRZiHprDXdsmtfH1HYUEw22lzjuHdnpe1hscwoQvgW2C5zDQIBE0RKoALEReTn9W1ECdY8uaT/kO4VfA==" + }, + "node_modules/css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha512-aIThpcErhG5EyHorGqNlTh0TduNBqLrrXLO3x5rku3ZKBxuVfY+T7noyM2G2X/01iQANqJUb6d3+FLoa+N7Xwg==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/dmdb": { + "version": "1.0.33801", + "resolved": "https://registry.npmjs.org/dmdb/-/dmdb-1.0.33801.tgz", + "integrity": "sha512-lBG+a11PtC0pF3R0x3N+XREsi7rTTT6qQsCmsb9XLNTMwiGa8RAZy0uOxztb3nqC15xcK9IXGiapSWxY2yopHA==", + "dependencies": { + "iconv-lite": "^0.5.1", + "snappy": "^7.2.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/dmdb/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dependencies": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha512-J76sbGKeLtu7uwW97Ntzb1UvGnpKTDplYa9ROr2gNRhM+SxvlBSG0Ees3TQ8+7ya2UVkzMEeFxhRhEpN68s7Tg==", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dependencies": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + }, + "bin": { + "jade": "bin/jade.js" + } + }, + "node_modules/jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha512-b7tmf91j1ChMuYhwbPBnNgB62dmHuqiHpOdd6QLKzde8HydZqm+ud3qWreGWecSxPBFFNOf1Ozjx0xo2plFdHA==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.47", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", + "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dependencies": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dependencies": { + "wordwrap": "~0.0.2" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha512-O+uwGKreKNKkshzZv2P7N64lk6EP17iXBn0PbUnNQhk+Q0AHLstiTrjkx3v5YBd3cxUe7Sq6KyRhl/A0xUjk7Q==", + "dependencies": { + "asap": "~1.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/snappy": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/snappy/-/snappy-7.2.2.tgz", + "integrity": "sha512-iADMq1kY0v3vJmGTuKcFWSXt15qYUz7wFkArOrsSg0IFfI3nJqIJvK2/ZbEIndg7erIJLtAVX2nSOqPz7DcwbA==", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/snappy-android-arm-eabi": "7.2.2", + "@napi-rs/snappy-android-arm64": "7.2.2", + "@napi-rs/snappy-darwin-arm64": "7.2.2", + "@napi-rs/snappy-darwin-x64": "7.2.2", + "@napi-rs/snappy-freebsd-x64": "7.2.2", + "@napi-rs/snappy-linux-arm-gnueabihf": "7.2.2", + "@napi-rs/snappy-linux-arm64-gnu": "7.2.2", + "@napi-rs/snappy-linux-arm64-musl": "7.2.2", + "@napi-rs/snappy-linux-x64-gnu": "7.2.2", + "@napi-rs/snappy-linux-x64-musl": "7.2.2", + "@napi-rs/snappy-win32-arm64-msvc": "7.2.2", + "@napi-rs/snappy-win32-ia32-msvc": "7.2.2", + "@napi-rs/snappy-win32-x64-msvc": "7.2.2" + } + }, + "node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/struct": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/struct/-/struct-0.0.12.tgz", + "integrity": "sha512-PV2nfc79Od13idbDWQZcsBZlmeDTdPP67cOYTUWZfYE77MWGhEGgGIAFtpO1UdOvDzB3I//jbFaA09JXNRAO3A==", + "engines": { + "node": ">0.6.0" + } + }, + "node_modules/transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha512-zJf5m2EIOngmBbDe2fhTPpCjzM2qkZVqrFJZc2jaln+KBeEaYKhS2QMOIkfVrNUyoOwqgbTwOHATzr3jZRQDyg==", + "deprecated": "Deprecated, use jstransformer", + "dependencies": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + } + }, + "node_modules/transformers/node_modules/is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==" + }, + "node_modules/transformers/node_modules/promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha512-OgMc+sxI3zWF8D5BJGtA0z7/IsrDy1/0cPaDv6HPpqa2fSTo7AdON5U10NbZCUeF+zCAj3PtfPE50Hf02386aA==", + "dependencies": { + "is-promise": "~1" + } + }, + "node_modules/transformers/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/transformers/node_modules/uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", + "dependencies": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha512-mJZFpyEc1JTAdxhi/vhVeAM2S7vsltEKDiexDDo1HuAzlYKhcVUU6cwY8cHrFYdt82ZNkfKCeyhA3IYFegI0Kg==", + "dependencies": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + } + }, + "node_modules/with/node_modules/acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha512-FsqWmApWGMGLKKNpHt12PMc5AK7BaZee0WRh04fCysmTzHe+rrKOa2MKjORhnzfpe4r0JnfdqHn02iDA9Dqj2A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cee4800 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "dmserve", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./bin/www" + }, + "dependencies": { + "cookie-parser": "~1.4.4", + "debug": "~2.6.9", + "dmdb": "^1.0.33801", + "express": "~4.16.1", + "http-errors": "~1.6.3", + "jade": "~1.11.0", + "moment-timezone": "^0.5.47", + "morgan": "~1.9.1", + "struct": "^0.0.12", + "ws": "^8.18.1" + } +} diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/routes/Mission.js b/routes/Mission.js new file mode 100644 index 0000000..d740faf --- /dev/null +++ b/routes/Mission.js @@ -0,0 +1,21 @@ +var express = require('express'); +var router = express.Router(); + +var { loadHKBData, loadDDData, loadDJMBData, loadJDMBData } = require('../controller/Mission'); + +//航空兵数据 +router.get('/HKBData', loadHKBData); + +//地导部队数据 +router.get('/DDData', loadDDData); + +//地面目标数据 +// router.get('/DMMBData', loadDMMBData); + +//打击目标数据 +router.get('/DJMBData', loadDJMBData); + +//机动目标数据 +router.get('/JDMBData', loadJDMBData); + +module.exports = router; \ No newline at end of file diff --git a/routes/simu.js b/routes/simu.js new file mode 100644 index 0000000..e4b43f7 --- /dev/null +++ b/routes/simu.js @@ -0,0 +1,24 @@ +var express = require('express'); +var router = express.Router(); +const util = require("../util/common"); +var { simuStatus } = require("../util/variable"); + +router.post('/SimuType', function (req, res, next) { + const simuType = req.body.simuType; + simuStatus["运行状态"] = simuType; + res.json(util.getReturnData(1, '修改运行状态成功')); +}); + +router.post('/SimuRadio', function (req, res, next) { + const simuRadio = req.body.simuRadio; + simuStatus["仿真倍速"] = simuRadio; + res.json(util.getReturnData(1, '修改仿真倍速成功')); +}); + +router.post('/SimuTime', function (req, res, next) { + const simuTime = req.body.simuTime; + simuStatus["当前时间"] = simuTime; + res.json(util.getReturnData(1, '修改仿真当前时间成功')); +}); + +module.exports = router; \ No newline at end of file diff --git a/util/common.js b/util/common.js new file mode 100644 index 0000000..4c2bc48 --- /dev/null +++ b/util/common.js @@ -0,0 +1,70 @@ +let util = {}; +util.getReturnData = (code, message = '', data = []) => { + //保证数据格式 + if (!data) { + data = []; + } + return { code: code, message: message, data: data }; +} + +//转换为格式化时间 +util.getLocalDate = (t) => { + let date = new Date(parseInt(t)); + return date.getFullYear() + "-" + (parseInt(date.getMonth()) + 1) + "-" + + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + + date.getSeconds(); +} + +/** + * 寻找>=target的最小下标 + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +util.lower_bound = (nums, target) => { + let first = 0; + let len = nums.length; + + while (len > 0) { + let half = len >> 1; + let middle = first + half; + if (nums[middle] < target) { + first = middle + 1; + len = len - half - 1; + } else { + len = half; + } + } + return first; +} + +/** + * 寻找>target的最小下标 + * @param {number[]} nums + * @param {number} target + * @return {number} + */ +util.upper_bound = (nums, target) => { + let first = 0; + let len = nums.length; + + while (len > 0) { + let half = len >> 1; + let middle = first + half; + if (nums[middle] > target) { + len = half; + } else { + first = middle + 1; + len = len - half - 1; + } + } + return first; +} + +util.interpolate = (ratio, first, second) => { + let one_minus_ratio = 1.0 - ratio; + let data = first * one_minus_ratio + second * ratio; + return data; +} + +module.exports = util; \ No newline at end of file diff --git a/util/dmDB.js b/util/dmDB.js new file mode 100644 index 0000000..a0306b3 --- /dev/null +++ b/util/dmDB.js @@ -0,0 +1,102 @@ +//引入 dmdb 包 +var db = require('dmdb'); +var fs = require('fs'); +const dbConfig = require("../config/db.json").db_config; +var pool, conn; +let dataBase = {}; + +//创建连接池 +async function createPool() { + try { + var connect = "dm://" + dbConfig.username + ":" + dbConfig.password + "\@" + dbConfig.host + ":" + dbConfig.port + "?autoCommit=false&loginEncrypt=false"; + console.log(connect); + + return db.createPool({ + connectString: connect, + poolMax: 10, + poolMin: 1 + }); + } catch (err) { + throw new Error("createPool error: " + err.message); + } +} + +//获取数据库连接 +async function getConnection() { + try { + return pool.getConnection(); + } catch (err) { + throw new Error("getConnection error: " + err.message); + } +} + +//读取数据库返回的 Lob 对象 +dataBase.readLob = (lob) => { + return new Promise(function (resolve, reject) { + var blobData = Buffer.alloc(0); + var totalLength = 0; + lob.on('data', function (chunk) { + totalLength += chunk.length; + blobData = Buffer.concat([blobData, chunk], totalLength); + }); + lob.on('error', function (err) { + reject(err); + }); + lob.on('end', function () { + resolve(blobData); + }); + }); +} + +dataBase.initDB = async () => { + pool = await createPool(); + conn = await getConnection(); +} + +dataBase.closeDB = async () => { + try { + await conn.close(); + await pool.close(); + } catch (err) { + throw new Error("closeDB error: " + err.message); + } +} + +/** + * 查询表中字段 + * @param tableName 数据库表名 + * @param params 需要查询的字段 + * @param whereSql 查询条件 + */ +dataBase.queryTable = async (tableName, params, whereSql) => { + try { + var sql = ""; + if (params != "") { + for (let index in params) { + if (sql != "") { + sql += ", "; + } + sql += params[index]; + } + } + else { + sql = "*"; + } + + var sql = "SELECT " + sql + " FROM " + tableName; + + if (whereSql != "") { + sql += " WHERE " + whereSql; + } + + console.log(sql); + + var result = await conn.execute(sql, [], { resultSet: true }); + var resultSet = result.resultSet; + return resultSet; + } catch (err) { + throw new Error("queryTable error: " + err.message); + } +} + +module.exports = dataBase; \ No newline at end of file diff --git a/util/variable.js b/util/variable.js new file mode 100644 index 0000000..a55ed1a --- /dev/null +++ b/util/variable.js @@ -0,0 +1,30 @@ +var Struct = require('struct'); + +exports.PlanePoint = Struct() + .word32Sle('iNum') + .word32Sle('iRelTime') + .doublele('dTimestamp') + .doublele('dLongitude') + .doublele('dLatitude') + .doublele('dHxj') + .doublele('dFyj') + .doublele('dQxj') + .doublele('dAlitidude') + .doublele('dAirspeed') + .doublele('dSjl') + .doublele('dOverload') + .doublele('dMach'); + +exports.entityHJ = new Map(); + +exports.entityEvent = new Map(); + +exports.simuStatus = { + "运行状态": 0, + "开始时间": -1, + "结束时间": -1, + "参考时间": "", + "当前时间": 0, + "仿真倍速": 1 +} + diff --git a/views/error.jade b/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/views/index.jade b/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/views/layout.jade b/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content diff --git a/说明.txt b/说明.txt new file mode 100644 index 0000000..8c1bd6b --- /dev/null +++ b/说明.txt @@ -0,0 +1,112 @@ +WebSocket监听端口为9000 +http 监听端口为3000 + +get +http://localhost:3000/Mission/HKBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //航空兵数据(后面3个参数是从界面选择的) +{ + "code": 1, + "message": "查询成功", + "data": [ + { + "BDID": "{8D08C120-CE62-452F-AD52-3DB88EED97CE}", + "型号": "F-14", + "机号": "69165", + "编号": "8505", + "阵营": "红军", + "单位简称": "K85L", + "单位代码": "10085", + "数据来源": null, + "后舱代号": "8512", + "后舱姓名": "李 勇", + "体系摧毁时刻": "2019-11-04T09:18:35.000Z", + "装备类别": "飞机", + "执行任务": "对地突击", + "体系摧毁文本信息": "体系摧毁时间为:17:18:35", + "体系摧毁文本颜色": "255,0,0,255", + "经度": 106.004173, + "纬度": 38.466488, + "海拔": 1117, + "航向角": 99.99, + "俯仰角": -1.47, + "倾斜角": -1.38 + } + ] +} + +http://localhost:3000/Mission/DDData?RWBS=测试2019&RQ=2019-11-04&BC=1 //地导部队数据 +{ + "code": 1, + "message": "查询成功", + "data": [ + { + "BDID": "{96B781E2-E633-4176-82C2-6EF0750C1A0B}", + "型号": "D7", + "编号": "D7", + "阵营": "红军", + "经度": 104.1703, + "纬度": 40.1789, + "海拔": 1426, + "装备类别": "地导阵地", + "武器型号": "BZ3", + "名称": "地导阵地", + "体系摧毁时刻": null, + "体系摧毁文本信息": "体系摧毁时间为:Invalid date", + "体系摧毁文本颜色": "255,0,0,255" + } + ] +} + +http://localhost:3000/Mission/DJMBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //打击目标数据 +{ + "code": 1, + "message": "查询成功", + "data": [ + { + "型号": "桥梁目标", + "编号": "桥梁目标", + "阵营": "蓝军", + "经度": 100.6858, + "纬度": 40.6932, + "海拔": 0, + "装备类别": "打击目标" + } + ] +} + +http://localhost:3000/Mission/JDMBData?RWBS=测试2019&RQ=2019-11-04&BC=1 //机动目标数据 +{ + "code": 1, + "message": "查询成功", + "data": [ + { + "型号": "假阵地1", + "编号": "假阵地1", + "阵营": "蓝军", + "经度": 100.604, + "纬度": 40.7526, + "海拔": null, + "装备类别": "机动目标" + } + ] +} + +post +//运行状态 +http://localhost:3000/Simu/SimuType +{ + "simuType":1 (1:开始; 0:其他) +} + +//设置当前仿真时间 +http://localhost:3000/Simu/SimuTime +{ + "simuTime":1 +} + +//仿真倍速 +http://localhost:3000/Simu/SimuRadio +{ + "simuRadio":1 +} + +