feat(webmvc-dto): Add a pagination extension function and update internationalization support - A new PageExtension.kt file has been added to provide conversion from Page objects to PageResult objects

- Added the PageResultExtension.kt file to provide the mapping and conversion function of pagination results
- Updated internationalization message references in the DeleteByIdsReq and PageQueryReq files
- Modify the R.kt file to add default success and failure response information objects
- Simplified project structure by removing redundant internationalized message files
This commit is contained in:
gewuyou 2025-05-29 22:13:20 +08:00
parent d357a3d754
commit ff8593007d
9 changed files with 124 additions and 20 deletions

View File

@ -12,4 +12,6 @@ dependencies {
}
i18nKeyGen {
rootPackage.set("com.gewuyou.forgeboot.webmvc.dto.i18n")
level.set(3)
readPath.set("src/main/resources/i18n/${project.name}")
}

View File

@ -4,6 +4,7 @@ package com.gewuyou.forgeboot.webmvc.dto
import com.gewuyou.forgeboot.i18n.api.MessageResolver
import com.gewuyou.forgeboot.i18n.api.ResponseInformation
import com.gewuyou.forgeboot.trace.api.RequestIdProvider
import com.gewuyou.forgeboot.webmvc.dto.i18n.I18nKeys
/**
@ -22,6 +23,71 @@ val DefaultRequestIdProvider : RequestIdProvider = RequestIdProvider{""}
*/
val DefaultMessageResolver : MessageResolver = MessageResolver { code, _ -> code }
/**
* 默认成功i18n响应信息对象
*
* 提供标准的成功响应定义包含国际化支持
* 响应码为200表示操作成功
* i18n消息码用于查找本地化文本
*
* @since 2025-05-03 16:23:00
* @author gewuyou
*/
val defaultOkI18nResponseInformation: ResponseInformation = object : ResponseInformation {
/**
* 获取响应码
* @return 响应码
*/
override val responseCode: Int
get() = 200
/**
* 获取i18n响应信息code
* @return 响应信息 code
*/
override val responseI8nMessageCode: String
get() = I18nKeys.Forgeboot.Webmvc.Dto.RESULT_RESPONSEINFO_OK
/**
* 获取i18n响应信息参数
* @return 响应信息 参数数组
*/
override val responseI8nMessageArgs: Array<Any>?
get() = arrayOf()
}
/**
* 默认失败i18n响应信息对象
*
* 提供标准的失败响应定义包含国际化支持
* 响应码为400表示请求错误
* i18n消息码用于查找本地化文本
*
* @since 2025-05-03 16:23:15
* @author gewuyou
*/
val defaultFailureI18nResponseInformation: ResponseInformation = object : ResponseInformation {
/**
* 获取响应码
* @return 响应码
*/
override val responseCode: Int
get() = 400
/**
* 获取i18n响应信息code
* @return 响应信息 code
*/
override val responseI8nMessageCode: String
get() = I18nKeys.Forgeboot.Webmvc.Dto.RESULT_RESPONSEINFO_FAIL
/**
* 获取i18n响应信息参数
* @return 响应信息 参数数组
*/
override val responseI8nMessageArgs: Array<Any>?
get() = arrayOf()
}
/**
* 结果扩展器
*
@ -91,20 +157,18 @@ data class R<T>(
* @param info 响应信息对象
* @param data 响应数据
* @param messageResolver 消息解析器
* @param i18bArgs 国际化参数
* @param requestIdProvider 请求ID提供者
* @param extenders 扩展信息提供者列表
* @return 成功响应对象
*/
fun <T> success(
info: ResponseInformation,
info: ResponseInformation = defaultOkI18nResponseInformation,
data: T? = null,
messageResolver: MessageResolver? = null,
i18bArgs: Array<Any>? = null,
requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList(),
): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs)
val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, info.responseI8nMessageArgs)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
val extra = buildExtraMap(extenders)
return R(info.responseCode, true, msg, data, reqId, extra)
@ -116,20 +180,18 @@ data class R<T>(
* @param info 响应信息对象
* @param data 响应数据
* @param messageResolver 消息解析器
* @param i18bArgs 国际化参数
* @param requestIdProvider 请求ID提供者
* @param extenders 扩展信息提供者列表
* @return 失败响应对象
*/
fun <T> failure(
info: ResponseInformation,
info: ResponseInformation = defaultFailureI18nResponseInformation,
data: T? = null,
messageResolver: MessageResolver? = null,
i18bArgs: Array<Any>? = null,
requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList(),
): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs)
val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, info.responseI8nMessageArgs)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
val extra = buildExtraMap(extenders)
return R(info.responseCode, false, msg, data, reqId, extra)

View File

@ -0,0 +1,26 @@
package com.gewuyou.forgeboot.webmvc.dto.extension
import com.gewuyou.forgeboot.webmvc.dto.PageResult
import org.springframework.data.domain.Page
/**
* 分页扩展
*
* 该扩展函数用于将Spring Data的Page对象转换为自定义的PageResult对象
* 主要目的是为了统一分页数据的封装格式便于在不同层次之间传递和使用
*
* @param <T> 泛型参数表示分页数据中的具体类型
* @return 返回转换后的PageResult对象包含分页查询的结果
* @since 2025-05-29 21:51:52
* @author gewuyou
*/
fun <T> Page<T>.toPageResult(): PageResult<T> {
// 将当前分页信息和数据内容封装到自定义的PageResult对象中
return PageResult.of(
currentPage = this.number.toLong(),
pageSize = this.size.toLong(),
totalRecords = this.totalElements,
records = this.content
)
}

View File

@ -0,0 +1,23 @@
package com.gewuyou.forgeboot.webmvc.dto.extension
import com.gewuyou.forgeboot.webmvc.dto.PageResult
/**
* 分页结果扩展
*
* 该扩展函数用于将分页结果中的每个元素转换为另一种类型同时保持分页信息不变
* 它接受一个转换函数作为参数该函数定义了如何将分页结果中的每个元素从类型 T 转换为类型 R
*
* @param transform 转换函数用于将分页结果中的每个元素从类型 T 转换为类型 R
* @return 返回一个新的分页结果对象其中包含转换后的元素
* @since 2025-05-29 22:05:37
* @author gewuyou
*/
fun <T, R> PageResult<T>.map(transform: (T) -> R): PageResult<R> {
return PageResult.of(
currentPage = this.currentPage,
pageSize = this.pageSize,
totalRecords = this.totalRecords,
records = this.records?.map(transform)?.toMutableList() ?: mutableListOf()
)
}

View File

@ -23,6 +23,6 @@ class DeleteByIdsReq<T>(
*
* @param ids 实体的唯一标识符列表用于指定哪些实体应当被删除
*/
@field:NotEmpty(message = I18nKeys.Forgeboot.Dto.DELETE_IDS_NOTNOTEMPTY)
@field:NotEmpty(message = I18nKeys.Forgeboot.Webmvc.Dto.DELETE_IDS_NOT_EMPTY)
var ids: List<T>,
)

View File

@ -22,13 +22,13 @@ open class PageQueryReq<T> {
/**
* 当前页码(默认1)
*/
@field:Min(1, message = I18nKeys.Forgeboot.Dto.PAGEQUERY_CURRENTPAGE_MIN )
@field:Min(1, message = I18nKeys.Forgeboot.Webmvc.Dto.PAGE_QUERY_CURRENT_PAGE_MIN )
var currentPage: Int = 1
/**
* 每页条数(默认10)
*/
@field:Min(1, message = I18nKeys.Forgeboot.Dto.PAGEQUERY_PAGESIZE_MIN)
@field:Min(1, message = I18nKeys.Forgeboot.Webmvc.Dto.PAGE_QUERY_PAGE_SIZE_MIN)
var pageSize: Int = 10
/**

View File

@ -1,3 +0,0 @@
forgeboot.dto.delete.ids.notNotEmpty=请求删除的id列表不能为空\!
forgeboot.dto.pageQuery.currentPage.min=当前页码不得小于1页\!
forgeboot.dto.pageQuery.pageSize.min=每页条数不得小于1页\!

View File

@ -1,3 +0,0 @@
forgeboot.dto.delete.ids.notNotEmpty=The list of IDs requested to be removed cannot be empty\!
forgeboot.dto.pageQuery.currentPage.min=The current page number must not be less than 1 page\!
forgeboot.dto.pageQuery.pageSize.min=The number of entries per page shall not be less than 1 page\!

View File

@ -1,3 +0,0 @@
forgeboot.dto.delete.ids.notNotEmpty=请求删除的id列表不能为空\!
forgeboot.dto.pageQuery.currentPage.min=当前页码不得小于1页\!
forgeboot.dto.pageQuery.pageSize.min=每页条数不得小于1页\!