Browse Source

IM初始化

ios
Jolie 4 months ago
parent
commit
34bd2b91ca
12 changed files with 274 additions and 44 deletions
  1. 1
      lib/controller/mine/user_controller.dart
  2. 18
      lib/controller/mine/user_info_controller.dart
  3. 57
      lib/im/im_manager.dart
  4. 2
      lib/main.dart
  5. 64
      lib/model/common/oss_data.dart
  6. 1
      lib/network/api_urls.dart
  7. 4
      lib/network/user_api.dart
  8. 31
      lib/network/user_api.g.dart
  9. 86
      lib/oss/oss_manager.dart
  10. 5
      lib/pages/main/main_page.dart
  11. 48
      pubspec.lock
  12. 1
      pubspec.yaml

1
lib/controller/mine/user_controller.dart

@ -1,4 +1,5 @@
import 'package:dating_touchme_app/im/im_manager.dart';
import 'package:dating_touchme_app/oss/oss_manager.dart';
import 'package:get/get.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import '../../network/user_api.dart';

18
lib/controller/mine/user_info_controller.dart

@ -1,4 +1,6 @@
import 'dart:io';
import 'package:dating_touchme_app/oss/oss_manager.dart';
import 'package:flustars/flustars.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@ -107,18 +109,10 @@ class UserInfoController extends GetxController {
try {
//
SmartDialog.showLoading(msg: '正在处理头像...');
// URL
// 使URL
avatarUrl.value = imageFile.path;
//
final currentUserInfo = storage.read('userInfo') ?? {};
if (currentUserInfo is Map<String, dynamic>) {
currentUserInfo['avatarUrl'] = imageFile.path;
await storage.write('userInfo', currentUserInfo);
}
String objectName = '${DateUtil.getNowDateMs()}.${imageFile.path.split('.').last}';
String imageUrl = await OSSManager.instance.uploadFile(imageFile.readAsBytesSync(), objectName);
print('上传成功,图片URL: $imageUrl');
avatarUrl.value = imageUrl;
SmartDialog.dismiss();
SmartDialog.showToast('头像设置成功');
} catch (e) {

57
lib/im/im_manager.dart

@ -64,6 +64,63 @@ class IMManager {
print('User kicked out of IM server');
},
));
EMClient.getInstance.chatManager.addEventHandler(
// EMChatEventHandler key
"",
EMChatEventHandler(
onMessagesReceived: (messages) {
for (var msg in messages) {
switch (msg.body.type) {
case MessageType.TXT:
{
}
break;
case MessageType.IMAGE:
{
}
break;
case MessageType.VIDEO:
{
}
break;
case MessageType.LOCATION:
{
}
break;
case MessageType.VOICE:
{
}
break;
case MessageType.FILE:
{
}
break;
case MessageType.CUSTOM:
{
}
break;
case MessageType.COMBINE:
{
}
break;
case MessageType.CMD:
{
// CMD CMD `EMChatEventHandler#onCmdMessagesReceived`
}
break;
}
}
},
),
);
} catch (e) {
print('Failed to register listeners: $e');
}

2
lib/main.dart

@ -21,7 +21,7 @@ void main() async {
// - release模式
EnvConfig.setEnvironment(Environment.dev);
IMManager.instance.initialize('1165251016193374#dongwo');
IMManager.instance.initialize('1165251016193374#demo');
//
final networkService = NetworkService();
Get.put(networkService);

64
lib/model/common/oss_data.dart

@ -0,0 +1,64 @@
import 'dart:convert';
/// OSS配置数据实体类
class OssData {
final String accessKey;
final String accessKeySecret;
final String token;
final int expiredTime;
final String regionId;
final String bucketName;
final String endpoint;
OssData({
required this.accessKey,
required this.accessKeySecret,
required this.token,
required this.expiredTime,
required this.regionId,
required this.bucketName,
required this.endpoint,
});
/// JSON字符串创建OssData实例
factory OssData.fromJsonString(String jsonString) {
Map<String, dynamic> json = jsonDecode(jsonString);
return OssData.fromJson(json);
}
/// JSON映射创建OssData实例
factory OssData.fromJson(Map<String, dynamic> json) {
return OssData(
accessKey: json['accessKey'] as String,
accessKeySecret: json['accessKeySecret'] as String,
token: json['token'] as String,
expiredTime: json['expiredTime'] as int,
regionId: json['regionId'] as String,
bucketName: json['bucketName'] as String,
endpoint: json['endpoint'] as String,
);
}
/// JSON映射
Map<String, dynamic> toJson() {
return {
'accessKey': accessKey,
'accessKeySecret': accessKeySecret,
'token': token,
'expiredTime': expiredTime,
'regionId': regionId,
'bucketName': bucketName,
'endpoint': endpoint,
};
}
/// JSON字符串
String toJsonString() {
return jsonEncode(toJson());
}
@override
String toString() {
return 'OssData{accessKey: $accessKey, accessKeySecret: $accessKeySecret, token: $token, expiredTime: $expiredTime, regionId: $regionId, bucketName: $bucketName, endpoint: $endpoint}';
}
}

1
lib/network/api_urls.dart

@ -10,6 +10,7 @@ class ApiUrls {
static const String getMarriageInformationDetail = 'dating-agency-service/user/get/dongwo/marriage-information-detail';
static const String registerMarriageInformation = 'dating-agency-service/user/register/marriage-information';
static const String getHxUserToken = 'dating-agency-chat-audio/user/get/hx/user/token';
static const String getApplyTempAuth = 'dating-agency-uec/get/apply-temp-auth';
// API端点
}

4
lib/network/user_api.dart

@ -1,3 +1,4 @@
import 'package:dating_touchme_app/model/common/oss_data.dart';
import 'package:dating_touchme_app/model/mine/login_data.dart';
import 'package:dating_touchme_app/model/mine/user_base_data.dart';
import 'package:dating_touchme_app/model/mine/user_data.dart';
@ -37,4 +38,7 @@ abstract class UserApi {
@GET(ApiUrls.getHxUserToken)
Future<HttpResponse<BaseResponse<String>>> getHxUserToken();
@GET(ApiUrls.getApplyTempAuth)
Future<HttpResponse<BaseResponse<OssData>>> getApplyTempAuth();
}

31
lib/network/user_api.g.dart

@ -217,6 +217,37 @@ class _UserApi implements UserApi {
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<OssData>>> getApplyTempAuth() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<OssData>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-uec/get/apply-temp-auth',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<OssData> _value;
try {
_value = BaseResponse<OssData>.fromJson(
_result.data!,
(json) => OssData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||

86
lib/oss/oss_manager.dart

@ -1,8 +1,15 @@
import 'dart:typed_data';
import 'package:flustars/flustars.dart';
import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart';
import 'package:dating_touchme_app/network/network_service.dart';
import 'package:dating_touchme_app/model/common/oss_data.dart';
import 'package:get/get.dart';
import '../network/user_api.dart';
class OSSManager {
static OSSManager get instance => _instance;
//
static final OSSManager _instance = OSSManager._internal();
bool isInit = false;
@ -13,34 +20,59 @@ class OSSManager {
//
OSSManager._internal();
late UserApi _userApi;
void init(String stsUrl, String ossEndpoint, String bucketName) {
//
Client.init(
stsUrl: stsUrl,
ossEndpoint: ossEndpoint,
bucketName: bucketName,
);
isInit = true;
}
Future<String> uploadFile(
Uint8List fileData,
String objectName, {
Function(int count, int total)? onSendProgress,
Function(int count, int total)? onReceiveProgress,
}) async {
try {
_userApi = Get.find<UserApi>();
final response = await _userApi.getApplyTempAuth();
// getApplyTempAuth获取OSS临时授权
if (response.data.isSuccess) {
Client.init(
ossEndpoint: response.data.data?.endpoint ?? '',
bucketName: response.data.data?.bucketName ?? '',
authGetter: (){
return Auth(
accessKey: response.data.data?.accessKey ?? '',
accessSecret: response.data.data?.accessKeySecret ?? '',
secureToken: response.data.data?.token ?? '',
expire: DateUtil.formatDateMs(response.data.data?.expiredTime ?? 0)
);
}
);
final result = await Client().putObject(
fileData,
objectName,
option: PutRequestOption(
onSendProgress: onSendProgress != null
? (count, total) {
onSendProgress(count, total);
}
: null,
onReceiveProgress: onReceiveProgress != null
? (count, total) {
onReceiveProgress(count, total);
}
: null,
override: false,
aclModel: AclMode.publicRead,
storageType: StorageType.ia,
),
);
Future<String> uploadFile(Uint8List fileData, String objectName, {Function(int count, int total)? onSendProgress,
Function(int count, int total)? onReceiveProgress}) async {
if (!isInit) {
throw Exception("请先初始化");
return result.statusCode == 200
? 'https://${response.data.data?.bucketName}.${response.data.data?.endpoint}/$objectName'
: throw Exception("上传失败");
}
return throw Exception("获取临时授权失败");
}catch(e){
print('上传失败$e');
return throw Exception("上传失败");
}
final result = await Client().putObject(fileData, objectName, option: PutRequestOption(
onSendProgress: onSendProgress != null ? (count, total) {
onSendProgress(count, total);
} : null,
onReceiveProgress: onReceiveProgress != null ? (count, total) {
onReceiveProgress(count, total);
} : null,
override: false,
aclModel: AclMode.publicRead,
storageType: StorageType.ia,
),
);
return result.statusCode == 200 ? result.realUri.path : throw Exception("上传失败");
}
}
}

5
lib/pages/main/main_page.dart

@ -21,7 +21,6 @@ class MainPage extends StatefulWidget {
}
class _MainPageState extends State<MainPage> {
late UserApi _userApi;
final storage = GetStorage();
PageController pageController = PageController(initialPage: 0);
int currentIndex = 0; // 使int替代RxInt
@ -35,9 +34,7 @@ class _MainPageState extends State<MainPage> {
@override
void initState() {
super.initState();
// UserApi实例
_userApi = Get.find<UserApi>();
//
homePage = HomePage();
discoverPage = DiscoverPage();

48
pubspec.lock

@ -145,6 +145,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.19.1"
common_utils:
dependency: transitive
description:
name: common_utils
sha256: c26884339b13ff99b0739e56f4b02090c84054ed9dd3a045435cd24e7b99c2c1
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
convert:
dependency: transitive
description:
@ -193,6 +201,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.2"
decimal:
dependency: transitive
description:
name: decimal
sha256: fc706a5618b81e5b367b01dd62621def37abc096f2b46a9bd9068b64c1fa36d0
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.4"
dio:
dependency: "direct main"
description:
@ -297,6 +313,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.1"
flustars:
dependency: "direct main"
description:
name: flustars
sha256: "7019ab8d68c0d4759ee122644d91a165d450b0492717f9e7e9d0ce277dcf664b"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.1"
flutter:
dependency: "direct main"
description: flutter
@ -837,6 +861,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.0"
rational:
dependency: transitive
description:
name: rational
sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.3"
retrofit:
dependency: "direct main"
description:
@ -954,6 +986,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.1"
sp_util:
dependency: transitive
description:
name: sp_util
sha256: "9da43dce5de79c17a787d0626bf01538d63090ca32521200d22a232171c495dc"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.3"
stack_trace:
dependency: transitive
description:
@ -986,6 +1026,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
term_glyph:
dependency: transitive
description:

1
pubspec.yaml

@ -51,6 +51,7 @@ dependencies:
easy_localization: ^3.0.8
flutter_oss_aliyun: ^6.4.2
permission_handler: ^12.0.1
flustars: ^2.0.1
dev_dependencies:
flutter_test:

Loading…
Cancel
Save