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

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

前言

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

正文

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

主动查询

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

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月前
【10秒在圣诞节做出温馨的圣诞树】
【10秒在圣诞节做出温馨的圣诞树】
|
7月前
温暖的签到题
Naruto可以负责任的告诉你,这是第一道温暖的签到题。 2020年新冠肺炎来势汹汹,娱乐场所都停业等待开业,现在某电影院提出了如下开业方案: 两个人不能坐在相邻的位置上(即两个人之间至少要隔一个座位),现在有一排横向排列的座位,电影院的负责人想知道,这一排最多能坐多少人?
70 3
|
11月前
元旦特辑 | 您有一份“云”祝福,请查收
元旦特辑 | 您有一份“云”祝福,请查收
上班摸鱼专区
上班摸鱼必备,职场人摸鱼小游戏
上班摸鱼专区
|
Ubuntu 测试技术 开发工具
画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试
自己的画的炫彩“月饼”到了,本文就开始带大家来玩玩我们自己的月饼 ......by 矜辰所致
503 0
画一个 “月饼” 陪我过中秋,玩转炫彩 “月饼” 之 基本测试
|
决策智能
LDU-五一假期专练(5.1)
题目大意:给出n个桶每个桶里面都有若干个小球,三个人做游戏,先手先进行操作,剩下的两个人是一伙的,想让先手输掉,三个人轮流进行游戏,每个人选一个桶取出 > 0 个球,当一个人无法进行操作的时候,就输掉了 后面的两个人想让先手输掉,问先手能否赢得比赛
146 0
LDU-五一假期专练(5.1)
|
前端开发
新年到,一起听听这些新年歌曲
每年过年,不管是大街小巷还是春晚的舞台上,歌曲都是必不可少的,热热闹闹才是年嘛,那今天跟着我一起来用我这个半吊子前端水平开发的简易的手机音乐盒听听那些新年歌曲吧,我是90后所以歌都比较的老,但是越老的歌越有味道嘛,来吧看看这个简易手机音乐盒是怎么实现的。
150 0
新年到,一起听听这些新年歌曲
|
计算机视觉 Python
python也可以成为贴心小管家--每日播报考研倒计时、天气情况、还有“营养鸡汤”
简介:对于考研,你还在每天数着还有多少天吗?对于天气,你还每天去看天气预报吗?你每天需要看一些励志话语来督促自己前进吗? python可以合上述三者为一体帮你轻松实现你的日常!
python也可以成为贴心小管家--每日播报考研倒计时、天气情况、还有“营养鸡汤”
天猫精灵创建节日祝福
使用天猫精灵节日模板,创建模板,提交自己的特定节日祝福
152 1
天猫精灵创建节日祝福
今年圣诞,麋鹿第一次请假
今年圣诞,麋鹿第一次请假
3249 0