goweb3系列解析19:goDomain 目录解析domain
goweb3项目的domain目录是业务领域层采用分层架构设计包含核心组件和功能模块。目录结构清晰划分了初始化入口、API工具、Web控制器基类、服务基类、数据库和ES领域等模块。核心组件包括初始化入口(Init.go)、基础控制器(BaseController)、基础服务(BaseService)等提供参数解析、请求验证、缓存管理、日期处理等通用能力。数据库领域包含实体层、DAO层、DTO层和门面层ES领域实现索引管理和搜索服务。架构采用Controller→Service→DAO→Entity分层模式支持多数据源和自动迁移。设计特点包括分层架构、基类封装、依赖注入和缓存支持为业务开发提供标准化框架和基础能力。Domain 目录解析domain目录是 goweb3 项目的业务领域层包含业务逻辑、数据访问、Web 控制器等核心组件采用分层架构设计。一、目录结构plainTextdomain/ ├── Init.go # 领域层初始化入口 ├── apiutils/ # API工具函数 │ └── apiutils.go ├── apiconsts/ # API常量定义 │ └── apiconsts.go ├── apifacade/ # API门面对外统一入口 │ └── 1.go ├── baseweb/ # Web基础组件 │ ├── BaseController.go # 控制器基类 │ ├── BaseWeb.go # Web基础类 │ └── base_controller_init.go ├── baseservice/ # 服务基础组件 │ └── BaseService.go # 服务基类 ├── db/ # 数据库领域 │ ├── InitDb.go # 数据库初始化 │ ├── dbentity/ # 数据库实体 │ │ ├── learnentity/ # 学习实体 │ │ ├── sys_menu.go │ │ ├── t_sys_user.go │ │ └── ... │ ├── dbdao/ # 数据访问对象 │ │ ├── users_dao.go │ │ ├── t_sys_user_dao.go │ │ └── ... │ ├── dbdto/ # 数据传输对象 │ │ ├── ui_student.go │ │ ├── TrialReservation.go │ │ └── ... │ ├── dbfacade/ # 数据库门面 │ │ ├── userfacade.go │ │ └── ... │ ├── dbiface/ # 数据库接口 │ │ └── migrate.go │ └── uipage/ # UI分页查询 │ ├── user_request.go │ ├── uiquery_student.go │ └── ... ├── es/ # Elasticsearch领域 │ ├── InitEs.go # ES初始化 │ ├── esentity/ # ES实体 │ │ ├── service_website.go │ │ ├── sys_dept_es.go │ │ └── ... │ └── esservice/ # ES服务 │ ├── service_perform_month_es.go │ └── ... ├── internal/ # 内部模块 │ ├── db/ # 内部数据库模块 │ │ ├── web/ # Web控制器 │ │ ├── gorpc/ # gRPC服务 │ │ └── test/ # 测试用例 │ └── es/ # 内部ES模块 │ └── basedao/ # ES基础DAO └── pageui/ # UI页面模块 ├── ui dto/ # UI数据传输对象 ├── uirequest/ # UI请求定义 ├── uiexample/ # UI示例 ├── uiclickhouse/ # ClickHouse UI查询 └── ...二、核心组件解析1. 初始化入口domain/Init.go- 领域层统一初始化gofunc Init() error { golog.Info(init db es) // 初始化数据库 var err db.InitDb() if err ! nil { return err } // 初始化Elasticsearch return es.InitEs().Result2Error() }db/InitDb.go- 数据库初始化gofunc InitDb() error { golog.Info(init db) ichubconfig.FindBeanIchubConfig().CheckSoftwareEnv() initCommon() return dbiface.AutoMigrate() }es/InitEs.go- ES初始化gofunc InitEs() *basedto.IchubResult { var ret esentity.NewWebFacadeServiceWebsite().CreateIndexIfNotExist() if ret ! nil { return ret } es.NewWebFacadeServicePerformMonthEs().CreateIndexIfNotExist() return esservice.NewWebFacadeServicePerformMonthEs().CreateIndexesIfNotExist() }2. 基础控制器层baseweb/BaseController.go- Web控制器基类gotype BaseController struct { basedto.BaseEntitySingle BaseWeb } // 参数获取方法 func (self *BaseController) GetParam2Int64(c *gin.Context, key string) int64 func (self *BaseController) GetParam2Str(c *gin.Context, key string) string func (self *BaseController) GetQuery2Int64(c *gin.Context, key string) int64 func (self *BaseController) GetQuery2Bool(c *gin.Context, key string) boolbaseweb/BaseWeb.go- Web基础类gotype BaseWeb struct { baseservice.BaseService }职责参数解析URL参数、Query参数请求验证响应封装继承BaseService获得业务能力3. 基础服务层baseservice/BaseService.go- 服务基类gotype BaseService struct {} // 请求解析 func (self *BaseService) ParseBody(ctx *gin.Context, req any) error func (self *BaseService) ParseBodyOnly(ctx *gin.Context, dto any) error // 缓存操作 func (self *BaseService) GetCache(key string) (any, bool) func (self *BaseService) SetCache(key string, v any) func (self *BaseService) SetCache5M(key string, v any) func (self *BaseService) SetCache2Hour(key string, v any) // 日期处理 func (self *BaseService) TimeBetween2DateOnly(start, end time.Time) (time.Time, time.Time) func (self *BaseService) TimeMonthFirstLastDay(day time.Time) (time.Time, time.Time) func (self *BaseService) Datetime2DateStrTodayYesterday(day time.Time) (start, end string) // 响应处理 func (self *BaseService) ResFailUserMsg(c *gin.Context, msg string) func (self *BaseService) ResFailSystemMsg(c *gin.Context, msg string) // SQL执行 func (self *BaseService) ExecSql(sql string, params ...any) error职责请求体解析JSON - StructRedis缓存管理日期时间处理工具通用响应封装数据库原生SQL执行4. 数据库领域4.1 实体层 (dbentity)文件说明sys_menu.go系统菜单实体t_sys_user.go系统用户实体train_group_rest.go培训组休息实体learnentity/users.go学习用户实体4.2 DAO层 (dbdao)文件说明users_dao.go用户数据访问t_sys_user_dao.go系统用户DAOtrain_group_rest_dao.go培训组DAO4.3 DTO层 (dbdto)文件说明ui_student.go学生UI请求DTOTrialReservation.go试用预约DTOTrialTrain.go试用培训DTO4.4 门面层 (dbfacade)go// userfacade.go - 用户业务门面 type UserFacade struct { // 聚合用户相关业务 }4.5 UI分页查询 (uipage)go// uiquery_student.go - 学生分页查询 type UiQueryStudent struct { *pagedao.PageDao[int64, *Student] }5. Elasticsearch领域5.1 ES实体 (esentity)文件说明service_website.go网站服务ES实体sys_dept_es.go系统部门ES实体service_domain_es.go域名服务ES实体es_contact_person.go联系人ES实体5.2 ES服务 (esservice)文件说明service_perform_month_es.go月度绩效ES服务example_service.go示例服务6. 内部模块 (internal)plainTextinternal/ ├── db/ │ ├── web/ # Web控制器 │ │ ├── service_api_list_web.go │ │ └── coo_permission_web.go │ ├── gorpc/ # gRPC服务 │ │ ├── proto/ # 协议定义 │ │ └── service/ # RPC服务实现 │ └── test/ # 测试用例 │ ├── dao/ # DAO测试 │ └── service/ # 服务测试 └── es/ ├── basedao/ # ES基础DAO └── esmodel/ # ES模型7. UI页面模块 (pageui)子目录说明uidto/UI数据传输对象uirequest/UI请求定义uiexample/UI示例代码uiclickhouse/ClickHouse查询UI三、架构关系图plainText┌─────────────────────────────────────────────────────────────────┐ │ Domain 领域层 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ baseweb │ │ baseservice │ │ apiconsts │ │ │ │ (控制器基类) │ │ (服务基类) │ │ (API常量) │ │ │ └──────┬───────┘ └──────┬───────┘ └──────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌─────────────────────────────────────┐ │ │ │ 业务服务层 │ │ │ │ db/dbdao │ es/esservice │ api │ │ │ └─────────────────────────────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ dbentity │ │ esentity │ │ │ │ (数据库实体) │ │ (ES实体) │ │ │ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘四、分层职责层级职责核心文件Controller处理HTTP请求参数校验响应封装BaseController.goService业务逻辑处理事务管理数据转换BaseService.goDAO数据库访问CRUD操作users_dao.goEntity数据实体定义映射数据库表sys_menu.go,t_sys_user.goDTO数据传输对象请求/响应结构ui_student.goFacade业务门面聚合多个服务userfacade.goUIQuery分页查询封装uiquery_student.go五、初始化流程plainTextmain.go ↓ domain.Init() ↓ ├── db.InitDb() │ ↓ │ ├── CheckSoftwareEnv() # 检查环境配置 │ ├── initCommon() # 初始化公共实体 │ └── dbiface.AutoMigrate() # 自动迁移数据库表 │ └── es.InitEs() ↓ ├── CreateIndexIfNotExist() # 创建ES索引如不存在 └── CreateIndexesIfNotExist() # 批量创建索引六、使用示例1. 创建自定义控制器gotype UserController struct { baseweb.BaseController } func NewUserController() *UserController { return UserController{} } func (self *UserController) RegisterRoute(api *gin.RouterGroup) { api.GET(/users/:id, self.GetUser) api.POST(/users, self.CreateUser) } func (self *UserController) GetUser(c *gin.Context) { userId : self.GetParam2Int64Check(c, id) user : self.GetUserById(userId) c.JSON(200, user) }2. 创建自定义服务gotype UserService struct { baseservice.BaseService } func NewUserService() *UserService { return UserService{} } func (self *UserService) GetUserById(userId int64) *User { // 业务逻辑处理 cacheKey : fmt.Sprintf(user:%d, userId) if user, exist : self.GetCache(cacheKey); exist { return user.(*User) } // 查询数据库 user : self.queryUser(userId) // 缓存结果 self.SetCache(cacheKey, user) return user }七、设计特点特点说明分层架构Controller → Service → DAO → Entity基类封装提供通用能力减少重复代码依赖注入通过FindBeanXxx()获取组件实例自动迁移数据库表结构自动同步多数据源支持MySQL、PostgreSQL、ClickHouseES集成完整的Elasticsearch操作封装缓存支持内置Redis缓存管理八、目录职责总结目录职责状态baseweb/Web控制器基础能力核心baseservice/服务层基础能力核心db/dbentity/数据库实体定义业务db/dbdao/数据访问对象业务db/dbdto/数据传输对象业务db/dbfacade/业务门面聚合业务db/uipage/UI分页查询业务es/esentity/ES实体定义业务es/esservice/ES服务层业务internal/内部模块不对外暴露内部pageui/UI页面相关业务