一:开发背景
学习完了Gin框架,看了学长的发的Golang进阶视频,大概掌握了Gin的知识,但是一直没有时间去练手。再加上在学校505机房里面学习的时候,二期的学长总是不查考勤,甚至三期的一些同学也会忘记考勤,加上大家确实需要一个定时定点@特定的人去做某一件事情,所以我就想着开发一个小机器人,小的话可以在自己的部门使用,大的话,甚至可以在整个小组使用。同时也是自己的一个作品练习,帮助自己理清思路,同时能够把整个项目的开发过程详细的保留下来,可以让以后的三月新人去拿着练习使用。
二:开发思路(知识储备)
基础 : Gin框架基础 +Gin进阶项目Bullbell,Mysql基础知识 +zap日志库+validator校验 + viper + jwt登录认证 + GolangCron定时包
提升: GORM操作数据库(我当时不会手写sql语句,因为我mysql学的很皮毛)+ docker部署
三:实现功能
-
注册登录,每个人拥有自己的独立账号
-
添加多个群的机器人
-
可以@所有人,也可以选择性的@群里面的某个特定人
-
自定义消息(图片和表情暂时不能发送)
-
可以多条任务同时进行
-
多种定时方式,可以实现每周的具体的某天的时间点,或者是每隔一个小时,一分钟提醒一次
-
可以取消定时任务
四:使用(功能)详细说明
五:开发过程中的问题(可以跳过)
问题一 : 钉钉机器人如何定时,以什么样的规则做定时任务?
引用golang现成的第三方库,这个库功能十分齐全,可以定时,具体可以参考【Go】Cron定时任务库ZibeSun的博客-CSDN博客cron定时任务
问题二 : 如何通过机器人的token或者机器人的姓名去启动机器人?
机器人的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{})
问题四:dubug调试后面一直出现许多无用的步骤如何解决?
可以调试的时候直接 Alt+F9 跳过即可
问题五 :docker如何部署服务?
问题六 : golang函数传参中可变参数和切片相互转化
问题七:类型断言和空接口参数的互相结合
问题八:定时任务的删除
自己的前期的一个思路 :定时任务是通过一个协程来进行的,每次发布一个定时任务都需要访问一次send路由,每次的send路由都会结束,但是定时任务的协程还是会继续运行的,我需要找到这个协程,然后关闭这个协程。
后面找了半天终于在一篇博客上看到了原来这个Cron库有自带的关闭定时任务的功能,但是好多博客里面都没写,导致我还想自己写一个方法来关闭协程。
那么定时任务到底如何关闭这个定时任务呢?我们可以使用Cron库自带的remove函数来移除这个任务,每一个任务我们在创建的时候都可以指定一个int类型的id,但是我们通过id来关闭可能会很麻烦,我们可以把这个id存在数据库里面,然后把给这个id起一个简单的名字,我们拿着这个名字就可以去关闭这个定时任务了。
*gin.Context
所以后面我把定时器单独放在contab包里面,在启动路由的时候,send路由和removeTask都会对一个全局公共的定时器进行操作,我们只用声明一个定时对象,一个定时任务对象里面会有好多个定时任务。
至此,定时任务的删除算是结束了。
问题九:docker中启动go程序后发送消息一直报错x509: certificate signed by unknown authority
这个问题是出现在docker上的,我之前看的是李文周的docker部署视频,部署的时候,他用了最小的镜像scratch,这个镜像是问题一般是没有问题的,但是钉钉小机器人发送消息是要使用浏览器的,这个镜像是空白的,里面是空的,没有证书,不用这个scratchj镜像就可以了。
当时这个问题确实是难受死了,我最初是想着安装一个证书,结果安装证书很麻烦,我也不知道怎么安装,找了半天才发现可能是镜像的问题,于是我就把镜像换了,换了之后就可以了。
问题十:import cycle not allowed
六:后期完善(更新,维护)
现在已经可以使用,后面再逐渐添加新的功能
- 删除机器人
- 添加一键打字功能等等
- 添加图片和表情发送
- 添加前端页面