這個作業屬於哪個課程 | <福州大學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 |