goweb3系列解析7: gotool解析 gotool 模块解析gotool是 goweb3 项目的核心工具模块提供 UI 查询框架、数据权限过滤、报表导出、数据库连接等基础设施能力是业务层与数据层之间的桥梁。一、模块架构plainTextgotool/ ├── dbframe/ # 数据库框架 │ ├── uipage/ # UI 分页查询 │ │ └── ui_page.go # 泛型分页查询基类 │ ├── uiframe/ # UI 查询框架 │ │ ├── query_request.go # 查询请求封装 │ │ └── query_param.go # 查询参数定义 │ └── dbaudit/ # 审计模型 ├── dbscope/ # 数据权限 │ ├── data_scope_filter.go # 权限过滤器 │ └── data_scope_auth.go # 权限认证 ├── goreport/ # 报表导出 │ ├── goexcelframe/ # Excel 框架 │ │ ├── goexcel_frame.go # 导出框架 │ │ ├── goexcel_style.go # 样式定义 │ │ └── goexcel_template.go # 模板处理 │ └── gomodel/ # 报表模型 ├── dbjoinclickhouse/ # ClickHouse 连接 ├── dbjoinsimple/ # 简单连接 ├── apitype/ # API 类型定义 │ ├── period_type.go # 周期类型 │ └── object_type.go # 对象类型 └── pagedao/ # 分页 DAO依赖 goweb二、核心组件详解1. UiPageQuery - 泛型分页查询基类gotype UiPageQuery[Q any, E generaliface.IBaseModel[int64], R any] struct { *pagedao.PageDao[int64, E] // 分页 DAO uiframe.QueryParam // 查询参数页码、大小、排序等 Query Q // 查询条件泛型 Param E // 查询参数实体 beforQuery func() // 查询前钩子 DataScopeFilter *dbscope.DataScopeFilter // 数据权限过滤器 }核心方法方法功能InitDao()初始化 DAO、参数、排序BuildRequest()构建查询请求BuildOrderBys()解析排序参数QueryModel()执行查询List()完整查询流程构建查询填充UiQueryModel()UI 查询入口查询流程gofunc (self *UiPageQuery[Q, E, R]) List() *pagemodel.PageResult[E] { // 1. 构建请求初始化 DAO、分页、排序 self.BuildRequest() // 2. 执行前置钩子 self.BeforeQuery()() // 3. 默认排序 if !self.IfOrderBys() { self.OrderByDesc(id) } // 4. 执行查询 var ret self.QueryModel() // 5. 填充关联数据 lo.ForEach(ret.Data, func(item E, index int) { item.Fill() }) return ret }2. UiQueryRequest - 通用查询请求gotype UiQueryRequest[P generaliface.GoPkey, E generaliface.IBaseModel[P]] struct { *pagedao.PageDao[P, E] QueryParam Param E QueryDbName string // 指定查询数据库 beforQuery func() PageFacadeConvert pagefacade.PagePtrFacade[E, E] }扩展功能方法功能Ret2KeyMap()结果转 Map主键为 KeyExportFile2Ret()导出 ExcelExportDefault()默认导出ParseTable()解析报表配置3. DataScopeFilter - 数据权限过滤器gotype DataScopeFilter struct { basedto.BaseEntitySingle }数据权限类型权限类型常量说明平台全部DataScopePlatAll可查看所有数据OPC自身DataScopeOpcOnly仅查看所属 OPC 数据OPC及子级DataScopeOpcChild查看 OPC 及子 OPC 数据个人DataScopeSelf仅查看自己创建的数据自定义DataScopeCustom自定义权限范围权限应用流程gofunc (self *DataScopeFilter) ApplyScope(pageDbRequest *pagedbrequest.PageDbRequest, user *learnentity.Users) error { // 1. 用户转权限 var scope self.User2Scope(user) // 2. 应用权限过滤 err : self.ApplyPage(pageDbRequest, scope) return err } func (self *DataScopeFilter) ApplyPage(pageDbRequest *pagedbrequest.PageDbRequest, scope *DataScopeAuth) error { switch scope.DataScope { case apitype.DataScopePlatAll: // 无过滤 case apitype.DataScopeOpcOnly: pageDbRequest.DbEq(opc_id, scope.OpcId) case apitype.DataScopeOpcChild: pageDbRequest.DbIn(opc_id, opcIds...) case apitype.DataScopeSelf: pageDbRequest.DbEq(opc_id, scope.OpcId) pageDbRequest.DbEq(userColumn, scope.UserId) case apitype.DataScopeCustom: pageDbRequest.DbIn(opcColumn, scope.ScopeCustom.OpcIds...) pageDbRequest.DbIn(userColumn, scope.ScopeCustom.UserIds...) } }4. GoexcelFrame - Excel 导出框架gofunc (self *UiQueryRequest[P, E]) ExportFile2Ret(c *gin.Context, ireportTable gotag2.IreportTable) *pagemodel.PageResult[E] { // 1. 解析报表配置 self.ParseTable(ireportTable) // 2. 查询数据 var ret self.QueryModel2Report(ireportTable.GetPageSize()) // 3. 导出 Excel var expRet goexcelframe.FindBeanGoexcelFrame().ExportFile2Ret(c, ret.MapDefault().Data, ireportTable) return ret }三、查询参数结构QueryParam - 查询参数基类gotype QueryParam struct { PageCurrent int json:pageCurrent // 当前页码 PageSize int json:pageSize // 每页大小 OrderBys string json:orderBys // 排序字段格式: field|asc,field2|desc Keyword string json:keyword // 关键词 KeywordFields string json:keywordFields // 关键词搜索字段 JoinTables *jointable.JoinTables json:- // 联表配置 IfAgg bool json:- // 是否聚合 }四、设计亮点特性实现方式优势泛型支持UiPageQuery[Q, E, R]三泛型类型安全支持任意查询/实体/结果类型数据权限DataScopeFilter DataScopeAuth统一权限控制支持多种权限类型前置钩子beforQuery 回调查询前自定义逻辑报表导出集成 goexcelframe一键导出 Excel联表查询JoinTables 配置支持复杂多表关联自动填充item.Fill()调用查询后自动填充关联数据五、使用示例1. 基础分页查询gotype UserRequest struct { gotool.UiPageQuery[UserQuery, UserEntity, UserDto] } func (req *UserRequest) List() *pagemodel.PageResult[UserEntity] { req.BuildRequest() // 添加自定义条件 if req.Query.Name ! { req.DbLike(name, req.Query.Name) } return req.UiQueryModel() }2. 带数据权限查询gofunc (req *UserRequest) ListWithScope(user *Users) *pagemodel.PageResult[UserEntity] { req.BuildRequest() // 应用数据权限 req.DataScopeFilter.ApplyScope(req.PageDb, user) return req.UiQueryModel() }3. Excel 导出gofunc (req *UserRequest) Export(c *gin.Context) *pagemodel.PageResult[UserEntity] { return req.ExportDefault(c) }4. 联表查询gofunc (req *UserRequest) JoinList() *pagemodel.PageResult[UserDto] { req.JoinTables jointable.JoinTables{ Select: u.*, d.department_name, Joins: []jointable.JoinItem{ {Table: departments d, On: d.id u.department_id}, }, } return req.JoinQueryModel() }六、典型应用场景后台管理列表分页查询、排序、关键词搜索数据权限控制根据用户角色过滤数据报表导出一键导出 Excel联表查询多表关联查询批量操作结合 batchframe 进行批量处理七、依赖关系plainTextgotool ├── goweb/pagedao # 分页 DAO ├── goweb/pagemodel # 分页模型 ├── goweb/generaldb # 通用数据库操作 ├── goconfig/base # 基础工具 └── gotool/dbscope # 数据权限