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

2021-04-11 15:28

阅读:599

标签:creat   line   muse   20px   log   pad   auth   public   hit   

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                 [
 30read_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

代码:

暂时只实现站内通知,

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

标签:creat   line   muse   20px   log   pad   auth   public   hit   

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


评论


亲,登录后才可以留言!