需求描述:
產(chǎn)品狗說要做一個注冊碼生成模塊,生成一批注冊碼,提供給受邀的用戶注冊網(wǎng)站。
需求分析
注冊碼功能并不少見(想去xxx論壇的孩子們天天吵著要注冊碼……),首先我們來簡單分析一下產(chǎn)品狗的這個需求。
產(chǎn)品狗說要做一個注冊碼生成模塊,生成一批注冊碼,提供給受邀的用戶注冊網(wǎng)站
產(chǎn)品狗隨口一句話,里面包含這么多信息:
- 自動產(chǎn)生注冊碼
- 每次產(chǎn)生一個注冊碼或者是多個注冊碼(數(shù)量前臺應(yīng)該可以輸入)
- 注冊碼不能重復(fù)(這個是必須的)
- 注冊碼得有一個標(biāo)識,已使用或者未使用。
注冊碼表的設(shè)計看上去是這個樣子的:
var _getInviteCode = function () {
var inviteCodeSchema = new Schema({
code: {type: String, required: true, unique: true},
used: {type: Boolean, default: false}
}, {
timestamps: {
createdAt: 'created_at',
updatedAt: 'updated_at'
}
});
return mongoose.model('inviteCode', inviteCodeSchema);
};
其實就倆主要字段code和used。
需求解決
分析一下注冊碼生成機(jī)制
我總結(jié)了一下主要有以下幾種方案:
-
自己定義一個字符池,將允許的符號放到池子里,隨機(jī)取n個字符組成注冊碼。
缺點(diǎn):自己寫的算法,為了防止不重復(fù),每次需要跟數(shù)據(jù)庫里已有的值進(jìn)行對比,效率慢。 -
使用GUID
缺點(diǎn):字符串較長,占用空間較大,不美觀。 -
主鍵或主鍵+隨機(jī)碼的形成
缺點(diǎn):需要先產(chǎn)生主鍵,而且與數(shù)據(jù)庫類型關(guān)系大,擴(kuò)展性和復(fù)用性較差。 -
使用系統(tǒng)日期
缺點(diǎn):高并發(fā)的時候,可能重復(fù)
目前用的比較多的是第三種方式,衍生出來可以是:將唯一ID映射成base26\base36。
我這里推薦一個項目:https://github.com/dylang/shortid 可以有效快速的生成不重復(fù)的注冊碼(可用于游戲開發(fā))。
解決循環(huán)插入數(shù)據(jù)庫的問題
注冊碼生成方案有了,但是在具體編碼的過程中又遇到了新的問題:如何批量保存一批注冊碼呢
Mongoose本身支持批量插入數(shù)據(jù),所以這個問題很好解決:
router.get('/generate', function (req, res, next) {
var number = Number(req.query.num);
var codeArr = new Array();
for(var i = 0; i< number; i++) {
codeArr.push({
code: shortid.generate()
});
}
InviteCode.collection.insert(codeArr, function (err, docs) {
if(err){
next(err);
}else{
res.redirect('/admin/inviteCode');
}
});
});