实现用户注册、登录

构建 request

registration_request.dart

class RegistrationRequest extends BaseRequest {
  @override
  bool needLogin() {
    return false;
  }

  @override
  String path() {
    return '/uapi/user/registration';
  }

  @override
  HttpMethod httpMethod() {
    return HttpMethod.POST;
  }
}

login_request.dart

class LoginRequest extends BaseRequest {
  @override
  bool needLogin() {
    return false;
  }

  @override
  String path() {
    return '/uapi/user/login';
  }

  @override
  HttpMethod httpMethod() {
    return HttpMethod.POST;
  }
}

封装注册、登录请求

LoginDao.dart

对注册、登录接口请求封装,登录成功后缓存用户标识。

class LoginDao {
  static final String BOARDING_PASS = "auth_token";

  /// 登录
  static login(String userName, String password) {
    return _send(userName, password);
  }

  // 注册
  static registration(
      String userName, String password, String imoocId, String orderId) {
    return _send(userName, password, imoocId: imoocId, orderId: orderId);
  }

  /// 请求数据接口 返回请求数据
  static _send(String userName, String password, {imoocId, orderId}) async {
    // 构建 request 对象
    BaseRequest request;
    if (imoocId != null && orderId != null) {
      request = RegistrationRequest();
    } else {
      request = LoginRequest();
    }
    // 添加请求参数
    request
        .add('userName', userName)
        .add('password', password)
        .add('imoocId', imoocId)
        .add('orderId', orderId);

    // 发送网络请求
    var result = await HiNet.getInstance().fire(request);

    // 请求接口成功
    if (result['code'] == 0 && result['data'] != null) {
      // 缓存用户标识
      HiCache.getInstance().setString(BOARDING_PASS, result['data']);
    }
    return result;
  }

  /**
   * 获取登录令牌
   */
  static getBoardingPass() {
    return HiCache.getInstance().get(BOARDING_PASS);
  }
}

添加 Header

base_request.dart

在构建 url 时判断接口是否需要登录,如果需要则添加用户登录标识到 header。

 // 如果需要登录,则添加登录令牌到 header
    if (needLogin()) {
      addHeader(LoginDao.BOARDING_PASS, LoginDao.getBoardingPass());
    }

编写注册、登录页面

registration_page.dart

class RegistrationPage extends StatefulWidget {
  // 跳转回调
  final VoidCallback onJumpToLogin;

  const RegistrationPage({Key key, this.onJumpToLogin}) : super(key: key);

  @override
  _RegistrationPageState createState() => _RegistrationPageState();
}

class _RegistrationPageState extends State<RegistrationPage> {
  bool protect = false;
  bool loginEnable = false;
  String userName;
  String password;
  String rePassword;
  String imoocId;
  String orderId;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 点击 appbar 右侧【登录】跳转登录页面
      appBar: appBar("注册", "登录", widget.onJumpToLogin),
      body: Container(
        child: ListView(
          children: [
            LoginEffect(protect: protect),
            LoginInput(
              "用户名",
              "请输入用户名",
              onChanged: (text) {
                userName = text;
                checkInput();
              },
            ),
            LoginInput(
              "密码",
              "请输入密码",
              lineStretch: true,
              obscureText: true, // 是否启用安全模式
              onChanged: (text) {
                password = text;
                checkInput();
              },
              // 焦点改变回调
              focusChanged: (focus) {
                this.setState(() {
                  protect = focus;
                });
              },
            ),
            LoginInput(
              "确认密码",
              "请输入确认密码",
              lineStretch: true,
              obscureText: true, // 是否启用安全模式
              onChanged: (text) {
                rePassword = text;
                checkInput();
              },
              // 焦点改变回调
              focusChanged: (focus) {
                this.setState(() {
                  protect = focus;
                });
              },
            ),
            LoginInput(
              "慕课网ID",
              "请输入你的慕课网用户ID",
              keyboardType: TextInputType.number, // 数字键盘
              onChanged: (text) {
                imoocId = text;
                checkInput();
              },
            ),
            LoginInput(
              "课程订单号",
              "请输入课程订单号后四位",
              keyboardType: TextInputType.number, // 数字键盘
              lineStretch: true,
              onChanged: (text) {
                orderId = text;
                checkInput();
              },
            ),
            Padding(
              padding: EdgeInsets.only(top: 20, left: 20, right: 20),
              child: LoginButton(
                title: '注册',
                enable: loginEnable,
                onPressed: checkParams,
              ),
            ), // 注册按钮
          ],
        ),
      ),
    );
  }

  /// 检测输入状态,是否启用注册按钮
  void checkInput() {
    bool enable;
    if (isNotEmpty(userName) &&
        isNotEmpty(password) &&
        isNotEmpty(rePassword) &&
        isNotEmpty(imoocId) &&
        isNotEmpty(orderId)) {
      enable = true;
    } else {
      enable = false;
    }
    // 设置 loginEnable 状态
    setState(() {
      loginEnable = enable;
    });
  }

  /// 发送注册请求
  void send() async {
    try {
      var result =
          await LoginDao.registration(userName, password, imoocId, orderId);
      if (result['code'] == 0) {
        // 注册成功
        showToast('注册成功');
        if (widget.onJumpToLogin != null) {
          widget.onJumpToLogin(); // 跳转登录页面
        }
      } else {
        showWarnToast(result['msg']);
      }
    } on NeedAuth catch (e) {
      showWarnToast(e.message);
    } on HiNetError catch (e) {
      showWarnToast(e.message);
    }
  }

  void checkParams() {
    String tips;
    if (password != rePassword) {
      tips = '两次密码不一致!';
    } else if (orderId.length != 4) {
      tips = '请输入订单号后四位';
    }
    if (tips != null) {
      print(tips);
      return;
    }
    // 注册用户
    send();
  }
}

login_page.dart

class LoginPage extends StatefulWidget {
  // 跳转回调
  final VoidCallback onJumpToLogin;

  const LoginPage({Key key, this.onJumpToLogin}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  bool protect = false;
  bool loginEnable = false;
  String userName;
  String password;
  String rePassword;
  String imoocId;
  String orderId;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 点击 appbar 右侧【登录】跳转登录页面
      appBar: appBar("登录", "注册", () {}),
      body: Container(
        child: ListView(
          children: [
            LoginEffect(protect: protect),
            LoginInput(
              "用户名",
              "请输入用户名",
              onChanged: (text) {
                userName = text;
                checkInput();
              },
            ),
            LoginInput(
              "密码",
              "请输入密码",
              obscureText: true, // 是否启用安全模式
              onChanged: (text) {
                password = text;
                checkInput();
              },
              // 焦点改变回调
              focusChanged: (focus) {
                this.setState(() {
                  protect = focus;
                });
              },
            ),
            Padding(
              padding: EdgeInsets.only(top: 20, left: 20, right: 20),
              child: LoginButton(
                title: '登录',
                enable: loginEnable,
                onPressed: send,
              ),
            ), // 注册按钮
          ],
        ),
      ),
    );
  }

  /// 检测输入状态,是否启用注册按钮
  void checkInput() {
    bool enable;
    if (isNotEmpty(userName) && isNotEmpty(password)) {
      enable = true;
    } else {
      enable = false;
    }
    // 设置 loginEnable 状态
    setState(() {
      loginEnable = enable;
    });
  }

  /// 发送登录请求
  void send() async {
    try {
      var result = await LoginDao.login(userName, password);
      if (result['code'] == 0) {
        showToast('登录成功');
        if (widget.onJumpToLogin != null) {
          widget.onJumpToLogin(); // 跳转首页
        }
      } else {
        showToast(result['msg']);
      }
    } on NeedAuth catch (e) {
      showToast(e.message);
    } on HiNetError catch (e) {
      showToast(e.message);
    }
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值