Laravel Vuejs 实战:开发知乎 (37)私信标为已读

1.自定义MessageCollection类:

  1 <?php
  2
  3 namespace App;
  4
  5 use Illuminate\Database\Eloquent\Collection;
  6
  7 class MessageCollection extends Collection
  8 {
  9     public function markAsRead()
 10     {
 11         $this->each(function ($message) {
 12             $message->markAsRead();
 13         });
 14     }
 15 }
 16
 17 

MessageCollection.php

2.向Message中添加一个newCollection方法:

  1 public function newCollection(array $models = [])
  2 {
  3     return new MessageCollection($models);
  4 }
  5 

及markAsRead方法:

  1 public function markAsRead()
  2 {
  3     if (is_null($this->read_at)) {
  4         $this->forceFill(
  5             [
  6                 ‘read_at‘ => $this->freshTimestamp(),
  7             ])->save();
  8     }
  9 }
 10 

  1 <?php
  2
  3 namespace App;
  4
  5 use Illuminate\Database\Eloquent\Model;
  6
  7 class Message extends Model
  8 {
  9     //
 10
 11     protected $table = ‘messages‘;
 12
 13     protected $fillable = [‘from_user_id‘, ‘to_user_id‘, ‘content‘];
 14
 15     public function fromUser()
 16     {
 17         return $this->belongsTo(User::class, ‘from_user_id‘);
 18     }
 19
 20     public function toUser()
 21     {
 22         return $this->belongsTo(User::class, ‘to_user_id‘);
 23     }
 24
 25     public function markAsRead()
 26     {
 27         if (is_null($this->read_at)) {
 28             $this->forceFill(
 29                 [
 30                     ‘read_at‘ => $this->freshTimestamp(),
 31                 ])->save();
 32         }
 33     }
 34
 35     public function newCollection(array $models = [])
 36     {
 37         return new MessageCollection($models);
 38     }
 39 }
 40
 41 

Message.php

3.这样在InboxCollection.php中调用的时候:

  1 //设置信息已读
  2 $messages->markAsRead();
  3 

即:

  1 public function show($userId)
  2 {
  3     if (auth()->user()->id == $userId) {
  4         return redirect()->back()->with(‘不能回复自己‘);
  5     }
  6     $messages = auth()->user()->messages->where(‘from_user_id‘, $userId);
  7
  8     //设置信息已读
  9     $messages->markAsRead();
 10
 11     //获取回复信息
 12     $replies = Message::query()->where(‘to_user_id‘, $userId)
 13         ->where(‘from_user_id‘, auth()->user()->id)
 14         ->get();
 15     if ($replies) {
 16         //整合
 17         foreach ($replies as $reply) {
 18             $messages->push($reply);
 19         }
 20     }
 21     //排序
 22     $messages = $messages->sortBy(‘created_at‘);
 23     return view(‘inbox.show‘, compact(‘messages‘));
 24 }
 25 

4.显示视图:

  1 @extends(‘layouts.app‘)
  2 @section(‘content‘)
  3     <div class="container">
  4         <div class="row">
  5             <div class="card">
  6                 @if($messages->first())
  7                     <div class="card-header">
  8                         <a href="#">
  9
 10                             <img src="{{ $messages->first()->fromUser->avatar }}"
 11                                  alt="{{ $messages->first()->fromUser->name }}"
 12                                  class="img-thumbnail img-fluid card-img" style="height: 30px;width: 30px">
 13                             {{ $messages->first()->fromUser->name }}
 14
 15                         </a>
 16                     </div>
 17                     <div class="card-body">
 18                         <div class="messaging">
 19                             <div class="inbox_msg">
 20
 21                                 <div class="mesgs">
 22                                     <div class="msg_history">
 23                                         @forelse($messages as $message)
 24                                             @if($message->fromUser->id===auth()->user()->id)
 25                                                 <div class="outgoing_msg">
 26                                                     <div class="sent_msg">
 27                                                         @if($message->read_at)
 28                                                             <span class="text-black-50">已读</span>
 29                                                         @endif
 30                                                         <p> {{$message->content}}</p>
 31                                                         <span
 32                                                             class="time_date"> {{$message->created_at->diffForHumans()}}</span>
 33                                                     </div>
 34                                                 </div>
 35                                             @else
 36                                                 <div class="incoming_msg">
 37                                                     <div class="incoming_msg_img"><img
 38                                                             src="{{ $messages->first()->fromUser->avatar }}"
 39                                                             alt="{{ $messages->first()->fromUser->name }}">
 40                                                     </div>
 41                                                     <div class="received_msg">
 42                                                         <div class="received_withd_msg">
 43                                                             <p> {{$message->content}}</p>
 44                                                             <span
 45                                                                 class="time_date">  {{$message->created_at->diffForHumans()}}</span>
 46                                                         </div>
 47                                                     </div>
 48                                                 </div>
 49                                             @endif
 50                                         @empty
 51                                         @endforelse
 52                                     </div>
 53                                 </div>
 54                             </div>
 55                         </div>
 56                         <div class="type_msg mt-2">
 57                             <div class="input_msg_write">
 58                                 <form
 59                                     action="{{ route(‘inbox.store‘,($message->fromUser->id===auth()->user()->id)?$message->toUser->id:$message->fromUser->id) }}"
 60                                     method="post">
 61                                     @csrf
 62                                     <input type="text" class="write_msg" name="content" placeholder="输入信息回复"/>
 63                                     <button class="msg_send_btn" type="submit">
 64                                         <i class="fa fa-paper-plane-o"
 65                                            aria-hidden="true"></i>
 66                                     </button>
 67                                 </form>
 68                             </div>
 69                         </div>
 70                     </div>
 71                 @else
 72                     <div class="card-header">不好意思!找不到你要的数据!</div>
 73                 @endif
 74             </div>
 75         </div>
 76     </div>
 77 @endsection
 78 <style>
 79     .container {
 80         margin: auto;
 81     }
 82
 83     img {
 84         max-width: 100%;
 85     }
 86
 87     .inbox_people {
 88         background: #f8f8f8 none repeat scroll 0 0;
 89         float: left;
 90         overflow: hidden;
 91         width: 40%;
 92         border-right: 1px solid #c4c4c4;
 93     }
 94
 95     .inbox_msg {
 96         border: 1px solid #c4c4c4;
 97         clear: both;
 98         overflow: hidden;
 99     }
100
101     .top_spac {
102         margin: 20px 0 0;
103     }
104
105     .recent_heading {
106         float: left;
107         width: 40%;
108     }
109
110     .srch_bar {
111         display: inline-block;
112         text-align: right;
113         width: 60%;
114     }
115
116     .recent_heading h4 {
117         color: #05728f;
118         font-size: 21px;
119         margin: auto;
120     }
121
122     .srch_bar input {
123         border: 1px solid #cdcdcd;
124         border-width: 0 0 1px 0;
125         width: 80%;
126         padding: 2px 0 4px 6px;
127         background: none;
128     }
129
130     .srch_bar .input-group-addon button {
131         background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
132         border: medium none;
133         padding: 0;
134         color: #707070;
135         font-size: 18px;
136     }
137
138     .srch_bar .input-group-addon {
139         margin: 0 0 0 -27px;
140     }
141
142     .chat_ib h5 {
143         font-size: 15px;
144         color: #464646;
145         margin: 0 0 8px 0;
146     }
147
148     .chat_ib h5 span {
149         font-size: 13px;
150         float: right;
151     }
152
153     .chat_ib p {
154         font-size: 14px;
155         color: #989898;
156         margin: auto
157     }
158
159     .chat_img {
160         float: left;
161         width: 11%;
162     }
163
164     .chat_ib {
165         float: left;
166         padding: 0 0 0 15px;
167         width: 88%;
168     }
169
170     .chat_people {
171         overflow: hidden;
172         clear: both;
173     }
174
175     .chat_list {
176         border-bottom: 1px solid #c4c4c4;
177         margin: 0;
178         padding: 18px 16px 10px;
179     }
180
181     .inbox_chat {
182         height: 550px;
183         overflow-y: scroll;
184     }
185
186     .active_chat {
187         background: #ebebeb;
188     }
189
190     .incoming_msg_img {
191         display: inline-block;
192         width: 6%;
193     }
194
195     .received_msg {
196         display: inline-block;
197         padding: 0 0 0 10px;
198         vertical-align: top;
199         width: 92%;
200     }
201
202     .received_withd_msg p {
203         background: #ebebeb none repeat scroll 0 0;
204         border-radius: 3px;
205         color: #646464;
206         font-size: 14px;
207         margin: 0;
208         padding: 5px 10px 5px 12px;
209         width: 100%;
210     }
211
212     .time_date {
213         color: #747474;
214         display: block;
215         font-size: 12px;
216         margin: 8px 0 0;
217     }
218
219     .received_withd_msg {
220         width: 57%;
221     }
222
223     .mesgs {
224         float: left;
225         padding: 30px 15px 0 25px;
226         width: 60%;
227     }
228
229     .sent_msg p {
230         background: #05728f none repeat scroll 0 0;
231         border-radius: 3px;
232         font-size: 14px;
233         margin: 0;
234         color: #fff;
235         padding: 5px 10px 5px 12px;
236         width: 100%;
237     }
238
239     .outgoing_msg {
240         overflow: hidden;
241         margin: 26px 0 26px;
242     }
243
244     .sent_msg {
245         float: right;
246         width: 46%;
247     }
248
249     .input_msg_write input {
250         background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
251         border: medium none;
252         color: #4c4c4c;
253         font-size: 15px;
254         min-height: 48px;
255         width: 100%;
256     }
257
258     .type_msg {
259         border-top: 1px solid #c4c4c4;
260         position: relative;
261     }
262
263     .msg_send_btn {
264         background: #05728f none repeat scroll 0 0;
265         border: medium none;
266         border-radius: 50%;
267         color: #fff;
268         cursor: pointer;
269         font-size: 17px;
270         height: 33px;
271         position: absolute;
272         right: 0;
273         top: 11px;
274         width: 33px;
275     }
276
277     .msg_history {
278         height: 516px;
279         overflow-y: auto;
280     }
281 </style>
282
283 

show.blade.php

效果:

5.添加新的未读消息加特效:

当前状态:

代码:

  1 @extends(‘layouts.app‘)
  2 @section(‘content‘)
  3     <div class="container">
  4         <div class="row">
  5             <div class="card">
  6                 <div class="card-header">
  7                     @if($messages->filter(function ($value, $key){
  8                         return $value->where(‘read_at‘,null)->count()>0;})->count()>0)
  9                         <div class="alert alert-danger">
 10                             你有新的消息!
 11                         </div>
 12                     @endif
 13                 </div>
 14                 <div class="card-body">
 15
 16                     @forelse($messages as $messageGroup)
 17                         <div class="card">
 18                             <div class="card-header">
 19                                 <a href="#">
 20                                     <img src="{{ $messageGroup->first()->fromUser->avatar }}"
 21                                          alt="{{ $messageGroup->first()->fromUser->name }}"
 22                                          class="img-thumbnail img-fluid card-img" style="height: 30px;width: 30px">
 23                                     {{ $messageGroup->first()->fromUser->name }}
 24                                 </a>
 25                             </div>
 26                             <div class="card-body">
 27                                 <p class="text-success "> 查看详细对话请点击:</p>
 28                                 @if($messageGroup->where(‘read_at‘,null)->count()>0)
 29                                     <p class="alert alert-warning">{{$messageGroup->where(‘read_at‘,null)->count()}}
 30                                         条未读消息</p>
 31                                 @endif
 32                                 <a href=" {{ route(‘inbox.show‘, $messageGroup->first()->fromUser->id) }}"
 33                                    class="btn btn-block bg-light"> {{ $messageGroup->first()->content }}</a>
 34                             </div>
 35                         </div>
 36                     @empty
 37                     @endforelse
 38                 </div>
 39             </div>
 40         </div>
 41     </div>
 42 @endsection
 43
 44 

index.blade.php

修改后:

修复 bug 和实现 Repository 模式:

我的代码没有那个bug。其次我这不实现Repository 模式

6.实现私信通知:

当用户收到新的私信的时候,发送一个通知告知用户。

执行:

  1 php artisan make:notification NewMessageNotification

代码:

暂时只实现站内通知,

原文地址:https://www.cnblogs.com/dzkjz/p/12409051.html

时间: 2024-10-13 22:55:22

Laravel Vuejs 实战:开发知乎 (37)私信标为已读的相关文章

Laravel Vuejs 实战:开发知乎 (27)对答案进行点赞

1.建表 用户与回答点赞的关系表[多对多关系] 1 php artisan make:model Vote -m 1 <?php 2 3 use Illuminate\Database\Migrations\Migration; 4 use Illuminate\Database\Schema\Blueprint; 5 use Illuminate\Support\Facades\Schema; 6 7 class CreateVotesTable extends Migration 8 { 9

Laravel Vuejs 实战:开发知乎 (33)自定义helper方法

参考: laravel 中添加自定义辅助函数helpers.php laravel自定义公共函数的引入怎么使用 Laravel增加自定义助手函数 Laravel 添加自定义全局函数 laravel 添加帮助类在helper 辅助函数 Laravel 目录结构:自定义函数的存放位置 创建 app/Http/helpers.php文件 修改 compose.json文件 1 "autoload": { 2 "classmap": [ 3 "database/s

c#实战开发:用.net core开发一个简单的Web以太坊钱包 (六)

今天就来开发一个C# 版的简易钱包 先回顾以前的内容 c#实战开发:以太坊Geth 命令发布智能合约 (五) c#实战开发:以太坊Geth 常用命令 (四) c#实战开发:以太坊钱包快速同步区块和钱包卡死解决方案 (三) c#实战开发:以太坊钱包对接私链 (二) c#实战开发:以太坊私链搭建(一) 先看一下可视化钱包有哪些功能呢? 那这个钱包得有什么功能呢? 1.查看用户 2.查看交易记录 3.转账 4.发布智能合约 5.代币转账 6.代币查询 7.实时同步区块对比 8.智能填写手续费 首先新建

Laravel 教程 - Web 开发实战入门 ( Laravel 5.5 )购买链接

? Laravel 教程 - Web 开发实战入门 ( Laravel 5.5 )购买链接: 推荐给你高品质的实战课程 https://laravel-china.org/courses?rf=15818 ? ? 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论. 原文地址:https://www.cnblogs.com/lovebing/p/9578193.html

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

100套最适合自学的实战开发教程视频(程序员都在学)

BAT大咖助力 全面升级Android面试 BAT大牛亲授 基于ElasticSearch的搜房网实战 从天气项目看Spring Cloud微服务治理 Java企业级电商项目架构演进之路  Tomcat集群与Redis分布式 Java深入微服务原理改造房产销售平台 SSM到Spring Boot-从零开发校园商铺平台 Java Spring Boot企业微信点餐系统 Java秒杀系统方案优化-高性能高并发实战 Spring Boot技术栈博客企业前后端 Java SSM快速开发仿慕课网在线教育平

《H5+移动应用实战开发》已出版

<H5+移动应用实战开发>终于出版了,最近在忙着Vue和Webpack相关的前端书籍写稿.本书面向的读者为:从后端转前端,或零基础开始学习移动端开发的人.前后端完全分离的开发方式越来越成为一种趋势,下一本书,将是专业前端书籍,是关于Vue在实际工作中的单页应用开发,涉及到Vue全家桶以及webpack相关技术. 京东:https://item.jd.com/12521607.html 当当:http://product.dangdang.com/27864696.html 天猫:H5+移动应用

基于plusgantt的项目管理系统实战开发

<基于plusgantt的项目管理系统实战开发(Spring3+JDBC+RMI的架构.自定义工作流)> 课程讲师:Adam 课程分类:Java 适合人群:中级 课时数量:37课时 用到技术:Spring 3+JDBC+RMI的架构.jquery.工作流 涉及项目:项目管理系统 咨询QQ:1337192913(小公子) 本课程是某航空研究所的真正项目的缩影.在课程中,将实际项目的业务进行了缩减,但是主要的技术点全部都讲解到了. 课程内容虽然不多,但是麻雀虽小五脏俱全,通过学习本课程,可以掌握到

【课程分享】深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)

深入浅出微信公众平台实战开发(微网站.LBS云.Api接口调用.服务号高级接口) 课程下载地址:链接:http://pan.baidu.com/share/link?shareid=2214724072&uk=3611155194 密码:glvc 一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 微信公众平台的火热程度已经不用多言,无论是个人还是企业,政府还是商家,都已经开始搭建微信公众平台,微信的作用已经被各界人士认可.微信公众平台的技术需求市场缺口巨大. 1.2.课程内容简介 本