Comparing version 1.0.1 to 1.0.2
221
lib/_.js
@@ -83,2 +83,223 @@ const _ = { | ||
return res; | ||
}, | ||
/** | ||
* 两个字符串 | ||
*/ | ||
compare: function (str1, str2) { | ||
let len1 = str1.length, | ||
len2 = str2.length; | ||
for (let i = 0; i < len1 && i < len2; i++) { | ||
if (str1.charCodeAt(i) !== str2.charCodeAt(i)) { | ||
return str1.charCodeAt(i) - str2.charCodeAt(i); | ||
} | ||
} | ||
return len1 - len2; | ||
}, | ||
/** | ||
* 阿拉伯数字转汉语数字 | ||
*/ | ||
num2zh: function (num) { | ||
num = num ? num.toString() : ''; | ||
var res = ''; | ||
var d = { | ||
'0': '零', | ||
'1': '一', | ||
'2': '二', | ||
'3': '三', | ||
'4': '四', | ||
'5': '五', | ||
'6': '六', | ||
'7': '七', | ||
'8': '八', | ||
'9': '九' | ||
}; | ||
for (var i = 0; i < num.length; i++) { | ||
res += d[num[i]]; | ||
} | ||
return res; | ||
}, | ||
/** | ||
* 数组按指定方法排序 | ||
*/ | ||
sortBy: function (arrs, func) { | ||
return arrs.sort(func); | ||
}, | ||
/** | ||
* 数组中是否有指定项 | ||
*/ | ||
hasOne: function (arr, func) { | ||
for (let i = arr.length - 1; i >= 0; i--) { | ||
if (true === func(arr[i])) { | ||
return true; | ||
} | ||
} | ||
return false; | ||
}, | ||
/** | ||
* 日期对象操作 | ||
*/ | ||
date: { | ||
YEAR: 'Y', | ||
QUARTER: 'Q', | ||
MONTH: 'M', | ||
DATE: 'D', | ||
DAY: 'W', | ||
HOUR: 'H', | ||
MINUTE: 'I', | ||
SECOND: 'S', | ||
/** | ||
* 将时间按指定格式转为字符串 小写都是阿拉伯数字大写是汉字数字 | ||
* 格式首字母大写这转为汉字 | ||
* @param {date} date 日期对象 | ||
* @param {string} Y/y/YY/yy - 年份 一七/17/二零一七/2017 | ||
* @param {string} Q/q - 季度 三/3 | ||
* @param {string} M/m/mm - 月 九/9/09 | ||
* @param {string} W/w - 周 一/1 | ||
* @param {string} D/d/dd - 日 九/9/09 | ||
* @param {string} H/h/hh - 时 四/4/04 23 | ||
* @param {string} I/i - 分 | ||
* @param {string} S/s - 秒 | ||
* @return {string} - 格式化的字符串 | ||
*/ | ||
format: function (date, format) { | ||
var res = format, | ||
m = '', | ||
stack = [], | ||
reg = /\{(\w{1,2})\}/g; | ||
while ((m = reg.exec(format)) !== null) { | ||
if (stack.indexOf(m[1]) === -1) { | ||
stack.push(m[1]); | ||
} | ||
} | ||
for (var i = 0; i < stack.length; i++) { | ||
var k = stack[i]; | ||
var bZH = (k.charCodeAt(0) > 96) ? false : true; | ||
var bLong = (k.length === 2 && k[0].toLowerCase() === k[1].toLowerCase()) ? true : false; | ||
var v = null; | ||
switch (k[0].toUpperCase()) { | ||
case this.YEAR: | ||
v = date.getFullYear(); | ||
if (bLong === false) { | ||
v = v % 100; | ||
} | ||
break; | ||
case this.QUARTER: | ||
v = Math.floor((date.getMonth() + 3) / 3); | ||
break; | ||
case this.MONTH: | ||
v = date.getMonth() + 1; | ||
break; | ||
case this.DAY: | ||
v = date.getDay(); | ||
break; | ||
case this.DATE: | ||
v = date.getDate(); | ||
break; | ||
case this.HOUR: | ||
v = date.getHours(); | ||
break; | ||
case this.MINUTE: | ||
v = date.getMinutes(); | ||
break; | ||
case this.SECOND: | ||
v = date.getSeconds(); | ||
break; | ||
default: break; | ||
} | ||
//如果指定最小两位长度则个位数前补零 | ||
if (bLong && v < 10) { | ||
v = '0' + v; | ||
} | ||
//如果是大写字母则数字转中文 | ||
if (bZH) { | ||
v = _.num2zh(parseInt(v)); | ||
} | ||
res = res.replace(new RegExp('{' + k + '}', 'g'), v); | ||
} | ||
return res; | ||
}, | ||
/** | ||
* 计算指定格式差值 | ||
* @param {Date} date - 要比较的日期 | ||
* @param {string} [format=s] - 比较的格式 s/i/h/d/w | ||
* @return {string} - 返回字符串 | ||
*/ | ||
offset: function (date1, date2, format) { | ||
let t0 = date1.getTime(), | ||
t1 = date2.getTime(); | ||
var res = Math.floor((t0 - t1) / 1000); | ||
if (!format) { | ||
format = this.SECOND; | ||
} | ||
switch (format.toUpperCase()) { | ||
case this.MINUTE: | ||
res /= 60; | ||
break; | ||
case this.HOUR: | ||
res /= 60 * 60; | ||
break; | ||
case this.DATE: | ||
res /= 60 * 60 * 24; | ||
break; | ||
case this.DAY: | ||
res /= 60 * 60 * 24 * 7; | ||
break; | ||
default: | ||
break; | ||
} | ||
return Math.floor(res * 10) / 10; | ||
}, | ||
/** | ||
* 时间加减计算 | ||
* @param {date} date - 日期对象 | ||
* @param {int} val - 负数代表日期过去,正数代表日期未来 | ||
* @param {int} format - @enum s/i/h/d/w/y 0/1/2/3/4/- 就是没有按月计算的~~ | ||
*/ | ||
compute: function (date, val, format) { | ||
var ts = Math.ceil(date.getTime() / 1000); | ||
var level = 0; | ||
if (!format) { | ||
format = this.SECOND; | ||
} else { | ||
format = format.toUpperCase(); | ||
} | ||
val = parseInt(val) || 0; | ||
switch (format) { | ||
case this.SECOND: | ||
level = 0; | ||
break; | ||
case this.MINUTE: | ||
level = 1; | ||
break; | ||
case this.HOUR: | ||
level = 2; | ||
break; | ||
case this.DATE: | ||
level = 3; | ||
break; | ||
case this.DAY: | ||
level = 4; | ||
break; | ||
case this.YEAR: break; | ||
default: break; | ||
} | ||
if (format === this.YEAR) { | ||
date.setFullYear(date.getFullYear() + val); | ||
} else { | ||
if (level > 0) { | ||
val *= 60; | ||
} | ||
if (level > 1) { | ||
val *= 60; | ||
} | ||
if (level > 2) { | ||
val *= 24; | ||
} | ||
if (level > 3) { | ||
val *= 7; | ||
} | ||
date.setTime((ts + val) * 1000); | ||
} | ||
return date; | ||
} | ||
} | ||
@@ -85,0 +306,0 @@ }; |
@@ -35,4 +35,6 @@ //TODO: i18n | ||
} | ||
error(msg) { | ||
throw new Error(msg); | ||
error(data) { | ||
let err = new Error(); | ||
err.validate = data; | ||
throw err; | ||
} | ||
@@ -45,3 +47,3 @@ /** | ||
for (let k in this.rules) { | ||
if (this.rules.hasOwnProperty(k) && !_.isEmptyObject(data[k])) { | ||
if (_.isNumber(data[k]) || this.rules.hasOwnProperty(k) && !_.isEmptyObject(data[k])) { | ||
res[k] = data[k]; | ||
@@ -205,3 +207,6 @@ } | ||
if (_.isEmpty(v)) { | ||
this.error(`${k} 字段必填!`); | ||
this.error({ | ||
filed: k, | ||
key: 'required' | ||
}); | ||
} | ||
@@ -211,3 +216,7 @@ } | ||
if (!this.isInt(v)) { | ||
this.error(`${v} 不是整数!`); | ||
this.error({ | ||
filed: k, | ||
key: 'int', | ||
value: v | ||
}); | ||
} | ||
@@ -218,3 +227,7 @@ data[k] = parseInt(v); | ||
if (!this.isFloat(v)) { | ||
this.error(`${v}不是有效的小数!`); | ||
this.error({ | ||
filed: k, | ||
key: 'float', | ||
value: v | ||
}); | ||
} | ||
@@ -229,3 +242,8 @@ data[k] = parseFloat(v); | ||
if (v.length < rule.min && v.length > rule.max) { | ||
this.error(`${v} 长度不在[${rule.length.min},${rule.length.max}]之间`); | ||
this.error({ | ||
filed: k, | ||
key: 'length', | ||
value: v, | ||
rule: rule.length | ||
}); | ||
} | ||
@@ -235,3 +253,7 @@ } | ||
if (!this.isEmail(v)) { | ||
this.error(`${v} 不是有效的邮箱!`); | ||
this.error({ | ||
filed: k, | ||
key: 'email', | ||
value: v | ||
}); | ||
} | ||
@@ -241,3 +263,7 @@ } | ||
if (!this.isUrl(v)) { | ||
this.error(`${v} 不是有效的url!`); | ||
this.error({ | ||
filed: k, | ||
key: 'url', | ||
value: v | ||
}); | ||
} | ||
@@ -253,3 +279,8 @@ } | ||
if (-1 == rule.in.indexOf(v)) { | ||
this.error(`${v} 不是${rule.in.join(',')}中的枚举类型!`); | ||
this.error({ | ||
filed: k, | ||
key: 'in', | ||
value: v, | ||
rule: rule.in | ||
}); | ||
} | ||
@@ -263,3 +294,7 @@ } | ||
} else { | ||
this.error(`${v} 不是有效的boolean类型!`); | ||
this.error({ | ||
filed: k, | ||
key: 'boolean', | ||
value: v | ||
}); | ||
} | ||
@@ -269,3 +304,7 @@ } | ||
if (!this.isDate(v)) { | ||
this.error('date'); | ||
this.error({ | ||
filed: k, | ||
key: 'date', | ||
value: v | ||
}); | ||
} else { | ||
@@ -272,0 +311,0 @@ data[k] = moment(v).toISOString(); |
{ | ||
"name": "utils2", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"description": "validator,_,IO,string,date,numer,array", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -1,7 +0,25 @@ | ||
# 模块功能说明 | ||
**安装方法: npm install utils2 -S** | ||
### 使用方式 | ||
``` | ||
const Validator = require('utils2/lib/validator'); | ||
const validator = new Validator({ | ||
rules: { | ||
id: 'required|int' | ||
} | ||
}); | ||
const input = validator.filter(req.body); | ||
try { | ||
validator.check(input); | ||
} catch(err) { | ||
// 错误处理 | ||
//res.validateError(err); | ||
//next(err); | ||
} | ||
``` | ||
### 模块功能说明 | ||
``` | ||
工具库:基本IO操作的封装;validator是对表单输入的数据进行过滤和验证的封装;仿lodash方法的封装(有些写法不习惯,所以自己造轮子) | ||
基本对象的方法拓展(string/number/date等,风险有点大.有次改了object的原型造成sequelize报错) | ||
``` | ||
**安装方法: npm install utils2 -s** | ||
#### 2017-12-18 20:34:42 | ||
@@ -27,2 +45,8 @@ ``` | ||
``` | ||
### 2018-1-16 12:55:51 | ||
``` | ||
1.对基础对象的拓展都放到_.js中 | ||
2.修改validator抛出错误的方式 | ||
3.发布到npm | ||
``` |
@@ -25,2 +25,26 @@ const assert = require('assert'); | ||
}); | ||
it('filter() 实际中遇到的问题', function () { | ||
let v1 = new Validator({ | ||
rules: { | ||
filename: 'required|string|min:1', | ||
path: 'required|string', | ||
size: 'required|int|min:0', | ||
md5: 'required|string|length:32', | ||
time: 'required|date' | ||
} | ||
}); | ||
const t = Date.now().toLocaleString(); | ||
let input = v1.filter({ | ||
filename: 'test.png', | ||
path: 'upload/images/', | ||
size: 123, | ||
time: t | ||
}); | ||
assert.deepEqual(input, { | ||
filename: 'test.png', | ||
path: 'upload/images/', | ||
size: 123, | ||
time: t | ||
}); | ||
}); | ||
}); |
@@ -27,3 +27,3 @@ const assert = require('assert'); | ||
email: '1439120442@qq.com', | ||
people: '6', | ||
people: 6, | ||
money: '122.5', | ||
@@ -30,0 +30,0 @@ hex: 'sql' |
const assert = require('assert'); | ||
const Validator = require('../../lib/validator'); | ||
describe('validator测试:', function(){ | ||
it('isID:(是否是身份证)', function(){ | ||
describe('validator测试:', function () { | ||
it('isID:(是否是身份证)', function () { | ||
const ids = [ | ||
@@ -15,7 +15,7 @@ '441624198412027166', | ||
]; | ||
ids.forEach(function(v){ | ||
ids.forEach(function (v) { | ||
assert.strictEqual(new Validator().isID(v), true); | ||
}); | ||
}); | ||
it('isCredit:(是否是银行卡)', function(){ | ||
it('isCredit:(是否是银行卡)', function () { | ||
const cards = [ | ||
@@ -25,7 +25,7 @@ '6227612145830440', | ||
]; | ||
cards.forEach(function(v){ | ||
cards.forEach(function (v) { | ||
assert.strictEqual(new Validator().isCredit(v), true); | ||
}); | ||
}); | ||
it('isUrl()', function(){ | ||
it('isUrl()', function () { | ||
let u1 = 'https://www.baidu.com/s?wd=nodejs%20assert%E6%96%B9%E6%B3%95&rsv_spt=1&rsv_iqid=0xfbbe6fec00021978&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=assert%25E6%2596%25B9%25E6%25B3%2595&rsv_t=cc5feos7yh9LZVkbxGG3G1hlNTVU9bUX5f50r31P0JyLAU67ndhGTGybKRgK%2Bob93OHi&inputT=1474&rsv_pq=c26916bb0000566c&rsv_sug3=20&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&prefixsug=nodejs%2520assert%25E6%2596%25B9%25E6%25B3%2595&rsp=0&rsv_sug4=3682'; | ||
@@ -35,8 +35,20 @@ assert.strictEqual(new Validator().isUrl(u1), true); | ||
}); | ||
it('isDate()', function(){ | ||
it('isDate()', function () { | ||
let u1 = '2017-12-19 21:59:58'; | ||
assert.strictEqual(new Validator().isDate(u1), true); | ||
assert.strictEqual(new Validator().isDate('u1'), false); | ||
}); | ||
it('test error', function () { | ||
let v = new Validator({ | ||
rules: { | ||
size: 'required|int' | ||
} | ||
}); | ||
try { | ||
v.check({ size: 'a' }); | ||
} catch (err) { | ||
console.log(err); | ||
} | ||
}); | ||
}); |
49986
1361
51
14