创建黑名单表迁移:php artisan make:model Models/BlackFeeds -m    (生成模型和迁移文件)

迁移文件中创建如下字段:

public function up()
{
if (!Schema::hasTable('black_feeds')) {
Schema::create('black_feeds', function (Blueprint $table) {
$table->integer('user_id')->unsigned()->comment('main user');
$table->integer('target_id')->unsigned()->comment('blacked user id');
$table->timestamps();
$table->index('user_id');
});
}
DB::statement("alter table `black_feeds` comment'拉黑动态用户表'");//表注释
}

加入黑名单:用户表(users)

/*
* 动态加入黑名单.
* @Author Wayne
* @DateTime 2018-04-17
* @Email qiaobin@zhiyicx.com
* @param Request $request [description]
* @param UserModel $user [description]
* @return [type] [description]
*/
public function black(Request $request, UserModel $targetUser, UserBlackFeedModel $blackList)
{
$target_id = $targetUser->id;
$user_id = $request->user()->id;
if ($target_id === $user_id) {
return response()->json(['message' => '不能将自己加入黑名单'], 422);
}
$record = $blackList->where(['user_id' => $user_id, 'target_id' => $target_id])
->first();
if (! $record) {
$record = new UserBlackFeedModel();
$record->user_id = $user_id;
$record->target_id = $target_id;
} $record->save();
$cacheKey = sprintf('user-feeded:%s,%s', $target_id, $user_id);
Cache::forever($cacheKey, true); return response()->json(['message' => '操作成功'], 201);
}

移出黑名单:

/**
* 动态移出黑名单.
* @Author Wayne
* @DateTime 2018-04-17
* @Email qiaobin@zhiyicx.com
* @param Request $request [description]
* @param UserModel $user [description]
* @return [type] [description]
*/
public function unBlack(Request $request, UserModel $targetUser, UserBlackFeedModel $blackList)
{
$target_id = $targetUser->id;
$user_id = $request->user()->id;
if ($target_id === $user_id) {
return response()->json(['message' => '不能对自己进行操作'], 422);
}
$blackList->where(['user_id' => $user_id, 'target_id' => $target_id])
->delete();
$cacheKey = sprintf('user-feeded:%s,%s', $target_id, $user_id);
Cache::forget($cacheKey); return response()->json('', 204);
}

黑名单列表:

public function blackList(Request $request)
{
$user = $request->user();
$offset = $request->input('offset', 0);
$limit = $request->input('limit', 15);
$blacks = $user->blackfeeds()
->with('user')
->latest()
->limit($limit)
->offset($offset)
->get(); $blacks = $blacks->map(function ($black) use ($user) {
$black->user->blackfeeded = true; return $black->user;
}); return response()->json($blacks, 200);
}

用户(User)模型中use以下:

trait UserHasBlackFeeds:

<?php
declare(strict_types=1); namespace Zhiyi\Plus\Models\Relations; use Zhiyi\Plus\Models\User;
use Zhiyi\Plus\Models\BlackFeeds;
use Illuminate\Support\Facades\Cache; trait UserHasBlackFeeds
{
/**
* get blacklists of current user.
* @Email qiaobin@zhiyicx.com
* @return [type] [description]
*/
public function blackfeeds()
{
return $this->hasMany(BlackFeeds::class, 'user_id', 'id');
} /**
* is user blacked by current_user.
* @Email qiaobin@zhiyicx.com
* @param [type] $user [description]
* @return [type] [description]
*/
public function blackfeeded($user): bool
{
if ($user instanceof User) {
$user = $user->id;
} $cacheKey = sprintf('user-feeded:%s,%s', $user, $this->id);
if (Cache::has($cacheKey)) {
return Cache::get($cacheKey);
} $status = $this->blackfeeds()
->where('target_id', $user)
->first() !== null;
Cache::forever($cacheKey, $status); return $status;
}
}

比如现在如果想查动态时不显示黑名单中用户的动态就可以如此查询:(动态表Feed)

动态表中增加关联如下:(user_id发布动态用户id)

public function blackfeeds()
{
return $this->hasMany(BlackFeeds::class, 'target_id', 'user_id');
}

动态列表查询(屏蔽黑名单中用户):


$limit = $request->query('limit', 10);
$after = $request->query('after');
if (is_null($user = $request->user('api'))) {
abort(401);
}
$user_id=$request->user('api')->id;
$feedModel->whereDoesntHave('blackfeeds', function ($query) use ($user_id) {
return $query->where('user_id', $user_id);
})
->orderBy('id', 'desc')
->when((bool) $after, function ($query) use ($after) {
return $query->where('id', '<', $after);
})
->limit($limit)
->get();

laravel 黑名单功能实现的更多相关文章

  1. FreeSWITCH黑名单功能设置

    功能描述:对呼叫的号码进行过滤 步骤: 1.编译mod_blacklist 模块:进入源目录/usr/local/src/freeswitch  --> make mod_blacklist-i ...

  2. [android] 手机卫士黑名单功能(短信拦截)

    前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭 在service包下定义一个类Ca ...

  3. [android] 手机卫士黑名单功能(列表展示)

    先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截 新建Activity类CallSmsSafeActivity.java 新建布局文件activity_ ...

  4. 再谈缓存和Redis

    自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...

  5. Android 基础概念了解

    Android 的前世今生Android 系统框架Android 主要组成 部分Android 常用的操作 Android 的前世今生 Android 的诞生 2003年10月,有"Andr ...

  6. Mina架构与优化指南

    MINA架构 这里,我借用了一张Trustin Lee在Asia 2006的ppt里面的图片来介绍MINA的架构. Remote Peer就是客户端,而下方的框是MINA的主要结构,各个框之间的箭头代 ...

  7. Jexus-5.6.3使用详解、Jexus Web Server配置

    一.Jexus Web Server配置   在 jexus 的工作文件夹中(一般是“/usr/jexus”)有一个基本的配置文件,文件名是“jws.conf”. jws.conf 中至少有 Site ...

  8. Jexus-5.6.3使用详解

    一.Jexus Web Server配置 在 jexus 的工作文件夹中(一般是"/usr/jexus")有一个基本的配置文件,文件名是"jws.conf".j ...

  9. 限制非安全IP访问

    这个是一个检测ip是否非法的php函数,适应于白名单,黑名单功能开发,主要场景应用于:api来源限制,访问限制等. /** * 安全IP检测,支持IP段检测 * @param string $ip 要 ...

随机推荐

  1. 关于token登录逻辑分析

    前言: token登录上一家公司也写过,迷迷糊糊的, 现在做一个APP,需求为每次调用接口都会传token,登录注册等特殊的除外, 逻辑整理一下还是比较简单的 主要的问题还是,如何在框架中找到较好的插 ...

  2. 《Effective C++》模板与泛型编程:条款32-条款40

    条款41:了解隐式接口和编译期多态 class支持显示接口和运行期多态 class的显示接口由函数的名签式构成(函数名称.参数类型.返回类型) class的多态通过virtual函数发生在运行期 te ...

  3. ABP中模块初始化过程(二)

    在上一篇介绍在StartUp类中的ConfigureService()中的AddAbp方法后我们再来重点说一说在Configure()方法中的UserAbp()方法,还是和前面的一样我们来通过代码来进 ...

  4. set 数据类型

    list => 允许重复的集合,可修改 tuple => 允许重复的集合,不可修改 dict set => 不允许重复的集合 .set 不允许重复的列表 1.创建 s = set() ...

  5. poj2778(AC自动机+矩阵快速幂)

    题意:给你n个字符串,问你长度为m的字符串且字符串中不含有那n个子串的字符串的数量 解题思路:这道题一开始就不太懂,还以为是组合数学的题目,后面看了别人的博客,才知道这是属于AC自动机的另一种用法,是 ...

  6. VS界面控件大小调整

    vs2015 ,配置名称显示不全,怎么才能把这个搞宽? 这个问题困扰时间挺长了, 对vs的应用仅限于敲代码.编译, 其他的功能了解甚少, 于是试着在右键菜单中找到了界面自定义窗口, 如下: 找到想要修 ...

  7. Ubuntu下基于Virtualenv构建Python开发环境

    1.安装virtualenv并建立虚拟环境 1).更新pip版本 sudo pip install --upgrade pip 如果出现如下异常: File , in <module> f ...

  8. 「CF1154F」Shovels Shop【背包DP】

    题目链接 [洛谷传送门] 题解 非常简单的背包. \(f[i]\)表示购买\(i\)个物品所需要最少的花费. 不考虑免费的限制条件,那么一定是选择前\(k\)个双鞋子. 那么加入免费的条件,那么还是要 ...

  9. 记录一次有意思的XSS过滤绕过

    我的朋友赵一天今晚给我发了一个站,跟我说他xss绕不过去,让我试试.我正好无事,就帮她看看咯. 通过赵一天发我的站点,说实话,我自己学到了很多东西,感谢大佬的教诲.今天分享出来: 站点:xxx.com ...

  10. java 11 不可修改集合API

    不可修改集合API 自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别. 示例1: ...