微博项目_用户关注与移除

实现这一功能时,我们可以结合之前做过的搜索功能,在搜索得到的用户结果集中加以进行分析,并进行用户的关注和移除。

首先,我们需要在前端页面中增加用于显示用户是否关注的节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- sech.html -->

<td>
<dl>
<if condition='$v["mutual"]' >
<dt>互相关注</dt>
<dd id="del-fl" uid="{$v.uid}">移除</dd>
<elseif condition='$v["followed"]' />
<dt>√&nbsp;已关注</dt>
<dd id="del-fl" uid="{$v.uid}">移除</dd>
<else />
<dt id="add-fl" uid="{$v.uid}"><a href="{:U('Common/follow')}">+&nbsp;关注</a></dt>
</if>
</dl>
</td>

在前端页面中,我们利用了<if>标签根据用户间的实际情况,展现不同的内容,而实现这一功能即需要我们对于后台搜索到的结果集进行一番处理,去得到用户间是否已经互相关注。该功能的实现也是建立在之前搜索功能代码的基础上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/* SearchController.class.php */

public function sechUser() {
/*
*原先搜索功能时的代码
*/

//在最后获取到$user结果集的基础上,调用一个函数来得到用户间是否已关注与是否已互相关注
$user = $this->_getMetual($user);
}

//重组结果集,得到是否已关注与是否互相关注
private function _getMetual ($result) {
if (empty($result)) {
return false;
}
$db = M('follow');
foreach ($result as $k => $v) {
//是否互相关注
$sql = '(SELECT `follow` FROM `hd_follow` WHERE `follow` = ' . $v['uid'] . ' AND `fans` =' . session('uid') . ') UNION (SELECT `follow` FROM `hd_follow` WHERE `follow` = ' . session('uid') . ' AND `fans` = ' . $v['uid'] . ' ) ';
$mutual = $db->query($sql);

if (count($mutual) == 2) {
$result[$k]['mutual'] = 1;
$result[$k]['followed'] = 1;
} else {
$result[$k]['mutual'] = 0;

//未互相关注时检索是否已关注
$where = array(
'follow' => $v['uid'],
'fans' => session('uid')
);
$result[$k]['followed'] = $db->where($where)->count();
}
}
return $result;
}

移除关注

根据前面的前端页面,我们在这里使用Ajax异步处理的方式实现该功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* common.js */

//移除关注
$('#del-fl').click(function () {
var data = {
uid : $(this).attr('uid')
};
var isDel = confirm('确认移除?'); //确认框
var obj = $(this).parents('tr');

if (isDel) {
$.post(delFollow,data,function(data) {
if (data) {
obj.slideUp('slow',function () {
obj.remove();
})
} else {
alert('移除失败,请重试...');
}
},'json');
}
});

由于在这里用到了js,所以我们应该在前端页面调用js文件,同时,异步处理时的处理地址delFollow也需要在前端页面中进行定义。

1
2
3
4
5
6
7
<!-- sech.html -->

<script type="text/javascript" src="__PUBLIC__/JS/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/Js/common.js"></script>
<script type="text/javascript">
var delFollow = '{:U('Common/delFollow')}';
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* CommonController.class.php */

public function delFollow() {
if (!IS_AJAX) {
E('页面不存在');
}
$uid = I('post.uid/d');
$where = array('follow' => $uid ,'fans' => session('uid'));

if (M('follow')->where($where)->delete()) {
echo 1;
} else {
echo 0;
}
}

用户关注

对于这一功能,结合JS脚本进行处理会更加方便,而考虑到自己对于Js尚未特别熟悉,所以我没有使用过多得JS脚本。其次,对于用户关注这一功能,我尚未完全实现,因为不使用JS处理的方式,我没能在跳转页面找到一个接收需要处理的用户ID的方式,这是目前该功能存在的一个bug。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!-- /practice/Home/View/Common/follow.html -->

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript" src="__PUBLIC__/JS/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="__PUBLIC__/JS/common.js"></script>
<script type="text/javascript">
var addFollow = "{:U('Common/addFollow')}";
</script>
<title>添加好友关注</title>
</head>
<body>
<div>
<span>好友分组:</span>
<select name="gid">
<option>默认分组</option>
<foreach name='group' item='v'>
<option value="{$v.id}">{$v.name}</option>
</foreach>
</select>
<div>
<input type="hidden" name="follow" />
<span id="add-fl-button">关注</span>
</div>
</div>
</body>
</html>

如果利用JS弹出框的方式,效果会更好一些,而我选用了<a>链接跳转的方式,不过在这个过程中,不知道该如何将用户ID传递到跳转页面,这即是目前该功能存在的一个bug,等js熟悉之后,可以直接将其替换为js的方式来实现该效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* common.js */

//异步添加关注
$('#add-fl-button').click(function () {
var follow = $('input[name=follow]').val(); //无法接收到follow值
var group = $('select[name=gid]').val();

$.post(addFollow,{
'follow' : follow,
'gid' : group
},function (data) {
if (data.status) {
alert(data.msg);
} else {
alert(data.msg);
}
},'json');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* CommonController.class.php */

//获取分组
public function follow() {
$group = M('group')->where(array('uid' => session('uid')))->select();
$this->group = $group;
$this->display();
}

//添加关注
public function addFollow() {
if (!IS_AJAX) {
E('页面不存在');
}
$data = array(
'follow' => I('post.follow/d'),
'fans' => (int) session('uid'),
'gid' => I('post.gid/d')
);
if (M('follow')->data($data)->add()) {
echo json_encode(array('status' => 1,'msg' => '关注成功'));
} else {
echo json_encode(array('status' => 0,'msg' => '关注失败,请重试...'));
}
}
-------------The End-------------