Browse Source

增加oss封装

ios
Jolie 4 months ago
parent
commit
306ff1d952
14 changed files with 233 additions and 117 deletions
  1. 9
      lib/config/env_config.dart
  2. 75
      lib/controller/mine/login_controller.dart
  3. 89
      lib/controller/mine/user_controller.dart
  4. 43
      lib/controller/mine/user_info_controller.dart
  5. 1
      lib/network/api_urls.dart
  6. 15
      lib/network/network_config.dart
  7. 15
      lib/network/network_service.dart
  8. 3
      lib/network/user_api.dart
  9. 31
      lib/network/user_api.g.dart
  10. 46
      lib/oss/oss_manager.dart
  11. 18
      lib/pages/main/main_page.dart
  12. 2
      lib/pages/mine/login_page.dart
  13. 1
      lib/pages/mine/mine_page.dart
  14. 2
      lib/pages/mine/user_info_page.dart

9
lib/config/env_config.dart

@ -9,13 +9,11 @@ class EnvConfig {
// //
static const Map<String, String> _devConfig = { static const Map<String, String> _devConfig = {
'mainBaseUrl': 'https://dating-agency-api-test.qniao.cn/', 'mainBaseUrl': 'https://dating-agency-api-test.qniao.cn/',
'fileBaseUrl': 'https://dating-agency-api-test.qniao.cn/',
}; };
// //
static const Map<String, String> _releaseConfig = { static const Map<String, String> _releaseConfig = {
'mainBaseUrl': 'https://dating-agency-api.quzhaoqin.com/', 'mainBaseUrl': 'https://dating-agency-api.quzhaoqin.com/',
'fileBaseUrl': 'https://dating-agency-api-test.qniao.cn/',
}; };
/// ///
@ -33,12 +31,7 @@ class EnvConfig {
: _releaseConfig['mainBaseUrl']!; : _releaseConfig['mainBaseUrl']!;
} }
/// API的baseUrl
static String get fileBaseUrl {
return current == Environment.dev
? _devConfig['fileBaseUrl']!
: _releaseConfig['fileBaseUrl']!;
}
/// ///
static void setEnvironment(Environment env) { static void setEnvironment(Environment env) {

lib/pages/mine/login_controller.dart → lib/controller/mine/login_controller.dart

@ -1,11 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:dating_touchme_app/pages/main/main_page.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:dating_touchme_app/network/user_api.dart';
import 'package:dating_touchme_app/pages/mine/user_info_page.dart';
import '../../network/user_api.dart';
import 'user_controller.dart';
class LoginController extends GetxController { class LoginController extends GetxController {
// //
@ -82,7 +80,6 @@ class LoginController extends GetxController {
// - 使SmartDialog // - 使SmartDialog
// void clearErrorMessage() {} // void clearErrorMessage() {}
// //
Future<void> login() async { Future<void> login() async {
// //
@ -111,18 +108,18 @@ class LoginController extends GetxController {
// //
if (response.data.isSuccess) { if (response.data.isSuccess) {
// token和用户信息
if (response.data.data != null) {
final loginData = response.data.data!;
await storage.write('token', loginData.token);
await storage.write('userId', loginData.userId);
//
await storage.write('userInfo', loginData.toJson());
//
await _getBaseUserInfo(loginData.userId);
}
} else {
// token和用户信息
if (response.data.data != null) {
final loginData = response.data.data!;
await storage.write('token', loginData.token);
await storage.write('userId', loginData.userId);
//
await storage.write('userInfo', loginData.toJson());
//
await _handleUserInfoRetrieval(loginData.userId);
}
} else {
SmartDialog.showToast(response.data.message); SmartDialog.showToast(response.data.message);
} }
} catch (e) { } catch (e) {
@ -131,44 +128,16 @@ class LoginController extends GetxController {
isLoggingIn.value = false; isLoggingIn.value = false;
} }
} }
//
Future<void> _getBaseUserInfo(String userId) async {
// 使UserController中的方法获取用户信
Future<void> _handleUserInfoRetrieval(String userId) async {
try { try {
final response = await _userApi.getBaseUserInfo(userId);
if (response.data.isSuccess && response.data.data != null) {
//
await _getMarriageInformationDetail();
} else {
SmartDialog.showToast(response.data.message);
}
// 使UserController获取基础信息和婚姻信息
final userController = Get.find<UserController>();
await userController.getBaseUserInfo(userId);
} catch (e) { } catch (e) {
// //
SmartDialog.showToast('获取用户信息失败');
}
}
//
Future<void> _getMarriageInformationDetail() async {
try {
final response = await _userApi.getMarriageInformationDetail();
if (response.data.isSuccess) {
// data是否为null或者是空对象
if(response.data.data == null){
//
SmartDialog.showToast('转到完善信息');
//
Get.offAll(() => UserInfoPage());
}else{
Get.offAll(MainPage());
}
} else {
//
}
} catch (e) {
//
print('获取婚姻信息异常: $e');
print('获取用户信息异常: $e');
} }
} }
}
}

89
lib/controller/mine/user_controller.dart

@ -0,0 +1,89 @@
import 'package:get/get.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import '../../network/user_api.dart';
import '../../pages/mine/user_info_page.dart';
import '../../pages/main/main_page.dart';
class UserController extends GetxController {
// UserApi实例
late UserApi _userApi;
@override
void onInit() {
super.onInit();
// UserApi
_userApi = Get.find<UserApi>();
}
/// token
Future<String?> getHxUserToken() async {
try {
// token接口
final response = await _userApi.getHxUserToken();
//
if (response.data.isSuccess) {
// token到本地存储
String? token = response.data.data;
if (token != null) {
// token
print('获取环信用户token成功: $token');
return token;
} else {
SmartDialog.showToast('获取的环信用户token为空');
return null;
}
} else {
SmartDialog.showToast(response.data.message);
return null;
}
} catch (e) {
print('获取环信用户token失败: $e');
SmartDialog.showToast('获取环信用户token失败,请重试');
return null;
}
}
///
Future<void> getBaseUserInfo(String userId) async {
try {
final response = await _userApi.getBaseUserInfo(userId);
if (response.data.isSuccess && response.data.data != null) {
//
await getMarriageInformationDetail();
} else {
SmartDialog.showToast(response.data.message);
}
} catch (e) {
//
SmartDialog.showToast('获取用户信息失败');
}
}
///
Future<void> getMarriageInformationDetail() async {
try {
final response = await _userApi.getMarriageInformationDetail();
if (response.data.isSuccess) {
// data是否为null或者是空对象
if (response.data.data == null) {
//
SmartDialog.showToast('转到完善信息');
//
Get.offAll(() => UserInfoPage());
} else {
Get.offAll(MainPage());
}
} else {
//
}
} catch (e) {
//
print('获取婚姻信息异常: $e');
}
}
}

lib/pages/mine/user_info_controller.dart → lib/controller/mine/user_info_controller.dart

@ -3,8 +3,8 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:dating_touchme_app/network/user_api.dart';
import 'package:dating_touchme_app/pages/main/main_page.dart';
import '../../network/user_api.dart';
import '../../pages/main/main_page.dart';
class UserInfoController extends GetxController { class UserInfoController extends GetxController {
// //
@ -14,13 +14,13 @@ class UserInfoController extends GetxController {
final education = ''.obs; final education = ''.obs;
final invitationCode = ''.obs; final invitationCode = ''.obs;
final avatarUrl = ''.obs; final avatarUrl = ''.obs;
// //
final isSubmitting = false.obs; final isSubmitting = false.obs;
// GetStorage实例 // GetStorage实例
final storage = GetStorage(); final storage = GetStorage();
// UserApi实例 // UserApi实例
late UserApi _userApi; late UserApi _userApi;
@ -49,8 +49,6 @@ class UserInfoController extends GetxController {
print('选择的学历: $selectedEducation'); print('选择的学历: $selectedEducation');
// //
SmartDialog.showToast('学历已选择'); SmartDialog.showToast('学历已选择');
} }
// - // -
@ -59,7 +57,7 @@ class UserInfoController extends GetxController {
// //
final ImagePicker picker = ImagePicker(); final ImagePicker picker = ImagePicker();
final XFile? photo = await picker.pickImage(source: ImageSource.camera); final XFile? photo = await picker.pickImage(source: ImageSource.camera);
if (photo != null) { if (photo != null) {
await processSelectedImage(File(photo.path)); await processSelectedImage(File(photo.path));
} }
@ -68,7 +66,8 @@ class UserInfoController extends GetxController {
// //
if (e.toString().contains('permission') || e.toString().contains('权限')) { if (e.toString().contains('permission') || e.toString().contains('权限')) {
SmartDialog.showToast('相机权限被拒绝,请在设置中允许访问相机'); SmartDialog.showToast('相机权限被拒绝,请在设置中允许访问相机');
} else if (e.toString().contains('camera') || e.toString().contains('相机')) {
} else if (e.toString().contains('camera') ||
e.toString().contains('相机')) {
SmartDialog.showToast('设备没有可用的相机'); SmartDialog.showToast('设备没有可用的相机');
} else { } else {
SmartDialog.showToast('拍照失败,请重试'); SmartDialog.showToast('拍照失败,请重试');
@ -81,7 +80,7 @@ class UserInfoController extends GetxController {
// //
final ImagePicker picker = ImagePicker(); final ImagePicker picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.gallery); final XFile? image = await picker.pickImage(source: ImageSource.gallery);
if (image != null) { if (image != null) {
await processSelectedImage(File(image.path)); await processSelectedImage(File(image.path));
} }
@ -108,18 +107,18 @@ class UserInfoController extends GetxController {
try { try {
// //
SmartDialog.showLoading(msg: '正在处理头像...'); SmartDialog.showLoading(msg: '正在处理头像...');
// URL // URL
// 使URL // 使URL
avatarUrl.value = imageFile.path; avatarUrl.value = imageFile.path;
// //
final currentUserInfo = storage.read('userInfo') ?? {}; final currentUserInfo = storage.read('userInfo') ?? {};
if (currentUserInfo is Map<String, dynamic>) { if (currentUserInfo is Map<String, dynamic>) {
currentUserInfo['avatarUrl'] = imageFile.path; currentUserInfo['avatarUrl'] = imageFile.path;
await storage.write('userInfo', currentUserInfo); await storage.write('userInfo', currentUserInfo);
} }
SmartDialog.dismiss(); SmartDialog.dismiss();
SmartDialog.showToast('头像设置成功'); SmartDialog.showToast('头像设置成功');
} catch (e) { } catch (e) {
@ -169,15 +168,15 @@ class UserInfoController extends GetxController {
birthYear = int.tryParse(parts[0]) ?? 0; birthYear = int.tryParse(parts[0]) ?? 0;
} }
} }
// //
Map<String, String> educationCodeMap = { Map<String, String> educationCodeMap = {
'大专以下': '0', '大专以下': '0',
'大专': '1', '大专': '1',
'本科': '2', '本科': '2',
'硕士及以上': '3'
'硕士及以上': '3',
}; };
return { return {
'birthYear': birthYear, 'birthYear': birthYear,
'educationCode': educationCodeMap[education.value] ?? '0', 'educationCode': educationCodeMap[education.value] ?? '0',
@ -199,13 +198,13 @@ class UserInfoController extends GetxController {
try { try {
// //
final params = _buildSubmitParams(); final params = _buildSubmitParams();
// //
print('提交用户信息参数: $params'); print('提交用户信息参数: $params');
// //
final response = await _userApi.registerMarriageInformation(params); final response = await _userApi.registerMarriageInformation(params);
// //
if (response.data.isSuccess) { if (response.data.isSuccess) {
// //
@ -219,10 +218,10 @@ class UserInfoController extends GetxController {
}); });
await storage.write('userInfo', currentUserInfo); await storage.write('userInfo', currentUserInfo);
} }
// //
SmartDialog.showToast('信息提交成功!'); SmartDialog.showToast('信息提交成功!');
// //
Future.delayed(const Duration(milliseconds: 1500), () { Future.delayed(const Duration(milliseconds: 1500), () {
// MainPage // MainPage
@ -239,4 +238,4 @@ class UserInfoController extends GetxController {
isSubmitting.value = false; isSubmitting.value = false;
} }
} }
}
}

1
lib/network/api_urls.dart

@ -9,6 +9,7 @@ class ApiUrls {
static const String getBaseUserInfo = 'dating-agency-uec/user/get/base-info'; static const String getBaseUserInfo = 'dating-agency-uec/user/get/base-info';
static const String getMarriageInformationDetail = 'dating-agency-service/user/get/dongwo/marriage-information-detail'; 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 registerMarriageInformation = 'dating-agency-service/user/register/marriage-information';
static const String getHxUserToken = 'dating-agency-chat-audio/user/get/hx/user/token';
// API端点 // API端点
} }

15
lib/network/network_config.dart

@ -9,7 +9,6 @@ import '../pages/mine/login_page.dart';
/// API类型枚举baseUrl /// API类型枚举baseUrl
enum ApiType { enum ApiType {
main, // API main, // API
file, // API
} }
/// ///
@ -17,18 +16,10 @@ class NetworkConfig {
static const int connectTimeout = 30000; static const int connectTimeout = 30000;
static const int receiveTimeout = 30000; static const int receiveTimeout = 30000;
/// API类型创建不同的Dio实例
/// Dio实例
static Dio createDio({ApiType type = ApiType.main}) { static Dio createDio({ApiType type = ApiType.main}) {
// baseUrl
String currentBaseUrl;
switch (type) {
case ApiType.main:
currentBaseUrl = EnvConfig.mainBaseUrl;
break;
case ApiType.file:
currentBaseUrl = EnvConfig.fileBaseUrl;
break;
}
// 使API的baseUrl
String currentBaseUrl = EnvConfig.mainBaseUrl;
final dio = Dio( final dio = Dio(
BaseOptions( BaseOptions(

15
lib/network/network_service.dart

@ -11,7 +11,6 @@ class NetworkService {
// API服务实例 // API服务实例
late final ApiService _apiService; // API服务 late final ApiService _apiService; // API服务
late final ApiService _fileApiService; // API服务
late final UserApi _userApi; late final UserApi _userApi;
/// ///
@ -24,10 +23,6 @@ class NetworkService {
final dio = NetworkConfig.createDio(); final dio = NetworkConfig.createDio();
_apiService = ApiService(dio); _apiService = ApiService(dio);
_userApi = UserApi(dio); _userApi = UserApi(dio);
// API服务
final fileDio = NetworkConfig.createDio(type: ApiType.file);
_fileApiService = ApiService(fileDio);
} }
/// GET请求 /// GET请求
@ -155,14 +150,10 @@ class NetworkService {
return post(path, data, showLoading: showLoading, showError: showError, apiType: apiType); return post(path, data, showLoading: showLoading, showError: showError, apiType: apiType);
} }
/// API类型获取对应的API服务实例
/// API服务实例
ApiService _getApiServiceByType(ApiType type) { ApiService _getApiServiceByType(ApiType type) {
switch (type) {
case ApiType.main:
return _apiService;
case ApiType.file:
return _fileApiService;
}
// API服务
return _apiService;
} }
/// API /// API

3
lib/network/user_api.dart

@ -34,4 +34,7 @@ abstract class UserApi {
Future<HttpResponse<BaseResponse<dynamic>>> registerMarriageInformation( Future<HttpResponse<BaseResponse<dynamic>>> registerMarriageInformation(
@Body() Map<String, dynamic> data, @Body() Map<String, dynamic> data,
); );
@GET(ApiUrls.getHxUserToken)
Future<HttpResponse<BaseResponse<String>>> getHxUserToken();
} }

31
lib/network/user_api.g.dart

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

46
lib/oss/oss_manager.dart

@ -0,0 +1,46 @@
import 'dart:typed_data';
import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart';
class OSSManager {
//
static final OSSManager _instance = OSSManager._internal();
bool isInit = false;
//
factory OSSManager() {
return _instance;
}
//
OSSManager._internal();
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 {
if (!isInit) {
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("上传失败");
}
}

18
lib/pages/main/main_page.dart

@ -6,6 +6,7 @@ import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:dating_touchme_app/network/user_api.dart'; import 'package:dating_touchme_app/network/user_api.dart';
import 'package:dating_touchme_app/controller/mine/user_controller.dart';
import '../../widget/double_tap_to_exit_widget.dart'; import '../../widget/double_tap_to_exit_widget.dart';
import '../discover/discover_page.dart'; import '../discover/discover_page.dart';
@ -24,7 +25,7 @@ class _MainPageState extends State<MainPage> {
final storage = GetStorage(); final storage = GetStorage();
PageController pageController = PageController(initialPage: 0); PageController pageController = PageController(initialPage: 0);
int currentIndex = 0; // 使int替代RxInt int currentIndex = 0; // 使int替代RxInt
// build都重新创建 // build都重新创建
late HomePage homePage; late HomePage homePage;
late DiscoverPage discoverPage; late DiscoverPage discoverPage;
@ -36,25 +37,26 @@ class _MainPageState extends State<MainPage> {
super.initState(); super.initState();
// UserApi实例 // UserApi实例
_userApi = Get.find<UserApi>(); _userApi = Get.find<UserApi>();
// //
homePage = HomePage(); homePage = HomePage();
discoverPage = DiscoverPage(); discoverPage = DiscoverPage();
messagePage = MessagePage(); messagePage = MessagePage();
minePage = MinePage(); minePage = MinePage();
// UserController并调用获取环信用户token的方法
final userController = Get.put(UserController());
userController.getHxUserToken();
// token并调用获取婚姻信息详情的方法 // token并调用获取婚姻信息详情的方法
checkTokenAndFetchMarriageInfo(); checkTokenAndFetchMarriageInfo();
} }
// token并获取婚姻信息详情 // token并获取婚姻信息详情
Future<void> checkTokenAndFetchMarriageInfo() async { Future<void> checkTokenAndFetchMarriageInfo() async {
final response = await _userApi.getMarriageInformationDetail();
if (response.data.isSuccess) {
if (response.data.data == null) {
}
}
// userController中的getMarriageInformationDetail方法
final userController = Get.find<UserController>();
await userController.getMarriageInformationDetail();
} }
@override @override

2
lib/pages/mine/login_page.dart

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:dating_touchme_app/pages/mine/login_controller.dart';
import 'package:dating_touchme_app/controller/mine/login_controller.dart';
class LoginPage extends StatelessWidget { class LoginPage extends StatelessWidget {
LoginPage({super.key}); LoginPage({super.key});

1
lib/pages/mine/mine_page.dart

@ -10,6 +10,7 @@ class MinePage extends StatefulWidget {
class _MinePageState extends State<MinePage> with AutomaticKeepAliveClientMixin{ class _MinePageState extends State<MinePage> with AutomaticKeepAliveClientMixin{
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context);
return Container( return Container(
color: Colors.white, color: Colors.white,
); );

2
lib/pages/mine/user_info_page.dart

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/generated/assets.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'user_info_controller.dart';
import 'package:dating_touchme_app/controller/mine/user_info_controller.dart';
class UserInfoPage extends StatelessWidget { class UserInfoPage extends StatelessWidget {
const UserInfoPage({Key? key}) : super(key: key); const UserInfoPage({Key? key}) : super(key: key);

Loading…
Cancel
Save