java網頁版加好友功能實現思路
阿新 • • 發佈:2018-12-27
剛畢業出來工作,感覺像條鹹魚。。。,閒來無事就寫了個基於SSM的線上影院的專案,想加個類似網頁版QQ的功能,包括加好友及聊天。一直不知道存放好友的資料表(t_friend)該怎麼設計?按傳統的設計思路把資料表設計成一列表示使用者名稱(userName),一列表示好友名(friendName),一一對應?雖然這樣設計的好處是資料之間的關係一目瞭然,但是明顯不適合用來存放好友資料,那A是B的好友,B必然是A的好友,一個好友關係要2條資料來表示,明顯這樣設計不合適。給某使用者發出加好友請求後,等待該使用者響應好友請求這段時間的資料狀態該怎麼設計?想了幾天,決定將上述問題設計成兩張資料表,一張是存放好友的資料表(t_friend),一張是存放加好友狀態的資料表(t_addfriend).下面來看這兩種表的設計: 好友表(t_friend)只有兩個欄位:friend_1,friend_2,我在這裡就沒設定主鍵了。在好友請求通過的情況下,friend_1表示主動發起好友請求的那一方,friend_2自然就是另一方。 加好友狀態表(t_addfriend)有四個欄位:friend_1,friend_2,f1_allow,f2_allow,同樣沒有主鍵。friend_1表示主動發起好友請求的那一方,friend_2自然就是另一方。f1_allow表示friend_1是否同意好友請求,friend_1表示主動發起好友請求,當然同意了。。。。(這個完全是為了資料的完整性),f2_allow表示friend_2是否同意好友請求。 兩個實體類的設計是這樣的: 好友類(Friend):currentUser表示當前使用者,friendName表示當前使用者的好友,這個是為了傳資料的時候方便,否則怎麼知道哪個是friend_1?哪個是friend_2?
public class Friend {
private String friend_1;
private String friend_2;
private String currentUser;
private String friendName;
......
}
加好友類(AddFriend):這裡加了兩個狀態常量:ALLOW表示同意好友請求,DISALLOW表示不同意好友請求。
public class AddFriend {
public static final String ALLOW="Y";
public static final String DISALLOW="N";
private String friend_1;
private String friend_2;
private String f1_allow;
private String f2_allow;
private String currentUser;
private String friendName;
......
}
只有t_addfriend表中的f1_allow和f2_allow都為"Y"時,才將資料存入t_friend表。t_addfriend表主要的作用是臨時存放好友請求狀態,這個表後續有用處(主要是為了通知使用者的好友請求是被同意還是被拒絕)。 下面來看程式:
1.我的好友
(1).mapper檔案
<select id="findFriendByName" parameterType="java.lang.String" resultType="cn.tomato.domain.Friend">
select * from t_friend where friend_1=#{userName} or friend_2=#{userName}
</select>
(2)Controller層邏輯
User curUser = (User) session.getAttribute("session_user");
String curUserName = curUser.getLoginName();
List<Friend> friendList = friendService.findFriendByName(curUserName);
List<User> userList = new ArrayList<>();
for(Friend friend:friendList){
User user = null;
if(friend.getFriend_1().equals(curUserName)){
user = userService.findUserByName(friend.getFriend_2());
}else{
user = userService.findUserByName(friend.getFriend_1());
}
userList.add(user);
}
2.加好友
(1).mapper檔案
<sql id="key">
<trim suffixOverrides=",">
<if test="friend_1!=null and friend_1!=''">friend_1,</if>
<if test="friend_2!=null and friend_2!=''">friend_2,</if>
<if test="f1_allow!=null and f1_allow!=''">f1_allow,</if>
<if test="f2_allow!=null and f2_allow!=''">f2_allow,</if>
</trim>
</sql>
<sql id="value">
<trim suffixOverrides=",">
<if test="friend_1!=null and friend_1!=''">#{friend_1},</if>
<if test="friend_2!=null and friend_2!=''">#{friend_2},</if>
<if test="f1_allow!=null and f1_allow!=''">#{f1_allow},</if>
<if test="f2_allow!=null and f2_allow!=''">#{f2_allow},</if>
</trim>
</sql>
<insert id="addFriend" parameterType="cn.tomato.domain.AddFriend">
insert into t_addfriend(<include refid="key"/>) values(<include refid="value"/>)
</insert>
(2)Controller層邏輯(資料從前端傳過來,這裡就不細說了)
@RequestMapping("/addFriend")
public void addFriend(@RequestBody AddFriend friend,HttpServletResponse response) throws Exception{
friendService.addFriend(friend);
String hintMessage="請求已發出!等待其接受!!";
JSONObject message = new JSONObject();
message.put("hintMessage", hintMessage);
System.out.println(message.toJSONString());
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(message.toJSONString());
response.getWriter().close();
}
3.檢視好友請求及請求響應(是同意還是拒絕)
(1).mapper檔案
<select id="findFriendRequest" parameterType="java.lang.String" resultType="cn.tomato.domain.AddFriend">
select * from t_addfriend where friend_2=#{userName} and f2_allow is null
</select>
<select id="responseMessage" parameterType="java.lang.String" resultType="cn.tomato.domain.AddFriend">
select * from t_addfriend t where t.friend_1=#{userName} and t.f2_allow is not null
</select>
<delete id="delFriendRequest" parameterType="java.lang.String">
delete from t_addfriend where friend_1=#{userName} and f2_allow is not null
</delete>
(2)Controller層邏輯(點選上圖白色部分的div“我知道了”,刪除臨時表t_addfriend中的資料)
//側邊欄:發現
@RequestMapping("/found")
public ModelAndView found(HttpSession session){
User curUser = (User) session.getAttribute("session_user");
String curUserName = curUser.getLoginName();
List<AddFriend> friendRequestList = friendService.findFriendRequest(curUserName);
List<User> userList = new ArrayList<>();
for(AddFriend friend:friendRequestList){
User user = userService.findUserByName(friend.getFriend_1());
userList.add(user);
}
List<AddFriend> respMessageList = friendService.responseMessage(curUserName);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("userList", userList);
modelAndView.addObject("respMessageList", respMessageList);
modelAndView.setViewName("found");
return modelAndView;
}
4.同意或拒絕好友請求
(1).mapper檔案
<update id="friendReqResp" parameterType="cn.tomato.domain.AddFriend">
update t_addfriend set f2_allow=#{f2_allow} where friend_2=#{friend_2}
</update>
(2)Controller層邏輯
//同意“好友請求”
@RequestMapping("/agreeReq")
public void agreeReq(@RequestBody AddFriend addFriend,HttpServletResponse response) throws Exception{
friendService.friendReqResp(addFriend);
Friend friend = new Friend();
friend.setFriend_1(addFriend.getFriend_1());
friend.setFriend_2(addFriend.getFriend_2());
friendService.allowFriendReq(friend);
String hintMessage="相見恨晚,快去聊天吧!!";
JSONObject message = new JSONObject();
message.put("hintMessage", hintMessage);
System.out.println(message.toJSONString());
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(message.toJSONString());
response.getWriter().close();
}
//拒絕“好友請求”
@RequestMapping("/rejectReq")
public void rejectReq(@RequestBody AddFriend addFriend,HttpServletResponse response) throws Exception{
friendService.friendReqResp(addFriend);
String hintMessage="鐵石心腸,成大事者也!!";
JSONObject message = new JSONObject();
message.put("hintMessage", hintMessage);
System.out.println(message.toJSONString());
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println(message.toJSONString());
response.getWriter().close();
}
基本思路就是這樣的,資料大多數都是通過ajax從前端傳過來的。第一次寫部落格,水平有限,有不足之處請諒解!!!最近在學Activiti,苦於找不著Activiti與SSM框架整合的資料或視訊,有資料的朋友求分享!!!