基于React的MERN技术栈即时通讯软件设计-需求分析与软件架构

AMOYHANS 2021-12-26 13:38:53

一、项目概述
   传统前端技术不适应大规模应用,当系统中有很多模型和相应的视图时,其复杂度就会迅速扩大,非常难以理解和调试,特别是模型和视图可能存在双向数据流动。由此催生React、Vue等使用虚拟DOM技术、提倡组件化的框架。
   相较于国内流行的Vue,国外使用更频繁的react具有更适用于大型应用、与其他框架、库兼容性更好、使用了Javascript的扩展语法-JSX、更灵活等特点。
   我们在react的基础上,开发一个即时通讯软件,熟悉从前端架构设计,到前后端分离、页面模块化,到应用打包部署的开发流程,学习并掌握react和数据库持久化等技术。在开发过程中探索react高阶组件的使用、深入理解函数式编程的思想。

二、技术选型
    与React相关的技术栈很多,综合分析,我们选择了应用比较广泛且相对成熟的MERN stack的全栈开发方式。
    M代表Mongodb:
    目前普遍认为JSON格式是理解和存储数据最自然的方式,JSON格式比传统的关系数据模型有更强大的数据表达能力。MongoDB是一个通用的、基于文档的、分布式的数据库,为云计算时代的现代应用程序开发者而生。MongoDB是一种文档数据库,也就是说MongoDB用类似JSON格式的文档来存储数据。我们将使用Mongodb实现数据的持久化。
    E代表Express:
    Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。使用所选择的各种 HTTP 实用工具和中间件,配合Node.js可以快速方便地创建强大的 API。
    R代表React:
    当前最流行的声明式的组件化的前端开发框架,将用于构建我们的前端页面
    N代表Node.js:
    Node作为一个新兴的前端框架,后台语言,采用一系列“非阻塞”库来支持事件循环的方式。本质上就是为文件系统、数据库之类的资源提供接口,将用于构建我们的后端API和数据库的访问。
    其他:Socket.io库。Socket.IO 实现了实时双向的基于事件的通讯机制。旨在让各种浏览器与移动设备上实现实时app功能,模糊化各种传输机制。Socket.IO 具有跨平台,多种连接方式自动切换的特性,做即时通讯方面的开发很方便,而且能和expressjs提供的传统请求方式很好的结合。

三、需求分析

1.模块化分析

React的显著特点之一就是组件化编程,因此我们先从组件化的思维入手,将问题分解成模块。

我们主要将从三个模块入手,分别是:

 

个人模块负责与每个用户个人有关的操作。社交模块着重在朋友圈社交相关的内容,会话模块主要管理与聊天相关的操作。

其中,个人模块的细分功能如下:
 

 

社交模块:

 

会话模块:
 

2.用例分析

原型化方法(Prototyping)和建模的方法(Modeling)是整理需求的两类基本方法。

建模的方法可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来整顿繁杂的需求细节。 我们接下来以用例建模、业务领域建模和业务数据建模来具体了解对需求进行建模的方法。

首先我们可以从上面的模块中体现的业务过程提取出抽象用例。

基本的抽象用例:

对于个人来说,主要有

1.编辑个人资料

2.发起单人/多人会话

3.好友管理

4.查看朋友圈

5.编辑朋友圈帖子

6.管理动态

根据对即时通讯系统的过程进行抽象,我们可以得到大致的如下的用例图:
 

扩展用例:

进一步对上面的模块进行扩展,我们可以得到几个主要的扩展用例(高层用例也包含在其中)

资料管理扩展用例:

用户端服务端
1.TUCBW 用户请求登入个人资料页面2.系统回送资料页的相关信息
3.用户修改个人资料4.系统检查资料格式并回送结果
5.TUCEW 用户保存并退出 

单人聊天扩展用例:

用户端服务端
1.TUCBW 用户发起对某个好友的聊天请求2.系统检查好友相关信息,回送聊天室基本信息
3.用户查看聊天记录4.系统回送聊天记录
5.用户键入新的消息6.系统保存新消息并发送给对等方
6.TUCEW 用户退出聊天 

多人聊天扩展用例:

用户端服务端
1.TUCBW 用户发起加入群聊2.系统检查群聊相关信息,回送聊天室基本信息
3.用户查看群成员,群主页4.系统回送群的详细信息
5.用户查看群聊记录6.系统回送群聊记录
6.TUCEW 用户退出聊天室 

帖子管理扩展用例:

用户端服务端
1.TUCBW 用户编辑帖子内容后请求推送至朋友圈2.系统将帖子内容保存至服务器
3.TUCEW  用户收到“发送成功”消息 

 

好友管理扩展用例:

用户端服务端
1.TUCBW 用户请求查看好友信息2.系统回送好友信息
3.用户选择添加好友(或加黑名单)4.系统建立二者的好友(或黑名单)关系
5.TUCEW  用户收到“添加(黑名单)成功”消息 

 

朋友圈管理扩展用例:

用户端服务端
1.TUCBW 用户请求查看朋友圈2.系统回送朋友圈最新动态
3.用户查看朋友圈并执行操作(点赞/评论)4.系统保存用户的操作
5.TUCEW  用户退出 

 

根据组件化的功能细分,我们可以进一步按模块组织分析用例:
个人模块: 

 

社交模块:

 会话模块:

最后,我们可以得到基于用例的业务领域模型:

我们主要需要管理用户User与群组Group的之间的Join关系,以及发送的消息格式如Post与User之间的对应关系,Group与Message之间的对应关系。还有对整个用户表和群组表的管理:

业务数据建模:

对业务数据的建模基本如上面的UML类图所示,下面主要说明一下User和Group的组成:
User:

属性类型注释
userIdLong用户ID
userNameString用户名
descString描述
pswdString密码
isOnlineBool是否在线


Group:

属性类型注释
groupIdLong群组ID
groupNameString群名
allUsersUser[]用户数组
groupDescString群描述
msgRecordMessage[]消息记录

 在数据库的设计上,由于牵涉的数据量不是很大,所以我们不会用到一对非常多的模型,会用到一对很少和一对多的模型,并且由于读的频率会更高,会涉及到反范式化的设计。

四、设计模式与软件架构

1.设计模式

对于消息的组织我们可以采用命令模式

命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

如第三部分中设计的那样,我们将message单独抽象为了一个类,对应的数据和操作组成如下:

属性/操作类型注释
msgTimeLong消息时间
msgSenderUser消息发送者
msgReciverUser消息接受者
msgContentString消息内容
getSender()User获取发送者信息
getReciver()User获取接收者信息
getContent()String获取消息内容

我们在传递群聊或者个人聊天的信息时可以传递message对象,该对象包含了与消息有关的命令和数据集合。

对于群组消息的订阅通知,我们可以采用观察者模式

观察者(Observer)模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为,这样所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式

对于前端react和后端nodejs的交互,我们使用C/S模式,也即客户服务器模式 

对于

2.软件架构

React主要是一个View组件库,因此对业务逻辑还是由我们自己定义,我们将使用基本的MVC架构来处理数据模型和视图之间的交互关系

如上所示,我们的数据模型由Mongodb使用前述设计的业务数据类型,控制层主要由Node,js编写DAO接口,用于控制数据模型,前端页面由React编写,并且React与控制逻辑的交互接口也由react负责,可以反作用于Controller. 

作者:101

 

...全文
466 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘

571

社区成员

发帖
与我相关
我的任务
社区描述
软件工程教学新范式,强化专项技能训练+基于项目的学习PBL。Git仓库:https://gitee.com/mengning997/se
软件工程 高校
社区管理员
  • 码农孟宁
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧