/* 基础小工具,可通用于服务端和用户端 */ module.exports = { sleep: (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms)), parseJsonPossible(value) { try { return JSON.parse(value) } catch (e) { return value } }, sortAndFilterJson({ fields, entity, exclude = [] } = {}) { const newEntity = {} for (let key of Object.keys(fields).sort()) { if (typeof (entity[key] !== 'undefined') && !Number.isNaN(entity[key]) && entity[key] !== Infinity) { newEntity[key] = entity[key] } } for (let exkey of exclude) { delete newEntity[exkey] } return JSON.stringify(newEntity) }, name2port(name='') { let port = name.toLowerCase() .replace(/[abc]/g, 2) .replace(/[def]/g, 3) .replace(/[ghi]/g, 4) .replace(/[jkl]/g, 5) .replace(/[mno]/g, 6) .replace(/[pqrs]/g, 7) .replace(/[tuv]/g, 8) .replace(/[wxyz]/g, 9) return parseInt(port) }, /** * 用户编号转邀请码 * * @static * @param {*} aiid * @return {*} * @memberof TICrypto */ aiid2regcode(aiid) { const alphabet = 'e5fcdg3hqa4b1n0pij2rstuv67mwx89klyz' const base = 16367 let num = (aiid + base) * (base - alphabet.length) let code = '' let mod while (num > 0) { mod = num % alphabet.length num = (num - mod) / alphabet.length code = code + alphabet[mod] // 倒序存放 } return code }, /** * 邀请码转用户编号 * * @static * @param {*} code * @return {*} * @memberof TICrypto */ regcode2aiid(code) { if (typeof code === 'string' && /^[a-zA-Z0-9]+$/.test(code)) { const alphabet = 'e5fcdg3hqa4b1n0pij2rstuv67mwx89klyz' const base = 16367 code = code.toLowerCase() let len = code.length let num = 0 for (let i = 0; i < len; i++) { num += alphabet.indexOf(code[i]) * Math.pow(alphabet.length, i) } let aiid = num / (base - alphabet.length) - base if (aiid >= 0 && Number.isInteger(aiid)) { // 允许 aiid===0:当第一个用户(aiid==1)登录时,需要一个系统默认的邀请码。 return aiid } } return null // null 代表一切非法的regcode }, }