登录模块的一种设计与实现

最近在使用 Flutter 做一个新产品,其中一个需求是完成登录模块

开发过程中遇到了临时整体变更方案的问题,由自己请求接口变为接入公司内通用 SDK,因为这部分代码设计的还算不错,没有影响实际项目进展,可见良好的设计是非常重要的

不过还是应该批判这种临时改方案、开发兜时间的行为!

需求内容

  • 完成登录模块,涉及到以下三端:
    • 用户 - APP
    • URS (User Register Service) - 帐号注册后台
    • 客户端用户信息后台
  • 登录业务有以下四种场景:
    • 手机号验证码登录
    • 第三方登录(需强制绑定手机号)
    • 设置页内绑定第三方账号
    • 普通打开APP
  • 这四种场景内部的业务逻辑为:
    • 手机号:获取验证码 -> 校验验证码 -> 获取个人信息 -> 登录成功
    • 三方:第三方登录 -> 获取账号绑定状态 -> 获取验证码 -> 校验验证码 -> 绑定账号 -> 获取个人信息 -> 登录成功
    • 绑定三方:第三方登录 -> 账号绑定 -> 获取个人信息 -> 登录成功
    • 打开APP:获取个人信息 -> 登录成功
  • 以三方登录为例,时序图如下:

方案设计

可以发现,登录这部分的业务场景,都是链式结构,多数比较长,而且其中有一些步骤是相似的,适合复用,因此实现方案应当完成如下的要求:

  • 良好的模块化 - LoginTask,便于复用
  • 支持链式定义 - LoginStream,整体记录日志与异常情况管理

对外只暴露已经定义好的登录事件链,提供可选的入参即可

如此设计后,整体的时序图为:

代码实现

  • 抽象单个模块的行为,ILoginTask,各个小模块实现该接口
  • 定义单个模块的生命周期回调,ILoginTaskCallback,管理类LoginStreamLine实现该接口整体管理
  • 对外只暴露事件流的定义LoginStreamDefine如下: