chore: seed migration objects batch 1
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
## 目录
|
||||
|
||||
#### 介绍安装
|
||||
|
||||
- [系统介绍](../../README.md)
|
||||
- [环境搭建](start-environment.md)
|
||||
- [系统安装](start-installation.md)
|
||||
- [生产部署](start-deploy.md)
|
||||
- [如何提问](start-questions.md)
|
||||
- [常见问题](start-issue.md)
|
||||
- [更新历史](start-update-log.md)
|
||||
|
||||
|
||||
#### 系统开发
|
||||
|
||||
- [目录结构](sys-catalog.md)
|
||||
- [开发规范](sys-exploit.md)
|
||||
- [控制台](sys-console.md)
|
||||
- [中间件/拦截器](sys-middleware.md)
|
||||
- [WebHook](sys-webhook.md)
|
||||
- [权限控制](sys-auth.md)
|
||||
- [支付网关](sys-payment.md)
|
||||
- [定时任务](sys-cron.md)
|
||||
- [消息队列](sys-queue.md)
|
||||
- [功能扩展库](sys-library.md)
|
||||
- [工具方法](sys-utility.md)
|
||||
- [WebSocket服务器](sys-websocket-server.md)
|
||||
- [TCP服务器](sys-tcp-server.md)
|
||||
- [SaaS多租户](sys-tenant.md)
|
||||
- [国际化](sys-i18n.md)
|
||||
- [单元测试](sys-test.md)
|
||||
|
||||
|
||||
#### 插件模块开发
|
||||
|
||||
- [模块介绍及目录](addon-introduce-catalog.md)
|
||||
- [模块开发流程](addon-flow.md)
|
||||
- [模块辅助说明](addon-helper.md)
|
||||
|
||||
|
||||
#### 生成代码
|
||||
- [使用前提](code-start.md)
|
||||
- [数据库](sys-db.md)
|
||||
- [生成配置](code-config.md)
|
||||
- [生成CURD](code-curd.md)
|
||||
- [生成关联表CURD](code-curd-join.md)
|
||||
- [生成树型CURD](code-tree.md)
|
||||
- [生成业务模板](code-business.md)
|
||||
- [生成模板开发](code-template-dev.md)
|
||||
- [生成常见问题](code-help.md)
|
||||
|
||||
|
||||
### 前端开发
|
||||
- [表单组件](web-form.md)
|
||||
- [WebSocket客户端](sys-websocket-client.md)
|
||||
- [独立部署](web-deploy.md)
|
||||
|
||||
|
||||
#### 附录
|
||||
- [网址收录](append-website.md)
|
||||
@@ -0,0 +1,216 @@
|
||||
## 模块开发流程
|
||||
|
||||
目录
|
||||
|
||||
- 创建新插件
|
||||
- 开发
|
||||
- 调用主模块服务接口
|
||||
- 访问路径
|
||||
- 数据迁移
|
||||
|
||||
|
||||
|
||||
### 创建新插件
|
||||
|
||||
1、HotGo 后台进入 开发工具->插件管理->找到创建新插件,根据引导进行创建即可。
|
||||
|
||||
```shell
|
||||
创建成功后默认情况下会在以下目录中生成插件文件,假设新生成的插件名为:hgexample
|
||||
|
||||
1. /server/addons/hgexample/ # 插件模块目录
|
||||
2. /server/addons/modules/hgexample.go # 隐式注册插件文件
|
||||
3. /server/resource/addons/hgexample # 静态资源和页面模板目录,属于扩展功能选项,勾选对应选项后才会生成
|
||||
4. /web/src/api/addons/hgexample # webApi目录
|
||||
5. /web/src/views/addons/hgexample # web页面目录
|
||||
|
||||
# 默认情况下没有为web页面生成菜单权限,因为在实际场景中插件不一定需要用到web页面,所以如有需要请手动到后台 权限管理 -> 菜单权限->自行添加菜单和配置权限
|
||||
```
|
||||
|
||||
|
||||
2、创建插件完毕重启服务端后,插件管理中会出现你新创建的插件信息。操作栏有几个按钮,在此进行说明
|
||||
- 安装:会自动执行 server/hgexample/main.go 文件中的Install方法,方法中的具体逻辑默认为空,可以根据实际情况自行配置。如生成后台菜单、生成插件配置表初始化数据、迁移home页面、web项目文件等。
|
||||
```go
|
||||
// Install 安装模块
|
||||
func (m *module) Install(ctx context.Context) (err error) {
|
||||
// ...
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
- 更新:会自动执行 server/hgexample/main.go 文件中的Upgrade方法,方法中的具体逻辑默认为空,可以根据实际情况自行配置。
|
||||
```go
|
||||
// Upgrade 更新模块
|
||||
func (m *module) Upgrade(ctx context.Context) (err error) {
|
||||
// ...
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
- 卸载:会自动执行 server/hgexample/main.go 文件中的UnInstall方法,方法中的具体逻辑默认为空,可以根据实际情况自行配置。如会清除所有的数据表和已安装的信息等。
|
||||
```go
|
||||
// UnInstall 卸载模块
|
||||
func (m *module) UnInstall(ctx context.Context) (err error) {
|
||||
// ...
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 开发
|
||||
|
||||
完全可以根据HotGo正常的开发流程去开发对应的API、控制器、业务逻辑、插件内的应用
|
||||
|
||||
### 调用主模块服务接口
|
||||
|
||||
这里推荐的方式是在插件input层新建一个结构,继承主模块中的input结构。这样做的目的是为了服务与服务之间的输入/输出关系解耦,便于参数扩展和避免插件模块下使用`gf gen service`时出现`import cycle not allowed`。
|
||||
|
||||
一个简单的例子:
|
||||
> 假设hgexample插件模块要通过主模块的服务接口更新插件配置
|
||||
|
||||
插件模块input:\server\addons\hgexample\model\input\sysin\config.go
|
||||
```go
|
||||
package sysin
|
||||
|
||||
import (
|
||||
"hotgo/internal/model/input/sysin"
|
||||
)
|
||||
|
||||
// UpdateConfigInp 更新指定配置
|
||||
type UpdateConfigInp struct {
|
||||
sysin.UpdateAddonsConfigInp
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
插件模块业务逻辑:\server\addons\hgexample\logic\sys\config.go
|
||||
```go
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/addons/hgexample/global"
|
||||
"hotgo/addons/hgexample/model/input/sysin"
|
||||
"hotgo/addons/hgexample/service"
|
||||
isc "hotgo/internal/service"
|
||||
)
|
||||
|
||||
type sSysConfig struct{}
|
||||
|
||||
func NewSysConfig() *sSysConfig {
|
||||
return &sSysConfig{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterSysConfig(NewSysConfig())
|
||||
}
|
||||
|
||||
// UpdateConfigByGroup 更新指定分组的配置
|
||||
func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) error {
|
||||
in.UpdateAddonsConfigInp.AddonName = global.GetSkeleton().Name
|
||||
return isc.SysAddonsConfig().UpdateConfigByGroup(ctx, in.UpdateAddonsConfigInp)
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
主模块input:\server\internal\model\input\sysin\addons_config.go
|
||||
```go
|
||||
package sysin
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
// UpdateAddonsConfigInp 更新指定插件的配置
|
||||
type UpdateAddonsConfigInp struct {
|
||||
AddonName string `json:"addonName"`
|
||||
Group string `json:"group"`
|
||||
List g.Map `json:"list"`
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
主模块业务逻辑:\server\internal\logic\sys\addons_config.go
|
||||
```go
|
||||
package sys
|
||||
|
||||
import (
|
||||
"context"
|
||||
"hotgo/internal/model/input/sysin"
|
||||
"hotgo/internal/service"
|
||||
)
|
||||
|
||||
type sSysAddonsConfig struct{}
|
||||
|
||||
func NewSysAddonsConfig() *sSysAddonsConfig {
|
||||
return &sSysAddonsConfig{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterSysAddonsConfig(NewSysAddonsConfig())
|
||||
}
|
||||
|
||||
// UpdateConfigByGroup 更新指定分组的配置
|
||||
func (s *sSysAddonsConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateAddonsConfigInp) error {
|
||||
// ...
|
||||
return nil
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
### 访问路径
|
||||
|
||||
#### 后台插件访问路径
|
||||
|
||||
```
|
||||
// IP+端口或域名/admin/插件名称/API路径
|
||||
如:127.0.0.1:8000/admin/hgexample/index/test
|
||||
```
|
||||
|
||||
- 对应控制器路径:`server/addons/hgexample/controller/admin/sys/index.go`
|
||||
|
||||
#### 前端API插件访问路径
|
||||
|
||||
```
|
||||
// IP+端口或域名/api/插件名称/API路径
|
||||
如:127.0.0.1:8000/api/hgexample/index/test
|
||||
```
|
||||
|
||||
- 对应控制器路径:`server/addons/hgexample/controller/api/index.go`
|
||||
|
||||
#### 前台页面插件访问路径
|
||||
|
||||
```
|
||||
// IP+端口或域名/home/插件名称/API路径
|
||||
如:127.0.0.1:8000/home/hgexample/index/test
|
||||
```
|
||||
|
||||
- 对应控制器路径:`server/addons/hgexample/controller/home/index.go`
|
||||
- 对应模板路径:`server/addons/hgexample/resource/public/template`
|
||||
|
||||
#### 静态资源插件访问路径
|
||||
|
||||
```
|
||||
// IP+端口或域名/home/插件名称/API路径
|
||||
如:127.0.0.1:8000/addons/hgexample/default
|
||||
```
|
||||
|
||||
- 对应资源路径:`server/addons/hgexample/resource/public`
|
||||
|
||||
|
||||
#### Websocket插件访问路径
|
||||
|
||||
```
|
||||
// IP+端口或域名/socket/插件名称/API路径
|
||||
如:127.0.0.1:8000/socket/hgexample/index/test
|
||||
```
|
||||
|
||||
- 对应控制器路径:`server/addons/hgexample/controller/socket/index.go`
|
||||
|
||||
|
||||
### 数据迁移
|
||||
|
||||
- 可以将数据迁移逻辑写进server/xxx插件/main.go 文件中的Install方法中,并遵循系统规范进行数据安装
|
||||
@@ -0,0 +1,86 @@
|
||||
## 模块辅助说明
|
||||
|
||||
目录
|
||||
|
||||
- 模块结构
|
||||
- 获取模块信息
|
||||
- 插件路由规则
|
||||
|
||||
|
||||
#### 模块结构
|
||||
- 文件路径:server/internal/library/addons/module.go
|
||||
|
||||
```go
|
||||
// Skeleton 模块骨架
|
||||
type Skeleton struct {
|
||||
Label string `json:"label"` // 标识
|
||||
Name string `json:"name"` // 名称
|
||||
Group int `json:"group"` // 分组
|
||||
Logo string `json:"logo"` // logo
|
||||
Brief string `json:"brief"` // 简介
|
||||
Description string `json:"description"` // 详细描述
|
||||
Author string `json:"author"` // 作者
|
||||
Version string `json:"version"` // 版本号
|
||||
RootPath string `json:"rootPath"` // 根路径
|
||||
View *gview.View `json:"view"` // 模板引擎
|
||||
}
|
||||
|
||||
func (s *Skeleton) GetModule() Module {
|
||||
return GetModule(s.Name)
|
||||
}
|
||||
|
||||
// Module 插件模块
|
||||
type Module interface {
|
||||
Start(option *Option) (err error) // 启动模块
|
||||
Stop() (err error) // 停止模块
|
||||
Ctx() context.Context // 上下文
|
||||
GetSkeleton() *Skeleton // 获取模块
|
||||
Install(ctx context.Context) (err error) // 安装模块
|
||||
Upgrade(ctx context.Context) (err error) // 更新模块
|
||||
UnInstall(ctx context.Context) (err error) // 卸载模块
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取模块信息
|
||||
|
||||
- 在插件模块内
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"hotgo/addons/hgexample/global"
|
||||
)
|
||||
|
||||
func test() {
|
||||
fmt.Printf("当前插件模块是:%+v", global.GetSkeleton())
|
||||
}
|
||||
```
|
||||
|
||||
- 在插件模块外
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"hotgo/internal/library/addons"
|
||||
"hotgo/internal/library/contexts"
|
||||
)
|
||||
|
||||
func test(ctx context.Context) {
|
||||
fmt.Printf("当前是否为插件请求:%v", contexts.IsAddonRequest(ctx))
|
||||
if contexts.IsAddonRequest(ctx) {
|
||||
fmt.Printf("当前插件名称:%v", contexts.GetAddonName(ctx))
|
||||
fmt.Printf("当前插件信息:%v", addons.GetModule(contexts.GetAddonName(ctx)))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- 更多辅助方法请参考插件功能库:server/internal/library/addons
|
||||
|
||||
#### 插件路由规则
|
||||
- 如果你不喜欢现在的路由风格,可以自行调整。修改位置在:\server\internal\library\addons\addons.go的RouterPrefix方法。
|
||||
- 注意调整后如web前端页面中如有之前的路由风格也需同步修改。
|
||||
@@ -0,0 +1,40 @@
|
||||
## 模块介绍及目录
|
||||
|
||||
目录
|
||||
|
||||
- 模块介绍
|
||||
- 启动流程
|
||||
- 目录结构
|
||||
|
||||
### 模块介绍
|
||||
|
||||
> 定位:开发独立、临时性、工具类型的功能时推荐使用插件化开发,例如:小游戏(大转盘/消消乐/抽奖/大屏互动/红包等)、小插件(广告管理/文章管理/友情链接等等)、小模块(报名/投票/签到)、小程序、大型插件微商城等等。
|
||||
|
||||
> 插件模块方便多项目复用,同时完美支持多人协同开发,每个插件模块都有独立的微架构目录结构,多插件之间完全隔离。
|
||||
|
||||
### 启动流程
|
||||
|
||||
HotGo 入口文件->隐式注入(hotgo/addons/modules)->注册所有插件->初始化已安装的插件->写入路由组->根据 HotGo 正常的开发和访问流程去开发访问插件
|
||||
|
||||
|
||||
### 目录结构
|
||||
- 详细介绍请参考:[目录结构](sys-catalog.md)
|
||||
```
|
||||
/server
|
||||
├── addons
|
||||
│ ├── modules
|
||||
│ ├── xxx插件
|
||||
│ | ├── api
|
||||
│ | ├── consts
|
||||
│ | ├── controller
|
||||
│ | ├── crons
|
||||
│ | ├── global
|
||||
│ | ├── logic
|
||||
│ | ├── model
|
||||
│ | ├── queues
|
||||
│ | ├── resource
|
||||
│ | ├── router
|
||||
│ | ├── service
|
||||
│ | ├── main.go
|
||||
│ | └── README.md
|
||||
```
|
||||
@@ -0,0 +1,21 @@
|
||||
目录
|
||||
|
||||
- 框架文档
|
||||
- [goframe](https://goframe.org/pages/viewpage.action?pageId=1114119)
|
||||
- [naiveui](https://www.naiveui.com)
|
||||
- [naive-ui-admin](https://docs.naiveadmin.com/)
|
||||
|
||||
|
||||
- 常用组件
|
||||
- [websocket](https://github.com/gorilla/websocket)
|
||||
- [casbin](https://github.com/casbin/casbin)
|
||||
- [tailwind](https://tailwind.docs.73zls.com/docs/flex-direction)
|
||||
|
||||
|
||||
- 系统通用
|
||||
- [redis](https://redis.io/)
|
||||
|
||||
|
||||
- 其他
|
||||
- [awesome-go](https://github.com/avelino/awesome-go)
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
## 生成业务模板
|
||||
|
||||
根据`api`接口文件一键生成业务模板:api、controller、logic、service
|
||||
|
||||
待写。
|
||||
@@ -0,0 +1,172 @@
|
||||
## 生成配置
|
||||
|
||||
目录
|
||||
|
||||
- 模板配置
|
||||
- CLI配置
|
||||
- 多数据库使用
|
||||
|
||||
### 模板配置
|
||||
|
||||
- 配置路径:server/manifest/config/config.yaml
|
||||
|
||||
```yaml
|
||||
# 生成代码
|
||||
hggen:
|
||||
allowedIPs: [ "127.0.0.1", "*" ] # 白名单,*代表所有,只有允许的IP后台才能使用生成代码功能
|
||||
selectDbs: [ "default" ] # 可选生成表的数据库配置名称,支持多库
|
||||
disableTables: [ "hg_sys_gen_codes","hg_admin_role_casbin" ] # 禁用的表,禁用以后将不会在选择表中看到
|
||||
delimiters: [ "@{", "}" ] # 模板引擎变量分隔符号
|
||||
# 生成应用模型,所有生成模板允许自定义,可以参考default模板进行改造
|
||||
application:
|
||||
# CRUD和关系树列表模板
|
||||
crud:
|
||||
templates:
|
||||
# 默认的主包模板
|
||||
- group: "default" # 分组名称
|
||||
isAddon: false # 是否为插件模板 false|true
|
||||
masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
|
||||
templatePath: "./resource/generate/default/curd" # 模板路径
|
||||
apiPath: "./api/admin" # goApi生成路径
|
||||
controllerPath: "./internal/controller/admin/sys" # 控制器生成路径
|
||||
logicPath: "./internal/logic/sys" # 主要业务生成路径
|
||||
inputPath: "./internal/model/input/sysin" # 表单过滤器生成路径
|
||||
routerPath: "./internal/router/genrouter" # 生成路由表路径
|
||||
sqlPath: "./storage/data/generate" # 生成sql语句路径
|
||||
webApiPath: "../web/src/api" # webApi生成路径
|
||||
webViewsPath: "../web/src/views" # web页面生成路径
|
||||
|
||||
# 默认的插件包模板,{$name}会自动替换成实际的插件名称
|
||||
- group: "addon" # 分组名称
|
||||
isAddon: true # 是否为插件模板 false|true
|
||||
masterPackage: "sys" # 主包名称,需和controllerPath、logicPath、inputPath保持关联
|
||||
templatePath: "./resource/generate/default/curd" # 模板路径
|
||||
apiPath: "./addons/{$name}/api/admin" # goApi生成路径
|
||||
controllerPath: "./addons/{$name}/controller/admin/sys" # 控制器生成路径
|
||||
logicPath: "./addons/{$name}/logic/sys" # 主要业务生成路径
|
||||
inputPath: "./addons/{$name}/model/input/sysin" # 表单过滤器生成路径
|
||||
routerPath: "./addons/{$name}/router/genrouter" # 生成路由表路径
|
||||
sqlPath: "./storage/data/generate/addons" # 生成sql语句路径
|
||||
webApiPath: "../web/src/api/addons/{$name}" # webApi生成路径
|
||||
webViewsPath: "../web/src/views/addons/{$name}" # web页面生成路径
|
||||
|
||||
# 消息队列模板
|
||||
queue:
|
||||
templates:
|
||||
- group: "default"
|
||||
templatePath: "./resource/generate/default/queue"
|
||||
|
||||
# 定时任务模板
|
||||
cron:
|
||||
templates:
|
||||
- group: "default"
|
||||
templatePath: "./resource/generate/default/cron"
|
||||
|
||||
# 生成插件模块,通过后台创建新插件时使用的模板,允许自定义,可以参考default模板进行改造
|
||||
addon:
|
||||
srcPath: "./resource/generate/default/addon" # 生成模板路径
|
||||
webApiPath: "../web/src/api/addons/{$name}" # webApi生成路径
|
||||
webViewsPath: "../web/src/views/addons/{$name}" # web页面生成路径
|
||||
```
|
||||
|
||||
### CLI配置
|
||||
|
||||
- hotgo在生成dao、service配置时,默认了和gf官方一致的配置方式和代码生成规则。所以无论你是通过hotgo亦或gf命令生成,最终代码格式完全一致,遵循一致的代码规范。
|
||||
|
||||
- 配置路径:[server/hack/config.yaml](../../server/hack/config.yaml)
|
||||
|
||||
```yaml
|
||||
gfcli:
|
||||
build:
|
||||
name: "hotgo" # 编译后的可执行文件名称
|
||||
# arch: "all" #不填默认当前系统架构,可选:386,amd64,arm,all
|
||||
# system: "all" #不填默认当前系统平台,可选:linux,darwin,windows,all
|
||||
mod: "none"
|
||||
cgo: 0
|
||||
packSrc: "resource" # 将resource目录打包进可执行文件,静态资源无需单独部署
|
||||
packDst: "internal/packed/packed.go" # 打包后生成的Go文件路径,一般使用相对路径指定到本项目目录中
|
||||
version: ""
|
||||
output: "./temp/hotgo" # 可执行文件生成路径
|
||||
extra: ""
|
||||
|
||||
gen:
|
||||
dao:
|
||||
- link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true"
|
||||
# - link: "pgsql:postgres:hg123456@tcp(127.0.0.1:5432)/hotgo"
|
||||
group: "default" # 分组 使用hotgo代码生成功能时必须填
|
||||
# tables: "" # 指定当前数据库中需要执行代码生成的数据表。如果为空,表示数据库的所有表都会生成。
|
||||
tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。
|
||||
removePrefix: "hg_"
|
||||
descriptionTag: true
|
||||
noModelComment: true
|
||||
jsonCase: "CamelLower"
|
||||
gJsonSupport: true
|
||||
clear: true
|
||||
|
||||
service: # 生成业务配置
|
||||
srcFolder: "internal/logic"
|
||||
dstFolder: "internal/service"
|
||||
dstFileNameCase: "CamelLower"
|
||||
clear: true
|
||||
```
|
||||
|
||||
### 多数据库使用
|
||||
|
||||
- 假设我们要增加一个库名为`hotgo2`、分组为`default2`的数据库,并要为其生成代码
|
||||
|
||||
1. 配置[server/hack/config.yaml](../../server/hack/config.yaml) 如下:
|
||||
```yaml
|
||||
gen:
|
||||
dao:
|
||||
- link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true"
|
||||
group: "default" # 分组 使用hotgo代码生成功能时必须填
|
||||
tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。
|
||||
removePrefix: "hg_"
|
||||
descriptionTag: true
|
||||
noModelComment: true
|
||||
jsonCase: "CamelLower"
|
||||
gJsonSupport: true
|
||||
clear: false
|
||||
- link: "mysql:hotgo2:hg123456.@tcp(127.0.0.1:3306)/hotgo2?loc=Local&parseTime=true"
|
||||
group: "default2" # 分组 使用hotgo代码生成功能时必须填
|
||||
tablesEx: "hg_sys_addons_install" # 指定当前数据库中需要排除代码生成的数据表。
|
||||
removePrefix: ""
|
||||
descriptionTag: true
|
||||
noModelComment: true
|
||||
jsonCase: "CamelLower"
|
||||
gJsonSupport: true
|
||||
clear: false
|
||||
```
|
||||
|
||||
2. 配置`server/manifest/config/config.yaml`,
|
||||
|
||||
`database`配置如下:
|
||||
```yaml
|
||||
database:
|
||||
logger:
|
||||
level: "all"
|
||||
stdout: true
|
||||
default:
|
||||
link: "mysql:hotgo:hg123456.@tcp(127.0.0.1:3306)/hotgo?loc=Local&parseTime=true"
|
||||
# link: "pgsql:postgres:hg123456@tcp(127.0.0.1:5432)/hotgo"
|
||||
debug: true
|
||||
Prefix: "hg_"
|
||||
default2:
|
||||
link: "mysql:hotgo2:hg123456.@tcp(127.0.0.1:3306)/hotgo2?loc=Local&parseTime=true"
|
||||
debug: true
|
||||
Prefix: ""
|
||||
```
|
||||
|
||||
`hggen`配置如下:
|
||||
```yaml
|
||||
hggen:
|
||||
allowedIPs: ["127.0.0.1", "*"] # 白名单,*代表所有,只有允许的IP后台才能使用生成代码功能
|
||||
selectDbs: [ "default", "default2" ] # 可选生成表的数据库配置名称,支持多库
|
||||
disableTables : ["hg_sys_gen_codes","hg_admin_role_casbin"] # 禁用的表,禁用以后将不会在选择表中看到
|
||||
delimiters: ["@{", "}"] # 模板引擎变量分隔符号
|
||||
```
|
||||
|
||||
3. 登录HotGo后台 -> 开发工具 -> 代码生成 -> 找到立即生成按钮并打开,就会发现`数据库`选项增加了一个`default2`,后续生成步骤和生成例子完全一样
|
||||
|
||||
> 注意:上述的配置中所有的`default2`名称必须保持一致
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
## 生成关联表CURD
|
||||
|
||||
### 热编译启动
|
||||
- 推荐使用热编译方式启动HotGo,这样生成完成页面自动刷新即可看到新生成内容,无需手动重启
|
||||
|
||||
```shell
|
||||
# 服务端
|
||||
cd server
|
||||
gf run main.go
|
||||
|
||||
# web端
|
||||
cd web
|
||||
pnpm run dev 或 npm run dev
|
||||
```
|
||||
|
||||
以下是一个关联表的CURD生成流程
|
||||
|
||||
### 创建表结构
|
||||
- 以下表结构和数据为了方便功能演示已经内置无需再次创建
|
||||
|
||||
|
||||
- 创建主表:hg_sys_gen_curd_demo
|
||||
```sql
|
||||
CREATE TABLE `hg_sys_gen_curd_demo` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`category_id` bigint(20) DEFAULT '0' COMMENT '分类ID',
|
||||
`title` varchar(64) NOT NULL COMMENT '标题',
|
||||
`description` varchar(255) DEFAULT '' COMMENT '描述',
|
||||
`content` text COMMENT '内容',
|
||||
`image` varchar(255) DEFAULT NULL COMMENT '单图',
|
||||
`attachfile` varchar(255) DEFAULT NULL COMMENT '附件',
|
||||
`city_id` bigint(20) DEFAULT '0' COMMENT '所在城市',
|
||||
`switch` int(11) DEFAULT '1' COMMENT '显示开关',
|
||||
`sort` int(11) DEFAULT NULL COMMENT '排序',
|
||||
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
|
||||
`created_by` bigint(20) DEFAULT '0' COMMENT '创建者',
|
||||
`updated_by` bigint(20) DEFAULT '0' COMMENT '更新者',
|
||||
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
|
||||
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='系统_生成curd演示';
|
||||
```
|
||||
|
||||
创建关联表:hg_test_category
|
||||
```sql
|
||||
CREATE TABLE `hg_test_category` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
|
||||
`name` varchar(255) NOT NULL COMMENT '分类名称',
|
||||
`short_name` varchar(128) DEFAULT NULL COMMENT '简称',
|
||||
`description` varchar(255) DEFAULT NULL COMMENT '描述',
|
||||
`sort` int(11) NOT NULL COMMENT '排序',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
|
||||
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
|
||||
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='测试分类';
|
||||
```
|
||||
|
||||
### 表字段要求
|
||||
- 使用生成时,表中必须具有以下字段和属性
|
||||
|
||||
| 字段名称 | 字段含义 | 字段类型 | 可为空 |
|
||||
|--------|----------------------|---------------------|-----|
|
||||
| id | 主键ID | bigint(20) | 否 |
|
||||
|
||||
|
||||
|
||||
### 创建生成配置
|
||||
- 登录HotGo后台 -> 开发工具 -> 代码生成 -> 找到立即生成按钮并打开,选择和填写如下参数:
|
||||
|
||||

|
||||
|
||||
|
||||
### 基本设置
|
||||
- 确认无误后,点击生成配置会跳转到生成配置页面,如下:
|
||||
- 你可以在该页面调整生成表格表头/表列的接口功能、菜单权限、高级设置和关联表设置
|
||||
|
||||

|
||||
|
||||
### 主表字段设置
|
||||
|
||||
- 在该页面你可以调整生成表格字段名称、表单组件、表单编辑/验证项、列表展示/查询项、字段排序、重置和同步字段
|
||||
|
||||

|
||||
|
||||
|
||||
### 关联表字段设置
|
||||
- 在该页面你可以调整生成表格关联表字段名称、列表展示/查询项、字段排序、重置和同步字段
|
||||
- 如果存在多个关联表,也可以对多个关联表字段进行设置
|
||||
|
||||

|
||||
|
||||
### 预览并生成
|
||||
|
||||
点击`预览代码`查看生成的代码内容。如果无需继续调整直接点击`提交生成`即可,以下是预览代码效果:
|
||||
|
||||

|
||||
|
||||
- 如果你使用的热编译,那么页面会在生成成功后立即刷新,刷新完成你即可在后台菜单栏中看到`测试表格`菜单。如果不是使用热编译启动,请手动重启服务后刷新。
|
||||
|
||||
|
||||
### 生成完成
|
||||
|
||||
- 让我们看看生成的表格页面,效果如下:
|
||||
|
||||

|
||||
|
||||
### 常见问题
|
||||
|
||||
- [生成常见问题](code-help.md)
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
## 生成CURD
|
||||
|
||||
### 热编译启动
|
||||
- 推荐使用热编译方式启动HotGo,这样生成完成页面自动刷新即可看到新生成内容,无需手动重启
|
||||
|
||||
```shell
|
||||
# 服务端
|
||||
cd server
|
||||
gf run main.go
|
||||
|
||||
# web端
|
||||
cd web
|
||||
pnpm run dev 或 npm run dev
|
||||
```
|
||||
|
||||
以下是一个基本的CURD生成流程
|
||||
|
||||
### 创建表结构
|
||||
- 以下表结构和数据为了方便功能演示已经内置无需再次创建
|
||||
|
||||
```sql
|
||||
CREATE TABLE `hg_test_category` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
|
||||
`name` varchar(255) NOT NULL COMMENT '分类名称',
|
||||
`short_name` varchar(128) DEFAULT NULL COMMENT '简称',
|
||||
`description` varchar(255) DEFAULT NULL COMMENT '描述',
|
||||
`sort` int(11) NOT NULL COMMENT '排序',
|
||||
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
|
||||
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
|
||||
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
|
||||
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='测试分类';
|
||||
```
|
||||
|
||||
### 表字段要求
|
||||
- 使用生成时,表中必须具有以下字段和属性
|
||||
|
||||
| 字段名称 | 字段含义 | 字段类型 | 可为空 |
|
||||
|--------|----------------------|---------------------|-----|
|
||||
| id | 主键ID | bigint(20) | 否 |
|
||||
|
||||
|
||||
### 创建生成配置
|
||||
- 登录HotGo后台 -> 开发工具 -> 代码生成 -> 找到立即生成按钮并打开,选择和填写如下参数:
|
||||
|
||||

|
||||
|
||||
|
||||
### 基本设置
|
||||
- 确认无误后,点击生成配置会跳转到生成配置页面,如下:
|
||||
- 你可以在该页面调整生成表格表头/表列的接口功能、菜单权限、高级设置和关联表设置
|
||||
|
||||

|
||||
|
||||
### 表字段设置
|
||||
|
||||
- 在该页面你可以调整生成表格字段名称、表单组件、表单编辑/验证项、列表展示/查询项、字段排序、重置和同步字段
|
||||
|
||||

|
||||
|
||||
### 预览并生成
|
||||
|
||||
点击`预览代码`查看生成的代码内容。如果无需继续调整直接点击`提交生成`即可,以下是预览代码效果:
|
||||
|
||||

|
||||
|
||||
- 如果你使用的热编译,那么页面会在生成成功后立即刷新,刷新完成你即可在后台菜单栏中看到`测试表格`菜单。如果不是使用热编译启动,请手动重启服务后刷新。
|
||||
|
||||
|
||||
### 生成完成
|
||||
|
||||
- 让我们看看生成的表格页面,效果如下:
|
||||
|
||||

|
||||
|
||||
|
||||
### 常见问题
|
||||
|
||||
- [生成常见问题](code-help.md)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
## 生成常见问题
|
||||
|
||||
### 生成完后页面提示:服务器错误,请稍候重试!
|
||||
|
||||
- 热编译环境下,web端往往会快于服务端重启并加载完成,此时接口访问会出现`服务器错误,请稍候重试!`或`404`。这是服务端正在重启导致的,一般稍等几秒就好,如果不行就手动重启下服务端。
|
||||
|
||||
|
||||
### fetching tables failed: SHOW TABLES: Error 1045 (28000): Access denied for user * (using password: YES)
|
||||
|
||||
- 请去确认`server/manifest/config/config.yaml`和`server/hack/config.yaml`下的数据库配置一致并且权限正确
|
||||
- 参考:[生成配置](code-config.md)
|
||||
|
||||
|
||||
### 为什么后台找不到开发工具菜单
|
||||
|
||||
- 请去确认`server/manifest/config/config.yaml`中的`system.mode`不为`product`。product模式下后台【开发工具】菜单自动隐藏
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
## 使用前提
|
||||
|
||||
|
||||
在HotGo中可以通过后台开发工具快速的一键生成CRUD,自动生成Api、控制器、业务逻辑、Web页面、表单组件、菜单权限等。
|
||||
|
||||
|
||||
- hotgo 版本号 >= 2.13.1
|
||||
- 使用前必须配置 [生成配置](code-config.md)
|
||||
- 使用前必须了解 [数据库](sys-db.md)
|
||||
|
||||
|
||||
相关目录
|
||||
|
||||
- [生成配置](code-config.md)
|
||||
- [生成CURD](code-curd.md)
|
||||
- [生成关联表CURD](code-curd-join.md)
|
||||
- [生成树型CURD](code-tree.md)
|
||||
- [生成业务模板](code-business.md)
|
||||
- [生成模板开发](code-template-dev.md)
|
||||
- [生成常见问题](code-help.md)
|
||||
@@ -0,0 +1,59 @@
|
||||
## 生成模板开发
|
||||
|
||||
### 自定义生成模板
|
||||
|
||||
- HotGo允许你新建新的模板分组来满足你的需求,模板可根据现有模板基础拷贝一份出来做改造,默认模板目录:[server/resource/generate/default](../../server/resource/generate/default)
|
||||
|
||||
- 系统内置了两组CURD生成模板,请参考[生成模板配置](sys-code.md#生成模板配置)。default:是默认的生成到主模块下;addon:是默认生成到指定的插件下
|
||||
|
||||
|
||||
|
||||
### 内置gf-cli
|
||||
|
||||
- 为了确保生成代码的依赖稳定性,在面对`gf`版本更新可能导致向下不兼容情况时,HotGo将`gf-cli`工具内置到系统中并进行在线执行调整,从而提供更可靠和一致的生成代码功能。
|
||||
|
||||
- 后续我们也将开放在线运行`gf gen ...`功能。在做插件开发时也会支持到在线生成插件下的service接口,这将会使得插件开发更加方便
|
||||
|
||||
|
||||
|
||||
### 指定gf-cli版本
|
||||
|
||||
- HotGo多数情况下会和最新版本的gf-cli保持同步,如果更新不及时或你不想使用最新版本的gf-cli来生成代码,可以找到自己想要的版本进行替换即可。
|
||||
|
||||
- 下面大致做一些替换步骤说明:
|
||||
|
||||
1. 打开`github.com/gogf/gf` 找到你想要使用的版本`clone`下来
|
||||
2. 将`clone`代码中`gf/cmd/gf/internal/`目录覆盖到`server/internal/library/hggen/internal`
|
||||
3. 将覆盖过来的目录文件中引入包名`github.com/gogf/gf/cmd/gf/v2/`批量改为`hotgo/internal/library/hggen/`
|
||||
4. 运行`go mod tidy`
|
||||
5. 运行`go run main.go`,如果没有报错,那么恭喜你已经完成了。如果有报错一般都是版本差异带来的影响,需要根据情况自行调整
|
||||
|
||||
|
||||
|
||||
### 指定数据库驱动
|
||||
|
||||
> HotGo默认使用mysql驱动,如果你想用其他数据库驱动打开下方文件中注释即可,目前已支持mysql、pgsql
|
||||
|
||||
- 修改文件路径:[server/internal/library/hggen/internal/cmd/cmd_gen_dao.go](../../server/internal/library/hggen/internal/cmd/cmd_gen_dao.go)
|
||||
|
||||
```go
|
||||
package cmd
|
||||
|
||||
import (
|
||||
//_ "github.com/gogf/gf/contrib/drivers/clickhouse/v2"
|
||||
//_ "github.com/gogf/gf/contrib/drivers/mssql/v2"
|
||||
_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
|
||||
//_ "github.com/gogf/gf/contrib/drivers/oracle/v2"
|
||||
_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
|
||||
//_ "github.com/gogf/gf/contrib/drivers/sqlite/v2"
|
||||
|
||||
"hotgo/internal/library/hggen/internal/cmd/gendao"
|
||||
)
|
||||
|
||||
type (
|
||||
cGenDao = gendao.CGenDao
|
||||
)
|
||||
|
||||
```
|
||||
|
||||
修改完成后运行`go mod tidy`
|
||||
@@ -0,0 +1,93 @@
|
||||
## 生成树型CURD
|
||||
|
||||
### 热编译启动
|
||||
- 推荐使用热编译方式启动HotGo,这样生成完成页面自动刷新即可看到新生成内容,无需手动重启
|
||||
|
||||
```shell
|
||||
# 服务端
|
||||
cd server
|
||||
gf run main.go
|
||||
|
||||
# web端
|
||||
cd web
|
||||
pnpm run dev 或 npm run dev
|
||||
```
|
||||
|
||||
以下是一个基本的树形CURD生成流程
|
||||
|
||||
### 创建表结构
|
||||
- 以下表结构和数据为了方便功能演示已经内置无需再次创建
|
||||
|
||||
```sql
|
||||
CREATE TABLE `hg_sys_gen_tree_demo` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
||||
`pid` bigint(20) DEFAULT NULL COMMENT '上级ID',
|
||||
`level` int(11) DEFAULT '1' COMMENT '关系树级别',
|
||||
`tree` varchar(512) COMMENT '关系树',
|
||||
`category_id` bigint(20) DEFAULT '0' COMMENT '分类ID',
|
||||
`title` varchar(64) NOT NULL COMMENT '标题',
|
||||
`description` varchar(255) DEFAULT '' COMMENT '描述',
|
||||
`sort` int(11) DEFAULT NULL COMMENT '排序',
|
||||
`status` tinyint(1) DEFAULT '1' COMMENT '状态',
|
||||
`created_by` bigint(20) DEFAULT '0' COMMENT '创建者',
|
||||
`updated_by` bigint(20) DEFAULT '0' COMMENT '更新者',
|
||||
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`updated_at` datetime DEFAULT NULL COMMENT '修改时间',
|
||||
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='系统_生成树表演示';
|
||||
```
|
||||
|
||||
### 表字段要求
|
||||
- 使用生成时,表中必须具有以下字段和属性
|
||||
|
||||
| 字段名称 | 字段含义 | 字段类型 | 可为空 |
|
||||
|--------|----------------------|---------------------|-----|
|
||||
| id | 主键ID | bigint(20) | 否 |
|
||||
| pid | 上级树ID | bigint(20) | 是 |
|
||||
| level | 关系树级别 | int(11) | 否 |
|
||||
| tree | 关系树 | varchar(512) | 是 |
|
||||
|
||||
### 创建生成配置
|
||||
- 登录HotGo后台 -> 开发工具 -> 代码生成 -> 找到立即生成按钮并打开,选择和填写如下参数:
|
||||
|
||||

|
||||
|
||||
|
||||
### 基本设置
|
||||
- 确认无误后,点击生成配置会跳转到生成配置页面,如下:
|
||||
- 你可以在该页面调整生成表格表头/表列的接口功能、菜单权限、高级设置和关联表设置
|
||||
- 相比普通CURD,这里多了`树名称字段`和`树表格样式`选项
|
||||
|
||||

|
||||
|
||||
### 表字段设置
|
||||
|
||||
- 在该页面你可以调整生成表格字段名称、表单组件、表单编辑/验证项、列表展示/查询项、字段排序、重置和同步字段
|
||||
- 树表中的pid、level、tree字段由系统维护,单独设置编辑表单功能无效!
|
||||
|
||||

|
||||
|
||||
### 预览并生成
|
||||
|
||||
点击`预览代码`查看生成的代码内容。如果无需继续调整直接点击`提交生成`即可,以下是预览代码效果:
|
||||
|
||||

|
||||
|
||||
- 如果你使用的热编译,那么页面会在生成成功后立即刷新,刷新完成你即可在后台菜单栏中看到`测试表格`菜单。如果不是使用热编译启动,请手动重启服务后刷新。
|
||||
|
||||
|
||||
### 生成完成
|
||||
|
||||
- 让我们看看生成的表格页面,效果如下:
|
||||
|
||||
- 普通树表
|
||||

|
||||
|
||||
- 选项式树表
|
||||

|
||||
|
||||
### 常见问题
|
||||
|
||||
- [生成常见问题](code-help.md)
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 190 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 197 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 134 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 148 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
Reference in New Issue
Block a user