user_model.dart 9.35 KB
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/user.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/loading.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:tpns_flutter_plugin/tpns_flutter_plugin.dart';

import '../app.dart';

class UserModel with ChangeNotifier {
  User _user;
  String _registrationId; //极光推送registrationId
  String _token; //信鸽推送token

  User get user => _user;

  set registrationId(String registrationId) => _registrationId = registrationId;

  String get registrationId => _registrationId;

  String get token => _token;

  set token(String value) {
    _token = value;
  }

  /// 初始化 User
  void initUser() {
    if (App.sp.containsKey('user')) {
      String s = App.sp.getString('user');
      _user = User.fromJson(json.decode(s));
    }
  }

  /// 登录
  Future<String> login(BuildContext context, Map<String, String> params) async {
    BaseResp<List> baseResp = await DioUtil()
        .request<List>(context, Method.get, HttpUrl.app_user_login,
            data: params)
        .catchError((error) {
      print(error.toString());
    });
    if (baseResp.code != Constant.status_success) {
      return baseResp.msg ?? '登录失败,请检查账号密码';
    } else {
      Map<String, dynamic> seller = baseResp.data[0]["seller"];
      Map<String, dynamic> user = baseResp.data[0]["user"];
      Map<String, dynamic> userMap = {
        "openid": user['id'],
        "account": user['account'],
        "role_name": user['role_name'],
        "sellerid": seller['id'],
        "sellerimage": seller['seller_image'],
        "sellercode": params['seller_code'],
        "sellername": seller['sellername'],
        "sellerphone": seller['seller_tel'],
        "sellerAddr": '',
        "scatter": 0,
        "room": 0,
        "cassette": 0,
        "morning": "",
        "noon": "",
        "night": "",
        'userphone': user['phone'],
        'token': baseResp.data[0]["token"]['token'],
        'nickname': user['nick_name'],
      };
      await saveUserInfo(User.fromJson(userMap));
      return getSellerInfo(
          context,
          {"seller_id": seller['id'], "seller_openid": seller['openid']},
          userMap);
    }
  }

  ///获取商家信息
  Future<String> getSellerInfo(BuildContext context, Map<String, String> params,
      Map<String, dynamic> userMap) async {
    BaseResp<Map<String, dynamic>> baseResp = await DioUtil()
        .request<Map<String, dynamic>>(context, Method.get, HttpUrl.sellerinfo,
            data: params)
        .catchError((error) {
      print(error.toString());
    });
    if (baseResp.code != Constant.status_success) {
      return baseResp.msg ?? '登录失败,请检查账号密码';
    } else {
      Map<String, dynamic> seller = baseResp.data['seller'];
      Map<String, dynamic> daily = baseResp.data["daily"];
      Map<String, dynamic> user = Map.of(userMap);
      user['sellerAddr'] = seller['real_address'] ?? seller['map_address'];
      user['scatter'] = baseResp.data['scatter'];
      user['room'] = baseResp.data['room'];
      user['cassette'] = baseResp.data['cassette'];
      user['morning'] = daily['morning'];
      user['noon'] = daily['noon'];
      user['night'] = daily['night'];

      await saveUserInfo(User.fromJson(user));
      App.sp.setBool("isLogin", true);
      App.sp.setString("is_call_tel", seller['is_call_tel'].toString());
      NavigatorUtil.goHomePage(context);
      return null;
    }
  }

  //   //判断微信登录成功APP用户是否绑定微信小程序,绑定返回绑定的微信小程序openid,否则返回null
  // Future<String> getMiniProgramOpenid(BuildContext context, Map req) async {
  //   try {
  //     BaseResp<dynamic> baseResp = await DioUtil().request<dynamic>(
  //         context, Method.get, HttpUrl.get_mini_openid,
  //         data: req, showLoading: true);
  //     if (baseResp == null) return null;
  //     if (baseResp.code == Constant.status_success) {
  //       App.sp.setString("mini-openid", baseResp.data?.toString() ?? "");
  //       App.sp.setString("openid", baseResp.data?.toString() ?? "");
  //       // initPlatformState(context); //注册信鸽推送,绑定openid,token关系
  //       return baseResp.data?.toString();
  //     } else {
  //       App.sp.setString("mini-openid", "");
  //     }
  //   } catch (e) {
  //     print(e);
  //     Loading.hideLoading(context);
  //   }

  //   return null;
  // }

  ///初始化推送token
  userTokenInit(BuildContext context, Map<String, String> params) async {
    BaseResp<dynamic> baseResp = await DioUtil()
        .request<dynamic>(context, Method.get, HttpUrl.user_token_init,
            showLoading: false, data: params)
        .catchError((error) {
      print(error.toString());
    });
    if (baseResp != null && baseResp.code == Constant.status_success) {}
  }

  //版本更新弹框
  showLoginOutDialog(BuildContext pageContext) {
    showDialog(
        context: pageContext,
        builder: (context) {
          Widget widget = Container(
            decoration: BoxDecoration(
                color: MyColours.color_ffffff,
                borderRadius: BorderRadius.all(
                    Radius.circular(ScreenUtil().setWidth(30)))),
            padding: EdgeInsets.only(top: ScreenUtil().setWidth(88)),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Center(
                  child: Text(
                    "确定要退出登录吗?",
                    style: TextStyle(
                        fontSize: ScreenUtil().setSp(36),
                        color: MyColours.color_353535),
                  ),
                ),
                VEmptyView(66),
                MyDivider(double.infinity, ScreenUtil().setWidth(1)),
                Container(
                  height: ScreenUtil().setWidth(94),
                  child: Row(
                    children: <Widget>[
                      Expanded(
                        child: GestureDetector(
                          onTap: () {
                            Navigator.of(context).pop();
                          },
                          child: Text(
                            "取消",
                            style: TextStyle(
                                fontSize: ScreenUtil().setSp(34),
                                color: MyColours.color_777777),
                            textAlign: TextAlign.center,
                          ),
                        ),
                      ),
                      MyDivider(
                          ScreenUtil().setWidth(1), ScreenUtil().setWidth(94)),
                      Expanded(
                        child: GestureDetector(
                          onTap: () {
                            Navigator.of(context).pop();
                            loginOut(pageContext, {
                              "seller_code": user.sellercode,
                              "account": user.account
                            });
                          },
                          child: Text(
                            "确定",
                            style: TextStyle(
                                fontSize: ScreenUtil().setSp(34),
                                color: MyColours.color_2bb5b7),
                            textAlign: TextAlign.center,
                          ),
                        ),
                      )
                    ],
                  ),
                )
              ],
            ),
          );
          return Center(
            child: UnconstrainedBox(
              constrainedAxis: Axis.vertical,
              child: ConstrainedBox(
                  constraints:
                      BoxConstraints(maxWidth: ScreenUtil().setWidth(560)),
                  child: DefaultTextStyle(
                    style: TextStyle(decoration: TextDecoration.none),
                    child: widget,
                  )),
            ),
          );
          return AlertDialog(
            content: widget,
            contentPadding: EdgeInsets.zero,
          );
        });
  }

  ///退出登录
  loginOut(BuildContext context, Map<String, String> params) async {
    BaseResp<int> baseResp = await DioUtil()
        .request<int>(context, Method.get, HttpUrl.login_out, data: params)
        .catchError((error) {
      print(error.toString());
    });
    if (baseResp.code != Constant.status_success) {
      Utils.showToast(baseResp.msg ?? "退出登录失败,请稍后重试");
    } else {
      if (App.sp.containsKey('unionid')) {
        //微信登陆的时候,退出清空数据
        App.sp.remove('openid');
        App.sp.remove("unionid");
      }
      App.sp.setBool("isLogin", false);
      XgFlutterPlugin().stopXg();
      NavigatorUtil.goLoginPage(context);
    }
  }

  /// 保存用户信息到 sp
  saveUserInfo(User user) {
    _user = user;
    App.sp.setString('user', json.encode(user.toJson()));
  }
}