
地 址:北京市通州区66号
电 话:18950499166
网址:lcjs666.com
邮 箱:96580336@qq.com
Serverless 是飞(fei)书一种云计算服务模式,用户无需关心底层基础设施的消息维护,只需(xu)关注业务逻辑的提醒实现,飞书是设置一款企业级即时通讯和协作平台,提供了丰富的飞书 API 接口,方便开发者进行二次开(kai)发,消息本文将介绍如何使用 Serverless 飞书打(da)造(zao)个性化消息提醒系统,提醒包括系统架构设计、设置技术选型、飞(fei)书代码实现等方面。消息
1、提醒前端:使用 React 或(huo) Vue 等框架搭建 Web 应用,设置通过调(diao)用飞书(shu) API 实现消息的飞书发送和接收。


2、消息后端:采用 Serverless 架构,提醒可以使用(yong)云函数(如 AWS Lambda、阿里云函数计(ji)算等)或无服务器数据库(如腾讯云 CDB、阿里(li)云 RDS 等)作为(wei)计算资源。

3、存储:使用云存储服务(如阿里云 OSS、腾讯云 COS 等)存(cun)储用户的基本信息和消息记录。
4、通知中心:使用第三方通知服务(如极光推送、友盟推送等)实现跨平台的消息推送。
2、后端框架:Serverless Framework,支持多种云服务商的函数计算服务。
3、API 调用:使用飞(fei)书官方提供的 JavaScript SDK,遵循官方文档规范进行开发(fa)。
5、通(tong)知服务(wu):极光推送,支持 iOS、Android、H5、Web等多个平台的消息推送。
1、前(qian)端实现:
import * as fk from '@alifd/plugin-sdk';// 初始化飞书 SDKconst app = fk.createApp({ appKey: 'your_app_key', masterSecret: 'your_master_secret',});// 获取飞书用户 IDasync function getUserId() { const res = await app.user.getUserInfo(); return res.userId;}// 发送消息到指定用户async function sendMessageToUser(userId, content) { const message = { userIds: [userId], content: content, }; const res = await app.message.send(message); return res;}2、后(hou)端实现(xian):
// 导入依赖库和组件const serverless = require('serverless-http');const axios = require('axios');const ossClient = new AWS.S3({ accessKeyId: 'your_access_key', secretAccessKey: 'your_secret_key' });const push = require('@alifd/push');const PushManager = push.PushManager;const Message = push.models.Message;const Target = push.models.Target;const Payload = push.models.Payload;const config = { }; // 根(gen)据(ju)实际情况配置推送服务的相关参数,如别名、模板ID等const targetType = 'all'; // all、tag、alias、uid四种类型之一,根据实际需求选择const targetValue = ''; // 标签值、别名值或用户 ID,根据实际需求设置const title = ''; // 通知栏标题,可(ke)选参数,默认为应(ying)用(yong)名称或消息内容(rong)前缀const body = ''; // 通知栏内容,可选参数(shu),默认为消息内容本身const contentAvailable = false; // 是否启用后台推流功能,可选参数,默认为 false,不启用时需设置 autoplay=""=true 在 AndroidManifest.xml 中配置相应字段以开启自(zi)动播放功能(neng)const notificationChannelId = ''; // Android 需要单独设置的通知渠道 ID,可选参数(shu),默认为空字符串,不设置时仅在 iOS 上生(sheng)效,需在 iOSManifest.xml 中配置相应的字段以控制通知展示方式(shi)和行为const badge = ''; // iOS 需要单独设置的应用图标上显示的数字角标数,可选参数,默认为空字符串,不设置时仅在 iOS 上生效,需在 iOSManifest.xml 中配置相应(ying)的字段以控制(zhi)角标显示数(shu)量(liang)和样式const sound = ''; // iOS 需要单独设置的应用启动时播放(fang)的声音文件名,可选参数,默认为空字符串,不设置时(shi)仅在 iOS 上生效,需在 iOSManifest.xml 中配置相应的字段以控制声音文件名及音量大小等属性值const open="open"UrlActions = []; // 点击通知后需要打开的 URL,可选参数,默认为空数(shu)组(zu),不设置时仅在 Android 上生效,需在 AndroidManifest.xml 中配置相应(ying)的字段以控制点击通知后的跳转(zhuan)行为和效果const interactiveNotificationActions = []; // 点击通知后需要执行的操作列表(biao),可选参数,默认为空数组,不设置时仅在 Android 上生效,需在 AndroidManifest.xml 中配置相应(ying)的字段以(yi)控制点击通知后(hou)的交互行为和效果const data = { }; // 需要传递给应用程序的数(shu)据(ju)对象,可选参数(shu),默认为空对象,不设置时仅在(zai) Android 上生效,需在 AndroidManifest.xml 中配置相应的字段以传递数据给应用程序处(chu)理层进行后续操作或验证等场景的需(xu)求处理let payload = { }; // 最终构建的推送消(xiao)息负载(zai)体对象,包含多个子对(dui)象用于(yu)描述推送消息的各(ge)种属性值和格式信息等细节问(wen)题,具体可参考飞(fei)书官方文档说明或示例代码中(zhong)的注释说明部分即可快速掌握其用(yong)法和技巧要点(dian),payload = Object.assign(payload, ...data); // 将自定(ding)义数据对象(xiang)中的属性值复制到负载体对象中去,确保所有需要传递的数据都(dou)能正确地被传输到目标设备上并得到有效处理,payload = Object.assign(payload, ...interactiveNotificationActions); // 将(jiang)交互式操作所需的额外属性值也加入到负载体对象中去,payload['notification']['title'] = title || content || '自定义消息标题'; // 根(gen)据实际需求设置通知栏标题(ti)或消(xiao)息内容前缀,payload['notification']['body'] = body || content || '自(zi)定义消息内容'; // 根据(ju)实际(ji)需求设置通知栏内容或消息内容本身,payload['notification']['contentAvailable'] = contentAvailable; // 根据实际需求设置是否启用后台推流功能,payload['notification']['badge'] = badge || ''; // 根据实际需求设置应用图标上显示的数(shu)字角标数,payload['notification']['sound'] = sound || ''; // 根据实际需求设置应用(yong)启动时播放的(de)声音文(wen)件名,payload['notification']['open=""UrlActions'] = open='open'UrlActions || []; // 根据实际需求设置点击通知(zhi)后需要打开的 URL,payload['notification']['interactiveNotificationActions'] = interactiveNotificationActions || []; // 根据实际需求设置点击通知后需要执行的操作列表,payload['notification']['targetIdentifier'] = targetValue || ''; // 根据实际(ji)需(xu)求设置目标设备的标识符(标签值、别名值或用户 ID),payload['notification']['targetType'] = targetType || 'all'; // 根据实际需求设置目标设备的类型(xing)(all、tag、alias、uid四种类型之一),config['region'] = 'ap-guangzhou'; // 根(gen)据实际情况配置推送服务的地域属性值(如华南区、华东区等),config['project'] = 'your_project_id'; // 根(gen)据实际情况配置推送服务的(de)项目管理编号,config['appkey'] = 'your_appkey'; // 根据实际情况配置推送服务的 App Key,config['secretKey'] = 'your_secret_key'; // 根据实际情况配置推送服务的 Secret Key,PushManager.initWithConfig(config); // 根据上述配置项初始化推送管理(li)器实例对象,PushManager.subscribe(targetValue || '', (err) => err && console.error('订阅失败' + err)); // 根据目标设备标识符和相关配置项创建并启动一次推送订阅请求(如果已(yi)存在则(ze)会更新当前订阅状(zhuang)态),成功返回 true 否则返回 false,pushManagerPromiseResolved = PushManager.promiseResolved; // 为便于调(diao)试和测试可以在此处添加(jia)一些日志输出语句或其他辅助工(gong)具来帮助我们更好地了解推送订阅请求的状态和结果情况,pushManagerPromiseRejected = PushManager.promiseRejected; // 为便于调试和测试可以在此处添加一些日志输出语句或其他(ta)辅助工具来帮助我们更好地了解推送订阅请求的状态和结果情况,pushManagerPromisePending = PushManager.promisePending; // 为便于调试和测试可以在此处添加一些日志输出语句或其他(ta)辅助工具来帮助我们更好地了解推送订阅请求的状态和结(jie)果(guo)情况,pushManagerStateChangeCallback = function (state) { }; // 当推送管理(li)器状态发生变化时的回调函数(如成功订阅、取消订阅等),可根据实际需求进行(xing)相应的处理逻辑,pushManagerErrorCallback = function (error) => console.error('推送管理器错误' + error); // 当(dang)推送管理器发生错误时的回调函数(如网络异常、权限不足等),可根据实际(ji)需求进行相应的处(chu)理逻辑,pushManagerOpenNotificationCallback = function (event) { }; // 当收到新的通知时触发的回调函数(如用户点击了通知栏上的按钮或链接等),可根据实际需求进行相应的处理逻辑,pushManagerCloseNotificationCallback = function (event) { }; // 当收到关闭通(tong)知时触发的回调(diao)函数(如用户手动关闭了(le)通知栏上的按钮或链接等),可根据实(shi)际需求进行相应的