From f496392b24eb9c9a38498cbbf03159ef5aa037d1 Mon Sep 17 00:00:00 2001 From: tj <1378534974@qq.com> Date: 星期一, 21 四月 2025 15:38:08 +0800 Subject: [PATCH] 1.好友邀请-我的邀请记录:列表样式重写,图片显示 2.已登录的用户点击应用图标之后直接登录 --- app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt | 220 ++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 171 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt index 0601ec9..1507d6e 100644 --- a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt @@ -21,20 +21,24 @@ import kotlinx.coroutines.launch import com.example.firstapp.database.repository.ReminderRecordRepository import com.example.firstapp.database.entity.ReminderRecord +import com.example.firstapp.model.TrainGroup +import com.example.firstapp.model.TrainPackage +import com.example.firstapp.model.FlightGroup +import com.example.firstapp.model.FlightPackage class HomeViewModel : ViewModel() { private val _expressItems = MutableLiveData<List<ExpressGroup>>() private val _financeItems = MutableLiveData<List<FinanceGroup>>() private val _incomeItems = MutableLiveData<List<IncomeGroup>>() - private val _flightItems = MutableLiveData<List<FinanceGroup>>() - private val _trainItems = MutableLiveData<List<FinanceGroup>>() + private val _flightItems = MutableLiveData<List<FlightGroup>>() + private val _trainItems = MutableLiveData<List<TrainGroup>>() val expressItems: LiveData<List<ExpressGroup>> = _expressItems val financeItems: LiveData<List<FinanceGroup>> = _financeItems val incomeItems: LiveData<List<IncomeGroup>> = _incomeItems - val flightItems: LiveData<List<FinanceGroup>> = _flightItems - val trainItems: LiveData<List<FinanceGroup>> = _trainItems + val flightItems: LiveData<List<FlightGroup>> = _flightItems + val trainItems: LiveData<List<TrainGroup>> = _trainItems private val _categories = MutableLiveData<List<CategoryConfig>>() val categories: LiveData<List<CategoryConfig>> = _categories @@ -46,8 +50,9 @@ val unreadReminderCount: LiveData<Int> = _unreadReminderCount private lateinit var secureStorage: SecureStorage - private lateinit var currentUserId: String + private var currentUserId: String = "" private lateinit var reminderRecordRepository: ReminderRecordRepository + private var categoriesLoaded = false init { // 初始化时加载包裹列表数据 @@ -60,7 +65,13 @@ secureStorage = SecureStorage(context) currentUserId = userId reminderRecordRepository = ReminderRecordRepository(context) - loadCategories() + + // 只在首次加载或者用户修改分类后加载分类数据 + if (!categoriesLoaded) { + loadCategories() + categoriesLoaded = true + } + // 初始化时更新可见分类 _categories.value?.let { updateVisibleCategories(it) } // 加载未读提醒数量 @@ -105,8 +116,38 @@ } _incomeItems.postValue(groups) } + "火车票" -> { + // 处理火车票类型 + val groups = stations.map { station -> + val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code -> + TrainPackage( + id = code.id, + company = code.secondLevel, + trackingNumber = code.code, + createTime = code.createTime + ) + } + TrainGroup(stationName = station.stationName, packages = packages) + } + _trainItems.postValue(groups) + } + "航班" -> { + // 处理航班类型 + val groups = stations.map { station -> + val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code -> + FlightPackage( + id = code.id, + company = code.secondLevel, + trackingNumber = code.code, + createTime = code.createTime + ) + } + FlightGroup(stationName = station.stationName, packages = packages) + } + _flightItems.postValue(groups) + } else -> { - // 处理其他类型(还款、航班、火车票) + // 处理其他类型(还款) val groups = stations.map { station -> val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code -> FinancePackage( @@ -122,8 +163,6 @@ // 根据类型更新对应的 LiveData when (type) { "还款" -> _financeItems.postValue(groups) - "航班" -> _flightItems.postValue(groups) - "火车票" -> _trainItems.postValue(groups) } } } @@ -153,20 +192,37 @@ loadDataByType("火车票") } + + fun loadAllCategoryData() { + getFullCategories().forEach { category -> + loadDataByType(category.name) + } + } + + + fun getFullCategories(): List<CategoryConfig> { + return listOf( + CategoryConfig(1, "快递", 0, true), + CategoryConfig(2, "还款", 1, true), + CategoryConfig(3, "收入", 2, true), + CategoryConfig(4, "航班", 3, true), + CategoryConfig(5, "火车票", 4, true) + ) + } + private fun loadCategories() { viewModelScope.launch { try { - // 先尝试从本地获取配置 - val localCategories = secureStorage.getCategories(currentUserId) - // 默认完整分类列表 - val fullCategories = listOf( - CategoryConfig(1, "快递", 0, true), - CategoryConfig(2, "还款", 1, true), - CategoryConfig(3, "收入", 2, true), - CategoryConfig(4, "航班", 3, true), - CategoryConfig(5, "火车票", 4, true) - ) +// val fullCategories = listOf( +// CategoryConfig(1, "快递", 0, true), +// CategoryConfig(2, "还款", 1, true), +// CategoryConfig(3, "收入", 2, true), +// CategoryConfig(4, "航班", 3, true), +// CategoryConfig(5, "火车票", 4, true) +// ) + + val fullCategories=getFullCategories() // 基础分类(非会员可见) val basicCategories = listOf( @@ -174,30 +230,73 @@ CategoryConfig(2, "还款", 1, true) ) - if (localCategories.isNotEmpty()) { - // 如果本地有配置,直接使用本地配置 - _categories.value = localCategories - } else { - try { - // 尝试从服务器获取用户信息判断是否是会员 - val savedPhone = PreferencesManager.getPhone() - val response = RetrofitClient.apiService.getUserInfo(savedPhone ?: "") - val isMember = response.code == "0" && response.data?.isMember == true + try { + // 获取会员状态 + val savedPhone = PreferencesManager.getPhone() + val userResponse = RetrofitClient.apiService.getUserInfo(savedPhone ?: "") + val isMember = userResponse.code == "0" && userResponse.data?.isMember == true + + // 从用户信息中获取正确的userId + if (userResponse.code == "0" && userResponse.data != null) { + currentUserId = userResponse.data?.id.toString() + } - // 根据会员状态设置默认分类 - val defaultCategories = if (isMember) fullCategories else basicCategories - _categories.value = defaultCategories - secureStorage.saveCategories(currentUserId, defaultCategories) - - // 同步到服务器 + // 首先检查本地是否有缓存的分类配置 + val localCategories = secureStorage.getCategories(currentUserId) + + if (localCategories.isNotEmpty()) { + // 使用本地缓存的配置 + _categories.value = localCategories + } else { + // 本地无缓存,尝试从服务器获取 try { - syncCategoriesToServer(defaultCategories) + val serverCategories = RetrofitClient.apiService.getUserCategories(currentUserId) + + if (serverCategories.isNotEmpty()) { + // 服务器有配置,使用服务器配置 + // 如果不是会员,需要过滤掉会员专属分类 + val filteredCategories = if (isMember) { + serverCategories + } else { + serverCategories.filter { it.name == "快递" || it.name == "还款" } + } + + _categories.value = filteredCategories + // 同时更新本地缓存 + secureStorage.saveCategories(currentUserId, filteredCategories) + // 同步回服务器(如果有变化) + if (filteredCategories.size != serverCategories.size) { + syncCategoriesToServer(filteredCategories) + } + } else { + // 服务器返回空,根据会员状态设置默认分类 + val defaultCategories = if (isMember) fullCategories else basicCategories + _categories.value = defaultCategories + // 更新本地缓存 + secureStorage.saveCategories(currentUserId, defaultCategories) + // 同步到服务器 + syncCategoriesToServer(defaultCategories) + } } catch (e: Exception) { - Log.e("HomeViewModel", "Failed to sync categories: ${e.message}") + // 服务器获取失败,使用默认分类 + Log.e("HomeViewModel", "Failed to get categories from server: ${e.message}") + val defaultCategories = if (isMember) fullCategories else basicCategories + _categories.value = defaultCategories + secureStorage.saveCategories(currentUserId, defaultCategories) } - } catch (e: Exception) { - // 如果获取用户信息失败,使用基础分类 + } + } catch (e: Exception) { + // 网络连接失败,尝试从本地获取配置 + Log.e("HomeViewModel", "Failed to get user info: ${e.message}") + val localCategories = secureStorage.getCategories(currentUserId) + + if (localCategories.isNotEmpty()) { + // 使用本地缓存的配置 + _categories.value = localCategories + } else { + // 本地也没有配置,使用基础分类 _categories.value = basicCategories + // 更新本地缓存 secureStorage.saveCategories(currentUserId, basicCategories) } } @@ -207,20 +306,26 @@ } catch (e: Exception) { Log.e("HomeViewModel", "Failed to load categories: ${e.message}") + // 出现异常时,使用基础分类 + val basicCategories = listOf( + CategoryConfig(1, "快递", 0, true), + CategoryConfig(2, "还款", 1, true) + ) + _categories.value = basicCategories + // 更新可见分类 + updateVisibleCategories(basicCategories) } } } - private fun syncCategoriesToServer(categories: List<CategoryConfig>) { - viewModelScope.launch { - try { - RetrofitClient.apiService.saveUserCategories( - CategoryConfigSync(currentUserId, categories) - ) - } catch (e: Exception) { - // 同步失败,可以稍后重试或者显示提示 - Log.e("CategorySync", "Failed to sync categories: ${e.message}") - } + private suspend fun syncCategoriesToServer(categories: List<CategoryConfig>) { + try { + RetrofitClient.apiService.saveUserCategories( + CategoryConfigSync(currentUserId, categories) + ) + } catch (e: Exception) { + // 同步失败,可以稍后重试或者显示提示 + Log.e("CategorySync", "Failed to sync categories: ${e.message}") } } @@ -229,9 +334,17 @@ // 保存到本地存储 secureStorage.saveCategories(currentUserId, categories) // 同步到服务器 - syncCategoriesToServer(categories) + viewModelScope.launch { + try { + syncCategoriesToServer(categories) + } catch (e: Exception) { + Log.e("HomeViewModel", "Failed to sync categories: ${e.message}") + } + } // 更新可见分类 updateVisibleCategories(categories) + // 标记分类已被修改 + categoriesLoaded = true } private fun updateVisibleCategories(categories: List<CategoryConfig>) { @@ -255,10 +368,19 @@ } } + // 添加方法以强制刷新分类 + fun refreshCategories() { + categoriesLoaded = false + loadCategories() + } + // 登出时不再清除本地数据 fun logout() { // 只清除内存中的数据 _categories.value = emptyList() + categoriesLoaded = false + // 删除token + PreferencesManager.clearUserData() } } \ No newline at end of file -- Gitblit v1.9.3