金久信后台管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

86 lines
3.0 KiB

var everyDaylimit = 12; // 限制同一个手机号每天次数
module.exports = {
/**
* 发送短信的验证码
* @url user/pub/sendSmsCode 前端调用的url参数地址
* @description 发送验证码
* data 请求参数 说明
* @param {String} mobile 手机号
* @param {String} type 验证码类型
* @param {Boolean|String} checkUserExist 是否需要检测手机号对应的账号是否存在或不存在,默认不检测,若为exists代表手机号必须已注册,若为!exists代表手机号必须未注册
*
* res 返回参数说明
* @param {Number} code 错误码,0表示成功
* @param {String} msg 详细信息
* @param {Object} requestRes 原始返回数据
* @param {Object} requestParam 包含服务供应商和发送的手机号
*/
main: async (event) => {
let { data = {}, userInfo, util, originalParam } = event;
let { uniID, config, pubFun, vk, db, _ } = util;
let { uid } = data;
let res = { code: 0, msg: '' };
// 业务逻辑开始-----------------------------------------------------------
let {
mobile,
type,
checkUserExist = false
} = data;
if (vk.pubfn.isNull(mobile)) {
return { code: -1, msg: '手机号不能为空' };
}
if (!vk.pubfn.test(mobile, 'mobile')) {
return { code: -1, msg: "手机号格式错误" };
}
if (checkUserExist) {
let dcloud_appid = originalParam.context.appId;
// 检测手机号对应的账号是否存在
let num = await vk.daoCenter.userDao.count({
mobile,
dcloud_appid: _.or(_.eq(dcloud_appid), _.exists(false))
});
if (checkUserExist === true || checkUserExist === "exists") {
// 手机号必须已注册用户,如果手机号未注册,则不发短信
if (num === 0) {
return { code: -1, msg: `手机号:${mobile} 未注册`, notExists: true };
}
} else if (checkUserExist === "!exists") {
// 手机号必须未注册用户,如果手机号已注册,则不发短信
if (num > 0) {
return { code: -1, msg: `手机号:${mobile} 已注册`, exists: true };
}
}
}
// 针对同一个手机号,发送验证码每天有次数限制
const cacheKey = `sys.sendSmsCode.everyDaylimit-${mobile}`;
let currNum = await vk.globalDataCache.get(cacheKey);
if (!currNum) currNum = 0;
if (currNum >= everyDaylimit) {
return { code: -1, msg: "此手机号今日已超最大次数限制,请明日再试" };
}
let code = vk.pubfn.random(6, "0123456789");
let provider = "unicloud";
if (vk.pubfn.getData(config, "vk.service.sms.aliyun.enable")) {
provider = "aliyun";
}
res = await vk.system.smsUtil.sendSmsVerifyCode({
provider,
code,
type,
phone: mobile,
expiresIn: 180, // 验证码实际有效时间,必须是60的倍数
});
if (res.code == 0) {
currNum++;
let { startTime } = vk.pubfn.getDayOffsetStartAndEnd(1, new Date());
let second = vk.pubfn.toDecimal((startTime - Date.now()) / 1000, 0)
await vk.globalDataCache.set(cacheKey, currNum, second);
}
// 业务逻辑结束-----------------------------------------------------------
return res;
}
}