【中秋赏月】信手拈来一款中秋节日历提醒服务

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

前言

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

正文

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

主动查询

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

1. 准备节日数据集

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

{
    "中秋节": [
        "2021-9-19"
    ],
    "中秋": [
        "2021-9-19"
    ]
}

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

2. 定义查询接口

中秋节日历提醒服务的接口 API :/:festival/:callback

接口类型:Get

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

r.GET("/:festival/:callback", func(ctx*gin.Context) {
fest :=ctx.Param("festival")
cb :=ctx.Param("callback")
iferr :=holiday.SetCallback(cb); err!=nil {
ctx.String(http.StatusBadRequest, "%s", err.Error())
        }
data, err :=holiday.Query(fest)
iferr!=nil {
ctx.String(http.StatusBadRequest, "%s", err.Error())
        } else {
ctx.JSON(http.StatusOK, data)
        }
    })
log.Fatal(r.Run(":3000"))

3. 查询服务

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

具体代码逻辑如下:

funcQuery(datestring) (res []string, errerror) {
// 解析具体节日类型,目前仅支持中秋节查询day, ok :=holidayCache[date]
if!ok {
returnnil, errors.New("对不起,暂不支持该节日查询")
    }
da :=strings.Split(day[0], "-")
y, _ :=strconv.Atoi(da[0])
m, _ :=strconv.Atoi(da[1])
d, _ :=strconv.Atoi(da[2])
// 计算当前时间和中秋节的天数差now :=time.Now()
dt1 :=time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 100, time.Local)
dt2 :=time.Date(y, time.Month(m), d, 0, 0, 0, 100, time.Local)
sub :=int(math.Ceil(dt2.Sub(dt1).Hours() /24))
// 中秋三天假,会存在三个值ifsub==0||sub==-1||sub==-2 {
msg :="今天是中秋节,好好享受假期吧!"res=append(res, msg)
returnres, nil    } elseifsub>0 {
msg :="还有"+strconv.Itoa(sub) +"天就中秋节啦,好好期待假期吧!"res=append(res, msg)
returnres, nil    } else {
msg :="今年中秋节已经过完啦,期待明年中秋节见!"res=append(res, msg)
returnres, nil    }
}

4. 接口演示

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

1)正常请求

Get请求:http://127.0.0.1:3000/%E4%B8%AD%E7%A7%8B%E8%8A%82/192.168.166.6:3001

网络异常,图片无法展示
|

修改服务器时间为2021年9月19日(中秋节当天),因为服务部署在了本地,也就是修改本地时间。再调用查询接口,返回结果如下图所示:

网络异常,图片无法展示
|

如果把服务器时间调整到2021年10月1日(中秋节已经过完),再调用查询接口,返回结果如下图所示:

网络异常,图片无法展示
|

2)异常请求

Get请求:http://127.0.0.1:3000/%E5%9B%BD%E5%BA%86%E8%8A%82/192.168.166.6:3001

网络异常,图片无法展示
|

回调通知

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

结尾

好了,一款中秋节日历提醒服务就开发完成了。稍后把中秋节提醒服务部署到公网上,就可以耐心等待【中秋赏月】的通知了。喜欢的小伙伴,给个赞吧,3ks!



作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一位音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解,😄公众号:玩转音视频。同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
7月前
|
存储 程序员 C语言
Kevin的128纪念日
Kevin的128纪念日
89 0
|
7月前
|
机器学习/深度学习
情人节的电灯泡
情人节的电灯泡
44 0
|
小程序
微信小程序 | 吐血整理的日历及日程时间管理
微信小程序 | 吐血整理的日历及日程时间管理
2912 0
天猫精灵创建节日祝福
使用天猫精灵节日模板,创建模板,提交自己的特定节日祝福
194 1
天猫精灵创建节日祝福
|
决策智能
LDU-五一假期专练(5.1)
题目大意:给出n个桶每个桶里面都有若干个小球,三个人做游戏,先手先进行操作,剩下的两个人是一伙的,想让先手输掉,三个人轮流进行游戏,每个人选一个桶取出 > 0 个球,当一个人无法进行操作的时候,就输掉了 后面的两个人想让先手输掉,问先手能否赢得比赛
215 0
LDU-五一假期专练(5.1)
|
前端开发
新年到,一起听听这些新年歌曲
每年过年,不管是大街小巷还是春晚的舞台上,歌曲都是必不可少的,热热闹闹才是年嘛,那今天跟着我一起来用我这个半吊子前端水平开发的简易的手机音乐盒听听那些新年歌曲吧,我是90后所以歌都比较的老,但是越老的歌越有味道嘛,来吧看看这个简易手机音乐盒是怎么实现的。
251 0
新年到,一起听听这些新年歌曲
|
数据库
|
开发者
点击查看节日礼物,好几百万影响力等你查收
1024节日快乐,作为节日礼物,开发者社区正式推出“写文章”功能,让各位摩拳擦掌的大佬可以一展身手。
1008 0
点击查看节日礼物,好几百万影响力等你查收
情人节礼物:毒一无二的维多利亚内衣
情人节就要来了,就如往常一般,垃圾邮件发送者必然会大肆宣扬他们的恶意活动。进入这个所谓“爱的月份” 才刚开始,笔者就已经看到至少两种垃圾邮件,随人们涌入推销礼品的网站来为心爱的人挑选礼物的这个特殊日子。
1281 0
|
程序员 前端开发
晒晒昨天的节日礼物
昨天1024,各位发的什么?都晒晒吧。我先晒我的。 老板昨天给我发了一个邮件。内容是一周之内学会react并按需求写一个demo。 来看看别人家的公司是怎么过节的: 再来看看拿到融资后的创业公司怎么过的: 某创业公司(以拿到融资) 哎,余不禁想吟诗一首: 写字楼里写字间,写字间里程序员; 程序人员写程序,又拿程序换酒钱。
982 0