diff --git a/lib/data/services/account_service.dart b/lib/data/services/account_service.dart index 96ae06708..5fbaf41ee 100644 --- a/lib/data/services/account_service.dart +++ b/lib/data/services/account_service.dart @@ -1,9 +1,11 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:logger/logger.dart'; +import '../../core/utils/synchrodata.dart'; import '../../modules/login/controllers/googleLogin.dart'; import '../../modules/login/controllers/facebookLogin.dart'; import '../services/network/api.dart'; +import 'db/database_helper.dart'; /// 账号管理服务 /// @@ -76,6 +78,12 @@ class AccountService extends GetxService { /// 返回操作结果,包含成功状态和错误信息 Future signOut() async { try { + // 上传会议记录操作记录 + await Synchrodata.uploadOperationRecords(); + + // 关闭数据库连接 + await DatabaseHelper().close(); + // 清理本地数据 final dataCleaned = await clearUserData(); if (!dataCleaned) { diff --git a/lib/data/services/db/database_helper.dart b/lib/data/services/db/database_helper.dart index b0d7562c0..34941efbe 100644 --- a/lib/data/services/db/database_helper.dart +++ b/lib/data/services/db/database_helper.dart @@ -22,6 +22,8 @@ class DatabaseHelper { Map? userInfo = storage.read("user_info"); if (userInfo != null) { _userId = userInfo['user']['uid']; + } else { + _userId = ''; } String path = join( await getDatabasesPath(), @@ -115,4 +117,11 @@ class DatabaseHelper { }); await batch.commit(); } + + Future close() async { + if (_database != null) { + await _database!.close(); + _database = null; + } + } } diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart index d41b31441..e26ed08eb 100644 --- a/lib/data/services/version_update_service.dart +++ b/lib/data/services/version_update_service.dart @@ -1,5 +1,6 @@ import 'dart:io'; -import 'package:flutter/foundation.dart'; +import 'dart:math' as math; + import 'package:get/get.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -8,7 +9,6 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import '../models/channel_app_model.dart'; import 'network/api.dart'; -import 'dart:math' as math; /// 版本更新服务类 class VersionUpdateService extends GetxService { @@ -49,7 +49,11 @@ class VersionUpdateService extends GetxService { String get cachedDeviceBrand => _deviceBrand ?? ''; /// 获取缓存的渠道信息 - UserChannel get cachedChannel => _channel ?? UserChannel.UNKNOWN; + UserChannel get cachedChannel => + _channel ?? + (_platform?.toLowerCase() == 'ios' + ? UserChannel.GLOBAL_APPLE + : UserChannel.GLOBAL_GOOGLE); /// 获取缓存的最新版本 String get cachedLatestVersion => _latestVersion ?? ''; @@ -90,96 +94,6 @@ class VersionUpdateService extends GetxService { // super.onInit(); // } - /// 获取当前应用版本信息 - Future getCurrentVersion() async { - try { - final packageInfo = await PackageInfo.fromPlatform(); - _appVersion = packageInfo.version; - _buildNumber = packageInfo.buildNumber; - return '${packageInfo.version}+${packageInfo.buildNumber}'; - } catch (e) { - _logger.e('获取当前版本信息失败: $e'); - return '1.0.0'; - } - } - - /// 获取当前平台信息 - Future getCurrentPlatformInfo() async { - if (Platform.isIOS) { - return const PlatformInfo( - platform: 'ios', - storeType: AppStoreType.appStore, - channel: UserChannel.GLOBAL_APPLE, - ); - } - - if (Platform.isAndroid) { - // 根据设备品牌判断应用商店类型 - return await getAndroidStoreInfoByBrand(); - } - - return const PlatformInfo( - platform: 'unknown', - storeType: AppStoreType.unknown, - channel: UserChannel.UNKNOWN, - ); - } - - /// 根据设备品牌获取应用商店信息 - /// - /// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。 - /// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。 - Future getAndroidStoreInfoByBrand() async { - try { - final deviceInfo = DeviceInfoPlugin(); - final androidInfo = await deviceInfo.androidInfo; - final brand = androidInfo.brand.toLowerCase(); - - _deviceBrand = brand; - String channelFromEnv = dotenv.env['Channel'] ?? 'OFFICIAL'; - _channel = UserChannel.fromName(channelFromEnv); - - UserChannel brandChannel; //品牌渠道,只用于请求版本更新信息 - - switch (brand) { - case 'huawei': - brandChannel = UserChannel.CHINA_HUAWEI; - break; - case 'xiaomi': - case 'redmi': - brandChannel = UserChannel.CHINA_XIAOMI; - break; - case 'oppo': - case 'oneplus': - brandChannel = UserChannel.CHINA_OPPO; - break; - case 'vivo': - case 'iqoo': - brandChannel = UserChannel.CHINA_VIVO; - break; - case 'honor': - brandChannel = UserChannel.CHINA_HONOR; - break; - default: - brandChannel = _channel ?? UserChannel.GLOBAL_GOOGLE; - break; - } - - return PlatformInfo( - platform: 'android', - storeType: AppStoreType.official, - channel: brandChannel, - ); - } catch (e) { - _logger.e('获取Android设备信息失败: $e'); - return const PlatformInfo( - platform: 'android', - storeType: AppStoreType.googlePlay, - channel: UserChannel.UNKNOWN, - ); - } - } - /// 检查版本更新 Future checkForUpdate() async { if (_lastCheckTime != null && @@ -203,7 +117,7 @@ class VersionUpdateService extends GetxService { final platformInfo = await getCurrentPlatformInfo(); _platform = platformInfo.platform; - //_channel = platformInfo.channel; + _channel = platformInfo.channel; _lastCheckTime = DateTime.now(); // 调用后端接口获取最新版本信息 @@ -233,7 +147,7 @@ class VersionUpdateService extends GetxService { // 设置游客登录显示状态(先用当前渠道结果作为回退,再用.env渠道覆盖以保持一致) _isShowTourists = appInfo.tourists; - if (_channel != platformInfo.channel) { + if (Platform.isAndroid && _channel != platformInfo.channel) { //[4]当前渠道与.env渠道不同,需要从.env渠道获取游客登录配置 await _refreshTouristsFromEnv(); } @@ -281,6 +195,97 @@ class VersionUpdateService extends GetxService { } } + /// 获取当前应用版本信息 + Future getCurrentVersion() async { + try { + final packageInfo = await PackageInfo.fromPlatform(); + _appVersion = packageInfo.version; + _buildNumber = packageInfo.buildNumber; + return '${packageInfo.version}+${packageInfo.buildNumber}'; + } catch (e) { + _logger.e('获取当前版本信息失败: $e'); + return '1.0.0'; + } + } + + /// 获取当前平台信息 + Future getCurrentPlatformInfo() async { + if (Platform.isIOS) { + return const PlatformInfo( + platform: 'ios', + storeType: AppStoreType.appStore, + channel: UserChannel.GLOBAL_APPLE, + ); + } + + if (Platform.isAndroid) { + // 根据设备品牌判断应用商店类型 + return await getAndroidStoreInfoByBrand(); + } + + return const PlatformInfo( + platform: 'unknown', + storeType: AppStoreType.unknown, + channel: UserChannel.UNKNOWN, + ); + } + + /// 根据设备品牌获取应用商店信息 + /// + /// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。 + /// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。 + Future getAndroidStoreInfoByBrand() async { + try { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + final brand = androidInfo.brand.toLowerCase(); + + _deviceBrand = brand; + String channelFromEnv = dotenv.env['Channel'] ?? 'OFFICIAL'; + Logger().d('channelFromEnv: $channelFromEnv'); + _channel = UserChannel.fromName(channelFromEnv); + + UserChannel brandChannel; //品牌渠道,只用于请求版本更新信息 + + switch (brand) { + case 'huawei': + brandChannel = UserChannel.CHINA_HUAWEI; + break; + case 'xiaomi': + case 'redmi': + brandChannel = UserChannel.CHINA_XIAOMI; + break; + case 'oppo': + case 'oneplus': + brandChannel = UserChannel.CHINA_OPPO; + break; + case 'vivo': + case 'iqoo': + brandChannel = UserChannel.CHINA_VIVO; + break; + case 'honor': + brandChannel = UserChannel.CHINA_HONOR; + break; + default: + brandChannel = _channel ?? UserChannel.GLOBAL_GOOGLE; + break; + } + + return PlatformInfo( + platform: 'android', + storeType: AppStoreType.official, + channel: brandChannel, + ); + } catch (e) { + _logger.e('获取Android设备信息失败: $e'); + return const PlatformInfo( + platform: 'android', + storeType: AppStoreType.googlePlay, + channel: UserChannel.UNKNOWN, + ); + } + } + /// 从.env文件刷新游客登录配置 Future _refreshTouristsFromEnv() async { try { diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index a26ec587e..50493ad08 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; import 'package:logger/logger.dart'; import '../../../data/models/user_Info.dart'; -import '../../settings/controllers/settings_controller.dart'; import 'dart:io'; //import 'dart:convert'; import 'package:flutter_image_compress/flutter_image_compress.dart';