前言
最近公司接了个新项目,老板说不影响工期的情况下语言不限,于是我就果断采用golang进行研发,找了很久,最后还是采用了 gin-admin(v8)结合gin-admin-react以及gin-admin-cli进行开发,react这里不过多阐述这一块我是小白。接下来我会将我使用gin-admin遇到的坑都一一进行分析,也给自己做一个备忘。
踩坑记录
1.静态站点配置(本来自己改路由已经实现了,后来发现配置文件里面有一个www配置)
# 静态站点目录(也可以启动服务时使用-www指定)
WWW = "web/admin/dist/"
2.后台修改权限后,立马会出现无权限问题解决。
问题分析:大致看了一下源码,这里是由于权限表更新了casbin没更新导致的问题。解决方案是在rule.api.go中更新权限的时候 附带更新一下casbin即可(参考了网络上大佬的博文从别人的代码中学习golang系列–03)。
源码如下:
//casbin.go文件改成功addcasbin/addcasbin.go新增如下代码
var chCasbinPolicy chan *chCasbinPolicyItem
type chCasbinPolicyItem struct {
ctx context.Context
e *casbin.SyncedEnforcer
}
func init() {
chCasbinPolicy = make(chan *chCasbinPolicyItem, 1)
go func() {
for item := range chCasbinPolicy {
err := item.e.LoadPolicy()
if err != nil {
// logger.Errorf(item.ctx, "The load casbin policy error: %s", err.Error())
return
}
}
}()
}
// LoadCasbinPolicy 异步加载casbin权限策略
func LoadCasbinPolicy(ctx context.Context, e *casbin.SyncedEnforcer) {
if !config.C.Casbin.Enable {
return
}
if len(chCasbinPolicy) > 0 {
// logger.Infof(ctx, "The load casbin policy is already in the wait queue")
return
}
chCasbinPolicy <- &chCasbinPolicyItem{
ctx: ctx,
e: e,
}
}
//rule.api.go
type RoleAPI struct {
RoleSrv *service.RoleSrv
CasbinEnforcer *casbin.SyncedEnforcer //新增这个
}
func (a *RoleAPI) Update(c *gin.Context) {
ctx := c.Request.Context()
var item schema.Role
if err := ginx.ParseJSON(c, &item); err != nil {
ginx.ResError(c, err)
return
}
err := a.RoleSrv.Update(ctx, ginx.ParseParamID(c, "id"), item)
if err != nil {
ginx.ResError(c, err)
return
}
//新增下面两行
addcasbin.LoadCasbinPolicy(c, a.CasbinEnforcer)
ginx.ResOK(c)
}
3.模块大小写以及多单词拼接问题
- 当模块(包括mock/api/schema/service)名称使用小驼峰格式,会出现无法访问api的情况 如模块名为 demo
- 当模块名称使用多单词拼接方式时会出现 指针错误 如:DemoAdmin (目前我还是采用单单词的方式吧,后续有时间再研究一下看看是不是我没使用对,但是我是使用gin-admin-cli自动生成的,理论上没啥问题)
4.在gin-admin-react中欧你新建的数据,能正常显示,但是点击编辑的时候出现请求不到数据问题(id和数据库中的不一致)
问题分析:这个是由于gin-admin后端id是采用雪花自动生成的长整型,但是js获取到长整型的数字超过17位时,可能会丢失精度导致的问题。但是我研究了很久,大佬原来的模块中就正常(包括nemu模块),后来才发现大佬的代码中 schema的结构体有针对id转string操作。但是我是使用gin-admin-cli自动生成的模块,所以针对这里还需要优化一下gin-admin-cli
解决方案:在schema/demo.go 中的结构体添加id转string即可代码如下:
// Demo 示例对象
type Demo struct