欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NetCore+Redis仿微博系统(1)-注册/登录

程序员文章站 2023-12-28 13:42:22
...

登录时不存在则注册
登录过程:

  1. 发送验证码 简单的使用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);
            }
            //异步调用发送验证码方法(略)
}
  1. 登录 校验是否允许登录, 使用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);
        //其他业务处理(比如日志)
}

注册与登录其实相对简单得多了.
欢迎指点

上一篇:

下一篇: