From 4dc56a21b88bf330ba16bd6fddd4dc7502667c58 Mon Sep 17 00:00:00 2001 From: iammm0 Date: Thu, 29 Jan 2026 10:57:26 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96ViewModel?= =?UTF-8?q?=E5=92=8C=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化AuthViewModel认证ViewModel - 优化MyMemoirViewModel回忆录ViewModel - 扩展TextUtils工具类 --- .../life_echo/ui/viewmodel/AuthViewModel.kt | 31 +++++++++++++----- .../ui/viewmodel/MyMemoirViewModel.kt | 8 +++-- .../com/huaga/life_echo/utils/TextUtils.kt | 32 +++++++++++++++++++ 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/AuthViewModel.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/AuthViewModel.kt index 2057d04..69631ba 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/AuthViewModel.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/AuthViewModel.kt @@ -338,16 +338,17 @@ class AuthViewModel(private val context: Context) : ViewModel() { } /** - * 验证码登录 + * 验证码登录/注册(统一接口) + * 如果用户不存在,会自动注册(需要提供nickname) */ - fun loginWithSms(phone: String, code: String, agreedToTerms: Boolean) { + fun loginWithSms(phone: String, code: String, agreedToTerms: Boolean, nickname: String? = null) { viewModelScope.launch { _isLoading.value = true _errorMessage.value = null _successMessage.value = null _operationResult.value = null - val result = authService.loginWithSms(phone, code, agreedToTerms) + val result = authService.loginWithSms(phone, code, agreedToTerms, nickname) result.fold( onSuccess = { tokenResponse -> @@ -365,21 +366,35 @@ class AuthViewModel(private val context: Context) : ViewModel() { // 显示成功消息 val userNickname = _currentUser.value?.nickname ?: "用户" - _successMessage.value = "登录成功!" + val isNewUser = nickname != null && nickname.isNotBlank() + _successMessage.value = if (isNewUser) "注册成功!" else "登录成功!" _operationResult.value = OperationResult( success = true, - message = "登录成功", - details = "欢迎回来,${userNickname}!正在跳转..." + message = if (isNewUser) "注册成功" else "登录成功", + details = if (isNewUser) { + "账号已创建,欢迎加入岁月史书!正在跳转..." + } else { + "欢迎回来,${userNickname}!正在跳转..." + } ) }, onFailure = { exception -> val errorMsg = exception.message ?: "登录失败" _errorMessage.value = errorMsg _isLoggedIn.value = false + + // 检查是否是首次登录需要昵称的错误 + val needsNickname = errorMsg.contains("首次登录需要设置昵称") || + errorMsg.contains("需要设置昵称") + _operationResult.value = OperationResult( success = false, - message = "登录失败", - details = errorMsg + message = if (needsNickname) "需要设置昵称" else "登录失败", + details = if (needsNickname) { + "这是您首次登录,请设置一个昵称" + } else { + errorMsg + } ) } ) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt index 22e3586..518cd8f 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/ui/viewmodel/MyMemoirViewModel.kt @@ -21,6 +21,7 @@ class MyMemoirViewModel( ) : ViewModel() { val chapters = chapterRepository.getAllChapters() + val chapterDtos = MutableStateFlow>(emptyList()) val selectedChapter = MutableStateFlow(null) val isLoading = MutableStateFlow(false) val error = MutableStateFlow(null) @@ -64,9 +65,12 @@ class MyMemoirViewModel( try { val result = apiService.getChapters() result.fold( - onSuccess = { chapterDtos -> + onSuccess = { chapterDtosFromApi -> + // 保存ChapterDto(包含images信息) + chapterDtos.value = chapterDtosFromApi + // 转换为本地Chapter实体并保存 - val chapters = chapterDtos.map { dto -> + val chapters = chapterDtosFromApi.map { dto -> Chapter( id = dto.id, title = dto.title, diff --git a/app-android/app/src/main/java/com/huaga/life_echo/utils/TextUtils.kt b/app-android/app/src/main/java/com/huaga/life_echo/utils/TextUtils.kt index d330a15..812b1d8 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/utils/TextUtils.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/utils/TextUtils.kt @@ -65,4 +65,36 @@ object TextUtils { val quotePattern = Regex("""["'](.*?)["']""") return quotePattern.findAll(text).map { it.groupValues[1] }.toList() } + + /** + * 移除图片占位符 + * 如果没有图片,移除所有{{{{IMAGE:...}}}}和{{IMAGE:...}}格式的占位符 + * 同时确保每个段落之间有空行 + * @param content 原始内容 + * @param hasImages 是否有图片 + * @return 处理后的内容 + */ + fun removeImagePlaceholders(content: String?, hasImages: Boolean = false): String { + if (content.isNullOrBlank()) return "" + + var processed = if (!hasImages) { + // 移除所有{{{{IMAGE:...}}}}格式的占位符(四个大括号) + content.replace(Regex("\\{\\{\\{\\{IMAGE:[^}]+\\}\\}\\}\\}"), "") + // 移除所有{{IMAGE:...}}格式的占位符(两个大括号) + .replace(Regex("\\{\\{IMAGE:[^}]+\\}\\}"), "") + .trim() + } else { + content + } + + // 确保每个段落之间有空行 + // 将单个换行符(非空行后跟非空行)替换为双换行符 + // 但保留已有的双换行符或更多换行符 + processed = processed.replace(Regex("([^\n\\r])\\r?\\n([^\n\\r])"), "$1\n\n$2") + + // 清理多余的空行(连续3个或以上的换行符替换为2个) + processed = processed.replace(Regex("\n{3,}"), "\n\n") + + return processed.trim() + } }