返回介绍

代码生成器使用指南

发布于 2024-08-12 12:46:24 字数 45456 浏览 0 评论 0 收藏 0

2.5.3以后需先创造package

参考视频:https://www.bilibili.com/video/BV1kv4y1g7nT?p=3

代码生成器

最上方的点这里从现有数据库创建代码,可以选择数据库中的表,然后生成对应的代码。

image-20201026165650624

界面名称对应生成结构体结构体名称中文说明备注
Struct名称StructName结构体名称server/model 文件夹下的结构体文件中,结构体的名称,首字母必须大写
TableNameTableName指定表名(非必填)数据库中生成的与结构体对应的数据表名。
Struct简称Abbreviation简称会作为入参对象名和路由group用于结构体作为参数时的名称,以及路由 group 名称。这里一般与Stuct名称对应,但是首字母小写。
Struct中文名称Description中文描述作为自动api描述作为自动api描述,也是左侧菜单显示时的默认菜单名。
文件名称PackageName生成文件的默认名称使用 小驼峰 形式命名。生成后端代码时,model下的文件名会用这里的命名。
Package(包)Package生成的目标包必选,自动化代码会生成到所选的包下,自动填充enter.go等文件
业务库BusinessDB选择业务库可选,如果选中本条目,则自动生成的global.GVA_DB会被替换为global.MustGetGlobalDBByDBName(BusinessDb)。
使用GVA结构GvaModel使用GVA结构建议选中,如果不选则不会自动创建api表,需要自己去api管理里面手动增加对应路由。
创建资源标识AutoCreateResource创建资源标识可选,此功能需要配合插件市场的组织管理插件使用。
自动创建apiAutoCreateApiToSql自动创建api建议选中,把自动生成的API注册进数据库。
自动创建菜单AutoCreateMenuToSql自动创建菜单建议选中,把自动生成的菜单注册进数据库。
自动移动文件AutoMoveFile自动移动文件建议选中,自动迁移生成的文件到yaml配置的对应位置。

字段界面说明

image-20201026165813881

组件内容名称对应生成结构体结构体名称中文说明备注
Field名称FieldName结构体名称struct结构体中的字段名称,首字母大写
Field中文名FieldDesc结构体中文名称对应struct结构体tag中的comment字段值,也是数据列表展示表格的表头名称。
FieldJSONFieldJsongolang struct tag json对应struct结构体tag中的json字段值。在使用struct对象调用某个字段时,使用“对象.json字段值”
数据库字段名ColumnName数据库字段名对应数据库中的字段名称
Field数据类型FieldType字段对应golang数据类型对应struct结构体中的字段类型
数据库字段长度DataTypeLong字段数据类型长度对应生成的数据表中的字段长度
数据库字段描述Comment数据库字段描述数据库字段描述,会根据此属性生成前端表格的表头名称和表单的label名称
默认值DefaultValue数据库字段默认值当数据为空时,数据库录入时会自动以DefaultValue值进行填充
是否必填Require是否必填自动创建前后端必填校验
校验失败文案ErrorText必填校验失败的文案必填校验失败的文案
是否排序Sort是否排序自动创建前后端排序代码
前端可见Front前端可见前端是否创建本字端(常用于仅后端使用,前端不需要展示给用户的字段)
主键PrimaryKey数据库主键数据库主键,在不适用gva默认结构下,本字段会自动成为查询主要字段
是否可清空Clearableclearable前端输入框右侧是否出现X允许用户点击清空本字段已经输入过的内容
Field查询条件FieldSearchType搜索类型用于实现该对象数据列表的条件查询
关联字典DictType关联字典标记从字典功能中关联一个可用的字典进行数据操作,展示位下拉选择。
数据源配置dataSource:{table,label,value}数据源配置本功能用于产生一个关联字段,字段在前端展示位下拉选择(单选),字段来源取决于配置内容,数据源表为内容索取的表,展示用字段配置,则会从表取本字段用于前端下拉框的展示内容,存储用字段,则会从表取本字段用于选中后真实的赋值内容

1. 生成一步到位代码包

1.1 自行设计业务基础结构体模型

  • 点击左侧菜单中的 系统工具 → 代码生成器
  • 填写好 Struct名称 tableName Struct简称 Struct中文名称 文件名称 空格
  • 选择好 自动创建api 自动移动文件 按钮

  • 点击 新增Field 按钮,为数据表、struct结构体创建字段, 具体请看字段界面说明

1.2 从数据库的选择表进行生成结构体

  • 点击左侧菜单中的系统工具 > 代码生成器 ,代码生成器是用来生成CURD代码的。

  • 点击 点这里从现有数据库创建代码

  • image-20200915160906999

  • 选择 数据库名 以及 表名

  • image-20200915161618174

  • 点击使用此表创建

  • image-20200915161727520

  • 自行编辑好各个Filed的所需的搜索条件, 需要关联的字典, 或者其他自己要修改的地方点击编辑进行修改.

  • image-20200915161917791

1.3 点击生成代码按钮

注意

完成1.1或1.2步骤操作, 其中一个操作喔!

代码会自动移动到前后端你所创建的package文件夹下 前端分别会移动到 /api/${pageageName}/view/${pageageName} 下 后端分别会移动到 /api/${pageageName}/service/${pageageName}/router/${pageageName} 下、 /model/${pageageName}

提示

在创建自动化代码时候会自动创建enter.go 一下为关于enter.go的介绍

enter.go内部将所有的相关功能模块下的结构统一为一个总结构体,然后将可以通过new这个总结构体实现对本模块的所有结构统一实例化使用 我们此处仅以api下的system分类为例(其他模块操作类似 model模块无enter.go)

我们以system这个package为例

enter.go
  sys_api.go
  sys_authority.go
  sys_auto_code.go
  sys_auto_code_history.go
  sys_captcha.go
  sys_casbin.go
  sys_dictionary.go
  sys_dictionary_detail.go
  sys_initdb.go
  sys_jwt_blacklist.go
  sys_menu.go
  sys_operation_record.go
  sys_system.go
  sys_user.go

enter.go 文件中存在如下结构


package system

import "github.com/flipped-aurora/gin-vue-admin/server/service"


// 此处为功能模块的分组 表示我们这边是API模块 我们总结了当前目录下的所有结构体
type ApiGroup struct {
    DBApi    //这是当前分组下存在的模块 DBApi模块 就来自于 sys_initdb.go 下的 type DBApi struct{} 下方同理
    JwtApi
    BaseApi
    SystemApi
    CasbinApi
    AutoCodeApi
    SystemApiApi
    AuthorityApi
    DictionaryApi
    AuthorityMenuApi
    OperationRecordApi
    AutoCodeHistoryApi
    DictionaryDetailApi
}


// 此处是为了统一方便使用Service下的功能 因此统一获取做了拆解 方便api模块下所有的功能都可以通过调用此处的变量获取到对应的Service实例从而调用其方法
var (
    apiService              = service.ServiceGroupApp.SystemServiceGroup.ApiService 
    // apiService: 例如此处描述的就是 service包下的ServiceGroup示例下的SystemServiceGroup功能组的ApiService相关功能
    jwtService              = service.ServiceGroupApp.SystemServiceGroup.JwtService
    menuService             = service.ServiceGroupApp.SystemServiceGroup.MenuService
    userService             = service.ServiceGroupApp.SystemServiceGroup.UserService
    initDBService           = service.ServiceGroupApp.SystemServiceGroup.InitDBService
    casbinService           = service.ServiceGroupApp.SystemServiceGroup.CasbinService
    autoCodeService         = service.ServiceGroupApp.SystemServiceGroup.AutoCodeService
    baseMenuService         = service.ServiceGroupApp.SystemServiceGroup.BaseMenuService
    authorityService        = service.ServiceGroupApp.SystemServiceGroup.AuthorityService
    dictionaryService       = service.ServiceGroupApp.SystemServiceGroup.DictionaryService
    systemConfigService     = service.ServiceGroupApp.SystemServiceGroup.SystemConfigService
    operationRecordService  = service.ServiceGroupApp.SystemServiceGroup.OperationRecordService
    autoCodeHistoryService  = service.ServiceGroupApp.SystemServiceGroup.AutoCodeHistoryService
    dictionaryDetailService = service.ServiceGroupApp.SystemServiceGroup.DictionaryDetailService
)

这里我们介绍完了声明enter的过程 和使用其他包下enter的过程 然后我们找到实例化enter的过程

查看/server/api/v1/enter.go 这个文件


package v1

import (
    "github.com/flipped-aurora/gin-vue-admin/server/api/v1/autocode"
    "github.com/flipped-aurora/gin-vue-admin/server/api/v1/example"
    "github.com/flipped-aurora/gin-vue-admin/server/api/v1/system"
)

type ApiGroup struct {
    SystemApiGroup   system.ApiGroup
    ExampleApiGroup  example.ApiGroup
    AutoCodeApiGroup autocode.ApiGroup
}

// 我们在此处对上方前面做过的所有声明进行了总结并且实例化为App 其他包我们通过调用 v1.ApiGroupApp.xxxx组.xxx功能.xxx方法即可
var ApiGroupApp = new(ApiGroup)

手动添加自动化生成代码的方式也介绍完了,此模式方便大家模块化使用,看起来比较长,但是其便于对单一分类统一管理,创建同意方法等,同样也便于项目后期拓展维护。在后续迭代中不再痛苦。

1.4 预览代码

注意

此功能需要在 v2.3.9 之后的版本才会有喔, 不包含v2.3.9!

image-20210224151109195

效果预览

image-20210224151320620

2. 注册路由和数据库表

2.1 注册路由 (目前版本已可自动添加)

server/initialize/router.go

package initialize

import (
    _ "gin-vue-admin/docs"
    "gin-vue-admin/global"
    "gin-vue-admin/middleware"
    "gin-vue-admin/router"
    "github.com/gin-gonic/gin"
    "github.com/swaggo/gin-swagger"
    "github.com/swaggo/gin-swagger/swaggerFiles"
    "net/http"
)

// 初始化总路由

func Routers() *gin.Engine {
    Router := gin.Default()

    // 如果想要不使用nginx代理前端网页,可以修改 web/.env.production 下的
    // VUE_APP_BASE_API = /
    // VUE_APP_BASE_PATH = http://localhost
    // 然后执行打包命令 npm run build。在打开下面4行注释
    // Router.LoadHTMLGlob("./dist/*.html") // npm打包成dist的路径
    // Router.Static("/favicon.ico", "./dist/favicon.ico")
    // Router.Static("/static", "./dist/assets")   // dist里面的静态资源
    // Router.StaticFile("/", "./dist/index.html") // 前端网页入口页面

    Router.StaticFS(global.GVA_CONFIG.Local.Path, http.Dir(global.GVA_CONFIG.Local.Path)) // 为用户头像和文件提供静态地址
    // Router.Use(middleware.LoadTls())  // 打开就能玩https了
    global.GVA_LOG.Info("use middleware logger")
    // 跨域,如需跨域可以打开下面的注释
    // Router.Use(middleware.Cors()) // 直接放行全部跨域请求
    //Router.Use(middleware.CorsByRules()) // 按照配置的规则放行跨域请求
    global.GVA_LOG.Info("use middleware cors")
    Router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
    global.GVA_LOG.Info("register swagger handler")
    // 方便统一添加路由组前缀 多服务器上线使用

    // 获取路由组实例
    systemRouter := router.RouterGroupApp.System
    exampleRouter := router.RouterGroupApp.Example
    autocodeRouter := router.RouterGroupApp.Autocode
    // 来自router的enter.go
    PublicGroup := Router.Group("")
    {
        // 健康监测
        PublicGroup.GET("/health", func(c *gin.Context) {
            c.JSON(200, "ok")
        })
    }
    {
        systemRouter.InitBaseRouter(PublicGroup) // 注册基础功能路由 不做鉴权
        systemRouter.InitInitRouter(PublicGroup) // 自动初始化相关
    }
    PrivateGroup := Router.Group("")
    PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
    {
        systemRouter.InitApiRouter(PrivateGroup)                 // 注册功能api路由
        systemRouter.InitJwtRouter(PrivateGroup)                 // jwt相关路由
        systemRouter.InitUserRouter(PrivateGroup)                // 注册用户路由
        systemRouter.InitMenuRouter(PrivateGroup)                // 注册menu路由
        systemRouter.InitSystemRouter(PrivateGroup)              // system相关路由
        systemRouter.InitCasbinRouter(PrivateGroup)              // 权限相关路由
        systemRouter.InitAutoCodeRouter(PrivateGroup)            // 创建自动化代码
        systemRouter.InitAuthorityRouter(PrivateGroup)           // 注册角色路由
        systemRouter.InitSysDictionaryRouter(PrivateGroup)       // 字典管理
        systemRouter.InitAutoCodeHistoryRouter(PrivateGroup)     // 自动化代码历史
        systemRouter.InitSysOperationRecordRouter(PrivateGroup)  // 操作记录
        systemRouter.InitSysDictionaryDetailRouter(PrivateGroup) // 字典详情管理

        exampleRouter.InitExcelRouter(PrivateGroup)                 // 表格导入导出
        exampleRouter.InitCustomerRouter(PrivateGroup)              // 客户路由
        exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup) // 文件上传下载功能路由

        // Code generated by github.com/flipped-aurora/gin-vue-admin/server Begin; DO NOT EDIT.
        autocodeRouter.InitSysAutoCodeExampleRouter(PrivateGroup)
        // Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
    }

    InstallPlugin(PublicGroup, PrivateGroup) // 安装插件

    global.GVA_LOG.Info("router register success")
    return Router
}

2.2 注册数据库表 (目前版本已可自动添加)

server/initialize/gorm.go

将你的model结构配置进入 db.AutoMigrate()内部即可

package initialize

import (
    "os"

    "github.com/flipped-aurora/gin-vue-admin/server/global"
    "github.com/flipped-aurora/gin-vue-admin/server/model/autocode"
    "github.com/flipped-aurora/gin-vue-admin/server/model/example"
    "github.com/flipped-aurora/gin-vue-admin/server/model/system"

    "go.uber.org/zap"
    "gorm.io/gorm"
)

// Gorm 初始化数据库并产生数据库全局变量
// Author SliverHorn
func Gorm() *gorm.DB {
    switch global.GVA_CONFIG.System.DbType {
    case "mysql":
        return GormMysql()
    case "pgsql":
        return GormPgSql()
    default:
        return GormMysql()
    }
}

// RegisterTables 注册数据库表专用
// Author SliverHorn
func RegisterTables(db *gorm.DB) {
    err := db.AutoMigrate(
        // 系统模块表
        system.SysApi{},
        system.SysUser{},
        system.SysBaseMenu{},
        system.JwtBlacklist{},
        system.SysAuthority{},
        system.SysDictionary{},
        system.SysOperationRecord{},
        system.SysAutoCodeHistory{},
        system.SysDictionaryDetail{},
        system.SysBaseMenuParameter{},

        // 示例模块表
        example.ExaFile{},
        example.ExaCustomer{},
        example.ExaFileChunk{},
        example.ExaFileUploadAndDownload{},

        // 自动化模块表
        // Code generated by github.com/flipped-aurora/gin-vue-admin/server Begin; DO NOT EDIT.
        autocode.AutoCodeExample{},
        // Code generated by github.com/flipped-aurora/gin-vue-admin/server End; DO NOT EDIT.
    )
    if err != nil {
        global.GVA_LOG.Error("register table failed", zap.Error(err))
        os.Exit(0)
    }
    global.GVA_LOG.Info("register table success")
}

3.配置目录菜单

image-20210224143727296

进入系统 超级管理员 → 菜单管理 菜单,点击 新增根菜单 按钮,配置菜单信息。

  • 路由name:对应进入列表显示页面时的访问路径
  • 路由path:选中后边的“添加参数”后才可以输入,对应进入列表显示页面时访问路径后的参数,具体使用方式看视频
  • 是否隐藏:是否在系统左侧目录菜单显示时,隐藏掉该目录菜单
  • 父节点Id:该目录菜单的父级目录菜单。这里是自动填充的数据,不需要自己操作
  • 文件路径:对应前端项目中 /view/ PackageName (自建)/StructName.vue 文件
  • 展示名称:该目录菜单显示在系统左侧目录菜单中的名称
  • 图标:该目录菜单显示在系统左侧目录菜单中的图标
  • 排序标记:用于调整该目录菜单在系统左侧目录菜单中显示的上下位置
  • keepAlive:是否使用keepAlive缓存

以上配置好后,点击 确定 按钮,完成菜单配置。

4.配置后端接口

如果在第一步的自动创建api打钩了即可跳过此步

如果是自己写的业务代码,这里需要配置好后端接口。进入系统 超级管理员 → api管理 菜单,点击 新增api 按钮,配置接口信息。

注意

如果不知道怎么写,可以看看 代码

//@author: [piexlmax](https://github.com/piexlmax)
//@author: [SliverHorn](https://github.com/SliverHorn)
//@function: CreateApi
//@description: 自动创建api数据,
//@param: a *model.AutoCodeStruct
//@return: error

func AutoCreateApi(a *model.AutoCodeStruct) (err error) {
    var apiList = []model.SysApi{
        {
            Path:        "/" + a.Abbreviation + "/" + "create" + a.StructName,
            Description: "新增" + a.Description,
            ApiGroup:    a.Abbreviation,
            Method:      "POST",
        },
        {
            Path:        "/" + a.Abbreviation + "/" + "delete" + a.StructName,
            Description: "删除" + a.Description,
            ApiGroup:    a.Abbreviation,
            Method:      "DELETE",
        },
        {
            Path:        "/" + a.Abbreviation + "/" + "delete" + a.StructName + "ByIds",
            Description: "批量删除" + a.Description,
            ApiGroup:    a.Abbreviation,
            Method:      "DELETE",
        },
        {
            Path:        "/" + a.Abbreviation + "/" + "update" + a.StructName,
            Description: "更新" + a.Description,
            ApiGroup:    a.Abbreviation,
            Method:      "PUT",
        },
        {
            Path:        "/" + a.Abbreviation + "/" + "find" + a.StructName,
            Description: "根据ID获取" + a.Description,
            ApiGroup:    a.Abbreviation,
            Method:      "GET",
        },
        {
            Path:        "/" + a.Abbreviation + "/" + "get" + a.StructName + "List",
            Description: "获取" + a.Description + "列表",
            ApiGroup:    a.Abbreviation,
            Method:      "GET",
        },
    }
    err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
        for _, v := range apiList {
            var api model.SysApi
            if errors.Is(tx.Where("path = ? AND method = ?", v.Path, v.Method).First(&api).Error, gorm.ErrRecordNotFound) {
                if err := tx.Create(&v).Error; err != nil { // 遇到错误时回滚事务
                    return err
                }
            }
        }
        return nil
    })
    return err
}
  • 路径:就是接口路径,比如前端项目中 src → api → PackageName .js 每个方法里的 url
  • 请求:根据接口实际选择即可
  • api分组:对应 struct 简称
  • api简介:对api的简要说明

以上配置好后,点击 确定 按钮,完成接口配置。

5.配置角色权限

进入系统 超级管理员角色管理 菜单,找到需要设置权限的角色,点击对应的 设置权限 按钮,配置角色相关权限。

image-20210224144035326

角色菜单:勾选该角色可以访问的目录菜单

image-20210224144517336

角色api:勾选该角色可以访问的接口

image-20210224144708399

6:完善新增表单弹窗/页面

注意

v2.3.5 版本后,不再需要手动创建表单, 如果你要自己定义表单,可以看看!

以上6个步骤完成后,我们可以在系统中看到我们所创建的结构体数据列表页面。目前,这个页面已经是可以实现 删除查询 功能了,新增修改 功能仍然需要我们自己完善一下弹窗表单。

进入系统 系统工具 → 表单生成器 菜单,根据自己的实际需求,将左侧组件拖拽至中间画布区域,并在右侧设置组件属性。

  • 组件类型:默认是左侧选中的组件类型,这里还可以再进行调整
  • 字段名:对应 Step3 中的 FieldJSON 字段
  • 标题:即组件label
  • 占位提示:。。。就是占位提示

把所有组件上边几个基本的组件属性填好以后,点击画布上方的 复制代码 按钮,会出现一个弹窗,让我们选择 生成类型 是 页面 还是 弹窗。我用的时候选的页面,具体内容应该是没差的,这里选择哪个应该不影响我们目前的需求。然后点击 确定 按钮,就成功复制到了我们的表单代码。

接下来,

  • 随便找个记事本或者地方,把代码复制到里边。
  • 在复制出来的代码中,取出 <el-form>……</el-form> 部分代码,覆盖掉前端项目中 src → view → PackageName(自建) → StructName.vue 中 此处请使用表单生成器生成form填充 表单默认绑定 formData 如手动修改过请自行修改key 这句话。
  • 在复制出来的代码中,把 js 部分data方法里返回的对象复制到前端项目中,上边提及的 .vue 文件的 js 部分 data 方法的 return 对象里

Finish

至此,一个单表基本业务结构体的数据列表显示,单表数据增加、删除、查找、更新功能全部搞定。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文