1. 程式人生 > >java網頁版加好友功能實現思路

java網頁版加好友功能實現思路

剛畢業出來工作,感覺像條鹹魚。。。,閒來無事就寫了個基於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框架整合的資料或視訊,有資料的朋友求分享!!!