前言:學習了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、使用者註冊、登入、登出
一、需求分析
1、社群功能
①使用者註冊、登入、登出;
②提出問題、修改問題、刪除問題;
③對問題進行回答、修改回答、刪除回答;
④對回答進行評論、修改評論、刪除評論;
⑤使用者關注(取消關注)使用者、使用者關注(取消關注)問題,使用者贊同(取消贊同)回答。
(1)使用者表
使用者表 | |
---|---|
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_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、資料表關係
(2)user表、question表、answer表、user_relation_user表、user_relation_question表、user_relation_answer表之間的關係
(3)由於有外來鍵約束
②當刪除問題時,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、使用者關注(取消關注)使用者、使用者關注(取消關注)問題,使用者贊同(取消贊同)回答
①使用者關注使用者、問題,使用者贊同回答,首先查詢資料庫中是否存在對應關係,如果有則提示關注(贊同)失敗,如果沒有則將關係存入資料庫;
②使用者取消關注使用者、問題,使用者取消贊同回答,首先查詢資料庫中是否存在對應關係,如果有則提示取消關注(贊同)成功,如果有則將資料庫中的對應關係刪除。
三、程式碼介紹
2、部分程式碼
(2)dao層
java
xml
(3)service層
介面
實現類
(6)前端
JavaScript
HTML
四、效果演示
在頁面可以關注、取消關注問題,僅展示關注問題
①點選關注,如果已經關注,彈出“您已經關注該問題,不能重複關注”,如果沒關注,彈出“關注成功”
關注成功
在此頁面可以贊同及取消贊同該回答,其顯示效果與關注與取消關注問題型別類似,故不展示
9、使用者資訊(在問題及回答頁面可點選問題標題右下側名字連結,在回答及評論頁面可點選回答或評論者的名字連結,進入使用者詳情資訊頁面)
以上圖的回答及評論頁面為例,點選評論者周伯通
此頁面可點選修改使用者資訊
輸入框內容預設為使用者資訊,使用者名稱不可更改,修改成功會返回個人頁面
登出使用者會刪除資料庫內使用者資訊,直接退出到登入頁面,此處不再展示
①關注的使用者
②贊同的回答
③提出的問題
④做出的評論
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
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 ·····
如果在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