工作中需求对opensns(v2版本)自带的聊天功能进行二次开发,满足需求:1.普通身份用户之间不能互相发起会话;2.用户可以向经理发起会话(咨询);3.经理可以向所有人发起会话;接收到会话后双方可以正常聊天。并且要在后台能够控制不同身份用户可以单方面发起会话的对象身份。
根据需求分析,现版本后台自带的用户组权限管理没有办法满足以上需求,需要进行二次开发。
设计思路:在数据库中身份表role加入字段talk_list,记录该身份用户可以当方向发起会话的身份用户id(以,连接成字符串)如图
前台发起会话时对登入用户的身份判断其对象身份是否在talk_list中,不在则不允许发起会话。后台则是对身份单向发起会话身份进行修改并对数据库相应字段修改。
修改内容:
后端:控制器:Admin/Controller/RoleController.class.php
模板:Admin/View/default/Role/talklist.html (创建)
步骤:
1.在数据库中加身份表role中加入字段talk_list字段:
alter table role add talk_list varchar(25) not null default 0;
2.在后台用户模块--后台菜单管理--身份下新增菜单聊天身份限定管理具体设置如图:
确定后再身份模块身份管理菜单下会显示聊天身份限定管理
接下来需要在身份模块role控制器中添加自定义方法talkList
/**
* 设置身份聊天限定
* @author 方雨翔<2541497491@qq.com> 2016-08-01
*/
public function talkList(){
$title = $is_edit ? L('_TALKLIST_') : L('_NEW_GROUP_');
if(IS_POST){
$name = M('role')->field('name')->select();
foreach ($name as $vn) {
$data['talk_list'] = "0";
$map['name'] = $vn['name'];
$id = M('role')->field('id')->select();
foreach ($id as $vi) {
if(I("post.{$vn['name']}{$vi['id']}",'','intval')){
$data['talk_list'] .= ','.I("post.{$vn['name']}{$vi['id']}",'','intval');
}
}
//dump($data);exit();
$save = M('role')->where($map)->save($data);
}
$this->success("{$title}".L('_SUCCESS_').L('_EXCLAMATION_'), U('Role/talkList'));
}else{
//从role表取出身份
$role = M('role')->select();
//将聊天限制字符串拆分成数组
foreach ($role as $v) {
$talklist["{$v['id']}"] = explode(',',$v['talk_list']);
}
//dump($talklist);exit();
$this->assign('role',$role);
$this->assign('talklist',$talklist);
$this->meta_title = '聊天身份限定';
$this->display();
}
}
然后我们需要创建talkList对于模板talkList.htlm
<extend name="Public/base"/>
<block name="body">
<div class="main-title">
<h2>{:L("_TALKLIST_")}</h2>
</div>
<div class="tab-content with-padding">
<div class="col-md-12">
<form action="{:U('talkList')}" method="post" class="form-horizontal">
<volist name="role" id="role_name">
<div class="form-item">
<label class="item-label">{$role_name.title|htmlspecialchars}</label><span class="check-tips">单向发起回话权限</span>
<div class="controls">
<volist name="role" id="option">
<php>
$a=array(1,2);
foreach($talklist as $k=>$v){
if($k == $role_name['id']){
$a = $v;
}
}
$checked = in_array($option['id'],$a) ? 'checked' : '';
</php>
<label >
<input type="checkbox" name="{$role_name.name}{$option.id}" value="{$option.id}" class="oneplus-checkbox" {$checked}/>
{$option.title|htmlspecialchars}</label>
</volist>
<!--<input type="hidden" name="role_id" class="oneplus-checkbox-hidden"
value="{$role_name.id}"/>-->
</div>
</div>
</volist>
<div class="form-item">
<label class="item-label"></label>
<div class="controls">
<empty name="list">
<button type="submit" class="btn submit-btn"
target-form="form-horizontal">{:L("_SURE_WITH_SPACE_")}
</button>
<else/>
<button type="submit" class="btn submit-btn ajax-post" target-form="form-horizontal">{:L("_SURE_WITH_SPACE_")}
</button>
</empty>
<button class="btn btn-return" οnclick="javascript:history.back(-1);return false;">{:L("_RETURN_WITH_SPACE_")}</button>
</div>
</div>
</form>
</div>
</div>
</block>
<block name="script">
</block>
完成后可以看到我们的后台聊天身份限定管理页如图:
前端
控制器:Ucenter/Controller/SessionController.class.php
js: ./Public/js/com/com.talker.class.js
3.前台控制会话功能分为两块,处理页面的js -- com.talker.class.js ; 以及功能模块 SessionController.class.php
在功能模块SessionController.class.php中的创建聊天方法createTalk 中,我们需要取出登入用户对于身份的talklist对象组拆分成数组,并对聊天对象所在身份进行判断是否在talklist数组中。
public function createTalk()
{
$aUids = I('post.uids', '', 'op_t');
$uid = is_login();
$my_role = M('member')->where(array('uid'=>$uid))->field('last_login_role')->select();
$map['id'] = $my_role[0]['last_login_role'];
if ($aUids == '') {
exit;
}
$memebers = explode(',', $aUids);
foreach ($memebers as $v) {
$user_role = M('member')->where(array('uid'=>$v))->field(array('nickname','last_login_role'))->select();
$talklist = M('role')->where($map)->field('talk_list')->select();
$list = explode(",",$talklist[0]['talk_list']);
if(!in_array($user_role[0]['last_login_role'], $list)){
$error['info'] = "你无权向用户".$user_role[0]['nickname']."发起会话" ;
$error['status'] = 0;
$this->ajaxReturn($error,'JSON');
}
}
$talk = $this->mTalkModel->createTalk($memebers);
$this->success($talk);
}
}
然后在js中对返回的JSON数据判断并处理
if (msg.status) {
//alert(msg.status);
talker.show();
talker.open(msg.info.id);
/*在面板中加入一个项目*/
talker.prepend_session(msg.info);
} else {
//alert(msg.info);
toast.error(msg.info);
}
完成之后我们的功能:限定身份控制单方面发起聊天权限就实现了!