在本项目中新增一个后端 API 接口,需要同时修改三层:ApiService → RemoteRepository → ViewModel。 ## 步骤 ### 1. 收集信息 询问用户以下信息(如已在指令中提供则跳过): - 接口名称/功能描述 - 请求方式:GET / POST / POST + FormUrlEncoded / Multipart - 接口路径(相对路径,如 `/sideboard/app/xxx`) - 请求参数字段和类型 - 响应数据类型(已有类 or 需新建) - 归属哪个 ViewModel:`SettingViewModel` / `UserViewModel` / `DeviceViewModel` ### 2. 创建数据模型(如需要) **请求参数类:** `app/src/main/java/com/sw/platecabinet/model/request/.kt` **响应数据类:** `app/src/main/java/com/sw/platecabinet/model/response/.kt` 数据类规范: ```kotlin /** * <描述> */ data class XxxParam( val fieldName: String // 字段说明 ) ``` ### 3. 在 ApiService 中添加接口方法 文件:`app/src/main/java/com/sw/platecabinet/network/api/ApiService.kt` **关键规则:** - 必须使用 `@Url` 注解,URL 格式为:`"${GlobalData.appBaseUrl}/terminal/neglect/<路径>"` - 不要使用相对路径(baseUrl 拦截器不适用于本项目) - 方法必须为 `suspend` 函数,返回 `ApiResponse` ```kotlin /** * <接口功能描述> */ @POST // 或 @GET / @FormUrlEncoded @POST / @Multipart @POST suspend fun ( @Url url: String = "${GlobalData.appBaseUrl}/terminal/neglect/<路径>", @Body param: XxxParam // 或 @Query / @Field / @Part ): ApiResponse ``` ### 4. 在 RemoteRepository 中添加调用方法 文件:`app/src/main/java/com/sw/platecabinet/repository/RemoteRepository.kt` ```kotlin /** * <功能描述> */ suspend fun (/* 参数 */): ApiResponse { return safeApiCall { apiService.(/* 参数传递 */) } } ``` 约束: - 必须用 `safeApiCall { }` 包裹,不要裸调用 apiService - 参数直接透传,不在 Repository 层做业务逻辑 ### 5. 在 ViewModel 中添加调用逻辑 文件:`app/src/main/java/com/sw/platecabinet/viewmodel/.kt` ```kotlin /** * <功能描述> * @param callback 成功时回调,参数为响应数据 */ fun (/* 业务参数 */, callback: (XxxModel?) -> Unit) { launch { // 不需要 loading 时用 launch;需要 loading 时用 launchWithLoading val response = repository.(/* 参数 */) if (parseResponse(response)) { runOnMainThread { callback(response.result) } } } } ``` **注意:** `launch` / `launchWithLoading` 在协程中执行,回调若需更新 UI 需切换到主线程(使用 `withContext(Dispatchers.Main)` 或在 Activity 中用 `runOnUiThread`)。 ### 6. 在 Activity/Fragment 中调用 ```kotlin viewModel.(/* 参数 */) { result -> // 处理结果 } ``` ## 注意事项 - 所有注释使用简体中文 - 向用户展示将要修改的文件清单(含 Diff 预览),等待确认后再写文件 - `RequestInterceptor` 已自动注入认证 header,无需在方法中手动添加 - 响应体统一为 `ApiResponse`,通过 `response.isSuccess()` 和 `response.result` 取数据