一起用代码吸猫!本文正在参与【喵星人征文活动】。
前言
没有猫怎么办?那自己 new 一只 Cat ,然后慢慢的“撸”。怎么撸?基于近期在研究企业微信第三方应用,那就建一只“自律喵”。先让它每次提醒我待办事件吧。
总体设计
系统架构图
内容:通过访问微信小程序 “自律喵”服务,提交每日待办事件,自律喵服务将推送给catHook服务,让catHook服务到点回调“自律喵”服务中的发送消息功能,并将消息推送给微信小程序。
需求:
1、用户通过打开小程序,今日每日一喵,提交自己的每日任务,包含类型,事件内容,提醒时间
2、Cathook 作为调度中心既要接收所有的信息,还要能够到点触发提醒
3、selfCat server 推送消息给企业微信的功能
详细设计
SelfCat-Server
提供前端页面 和 相关服务接口,技术栈:nodejs + Koa
1、用户点击页面时根据 accessToken 获取用户的wxuid
2、前端用户提交待提醒的任务后,将转发到 CatHook 调度中心统一调度
3、提供消息发送接口,调度中心触发消息推送时调用该接口,并将任务到时间点推送给用户
其中发送消息主要通过使用已封装好的第三方模块 wechat-enterprise:
var API = require("wechat-enterprise").API;
var api = new API(null, null, cfg.agentid, function (callback) {
callback(null, {
accessToken: token,
});
api.send(postData.to, postData.message, function (err, value) {
if (err) {
if (err.code && err.code === 81013) {
logger.warn(`【warn】未找到对应用户,错误信息:${err},${JSON.stringify(data)}`);
callback(null, value);
} else {
logger.debug(`错误信息:${err}`);
}
}
callback(err, value);
});
复制代码
CatHook-Server
主要提供定时调度任务和接收调度任务,技术栈:nodejs + express + mongodb
1、使用 node-schedule 模块,启动定时任务。
2、提供启动定时调度任务接口,可支持一次性定时提醒或定期定时提醒功能,将接收到定时任务都存储到mongodb中。
3、提供关闭调度任务接口,主要为了满足撤销定时任务的需求。
以下是定时调度任务接口的方法代码:
function schedule_start(execModel) {
// 根据任务Id 去调用
var jobId = execModel.jobId;
schedules.scheduleJob(jobId, rule, () => {
schServer.callWebhookSchedule(jobId, webhook, false).then(result => {
sendMessage(`${config.appName}${result.msg}`, null);
}).catch(errMsg => {
sendMessage(`${config.appName}${errMsg}`, null);
});
});
}
function callWebhookSchedule(jobId, webhook,isOnce){
return reqServer.callApi(webhook).then(result => {
let msg = '';
if (result.errcode === 0) {
msg = `jobCode:${jobId},url:${webhook}任务调度成功`;
logger.info(msg);
//调度成功后如果是一次执行删除mongo中存储
if(isOnce){
deleteDBOverJob(jobId).catch(errMsg => {
return Promise.reject(errMsg);
});
}
return Promise.resolve({code:0,msg:msg});
} else {
msg = `【调度失败】jobCode:${jobId},url:${webhook}错误:${JSON.stringify(result) }`;
logger.error(msg);
return Promise.reject(msg);
}
}).catch(err => {
let errMsg = `任务${jobId},调用接口url:${webhook}异常:${err}`
logger.error(errMsg);
return Promise.reject(errMsg);
})
}
复制代码
效果展示
好像很简单的功能,但是陆陆续续差不多快敲了十几天的代码,也只是一部分功能的完成,部署到我云服务上,试运行一下。
话最后
这只喵的用途太简单,只是提醒我做事。那我怎么知道我拖延症是不是治愈了?接下来将持续改进,增加功能:对我每次完成任务的情况和处理时间的比率统计,以便我每周对我完成任务所花费时间的一个复盘。
每天叫醒我的不是闹钟,而是自律喵!!!
加油!!