news 2026/5/15 0:32:25

GoTrain 项目开发指南项目架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GoTrain 项目开发指南项目架构

GoTrain 项目开发指南

1 make code table=users 2 cd ./goapi/data/code/internal/dbentity 3 copy entity ,dao至beapi dbdao dbentity 4 ai生成uiTableRequest 对于公共代码可以开发 apiservice apifacade domainfacade 5 ai生成TableController 6 编写swag 7 测试 8 make doc生成文档 9 make dev安装

GoTrain项目开发指南摘要:本项目采用分层架构设计,包含API核心模块和Web控制器模块。开发流程包括:1)使用makecode命令生成实体代码;2)迁移代码至正式目录;3)生成UI请求对象;4)创建Controller;5)编写Swagger文档;6)单元测试;7)生成API文档;8)安装运行。项目遵循标准化规范,提供代码生成模板和依赖注入机制,支持分页查询、排序、导出等通用功能。通过分层设计(DAO层、API服务层、控制器层)实现业务逻辑解耦,提高开发效率和代码可维护性。

项目架构概述

本项目采用分层架构设计,遵循 Clean Architecture 原则,整体结构如下:

plainText

├── beapi/ # API 核心模块 │ ├── data/code/internal/dbentity/ # 代码生成临时目录 │ ├── db/ # 数据访问层 │ │ ├── dbdao/ # DAO 层(数据访问对象) │ │ ├── dbentity/ # 数据库实体 │ │ ├── apiservice/ # API 服务层 │ │ └── apiface/ # API 接口定义 │ ├── trainframe/ # 业务框架 │ │ ├── service/ # 业务服务层 │ │ └── repository/ # 数据仓库层 │ └── webframe/ # Web 框架基础设施 └── beweb/ # Web 控制器模块 └── webctl/ # REST API 控制器

开发流程指南

1. 代码生成:根据数据库表生成实体代码

命令执行:

bash

make code table=users

作用:根据数据库表结构自动生成实体类和基础 DAO 代码,输出到beapi/data/code/internal/dbentity/目录。

生成文件示例:

  • users.go- 实体类定义(包含字段映射、表名、主键等)
  • users_dao.go- DAO 数据访问对象
  • users_init.go- 依赖注入初始化文件

实体类结构示例:

go

type Users struct { basedto.BaseEntity Id int64 `json:"id,string" gorm:"primaryKey"` Name string `json:"name" gorm:"column:name"` Phone string `json:"phone" gorm:"column:phone"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` } func (u *Users) TableName() string { return "users" } func (u *Users) PkeyName() string { return "id" }

2. 代码迁移:复制生成的代码到正式目录

命令执行:

bash

cd ./beapi/data/code/internal/dbentity

手动复制操作:

源文件目标目录说明
users.gobeapi/db/dbentity/userentity/实体类
users_dao.gobeapi/db/dbdao/userdao/DAO 层
users_init.gobeapi/db/dbentity/userentity/初始化文件
users_dao_init.gobeapi/db/dbdao/userdao/DAO 初始化文件

3. 生成 UI 请求对象:ai生成uiTableRequest

设计原则:

  • 请求对象用于接收前端查询参数
  • 继承基础分页查询结构
  • 支持关键字搜索、字段过滤、排序等

示例结构:

go

type UiUsersRequest struct { basedto.BaseEntity Name string `json:"name"` // 用户姓名 Phone string `json:"phone"` // 手机号 UserType int32 `json:"userType"` // 用户类型 PageNum int `json:"pageNum"` // 页码 PageSize int `json:"pageSize"` // 每页数量 OrderBy string `json:"orderBy"` // 排序字段 SortBy string `json:"sortBy"` // 排序方向(asc/desc) }

创建位置:beweb/uipage/uitrain/ui_users_request.go


4. 生成 Controller:ai生成TableController

Controller 设计规范:

go

type UsersController struct { userService serviceuser.UserService ctlbase.BaseController basedto.BaseEntitySingle } func DefaultUsersController() webfacade.Controller { return &UsersController{ userService: serviceuser.FindBeanuserService(), } } // RegisterRoute 注册路由 func (c *UsersController) RegisterRoute(api *gin.RouterGroup) { api.GET("/users", c.List) api.GET("/users/:id", c.Get) api.POST("/users", c.Create) api.PUT("/users/:id", c.Update) api.DELETE("/users/:id", c.Delete) }

创建位置:beweb/webctl/ctluser/users_controller.go


5. 编写 Swagger 文档注释

Swagger 注解规范:

go

// @Summary 获取用户列表 // @Description 根据条件分页查询用户列表 // @Produce json // @Tags 用户管理 // @Security JWT // @Param name query string false "用户姓名" // @Param phone query string false "手机号" // @Param pageNum query int false "页码" default(1) // @Param pageSize query int false "每页数量" default(20) // @Success 200 {object} common.Response{data=common.PaginationResult{list=[]entityuser.Users}} // @Router /api/v1/users [get] func (c *UsersController) List(ctx *gin.Context) { // ... }

Swagger 注解说明:

注解说明示例
@Summary接口摘要获取用户列表
@Description接口描述详细说明
@Produce响应格式json
@Tags分组标签用户管理
@Security安全认证JWT
@Param请求参数name query string
@Success成功响应200 {object} Response
@Router路由路径/api/v1/users [get]

6. 测试

单元测试规范:

go

func TestUsersController_List(t *testing.T) { ctrl := DefaultUsersController() req := &apimodel.QueryUserRequest{ ObjectId: "test", } result := ctrl.userService.QueryUsers(req) assert.NotNil(t, result) assert.True(t, result.Success) }

测试命令:

bash

go test -v ./beweb/webctl/ctluser/... -run TestUsersController

7. 生成 API 文档

命令执行:

bash

make doc

作用:使用 Swaggo 生成 OpenAPI 文档

生成产物:

  • trainplat/server/docs/docs.go- Swagger 文档定义
  • 访问地址:http://localhost:8080/swagger/index.html

8. 开发环境安装

命令执行:

bash

make dev

作用:

  • 安装所有依赖包
  • 编译项目
  • 启动开发服务器

启动命令:

bash

go run trainplat/server/main.go

服务访问:

  • API 地址:http://localhost:8080/api/v1/
  • Swagger 文档:http://localhost:8080/swagger/index.html

公共代码开发建议

apiservice - API 服务层

用于封装复杂业务逻辑,作为 Controller 和 Repository 之间的桥梁。

go

type UserApiService struct { basedto.BaseEntitySingle userRepository reposuser.UserRepository } func (s *UserApiService) GetUserInfo(userId int64) (*userentity.Users, error) { // 组合多个 Repository 操作 user, err := s.userRepository.FindById(userId) if err != nil { return nil, err } // 添加额外业务逻辑 return user, nil }

apifacade - API 门面层

提供统一的 API 入口,聚合多个服务。

go

type ApiFacade struct { userService serviceuser.UserService creditService servicecredit.CreditService planService serviceplan.PlanService } func (f *ApiFacade) CreateUser(ctx context.Context, user *entityuser.User) (*entityuser.User, error) { // 事务处理 // 调用多个服务 return user, nil }

domainfacade - 领域门面层

封装领域业务规则,供多个模块复用。

go

type DomainFacade struct { basedto.BaseEntitySingle } func (f *DomainFacade) ValidateUserRole(user *entityuser.User, role string) bool { // 领域规则验证 return strings.Contains(user.RelRole, role) }

文件命名规范

类型命名规则示例
实体类首字母大写单数Users,Student
DAO实体名 + DaoUsersDao
Service实体名 + ServiceUserService
Controller实体名 + ControllerUsersController
请求DTOUi + 实体名 + RequestUiUsersRequest
响应DTO实体名 + ResultUsersResult

依赖注入规范

所有服务需提供初始化函数:

go

// 用户服务初始化 func init() { godi.RegisterBean("UserService", NewUserService) } func FindBeanUserService() *UserService { return godi.FindBean[*UserService]("UserService") }

代码提交规范

bash

# 提交格式 git commit -m "feat: 添加用户查询接口" git commit -m "fix: 修复用户创建失败问题" git commit -m "docs: 更新API文档" git commit -m "refactor: 重构用户服务"

总结

本项目采用标准化的代码生成和开发流程,核心步骤为:

  1. 代码生成make code table=xxx
  2. 代码迁移→ 复制到正式目录
  3. 生成请求对象UiXXXRequest
  4. 生成控制器XXXController
  5. 编写文档→ Swagger 注解
  6. 测试验证→ 单元测试
  7. 生成文档make doc
  8. 部署运行make dev

通过遵循以上规范,可以高效、规范地完成业务功能开发。

根据查看的代码结构,我需要创建一个继承uiframe.UiSimpleRequestUiUsersRequest

go

package uiframe import ( "gitea.super-study.com/ys-study/gotrain/beapi/db/dbentity/userentity" ) // UiUsersRequest 用户列表查询请求 // 继承 UiSimpleRequest,支持通用的分页、排序、搜索功能 type UiUsersRequest struct { *UiSimpleRequest[int64, *userentity.Users] } // NewUiUsersRequest 创建用户查询请求实例 func NewUiUsersRequest() *UiUsersRequest { return &UiUsersRequest{ UiSimpleRequest: NewUiSimpleRequest[int64, *userentity.Users](), } } // BuildQuery 构建查询条件 func (self *UiUsersRequest) BuildQuery() *UiUsersRequest { self.UiSimpleRequest.BuildRequest() return self } // List 执行查询并返回结果 func (self *UiUsersRequest) List() *PageResult[*userentity.Users] { return self.UiSimpleRequest.List() }

说明:

方法功能说明
NewUiUsersRequest()创建查询请求实例,自动初始化 DAO 和参数
BuildQuery()构建查询条件(分页、排序等)
List()执行查询,返回分页结果
继承自UiSimpleRequest支持排序、分页、搜索、导出等通用功能

使用示例:

go

// 创建查询请求 req := NewUiUsersRequest() // 设置查询条件 req.DbEq("user_type", 20) // 查询学员 req.DbLike("name", "张") // 姓名包含"张" req.OrderByDesc("created_at") // 执行查询 result := req.List() // 导出Excel req.ExportDefault(ctx)

继承的通用功能:

  • 分页查询(PageSize, PageCurrent)
  • 排序支持(OrderBys)
  • 关键字搜索(Keyword)
  • Excel/PDF/HTML 导出
  • 数据权限过滤(DataScopeFilter)

请将此代码保存到beapi/gotool/dbframe/uiframe/ui_users_request.go文件中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 0:21:21

2025最权威的六大降AI率工具横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 具备强大功能的降AI功耗优化工具,可针对主流AI推理场景,显著降低运行…

作者头像 李华
网站建设 2026/5/15 0:20:47

为内部知识库问答系统集成Taotoken的多模型能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答系统集成Taotoken的多模型能力 在构建企业级智能客服或内部知识库系统时,一个核心挑战是如何平衡回答…

作者头像 李华
网站建设 2026/5/15 0:17:47

5分钟搭建个人小说图书馆:可扩展通用型小说下载器终极指南

5分钟搭建个人小说图书馆:可扩展通用型小说下载器终极指南 【免费下载链接】novel-downloader 一个可扩展的通用型小说下载器。 项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 你是否曾因小说网站突然404而懊恼?是否想在网络不佳…

作者头像 李华
网站建设 2026/5/15 0:16:14

UVa 225 Golygons

题目分析 Golygon\texttt{Golygon}Golygon 是一种特殊的网格路径,它从原点 (0,0)(0,0)(0,0) 出发,第一步走 111 个单位,第二步走 222 个单位,依此类推,第 nnn 步走 nnn 个单位,且每一步必须向左转或向右转 …

作者头像 李华
网站建设 2026/5/15 0:11:03

如何快速整理桌面窗口:3个高效管理秘诀让工作区更清爽

如何快速整理桌面窗口:3个高效管理秘诀让工作区更清爽 【免费下载链接】traymond A simple Windows app for minimizing windows to tray icons 项目地址: https://gitcode.com/gh_mirrors/tr/traymond 你是否经常因为任务栏拥挤而找不到关键窗口&#xff1f…

作者头像 李华