@@ -10,6 +10,7 @@ class UserInfoModel { | |||||
String username; | String username; | ||||
List<String> perms; | List<String> perms; | ||||
String registerInviteCodeEnable; | String registerInviteCodeEnable; | ||||
bool isTBAuth; | |||||
// 获取模糊手机号码 | // 获取模糊手机号码 | ||||
get blurMobile => !EmptyUtil.isEmpty(mobile) ? mobile.length == 11 ? '${mobile.substring(0, 3)}****${mobile.substring(7, mobile.length)}' : mobile : mobile; | get blurMobile => !EmptyUtil.isEmpty(mobile) ? mobile.length == 11 ? '${mobile.substring(0, 3)}****${mobile.substring(7, mobile.length)}' : mobile : mobile; | ||||
@@ -23,6 +24,7 @@ class UserInfoModel { | |||||
mobile = json['mobile']; | mobile = json['mobile']; | ||||
perms = json['perms']?.cast<String>(); | perms = json['perms']?.cast<String>(); | ||||
registerInviteCodeEnable = json['register_invite_code_enable']; | registerInviteCodeEnable = json['register_invite_code_enable']; | ||||
isTBAuth = json['isTBAuth']; | |||||
} | } | ||||
Map<String, dynamic> toJson() { | Map<String, dynamic> toJson() { | ||||
@@ -33,6 +35,7 @@ class UserInfoModel { | |||||
data['perms'] = this.perms; | data['perms'] = this.perms; | ||||
data['mobile'] = this.mobile; | data['mobile'] = this.mobile; | ||||
data['register_invite_code_enable'] = this.registerInviteCodeEnable; | data['register_invite_code_enable'] = this.registerInviteCodeEnable; | ||||
data['isTBAuth'] = this.isTBAuth; | |||||
return data; | return data; | ||||
} | } | ||||
@@ -28,7 +28,15 @@ class UserInfoNotifier with ChangeNotifier { | |||||
} | } | ||||
return _userInfo; | return _userInfo; | ||||
} | } | ||||
/// 更新淘宝授权 | |||||
void updateUserAuth(bool isAuth){ | |||||
if(_userInfo != null){ | |||||
_userInfo.isTBAuth = isAuth; | |||||
notifyListeners(); | |||||
} | |||||
} | |||||
/// 更新用户数据 | /// 更新用户数据 | ||||
void setUserInfo(UserInfoModel loginUser) async { | void setUserInfo(UserInfoModel loginUser) async { | ||||
print('${loginUser.toString()}'); | print('${loginUser.toString()}'); | ||||
@@ -14,9 +14,14 @@ class GlobalConfig { | |||||
/// 用户手机号码 | /// 用户手机号码 | ||||
static final String SHARED_KEY_MOBILE = 'sp_mobile'; | static final String SHARED_KEY_MOBILE = 'sp_mobile'; | ||||
/// 用户的淘宝授权key | |||||
static final String SHARED_KEY_ISAUTH = 'sp_auth'; | |||||
/// 用户json | /// 用户json | ||||
static final String SHARED_KEY_USER_INFO = 'sp_userinfo'; | static final String SHARED_KEY_USER_INFO = 'sp_userinfo'; | ||||
/// 货币类型 | /// 货币类型 | ||||
static final String MONEY_TYPE = "¥ "; | static final String MONEY_TYPE = "¥ "; | ||||
/// 天猫 淘宝类型 | /// 天猫 淘宝类型 | ||||
@@ -129,14 +129,17 @@ class _LogWidgetState extends State<LogWidget> { | |||||
"${item.tabName} ${item.message} (${item.start.hour}:${item.start.minute}:${item.start.second}:${item.start.millisecond})", | "${item.tabName} ${item.message} (${item.start.hour}:${item.start.minute}:${item.start.second}:${item.start.millisecond})", | ||||
style: TextStyle(fontSize: 16, color: color), | style: TextStyle(fontSize: 16, color: color), | ||||
), | ), | ||||
if (item.detail != null) | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
item.detail, | |||||
style: TextStyle(fontSize: 14, color: color), | |||||
overflow: TextOverflow.ellipsis, | |||||
maxLines: 20, | |||||
// if (item.detail != null) | |||||
Visibility( | |||||
visible: item.detail != null, | |||||
child: Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
item.detail, | |||||
style: TextStyle(fontSize: 14, color: color), | |||||
overflow: TextOverflow.ellipsis, | |||||
maxLines: 20, | |||||
), | |||||
), | ), | ||||
) | ) | ||||
], | ], | ||||
@@ -127,34 +127,43 @@ class _NetWidgetState extends State<NetWidget> { | |||||
"[${item.type}] ${item.api}", | "[${item.type}] ${item.api}", | ||||
style: const TextStyle(fontSize: 16), | style: const TextStyle(fontSize: 16), | ||||
), | ), | ||||
if (item.showDetail) | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Request: ${item.req ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
// if (item.showDetail) | |||||
Visibility( | |||||
visible: item.showDetail, | |||||
child: Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Request: ${item.req ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
), | |||||
), | ), | ||||
), | ), | ||||
if (item.showDetail) | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Response: ${item.res ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
// if (item.showDetail) | |||||
Visibility( | |||||
visible: item.showDetail, | |||||
child: Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Response: ${item.res ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
), | |||||
), | ), | ||||
), | ), | ||||
if (item.showDetail && item.headers != null) | |||||
Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Headers: ${item.headers ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
// if (item.showDetail && item.headers != null) | |||||
Visibility( | |||||
visible: (item.showDetail && item.headers != null), | |||||
child: Padding( | |||||
padding: const EdgeInsets.only(top: 8), | |||||
child: Text( | |||||
"Headers: ${item.headers ?? ""}", | |||||
maxLines: 100, | |||||
overflow: TextOverflow.ellipsis, | |||||
style: const TextStyle(fontSize: 14), | |||||
), | |||||
), | ), | ||||
), | ), | ||||
Padding( | Padding( | ||||
@@ -217,10 +226,13 @@ class _NetWidgetState extends State<NetWidget> { | |||||
item.status.toString(), | item.status.toString(), | ||||
style: TextStyle(fontSize: 20, color: color), | style: TextStyle(fontSize: 20, color: color), | ||||
), | ), | ||||
if (item.showDetail) | |||||
const Text( | |||||
"copy", | |||||
style: TextStyle(fontSize: 16, color: Colors.blue), | |||||
// if (item.showDetail) | |||||
Visibility( | |||||
visible: item.showDetail, | |||||
child: const Text( | |||||
"copy", | |||||
style: TextStyle(fontSize: 16, color: Colors.blue), | |||||
), | |||||
), | ), | ||||
], | ], | ||||
), | ), | ||||
@@ -47,7 +47,7 @@ class NetUtil { | |||||
if (_dio == null) { | if (_dio == null) { | ||||
var setting = await NativeUtil.getSetting(); | var setting = await NativeUtil.getSetting(); | ||||
String domain = setting['domain']; //'http://www.hairuyi.com/'; | String domain = setting['domain']; //'http://www.hairuyi.com/'; | ||||
_config(domain, proxyUrl: '192.168.0.112:8888'); | |||||
_config(domain, proxyUrl: '192.168.0.66:8866'); | |||||
} | } | ||||
return _dio; | return _dio; | ||||
} | } | ||||
@@ -108,8 +108,9 @@ class NetUtil { | |||||
Dio dio = await NetUtil.getInstance().dio; | Dio dio = await NetUtil.getInstance().dio; | ||||
response = await dio.request(path, | response = await dio.request(path, | ||||
data: sign, | data: sign, | ||||
options: | |||||
Options(method: enumToString(method), headers: {'token': token})); | |||||
options: Options(method: enumToString(method), headers: {'token': token, 'app_version': sign['app_version']}), | |||||
// options: Options(method: enumToString(method), headers: sign), | |||||
); | |||||
} on DioError catch (e) { | } on DioError catch (e) { | ||||
_formatError(e); | _formatError(e); | ||||
} | } | ||||
@@ -222,7 +223,8 @@ class NetUtil { | |||||
params['device_id'] = androidInfo?.androidId; | params['device_id'] = androidInfo?.androidId; | ||||
} | } | ||||
// 应用版本号 | // 应用版本号 | ||||
params["app_version"] = packageInfo.version; | |||||
params["app_version_name"] = packageInfo.version; | |||||
params["app_version"] = packageInfo.buildNumber; | |||||
// 分辨率 | // 分辨率 | ||||
params["solution"] = | params["solution"] = | ||||
"${window.physicalSize.width.floor()}*${window.physicalSize.height.floor()}"; | "${window.physicalSize.width.floor()}*${window.physicalSize.height.floor()}"; | ||||
@@ -7,6 +7,7 @@ import 'package:fluttertoast/fluttertoast.dart'; | |||||
import 'package:zhiying_comm/models/profile/profile_model.dart'; | import 'package:zhiying_comm/models/profile/profile_model.dart'; | ||||
import 'package:zhiying_comm/util/taobao/taobao_auth_alert.dart'; | import 'package:zhiying_comm/util/taobao/taobao_auth_alert.dart'; | ||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:provider/provider.dart'; | |||||
class TaobaoAuth { | class TaobaoAuth { | ||||
static ProfileModel _profile; | static ProfileModel _profile; | ||||
@@ -33,25 +34,30 @@ class TaobaoAuth { | |||||
} | } | ||||
String url = data['data']['redirect_url']; | String url = data['data']['redirect_url']; | ||||
print("授权链接" + url); | print("授权链接" + url); | ||||
TradeResult result; | |||||
if (Platform.isAndroid) { | if (Platform.isAndroid) { | ||||
TradeResult result = await FlutterAlibc.openByUrl( | |||||
result = await FlutterAlibc.openByUrl( | |||||
url: url, backUrl: "alisdk://", isAuth: true); | url: url, backUrl: "alisdk://", isAuth: true); | ||||
// TradeResult result = await FlutterAlibc.openByUrl(url: ''); | // TradeResult result = await FlutterAlibc.openByUrl(url: ''); | ||||
Logger.debug('${result.errorCode} ${result.errorMessage} '); | Logger.debug('${result.errorCode} ${result.errorMessage} '); | ||||
} else if (Platform.isIOS) { | } else if (Platform.isIOS) { | ||||
TradeResult result = await FlutterAlibc.openByUrl(url: url); | |||||
result = await FlutterAlibc.openByUrl(url: url); | |||||
// TradeResult result = await FlutterAlibc.openByUrl(url: ''); | // TradeResult result = await FlutterAlibc.openByUrl(url: ''); | ||||
Logger.debug('${result.errorCode} ${result.errorMessage} '); | Logger.debug('${result.errorCode} ${result.errorMessage} '); | ||||
} | } | ||||
if(null !=result && result.errorCode == '0'){ | |||||
Provider.of<UserInfoNotifier>(context).updateUserAuth(true); | |||||
} | |||||
} | } | ||||
} | } | ||||
// 返回是否授权 | // 返回是否授权 | ||||
static Future<bool> isAuth() async { | static Future<bool> isAuth() async { | ||||
if (_profile != null) { | |||||
return _profile.isAuth; | |||||
} | |||||
// if (_profile != null) { | |||||
// return _profile.isAuth; | |||||
// } | |||||
Map<String, dynamic> data = Map<String, dynamic>.from( | Map<String, dynamic> data = Map<String, dynamic>.from( | ||||
await NetUtil.post('/api/v1/user/profile', method: NetMethod.GET)); | await NetUtil.post('/api/v1/user/profile', method: NetMethod.GET)); | ||||
if (data['code'] == 1) { | if (data['code'] == 1) { | ||||
@@ -0,0 +1,45 @@ | |||||
class AppUpdateModel { | |||||
String appDownloadThirdpartyUrl; | |||||
String appDownloadUrl; | |||||
String appVersion; | |||||
String appVersionName; | |||||
String dialog; | |||||
String isForce; | |||||
String isThirdparty; | |||||
String tip; | |||||
AppUpdateModel({ | |||||
this.appDownloadThirdpartyUrl, | |||||
this.appDownloadUrl, | |||||
this.appVersion, | |||||
this.appVersionName, | |||||
this.dialog, | |||||
this.isForce, | |||||
this.isThirdparty, | |||||
this.tip, | |||||
}); | |||||
AppUpdateModel.fromJson(Map<String, dynamic> json) { | |||||
appDownloadThirdpartyUrl = json['app_download_thirdparty_url']; | |||||
appDownloadUrl = json['app_download_url']; | |||||
appVersion = json['app_version']; | |||||
appVersionName = json['app_version_name']; | |||||
dialog = json['dialog']; | |||||
isForce = json['is_force']; | |||||
isThirdparty = json['is_thirdparty']; | |||||
tip = json['tip']; | |||||
} | |||||
Map<String, dynamic> toJson() { | |||||
final Map<String, dynamic> data = new Map<String, dynamic>(); | |||||
data['app_download_thirdparty_url'] = this.appDownloadThirdpartyUrl; | |||||
data['app_download_url'] = this.appDownloadUrl; | |||||
data['app_version'] = this.appVersion; | |||||
data['app_version_name'] = this.appVersionName; | |||||
data['dialog'] = this.dialog; | |||||
data['is_force'] = this.isForce; | |||||
data['is_thirdparty'] = this.isThirdparty; | |||||
data['tip'] = this.tip; | |||||
return data; | |||||
} | |||||
} |
@@ -0,0 +1,150 @@ | |||||
import 'dart:io'; | |||||
import 'package:flutter/cupertino.dart'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:flutter_update_dialog/flutter_update_dialog.dart'; | |||||
// import 'package:flutter_xupdate/flutter_xupdate.dart'; | |||||
import 'package:package_info/package_info.dart'; | |||||
import 'package:zhiying_comm/util/update/app_update_model.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
import 'package:fluttertoast/fluttertoast.dart'; | |||||
import '../log/let_log.dart'; | |||||
/// | |||||
/// App更新工具类 | |||||
/// | |||||
class AppUpdateUtil { | |||||
/// | |||||
/// 初始化更新插件 | |||||
/// | |||||
static void initXUpdate() { | |||||
if (Platform.isAndroid) { | |||||
// FlutterXUpdate.init( | |||||
// | |||||
// ///是否输出日志 | |||||
// debug: true, | |||||
// | |||||
// ///是否使用post请求 | |||||
// isPost: false, | |||||
// | |||||
// ///post请求是否是上传json | |||||
// isPostJson: false, | |||||
// | |||||
// ///是否开启自动模式 | |||||
// isWifiOnly: false, | |||||
// | |||||
// ///是否开启自动模式 | |||||
// isAutoMode: false, | |||||
// | |||||
// ///需要设置的公共参数 | |||||
// supportSilentInstall: false, | |||||
// | |||||
// ///在下载过程中,如果点击了取消的话,是否弹出切换下载方式的重试提示弹窗 | |||||
// enableRetry: false) | |||||
// .then((value) { | |||||
// // updateMessage("初始化成功: $value"); | |||||
// Logger.log('初始化成功: $value'); | |||||
// }).catchError((error) { | |||||
// print(error); | |||||
// }); | |||||
// FlutterXUpdate.setErrorHandler(onUpdateError: (Map<String, dynamic> message) async { | |||||
// Logger.warn(message); | |||||
// // setState(() { | |||||
// // _message = "$message"; | |||||
// // }); | |||||
// }); | |||||
} else { | |||||
// updateMessage("ios暂不支持XUpdate更新"); | |||||
Logger.log('ios暂不支持XUpdate更新'); | |||||
} | |||||
} | |||||
/// | |||||
/// 检查并且更新app | |||||
/// | |||||
static void updateApp(BuildContext context) async { | |||||
PackageInfo packageInfo = await PackageInfo.fromPlatform(); | |||||
Logger.log('version = ${packageInfo.version}, buildNum = ${packageInfo.buildNumber}'); | |||||
var result = await NetUtil.post('/api/v1/appcheck', params: {'app_version': packageInfo.buildNumber}, method: NetMethod.GET); | |||||
customStyle(context, onUpdate: (){ | |||||
Navigator.pop(context); | |||||
}); | |||||
// UpdateEntity updateEntity = await _checkAppUpdate(); | |||||
// // 有新版本,进行更新 | |||||
// if (!EmptyUtil.isEmpty(updateEntity) && updateEntity.hasUpdate) { | |||||
// if (Platform.isAndroid) { | |||||
// FlutterXUpdate.updateByInfo( | |||||
// updateEntity: updateEntity, | |||||
// supportBackgroundUpdate: true, | |||||
// ); | |||||
// } else if (Platform.isIOS) { | |||||
// // TODO 完成IOS更新 | |||||
// String updateUrl = updateEntity.downloadUrl; | |||||
// customStyle(context, onUpdate: (){ | |||||
// | |||||
// | |||||
// | |||||
// Navigator.pop(context); | |||||
// }); | |||||
// } | |||||
// } else { | |||||
// Fluttertoast.showToast(msg: '已经是最新版本了~'); | |||||
// } | |||||
} | |||||
/// 检查是否有新版本 | |||||
// static Future<UpdateEntity> _checkAppUpdate() async { | |||||
// try { | |||||
// PackageInfo packageInfo = await PackageInfo.fromPlatform(); | |||||
// // var result = await NetUtil.post('/api/v1/appcheck', params: {'app_version': packageInfo.version}, method: NetMethod.GET); | |||||
// | |||||
// var result = { | |||||
// 'dialog': '1', | |||||
// 'is_force': '0', | |||||
// 'app_version': '5', | |||||
// 'app_version_name': '5.0.0', | |||||
// 'tip': '\n1、优化api接口。\n2、添加使用demo演示。\n3、新增自定义更新服务API接口。\n4、优化更新提示界面。', | |||||
// 'app_download_url': 'http://imtt.dd.qq.com/16891/apk/FAD58DEFE56A938D86B123DEA4E298EB.apk?fsname=com.hairuyi.www_5.8.8_469.apk&hsr=4d5s', | |||||
// }; | |||||
// AppUpdateModel model = AppUpdateModel.fromJson(result); | |||||
// if (!EmptyUtil.isEmpty(model)) { | |||||
// // ⚠️ isIgnorable 目前只有两种状态,为强制更新和不强制更新(每次进来都会提示更新UI弹窗) | |||||
// return UpdateEntity( | |||||
// hasUpdate: model?.dialog == '1', | |||||
// isIgnorable: false, | |||||
// isForce: model?.isForce == '1', | |||||
// versionCode: int.parse(model?.appVersion ?? '1'), | |||||
// versionName: model?.appVersionName, | |||||
// downloadUrl: model?.appDownLoadUrl, | |||||
// updateContent: model?.tip, | |||||
// ); | |||||
// } | |||||
// } catch (e, s) { | |||||
// Logger.error(e, s); | |||||
// } | |||||
// return null; | |||||
// } | |||||
static void customStyle(BuildContext context, {@required VoidCallback onUpdate }) { | |||||
UpdateDialog.showUpdate(context, | |||||
width: 250, | |||||
title: "是否升级到4.1.4版本?", | |||||
updateContent: "新版本大小:2.0M\n1.xxxxxxx\n2.xxxxxxx\n3.xxxxxxx", | |||||
titleTextSize: 14, | |||||
contentTextSize: 12, | |||||
buttonTextSize: 12, | |||||
// topImage: Image.asset('assets/bg_update_top.png'), | |||||
extraHeight: 5, | |||||
radius: 8, | |||||
themeColor: Colors.redAccent, | |||||
progressBackgroundColor: Color(0x5AFFAC5D), | |||||
isForce: false, | |||||
updateButtonText: '升级', | |||||
ignoreButtonText: '忽略此版本', | |||||
enableIgnore: true, onIgnore: () { | |||||
Navigator.pop(context); | |||||
}, onUpdate: onUpdate); | |||||
} | |||||
} |
@@ -32,9 +32,13 @@ dependencies: | |||||
webview_flutter: ^0.3.22+1 | webview_flutter: ^0.3.22+1 | ||||
# 京东sdk | # 京东sdk | ||||
jdsdk: ^0.0.1 | jdsdk: ^0.0.1 | ||||
# Android app更新 | |||||
# flutter_xupdate: ^1.0.0 | |||||
# app更新dialogUI(用于IOS,以便统一样式) | |||||
flutter_update_dialog: 1.0.0 | |||||
flutter_alibc: | flutter_alibc: | ||||
git: | git: | ||||
ref: 0.0.1 | |||||
ref: 0.0.3 | |||||
url: http://192.168.0.138:3000/FnuoOS_ZhiYing/zhiying_flutter_alibc.git | url: http://192.168.0.138:3000/FnuoOS_ZhiYing/zhiying_flutter_alibc.git | ||||
url_launcher: ^5.6.0 | url_launcher: ^5.6.0 | ||||