UNPKG

newbeely-nodejs

Version:

简单易用的轻量级nodejs服务框架. 框架简单到只有组件逻辑,不同的组件提供不同的服务,使用外部的配置文件(只有一个配置文件)方便的组合成一个完整的服务框架. 整个服务使用bearcat(网易开源的nodejs面向切面编程的轻量级框架(AOP))管理,极大的解耦组件间的耦合.(关于代码热更新后续开放).

328 lines (308 loc) 11.4 kB
/** * @filename Utils * * @module Utils * * @author Gandalfull <orientcountry@gmail.com> * @version 1 * @time 2016-02-19 10:03 */ var __ = require('underscore'); /** * 128 进制编码查询表(中文字典) * @type {string[]} */ var Key128Maps = [ ["干", "轻", "枫", "箔", "朝"], ["袍", "俭", "续", "先", "曾"], ["马", "灰", "益", "舫", "蝴"], ["鸟", "畤", "惘", "残", "浮"], ["属", "两", "太", "桥", "巧"], ["辜", "安", "赤", "枪", "蝙"], ["压", "慢", "不", "正", "座"], ["凝", "野", "低", "一", "未"], ["裙", "回", "节", "双", "裳"], ["唯", "静", "漫", "径", "以"], ["主", "下", "住", "悲", "帝"], ["觉", "到", "杜", "星", "耳"], ["数", "在", "同", "四", "表"], ["过", "犹", "河", "蚕", "牛"], ["扇", "罢", "汉", "沧", "秋"], ["世", "捻", "弹", "始", "眉"], ["院", "霓", "落", "立", "堆"], ["谪", "像", "谁", "铺", "饱"], ["复", "飘", "幺", "云", "发"], ["负", "唧", "逢", "家", "将"], ["殷", "抑", "借", "作", "与"], ["嫁", "僻", "教", "珠", "模"], ["收", "利", "仙", "信", "拂"], ["杂", "色", "六", "欲", "良"], ["肉", "舟", "违", "促", "头"], ["炬", "衾", "蕉", "钿", "饮"], ["把", "深", "闻", "栀", "上"], ["听", "彩", "妇", "高", "从"], ["底", "手", "血", "酒", "商"], ["玉", "日", "见", "忽", "阶"], ["瑟", "乍", "茫", "陵", "舞"], ["叶", "靰", "溪", "追", "争"], ["珰", "夸", "旦", "芭", "急"], ["呕", "心", "买", "阑", "青"], ["壁", "拨", "卧", "端", "偷"], ["铁", "昏", "错", "冷", "船"], ["浆", "百", "更", "涩", "妆"], ["今", "涯", "居", "烟", "峰"], ["石", "车", "二", "十", "万"], ["庄", "击", "婿", "肥", "爱"], ["娇", "却", "柱", "道", "泣"], ["滩", "缠", "镜", "险", "举"], ["知", "难", "阳", "后", "猿"], ["瘦", "此", "其", "敛", "多"], ["轮", "子", "如", "呼", "井"], ["火", "白", "入", "依", "言"], ["屏", "旁", "他", "明", "羹"], ["照", "腊", "枥", "牵", "央"], ["方", "独", "苏", "莫", "寻"], ["骑", "束", "北", "远", "哉"], ["勤", "岁", "链", "五", "京"], ["琶", "整", "移", "伤", "女"], ["寒", "忘", "幽", "咸", "由"], ["渐", "笑", "取", "久", "娘"], ["踏", "切", "愁", "瓶", "管"], ["宅", "怅", "西", "往", "清"], ["岸", "赐", "暂", "司", "乐"], ["局", "口", "楼", "抱", "嘲"], ["常", "水", "凤", "病", "浸"], ["通", "荦", "嘈", "敢", "袷"], ["消", "隔", "客", "学", "蟆"], ["已", "雨", "梦", "月", "升"], ["无", "相", "亦", "顿", "床"], ["迟", "秦", "去", "掩", "苦"], ["暖", "达", "蛤", "还", "州"], ["烂", "第", "浔", "田", "限"], ["转", "私", "碎", "才", "惨"], ["欢", "渔", "问", "烛", "力"], ["为", "飞", "锦", "乡", "得"], ["绕", "息", "起", "污", "抹"], ["关", "你", "置", "寥", "别"], ["微", "待", "围", "早", "中"], ["识", "茶", "思", "暮", "感"], ["行", "祠", "散", "织", "花"], ["刀", "说", "松", "鸣", "矾"], ["自", "添", "拟", "银", "凉"], ["妒", "疏", "邀", "扉", "开"], ["坐", "岭", "岂", "本", "竹"], ["光", "恨", "风", "少", "殿"], ["只", "每", "忆", "因", "吟"], ["蝠", "雁", "斗", "画", "宠"], ["哳", "间", "东", "天", "醉"], ["初", "衣", "吹", "部", "君"], ["小", "灯", "迸", "服", "宴"], ["承", "迢", "激", "故", "帛"], ["沦", "丝", "扑", "莱", "胜"], ["龟", "空", "坊", "武", "地"], ["然", "但", "晴", "辞", "缄"], ["成", "停", "驿", "来", "啼"], ["香", "看", "皆", "梁", "挑"], ["当", "山", "守", "桃", "篦"], ["稀", "歇", "芦", "舱", "沉"], ["声", "哑", "哀", "登", "古"], ["长", "破", "时", "峣", "媒"], ["老", "枕", "处", "歌", "名"], ["语", "蓝", "荻", "凄", "容"], ["出", "阿", "虫", "虾", "门"], ["翻", "暗", "饭", "蓬", "夜"], ["调", "连", "怜", "曲", "弟"], ["黄", "放", "何", "三", "归"], ["童", "情", "至", "强", "所"], ["我", "怕", "晓", "千", "绝"], ["音", "金", "必", "嗟", "被"], ["畔", "绮", "军", "削", "悄"], ["善", "颜", "莺", "泪", "随"], ["边", "叹", "针", "格", "又"], ["佛", "足", "席", "胖", "线"], ["确", "有", "村", "望", "遮"], ["指", "儿", "者", "排", "意"], ["探", "满", "拢", "性", "弦"], ["闲", "送", "死", "滑", "僧"], ["湓", "新", "罗", "碧", "外"], ["蝶", "宵", "堂", "话", "尽"], ["前", "华", "吾", "穷", "露"], ["改", "晚", "好", "鹃", "红"], ["帘", "札", "泉", "是", "倾"], ["路", "诉", "最", "饥", "裂"], ["终", "托", "向", "插", "重"], ["迷", "应", "霏", "琵", "度"], ["流", "姨", "盘", "党", "唤"], ["面", "洞", "可", "纷", "半"], ["咽", "萤", "平", "江", "城"], ["年", "鬓", "衫", "等", "昨"], ["事", "湿", "俯", "突", "物"], ["里", "春", "掌", "志", "涧"], ["轴", "走", "梳", "海", "笛"], ["似", "近", "共", "人", "生"], ["寺", "大", "隐", "离", "粝"] ] /** * 64 进制编码查询表 * @type {string[]} */ var Key64Maps = [ ['Y'], ['i'], ['*'], ['q'], ['t'], ['L'], ['F'], ['A'], ['f'], ['x'], ['W'], ['7'], ['J'], ['l'], ['a'], ['3'], ['H'], ['Z'], ['5'], ['E'], ['s'], ['m'], ['U'], ['b'], ['S'], ['c'], ['p'], ['d'], ['g'], ['C'], ['n'], ['P'], ['k'], ['N'], ['6'], ['e'], ['r'], ['y'], ['R'], ['8'], ['G'], ['4'], ['z'], ['@'], ['0'], ['K'], ['u'], ['2'], ['h'], ['M'], ['9'], ['w'], ['X'], ['j'], ['V'], ['I'], ['Q'], ['o'], ['T'], ['v'], ['B'], ['D'], ['1'], ['O'] ]; /** * 32 进制编码查询表 * @type {string[]} */ var Key32Maps = [ ['Y', 'i'], ['*', 'q'], ['t', 'L'], ['F', 'A'], ['f', 'x'], ['W', '7'], ['J', 'l'], ['a', '3'], ['H', 'Z'], ['5', 'E'], ['s', 'm'], ['U', 'b'], ['S', 'c'], ['p', 'd'], ['g', 'C'], ['n', 'P'], ['k', 'N'], ['6', 'e'], ['r', 'y'], ['R', '8'], ['G', '4'], ['z', '@'], ['0', 'K'], ['u', '2'], ['h', 'M'], ['9', 'w'], ['X', 'j'], ['V', 'I'], ['Q', 'o'], ['T', 'v'], ['B', 'D'], ['1', 'O'] ]; /** * 16进制 映射表 * * @type {*[]} */ var Key16Maps = [ ['Y', 'i', 'q'], ['t', 'L', 'F', 'A'], ['f', 'x', 'W', '7'], ['J', 'a', '3'], ['H', 'Z', '5', 'E'], ['s', 'm', 'U', 'b'], ['S', 'c', 'p', 'd'], ['g', 'C', 'n', 'P'], ['k', 'N', '6', 'e'], ['r', 'y', 'R', '8'], ['G', '4', 'z'], ['K', 'u', '2'], ['h', 'M', '9', 'w'], ['X', 'j', 'V', 'I'], ['Q', 'T', 'v'], ['B', 'D'] ]; /** * 参考时间 * @type {number} */ var RefDate = new Date("2016-01-01 00:00:00").getTime(); /** * 常用方法工具集 * * @class Utils * @constructor */ function Utils() { } var SupportModel = [ 128, 64, 32, 16 ]; var Mark = { 128: { bits: 7, mask: 0x7f, maps: Key128Maps }, 64: { bits: 6, mask: 0x3f, maps: Key64Maps }, 32: { bits: 5, mask: 0x1f, maps: Key32Maps }, 16: { bits: 4, mask: 0x0f, maps: Key16Maps } }; /** * 生成唯一的字符串 * 根据时间算法生成 * * @method uniqueString * @param variances * @param model 16 or 64 default 16 * @returns {string} */ Utils.prototype.uniqueString = function (variances, model) { model = SupportModel.indexOf(model) == -1 ? 16 : model; var info = Mark[model]; variances = Math.floor(variances); var value = Date.now() - RefDate; value = ((value << 8) >>> 1) + variances; var retValue = []; while (value > 0) { retValue.unshift(__.sample(__.shuffle(info.maps)[value & info.mask])); if (value > 0xffffffff) { value = value >> info.bits >>> 1; } else { value = value >> info.bits; } } return retValue.join(""); } /** * 安全调用方法 * @param cb */ Utils.prototype.invokeCallback = function (cb) { if (!!cb && typeof cb === 'function') { cb.apply(null, Array.prototype.slice.call(arguments, 1)); } }; /** * 从数组内随机一个元素 * * @method random * @param array * @returns {*} */ Utils.prototype.random = function (array) { if (!array.length) { return null; } if (typeof array[0].weight !== 'number') { return __.sample(array); } var weight = 0; for (var i = 0; i < array.length; i++) { weight += array[i].weight; } var ran = Math.floor(Math.random() * 100000) % weight; var tmp = 0; for (var i = 0; i < array.length; i++) { tmp += array[i].weight; if (tmp >= ran) { return array[i]; } } return null; } /** * 计算一个对象内的变量数量 * * @method size * @for Utils * @param JSON obj * @returns {Number} */ Utils.prototype.size = function (obj) { var count = 0; for (var i in obj) { if (obj.hasOwnProperty(i) && typeof obj[i] !== 'function') { count++; } } return count; }; /** * 检测两个数组是否相同 * * @method arrayDiff * @for Utils * @param JSON array1 * @param JSON array2 * @returns {boolean} */ Utils.prototype.arrayDiff = function (array1, array2) { var o = {}; for (var i = 0, len = array2.length; i < len; i++) { o[array2[i]] = true; } var result = []; for (i = 0, len = array1.length; i < len; i++) { var v = array1[i]; if (o[v]) continue; result.push(v); } return result; }; /** * 检测字符串内是否包含中文字符 * * @method hasChineseChar * @for Utils * @param string * @returns {boolean} */ Utils.prototype.hasChineseChar = function (str) { if (/.*[\u4e00-\u9fa5]+.*$/.test(str)) { return true; } else { return false; } }; /** * 获取http请求的客户端ip * * 因为有可能是nginx/负载均衡 转发的 需要判定headers内的字段 * * @method getClientIP * @param req * @returns {*|Object|string} */ Utils.prototype.getClientIP = function (req) { var ip = req.headers['x-forwarded-for'] || req.headers['remote-host'] || req.headers['x-real-ip'] || req.connection.remoteAddress || req.socket.remoteAddress || (req.connection.socket && req.connection.socket.remoteAddress) || ""; ip = ip.substring(ip.lastIndexOf(":") + 1, ip.length); return ip; } /** * 判断是否是Ip * * @method isIp * @for Utils * @param ipvalue * @returns {boolean} */ Utils.prototype.ipIp = function isIp(ipvalue) { return this.isIPv4(ipvalue) || this.isIPv6(ipvalue); }; /** * 判断是否是Ipv4 * * @method isIPv4 * @for Utils * @param ipvalue * @returns {boolean} */ Utils.prototype.isIPv4 = function isIPv4(ipvalue) { var re = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/; return re.test(ipvalue); }; /** * 判断是否是Ipv6 * * @method isIPv6 * @for Utils * @param ipvalue * @returns {boolean} */ Utils.prototype.isIPv6 = function isIPv6(ipvalue) { return ipvalue.match(/:/g).length <= 7 && /::/.test(ipvalue) ? /^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(ipvalue) : /^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(ipvalue); }; module.exports = { id: "utils", func: Utils };