一、實驗題目
灌水論壇系統
二、實驗目的
旨在通過一個相對完整且功能豐富的Web應用實例,全面地實踐和鞏固Web開發所需的各項核心技術和工程方法,從而提升其綜合應用能力和解決實際開發問題的能力。它不僅僅是完成一個軟件,更是一個學習、實踐和提升的過程
靈感:想要設計一個類似于 CSDN 的博客論壇,可以在里面分享自己的知識、感受,大家也可以在里面交流
三、總體設計(含背景知識或基本原理與算法、或模塊介紹、設計步驟等)
1. 項目背景與需求分析
灌水論壇系統是一個基于Java Web技術的現代化網絡論壇平臺,旨在為用戶提供一個分享知識、交流經驗、發布內容的在線社區。該系統以輕量級論壇為設計目標,注重用戶體驗和系統性能。
1.1 核心需求
- 用戶管理:支持用戶注冊、登錄、信息修改、密碼變更等基本功能
- 內容管理:支持用戶發布帖子、回復、點贊、閱讀統計等功能
- 版塊管理:支持多個專業分類版塊,便于用戶按興趣瀏覽內容
- 交互功能:提供用戶間的私信交流功能
- 搜索功能:提供帖子和用戶的快速檢索功能
1.2 用戶角色
- 普通用戶:注冊用戶,可以瀏覽、發帖、回復、點贊
- 管理員:擁有內容管理權限,可以維護論壇秩序
1.3 相關技術及工具
服務器端技術:Spring、Spring Boot、Spring MVC、MyBatis
瀏覽器端技術:HTML、CSS、JavaScript、jQuery、Bootstrap
數據庫:MySQL
項目構建工具:Maven
版本控制工具:Git + GITEE
2. 系統架構設計
2.1 總體架構
系統采用經典的三層架構模式,實現了前后端的邏輯分離:
-
表示層(前端):
- 基于HTML、CSS、JavaScript構建用戶界面
- 使用Tabler UI框架提供現代化的界面組件
- 采用AJAX技術實現異步數據交互
-
業務邏輯層(后端):
- 基于Spring Boot框架實現RESTful API
- 使用MVC設計模式組織代碼結構
- 通過Service層封裝業務邏輯
-
數據訪問層:
- 使用MyBatis作為ORM框架
- 設計規范化的MySQL數據庫結構
- 實現高效的數據訪問和操作
2.2 技術架構
客戶端層:HTML + CSS + JavaScript + Tabler UI|| HTTP/HTTPSv
應用服務層:Spring Boot + Spring MVC + Swagger|| MyBatisv
數據存儲層:MySQL數據庫
3. 數據庫設計
系統采用MySQL數據庫,設計了規范化的數據表結構:
3.1 核心表設計
公共字段:無特殊要求的情況下,每張表必須有長整型的自增主鍵,刪除狀態、創建時間、更新時間,如下所示:
字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號,主鍵自增 | |
state | tinyint | Y | N | 0 | 狀態,0正常,1禁用 |
deletState | tinyint | Y | N | 0 | 是否刪除,0否,1是 |
creatTime | dateTime | Y | N | 創建時間,精確到 s | |
updateTime | dateTime | Y | N | 更新時間,精確到 s |
(1)用戶表 (t_user):
- 存儲用戶基本信息,包括賬號、密碼、個人資料
- 采用鹽值加密技術保護用戶密碼安全
- 字段設計:id、username、password、nickname、phoneNum、email、gender、salt、avatarUrl、articleCount、isAdmin、remark、state、deleteState、createTime、updateTime
字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號, 主鍵自增 | |
username | varchar(20) | Y | N | 用戶名, 唯一 | |
password | varchar(32) | Y | N | 加密后密碼 | |
nickname | varchar(50) | Y | N | 昵稱 | |
phoneNum | varchar(20) | N | N | NULL | 手機號 |
varchar(50) | N | N | NULL | 電子郵箱 | |
gender | tinyint | Y | N | 2 | 性別: 0女, 1男, 2保密 |
salt | varchar(32) | Y | N | 密碼加密 | |
avatarUrl | varchar(255) | N | N | NULL | 用戶頭像路徑 |
articleCount | int | Y | N | 0 | 發帖數量 |
isAdmin | tinyint | Y | N | 0 | 是否管理員: 0否, 1是 |
remark | varchar(1000) | N | N | NULL | 備注, 自我介紹 |
state | tinyint | Y | N | 0 | 狀態: 0正常, 1禁言 |
deleteState | tinyint | Y | N | 0 | 是否刪除: 0否, 1是 |
createTime | datetime | Y | N | 創建時間, 精確到秒 | |
updateTime | datetime | Y | N | 更新時間, 精確到秒 |
注意:這里存圖片我們用的是路徑,而不是直接存圖片本身,這樣大大減少服務器占用空間(用圖床存圖片,然后從圖床提出圖片即可)
(2)版塊表 (t_board):
- 管理論壇的分類板塊信息
- 字段設計:id、name、articleCount、sort、state、deleteState、createTime、updateTime
字段 字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號, 主鍵自增 | |
name | varchar(50) | Y | N | 版塊名 | |
articleCount | int | Y | N | 0 | 帖子數量 |
sort | int | Y | N | 0 | 排序優先級, 升序 |
state | tinyint | Y | N | 0 | 狀態: 0正常, 1禁用 |
deleteState | tinyint | Y | N | 0 | 是否刪除: 0否, 1是 |
createTime | datetime | Y | N | 創建時間, 精確到秒 | |
updateTime | datetime | Y | N | 更新時間, 精確到秒 |
(3)帖子表 (t_article):
- 存儲用戶發布的帖子內容
- 記錄帖子的訪問量、回復數、點贊數等統計信息
- 字段設計:id、boardId、userId、title、content、visitCount、replyCount、likeCount、state、deleteState、createTime、updateTime
字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號,主鍵自增 | |
boardId | bigint | Y | N | 編號, 主鍵自增 (應為版塊編號) | |
userId | bigint | Y | N | 發帖人, 關聯用戶編號 | |
title | varchar(100) | Y | N | 帖子標題 | |
content | text | Y | N | 帖子正文 | |
visitCount | int | Y | N | 0 | 訪問量 |
replyCount | int | Y | N | 0 | 回復數 |
likeCount | int | Y | N | 0 | 點贊數 |
state | tinyint | Y | N | 0 | 狀態: 0正常, 1禁用 |
deleteState | tinyint | Y | N | 0 | 是否刪除: 0否, 1是 |
createTime | datetime | Y | N | 創建時間, 精確到秒 | |
updateTime | datetime | Y | N | 更新時間, 精確到秒 |
(4)帖子回復表 (t_article_reply):
- 存儲用戶對帖子的回復內容
- 支持樓中樓回復功能
- 字段設計:id、articleId、postUserId、replyId、replyUserId、content、likeCount、state、deleteState、createTime、updateTime
字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號, 主鍵自增 | |
articleId | bigint | Y | N | 關聯帖子編號 | |
postUserId | bigint | Y | N | 樓主用戶, 關聯用戶編號 | |
replyId | bigint(20) | N | N | NULL | 關聯回復編號, 支持樓中樓 |
replyUserId | bigint(20) | N | N | NULL | 樓主下的回復用戶編號, 支持樓中樓 |
content | varchar(500) | Y | N | 回貼內容 | |
likeCount | int | Y | N | 回貼內容 (應為點贊數) | |
state | tinyint | Y | N | 0 | 狀態: 0正常, 1禁用 |
deleteState | tinyint | Y | N | 0 | 是否刪除: 0否, 1是 |
createTime | datetime | Y | N | 創建時間, 精確到秒 | |
updateTime | datetime | Y | N | 更新時間, 精確到秒 |
(5)站內信表 (t_message):
- 管理用戶間的私信內容
- 字段設計:id、postUserId、receiveUserId、content、state、deleteState、createTime、updateTime
字段 | 類型 | 非空(Y/N) | 主鍵(Y/N) | 默認值 | 備注 |
---|---|---|---|---|---|
id | bigint | Y | Y | 編號, 主鍵自增 | |
postUserId | bigint | Y | N | 發送者, 關聯用戶編號 | |
receiveUserId | bigint | Y | N | 接收者, 關聯用戶編號 | |
content | varchar(255) | Y | N | 內容 | |
state | tinyint | Y | N | 0 | 狀態: 0正常, 1禁用 |
deleteState | tinyint | Y | N | 0 | 是否刪除: 0否, 1是 |
createTime | datetime | Y | N | 創建時間, 精確到秒 | |
updateTime | datetime | Y | N | 更新時間, 精確到秒 |
3.2 數據關系
- 用戶與帖子:一對多關系,一個用戶可以發布多個帖子
- 版塊與帖子:一對多關系,一個版塊可以包含多個帖子
- 帖子與回復:一對多關系,一個帖子可以有多個回復
- 回復與回復:自引用關系,實現樓中樓回復功能
- 用戶與私信:多對多關系,通過postUserId和receiveUserId建立聯系
3.3 數據優化設計
- 使用軟刪除機制,通過deleteState字段標記刪除狀態,避免物理刪除帶來的數據丟失風險
- 在高頻查詢字段上建立索引,提高查詢效率
- 使用createTime和updateTime記錄數據的生命周期
4. 模塊設計與功能實現
4.1 用戶模塊
用戶模塊負責用戶賬號生命周期管理,核心功能包括:
- 用戶注冊:
- 實現:通過UserController的register方法處理用戶注冊請求
- 安全措施:使用MD5+Salt方式加密存儲密碼
- 數據校驗:實現用戶名唯一性校驗,密碼復雜度檢查
- 用戶登錄:
- 實現:通過UserController的login方法處理用戶登錄請求
- 會話管理:成功登錄后將用戶信息存入Session
- 安全控制:限制登錄失敗次數,防止暴力破解
- 個人信息管理:
- 實現:通過UserController的modifyInfo方法處理個人信息更新
- 功能:支持修改昵稱、頭像、個人簡介等信息
- 密碼管理:
- 實現:通過UserController的modifyPassword方法處理密碼修改
- 安全措施:驗證原密碼,確保新密碼符合復雜度要求
4.2 內容模塊
內容模塊負責論壇核心內容的發布和管理,主要功能包括:
-
帖子發布:
- 實現:通過ArticleController的createArticle方法處理帖子創建請求
- 功能:支持富文本編輯,內容格式化存儲
-
帖子列表:
- 實現:通過ArticleController的getArticleList方法獲取帖子列表
- 分頁機制:支持分頁查詢,減輕服務器負擔
- 排序機制:支持按最新、最熱等多種方式排序
-
帖子詳情:
- 實現:通過ArticleController的getArticleDetail方法獲取帖子詳情
- 閱讀統計:自動增加帖子訪問計數
- 關聯數據:同時加載帖子回復信息
-
回復管理:
- 實現:通過ArticleReplyController管理回復相關功能
- 支持樓層回復和樓中樓回復兩種模式
4.3 版塊模塊
版塊模塊負責論壇分類管理,主要功能包括:
-
版塊列表:
- 實現:通過BoardController的getBoardList方法獲取版塊列表
- 排序機制:根據sort字段確定版塊顯示順序
-
版塊內容:
- 實現:結合ArticleController,獲取特定版塊下的帖子列表
- 統計信息:展示版塊活躍度、帖子數量等信息
4.4 消息模塊
消息模塊提供用戶間的私信功能,主要實現包括:
-
消息發送:
- 實現:通過MessageController的sendMessage方法處理消息發送請求
- 安全控制:限制發送頻率,防止騷擾
-
消息列表:
- 實現:通過MessageController的getMessageList方法獲取消息列表
- 分組展示:區分已讀和未讀消息
4.5 搜索模塊
搜索模塊提供內容檢索功能,實現在帖子和用戶中快速查找:
-
帖子搜索:
- 實現:通過ArticleController的searchArticles方法處理搜索請求
- 支持按標題、內容、作者等多維度搜索
-
用戶搜索:
- 實現:通過UserController提供用戶檢索功能
- 搜索優化:采用模糊匹配和排序機制提高搜索體驗
5. 技術實現與關鍵算法
5.1 安全認證機制
系統采用基于Session的認證機制,實現流程如下:
- 用戶提交用戶名和密碼
- 服務器驗證憑據:
- 獲取用戶鹽值(salt)
- 使用MD5算法結合鹽值計算密碼哈希值
- 與數據庫存儲的密碼哈希值比對
- 驗證成功后,將用戶信息存儲在Session中
- 后續請求通過攔截器驗證Session中是否存在有效用戶信息
5.2 密碼加密算法
系統使用MD5+Salt的方式存儲密碼,具體實現:
- 注冊時生成隨機32位鹽值(UUID生成)
- 將密碼明文與鹽值拼接后進行MD5哈希
- 存儲哈希結果和鹽值到數據庫
- 登錄時重復上述哈希過程并比對結果
5.3 分頁算法
系統采用物理分頁方式,在SQL層面實現數據分頁,減輕服務器內存壓力:
- 接收頁碼(pageNum)和每頁大小(pageSize)
- 計算偏移量 offset = (pageNum - 1) * pageSize
- 使用MyBatis分頁插件或原生SQL的LIMIT子句實現數據庫分頁查詢
- 同時查詢總記錄數,用于前端分頁控件展示
6. 前端設計與實現
6.1 整體界面設計
前端采用Tabler UI框架,實現現代化、響應式的界面設計:
-
布局結構:
- 頂部導航欄:包含logo、搜索框、用戶頭像等元素
- 版塊導航:顯示所有論壇版塊
- 內容區域:根據不同頁面展示不同內容
- 側邊欄:展示熱門內容、統計信息等
-
響應式設計:
- 使用Bootstrap柵格系統適配不同屏幕尺寸
- 移動端優化,確保在手機上有良好體驗
6.2 核心頁面
系統包含多個核心頁面,各自負責不同功能:
-
首頁(index.html):
- 展示版塊列表和熱門帖子
- 實現快速導航和搜索功能
-
帖子詳情頁(details.html):
- 展示帖子完整內容和回復列表
- 提供回復、點贊等交互功能
-
個人中心(profile.html、settings.html):
- 展示用戶個人信息和帖子統計
- 提供個人信息編輯功能
-
發帖頁(article_edit.html):
- 集成富文本編輯器
- 提供帖子編輯和預覽功能
7. 系統擴展性與維護性設計
7.1 擴展性設計
系統在設計時考慮了后續功能擴展需求:
-
模塊化設計:
- 遵循高內聚低耦合原則
- 各功能模塊相對獨立,便于擴展
-
接口設計:
- 使用RESTful API設計風格
- 通過Swagger提供API文檔,便于前后端協作
-
配置外部化:
- 關鍵配置項通過application.yml集中管理
- 可根據不同環境切換配置
7.2 維護性設計
-
日志系統:
- 集成日志框架,記錄系統運行狀態
- 不同級別的日志分類存儲,便于問題排查
-
異常處理:
- 全局異常處理機制,統一異常響應格式
- 詳細的錯誤信息記錄,便于定位問題
-
代碼規范:
- 采用統一的命名規范和代碼風格
- 適當的注釋和文檔,提高代碼可讀性
四、詳細設計(含主要的數據結構、程序流程圖、關鍵代碼等)
1. 核心數據結構 (Java Model Classes)及代碼
這些數據結構是項目中核心實體的 Java 對象表示,主要通過 Lombok 的 @Data
注解自動生成 getter
, setter
, toString
等方法,并使用 Swagger 注解提供 API 文檔信息。
1.1 User (用戶信息)
描述:存儲用戶的基本信息、認證信息和狀態。
public class User {private Long id;@ApiModelProperty("用戶名")private String username;@JsonIgnore // 不參與JSON序列化private String password;@ApiModelProperty("昵稱")private String nickname;// ... 其他字段 ...@ApiModelProperty("頭像地址")@JsonInclude(JsonInclude.Include.ALWAYS) // 強制參與JSON序列化private String avatarUrl;// ... 其他字段 ...@ApiModelProperty("注冊日期")private Date createTime;private Date updateTime;
}
1.2 Article(帖子信息)
@Data
@ApiModel("用戶信息")
public class User {private Long id; // 用戶ID@ApiModelProperty("用戶名")private String username; // 登錄用戶名@JsonIgnore // JSON序列化時忽略密碼private String password; // 加密后的密碼@ApiModelProperty("昵稱")private String nickname; // 顯示昵稱@ApiModelProperty("電話號碼")private String phoneNum; // 電話號碼@ApiModelProperty("郵箱")private String email; // 電子郵箱@ApiModelProperty("性別")private Byte gender; // 性別(0女,1男,2保密)@JsonIgnoreprivate String salt; // 密碼加密鹽值@ApiModelProperty("頭像地址")private String avatarUrl; // 頭像URL@ApiModelProperty("發帖數量")private Integer articleCount; // 發帖數@ApiModelProperty("是否管理員")private Byte isAdmin; // 管理員標識@ApiModelProperty("個人簡介")private String remark; // 個人簡介private Byte state; // 用戶狀態private Date createTime; // 注冊時間private Date updateTime; // 更新時間
}
1.3 ArticleReply (回復信息)
@Data
public class ArticleReply {private Long id; // 回復IDprivate Long articleId; // 關聯帖子IDprivate Long postUserId; // 回復者IDprivate Long replyId; // 被回復的回復ID(樓中樓)private Long replyUserId; // 被回復者IDprivate String content; // 回復內容private Integer likeCount; // 點贊數private Byte state; // 回復狀態private Date createTime; // 回復時間private Date updateTime; // 更新時間private User user; // 關聯的用戶信息
}
2. 核心功能實現
2.1 用戶認證模塊
(1)密碼加密實現
public class MD5Util {// 使用MD5+鹽值加密public static String md5Salt(String password, String salt) {String passwordSalt = password + salt;return DigestUtils.md5DigestAsHex(passwordSalt.getBytes());}
}
(2)用戶登錄實現
@Service
public class UserServiceImpl implements IUserService {@Resourceprivate UserMapper userMapper;@Overridepublic User login(String username, String password) {// 1. 根據用戶名查詢用戶User user = userMapper.selectByUsername(username);if (user == null) {return null;}// 2. 驗證密碼String encryptPassword = MD5Util.md5Salt(password, user.getSalt());if (!encryptPassword.equals(user.getPassword())) {return null;}// 3. 清除敏感信息user.setPassword(null);user.setSalt(null);return user;}
}
2.2 帖子管理模塊
(1)發帖實現
@Service
public class ArticleServiceImpl implements IArticleService {@Resourceprivate ArticleMapper articleMapper;@Resourceprivate BoardMapper boardMapper;@Override@Transactionalpublic void createArticle(Article article) {// 1. 設置初始值article.setVisitCount(0);article.setReplyCount(0);article.setLikeCount(0);article.setState((byte)0);article.setCreateTime(new Date());article.setUpdateTime(new Date());// 2. 保存帖子articleMapper.insert(article);// 3. 更新版塊帖子數boardMapper.incrementArticleCount(article.getBoardId());}
}
(2)帖子列表查詢
@Service
public class ArticleServiceImpl implements IArticleService {@Overridepublic PageInfo<Article> getArticleList(Integer pageNum, Integer pageSize, Long boardId) {// 1. 設置分頁PageHelper.startPage(pageNum, pageSize);// 2. 查詢條件ArticleExample example = new ArticleExample();if (boardId != null) {example.createCriteria().andBoardIdEqualTo(boardId).andStateEqualTo((byte)0);}example.setOrderByClause("create_time desc");// 3. 執行查詢List<Article> articles = articleMapper.selectByExample(example);// 4. 填充用戶信息for (Article article : articles) {User user = userMapper.selectByPrimaryKey(article.getUserId());article.setUser(user);}return new PageInfo<>(articles);}
}
2.3 回復管理模塊
樓中樓回復實現
@Service
public class ArticleReplyServiceImpl implements IArticleReplyService {@Override@Transactionalpublic void reply(ArticleReply reply) {// 1. 設置初始值reply.setLikeCount(0);reply.setState((byte)0);reply.setCreateTime(new Date());reply.setUpdateTime(new Date());// 2. 保存回復replyMapper.insert(reply);// 3. 更新帖子回復數Article article = articleMapper.selectByPrimaryKey(reply.getArticleId());article.setReplyCount(article.getReplyCount() + 1);articleMapper.updateByPrimaryKey(article);}
}
3. 關鍵功能設計
(1)分頁查詢實現
使用 PageHelper 實現物理分頁:
// 配置分頁插件
@Configuration
public class MybatisConfig {@Beanpublic PageInterceptor pageInterceptor() {return new PageInterceptor();}
}// 使用分頁
public PageInfo<Article> getArticleList(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);List<Article> list = articleMapper.selectByExample(new ArticleExample());return new PageInfo<>(list);
}
(2)統一響應處理
@Data
public class AppResult<T> {private Integer code; // 狀態碼private String message; // 提示信息private T data; // 響應數據public static <T> AppResult<T> success(T data) {AppResult<T> result = new AppResult<>();result.setCode(0);result.setMessage("success");result.setData(data);return result;}public static AppResult failed(ResultCode resultCode) {AppResult result = new AppResult();result.setCode(resultCode.getCode());result.setMessage(resultCode.getMessage());return result;}
}
(3)安全控制實現
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1. 獲取sessionHttpSession session = request.getSession(false);if (session == null) {response.sendRedirect("/sign-in.html");return false;}// 2. 驗證用戶登錄狀態User user = (User) session.getAttribute(AppConfig.USER_SESSION);if (user == null) {response.sendRedirect("/sign-in.html");return false;}return true;}
}
(4)文件上傳實現
@RestController
@RequestMapping("/upload")
public class UploadController {@PostMapping("/image")public AppResult<String> uploadImage(@RequestParam("file") MultipartFile file) {// 1. 驗證文件類型String contentType = file.getContentType();if (!contentType.startsWith("image/")) {return AppResult.failed(ResultCode.FAILED_UPLOAD_TYPE);}// 2. 生成文件名String fileName = UUID.randomUUID().toString() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));// 3. 保存文件try {String filePath = uploadPath + fileName;file.transferTo(new File(filePath));return AppResult.success("/uploads/" + fileName);} catch (IOException e) {return AppResult.failed(ResultCode.FAILED_UPLOAD);}}
}
4. 核心流程圖
(1)總體流程圖
(2)注冊順序圖
(3)登錄順序圖
五、實驗結果和分析
1. 功能模塊測試結果
對系統的核心功能模塊,包括用戶管理、帖子管理、版塊管理、回復管理、站內信以及搜索功能,進行了全面的測試。
1.1 用戶注冊與登錄模塊
(1)測試目的:驗證用戶能否成功注冊新賬戶,并使用已注冊賬戶正常登錄和注銷
(2)測試過程:
- 嘗試使用合法的、邊界的(如最短/最長用戶名、密碼)以及非法的(如已存在的用戶名、格式錯誤的郵箱)數據進行用戶注冊
- 使用已注冊的賬戶信息進行登錄,包括正確的用戶名/密碼組合及錯誤的組合
- 驗證登錄后的會話保持機制以及注銷功能的有效性
(3)測試結果:
① 用戶注冊功能:對于合法數據,用戶均能成功注冊;對于已存在的用戶名或不符合格式要求的數據,系統能給出正確的錯誤提示。密碼加密存儲機制(MD5+Salt)按預期工作
錯誤提示如下:
成功注冊 就直接跳轉到登錄頁面
② 用戶登錄功能:使用正確的憑據可以成功登錄,錯誤的憑據會導致登錄失敗并給出提示。會話在用戶登錄期間保持有效,注銷功能可以正確清除會話。
登錄失敗如下:
1.2 帖子管理模塊
(1)測試目的:驗證用戶發帖、編輯帖子、刪除帖子、查看帖子列表及詳情的功能
(2)測試過程:
- 測試用戶在不同版塊發布新帖,包括包含文本、特殊字符等內容的帖子。
- 測試帖子作者對已發布帖子的編輯和刪除權限。
- 測試不同用戶(包括游客、普通用戶、作者)查看帖子列表和帖子詳情的權限和顯示內容。
- 驗證帖子瀏覽量計數器的準確性。
(3)測試結果:
- 用戶可以成功發布帖子,帖子內容能夠正確顯示。富文本編輯器的基本功能(如格式化)正常
- 帖子作者可以對自己發布的帖子進行編輯和刪除,非作者無此權限。
- 帖子列表按預期展示,帖子詳情頁面能正確加載帖子內容及相關信息(如作者、發布時間)。瀏覽量在每次有效訪問后遞增。
1.3 回復管理模塊
(1)測試目的:驗證用戶對帖子進行回復、查看回復、刪除回復功能
(2)測試過程:
- 用戶對帖子進行一級回復。
- 用戶對已有的回復進行回復
- 回復者或管理員刪除回復
- 驗證回復數量統計的準確性
(3)測試結果:
- 用戶可以成功對帖子進行回復,回復內容按時間順序正確顯示在帖子下方。
- 樓中樓回復功能按設計實現,能夠清晰展示回復層級。
- 回復的刪除權限控制有效,回復數量統計在增刪操作后能正確更新。
1.4 版塊管理模塊
(1)測試目的:驗證版塊列表的展示及用戶能否根據版塊篩選帖子。
(2)測試過程:
- 查看首頁及專門的版塊導航區域是否正確顯示所有已配置的版塊。
- 點擊不同版塊,驗證是否能正確篩選并展示該版塊下的帖子列表。
(3)測試結果:
- 版塊列表按預設的排序和名稱正確展示。
- 用戶可以方便地通過點擊版塊名稱進入特定版塊的帖子列表頁面。
1.5 站內信模塊
(1)測試目的:驗證用戶之間發送和接收私信的功能。
(2)測試過程:
- 用戶A向用戶B發送私信。
- 用戶B查看收到的私信列表及具體內容。
- 驗證新消息提醒機制(如小紅點)。
(3)測試結果:
- 用戶可以成功發送和接收站內信,消息內容準確無誤。
- 新消息提醒功能及時有效。
1.6 搜索模塊
(1)測試目的:驗證用戶能否根據關鍵詞搜索帖子和用戶
(2)測試過程:
- 輸入不同關鍵詞(存在的、部分匹配的、不存在的)搜索帖子標題和內容
- 輸入不同關鍵詞搜索用戶名或昵稱
(3)測試結果:
- 帖子搜索功能能夠根據關鍵詞從標題和內容中檢索相關帖子,并展示結果列表
- 用戶搜索功能能夠根據關鍵詞檢索匹配的用戶
- 對于無結果的搜索,系統能給出相應提示
1.7 身份模塊
(1)測試目的:驗證管理員和普通用戶身份的區別
(2)測試過程:
- 管理員權限下的操作
- 普通用戶權限下的操作
(3)測試結果:
- 管理員用戶可以對版塊、用戶進行管理
- 可以對用戶進行禁言或者解禁
2. 性能評估
對系統的關鍵操作進行了初步的性能評估,主要關注響應時間和并發處理能力。
頁面加載速度
- 測試方法:使用瀏覽器開發者工具或第三方測速工具,在模擬不同網絡環境下測試主要頁面(首頁、帖子列表頁、帖子詳情頁)的加載時間
- 測試結果:
- 在普通網絡環境下(如 50Mbps 帶寬),主要頁面的平均加載時間在 6 秒內(用戶填寫具體數值)
- 圖片等靜態資源加載速度良好,未發現明顯瓶頸
六、小結和心得體會
結論:當前灌水論壇系統是一個完整的Web論壇應用,采用主流的Java技術棧,結合現代化的設計理念,實現了用戶注冊、登錄、發帖、回復、私信等核心功能。系統架構清晰,代碼組織規范,具有良好的可擴展性和維護性。
待改進之處與未來展望:
- 性能優化:針對高并發場景和大數據量進行更深入的性能測試和優化,如引入Redis緩存熱點數據,優化數據庫查詢。
- 前端體驗:進一步提升移動端適配和用戶體驗,考慮引入前端MVVM框架(如Vue.js)進行部分模塊重構或新功能開發。
- 安全性增強:全面實施CSRF防護,加強文件上傳安全校驗,定期進行安全審計。
- 功能擴展:
- 引入更豐富的用戶交互功能,如@提及、消息通知中心、用戶等級與積分系統。
- 開發后臺管理系統,方便管理員對用戶、帖子、版塊等進行更精細化的管理。
- 增加內容推薦算法,提升用戶粘性。
至于代碼的話:可以查看我的倉庫