NetCore+Redis仿微博系统(1)-注册/登录
程序员文章站
2023-12-28 13:42:22
...
登录时不存在则注册
登录过程:
- 发送验证码 简单的使用string key
public async Task<SendVCodeOutput> SendVCode(SendVCodeInput input)
{
//省略一些业务代码
//获取短信验证码(含过期时间)
string key="k:verify:code:"+input.Phone;
var result = await db.StringGetWithExpiryAsync(key);
string code;
if (result.Value.IsNullOrEmpty)
{
code = RandomCode();
}
else
{
//尝试延续
TimeSpan expire = result.Expiry.GetValueOrDefault(TimeSpan.Zero);
//如果 过期时间-剩余过期时间 超过60秒 重发/否则返回操作过快
if (15*60 - expire.TotalSeconds < 60)
{
throw new ErrorCodeException(ErrorCodeType.PhoneVerifyCodeShouldWait);
}
code = result.Value;
}
//确保命令发出去并且成功. 返回
if (!await db.StringSetAsync(key, code, TimeSpan.FromSeconds(AppServerConfig.PhoneVerifyExpired)))
{
throw new ErrorCodeException(ErrorCodeType.CacheBusy);
}
//异步调用发送验证码方法(略)
}
- 登录 校验是否允许登录, 使用bitmap存储用户登录的天数
public async Task<LoginOutput> Login(LoginInput input)
{
//省略一些业务代码
//ToInt()是扩展方法, int.TryParse
if (input.vcode.IsNullOrWhiteSpace() || input.vcode.Length != 6 ||
((string)(await db.StringGetAsync(key))).ToInt(-1) != input.vcode.ToInt())
{
throw new ErrorCodeException(ErrorCodeType.PhoneVerifyCodeFailed);
}
//这里是登录业务代码 略
//登录成功
LoginSuccess(code);
}
async private void LoginSuccess(long code)
{
//记录当天用户登录状态(后续检查是否活跃用户,登录天数等等)
//假设系统是2020-01-01开始运行的
DateTime beginTime = new DateTime(2020, 1, 1);
DateTime now = DateTime.Now;
TimeSpan diff = now - beginTime;
await db.StringSetBitAsync("b:user:login:days:" + code.ToString(), (long)diff.TotalDays, true, CommandFlags.FireAndForget);
//其他业务处理(比如日志)
}
注册与登录其实相对简单得多了.
欢迎指点