1.視頻教程
https://www.bilibili.com/video/BV1YK4y1b7W8?p=1
2.官方文檔
https://goframe.org/toolchain/cli
3.下載
工具開源項目地址:https://github.com/gogf/gf-cli
linux系統安裝環境
aima@haima-PC:~/Desktop$ uname -a
Linux haima-PC 4.15.0-30deepin-generic #31 SMP Fri Nov 30 04:29:02 UTC 2018 x86_64 GNU/Linux
haima@haima-PC:~/Desktop$ lsb_release -a
No LSB modules are available.
Distributor ID: Deepin
Description: Deepin 15.11
Release: 15.11
Codename: stable
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ wget https://goframe.org/cli/linux_amd64/gf #下載
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ ./gf install #安裝gf工具到/usr/local/go/bin
I found some installable paths for you:
Id | Writable | Installed | Path
0 | true | false | /usr/local/go/bin
please choose one installation destination [default 0]: 0 #選擇0安裝位置
gf binary is successfully installed to: /usr/local/go/bin
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf -v #查看版本
GoFrame CLI Tool v0.7.4, https://goframe.org
Install Path: /usr/local/go/bin/gf
Build Detail:
Go Version: go1.14
GF Version: v1.12.2
Git Commit: a6a76f7ef3ef7fe5456059be5beb20366d980c9d
Build Time: 2020-05-07 19:06:55
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf -h #查看幫助
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf gen -h #查看gen幫助
windows系統安裝環境
從 https://github.com/gogf/gf-cli
下載gf.exe
Windows (amd64): https://goframe.org/cli/windows_amd64/gf.exe
雙擊 gf.exe
安裝 D:\Go\bin
選擇go的安裝目錄,完成安裝
D:\work\golang\src\test\goframe\gf_dome01>gf -v
GoFrame CLI Tool v1.14.4, https://goframe.org
Install Path: D:\Go\bin\gf.exe
Build Detail:
Go Version: go1.14
GF Version: v1.14.3
Git Commit: 74adfde9bd047491e10872d96679c35c3879050c
Build Time: 2020-11-25 19:22:34
4.創建項目
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf init gf01 #在當前目錄里創建項目名為gf01的項目
current folder is not empty, files might be overwrote, continue? [y/n]: y
initializing...
initialization done!
you can now run 'gf run main.go' to start your journey, enjoy!
5.啟動項目
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf run main.go
些命令支持熱編譯(自動編譯)
瀏覽器訪問http://localhost:8199/
已經可以正常輸出
Hello World!
6.交叉編譯
a.在config/config.toml文件里加入下面的編譯配置信息
# 編譯配置文件
[compiler]
name = "gf01" #編譯后的文件名稱
version = "1.0.0" #編譯后的文件會生成到/bin/1.0.0目錄里
arch = "386,amd64"
system = "linux,windows,darwin"
output = ""
path = "./bin" #輸出到bin目錄
extra = "-ldflags \"-s -w\""
# 自定義編譯時內置變量
[compiler.VarMap]
author = "john"
email = "john@goframe.org"
b.執行編譯命令
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf build main.go
2020-06-04 06:41:12.542 start building...
2020-06-04 06:41:12.542 go build -o ./bin/1.0.0/darwin_386/gf01 -ldflags "-s -w" main.go
2020-06-04 06:41:38.765 go build -o ./bin/1.0.0/darwin_amd64/gf01 -ldflags "-s -w" main.go
2020-06-04 06:42:19.657 go build -o ./bin/1.0.0/linux_386/gf01 -ldflags "-s -w" main.go
2020-06-04 06:43:01.497 go build -o ./bin/1.0.0/linux_amd64/gf01 -ldflags "-s -w" main.go
2020-06-04 06:43:17.780 go build -o ./bin/1.0.0/windows_386/gf01.exe -ldflags "-s -w" main.go
2020-06-04 06:43:55.577 go build -o ./bin/1.0.0/windows_amd64/gf01.exe -ldflags "-s -w" main.go
2020-06-04 06:44:33.453 done!
c.打包好之后的文件
├── bin
│ └── 1.0.0
│ ├── darwin_386
│ │ └── gf01
│ ├── darwin_amd64
│ │ └── gf01
│ ├── linux_386
│ │ └── gf01
│ ├── linux_amd64
│ │ └── gf01
│ ├── windows_386
│ │ └── gf01.exe
│ └── windows_amd64
│ └── gf01.exe
d.運行編譯后的文件
這里本人的系統是linux_amd64,
所以運行./bin/1.0.0/linux_amd64/gf01
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ ./bin/1.0.0/linux_amd64/gf01
2020-06-04 06:52:58.568 [DEBU] [ghttp] SetServerRoot path: /media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02/public
SERVER | DOMAIN | ADDRESS | METHOD | ROUTE | HANDLER | MIDDLEWARE
|---------|---------|---------|--------|-------|--------------------------|------------|
default | default | :8199 | ALL | / | gf01/app/api/hello.Hello |
|---------|---------|---------|--------|-------|--------------------------|------------|
2020-06-04 06:52:58.570 26600: http server started listening on [:8199]
瀏覽器訪問http://localhost:8199/
已經可以正常輸出
Hello World!
7.gen命令的使用
gen命令用以自動化從數據庫直接生成模型文件。
該命令將會根據數據表名(注意:所以要先在數據里建好表)生成對應的目錄,該目錄名稱即數據表包名。目錄下自動生成3個文件:
數據表名.go 自定義文件,開發者可以自由定義填充的代碼文件,僅會生成一次,每一次模型生成不會覆蓋。
數據表名_entity.go 表結構文件,根據數據表結構生成的結構體定義文件,包含字段注釋。數據表在外部變更后,可使用gen命令重復生成更新該文件。
數據表名_model.go 表模型文件,為數據表提供了許多便捷的CURD操作方法,並可直接查詢返回該表的結構體對象。數據表在外部變更后,可使用gen命令重復生成更新該文件。
數據表模型生成支持的數據庫類型為:MySQL/MariaDB、PostgreSQL、SQLite、SQLServer。目前暫不支持Oracle,若有需求請聯系作者。
注意:所以要先在數據里建好表
操作步驟
a.新建表
sys_users
表
CREATE TABLE `sys_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`uuid` varbinary(255) DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
`pass_word` varchar(255) DEFAULT NULL,
`nick_name` varchar(255) DEFAULT 'QMPlusUser',
`header_img` varchar(255) DEFAULT 'http://www.henrongyi.top/avatar/lufu.jpg',
`authority_id` varchar(255) DEFAULT '888',
`authority_name` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`phone_data` varchar(255) DEFAULT NULL,
`manager` varchar(255) DEFAULT NULL,
`substation_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '變電站sn',
`power_supply_stations_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '所屬部門sn',
`company_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '所屬公司',
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`) USING BTREE,
KEY `idx_sys_users_deleted_at` (`deleted_at`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
b.生成model
gf gen model ./app/model -c config/config.toml -p sys_ -t sys_users
命令說明
./app/model #在model生成的路徑
-c config/config.toml #在這個配置里找database數據庫連接配置 需要寫好mysql的配置信息
config/config.toml文件
# Database.
[database]
link = "mysql:root:123456@tcp(127.0.0.1:3306)/gf01"
debug = true
# Database logger.
[database.logger]
Path = "/tmp/log/gf-app/sql"
Level = "all"
Stdout = true
-p sys_ #去除生成文件目錄的sys前綴 如果不加這個參數就會按數據庫名生成目錄和文件名 如:sys_users
-t sys_users #要生成model的數據表文件名
實操:
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf gen -h #查看幫助
haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$ gf gen model ./app/model -c config/config.toml -p sys_ -t sys_users
path './app/model' is not empty, files might be overwrote, continue? [y/n]: y
2020-06-04 07:41:50.296 [DEBU] [ 1 ms] SHOW FULL COLUMNS FROM `sys_users`
generated: ./app/model/users/users.go
generated: ./app/model/users/users_entity.go
generated: ./app/model/users/users_model.go
done!
此時 在./app/model
目錄里生成users文件
│ ├── model
│ │ └── users
│ │ ├── users_entity.go #表結構文件,根據數據表結構生成的結構體定義文件,包含字段注釋。數據表在外部變更后,可使用gen命令重復生成更新該文件。
│ │ ├── users.go #自定義文件,開發者可以自由定義填充的代碼文件,僅會生成一次,每一次模型生成不會覆蓋。
│ │ └── users_model.go #表模型文件,為數據表提供了許多便捷的CURD操作方法,並可直接查詢返回該表的結構體對象。數據表在外部變更后,可使用gen命令重復生成更新該文件。
c.調用生成的users model
修改 app/api/hello/hello.go文件
// Hello is a demonstration route handler for output "Hello World!".
func Hello(r *ghttp.Request) {
r.Response.Writeln("Hello World!")
userInfo, err := users.FindOne("username = ?", "admin")
if err !=nil {
//glog.Error(err)
fmt.Println(err)
r.Response.Writefln("err")
r.Exit()
}
r.Response.Writefln(userInfo.NickName)
}
運行 gf run main.go
瀏覽器訪問http://localhost:8199/
已經可以正常輸出
Hello World!
超級管理員
8.orm的操作
package main
import (
"fmt"
"github.com/gogf/gf/frame/g"
"p3/app/model/mytable"
)
func main() {
// 查詢所有數據
result, err := mytable.FindAll()
if err != nil {
panic(err)
}
// 遍歷數據
for _, val := range result{
fmt.Printf("id: %d name:%s\n", val.Id, val.Name)
}
// 查詢單條數據
data, err := mytable.FindOne()
if err != nil {
panic(err)
}
fmt.Printf("id: %d name:%s\n", data.Id, data.Name)
// 條件查詢, 查詢name為王哈哈的
dataList, err := mytable.FindAll(g.Map{
"name": "王哈哈",
})
if err != nil {
panic(err)
}
for _, val := range dataList {
fmt.Printf("id: %d name:%s\n", val.Id, val.Name)
}
// 查詢數據總條數
num, err := mytable.FindCount()
if err != nil {
panic(err)
}
fmt.Printf("共有 %d 條數據\n", num)
// 插入數據
_, err = mytable.Insert(g.Map{
"name": "王哈哈",
})
if err != nil {
panic(err)
} else {
fmt.Println("插入數據成功")
}
// 刪除數據
_, err = mytable.Delete(g.Map{
"id": 3,
})
if err != nil {
panic(err)
} else {
fmt.Println("刪除數據成功")
}
// 修改數據, 把id為8的name改為王大炮
mytable.Update(g.Map{"name": "王大炮"}, "id", 8)
// 修改多個字段, 把id為9的數據name改為小可愛,id改為10000
mytable.Update(g.Map{"name": "小可愛", "id": 10000}, "id", 9)
}