要求
抽奖活动,用户注册的有唯一的手机号,根据手机号生成一个唯一且对应的抽奖码
实现
随机码生成
先不管随机码是否重复,写一个根据电话来生成10位随机字符串的函数
...
let crypto = require('crypto') //引用加密模块
...
/*
* 根据一个盐值加密生成随机的字符串
* @function
* @param {string} source 要转换的字符串
*/
const sha512 = function(source, salt){
const hash = crypto.createHmac('sha512', salt) // 盐值
hash.update(source)
const value = hash.digest('hex')
console.log(value)
return {
salt: salt,
Hash: value
}
}
/*
* 根据电话号 返回一个10位随机加密字符串的方法
* function
* @param {string} phone
*/
function initCode(phone) {
let now = new Date().getTime().toString()
console.log('time')
console.log(now)
let code = sha512(phone, now) // 这里使用了timestemp作为盐值,让生成的抽奖码更不随机
return code.Hash.substr(3,10) // 如果需要更多位 可以多截取一些,也可以从不同位置截取
}
要实现不重复 就要用到数据库查询
只要查询到一个重复的就重新生成一个,这里用递归实现了
/*
* 一个方法用于生成不重复的字符串
* @function
* @param {string} phone - 用户手机号
* @param {function} callback - 回调函数
* */
function getUnicCode(phone,callback){
let code = initCode(phone)
connection.query('SELECT token FROM usersignup WHERE token = ? LIMIT 1', [code], function(err, result) {
if(err){
console.log('查询出错')
console.log(err)
} else if(result.length <= 0) {
console.log('不重复的token')
callback(code) // 回调将附带生成的10位随机字符串
} else {
console.log('重复的token')
getUnicCode(phone,callback) // 重新生成
}
})
}
上面我的数据表是usersignup, token字段就是抽奖码
- 这里是角角兔 towrabbit
- 欢迎点赞评论哦