goframe gf-cli的使用

摘要:
5.启动项目haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/gf/gf-demos02$gfrunmain.go些命令支持热编译浏览器访问http://localhost:8199/已经可以正常输出HelloWorld!
目录
1.视频教程

https://www.bilibili.com/video/BV1YK4y1b7W8?p=1

2.官方文档

https://goframe.org/toolchain/cli

3.下载

工具开源项目地址:https://github.com/gogf/gf-cli

本人系统环境

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帮助
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
", val.Id, val.Name)
    }

    // 查询单条数据
    data, err := mytable.FindOne()
    if err != nil {
        panic(err)
    }
    fmt.Printf("id: %d  name:%s
", 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
", val.Id, val.Name)
    }

    // 查询数据总条数
    num, err := mytable.FindCount()
    if err != nil {
        panic(err)
    }
    fmt.Printf("共有 %d 条数据
", 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)
}


免责声明:文章转载自《goframe gf-cli的使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于kuboard管理k8sIDAPython入门教程 基于IDA7.5_Python3 第一讲 简介与地址获取下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

VMP加壳(二):VMP的虚拟化原理

由于CPU只能识别和执行二进制文件,并直接让硬件CPU执行虚拟机的二进制代码,因此只能考虑通过纯软件模拟虚拟机执行代码指令。为了在软件级别模拟CPU执行二进制代码指令,一般的虚拟机指令要么是操作寄存器,虚拟机指令的处理程序必须模拟这些函数。它用于指示虚拟CPU当前执行的代码。为了满足上述要点,2。VMP虚拟机的执行过程(1)考虑启动VT。...

基于智能网卡(Smart Nic)的Open vSwitch卸载方案简介

SmartNic技术的初衷是以比普通CPU低得多的成本支持各种虚拟化功能,如sriov、overlay/decap和卸载一些vSwitch处理逻辑。目前,业界还没有完美的SmartNic解决方案来解决传统的vSwitch性能瓶颈,每种解决方案的实施方式也各不相同。没有统一的解决方案。图1.不同SmartNic架构的比较。2.基于SmartNic的OVS卸载方...

Github仓库重命名

1.在Github上重命名仓库,转到您自己的仓库,找到Setting标记,然后单击Options中的Settings以设置Repositoryname。2.修改本地仓库信息。由于远程仓库名称已更改,因此本地对应的仓库名称也应更改。1.检查当前远程仓库的信息$gitremote-v列出了所有远程仓库信息,包括网站地址。2.修改本地对应远程仓库的地址。修改后,使...

C#控件重绘学习(一)

由于需要制作工业控制软件,传统的控制已不能满足实际要求,因此控制的重新绘制迫在眉睫。因为考研花费了很多时间,而C#的学习已经搁浅了很长时间,所以我打算借此机会仔细彻底地研究控件的重新绘制。首先,查看Button的旧背景:namespace:SystemWindows.Forms程序集:System.Windows.FormsButton具有太多属性:例如Ba...

C#Win32API编程之PostMessage

本文以C#调用Win32API函数PostMessage完成指定表单的后台鼠标和键盘模拟为例,大致解释了C#调用非托管代码和Window的消息处理机制。我们可以将PostMessage用于函数。成功与否在很大程度上取决于我们传达的信息是否真实。消息表明消息是什么。请原谅我先讲故事。我希望先解释一下PostMessage函数。这是一个异步操作,如下图所示:调用...

axios 学习文档

Axios是一个基于承诺的HTTP库,可以在浏览器和node.js中使用。执行POST请求axis.POST.then。接住执行多个并发请求函数getUserAccount(){returnaxios.get;}函数getUserPermissions(){returnaxios.get;}全部承诺。然后axios API可以通过传递相关配置来请求axios...