复制代码 代码如下:
/**
* Created by YCXJ-wanglihui on 2014/5/28.
*/
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
//1.短暂屏蔽 2.永久屏蔽
var degree = {TEMP:1, FOREVER:2};
/**
* 黑名单
* @type {Schema}
*
* @param ip {String} 黑名单Ip
* @param createAt {Date} 创建时间
* @param expireTime {Date} 如果是短暂屏蔽,屏蔽到期时间
* @param forbiddenDegree {Number} 屏蔽级别 1.短暂屏蔽 2.永久屏蔽
* @param reason {String} 屏蔽原因
*/
var BlackList = new Schema({
ip:{
type: String,
index:true
},
createAt:{
type: Date,
default: Date.now
},
expireTime:{
type: Date
},
forbiddenDegree:{
type: Number,
default:degree.TEMP
},
reason:{
type: String,
default: '请求次数频繁'
}
});
mongoose.model('BlackList', BlackList);
IP与提交记录Schema:
复制代码 代码如下:
/**
* Created by YCXJ-wanglihui on 2014/5/28.
*/
'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
/**
* 记录参与调查问卷的回复与Ip
* @type {Schema}
*
* @param answerId {ObjectId} 回复Id
* @param createAt {Date} 创建时间
* @param ip {String} 参与回复的人Ip
*/
var IpAnswerLog = new Schema({
answerId: {
type: ObjectId
},
createAt: {
type: Date,
default:Date.now
},
ip:{
type: String,
index:true
}
});
mongoose.model('IpAnswerLog', IpAnswerLog);
相关Proxy代码:
复制代码 代码如下:
/**
* Created by YCXJ-wanglihui on 2014/5/28.
*/
'use strict';
var IpAnswerLog = require('../models').IpAnswerLog;
/**
* 新建并保存
* @param ipAnswerLog {Schema or dict}
* @param callback
*/
var newAndSave = function(ipAnswerLog, callback){
if(ipAnswerLog instanceof IpAnswerLog){
ipAnswerLog.save(callback);
}else{
var m = new IpAnswerLog(ipAnswerLog);
m.save(callback);
}
}
/**
* 一分钟内回复数
* @param ip
* @param callback
*/
var countOneMinuteAnswer = function(ip, callback){
var endTime = Date.now();
var beginTime = endTime - 1000*60*1;
countIpAnswerByTime(beginTime, endTime, ip, callback);
}
/**
* 一小时内回复数字
* @param ip
* @param callback
*/
var countOneHourAnswer = function(ip, callback){
var endTime = Date.now();
var beginTime = endTime - 1000*60*60*1;
countIpAnswerByTime(beginTime, endTime, ip, callback);
}
/**
* 一天内回复
* @param ip
* @param callback
*/
var countOneDayAnswer = function(ip, callback){
var endTime = Date.now();
var beginTime = endTime - 1000*60*60*24;
countIpAnswerByTime(beginTime, endTime, ip, callback);
}
/**
* 计算某段时间内回复数
* @param beginTime {Number} 开始时间 时间戳
* @param endTime {Number} 结束时间 如果为null,使用当前时间 时间戳
* @param ip {String} Ip地址
* @param callback
*/
var countIpAnswerByTime = function(beginTime, endTime, ip, callback){
if(!endTime){
endTime = Date.now();
}
IpAnswerLog.count({ip:ip, '$and':{$lt:beginTime, $gt:endTime}}, callback);
}