在 UiSimpleQR 框架中,pagefacade 的核心职责是将数据库实体(Entity)转换为响应对象(Response)。默认情况下,它可能只是简单的字段映射或类型断言。
如果你想自定义转换逻辑(例如:字段重命名、数据脱敏、关联查询赋值、格式化时间等),通常有以下三种方式,按推荐程度排序:
🛠️ 方法一:重写 PageTo 方法(最灵活)
这是最直接的方式。由于 UiSimpleR 中的 PageTo 方法是对外暴露的,你可以在你自己的 Request 结构体(如 UiAdminStudyRequest)中重新定义它,拦截数据处理流程。
原理:获取到底层查出的 []E 数据后,手动遍历并转换为你想要的 []R。
// 在你的 ui_admin_study_request.go 中
func (self *UiAdminStudyRequest) PageTo(dbResult pagemodel.PageResult[coachentity.OpcCoachAdmin]) pagemodel.PageResult[coachentity.UiCoachResult] {
// 1. 初始化响应结果结构(保留分页信息)
// 假设 pagemodel.PageResult 有 CopyMeta 或者手动赋值 Total/PageNo
res := &pagemodel.PageResult[*coachentity.UiCoachResult]{
Total: dbResult.Total,
Page: dbResult.Page,
PageSize: dbResult.PageSize,
Data: make([]*coachentity.UiCoachResult, 0),
}
// 2. 自定义循环转换逻辑
for _, entity := range dbResult.Data {
if entity == nil {
continue
}
// --- 开始自定义逻辑 ---
// A. 基础字段映射
vo := &coachentity.UiCoachResult{
CoachID: entity.ID,
CoachName: entity.Name,
}
// B. 复杂逻辑处理 (例如:根据状态码转义文字)
if entity.Status == 1 {
vo.StatusDesc = "在职"
} else {
vo.StatusDesc = "离职"
}
// C. 敏感数据脱敏 (例如:手机号中间四位隐藏)
// vo.Phone = utils.MaskPhone(entity.Phone)
// D. 关联数据填充 (如果需要,可以在这里调其他 Service)
// vo.DeptName = deptService.GetNameById(entity.DeptId)
// --- 结束自定义逻辑 ---
res.Data = append(res.Data, vo)
}
return res
}
调用时机:当你调用 self.QueryModelR() 或 self.PageTo(self.List()) 时,Go 语言的多态机制会自动调用你重写的这个版本,而不是框架默认的简单版本。
🎨 方法二:利用 JSON Tag 进行“伪”定制(最简单)
如果你的“自定义转换”仅仅是为了改字段名(例如数据库叫 user_name,前端要 name)或者忽略某些字段,你不需要写代码逻辑,直接修改 R 结构体的 Tag 即可。
原理:pagefacade 最终通常会将结果序列化为 JSON。Go 的 encoding/json 标准库会读取 Tag。
type UiCoachResult struct {
// 数据库中是 ID,返回给前端变成 coach_id
ID int64 json:"coach_id"
// 数据库中是 Name,返回给前端变成 name
Name string json:"name"
// 这个字段在数据库中由,但不想返回给前端
Password string json:"-"
// 格式化时间 (需要配合第三方库如 github.com/gin-gonic/gin/binding 或自定义 MarshalJSON)
CreateTime time.Time json:"create_time"
}
🔌 方法三:实现接口或注入转换函数(最解耦)
查看你的框架版本是否支持注入转换函数。有些高级版本的 PagePtrFacade 允许你在初始化时传入一个 ConvertFunc。
如果 UiSimpleR 提供了类似 SetConverter 的方法(或者你可以扩展它),你可以这样做:
// 伪代码示例,取决于框架具体实现
func (self *UiAdminStudyRequest) Init() {
// 假设框架支持这种回调模式
self.PagePtrFacade.SetConvertFunc(func(e *coachentity.OpcCoachAdmin) *coachentity.UiCoachResult {
return &coachentity.UiCoachResult{
CoachID: e.ID,
// ... 你的逻辑
}
})
}
📌 总结建议
需求复杂度 推荐方案 优点
简单字段改名/隐藏 方法二 (JSON Tag) 零代码,维护成本低,性能最好。
逻辑计算/脱敏/组装 方法一 (重写 PageTo) 控制力最强,完全掌握数据流向,符合 Go 语言习惯。
框架支持回调 方法三 (函数注入) 代码最优雅,但依赖框架本身的支持。
对于大多数业务场景,方法一(重写 PageTo) 是最稳妥且通用的选择。