烤盐人——团队作业四系统设计和数据库设计
这个作业属于哪个课程 | <福州大学2021春软件工程实践S班> |
---|---|
这个作业要求在哪里 | <团队作业四——系统设计和数据库设计> |
团队名称 | 烤盐人 |
这个作业的目标 | 软件系统设计、数据库设计、补充上次答辩问题 |
其他参考文献 | 《软件工程》、... |
团队开发计划时间安排
阶段 | 工作内容 | 里程碑 |
---|---|---|
阶段1(4.24-4.30) | 初步编码实现登录注册模块、个人模块 | 搭建前端静态页面框架、后端完善基础功能接口 |
阶段2(5.1-5.7) | 实现浏览文章模块、社区模块 | 能够完成文章展示流程,社区基础切换、浏览社区文章 |
阶段3(5.8-5.14) | 实现后台基础管理模块,与后端对接调试 | 能够进行文章管理以及用户管理等基础后台功能 |
阶段4(5.15-5.21) | 实现帖子具体操作模块、资讯模块 | 能够进行文章的点赞、收藏、发布以及文章附件相关操作,资讯的页面展示 |
阶段5(5.22-5.28) | 个人、社区模块完善 | 能够进行个人页面、社区界面完整流程 |
阶段6(6.1-6.8) | 实现树洞模块,后台其他管理功能补充 | 实现树洞模块,后台的用户管理、通知管理 |
阶段7(6.9-6.15) | UI美化调整,代码测试,修复漏洞 | 调试修复项目,基础功能完善可用 |
阶段8(6.16-6.22) | 验收调试,总结经验 | 基本完成期望功能,实现文章的一些高级操作、个人收藏夹、树洞板块以及后台系统的充分管理 |
团队项目预期开发分工安排
昵称 | 角色 | 分工内容 |
---|---|---|
Starlite | 产品/前端 | 协调团队、协助前端、参与部分测试 |
hannahShaw | 产品/前端 | 前台首页页面 |
retrospection | 前端 | 前端框架搭建、后台管理界面 |
Gaoann | 前端 | 登录/注册页面、文章展示 |
谷雨yu | 前端 | 文章展示、协助后台界面 |
星夜的风 | 后端 | 后端框架搭建、权限管理、安全性控制、接口设计 |
郑开心 | 后端 | 文章部分增删改查(多种查询) |
羊一 | 后端 | 文章标签、收藏、举报部分增删改查 |
t0p1Crayon | 后端 | 管理员、公告、评论部分增删改查 |
系统设计
体系结构设计
本系统分为前后端分离的开发方式,前端框架为vue,页面状态采用vuex进行管理,使用router进行页面跳转,axios进行前后端通信,采用ElementUI作为UI库美化前端界面;后端框架为Spring Boot,后端数据库服务器为MySQL,数据库框架为mybatis-plus+druid连接池,权限管理框架使用sa-Token,前后端交互协议为https,接口文档使用swagger2+knife4j,日志框架为logback,缓存管理框架为redis。
功能模块图
-
用户包含两种:游客和已注册用户
-
游客主要由登录组成、浏览信息组成,浏览信息又由浏览首页、浏览资讯、浏览社区几个模块组成
-
已注册用户功能模块则比游客多,由登录注册、浏览信息、操作帖子、树洞、个人设置几个功能模块组成
-
其中已注册用户的浏览信息模块由浏览首页、浏览资讯、浏览社区、浏览通知组成
-
操作帖子模块则由发布帖子、收藏帖子、点赞帖子、查看帖子、回复帖子、搜索帖子几个主要功能模块组成
-
树洞模块则由发布树洞模块组成,而只有发布树洞才可以接收回复树洞,所以发布树洞又包含了接收和回复树洞模块组成
-
个人设置则包含了修改个人信息、查看收藏、查看个人发布三个功能模块
-
用户文章管理模块由搜索文章、查看文章详情、封禁文章、删除文章等主要功能模块组成
-
操作用户主要由搜索用户、查看用户详情、删除用户这些主要功能模块组成
-
操作通知主要由搜索通知、删除通知、发布通知、查看通知详情这些主要功能模块组成
-
官方文章管理模块主要有查看官方文章、搜索官方文章、发布官方文章、删除官方文章这些功能模块组成
ER分析
部分ER图
-
用户-博客
思路: 在表的设计中用户和博客间的的关系有两种:
一是用户可以发表博客,两者通过博客中的用户id外键关联,一个用户可以发表多篇博客,二者是一对多的关系;
二是用户可以收藏博客,有一个收藏表,用户id和博客id都作为外键,一个用户可以收藏多篇博客,每篇博客可以被多个用户收藏,所以二者是多对多的关系。
-
博客-评论
思路: 博客和一级评论表的关系是拥有关系,即博客拥有评论,二者通过一级评论表的博客id作为外键关联,一篇博客可以有多个评论,因此两者之间是一对多的关系
-
博客-模块
思路: 博客和模块的关系是拥有关系,即博客属于模块,模块拥有博客,两者通过博客中的模块id外键关联,一个模块可以拥有多篇博客,因此二者是一对多的关系。
-
博客-附件
思路: 博客和附件的关系是拥有,即能在博客中上传附件,两者通过附件表中博客id作为外键关联,一篇博客可以有多个附件,因此两者是多对多关系。
-
博客-标签
思路: 博客和标签的关系是拥有关系,即博客拥有标签,有一个博客标签表,博客id和标签id都作为外键,一个博客可以拥有多个标签,一种标签可以被多个博客拥有,所以二者是多对多的关系。
整体ER图
表结构设计
- 用户表 account
- 索引:主键索引
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
name | char | 32 | 是 | 是 | 用户名 |
nickname | char | 32 | 否 | 是 | 用户昵称 |
password | char | 64 | 否 | 是 | 登陆密码 |
status | char | 4 | 是 | 是 | 标识用户身份 |
char | 64 | 是 | 是 | 用户绑定的邮箱 | |
avatar | char | 64 | 是 | 是 | 用户头像 |
slogan | char | 256 | 是 | 是 | 个性签名 |
-
用户兴趣度表 account_interest
- 主键:id
- 外键:account_name、blog_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | ID |
account_name | char | 32 | 否 | 是 | 用户名 |
blog_id | int | 10 | 否 | 是 | 博客ID |
interest | float | 0 | 否 | 是 | 兴趣度 |
- 附件表 attachment
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | ID |
name | char | 64 | 否 | 是 | 附件名 |
-
博客表 blog
- 外键:module_id、author(account.name)
- 索引:module_id、author
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 唯一标识博客的字段 |
module_id | int | 10 | 否 | 是 | 博客所属模块id |
author | char | 32 | 否 | 是 | 作者名字 |
title | varchar | 256 | 否 | 是 | 博客标题 |
content | text | 0 | 否 | 是 | 博客内容 |
release_time | datetime | 0 | 否 | 是 | 发布时间 |
like_number | int | 10 | 否 | 是 | 点赞数 |
collection_number | int | 10 | 否 | 是 | 收藏数 |
state | tinyint | 4 | 否 | 是 | 博客状态 |
-
博客_附件关联表 blog_attachment
- 外键:blog_id、attachment_id
- 索引:blog_id、attachment_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | |
blog_id | int | 10 | 否 | 是 | 博客ID |
attachment_id | int | 10 | 否 | 是 | 附件ID |
- 博客_模块关联表 blog_module
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 模块ID |
name | char | 32 | 否 | 是 | 模块名称 |
-
博客_标签关联表 blog_tag
- 外键:tag_id、blog_id
- 索引:tag_id、blog_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | ID |
tag_id | int | 10 | 否 | 是 | 标签ID |
blog_id | int | 10 | 否 | 是 | 博客ID |
-
收藏表 collection
- 外键:account_name、blog_id
- 索引:account_name、blog_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 收藏ID |
account_name | int | 10 | 否 | 是 | 用户名 |
blog_id | int | 10 | 否 | 是 | 博客ID |
- 一级评论表 first_comment
- 外键:author、blog_id
- 索引:author、blog_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 评论ID |
blog_id | int | 10 | 否 | 是 | 博客ID |
author | char | 32 | 否 | 是 | 发布者姓名 |
content | text | 0 | 否 | 是 | 评论内容 |
release_time | datetime | 0 | 否 | 是 | 发表时间 |
- 二级评论表 secondary_comment
- 外键:comment_id、author、account_name
- 索引:comment_id、author、account_name
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 评论ID |
comment_id | int | 10 | 否 | 是 | 被评论评论ID |
author | char | 32 | 否 | 是 | 发布者姓名 |
account_name | char | 32 | 否 | 是 | 被评论用户 |
content | text | 0 | 否 | 是 | 评论内容 |
release_time | datetime | 0 | 否 | 是 | 发表时间 |
- 公告表 notice
- 外键:account_name、author
- 索引account_name、author
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 公告ID |
author | char | 32 | 否 | 是 | 作者 |
title | varchar | 256 | 否 | 是 | 公告标题 |
content | text | 0 | 否 | 是 | 公告内容 |
release_time | datetime | 0 | 否 | 是 | 发表时间 |
account_name | char | 32 | 否 | 是 | 接收用户 |
- 权限表 permission
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 权限ID |
name | char | 32 | 否 | 是 | 权限名称 |
- 角色表 role
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 角色ID |
name | char | 32 | 否 | 是 | 角色名称 |
- 角色_权限关联表 role__permission
- 外键:role_id、permission_id
- 索引:role_id、permission_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | ID |
role_id | int | 10 | 否 | 是 | 角色ID |
permission_id | int | 10 | 否 | 是 | 权限ID |
- 标签表 tag
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | 标签ID |
name | char | 32 | 否 | 是 | 标签名称 |
- 举报表 tip_off
- 外键:blog_id
- 索引:blog_id
字段名 | 数据类型 | 数据长度 | 主键 | 非空 | 注解 |
---|---|---|---|---|---|
id | int | 10 | 是 | 是 | ID |
blog_id | int | 10 | 否 | 是 | 被举报博客ID |
count | int | 10 | 否 | 是 | 举报数量 |
数据库设计
类图
思路:
- 晒研论坛作为一个考研信息论坛,最主要的就是承载信息的文章类以及用户类。文章类拥有基础的标题、内容、作者、时间等,这些都作为文章的数据属性而存在;用户则有账号、密码、邮箱等基础数据属性。
- 其次考研论坛也应该拥有多个子板块,所以添加设计了板块类以及文章分类可用的标签类。
- 相应的文章拥有许多操作:点赞、收藏、评论、举报,这些记录也都一一构成类,其中评论还能分为一级二级评论。同时文章有携带附件的需求,就产生了附件类。
- 我们晒研论坛的用户也有划分:普通用户、管理员,他们之间的权限,角色也应该成为类。
系统安全和权限设计
系统安全
前后端数据传输
前后端接口我们使用https协议,该协议会在传输层对传输的数据进行加密,可以防止一些抓包工具获取明文数据。主要优点有:内容采用混合加密技术,中间者无法直接查看明文内容;通过证书验证客户端访问的是自己的服务端;数据进行签名加密,可以防止数据被冒充或篡改。
传输数据进行过滤
为了防止XSS攻击、SQL注入攻击,后端会先对传输的数据进行过滤,然后再处理过滤后的数据。
数据库加密储存
为了防止数据库泄露或其它情况造成的用户私密信息(如登录密码等信息)泄露,所有存储在数据库中的私密数据都是加密后再存储的。用户登录密码会进行 md5(加盐)加密后存储在数据库中。
前端使用验证码
前端发送验证码的按钮设置两次的间隔时间为60s,防止被恶意刷按钮造成后端大量请求阻塞。
密码安全等级
用户注册的时候对密码的安全等级进行要求,必须达到一定的安全等级才能注册成功。
密码防爆破
用户连续输错密码三次后需要等待5分钟才能再次输入,用户连续输错密码5次后将发送邮件给用户示警。
接口防爆破
后端使用拦截器拦截用户的每次请求,如果某个用户在短时间内频繁大量访问同一个接口,该请求将会被拦截。
token验证身份
为了防止CSRF攻击,我们将会使用jwt机制,每一次后端请求将会检查经过签名后的token数据,如果非法将禁止访问。
唯一登录
每个用户在同一时间段仅能维护一个登录的客户端,用户最新一次的登录将会把用户上次的登录踢下线。
权限设计
游客、封禁用户
仅支持博客、评论、各个板块的查询功能
普通用户
博客、评论、板块的增加、删除、修改、查询
收藏、举报博客
接收公告
树洞功能
管理员
用户、博客的封禁
用户统计数据
博客统计数据
回答问题
-
考研论坛需要能够分享文件,以满足同学在搜索具体考研信息时的需求。
对于这一需求我们认真分析了一下,决定采用文章可携带文章附件的形式,这样既能保持文章的可读性,同样也能拥有附带文件的便利性,这一文件功能主要就是同类部分关键资源的交流分享。
同样在类图和er图中我们也添加了文章附件的描述。
-
用况图中用况之间的关系描述不足。
我们这次重新绘制了用况图
团队分工
工作流程
现在团队内进行任务划分
每个人工作完成后上传到团队文档仓库共享进度
最后由文档整理的同学整合排版
过程中采用github project进行项目管理
组员分工
学号 | 昵称 | 分工内容 |
---|---|---|
221801314 | Starlite | 博客整理、数据流图、工作计划制定、答辩 |
221801226 | hannahShaw | 体系结构设计+功能模块、前端工作计划制定 |
221801235 | retrospection | 接口设计文档、评审表制作 |
221801203 | Gaoann | 系统设计文档 |
221801127 | 谷雨yu | 体系结构设计+功能模块、UML图修改、数据流图 |
221801334 | 星夜的风 | 数据库设计、系统安全性和权限设计、接口设计文档、后端工作计划制定 |
221801319 | 郑开心 | 数据字典整理、ER图+表结构设计、数据库文档辅助 |
221801325 | 羊一 | 数据库设计文档、ppt制作 |
221801310 | t0p1Crayon | ER图+表结构设计、数据库文档辅助 |
贡献度比例
学号 | 昵称 | 贡献度 |
---|---|---|
221801314 | Starlite | 16.7 |
221801226 | hannahShaw | 8.3 |
221801235 | retrospection | 10.4 |
221801203 | Gaoann | 6.25 |
221801127 | 谷雨yu | 14.6 |
221801334 | 星夜的风 | 14.6 |
221801319 | 郑开心 | 10.4 |
221801325 | 羊一 | 12.5 |
221801310 | t0p1Crayon | 6.25 |