From 9cdc962d9abbe5921c688deb43de1547099e5e65 Mon Sep 17 00:00:00 2001 From: gewuyou Date: Tue, 6 May 2025 11:32:55 +0800 Subject: [PATCH] refactor(forgeboot-common):Refactoring the Unified Response Encapsulation Class R - Removed unnecessary comments and redundant code - Optimized how success and failure response objects are created - added a new extension field extra to save extension information - Implemented the toMutableFlatMap and toFlatMap methods to convert the response object to Map - Refactored the way ResultExtender is used to improve scalability --- .../com/gewuyou/forgeboot/common/result/R.kt | 161 +++++++----------- gradle/libs.versions.toml | 14 +- 2 files changed, 76 insertions(+), 99 deletions(-) diff --git a/forgeboot-common/forgeboot-common-result/forgeboot-common-result-impl/src/main/kotlin/com/gewuyou/forgeboot/common/result/R.kt b/forgeboot-common/forgeboot-common-result/forgeboot-common-result-impl/src/main/kotlin/com/gewuyou/forgeboot/common/result/R.kt index 5184d2c..d663369 100644 --- a/forgeboot-common/forgeboot-common-result/forgeboot-common-result-impl/src/main/kotlin/com/gewuyou/forgeboot/common/result/R.kt +++ b/forgeboot-common/forgeboot-common-result/forgeboot-common-result-impl/src/main/kotlin/com/gewuyou/forgeboot/common/result/R.kt @@ -10,18 +10,7 @@ import com.gewuyou.forgeboot.common.result.impl.DefaultRequestIdProvider /** * 统一响应封装类 * - * 该类用于统一系统中的响应格式,提供基本地响应信息如状态码、是否成功、消息内容、数据体等 - * 并支持通过扩展器[ResultExtender]来扩展响应信息 - * - * @param code 状态码 - * @param success 是否成功 - * @param message 响应消息 - * @param data 响应数据体 - * @param requestId 请求ID - * @param nameMap 响应字段名称映射表 - * * @since 2025-05-03 16:04:42 - * @author gewuyou */ data class R( val code: Int, @@ -29,50 +18,47 @@ data class R( val message: String, val data: T? = null, val requestId: String? = null, - val nameMap: Map = mapOf( - "code" to "code", - "success" to "success", - "message" to "message", - "data" to "data" - ) + val extra: Map = emptyMap() // ✅ 扩展字段保存位置 ) { /** - * 将响应对象转换为Map对象 - * - * 此方法用于将响应对象转换为Map,方便在不同层次中传递和处理响应信息 - * 同时,它允许通过[ResultExtender]来进一步扩展响应信息 - * - * @param extenders 结果扩展器列表,默认为空 - * @return 转换后的Map对象 + * 转换为可变 Map,包含 extra 中的字段 */ - fun toMap(extenders: List = emptyList()): MutableMap { - val r = mutableMapOf( + fun toMutableFlatMap(): MutableMap { + val map = mutableMapOf( "code" to code, "success" to success, "message" to message, "data" to data ) if (!requestId.isNullOrBlank()) { - r["requestId"] = requestId + map["requestId"] = requestId } - extenders.forEach { it.extend(r) } - return r + map.putAll(extra) // ✅ 扁平化合并 + return map } + /** + * 转换为不可变 Map,包含 extra 中的字段 + */ + fun toFlatMap(): Map = toMutableFlatMap().toMap() + companion object { + private fun buildExtraMap(extenders: List): Map { + return mutableMapOf().apply { + extenders.forEach { it.extend(this) } + } + } /** - * 创建成功地响应对象 - * - * 该方法用于根据[ResponseInformation]创建一个成功地响应对象 - * 它支持国际化消息解析和请求ID的生成,并允许通过[ResultExtender]来扩展响应信息 + * 创建成功响应对象 * * @param info 响应信息对象 - * @param data 响应数据体,默认为null - * @param messageResolver 消息解析器,默认为[DefaultMessageResolver] - * @param requestIdProvider 请求ID提供者,默认为[DefaultRequestIdProvider] - * @param extenders 结果扩展器列表,默认为空 - * @return 创建的响应对象 + * @param data 响应数据 + * @param messageResolver 消息解析器 + * @param i18bArgs 国际化参数 + * @param requestIdProvider 请求ID提供者 + * @param extenders 扩展信息提供者列表 + * @return 成功响应对象 */ fun success( info: ResponseInformation, @@ -82,28 +68,22 @@ data class R( requestIdProvider: RequestIdProvider? = null, extenders: List = emptyList() ): R { - val msg = (messageResolver ?: DefaultMessageResolver).resolve( - info.responseI8nMessageCode, - i18bArgs - ) + val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs) val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() - return R(info.responseCode, true, msg, data, reqId).also { - extenders.forEach { extender -> extender.extend(it.toMap()) } - } + val extra = buildExtraMap(extenders) + return R(info.responseCode, true, msg, data, reqId, extra) } /** - * 创建失败的响应对象 - * - * 该方法用于根据[ResponseInformation]创建一个失败的响应对象 - * 它支持国际化消息解析和请求ID的生成,并允许通过[ResultExtender]来扩展响应信息 + * 创建失败响应对象 * * @param info 响应信息对象 - * @param data 响应数据体,默认为null - * @param messageResolver 消息解析器,默认为[DefaultMessageResolver] - * @param requestIdProvider 请求ID提供者,默认为[DefaultRequestIdProvider] - * @param extenders 结果扩展器列表,默认为空 - * @return 创建的响应对象 + * @param data 响应数据 + * @param messageResolver 消息解析器 + * @param i18bArgs 国际化参数 + * @param requestIdProvider 请求ID提供者 + * @param extenders 扩展信息提供者列表 + * @return 失败响应对象 */ fun failure( info: ResponseInformation, @@ -113,77 +93,64 @@ data class R( requestIdProvider: RequestIdProvider? = null, extenders: List = emptyList() ): R { - val msg = (messageResolver ?: DefaultMessageResolver).resolve( - info.responseI8nMessageCode, - i18bArgs - ) + val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs) val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() - return R(info.responseCode, false, msg, data, reqId).also { - extenders.forEach { extender -> extender.extend(it.toMap()) } - } + val extra = buildExtraMap(extenders) + return R(info.responseCode, false, msg, data, reqId, extra) } /** - * 创建成功地响应对象 + * 创建成功响应对象 * - * 该方法用于创建一个简单的成功响应对象,支持自定义状态码、消息代码、消息参数和数据体 - * 它支持国际化消息解析和请求ID的生成,并允许通过[ResultExtender]来扩展响应信息 - * - * @param code 状态码,默认为200 - * @param messageCode 消息代码,默认为"success" - * @param args 消息参数,默认为null - * @param data 响应数据体,默认为null - * @param messageResolver 消息解析器,默认为[DefaultMessageResolver] - * @param requestIdProvider 请求ID提供者,默认为[DefaultRequestIdProvider] - * @param extenders 结果扩展器列表,默认为空 - * @return 创建的响应对象 + * @param code 响应码 + * @param messageCode 消息码 + * @param data 响应数据 + * @param i18nArgs 国际化参数 + * @param messageResolver 消息解析器 + * @param requestIdProvider 请求ID提供者 + * @param extenders 扩展信息提供者列表 + * @return 成功响应对象 */ fun success( code: Int = 200, messageCode: String = "success", data: T? = null, - i18bArgs: Array? = null, + i18nArgs: Array? = null, messageResolver: MessageResolver? = null, requestIdProvider: RequestIdProvider? = null, extenders: List = emptyList() ): R { - val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18bArgs) + val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18nArgs) val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() - return R(code, true, msg, data, reqId).also { - extenders.forEach { extender -> extender.extend(it.toMap()) } - } + val extra = buildExtraMap(extenders) + return R(code, true, msg, data, reqId, extra) } /** - * 创建失败的响应对象 + * 创建失败响应对象 * - * 该方法用于创建一个简单的失败响应对象,支持自定义状态码、消息代码、消息参数和数据体 - * 它支持国际化消息解析和请求ID的生成,并允许通过[ResultExtender]来扩展响应信息 - * - * @param code 状态码,默认为400 - * @param messageCode 消息代码,默认为"error" - * @param args 消息参数,默认为null - * @param data 响应数据体,默认为null - * @param messageResolver 消息解析器,默认为[DefaultMessageResolver] - * @param requestIdProvider 请求ID提供者,默认为[DefaultRequestIdProvider] - * @param extenders 结果扩展器列表,默认为空 - * @return 创建的响应对象 + * @param code 响应码 + * @param messageCode 消息码 + * @param data 响应数据 + * @param i18nArgs 国际化参数 + * @param messageResolver 消息解析器 + * @param requestIdProvider 请求ID提供者 + * @param extenders 扩展信息提供者列表 + * @return 失败响应对象 */ fun failure( code: Int = 400, messageCode: String = "error", data: T? = null, - i18bArgs: Array? = null, + i18nArgs: Array? = null, messageResolver: MessageResolver? = null, requestIdProvider: RequestIdProvider? = null, extenders: List = emptyList() ): R { - val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18bArgs) + val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18nArgs) val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() - return R(code, false, msg, data, reqId).also { - extenders.forEach { extender -> extender.extend(it.toMap()) } - } + val extra = buildExtraMap(extenders) + return R(code, false, msg, data, reqId, extra) } - } -} +} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b2df0df..419d740 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ kotlinxSerializationJSON-version = "1.7.3" axion-release-version = "1.18.7" spring-cloud-version = "2024.0.1" spring-boot-version = "3.4.4" - +latest-release="latest.release" slf4j-version = "2.0.17" [libraries] kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin-version" } @@ -32,11 +32,21 @@ springBoot-configuration-processor = { group = "org.springframework.boot", name springCloudDependencies-bom = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "spring-cloud-version" } springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" } +# Jackson +jackson-core={group="com.fasterxml.jackson.core", name="jackson-core"} +jackson-databind={group="com.fasterxml.jackson.core", name="jackson-databind"} +jackson-annotations={group="com.fasterxml.jackson.core", name="jackson-annotations"} +jackson-datatype-jsr310={group="com.fasterxml.jackson.datatype", name="jackson-datatype-jsr310"} +jackson-module-kotlin={group="com.fasterxml.jackson.module", name="jackson-module-kotlin"} + reactor-core={group="io.projectreactor", name="reactor-core"} # Libraries can be bundled together for easier import + [bundles] kotlinxEcosystem = ["kotlinxDatetime", "kotlinxSerialization", "kotlinxCoroutines-core"] - +jacksonAll = [ + "jackson-core", "jackson-databind", "jackson-annotations","jackson-datatype-jsr310", "jackson-module-kotlin" +] [plugins] # 应用 Java 插件,提供基本的 Java 代码编译和构建能力 java = { id = "java" }