init
This commit is contained in:
76
tool/funTool.js
Normal file
76
tool/funTool.js
Normal file
@@ -0,0 +1,76 @@
|
||||
const fs = require("fs");
|
||||
const request = require("request");
|
||||
const path = require("path");
|
||||
|
||||
module.exports = {
|
||||
|
||||
|
||||
|
||||
|
||||
delay(seconds = 1, callback) {
|
||||
let promise = new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
if (callback) {
|
||||
callback();
|
||||
}
|
||||
resolve(true);
|
||||
}, seconds * 1000);
|
||||
});
|
||||
|
||||
return promise;
|
||||
},
|
||||
|
||||
mkdirsSync(dirname) {
|
||||
if (fs.existsSync(dirname)) {
|
||||
return true;
|
||||
} else {
|
||||
if (this.mkdirsSync(path.dirname(dirname))) {
|
||||
fs.mkdirSync(dirname);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
isExist(path) {
|
||||
let promise = new Promise((resolve, reject) => {
|
||||
fs.access(path, function (err) {
|
||||
if (err && err.code == "ENOENT") {
|
||||
resolve(false);
|
||||
}
|
||||
resolve(true);
|
||||
});
|
||||
});
|
||||
|
||||
return promise;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* 计算两个地理坐标点之间的距离(Haversine公式)
|
||||
* @param {number} lat1 起点纬度
|
||||
* @param {number} lng1 起点经度
|
||||
* @param {number} lat2 终点纬度
|
||||
* @param {number} lng2 终点经度
|
||||
* @returns {number|null} 距离(公里),如果坐标无效则返回null
|
||||
*/
|
||||
calculateDistance(lat1, lng1, lat2, lng2) {
|
||||
// 验证坐标参数
|
||||
if (!lat1 || !lng1 || !lat2 || !lng2 ||
|
||||
isNaN(lat1) || isNaN(lng1) || isNaN(lat2) || isNaN(lng2)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const R = 6371; // 地球半径(公里)
|
||||
const dLat = (lat2 - lat1) * Math.PI / 180;
|
||||
const dLng = (lng2 - lng1) * Math.PI / 180;
|
||||
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
|
||||
Math.sin(dLng / 2) * Math.sin(dLng / 2);
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||
const distance = R * c;
|
||||
|
||||
// 保留两位小数
|
||||
return Math.round(distance * 100) / 100;
|
||||
},
|
||||
|
||||
};
|
||||
25
tool/logs_proxy.js
Normal file
25
tool/logs_proxy.js
Normal file
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* 日志服务代理
|
||||
* 从 Framework 获取 logsService
|
||||
*/
|
||||
|
||||
const Framework = require('../framework/node-core-framework.js');
|
||||
|
||||
// 控制台日志备用方案
|
||||
const consoleLogs = {
|
||||
log: (message, level = 'info') => console.log(`[${level.toUpperCase()}] ${message}`),
|
||||
error: (message) => console.error(`[ERROR] ${message}`),
|
||||
warn: (message) => console.warn(`[WARN] ${message}`)
|
||||
};
|
||||
|
||||
module.exports = new Proxy({}, {
|
||||
get(_, prop) {
|
||||
const services = Framework.getServices();
|
||||
const logsService = services?.logsService || consoleLogs;
|
||||
|
||||
return typeof logsService[prop] === 'function'
|
||||
? logsService[prop].bind(logsService)
|
||||
: logsService[prop];
|
||||
}
|
||||
});
|
||||
|
||||
31
tool/threadHelper.js
Normal file
31
tool/threadHelper.js
Normal file
@@ -0,0 +1,31 @@
|
||||
const { Worker } = require('worker_threads');
|
||||
|
||||
const runInThread = (fn, ...args) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const worker = new Worker(`
|
||||
const { parentPort } = require('worker_threads');
|
||||
parentPort.on('message', ({fnStr, args}) => {
|
||||
const fn = eval('(' + fnStr + ')');
|
||||
Promise.resolve(fn(...args))
|
||||
.then(result => parentPort.postMessage({result}))
|
||||
.catch(err => parentPort.postMessage({error: err.toString()}));
|
||||
});
|
||||
`, { eval: true });
|
||||
|
||||
worker.on('message', (msg) => {
|
||||
if (msg.error) reject(new Error(msg.error));
|
||||
else resolve(msg.result);
|
||||
worker.terminate();
|
||||
});
|
||||
|
||||
worker.on('error', reject);
|
||||
worker.postMessage({ fnStr: fn.toString(), args });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
runInThread
|
||||
} ;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user