gin-admin(v8)结合gin-admin-react以及gin-admin-cli踩坑记

前言

最近公司接了个新项目,老板说不影响工期的情况下语言不限,于是我就果断采用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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱折腾的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值