app/src/main/java/com/example/firstapp/App.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/database/response/UserInfo.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/database/service/ApiService.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/database/service/RetrofitClient.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/network/AuthInterceptor.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/network/TokenExpiredInterceptor.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/ui/login/LoginViewModel.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/com/example/firstapp/utils/PreferencesManager.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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 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 ) 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() app/src/main/java/com/example/firstapp/database/service/RetrofitClient.kt
文件已删除 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) } } } 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 } } 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) } } 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 = "立即开通" 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() } } }