基於SSM框架的簡單問答社群

HuskySir發表於2020-07-16

前言:學習了Spring、SpringMVC、MyBatis框架後,開發了一套簡單的問答社群,前端採用Bootstrap開發框架。

版本資訊

IDEA:2020.1.2

JDK:14.0.1

Maven:3.6.3

Tomcat:9.0.36

MySql:8.0.20

Bootstrap:3.3.7

JQuery:3.5.1

 

本文目錄

一、需求分析

1、社群功能

2、資料表

3、資料表關係

二、功能實現

1、使用者註冊、登入、登出

2、提出問題、修改問題、刪除問題

3、對問題進行回答、修改回答、刪除回答

4、對回答進行評論、修改評論、刪除評論

5、使用者關注(取消關注)使用者、使用者關注(取消關注)問題、使用者贊同(取消贊同)回答

三、程式碼介紹

1、專案結果

2、部分程式碼

四、效果演示

1、登入

2、註冊

3、使用者主頁面

4、提出問題

5、檢視所有問題

6、根據條件查詢問題

7、問題及回答資訊

8、回答及評論資訊

9、使用者資訊

10、個人資料

11、關注的使用者、粉絲、關注的問題、贊同的回答、提出的問題、做出的回答、做出的評論

12、修改、刪除問題,修改、刪除回答

五、程式碼/功能優化

六、開發經驗

 

一、需求分析

1、社群功能

①使用者註冊、登入、登出;

②提出問題、修改問題、刪除問題;

③對問題進行回答、修改回答、刪除回答;

④對回答進行評論、修改評論、刪除評論;

⑤使用者關注(取消關注)使用者、使用者關注(取消關注)問題,使用者贊同(取消贊同)回答。

2、資料表

(1)使用者表

user使用者表
user_id 使用者編號
user_name 使用者名稱
user_nickname 使用者暱稱
user_avatar 使用者頭像
user_sex 使用者性別
user_email 使用者郵箱
user_password 使用者密碼
user_register_time 使用者註冊時間
user_last_login_time 使用者最近一次登入的時間
user_last_login_ip 使用者最近一次登入的IP地址
user_status 使用者狀態

(2)問題表

question問題表外來鍵
question_id 問題編號  
question_user_id 問題的提問者使用者編號(關聯使用者表) user表user_id
question_title 問題標題  
question_content 問題內容  
question_view_count 問題瀏覽量  
question_follow_count 問題關注量  
question_answer_count 問題回答量  
question_update_time 問題更新時間  
question_create_time 問題建立時間  
question_status 問題狀態  

(3)回答表

answer回答表外來鍵
answer_id 回答編號  
answer_user_id 回答的回答者使用者編號(關聯使用者表) user表user_id
answer_question_id 回答所對應的問題編號(關聯問題表) question表question_id
answer_content 回答內容  
answer_view_count 回答瀏覽量  
answer_agree_count 回答贊同量  
answer_update_time 回答更新時間  
answer_create_time 回答建立時間  
answer_status 回答狀態  

(4)評論表

comment評論表外來鍵/備註
comment_id 評論編號  
comment_user_id 評論的評論者使用者編號(關聯使用者表) user表user_id
comment_answer_id 評論所對應的回答編號(關聯回答表) answer表answer_id
comment_last_id 評論上一條評論編號 為Null表示一級評論,否則為二級及以上評論(對評論的評論)
comment_content 評論內容  
comment_time 評論時間  

comment_last_id本打算用作辨別回答下的一級評論(對回答的評論)和二級及以下評論(即對評論進行回覆的評論),但感覺過於複雜,所有目前並未使用該欄位

(5)使用者與使用者關係表

user_relation_user使用者關注使用者關係表外來鍵
from_user_id 發起使用者編號 user表user_id
to_user_id 關注使用者編號 user表user_id

(6)使用者與問題關係表

user_relation_question使用者關注問題關係表外來鍵
from_user_id 發起使用者編號 user表user_id
to_question_id 關注問題編號 question表question_id

(7)使用者與回答關係表

user_relation_answer使用者與回答關係表外來鍵
from_user_id 發起使用者編號 user表user_id
to_answer_id 贊同回答編號 answer表answer_id

3、資料表關係

(1)user表、question表、answer表、comment表之間的關係

(2)user表、question表、answer表、user_relation_user表、user_relation_question表、user_relation_answer表之間的關係

 

(3)由於有外來鍵約束

①當刪除使用者時,user_relation_user表、user_relation_question表、user_relation_answer表的該使用者關係均會刪除,question表、answer表、comment表也會刪除該使用者的問題、回答及評論;

②當刪除問題時,user_relation_question表的使用者關係會刪除,question表、answer表也會刪除問題及回答;

③當刪除回答時,user_relation_answer表的使用者關係會刪除,answer表、comment表也會刪除回答及評論。

二、功能實現

1、使用者註冊、登入、登出

①使用者註冊時,查詢資料庫中是否已經存在註冊的使用者名稱,如果不存在,則將使用者填入的註冊資訊,以及設定當前時間為使用者註冊時間、最近一次登入時間,存入資料庫;

②使用者登入時,首先前端先進行限制資料的輸入格式,密碼與確認密碼相同,進入後端查詢資料庫中是否存在該使用者,不存在則顯示使用者名稱不存在。若存在該使用者名稱,再將密碼和資料庫中密碼進行匹配,匹配成功則登入成功,反之失敗;

③使用者登入後,可點選登出按鈕,根據存入session域中的登入使用者編號刪除資料庫中使用者。

注意:記錄最近一次登入IP功能還未實現,user_last_login_ip一直預設為null。user_status用來判斷使用者狀態或身份,比如1為普通使用者,0為管理員,2為禁用等,目前未開通這些功能,一直預設user_status=1。

2、提出問題、修改問題、刪除問題

①提出問題,根據session域中的登入使用者編號及輸入的問題資訊,以及設定當前時間為問題建立時間、更新時間,存入資料庫;

②修改問題,根據問題編號查出資料庫中的該問題資訊,根據輸入修改問題資訊,以及設定當前時間為問題更新時間,再存入資料庫;

③刪除問題,根據問題編號刪除資料庫中的問題。

3、對問題進行回答、修改回答、刪除回答

①進行回答,根據登入使用者編號、問題編號、輸入的回答資訊,以及設定當前時間為回答建立時間、更新時間,存入資料庫;

②修改回答,根據回答編號查出資料庫中的該回答資訊,根據輸入修改回答資訊,以及設定當前時間為回答更新時間,再存入資料庫;

③刪除回答,根據回答編號刪除資料庫中的回答。

4、對回答進行評論、修改評論、刪除評論

①進行評論,根據登入使用者編號、回答編號、輸入的評論資訊,以及設定當前時間為評論時間,存入資料庫;

②修改評論,根據評論編號查出資料庫中的該評論資訊,根據輸入修改評論資訊,以及設定當前時間為評論時間,再存入資料庫;

③刪除評論,根據評論編號刪除資料庫中的評論。

注意:評論時間及最新的評論時間,修改後立即更新時間,檢視不到首次評論時間

5、使用者關注(取消關注)使用者、使用者關注(取消關注)問題,使用者贊同(取消贊同)回答

①使用者關注使用者、問題,使用者贊同回答,首先查詢資料庫中是否存在對應關係,如果有則提示關注(贊同)失敗,如果沒有則將關係存入資料庫;

②使用者取消關注使用者、問題,使用者取消贊同回答,首先查詢資料庫中是否存在對應關係,如果有則提示取消關注(贊同)成功,如果有則將資料庫中的對應關係刪除。

三、程式碼介紹

1、專案結構

 

2、部分程式碼

(1)實體類

(2)dao層

java

xml

(3)service層

介面

 

實現類

(4)controller層

 

(5)測試類

 

(6)前端

JavaScript

 

HTML

四、效果演示

1、登入

 

2、註冊

3、使用者主頁面

基於SSM框架的簡單問答社群

4、提出問題

5、檢視所有問題

6、根據條件查詢問題

 

7、問題及回答資訊(點選所有問題或者查詢問題得到的頁面的問題標題連結)

 

在頁面可以關注、取消關注問題,僅展示關注問題

①點選關注,如果已經關注,彈出“您已經關注該問題,不能重複關注”,如果沒關注,彈出“關注成功”

②點選取消關注,如果已經關注,彈出“取消關注成功”,如果沒關注,彈出“您還未關注該問題,不可取消關注”

關注成功

關注失敗

回答問題

8、回答及評論資訊(點選問題及回答資訊頁面的回答的詳細內容連結)

 

在此頁面可以贊同及取消贊同該回答,其顯示效果與關注與取消關注問題型別類似,故不展示

評論回答

9、使用者資訊(在問題及回答頁面可點選問題標題右下側名字連結,在回答及評論頁面可點選回答或評論者的名字連結,進入使用者詳情資訊頁面)

以上圖的回答及評論頁面為例,點選評論者周伯通

在此頁面可以關注或取消關注使用者,與對問題和回答的操作同理,如果已經關注再點選關注、未關注點選取消關注會失敗,未關注點選取消關注、已關注點選關注會失敗

10、個人資料(在使用者頁面可進入個人資料)

 

此頁面可點選修改使用者資訊

輸入框內容預設為使用者資訊,使用者名稱不可更改,修改成功會返回個人頁面

登出使用者會刪除資料庫內使用者資訊,直接退出到登入頁面,此處不再展示

11、使用者頁面的個人資料及退出登入按鈕下有7個連結,分別可進入對應頁面,此處僅挑部分頁面展示

①關注的使用者

②贊同的回答

③提出的問題

④做出的評論

12、修改、刪除問題,修改、刪除回答,修改、刪除評論

可在使用者頁面“提出的問題”、“做出的回答”、“做出的評論”連結進入後的頁面點選問題標題、回答內容、評論內容連結進入對應資訊頁面,然後對其進行修改、刪除,此處僅以做出的回答舉例

①使用者頁面,點選做出的回答連結

②進入回答頁面,點選回答內容的連結

③進入回答詳細頁面,點選修改回答按鈕

④進入修改回答頁面,顯示原回答內容

⑤修改回答內容

 ⑥點選確認修改

⑦點選返回回答頁面

⑧點選重新整理回答按鈕,即可檢視更新後的回答

五、程式碼/功能優化

1、question表可不需要question_answer_count欄位,直接從answer表查詢某問題下有多少回答即可,本專案因為多次需要查詢問題時顯示問題有多少評論量,故也作為一個屬性。但因為question表內question_answer_count值在新增answer時加1,在刪除answer時減1,此過程在service層實現,如果直接對資料庫操作,question表的question_answer_count欄位的值可能不正確;

2、對問題、回答、評論等進行新增、更新、刪除時有時會進入一個成功或失敗提示頁面,可以進行程式碼優化讓其直接返回之前的資訊頁面,然後進行彈窗提示成功或失敗資訊,不需要單獨進入一個提示頁面;

3、user表的user_avtar(使用者頭像)、user_last_login_ip(使用者最近一次登入的IP地址)、user_status(使用者狀態)等欄位並未使用,可以在後續開發中加上這些欄位對應的功能;

4、comment表中的comment_last_id欄位表示評論的上一條評論編號,利用該欄位可以實現對評論進行評論, 此目的主要是想實現回覆功能,考慮到有些複雜本專案並未實現此功能

六、開發經驗

在開發過程中,熟悉了許多過程,也在一些細節的地方浪費了許多時間,經過不斷學習測試得出了一些經驗,現挑一些印象深刻的進行歸納

1、Dao層的類的方法傳入引數為多個時,需要用到@Parma

比如對user_relation_user表進行新增某使用者關注某使用者時,對應的UserRelationDao的類的方法為

1 void saveUserFollowUser(Integer from_user_id,Integer to_user_id);

UserRelationMapper.xml對應的xml語句

1 <!-- 新增某使用者關注某使用者 -->
2 <insert id="saveUserFollowUser" parameterType="java.lang.Integer" >
3     INSERT INTO user_relation_user (from_user_id,to_user_id)
4     VALUES (#{from_user_id},#{to_user_id})
5 </insert>

此時會報錯,因為找不到from_user_id與to_user_id

此時需要用到@Parma,修改後的UserRelationDao的類的方法為

1 void saveUserFollowUser(@Param("from_user_id") Integer from_user_id,@Param("to_user_id") Integer to_user_id);

2、JSP頁面傳送url請求時要用<%=path%>加上後續路徑(JSP頭部加上<% String path = request.getContextPath();%>)

此處的內容關於JSP檔案的絕對路徑與相對路徑,相關介紹網上已經很詳細了

如在使用者頁面檢視所有問題

1  <a href="Question/DisplayAllQuestionList"><button type="button" class="btn btn-success btn-lg" style="width: 150px;">檢視所有問題</button></a>

對應的Controller類的方法為

 1 /**
 2  * 表現層 問題
 3  */
 4 @Controller
 5 @RequestMapping(value = "/Question")
 6 public class QuestionController {
 7     
 8     ······
 9     
10     /**
11     * 進入所有問題列表頁面
12     * @param model
13     * @return
14     */
15     @RequestMapping(value = "/DisplayAllQuestionList")
16     public String DisplayAllQuestionList(Model model) {
17     ......
18     }   
19     
20     ······
21 }

此時的請求可能會出錯,我在執行過程中出現了404的問題,如圖所示

此時修改為如下方式即可

1 <% String path = request.getContextPath();%>
2 
3 ......
4 
5 <a href="<%=path%>/Question/DisplayAllQuestionList"><button type="button" class="btn btn-success btn-lg" style="width: 150px;">檢視所有問題</button></a>
6 ·····

3、在JSP頁面顯示時間的格式問題

如果在java中用java.util.Date接收MySQL中的datetime,然後直接在JSP頁面顯示,會輸出以下格式

此時的程式碼為

1 ······
2 <td>
3     <p>${question.question_create_time}</p>
4 </td>
5 ······

使用Jstl語句的格式化輸出

1 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
2     
3     ······
4     
5 <td>
6     <fmt:formatDate value="${question.question_create_time}" pattern="yyyy-MM-dd HH:mm:ss"/>
7 </td>
8     
9     ······

此時會輸出以下格式

4、在之前發表過的隨筆有過以下總結

(1)@Controller類的方法如何解析ajax請求傳送的請求體中的多個引數

https://www.cnblogs.com/huskysir/p/13295631.html

(2)關於在JSP頁面識別不了EL表示式的情況

https://www.cnblogs.com/huskysir/p/13283569.html

(3)JSP頁面中同時遍歷多個List集合

https://www.cnblogs.com/huskysir/p/13282191.html

(4)如何從預設的index.jsp頁面跳轉到其他頁面

https://www.cnblogs.com/huskysir/p/13273734.html

(5)SSM前後端資訊互動

https://www.cnblogs.com/huskysir/p/13308418.html

 七、GitHub程式碼地址

https://github.com/HuskySir/JAVA

相關文章