UNPKG

rrestjs

Version:

HIgh performance node.js ROA & RESTFUL web framework.

227 lines (215 loc) 8.1 kB
/*最多支持99个,后缀名是png*/ var captchapath = _rrest.config.baseDir + '/app/static/captcha_pic/', captcha_ary = [ {id:1, url:captchapath,value:'东洋砍刀'}, {id:2, url:captchapath,value:'菊花一朵'}, {id:3, url:captchapath,value:'树叶'}, {id:4, url:captchapath,value:'鸭子'}, {id:5, url:captchapath,value:'蝴蝶'}, {id:6, url:captchapath,value:'小狗'}, {id:7, url:captchapath,value:'小鱼'}, {id:8, url:captchapath,value:'老鼠'}, {id:9, url:captchapath,value:'鼻涕猪'}, {id:10, url:captchapath,value:'黄色小老虎'}, {id:11, url:captchapath,value:'小白兔'}, {id:12, url:captchapath,value:'小龙'}, {id:13, url:captchapath,value:'小牛'}, {id:14, url:captchapath,value:'小猴子'}, {id:15, url:captchapath,value:'公鸡'}, {id:16, url:captchapath,value:'电脑'}, {id:17, url:captchapath,value:'三本书'}, {id:18, url:captchapath,value:'摄像头'}, {id:19, url:captchapath,value:'鸭子'}, {id:20, url:captchapath,value:'你好'}, {id:21, url:captchapath,value:'中国娃娃'}, {id:22, url:captchapath,value:'摩托头盔'}, {id:23, url:captchapath,value:'面具'}, {id:24, url:captchapath,value:'喇叭'}, {id:25, url:captchapath,value:'小猫和小鱼'}, {id:26, url:captchapath,value:'小猫'}, {id:27, url:captchapath,value:'胶片'}, {id:28, url:captchapath,value:'壁虎'}, {id:29, url:captchapath,value:'五角星'}, {id:30, url:captchapath,value:'耐克足球'}, {id:31, url:captchapath,value:'阿迪达斯足球'}, {id:32, url:captchapath,value:'puma足球'}, {id:33, url:captchapath,value:'足球场'}, {id:34, url:captchapath,value:'邮票'}, {id:35, url:captchapath,value:'耳机'}, {id:36, url:captchapath,value:'打印机'}, {id:37, url:captchapath,value:'单反相机'}, {id:38, url:captchapath,value:'大力神杯'}, {id:39, url:captchapath,value:'草坪'}, {id:40, url:captchapath,value:'哨子'}, {id:41, url:captchapath,value:'足球和草坪'}, {id:42, url:captchapath,value:'下大雨'}, {id:43, url:captchapath,value:'雷阵雨'}, {id:44, url:captchapath,value:'下雪'}, {id:45, url:captchapath,value:'太阳'}, {id:46, url:captchapath,value:'旧式电话'}, {id:47, url:captchapath,value:'两顶帽子'}, {id:48, url:captchapath,value:'夹子'}, {id:49, url:captchapath,value:'圣诞树'}, {id:50, url:captchapath,value:'箱子'}, {id:51, url:captchapath,value:'闹钟'}, {id:52, url:captchapath,value:'help'}, {id:53, url:captchapath,value:'鲸鱼'}, {id:54, url:captchapath,value:'松鼠'}, {id:55, url:captchapath,value:'胖猪'}, {id:56, url:captchapath,value:'小鸡'}, {id:57, url:captchapath,value:'企鹅'}, {id:58, url:captchapath,value:'小老鼠吃奶酪'}, {id:59, url:captchapath,value:'乌龟'}, {id:60, url:captchapath,value:'加减乘除'}, {id:61, url:captchapath,value:'螃蟹'}, {id:62, url:captchapath,value:'吉他'}, {id:63, url:captchapath,value:'救生圈'}, {id:64, url:captchapath,value:'棒冰'}, {id:65, url:captchapath,value:'滑板'}, {id:66, url:captchapath,value:'伞'}, {id:67, url:captchapath,value:'PSP正面'}, {id:68, url:captchapath,value:'毽子'}, {id:69, url:captchapath,value:'PSP背面'}, {id:70, url:captchapath,value:'三角圆圈方框叉'}, {id:71, url:captchapath,value:'男孩'}, {id:72, url:captchapath,value:'女孩'}, {id:73, url:captchapath,value:'感叹号'}, {id:74, url:captchapath,value:'液晶电视'}, {id:75, url:captchapath,value:'空购物车'}, {id:76, url:captchapath,value:'满购物车'}, {id:77, url:captchapath,value:'剪刀'}, {id:78, url:captchapath,value:'房子'}, {id:79, url:captchapath,value:'铃铛'}, ] var c_a = captcha_ary, captcha={ lenth : c_a.length, //验证码题目数组长度 canum : 4, //每次出几个题目,这个值不能大于上面的 //cutpo : 5, //生成字符串截断位置,加密用 dbcolname:'piccaptcha' }; captcha.generate = function(id){ var ts = (new Date()).getTime()+''; if(parseInt(id, 10)<10){ var id = '0'+id; } var head = 10 + Math.ceil(Math.random()*89), cutpo = head.toString().slice(-1); var front = ts.slice(0, cutpo), back = ts.slice(cutpo); res = head+front+id+back; return res; } captcha.decode = function(str){ var head = str.slice(1,2), str = str.slice(2), tsfront = str.slice(0, parseInt(head, 10)), id = str.slice(parseInt(head, 10), parseInt(head, 10)+2), intid = parseInt(id, 10), tsback = str.slice(parseInt(head)+2), ts = tsfront + tsback, now = (new Date()).getTime(); if(now -ts > 1000*15) return false; if(intid != id) return false; return intid; } captcha.creat = function(cb){ //用户打开页面创建验证码 var ca = []; for(var j=0;j<c_a.length;j++){ //这里需要深度复制数组,因为数组内的每项都是对象 ca[j]={} for(var i in c_a[j]){ ca[j][i] = c_a[j][i] } } var u_obj = this.getrandmon(ca, this.canum); //返回给用户做题目的数组 captcha.mongodbcreat(u_obj, cb); } captcha.mongodbcreat = function(u_obj, cb){ var ary = u_obj.ca_ary, po = u_obj.po; _pool.acquire(function(err, db_connector){ db_connector.collection(captcha.dbcolname, function(err, collection){ if (err){ _logger.err('创建验证码失败,连接集合失败'+err); cb(false); _pool.release(db_connector); return true; } ary[po].timestamp = new Date(); ary[po].po = po; collection.insert(ary[po], {safe:true}, function(err, doc){ _pool.release(db_connector); if (err){ _logger.err('创建验证码失败,插入数据库失败'+err); cb(false); } else{ var name = ary[po].value; delete ary[po].po; delete ary[po].timestamp; for(var j=0;j<ary.length;j++){ //去掉name值 ary[j].url = '/piccaptcha?picid='+captcha.generate(ary[j].id); delete ary[j].value; delete ary[j].id; } cb({id:doc[0]._id, value:name, caary:ary});//返回给控制器回调函数的对象 } }) }) }) } captcha.contrast = function(id, po, cb){ //判断验证码 _pool.acquire(function(err, db_connector){ db_connector.collection(captcha.dbcolname, function(err, collection){ collection.findOne({'_id':db_connector.bson_serializer.ObjectID.createFromHexString(id)},function(err, r){ var res = false; if(err) _logger.err('对比验证码失败:'+err); else if(r && r.po == po) res=true; //如果对比成功,返回true,否则为false _pool.release(db_connector); captcha.destory('', id) cb(res); }) }) }) } captcha.destory = function(timestamp, id){ //删除验证码 var delc = {"timestamp":{"$lt":new Date(timestamp)}} _pool.acquire(function(err, db_connector){ if(typeof id !== 'undefined'){ delc = {"_id":db_connector.bson_serializer.ObjectID.createFromHexString(id)} } db_connector.collection(captcha.dbcolname, function(err, collection){ collection.remove(delc, function(err){ if(err) _logger.err('摧毁验证码失败:'+err); _pool.release(db_connector); }) }) }) } captcha.getrandmon = function(ary, num){ //随机从数组中抽取num项记录作为验证码题目 var se_ary = ary, ca_ary = []; for(var i=0; i<num; i++){ var n = Math.floor(Math.random()*se_ary.length); ca_ary.push(se_ary.splice(n,1)[0]) } var po = Math.floor(Math.random()*ca_ary.length); return {"po":po, "ca_ary":ca_ary}; } captcha.intial = function(){ //初始化,异步脚本删除验证码 process.nextTick(function(){ _pool.acquire(function(err, db_connector){ //建立集合 db_connector.createCollection(captcha.dbcolname, function(err, col){ if(err) _logger.error(err) else _logger.info('创建piccaptcha集合成功:'+col.collectionName); _pool.release(db_connector); }) }) setInterval(function () { var now = (new Date()).getTime()-1000*60*30; captcha.destory(now); }, 1000*60*30); }); }() module.exports = captcha; module.exports.captcha_ary = captcha_ary;