import 'dart:async';
|
import 'dart:convert';
|
import 'dart:io';
|
|
import 'package:device_info/device_info.dart';
|
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/material.dart';
|
import 'package:fluttertoast/fluttertoast.dart';
|
import 'package:locations/model/common/http_model.dart';
|
import 'package:locations/model/map/location_model.dart';
|
import 'package:locations/model/map/location_user_model.dart';
|
import 'package:locations/ui/widget/dialog.dart';
|
import 'package:locations/utils/app_util.dart';
|
import 'package:locations/utils/encrypt_util.dart';
|
import 'package:locations/utils/global.dart';
|
import 'package:locations/utils/string_util.dart';
|
import 'package:locations/utils/ui_utils.dart';
|
import 'package:locations/utils/user_util.dart';
|
|
typedef OnHttpRequestFinish = void Function(HttpRequestResult result);
|
|
typedef OnHttpRequestStart = void Function();
|
|
showLoading(BuildContext context) {
|
//先丢失焦点
|
FocusScope.of(context).unfocus();
|
//开启加载框
|
DialogUtil.showDialog(context, LoadingDialog(""));
|
}
|
|
_dismissDialog(BuildContext context) {
|
Navigator.pop(context);
|
}
|
|
class HttpUtil {
|
static AndroidDeviceInfo? _androidInfo;
|
static IosDeviceInfo? _iosInfo;
|
|
static _getSign(Map<String, dynamic> params) {
|
List list = [];
|
//签名
|
params.forEach((key, value) {
|
list.add("$key=$value");
|
});
|
//排序
|
list.sort();
|
String signStr = "";
|
list.forEach((element) {
|
signStr += element + "&";
|
});
|
|
signStr += "@#\$^234AB&c&fg&.==888";
|
|
return EncryptUtil.MD5(signStr);
|
}
|
|
static Future<Map<String, dynamic>> getBaseParams(
|
Map<String, dynamic>? params) async {
|
params ??= {};
|
|
if (Platform.isAndroid) {
|
if (_androidInfo == null) {
|
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
|
_androidInfo = await deviceInfo.androidInfo;
|
}
|
} else if (Platform.isIOS) {
|
if (_iosInfo == null) {
|
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
|
_iosInfo = await deviceInfo.iosInfo;
|
}
|
}
|
|
params["version"] = (await AppUtil.getVersionCode()).toString();
|
|
print("androidInfo:${_androidInfo!.version}");
|
|
//添加附加参数
|
params["timestamp"] = DateTime.now().millisecondsSinceEpoch.toString();
|
params["platform"] = Platform.isAndroid ? "android" : "ios";
|
params["packages"] = "com.dw.zzql";
|
if (Platform.isAndroid) {
|
if (Global.utdId != null) {
|
params["utdId"] = Global.utdId;
|
}
|
params["osVersion"] = _androidInfo!.version.release;
|
} else if (Platform.isIOS) {
|
params["device"] = _iosInfo!.identifierForVendor;
|
}
|
|
params["sign"] = _getSign(params);
|
|
return params;
|
}
|
|
static Future<HttpRequestResult> baseRequest(
|
String api, Map<String, dynamic> params, OnHttpRequestStart? onStart,
|
{bool notifyError = false}) async {
|
// params ??= {};
|
params = await getBaseParams(params);
|
|
var httpClient = HttpClient();
|
httpClient.connectionTimeout = const Duration(seconds: 20);
|
var uri = Uri(
|
scheme: "http",
|
host: "192.168.3.122",
|
path: api,
|
port: 8082,
|
queryParameters: params);
|
print("uri:$uri");
|
|
if (onStart != null) {
|
onStart();
|
}
|
HttpRequestResult requestResult;
|
|
try {
|
HttpClientRequest request = await httpClient.postUrl(uri);
|
var response = await request.close();
|
if (response.statusCode == HttpStatus.ok) {
|
String result = await response.transform(const Utf8Decoder()).join();
|
requestResult = HttpRequestResult(true, jsonDecode(result));
|
} else {
|
requestResult = HttpRequestResult(false, null, msg: "网络请求失败");
|
}
|
} on TimeoutException catch (_) {
|
requestResult = HttpRequestResult(false, null, msg: "网络请求超时");
|
} on SocketException catch (_) {
|
Fluttertoast.showToast(msg: "网络请求出错");
|
requestResult = HttpRequestResult(false, null, msg: "网络请求出错");
|
}
|
if (notifyError && !requestResult.success) {
|
ToastUtil.toast(requestResult.msg!);
|
}
|
return requestResult;
|
}
|
}
|
|
class UserApiUtil {
|
///验证码发送
|
static Future<Map<String, dynamic>?> sendSMS(
|
BuildContext context, String phone) async {
|
var result =
|
await HttpUtil.baseRequest("/api/v1/sms/sendSMS", {"phone": phone}, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
static Future<Map<String, dynamic>?> uploadPushRegId(
|
BuildContext context, String regId) async {
|
var uid = await UserUtil.getUid();
|
var params = {"regId": regId};
|
if (uid != null) {
|
params["uid"] = uid.toString();
|
}
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/user/uploadPushRegId", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///登录
|
static Future<Map<String, dynamic>?> login(
|
BuildContext context, String phone, String vcode, String token) async {
|
Map<String, dynamic> params = {};
|
params["phone"] = phone;
|
if (!StringUtil.isNullOrEmpty(vcode)) {
|
params["vcode"] = vcode;
|
}
|
|
if (!StringUtil.isNullOrEmpty(token)) {
|
params["token"] = token;
|
}
|
|
var result =
|
await HttpUtil.baseRequest("/api/v1/user/loginPhone", params, () {
|
showLoading(context);
|
}, notifyError: true);
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///获取用户信息
|
static Future<Map<String, dynamic>?> getUserInfo(
|
BuildContext context, int uid) async {
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
var result =
|
await HttpUtil.baseRequest("/api/v1/user/getUserInfo", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///退出登录
|
static Future<Map<String, dynamic>?> logout(
|
BuildContext context, int? uid) async {
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
var result =
|
await HttpUtil.baseRequest("/api/v1/user/logout", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
}
|
|
class LocationApiUtil {
|
///上传位置
|
static Future<Map<String, dynamic>?> uploadLocation(
|
BaiduLocation location) async {
|
var uid = await UserUtil.getUid();
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/uploadLocation",
|
{
|
"latitude": location.latitude.toString(),
|
"longitude": location.longitude.toString(),
|
"address": location.address,
|
"addressDetail": location.locationDetail,
|
"uid": uid.toString()
|
},
|
() {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//获取位置
|
static Future<UserLocationInfo?> getLocation(String? targetUid) async {
|
var uid = await UserUtil.getUid();
|
var params = {"uid": uid.toString()};
|
if (targetUid != null) {
|
params["targetUid"] = targetUid;
|
}
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/getLocation", params, () {});
|
print(result.data);
|
|
if (result.success) {
|
if (result.data!["code"] == 0) {
|
return UserLocationInfo.fromJson(result.data!["data"]);
|
} else {
|
Fluttertoast.showToast(msg: result.data!["msg"]);
|
}
|
}
|
return null;
|
}
|
|
//获取定位对象列表
|
static Future<Map<String, dynamic>?> getLocationUsers(
|
int uid, int page) async {
|
var params = {"uid": uid.toString(), "page": page.toString()};
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/getLocationUsers", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//添加定位对象
|
static Future<Map<String, dynamic>?> addLocationUser(BuildContext context,
|
int uid, String? name, String phone, LocationUserType type) async {
|
var params = {"uid": uid.toString()};
|
if (name != null) {
|
params["name"] = name;
|
}
|
params["phone"] = phone;
|
params["type"] =
|
type.toString().substring(type.toString().indexOf(".") + 1);
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/addLocationUser", params, () {
|
showLoading(context);
|
});
|
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//修改定位对象
|
static Future<Map<String, dynamic>?> updateLocationUser(BuildContext context,
|
String id, String? phone, LocationUserType? type) async {
|
var uid = await UserUtil.getUid();
|
var params = {"uid": uid.toString(), "id": id};
|
if (phone != null) {
|
params["phone"] = phone;
|
}
|
if (type != null) {
|
params["type"] =
|
type.toString().substring(type.toString().indexOf(".") + 1);
|
}
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/updateLocationUser", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//删除定位对象
|
static Future<Map<String, dynamic>?> deleteLocationUser(
|
BuildContext context, int uid, String? id) async {
|
var params = {"uid": uid.toString(), "id": id};
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/deleteLocationUser", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//获取需要处理的定位邀请
|
static Future<Map<String, dynamic>?> getInviteLocation(int uid) async {
|
var params = {"uid": uid.toString()};
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/getInviteLocation", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//同意定位邀请
|
static Future<Map<String, dynamic>?> agreeInviteLocation(
|
int uid, String id) async {
|
var params = {"uid": uid.toString(), "id": id};
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/agreeInviteLocation", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//拒绝定位邀请
|
static Future<Map<String, dynamic>?> rejectInviteLocation(
|
int uid, String id) async {
|
var params = {"uid": uid.toString(), "id": id};
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/location/rejectInviteLocation", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
//获取轨迹
|
static Future<Map<String, dynamic>?> getTravel(
|
int uid, int? targetUid, int startTime, int endTime, int page) async {
|
var params = {
|
"uid": uid.toString(),
|
"startTime": startTime.toString(),
|
"endTime": endTime.toString(),
|
"page": page.toString()
|
};
|
|
if (targetUid != null) {
|
params["targetUid"] = targetUid.toString();
|
}
|
|
var result =
|
await HttpUtil.baseRequest("/api/v1/location/getTravel", params, () {});
|
print(result);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
}
|
|
class SOSApiUtil {
|
///添加紧急联系人
|
static Future<Map<String, dynamic>?> addEmergencyContacts(
|
BuildContext context,
|
String? name,
|
String? phone,
|
String? remarks) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
params["phone"] = phone;
|
params["name"] = name;
|
|
if (!StringUtil.isNullOrEmpty(remarks)) {
|
params["remarks"] = remarks;
|
}
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/addEmergencyContacts", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///紧急联系人列表
|
static Future<Map<String, dynamic>?> listEmergencyContacts(
|
BuildContext context) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/listEmergencyContacts", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///删除紧急联系人
|
static Future<Map<String, dynamic>?> deleteEmergencyContacts(
|
BuildContext context, String id) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
params["id"] = id;
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/deleteEmergencyContacts", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///修改紧急联系人
|
static Future<Map<String, dynamic>?> updateEmergencyContacts(
|
BuildContext context,
|
String id,
|
String name,
|
String phone,
|
String? remarks) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {"id": id};
|
params["uid"] = uid.toString();
|
params["phone"] = phone;
|
params["name"] = name;
|
|
if (!StringUtil.isNullOrEmpty(remarks)) {
|
params["remarks"] = remarks;
|
}
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/updateEmergencyContacts", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///获取求助信息
|
static Future<Map<String, dynamic>?> addSOSRecord(
|
BuildContext context, SimpleLocation location) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
params["latitude"] = location.latitude.toString();
|
params["longitude"] = location.longitude.toString();
|
params["address"] = location.address.toString();
|
params["addressDetail"] = location.addressDetail.toString();
|
|
var result =
|
await HttpUtil.baseRequest("/api/v1/sos/addSOSRecord", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///获取求助信息
|
static Future<Map<String, dynamic>?> listSOSRecord(
|
BuildContext context, int page) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {"page": page.toString()};
|
params["uid"] = uid.toString();
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/getSOSRecordList", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///清除求助信息
|
static Future<Map<String, dynamic>?> clearSOSRecord(
|
BuildContext context) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
|
var result =
|
await HttpUtil.baseRequest("/api/v1/sos/clearSOSRecord", params, () {
|
showLoading(context);
|
});
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///获取想我求救的SOS
|
static Future<Map<String, dynamic>?> getTargetSOSRecord(
|
BuildContext context) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {};
|
params["uid"] = uid.toString();
|
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/sos/getTargetSOSRecord", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
|
///查阅向我求救的SOS
|
static Future<Map<String, dynamic>?> readTargetSOS(
|
BuildContext context, String id) async {
|
var uid = await UserUtil.getUid();
|
if (uid == null) {
|
ToastUtil.toast("请先登录");
|
return null;
|
}
|
|
Map<String, dynamic> params = {"id": id};
|
params["uid"] = uid.toString();
|
|
var result =
|
await HttpUtil.baseRequest("/api/v1/sos/readTargetSOS", params, () {});
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
}
|
|
class FeedBackApiUtil {
|
///查阅向我求救的SOS
|
static Future<Map<String, dynamic>?> advice(
|
BuildContext context, String? type, String content) async {
|
var uid = await UserUtil.getUid();
|
Map<String, dynamic> params = {};
|
if (uid != null) {
|
params["uid"] = uid.toString();
|
}
|
|
if (type != null) {
|
params["type"] = type;
|
}
|
|
params["content"] = content;
|
var result =
|
await HttpUtil.baseRequest("/api/v1/feedback/advice", params, () {
|
showLoading(context);
|
}, notifyError: true);
|
|
_dismissDialog(context);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
}
|
|
class ConfigApiUtil {
|
///查阅向我求救的SOS
|
static Future<Map<String, dynamic>?> getConfig() async {
|
var result = await HttpUtil.baseRequest(
|
"/api/v1/config/getConfig", {}, () {},
|
notifyError: true);
|
if (result.success) {
|
return result.data;
|
}
|
return null;
|
}
|
}
|