GoFrame问题集合
# 前言
本文针对gf 2.5.2
中使用中遇到的问题进行的记录。
# 资源
# 指定web
资源路径
# 结构目录
点击查看目录结构
.
├── Makefile
├── README.MD
├── api
│ └── v1
│ └── hello.go
├── go.mod
├── go.sum
├── hack
│ ├── config.yaml
│ ├── kit
│ └── plugin
├── internal
│ ├── cmd
│ │ └── cmd.go
│ ├── consts
│ │ └── consts.go
│ ├── controller
│ │ ├── admin
│ │ │ └── index.go
│ │ └── hello.go
│ ├── dao
│ ├── logic
│ ├── model
│ │ ├── do
│ │ └── entity
│ ├── packed
│ │ └── packed.go
│ ├── router
│ │ └── router.go
│ └── service
├── main.go
├── manifest
│ ├── config
│ │ └── config.yaml
│ ├── deploy
│ │ └── kustomize
│ │ ├── base
│ │ │ ├── deployment.yaml
│ │ │ ├── kustomization.yaml
│ │ │ └── service.yaml
│ │ └── overlays
│ │ └── develop
│ │ ├── configmap.yaml
│ │ ├── deployment.yaml
│ │ └── kustomization.yaml
│ └── docker
│ ├── Dockerfile
│ └── docker.sh
├── resource
│ ├── i18n
│ ├── public
│ │ ├── html
│ │ │ └── admin
│ │ │ ├── index.html
│ │ │ └── login.html
│ │ ├── plugin
│ │ └── resource
│ │ ├── css
│ │ │ └── admin
│ │ │ ├── 810.019038a6.css
│ │ │ ├── app.040a8d2a.css
│ │ │ └── loading.css
│ │ ├── image
│ │ │ └── admin
│ │ │ └── bgImg
│ │ │ └── lyfcy.jpg
│ │ └── js
│ │ ├── admin
│ │ │ ├── 810.7d77b430.js
│ │ │ └── app.a08365b1.js
│ │ └── vue
│ │ └── vue.global.js
│ └── template
└── utility
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
- 在
manifest/config/config.yaml
中的server
结构下增加以下代码
# 以项目目录为根节点/
server:
serverRoot: "/resource/public/resource"
viewer:
# 指定web资源
Paths: "resource/public/html"
# 默认页面
DefaultFile: "index.html"
AutoEncode: true
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
html
中引用文件;以引用lyfcy.jpg
为例:<img src="../image/admin/bgImg/lyfcy.jpg">
# 配置文件
# web
页面渲染配置文件中的值
# Config
访问默认的配置管理(config.toml
)对象配置项。
使用方式:
{{.Config.配置项}}
1
# Cookie
访问当前请求的 Cookie 对象参数值。
使用方式:
{{.Cookie.键名}}
1
# Session
访问当前请求的 Session 对象参数值。
使用方式:
{{.Session.键名}}
1
# Query
访问当前 Query String 中的请求参数值。
使用方式:
{{.Query.键名}}
1
# Form
访问当前表单请求参数值。
使用方式:
{{.Form.键名}}
1
# Request
访问当前请求参数值(不区分参数提交方式)。
使用方式:
{{.Request.键名}}
1
# SQL
# 模型使用链式操作
以User
表为例,当我们需要接受前台传过来的时间参数时来讲解
我最开始的时候是按下面方法来写的
// 错误写法
sql := dao.User.Ctx(ctx)
if dateTime != "" {
sql.WhereBetween("create_time",beginDateTime,endDateTime)
}
1
2
3
4
5
2
3
4
5
结果发现:当dateTime
不为空的时候,sql
也没有将条件附加上去,然后看了看文档 (opens new window)发现一段话:
用户模型单例对象
user
可以重复使用,而不用担心被“污染”的问题。在这种链式安全的方式下,我们可以创建一个用户单例对象user
,并且可以重复使用到后续的各种查询中。但是存在多个查询条件时,条件的叠加需要通过模型赋值操作(m = m.xxx)
来实现。
所以猜测是否在模型对象情况下默认加上了Safe
方法,于是改成了下面的方法通过了
// 正确写法
sql := dao.User.Ctx(ctx).Safe(false)
if dateTime != "" {
sql.WhereBetween("create_time",beginDateTime,endDateTime)
}
1
2
3
4
5
2
3
4
5
# SQL
模型复用
以User
表为例,假设要查询两个数据,一个是注册人数一个是实名人数
sql := g.Model(dao.Users.Table()).WhereBetween("create_time", beginTime, endTime)
// 获取注册人数
registerCount, _ := sql.Count()
// 获取实名人数
realNameCount, _ := sql.Where("verify_status", consts.UserVerifySuccess).Count()
1
2
3
4
5
2
3
4
5
# goframe
如何使用双库操作
假设有 A
、B
两个数据库,A
库中有 user
表;B
库中有 house
表
# 目前已知的问题
# Error 1146 (42S02): Table 'b.house't exist
目前不知道什么原因,放哪儿等一会儿就好了,如果要及时处理的话,把另一个成功过的代码放在失败的代码前执行一次就好了。这个问题着实有些日了狗
# 配置文件部分
# default 为默认的库。B库在本配置文件中取得名字为:b
database:
default:
link: "数据库链接信息"
...
b:
link: "数据库链接信息"
...
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 代码部分
// 调用的时候需要注意g.DB()中的参数即为库的别名,如果别名没写或者是default可以省略不写
// 操作库b
record, err := g.DB("b").Model("house").Fields("add").One("id=?", 1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(record.Map()["add"])
// 操作库a
record2, err := g.DB().Model(dao.User.Table()).One("id=?", 1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(record2.Map()["name"])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 代码部分
# invalid struct naming for request: defined as "*ghttp.Request", but it should be named with "Req" suffix like "XxxReq"
路由的时候指定的函数不是标准的xxxReq
函数导致的,我遇到的情况是在用jwt
的时候出现的:代码如下
// LoginUP 管理员登陆方法
func (c *cLogin) LoginUP(ctx context.Context, r *ghttp.Request) (res *api.AuthLoginRes, err error) {
res = &api.AuthLoginRes{}
res.Token, res.Expire = middleware.Auth().LoginHandler(ctx)
return
}
1
2
3
4
5
6
2
3
4
5
6
实际应该写法应该是:
func (c *cLogin) LoginUP(ctx context.Context, r *params.AuthLoginReq) (res *api.AuthLoginRes, err error) {
res = &api.AuthLoginRes{}
res.Token, res.Expire = middleware.Auth().LoginHandler(ctx)
return
}
1
2
3
4
5
2
3
4
5
# web
中读取配置文件使用相对路径
默认 goframe
的相对路径是以项目的根目录为起始点的,假设读取 config.yml
这个运行时的配置文件
os.ReadFile("manifest/config/config.yaml")
1
更新时间: 2023/9/5 18:05:26