仿知乎专栏的软件系统设计方案
1. 项目介绍
仿知乎专栏主要包括了编写和查看两大模块。编写模块中,用户可以新增文章,更新文章。查看模块包含查看列表,查看文章,添加评论,赞同以及分享功能,下面是仿知乎专栏的软件系统设计。
2. 软件结构
2.1 B/S架构
本系统采取浏览器请求,服务器响应的工作模式。在 B/S 模式中,用户是通过浏览器针对许多分布于网络上的服务器进行请求访问的,浏览器的请求通过服务器进行处理,并将处理结果以及相应的信息返回给浏览器,其他的数据加工、请求全部都是由Web Server完成的。

此外,本系统采用前后端完全分离模式,前端和后端分别作为独立项目上线,互不干扰,前端与后端系统通过接口调用来获取数据。
2.2 MVC
本系统采用MVC的软件结构:MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。

3. 接口实现
| 接口描述 | 地址 | 请求方式 | 参数 | 响应 |
|---|---|---|---|---|
| 用户注册 | user/register | post | 用户名,密码,邮箱,手机号 | 注册成功/失败 |
| 用户登录 | user/login | post | 用户名,密码 | 登录成功/失败,token |
| 用户注销 | user/logout | get | 空 | 登出成功/失败 |
| 文章列表 | article/list | get | 文章ids(可选),作者id(可选),页数,每页个数 | 文章id,标题,简介,发布时间,作者id |
| 文章内容 | article/detail | get | 文章id | 文章id,标题,内容,发布时间,作者id |
| 新增/编辑文章 | article/save | post | 文章id,标题,内容 | 保存成功/失败 |
| 新增评论 | comment/add | post | 评论id,文章id,回复评论id,评论内容 | 评论成功/失败 |
| 删除评论 | comment/delete | post | 评论id | 删除成功/失败 |
| 评论列表 | comment/list | get | 文章id,页数,每页个数 | 评论人id,评论内容 |
上述接口中除了注册和登录接口外,默认带参数token,方便后端从token中解析当前登录的用户信息
4. 分解视图

5. 依赖视图

6. 执行视图
时序图:以用户新增文章为例

7. 实现视图
代码根据功能不同分在不同的包中
- constant: 存放编程过程中涉及到的各种常量,枚举类等
- controller:负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层Service处理之后封装成一个Model,然后再把该Model返回给对应的View进行(由于采用前后端分离的模式,view被独立成一个前端项目单独上线)
- dao:数据访问层,用于对数据库的访问
- exception:用于自定义异常类
- model:保存开发过程中涉及到的各类数据模型,如PO(持久化对象,用于建立与数据库表一致的结构,一个PO对象可视为表中的一条记录),VO(view object 表现层对象,用于定义接口的数据返回格式,格式是跨进程的),BO(business object 业务对象,用于业务层之间的数据传递)
- service: 实现业务处理,负责组装dao层的操作
- util: 存放开发过程中使用到的各种工具类
- resources: 负责保存配置文件和其他一些静态文件
- test: 存放单元测试代码
- target: 存放编译结果

8. 部署视图
如图用户请求通过客户端先发送到nginx服务器,经过负载均衡后再通过zuul网关进行鉴权,流量过大时,还可以限制一部分流量继续访问后端服务。当然我们的应用也是集群部署在docker上的,所以这里需要用到nacos配置中心,以便让所有的应用实例都具有相同的配置,并且配置易更改。并且应用依赖的redis缓存服务,mysql持久化服务,以及kafka消息队列服务也是需要集群部署的,这样应用才能满足高并发需求。

9. 工作分配视图
本系统分为前端子系统和后端子系统两个部分
9.1 后端子系统分配视图

9.2 前端子系统分配视图

10. 数据库设计
10.1 User表
| 列名 | 类型 | 长度 | 非空 | 唯一 | 注释 |
|---|---|---|---|---|---|
| id | bigint | 20 | 是 | 是 | 用户ID |
| name | varchar | 20 | 是 | 否 | 用户名 |
| passwd | varchar | 40 | 是 | 否 | 用户密码 |
| varchar | 50 | 是 | 是 | 电子邮件地址 | |
| create_time | date | 是 | 否 | 创建时间 | |
| update_time | date | 是 | 否 | 修改时间 |
10.2 Article表
| 列名 | 类型 | 长度 | 非空 | 唯一 | 注释 |
|---|---|---|---|---|---|
| id | bigint | 20 | 是 | 是 | 文章ID |
| title | varchar | 40 | 是 | 否 | 文章标题 |
| body | text | 是 | 否 | 文章正文 | |
| create_time | date | 是 | 否 | 创建时间 |
10.3 OperateArticle表
| 列名 | 类型 | 长度 | 非空 | 唯一 | 注释 |
|---|---|---|---|---|---|
| id | bigint | 20 | 是 | 是 | 关联表中记录的标识 |
| userId | bigint | 20 | 是 | 否 | 用户Id |
| articleId | bigint | 20 | 是 | 是 | 文章ID |
| is_pub | int | 2 | 是 | 否 | 文章是否已经发布,0:未发布,1:已发布 |
| is_delete | int | 2 | 是 | 否 | 文章是否被删除 |
| create_time | date | 是 | 否 | 创建时间 | |
| update_time | date | 是 | 否 | 修改时间 |
10.4 Comment 表
| 列名 | 类型 | 长度 | 非空 | 唯一 | 注释 |
|---|---|---|---|---|---|
| id | bigint | 20 | 是 | 是 | 评论Id |
| content | text | 是 | 否 | 评论内容 | |
| create_time | date | 是 | 否 | 创建时间 |
10.5 OperateComment表
| 列名 | 类型 | 长度 | 非空 | 唯一 | 注释 |
|---|---|---|---|---|---|
| id | bigint | 20 | 是 | 是 | 用户与评论的关联Id |
| comment_id | bigint | 20 | 是 | 是 | 评论id |
| last_comment_id | bigint | 20 | 是 | 是 | 该条评论关联的上一条评论 |
| article_id | bigint | 20 | 是 | 否 | 该评论对应的文章id |
| user_id | bigint | 20 | 是 | 否 | 该评论对应的用户 |
| create_time | date | 是 | 否 | 创建时间 | |
| update_time | date | 是 | 否 | 修改时间 |
11. 运行环境及技术选型
开发语言:
- 后端:Java
- 前端:TypeScript
开发框架:
- 后端:SpringBoot
- 前端:Vue
IDE:
- 后端:Intellij IDEA
- 前端:Visual Studio Code
组件:
- 后端: spring(控制反转和面向切面的编程框架),springMVC(构建 Web 应用程序的全功能 MVC 模块),Mybatis(持久层框架), redis(用于文章缓存),kafka(写入日志流),nacos(作为应用集群的配置中心),mysql(用于数据持久化存储),nginx(反向代理,负载均衡), zuul(用于鉴权和限流)
- 前端:vue-cli(配置脚手架),vue-router(定义路由转发), bootstrap(定义页面所需小图标)
运行环境:
- 操作系统:CentOS 7
- 容器: K8s, docker
12. 概念原型核心工作机制
- 注册: 用户输入账号,密码,邮箱信息,点击注册
- 登录: 用户输入账号,密码,登录成功后跳转回首页
- 保存草稿:用户在编辑一部分文章之后,可以先保存为草稿。当用户想再次编辑文章时,可以将文章恢复到上一次保存的状态
- 发布文章:用户编辑好文章后,可以发布文章,这样所有用户便能看到发布后的文章,没有发布的文章处在草稿状态
- 更新文章:用户发布文章后,如果需要对文章进行修改,包括修改标题和正文,则可继续进入编辑页面进行修改,并点击更新按钮对文章进行更新
- 预览文章:用户可以在编辑之后,点击预览按钮,查看发布后的效果
- 查看专栏作者列表:用户可以看到已经发布过文章的专栏作者列表,可以从中选中感兴趣的作者
- 查看文章列表:用户可以在选中某位作者后,查看该作者已发布的文章列表
- 查看文章:用户可以在文章列表中点击某一篇文章,进入该文章的展示页面,进行浏览
- 评论文章:用户可以在查看文章页面的下方添加评论,同时也可以回复别的用户的评论
13. 总结
通过对仿知乎专栏的一系列分析过程,我学习并实操了软件工程中的一些很有用的建模方法,知道了在实现一个项目时,要使用各种图例来让整个项目的结构清晰明了,这样才能让我按部就班地执行下去。实际上,这些分析方法是非常有用的,不仅避免后期浪费时间去重构,而且对我以后的工作也产生了巨大帮助。我始终认为做程序员不能只是安分于做一个开发小模块的螺丝钉,而是要纵览全局,从整体上对系统进行把握。由此,学好软件工程变得尤为重要。

浙公网安备 33010602011771号