学习完了go语言的gin框架,看了学长的发的go进阶视频,大概掌握了gin的知识,但是一直没有时间去练手。再加上在学校505机房里面学习的时候,二期的学长总是不差考勤,学长那里经常忙于项目甚至三期的一些同学也会忘记考勤,加上大家确实需要一个定时定点@特定的人去做某一件事情,所以我就想着开发一个小机器人,小的话可以在自己的部分使用,大的话,甚至可以在整个小组使用。同时也是自己的一个作品练习,帮助自己理清思路,同时能够把整个项目的开发过程详细的保留下来,可以让以后的三月新人去拿着练习使用。
基础 :go语言 gin框架基础 + gin进阶项目Bullbell,mysql基础知识 +zap日志库+validator校验 + viper + jwt登录认证
提升: gorm操作数据库(我当时不会手写sql语句,因为我mysql学的很皮毛)+ docker部署
https://alidocs.dingtalk.com/i/team/4BYmavb32knPGNA8/docs/4BYmaRZO4DRnoGNA
引用golang现成的第三方库,这个库功能十分齐全,可以定时,具体可以参考【Go】Cron定时任务库_ZibeSun的博客-CSDN博客_cron定时任务
机器人的token就是机器人的账号,我们需要在钉钉群里添加智能群助手后可以直接查看,然后通过“加签”的方式进行加密。我们在添加机器人的时候,我们把机器人的完整信息直接添加到数据库里面,后面的话,直接通过机器人的姓名就可以启动机器人。
这个问题是个小问题,我们在main函数中使用gorm的自动建表,注意添加一个utf8即可
mysql.GLOAB_DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&model.User{},&model.Robot{},&model.Tele{},&model.Task{})
暂时没有找到办法
5.1 dockerfile的构建中的WORKDIR 是干嘛的 ? 容器中的路径长什么样子?设置/usr/local/project,进入容器就会直接进入到这个目录下?
自己的前期的一个思路 :定时任务是通过一个协程来进行的,每次发布一个定时任务都需要访问一次send路由,每次的send路由都会结束,但是定时任务的协程还是会继续运行的,我需要找到这个协程,然后关闭这个协程。
后面找了半天终于在一篇博客上看到了原来这个Cron库有自带的关闭定时任务的功能,但是好多博客里面都没写,导致我还想自己写一个方法来关闭协程。
那么定时任务到底如何关闭这个定时任务呢?我们可以使用Cron库自带的remove函数来移除这个任务,每一个任务我们在创建的时候都可以指定一个int类型的id,但是我们通过id来关闭可能会很麻烦,我们可以把这个id存在数据库里面,然后把给这个id起一个简单的名字,我们拿着这个名字就可以去关闭这个定时任务了。
最初我们想把这个定时任务放在路由的上下文中,但是gin框架的设定是每个路由都是重新分配*gin.Context
导致无法通过上下文传递定时任务。后面我把定时任务单独放在了send路由里面,这样的话也是不行的。首先是当我们没做一个定时任务,都会有一个新的定时对象,一个对象对应一个定时任务,而我们要做的是应该是一个定时对象对应多个定时任务。其次是我们在send路由里面的定时任务在remove_task路由里面也是无法拿到的,因为每个路由都是重新开始,重新分配的,无法拿到其他路由里面的变量。
所以后面我把定时器单独放在contab包里面,在启动路由的时候,send路由和removeTask都会对一个全局公共的定时器进行操作,我们只用声明一个定时对象,一个定时任务对象里面会有好多个定时任务。
至此,定时任务的删除算是结束了。
这个问题是出现在docker上的,我之前看的是李文周的docker部署视频,部署的时候,他用了最小的镜像scratch,这个镜像是问题一般是没有问题的,但是钉钉小机器人发送消息是要使用浏览器的,这个镜像是空白的,里面是空的,没有证书,不用这个scratchj镜像就可以了。
当时这个问题确实是难受死了,我最初是想着安装一个证书,结果安装证书很麻烦,我也不知道怎么安装,找了半天才发现可能是镜像的问题,于是我就把镜像换了,换了之后就可以了。
Golang中解决"import cycle not allowed"的2种方法_AlbertGou的博客-CSDN博客_go 循环依赖
现在已经可以使用,后面再逐渐添加新的功能