1、前言
此博客是以本小组的工程实践项目——设计一个类知乎问答系统为基础,结合课堂所讲的高级软件工程相关知识,进行了软件系统分析和设计,最终形成了软件系统的概念原型。
并且,在此基础上,总结了项目设计方案中所蕴含的软件结构特点,比如设计模式、软件架构风格与策略等。同时,在了解了不同视图的概念后,如分解视图、依赖视图、泛化视图、执行视图、实现视图、部署视图、工作分配视图等,采用了其中的一些视图来进行项目的软件系统概念原型的描述。
最后,举例说明了系统概念原型的核心工作机制。
2、项目概述
设计一个类似知乎问答系统
基本要求:
支持问题、回答的发布和修改(文字)
问题拉链,支持按热度和时间序排序
回答点踩
热门问题列表
编写技术文档,介绍代码设计思路
进阶要求:
支持高并发
支持评论
问题、回答支持图片
支持第三方登录
支持第三方分享
3、软件设计方案
3.1软件结构
本系统采取浏览器请求,服务器响应的工作模式。在 B/S 模式中,用户是通过浏览器针对许多分布于网络上的服务器进行请求访问的,浏览器的请求通过服务器进行处理,并将处理结果以及相应的信息返回给浏览器,其他的数据加工、请求全部都是由Web Server完成的。类似于传统的 MVC 软件架构,本项目采用前后端分离的软件架构,在该项目中,前端就是客户端,后端也就是服务端。前端负责 View 和 Controller 层 ,而后端负责Model层,为前端提供一系列的 api 接口,重点关注业务/数据处理等。
前后端分离的优势:
-
实现真正的前后端解耦。页面逻辑,跳转错误,页面样式等问题,全部由前端工程师来负责。接口数据出错,数据没有提交成功,应答超时等问题,全部由后端工程师来解决。双方互不干扰。
-
通过一些代码重构,也可以大量复用接口,提升效率。
-
增加代码的维护性,易读性。
-
提升开发效率,因为可以前后端并行开发,而不是像以前的强依赖。
3.2接口API
API 定义了客户端与服务端数据交互的基本格式,包括客户端以怎样的格式请求,请求参数,服务端以怎样的格式响应,正确响应与错误响应的不同内容等。
本项目采用 RestfulAPI 风格的接口设计,以下是部分 API 的简要说明:
接口名称 | 接口地址 | 请求方式 |
请求参数 | 响应信息 | 备注 |
---|---|---|---|---|---|
用户注册 | /user/register | POST | 用户名,密码,密码确认 | 用户基本信息 | |
用户登录 | /user/login | POST | 用户名,密码 | 用户token,基本信息 | 用户token保存用户的登录状态,保存到本地,请求其它接口的时候带上。 |
个人信息 | /user/me | POST | 用户token | 用户完整信息 | |
发布问题 | /questions | POST | 用户token,问题标题,可选的问题详细描述 | 问题基本信息 | 已登录用户才可发布问题,未携带token会拒绝服务 |
查看问题 | /questions/{qid} | GET | 可选的用户token | 问题详细信息 | |
修改问题 | /questions/{qid} | PUT | 用户token,问题标题,可选的问题详细描述 | 问题基本信息 | 问题所属用户才可修改问题 |
删除问题 | /questions/{qid} | DELETE | 用户token | ok | 问题所属用户才可删除问题 |
首页推荐列表 | /questions | GET | limit请求数量,offset位置偏移 | 问题列表,每个问题包含一个一段时间内的热门回答信息 | |
问题热榜列表 | /hot_questions | GET | limit请求数量,offset位置偏移 | 问题列表 | |
回答问题 | /questions/{qid}/answers | POST | 用户token,回答内容 | 回答基本信息 | 已登录用户才可回答问题,未携带token会拒绝服务 |
查看回答 | /questions/{qid}/answers/{aid} | GET | 可选的用户token | 回答详细信息 | |
修改回答 | /questions/{qid}/answers/{aid} | PUT | 用户token,回答内容 | 回答基本信息 | 问题所属用户才可修改回答 |
删除回答 | /questions/{qid}/answers/{aid} | DELETE | 用户token | ok | 问题所属用户才可删除回答 |
回答列表 | /questions/{qid}/answers | GET | limit请求数量,offset位置偏移,type排序方式 | 回答列表 |
注:请求格式支持 form 和 json,响应格式统一为 json,错误响应均包含错误码和描述信息,以上仅说明正确响应
4、软件系统概念原型的不同视图
软件架构模型是通过一组关键视图来描述的,同一个软件架构,由于选取的视角(Perspective)和抽象层次不同可以得到不同的视图,这样一组关键视图搭配起来可以完整地描述一个逻辑自洽的软件架构模型。一般来说,我们常用的几种视图有分解视图、依赖视图、泛化视图、执行视图、实现视图、部署视图和工作任务分配视图。
- 分解视图
对系统的常用分解方法有面向功能分解,面向数据分解,面向特征分解,面向并发分解等,根据本项目的特点,比较适合面向功能的分解方法,分解视图如下:
- 依赖视图
依赖视图展现了软件模块之间的依赖关系。本项目最前端使用 Nginx 部署应用,数据来源于后端的 MySQL 和 Redis 数据库,同时在应用层内各模块间也存在依赖关系,据此可以画出项目的依赖视图:
- 执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。
本项目是一个后端项目,根据客户端的不同请求执行不同的操作,从整体上来说,每一次操作都可以用如下时序图概括:
- 部署视图
项目前期采用单点部署,各组件运行于一台服务器上,视图如下:
后期可升级为分布式结构来提高可靠性和提供更大的吞吐量:
- 分配视图
工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员,本项目是一个面向 API 服务的程序,最终目标是实现一系列功能完备的接口,所以最好的分解方法就是按照接口分解,每个成员负责几个接口实现:
5、项目的数据库设计
基于上述分析,可以得到以下数据表
1、user表
字段 | 类型 | 注释 |
---|---|---|
user_id | int | 用户 id |
username | varchar(50) | 用户名 |
simple_desc | varchar(50) | 简介 |
varchar(50) | 邮箱 | |
password | varchar(50) | 密码 |
join_time | bigint | 加入时间 |
liked_count | int | 被点赞数 |
followed_count | int | 被关注数 |
follow_count | int | 关注数 |
collection | int | 收藏夹数 |
2、topic表
字段 | 类型 | 注释 |
---|---|---|
topic_id | int | 话题 id |
topic_name | varchar(30) | 话题名字 |
topic_desc | text | 话题描述 |
create_time | bigint | 创建时间 |
followed_count | int | 被关注数 |
3、collection表
字段 | 类型 | 注释 |
---|---|---|
collection_id | int | 收藏夹 id |
collection_name | varchar(100) | 收藏夹名字 |
create_time | bigint | 创建时间 |
user_id | int | 所属用户 id |
followed_count | int | 被关注数 |
4、question表
字段 | 类型 | 注释 |
---|---|---|
question_id | int | 问题 id |
question_title | varchar(255) | 问题题目 |
question_content | varchar(200) | 问题内容 |
create_time | bigint | 创建时间 |
topic_id | int | 所属话题 id |
followed_count | int | 被关注数 |
5、answer表
字段 | 类型 | 注释 |
---|---|---|
answer_id | int | 答案 id |
answer_content | text | 答案内容 |
create_time | bigint | 创建时间 |
question_id | int | 所属问题 id |
user_id | int | 回答用户 id |
liked_count | int | 被点赞数 |
6、comment 表
字段 | 类型 | 注释 |
---|---|---|
comment_id | int | 评论 id |
comment_content | text | 评论内容 |
create_time | bigint | 创建时间 |
user_id | int | 所属用户 id |
answer_id | int | 所属答案 id |
followed_count | int | 被关注数 |
6、软件系统运行环境和技术选型
6.1、运行环境
6.2 技术选型
项目使用Java开发,用到的框架主要有:
-
- springboot: 功能型Web框架
- Mybatis-plus: ORM工具,本项目需要配合MySQL使用
- SpringCloud:分布式微服务
- Redis: 用于缓存相关功能
- RabbitMQ:消息队列中间件
- 集成开发环境:IDEA
- 接口调试工具:Postman
7、核心工作机制
- 用户通过邮箱注册并登录。
- 用户提出并回答问题。
- 用户对问题和答案进行评论、点赞和关注。
- 用户在收藏夹内查看关注的话题、问题、答案和关注。