goweb3系列解析9: goweb 模块解析goweb 是 goweb3 项目的核心 Web 框架模块,提供了数据库访问、分页查询、ES 搜索、Web 请求处理等一站式解决方案。

发布时间:2026/6/7 11:47:34

goweb3系列解析9: goweb 模块解析goweb 是 goweb3 项目的核心 Web 框架模块,提供了数据库访问、分页查询、ES 搜索、Web 请求处理等一站式解决方案。 goweb 模块解析goweb是 goweb3 项目的核心 Web 框架模块提供了数据库访问、分页查询、ES 搜索、Web 请求处理等一站式解决方案。一、模块架构plainTextgoweb/ ├── base/ # 基础常量定义 ├── dbmeta/ # 数据库元数据管理 ├── dto/ # 数据传输对象 ├── generaldb/ # 通用数据库访问层 │ ├── dbconsts/ # 数据库常量 │ ├── dbreq/ # 数据库请求封装 │ ├── generaldao/ # 通用 DAO 层核心 │ ├── generaliface/ # 接口定义 │ ├── generalservice/ # 通用 Service 层 │ └── generalweb/ # 通用 Web 控制层 ├── iface/ # 公共接口 ├── mapper/ # 对象映射器 ├── meta/ # 元数据管理 │ └── db/ # 数据库元数据 ├── model/ # 模型定义 ├── page/ # 分页基础组件 ├── pageclient/ # 分页客户端 ├── pagedb/ # 分页数据库查询核心 │ ├── automigrate/ # 自动迁移 │ ├── pagedbrequest/ # 分页请求处理 │ └── pagesql/ # SQL 分页 ├── pagees/ # ES 分页查询 ├── pagefacade/ # 分页门面 ├── pagemodel/ # 分页模型 ├── pagerequest/ # 分页请求定义 ├── rightdb/ # 权限数据库 ├── ruleengine/ # 规则引擎 └── webclient/ # Web 客户端 ├── dbwebclient/ # 数据库 Web 客户端 └── eswebclient/ # ES Web 客户端二、核心组件详解1. BaseDao - 通用 DAO 层gotype BaseDao[P generaliface.GoPkey, E generaliface.IBaseModel[P]] struct { *GobaseDao[P, E] ifDebug bool FillRows generaliface.FillRows[E] // 批量填充函数 FillRow generaliface.FillRow[E] // 单条填充函数 Fills generaliface.Fills[E] // 填充器 *pagedbrequest.PageDbRequest // 分页请求 }核心功能功能类别方法说明CRUDInsert,Update,DeleteById,FindById基础增删改查批量操作CreateInBatches,UpdateMap批量插入、批量更新分页查询QueryModel,List,QueryModelAll支持分页的查询缓存支持CacheListAll,CacheFindId,FindByIdAtCache内置缓存机制聚合统计DbGroupStat,DbGroupStatsGroup by 统计事务支持Transaction事务管理数据填充Fill,FillRows,FillRow查询后数据填充数据库切换gofunc (self *BaseDao[P, E]) InitFuncGetDbPlatform() // 切换到平台库 func (self *BaseDao[P, E]) InitFuncGetDbHrms() // 切换到 HRMS 库 func (self *BaseDao[P, E]) InitFuncGetDbDongxw() // 切换到东信微库 func (self *BaseDao[P, E]) InitFuncGetDbHongld() // 切换到宏力达库 func (self *BaseDao[P, E]) InitFuncGetDbRuoyi() // 切换到若依库2. PageDbRequest - 分页数据库请求gotype PageDbRequest struct { *page.PageRequest TableName string // 表名 PkeyField string // 主键字段 SubTable *jointable2.SubTableDto // 子表关联 tabler schema.Tabler models any ichubConfig *ichubconfig.IchubConfig metadataFactroy *service.MetadataFactroy }多数据库支持gofunc Default() *PageDbRequest // 默认数据库 func DefaultPg() *PageDbRequest // PostgreSQL func DefaultMysql() *PageDbRequest // MySQL func DefaultCms() *PageDbRequest // CMS 数据库 func DefaultHub() *PageDbRequest // Hub 数据库 func DefaultCockDb() *PageDbRequest // CockroachDB查询方法gofunc (self *PageDbRequest) GeneralQuery() *page.PageResult // 通用查询 func (self *PageDbRequest) DbQuery() *page.PageResult // 数据库查询 func (self *PageDbRequest) JoinQueryModel(models any) *page.PageResult // 联表查询 func (self *PageDbRequest) GroupStat(groupFields, statfield string, ...) ([]map[string]any, error) // 分组统计3. PageResult - 分页结果模型gotype PageResult[T any] struct { baseconfig.IchubClientDto *page.PageResult Data []T json:data }核心方法gofunc PageOk[T any](data []T) *PageResult[T] // 成功结果 func PageFail[T any](msg string) *PageResult[T] // 失败结果 func PageError[T any](err error) *PageResult[T] // 错误结果 func (self *PageResult[T]) FromPageResult(ret *page.PageResult) *PageResult[T] // 转换 func (self *PageResult[T]) ExistRecord() bool // 判断是否有数据 func (self *PageResult[T]) Map(fieldsNames ...string) *PageResult[*map[string]any] // 字段映射 func (self *PageResult[T]) MapPage(mappper mapper.Mapper) *PageResult[any] // 对象映射三、数据查询流程plainText┌─────────────────────────────────────────────────────────────────┐ │ goweb 数据查询流程 │ ├─────────────────────────────────────────────────────────────────┤ │ UI 请求 │ │ │ │ │ ▼ │ │ PageDbRequest │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ 1. InitFields() - 初始化字段 │ │ │ │ │ 2. CountTable() - 统计总数 │ │ │ │ │ 3. FindRecords() - 查询数据 │ │ │ │ │ 4. 处理子表IfSubTable │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ BaseDao │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ 1. QueryModel() - 构建查询 │ │ │ │ │ 2. List() - 执行分页查询 │ │ │ │ │ 3. Fill() - 数据填充可选 │ │ │ │ │ 4. 缓存处理可选 │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ PageResult │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ 1. FromPageResult() - 结果转换 │ │ │ │ │ 2. Map() - 字段过滤 │ │ │ │ │ 3. MapPage() - 对象映射 │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ UI 响应 │ └─────────────────────────────────────────────────────────────────┘四、核心设计模式1. 泛型 DAO 模式gotype BaseDao[P generaliface.GoPkey, E generaliface.IBaseModel[P]] struct { // P: 主键类型 (int64, int32, string) // E: 实体类型 } // 使用示例 type UserDao struct { *generaldao.BaseDao[int64, *User] }2. 链式调用go// 构建复杂查询 dao : generaldao.Default64[*User]() result : dao.DbEq(status, 1).DbLike(name, %test%).QueryModel()3. 数据填充模式gotype UserDao struct { *generaldao.BaseDao[int64, *User] } func NewUserDao() *UserDao { dao : UserDao{ BaseDao: generaldao.Default64[*User](), } // 设置填充函数 dao.FillRow func(u *User) { // 填充关联数据 u.Department findDepartmentById(u.DeptId) } return dao }4. 多数据库切换godao : generaldao.Default64[*User]() dao.InitFuncGetDbPlatform() // 切换到平台数据库 result : dao.QueryModel()五、扩展能力1. 联表查询gotype PageDbRequest struct { JoinTables *jointable.JoinTables } // 使用示例 req : pagedbrequest.Default() req.WithTable(users).WithJoins(left join dept on users.dept_id dept.id) result : req.JoinQueryModel(users)2. 子表查询goreq : pagedbrequest.Default() req.NewSubTable() req.SubTable.TableName orders req.SubTable.FieldsName id,user_id,amount req.SubTable.JoinKeys map[string]string{id: user_id} result : req.GeneralQuery()3. 聚合统计goreq : pagedbrequest.Default() req.TableName orders req.DbEq(status, 1) stats, err : req.GroupStat(create_time, amount)六、依赖关系plainTextgoweb ├── goconfig/base # 基础工具 ├── goconfig/dbcontent # 数据库连接 ├── goconfig/ichubconfig # 配置管理 ├── goconfig/gocache # 缓存支持 ├── goconfig/ichublog # 日志支持 ├── gorm # ORM 框架 ├── gogf/gconv # 类型转换 └── samber/lo # 工具函数七、使用示例1. 基础查询go// 创建 DAO dao : generaldao.Default64[*User]() // 简单查询 result : dao.DbEq(status, 1).QueryModel() // 条件查询 result : dao.DbLike(name, %张%).DbGt(age, 18).QueryModel() // 获取单条 result : dao.FindByIdResult(1)2. 分页查询godao : generaldao.Default64[*User]() dao.Page(10, 1) // 每页10条第1页 result : dao.QueryModel() // 总页数 totalPages : result.TotalPages // 当前页数据 data : result.Data3. 聚合统计godao : generaldao.Default64[*Order]() dao.DbBetweenDateRange(create_time, dateRange) stats : dao.DbGroupStats2PageRet(department_id, amount)4. 缓存查询godao : generaldao.Default64[*User]() // 带缓存的查询 result : dao.CacheFindId(1) // 先查缓存再查数据库八、设计亮点特性实现方式优势类型安全Go 泛型编译时类型检查链式调用返回*BaseDao流畅的 API多库支持InitFuncGetDbXxx()灵活切换数据源缓存集成内置缓存方法减少数据库压力数据填充FillRows/FillRow查询后自动填充关联数据联表支持JoinTables支持复杂查询分页统一PageResult统一的分页结果格式

相关新闻