From 731667db1ac658a6f6064ef328d04eb1d47c20ff Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期一, 31 三月 2025 13:53:02 +0800
Subject: [PATCH] fix 登录
---
/dev/null | 1
app/src/main/java/com/example/firstapp/network/AuthInterceptor.kt | 24 ++++++++
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | 14 +++-
app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt | 8 ++
app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt | 40 +++++++++++++
app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt | 19 ++++++
app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 20 ++++++
app/src/main/java/com/example/firstapp/App.kt | 3
app/src/main/java/com/example/firstapp/database/response/UserInfo.kt | 5 -
9 files changed, 122 insertions(+), 12 deletions(-)
diff --git a/app/src/main/java/com/example/firstapp/App.kt b/app/src/main/java/com/example/firstapp/App.kt
index 6663556..7c60e3a 100644
--- a/app/src/main/java/com/example/firstapp/App.kt
+++ b/app/src/main/java/com/example/firstapp/App.kt
@@ -39,6 +39,7 @@
import com.example.firstapp.utils.FRPC_LIB_VERSION
import com.example.firstapp.utils.HistoryUtils
import com.example.firstapp.utils.Log
+import com.example.firstapp.utils.PreferencesManager
import com.example.firstapp.utils.SettingUtils
import com.example.firstapp.utils.SharedPreference
@@ -154,7 +155,7 @@
try {
context = applicationContext
initLibs()
-
+ PreferencesManager.init(this)
//纯客户端模式
if (SettingUtils.enablePureClientMode) return
diff --git a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
index 3e5c46c..3903f45 100644
--- a/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
+++ b/app/src/main/java/com/example/firstapp/database/response/UserInfo.kt
@@ -6,7 +6,6 @@
val name: String,
val cover: String,
val contactTel: String,
- val passTime: String,
- val overTime: String,
- val showed: Boolean
+ val memberOvertime: String,
+ val isMember: Boolean
)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
index 99dbf56..1d4be56 100644
--- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
+++ b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
@@ -13,7 +13,9 @@
import com.example.firstapp.database.response.UserInfo
import com.example.firstapp.model.CategoryConfig
import com.example.firstapp.model.CategoryConfigSync
+import com.example.firstapp.network.AuthInterceptor
import okhttp3.MultipartBody
+import okhttp3.OkHttpClient
import okhttp3.RequestBody
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
@@ -24,6 +26,7 @@
import retrofit2.http.Path
import retrofit2.http.Query
import retrofit2.http.Body
+import java.util.concurrent.TimeUnit
/**
* API调用接口
@@ -39,9 +42,11 @@
@GET("sysDict/getByDictCodeAndItemText")
suspend fun getDictValue(@Query("dictCode") dictCode: String, @Query("itemText") itemText: String): DictResponse
+ // 发送短信验证码
@POST("api/sms/send/code")
suspend fun sendVerificationCode(@Body request: SmsSendRequest): LoginResponse
+ // 验证短信验证码
@POST("api/login/customer/phone/v2")
suspend fun verifyCode(@Body request: SmsLoginRequest): TokenResponse
@@ -51,11 +56,12 @@
@GET("v2/alipay/pay-order-info")
suspend fun getPayOrderInfo(): AlipayOrderInfoResponse
- @GET("flower/api/supplier/info/{phone}")
+ // 获取用户信息
+ @GET("api/customer/info/{phone}")
suspend fun getUserInfo(@Path("phone") phone: String): ApiResponse<UserInfo>
@Multipart
- @POST("api/supplier/operation/update")
+ @POST("flower/api/supplier/operation/update")
suspend fun updateProfile(
@Part("nickname") nickname: RequestBody,
@Part avatar: MultipartBody.Part?
@@ -73,9 +79,19 @@
private const val BASE_URL ="http://192.168.1.213:8080/flower/"
+ // 创建OkHttpClient,配置拦截器和超时时间
+ private val okHttpClient = OkHttpClient.Builder()
+ .addInterceptor(AuthInterceptor())
+ .connectTimeout(30, TimeUnit.SECONDS)
+ .readTimeout(30, TimeUnit.SECONDS)
+ .writeTimeout(30, TimeUnit.SECONDS)
+ .build()
+
+
//添加Gson解析器,用于自动将JSON响应转换为Kotlin/Java对象
private val retrofit = Retrofit
.Builder()
+ .client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
diff --git a/app/src/main/java/com/example/firstapp/database/service/RetrofitClient.kt b/app/src/main/java/com/example/firstapp/database/service/RetrofitClient.kt
deleted file mode 100644
index 0519ecb..0000000
--- a/app/src/main/java/com/example/firstapp/database/service/RetrofitClient.kt
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/network/AuthInterceptor.kt b/app/src/main/java/com/example/firstapp/network/AuthInterceptor.kt
new file mode 100644
index 0000000..1f1a191
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/network/AuthInterceptor.kt
@@ -0,0 +1,24 @@
+package com.example.firstapp.network
+
+import com.example.firstapp.utils.PreferencesManager
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class AuthInterceptor : Interceptor {
+ override fun intercept(chain: Interceptor.Chain): Response {
+ val originalRequest = chain.request()
+
+ // 获取token
+ val token = PreferencesManager.getToken()
+
+ // 如果token存在,添加到请求头
+ return if (!token.isNullOrEmpty()) {
+ val newRequest = originalRequest.newBuilder()
+ .header("Authorization", "Bearer $token")
+ .build()
+ chain.proceed(newRequest)
+ } else {
+ chain.proceed(originalRequest)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt b/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt
new file mode 100644
index 0000000..1c73d50
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt
@@ -0,0 +1,19 @@
+package com.example.firstapp.network
+
+import com.example.firstapp.utils.PreferencesManager
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class TokenExpiredInterceptor : Interceptor {
+ override fun intercept(chain: Interceptor.Chain): Response {
+ val response = chain.proceed(chain.request())
+
+ // 如果返回401,说明token可能过期
+ if (response.code == 401) {
+ PreferencesManager.clearUserData() // 清除本地token
+ // TODO: 处理token过期,例如跳转到登录页面
+ }
+
+ return response
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt b/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
index ee242e2..92f03e9 100644
--- a/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
+++ b/app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt
@@ -10,6 +10,7 @@
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.utils.Log
import com.example.firstapp.ui.home.HomeViewModel
+import com.example.firstapp.utils.PreferencesManager
class LoginViewModel : ViewModel() {
@@ -64,7 +65,7 @@
//用于获取 HTTP 请求的相关信息(如请求头、Cookie 等),它会由 Spring 框架自动注入,不需要客户端显式传递。
val response = RetrofitClient.apiService.verifyCode(request)
if (response.code == "0" && response.data != null) {
- saveToken(response.data.value) // 这里获取的是 access_token
+ saveToken(response.data.value,phone) // 这里获取的是 access_token
_loginState.value = true
} else {
_loginMessage.value = response.msg.ifEmpty { "登录失败" }
@@ -86,9 +87,12 @@
}
}
- private fun saveToken(token: String) {
+ private fun saveToken(token: String,phone:String) {
// TODO: 实现token存储逻辑
// 可能还需要存储 refresh_token
+ PreferencesManager.saveToken(token)
+ // 保存登录的手机号
+ PreferencesManager.savePhone(phone)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
index 527fa09..5f1ffe1 100644
--- a/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -33,6 +33,7 @@
import com.bumptech.glide.Glide
import com.example.firstapp.activity.VipActivity
import com.example.firstapp.database.response.UserInfo
+import com.example.firstapp.utils.PreferencesManager
class NotificationsFragment : Fragment() {
@@ -278,7 +279,14 @@
private suspend fun loadUserInfo() {
try {
- val response = RetrofitClient.apiService.getUserInfo("17586582287")
+ // 从本地获取保存的手机号
+ val savedPhone = PreferencesManager.getPhone()
+ if (savedPhone.isNullOrEmpty()) {
+ Toast.makeText(context, "用户未登录", Toast.LENGTH_SHORT).show()
+ return
+ }
+
+ val response = RetrofitClient.apiService.getUserInfo(savedPhone)
if (response.code == "0" && response.data != null) {
// 保存用户信息
currentUserInfo = response.data
@@ -295,10 +303,10 @@
binding.tvUserId.text = "个人账号:${userInfo.contactTel}"
// 设置VIP信息
- if (userInfo.showed) {
+ if (userInfo.isMember) {
binding.ivVip.visibility = View.VISIBLE
binding.cardVip.visibility = View.VISIBLE
- binding.tvVipExpire.text = "${userInfo.overTime} 到期"
+ binding.tvVipExpire.text = "${userInfo.memberOvertime} 到期"
} else {
//非会员信息
binding.btnRenew.text = "立即开通"
diff --git a/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt b/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
new file mode 100644
index 0000000..6f5eb54
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt
@@ -0,0 +1,40 @@
+package com.example.firstapp.utils
+
+import android.content.Context
+import android.content.SharedPreferences
+
+object PreferencesManager {
+ private const val PREF_NAME = "app_preferences"
+ private const val KEY_TOKEN = "user_token"
+ private const val KEY_PHONE = "user_phone"
+
+ private lateinit var preferences: SharedPreferences
+
+ fun init(context: Context) {
+ preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
+ }
+
+ fun saveToken(token: String) {
+ preferences.edit().putString(KEY_TOKEN, token).apply()
+ }
+
+ fun getToken(): String? {
+ return preferences.getString(KEY_TOKEN, null)
+ }
+
+ fun savePhone(phone: String) {
+ preferences.edit().putString(KEY_PHONE, phone).apply()
+ }
+
+ fun getPhone(): String? {
+ return preferences.getString(KEY_PHONE, null)
+ }
+
+ fun clearUserData() {
+ preferences.edit().apply {
+ remove(KEY_TOKEN)
+ remove(KEY_PHONE)
+ apply()
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.3