按照官方给出的数据表来实现,只需要官方的私信数据表
按照逻辑 都是通过插入数据表 如何根据发送给谁来查询是否有私信
可以去青航主题 注册体验该功能
CREATE TABLE `yzm_message` ( `messageid` int(10) unsigned NOT NULL AUTO_INCREMENT, `send_from` varchar(30) NOT NULL DEFAULT '' COMMENT '发件人', `send_to` varchar(30) NOT NULL DEFAULT '' COMMENT '收件人', `message_time` int(10) unsigned NOT NULL DEFAULT '0', `subject` char(80) NOT NULL DEFAULT '' COMMENT '主题', `content` text NOT NULL, `replyid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '回复的id', `status` tinyint(1) unsigned DEFAULT '1' COMMENT '1正常0隐藏', `isread` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否读过', `issystem` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '系统信息', PRIMARY KEY (`messageid`), KEY `replyid` (`replyid`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
前端 vue3+php
构造一个方法list 主要用于输出私信列表 为防止单个用户信息重复 我们可以通过删除相同发送者的key值
比如发送者字段send_from 删除相关值的数组 我们就会等到一个唯一一个发送者的私信 这样就不会重复
函数分享:
function assoc_uniques($arr, $key) { $tmp_arr = array(); foreach($arr as $k => $v) { if(in_array($v[$key], $tmp_arr)) { unset($arr[$k]); } else { $tmp_arr[] = $v[$key]; } } return $arr; }
$arr 为数组 key 为要删除的重复字段 删除并重新排序
好 ,我们在方法中 通过db操作类 循环出 数据表中的数据 比如说这样的写法
D('message')->where(['send_to' =>get_cookie('_username')])->select();
查询条件是接受者自己的用户名 这样你就得到一个别人发给你你自己的私信
通过遍历循环出 发送者的用户头像 等其他 再转化出时间戳的格式
然后通过 return_json输出数据
return_json(['status' => 200,'data'=>assoc_uniques($data,'send_from')]);
前端通过请求接受数据
axios.post('/member/msg/init').then(res => { if(res.data.status == 200){ this.list = res.data.data.data this.isload = true }else{ layer.msg('请求出错',{icon: 2}) } })
请求成功后v-for 渲染数据到html中
然后我们就等到这样的页面
好 ,我们再写一个show的方法 主要查看该私信的内容
我们需要在show方法中提交userid 该用户id为发送者的ID
通过vue声明周期函数请求 该用户ID 通过该用户ID获取 发送者用户名
如果你觉得麻烦 可以直接获取提交用户名的值 这样就不用通过查ID转化用户名
请求实例:
axios.post('/member/msg/show',{userid:this.userid}).then(res => { if(res.data.status == 200){ this.list = res.data.data.data this.isload = true }else{ layer.msg('请求出错',{icon: 2}) } })
后端通过请求 再输出相关数据
通过
select();
方法输出遍历
查询条件使用or的表达式查询 send_from send_to 两个字段的值 查询自己的用户名 get_cookie('_username')
在遍历插入一条数组为
$item['type'] = $item['send_from'] == get_cookie('_username') ? 'from':'to';
通过判断 判断出 类型 作为前端渲染中区分的类型 发送者是from 接收者是to 输出数组类型
然后得到一组 数据 然后渲染在html页面上
我们在设计一个html:
<li :class="item.type == 'from' ? 'msg-self' : 'msg-to'" v-for="item in list"> <div class="my-msg-list" v-if="item.type == 'from'"> <img :src="item.userpic" class="avatar radius4"> <div class="my-msg-info"> <div class="msg-meta"> <span>{{ item.send_from }}</span> <span> <time>{{ item.message_time }}</time></span> </div> <div class="my-msg-content"> <p style="margin: 0;">{{ item.content }}</p></div> </div> </div> <div class="my-msg-list" v-else> <div class="my-msg-info"> <div class="msg-meta"> <span> <time>{{ item.message_time }}</time></span> <span>{{ item.send_from }}</span></div> <div class="my-msg-content"> <p style="margin: 0;">{{ item.content }}</p></div> </div> <img :src="item.userpic" class="avatar radius4"></div> </li>
通过判断 type方法来作为区分对方发送的信息 作为格式整理 如图在html代码之中 我已经做出了样式类型的区分
请求成功后我们就会得到这样的格式
然后我们在设计一个发送框
<textarea rows="4" v-model="content" placeholder="" class="msg-textarea form-control"></textarea>
发送者send_to 为刚刚上面获取的用户名 相当于重新把消息发给了他
后台写一个发送私信的方法 官方有实例 不多讲 通过axios 发送给方法
内容发布成功后回调一个声明周期函数定义的方法 实现了数据的刷新 就得到一个完整的信息交互了
请按照自己的基础来实现该功能哟 不能盲目尝试 逻辑看不懂句说明无法实现
感谢大家