手把手教你开发一款1024程序员节日历提醒服务

举报
liuzhen007 发表于 2021/10/26 00:07:29 2021/10/26
【摘要】 目录 前言 正文 一、主动查询 二、回调通知 结尾 前言 关于这次程序员节1024征文的内容,自己确实想了好久,作为一名后端研发工程师,不太想去搞一个酷炫的界面,感觉那是前端同学的蛋糕,想利用自己的 Golang 技术栈搞一波儿事情。同时又想有所创新,搞点别人没有搞过的,终于昨天确定了文章的内容——开发一款102...

目录

前言

正文

一、主动查询

二、回调通知

结尾


前言

关于这次程序员节1024征文的内容,自己确实想了好久,作为一名后端研发工程师,不太想去搞一个酷炫的界面,感觉那是前端同学的蛋糕,想利用自己的 Golang 技术栈搞一波儿事情。同时又想有所创新,搞点别人没有搞过的,终于昨天确定了文章的内容——开发一款1024程序员节的日历提醒服务,今天开始正式干活儿。

正文

本文介绍的1024程序员节日历提醒服务,主要有两个功能,一个提供主动查询能力,另一个是注册节日的回调通知,下面将分别进行介绍。

一、主动查询

1024程序员节日历提醒服务提供了节日查询接口,通过调用查询接口,日历服务会根据当前的查询时间,返回当前时间是否为1024程序员节。这里需要注意的一点是,服务没有根据客户端上传的时间去判断是否为1024程序员节。而是根据服务器的时间,这样就避免了不同终端因为本地时钟偏差导致的查询结果不一致的问题。但是,这样也会导致另外一个问题,就是如果服务器的时钟不准了,那么查询结果就都不可靠了。所以,一定要保证服务器时钟状态的准确性,当然,这也是日历提醒服务工作的基础。

1. 准备节日数据集

1024程序员节日历服务能够对外提供服务的前提是有节日数据,简单来说就是1024程序员节的具体日期。我们把数据集存储到文件 data.json 中,具体内容如下:


  
  1. {
  2. "程序员节": [
  3. "2021-10-24"
  4. ]
  5. }

这里只罗列了1024程序员节的时间集,后期我们也可以继续扩展其他节日的查询能力,比如中秋节、国庆节、元旦、端午节等。

2. 定义查询接口

1024程序员节日历提醒服务的接口 API :/:festival/:callback

接口类型:Get

服务器处理请求时,会根据参数 festival,确定要查询或者注册的节日类型,本文只讨论1024程序员节。其中,参数 callback 是回调通知的目标地址,具体解析逻辑如下:


  
  1. r.GET("/:festival/:callback", func(ctx *gin.Context) {
  2. fest := ctx.Param("festival")
  3. cb := ctx.Param("callback")
  4. if err := holiday.SetCallback(cb); err != nil {
  5. ctx.String(http.StatusBadRequest, "%s", err.Error())
  6. }
  7. data, err := holiday.Query(fest)
  8. if err != nil {
  9. ctx.String(http.StatusBadRequest, "%s", err.Error())
  10. } else {
  11. ctx.JSON(http.StatusOK, data)
  12. }
  13. })
  14. log.Fatal(r.Run(":3000"))

3. 查询服务

当服务器接收到查询1024程序员节的服务时,会首先到节日数据集中去查询,如果没有给出的特定的提示。当存在节日数据集时,会校验当前查询时间和节日时间的时间差值,从而判断节日状态。

具体代码逻辑如下:


  
  1. func Query(date string) (res []string, err error) {
  2. // 解析具体节日类型,目前仅支持1024程序员节查询
  3. day, ok := holidayCache[date]
  4. if !ok {
  5. return nil, errors.New("对不起,暂不支持该节日查询")
  6. }
  7. da := strings.Split(day[0], "-")
  8. y, _ := strconv.Atoi(da[0])
  9. m, _ := strconv.Atoi(da[1])
  10. d, _ := strconv.Atoi(da[2])
  11. // 计算当前时间和1024的天数差
  12. now := time.Now()
  13. dt1 := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 100, time.Local)
  14. dt2 := time.Date(y, time.Month(m), d, 0, 0, 0, 100, time.Local)
  15. sub := int(math.Ceil(dt2.Sub(dt1).Hours() / 24))
  16. if sub == 0 {
  17. msg := "今天是1024程序员节,好好享受节日吧!"
  18. res = append(res, msg)
  19. return res, nil
  20. } else if sub > 0 {
  21. msg := "还有" + strconv.Itoa(sub) + "天就1024程序员节啦,好好期待节日吧!"
  22. res = append(res, msg)
  23. return res, nil
  24. } else {
  25. msg := "今年1024程序员节已经过完啦,期待明年1024节日见!"
  26. res = append(res, msg)
  27. return res, nil
  28. }
  29. }

4. 接口演示

下面通过不同的请求验证日历提醒服务的可用性。

1)正常请求

Get请求:http://127.0.0.1:3000/api/程序员节

修改服务器时间为2021年10月24日(1024程序员节当天),因为服务部署在了本地,也就是修改本地时间。再调用查询接口,返回结果如下:

今天是1024程序员节,好好享受节日吧!

下图所示:

如果把服务器时间调整到2021年10月25日(1024程序员节已经过完),再调用查询接口,返回结果如下:

今年1024程序员节已经过完啦,期待明年1024节日见!

如果把服务器时间调整到2021年10月23日(1024程序员节快到了),再调用查询接口,返回结果如下: 

还有1天就1024程序员节啦,好好期待节日吧!

2)异常请求

Get请求:http://127.0.0.1:3000/api/中秋

调用查询接口,返回结果如下:

对不起,暂不支持该节日查询

下图所示: 

 

二、回调通知

注册1024程序员节日提醒回调通知,就是启动一个定时器,当1024程序员节时间到了,自动触发 http 回调通知,具体地址就是请求中的 callback 参数。原理和查询日历服务接口是一致的,内容就不展开了。

结尾

好了,至此,一款1024程序员节日历提醒服务就开发完成了。稍后把1024程序员节日历提醒服务部署到公网上,就可以耐心等待1024程序员节的通知了。喜欢的小伙伴,点赞留言吧,3ks!最后,正值1024节日当天,祝所有程序员小伙伴们节日快乐,头发越来越多,bug越来越少!

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/120939126

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。