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

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

前言

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

正文

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

主动查询

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

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 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多干货!😄

目录
相关文章
|
4月前
|
JSON API PHP
万年历API接口详解:精准获取指定日期信息
本文介绍接口盒子提供的万年历API,支持获取农历、节气、宜忌、星座等信息,具备完整的请求与返回示例,适用于黄历、日程管理等应用开发。
1316 0
|
3月前
|
Java API 网络架构
java调用api接口自动判断节假日信息
java调用api接口自动判断节假日信息
1282 0
|
8月前
|
人工智能 自然语言处理 Java
快速带你上手通义灵码 2.0,体验飞一般的感觉
通义灵码个人版为开发者免费提供智能编码能力,专业版限免期内开放更多功能。使用需先注册阿里云账号,支持JetBrains IDEs、Visual Studio Code等开发工具。以Visual Studio Code为例,安装插件并登录后即可体验其强大功能。通义灵码2.0在代码生成、需求理解及单元测试自动化等方面有显著提升,支持多语言和复杂场景,大幅提高开发效率。
235459 39
快速带你上手通义灵码 2.0,体验飞一般的感觉
|
8月前
|
运维 监控 安全
从零构建企业数字化基石:ERP部署的技术路径与工具选择
ERP(企业资源计划)系统是企业数字化的核心引擎,整合财务、供应链、生产、人力资源等模块,实现数据互通与业务协同。然而,复杂的部署技术和高昂的运维成本成为主要挑战。本文探讨如何利用服务器管理面板(如Websoft9、宝塔)降低技术门槛,实现ERP系统的快速搭建与管理,帮助企业在有限IT资源下,提升效率并优化流程。通过自动化配置、应用集中管理和安全加固等功能,中小企业可低成本试错并敏捷响应变化,实现业务和技术的共生发展。
237 1
|
数据可视化 算法 计算机视觉
什么是傅里叶变换?傅里叶变换处理图像的原理是什么?
傅里叶变换是一种强大的数学工具,能够将信号在时域与频域之间进行转换,广泛应用于物理学、信号处理、图像处理等领域。它能够将复杂信号分解为多个简单的正弦波,从而便于分析和处理。在图像处理中,傅里叶变换可以用于去噪、锐化和压缩等操作,通过滤波器选择性地保留或去除特定频率的信息,提高图像质量。
|
存储 SQL 分布式计算
大数据中结构化数据
【10月更文挑战第18天】
718 4
|
缓存 程序员 数据安全/隐私保护
Python中的装饰器详解及应用实例
装饰器是Python中强大且灵活的功能,能够优雅地解决代码重复、添加日志、权限控制等问题。本文将深入探讨装饰器的工作原理,详细介绍如何定义、使用和链式组合装饰器,以及实际应用场景示例。
|
网络协议 网络性能优化
运输层中的UDP和TCP协议
总结来说,UDP适用于那些要求速度和实时性高于可靠性的应用,而TCP适用于要求数据可靠性和完整性的应用。选择使用哪种协议取决于您的应用需求。
364 1
|
JavaScript 前端开发 开发者
深入理解前端框架Vue.js的数据响应式原理
本文将深入探讨Vue.js前端框架中的数据响应式原理,包括双向绑定、依赖追踪和虚拟DOM等核心概念。通过详细解析Vue.js内部实现机制,读者能够更好地理解其工作原理,并在实际开发中更灵活地运用。
|
缓存
流量控制&可靠传输机制&停止-等待协议
流量控制&可靠传输机制&停止-等待协议
168 0