
即时通讯后端前端移动开发【免费下载链接】fioraAn interesting open source chat application. Developed with node.js, mongoDB, socket.io and react项目地址https://gitcode.com/gh_mirrors/fi/fiora点击查看免费下载fiora 是一款基于 Node.js、MongoDB、Socket.io 与 React 构建的开源聊天应用仓库根目录位于gh_mirrors/fi/fioramonorepo 结构包含web、app、server、database、config、utils、docs等包。本文以仓库中文文档中的 更新日志 为核心骨架逐条还原 2020 年 11 月至 2021 年 6 月期间的重要变更并结合源码解读每条变更背后的实现逻辑。读完本文你将掌握 fiora 从内存缓存迁移 Redis、配置方式重构、OSS 对象存储接入、管理员体系与消息频率治理、未读消息计算等关键演进并能在部署与二次开发中对照源码定位对应模块。一、更新日志的定位与阅读方式fiora 的官方更新日志以中文维护于 CHANGELOG.md同时提供 英文版本二者共同随 Docusaurus 文档站点发布。日志按时间倒序记录每一条都对应仓库中的一个真实提交。阅读时建议重点关注两类条目标注「兼容性!!!」的条目涉及部署方式或运行环境的破坏性变更升级前必须处理标注「重要」的条目涉及正确性缺陷修复直接影响服务端行为。下文按「部署与存储」「安全与治理」「消息能力」「推送与通知」「前端与构建」「国际化与杂项」六个维度对日志内容进行重组讲解并逐条给出源码佐证路径。二、部署与存储架构演进2.1 以 Redis 缓存替代内存缓存2020-12-08兼容性变更兼容性!!!使用 redis 缓存来替代内存缓存, 所以你需要在运行 fiora 之前配置并启动 redis这是整个日志中影响面最大的变更。此前 fiora 的频控、封禁、新用户标记等状态保存在进程内存中服务重启即丢失且多实例部署时状态无法共享。迁移到 Redis 后这些状态具备了持久化与跨实例一致性。对应实现位于 数据库初始化模块通过redis.createClient({ ...config.redis })创建客户端连接配置来自fiora/config/server客户端出错时会记录日志并process.exit(0)退出避免在缓存不可用时带病运行以promisify封装了get / set / expire / keys等基础操作并导出Minute / Hour / Day时间常量与Redis工具对象定义了多个带前缀的 key 生成函数例如NewUser-${userId}、SealIp-${ip}、SealUser-${user}并支持getAllSealIp()、getAllSealUser()批量扫描封禁名单。Redis 的 host 与 port 由 服务端配置 控制默认localhost:6379可通过环境变量RedisHost、RedisPort覆盖。也就是说部署 fiora 前必须确保 Redis 已启动并可通过该地址访问否则服务端进程会因连接错误直接退出。2.2 配置文件方法取代命令行参数2020-11-04兼容性变更兼容性!!!修改 config 文件配置方法, 不再支持通过命令行参数来设置早期版本支持通过 CLI 参数注入配置容易造成脚本难以维护、参数拼写错误难排查的问题。本次变更统一为「环境变量驱动」的配置读取方式。以 server 配置 为例所有配置项均从process.env读取并给出默认值Host/Port服务监听地址与端口端口默认9200DatabaseMongoDB 连接串默认mongodb://localhost:27017/fioraRedisHost/RedisPortRedis 连接地址默认localhost:6379JwtSecretJWT 加密密钥默认jwtSecret生产环境务必替换MaxGroupCount单个用户可创建群组数量上限默认3Administrator管理员用户 id 列表以逗号分隔默认空数组DisableRegister/DisableCreateGroup关闭注册、关闭建群的开关默认falseAliyun OSS相关ALIYUN_OSS是否启用、ACCESS_KEY_ID、ACCESS_KEY_SECRET、ROLE_ARN、REGION、BUCKET、ENDPOINT。客户端侧配置同样迁移到环境变量见 client 配置Server服务端地址、MaxImageSize默认 5MB、MaxAvatarSize默认 1.5MB、MaxFileSize默认 10MB、DefaultTheme、Sound、DisableDeleteMessage等。因此改配置的正确姿势是设置对应环境变量后重启服务而不是向命令行追加参数。2.3 使用阿里云 OSS 替代七牛 CDN2021-5-11图片、文件等资源存储从七牛切换为阿里云 OSS。配置项集中在 server 配置先通过ALIYUN_OSS环境变量开启能力值为true再提供ACCESS_KEY_ID、ACCESS_KEY_SECRET、ROLE_ARN、REGION、BUCKET、ENDPOINT。采用 RAM 角色roleArn方案避免在客户端暴露长期密钥服务端通过 STS 临时凭证完成上传签名前端上传逻辑见 web 上传工具 与 app 上传工具。未开启时资源回落到本地静态目录packages/server/public。三、安全与治理能力演进3.1 单个 IP 24 小时内最多注册三个账号2021-1-22一个 ip 在 24 小时内只允许创建三个账号用于遏制批量注册刷号。Redis 中以NewRegisteredUserIpV2-${ip}为 key 记录该 IP 的注册计数并设置 24 小时过期时间key 的生成函数见 initRedis.ts。计数在注册流程中自增并配合expire实现窗口期清理具体校验逻辑位于服务端注册路由user 路由中。3.2 只限制发消息的频率2020-12-17此前频率限制可能作用于多个接口容易误伤正常操作。本次收敛为「仅对sendMessage事件限频」实现于 frequency 中间件老用户默认每分钟最多20次MaxCallPerMinutes处于「萌新期」的新用户Redis 中存在NewUser-${userId}标记默认每分钟最多5次NewUserMaxCallPerMinutes计数器每 60 秒清空一次ClearDataInterval超限后不仅拒绝本次发送返回「发消息过于频繁」或「你还处于萌新期…」还会对该用户写入SealUser-${user}封禁标记自动封禁 5 分钟AutoSealDuration。中间件只拦截事件名sendMessage其余事件直接放行避免接口调用链上的额外开销。3.3 管理员体系的修正与扩展日志中有三条与管理员相关的记录2021-2-21重要修复错误的服务端判断管理员的逻辑。此前存在将所有用户都判定为管理员的缺陷虽然前端不会因此展示管理面板但服务端权限防线已经形同虚设。修复后的实现见 isAdmin 中间件socket.data.isAdmin必须同时满足「已登录」且「用户 id 存在于config.administrator列表」两个条件。2020-11-12支持设置多个管理员即配置中的Administrator环境变量可填多个以逗号分隔的用户 id。2021-3-1管理员创建群组时不再受MaxGroupCount默认 3 个限制普通用户仍受限制见 server 配置。需要管理员权限的事件在 isAdmin.ts 中以Set显式声明包括sealUser封禁用户、getSealList、resetUserPassword、setUserTag、getUserIps、sealIp、getSealIpList、toggleSendMessage、toggleNewUserSendMessage、getSystemConfig等非管理员调用这些事件会直接收到「你不是管理员」的拦截回调。四、消息能力演进4.1 服务端计算未读消息数量2021-3-14此前未读数量可能由前端基于本地时间戳估算跨设备不一致。本次改为服务端计算。核心实现位于 message 路由的 getLinkmansLastMessagesV2根据当前用户与联系人linkman列表从History集合查出每条会话的「最后已读消息 id」按createTime倒序拉取每个联系人的最近消息有历史记录时最多 100 条否则取FirstTimeMessagesCount若存在历史记录则用最后已读消息 id 在消息列表中找到其下标messageIndexunread即为该下标未命中时置为 100没有历史记录的新会话unread直接为 0。返回值按{ [linkmanId]: { messages, unread } }组织前端据此渲染列表项上的未读角标而不再依赖本地时间差推断。4.2 支持撤回与发送文件2020-11-07 / 2020-11-08发送文件新增文件类型消息前端由 FileMessage 组件 渲染上传尺寸上限由 client 配置 的MaxFileSize控制默认 10MB。撤回消息客户端配置中的DisableDeleteMessage专门控制「禁止用户撤回消息管理员除外」默认false即允许撤回见 client 配置消息文档中的deleted字段在 message 路由 的查询投影中出现用于标记已撤回状态。4.3 URL 识别支持 localhost 与 IP 主机2021-3-2消息中的 URL 自动识别能力扩展了主机名匹配规则http(s)://localhost:port/...与http(s)://ip:port/...现在都能被正确识别为链接。相关判断逻辑见 web UrlMessage 组件 以及通用工具中的 URL 解析实现utils/url.ts其单元测试位于 utils/test/url.spec.ts。4.4 修复搜索功能允许正则表达式匹配的问题2021-3-24这是典型的注入面修复若搜索关键词按正则表达式编译用户输入.*之类的模式会匹配出大量无关内容甚至构造出成本极高的查询。本次变更将搜索关键词转为普通文本匹配从根上消除正则注入路径。搜索入口实现于 web SearchResult 页面 对应的服务端查询逻辑。4.5 支持向 fiora 外部分享群组2021-2-17新增邀请消息类型可生成指向群组的邀请链接分享给站外用户。对应实现为 web InviteMessageV2 组件 与 app InviteMessage 组件服务端对邀请消息的补全处理见 message 路由中的 handleInviteV2Messages。五、推送与通知能力演进日志中「通知」相关条目集中于 2021 年 2 月2021-2-25支持推送通知给 fiora app。fiora 的 React Native 客户端app 包接入系统通知渠道服务端通过 MongoDB 的 notification 模型 记录 token 与推送目标。2021-2-27修改 app 通知内容并不再把用户自己发送的消息推送通知给自己避免自说自话时手机反复震动的体验问题同时为 webpack 生产构建增加进度条输出。2021-2-28多个用户可以使用相同的 notification token。此前 token 可能在模型中建立唯一索引多设备共用同一 token例如同一台设备的多个账号时会互相覆盖或写入失败本次取消该限制使多账号共享同一设备 token 成为可能。六、前端体验与构建优化6.1 适配 iOS 全面屏设备2020-11-14针对 iPhone 等带刘海/底部安全区的设备调整布局涉及 app 全局样式 的安全区适配与 web 样式确保聊天输入框、导航栏不被系统手势区域遮挡。6.2 输入框自动搜索表情2020-12-17默认关闭输入文字时可按关键词自动联想表情emoji该功能默认关闭可在用户设置中打开。表情数据与渲染由 app 表情模块 和 web Expression 组件 承载表情资源存放于 assets/images/huaji 目录。6.3 实时在线状态与群组在线人数2020-11-07支持展示实时数据有 60 秒缓存时间的群组在线人数与用户在线状态。这里刻意引入 60 秒缓存是为了在“实时性”与“推送频率/数据库压力”之间取得平衡——状态数据先落缓存再推给前端避免每次在线变更都触发全量广播。状态管理见 web state 模块 与服务端 socket 广播逻辑。6.4 webpack 构建链路重构日志中有三条构建相关记录2020-11-07重构 webpack 构建配置2020-11-15使用 webpack 插件生成 service worker scriptPWA 离线缓存能力并重构并新增服务端脚本packages/server/package.json中的启动/构建脚本集2021-2-27生产构建显示进度条。构建入口与脚本可查看 web package.json 与根目录 package.json。6.5 其余体验修复2020-11-07修复图片查看大图时右键会关闭的问题图片预览弹窗对 contextmenu 事件的误处理2021-1-26修复文件消息的文件大小计算错误此前可能按字节数之外的量纲展示2020-11-03重命名一部分 npm script 名升级脚本时以 package.json 中 scripts 字段为准。七、国际化与杂项7.1 支持带日文字符的用户名与用户标签2021-6-24用户名与用户标签tag的校验与存储规则放宽允许包含日文字符。fiora 的多语言文档体系docs/i18n下的 en-US / zh-Hans 双语文档与用户名渲染逻辑web Avatar/SelfInfo共同支撑了多语言社区的运营场景。标签颜色方案由 client 配置 的TagColorMode控制默认fixedColor随机颜色生成见 getRandomColor。7.2 其他细节2021-2-21 之前的版本管理员面板、封禁、改密等管理功能随 isAdmin 中间件 的修复而恢复正确权限边界封禁功能用户封禁/IP 封禁的 Redis key 与查询工具集中在 initRedis.ts配合服务端seal.ts中间件完成拦截。八、结语从变更日志梳理出的部署要点通读这份更新日志可以沉淀出 fiora 部署与升级时必须遵守的四条原则Redis 是硬依赖自 2020-12-08 起启动服务前必须先启动 Redis 并正确配置RedisHost/RedisPort配置只走环境变量自 2020-11-04 起不要再向命令行传递配置参数所有服务端配置通过 server 配置 中的环境变量注入管理员必须显式配置Administrator环境变量中的用户 id 列表是管理员判定的唯一依据未配置则任何用户都不是管理员对象存储按需开启启用阿里云 OSS 需要完整的ALIYUN_OSS、ACCESS_KEY_ID、ACCESS_KEY_SECRET、ROLE_ARN、REGION、BUCKET、ENDPOINT配置否则资源存储于本地public目录。后续若需继续深入某个模块建议按「变更日志条目 → 对应路由/中间件 → 前端组件」的链路在仓库中逐层阅读即可完整还原每个版本的改动意图与实现细节。赞分享即时通讯后端前端移动开发【免费下载链接】fioraAn interesting open source chat application. Developed with node.js, mongoDB, socket.io and react项目地址https://gitcode.com/gh_mirrors/fi/fiora点击查看免费下载相关推荐Nextra更新日志版本迭代全解析与核心特性演进Nextra更新日志版本迭代全解析与核心特性演进 引言为什么版本追踪对开发者至关重要 你是否曾因依赖库的突发更新导致生产环境崩溃是否在升级工具链时面对海量前端文档/教程Paddle-Lite 子图拆分入门指南4 步让 NPU 和 CPU 一起跑同一份模型Paddle Lite 子图拆分入门指南4 步让 NPU 和 CPU 一起跑同一份模型 Paddle Lite 是飞桨的高性能端侧推理引擎面向手机、智能车机人工智能推理引擎深度学习边缘计算嵌入式模型优化Crawlee 核心包演进全史从 crawlee/core 变更日志读懂爬虫框架的架构迭代Crawlee 核心包演进全史从 crawlee/core 变更日志读懂爬虫框架的架构迭代 导读 crawlee/core 是 Crawlee 爬虫框架的后端网页爬虫上一篇SwiftUI偏好设置终极指南PreferenceKey与跨视图数据传递的10个技巧下一篇TanStack Form 在 React Meta-Framework 中的 SSR 集成TanStack Start、Next.js 与 Remix 服务端校验实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考