创建黑名单表迁移: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. 使用FaceNet 图像相识度对比

    1. 模型结构:

  2. Mybatis映射文件的自动映射与手动映射问题

    Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...

  3. Asp.Net core 视图组件ViewComponent

    视图组件 ViewComponent 最近用了一下视图组件,还挺方便的,如果遇到公共的部分,可以抽出来,写成视图组件,方便调用 先上图看一下效果:比如首页的4个画红框的地方是4个模块,有些地方可能要重 ...

  4. 转:ls用法详解

    在Linux中显示文件大小的时候,通常的做法是使用“ls -l”,显示的大小是文件的字节大小. 但是,如果文件比较大的话,显示起来不是特别易读,这个时候,可以使用“ls -lh”,就可以使用比较接近文 ...

  5. 【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)

    [坦克大战]Unity3D多人在线游戏 http://www.taikr.com/my/course/937 1.NetworkManager的介绍: 说明:选择固定生成时会自动寻找有StartPos ...

  6. Nginx-Tomcat搭建负载均衡(转载)

    一.   工具 nginx-1.8.0 apache-tomcat-6.0.33 二.    目标 实现高性能负载均衡的Tomcat集群: 三.    步骤 1.首先下载Nginx,要下载稳定版: 2 ...

  7. MySQL——修改数据库远程权限

    语句 赋予权限 ON *.*前一个*代表库后一个代表表 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxxx' WITH GRA ...

  8. Lightning Conductor 洛谷P3515 决策单调性优化DP

    遇见的第一道决策单调性优化DP,虽然看了题解,但是新技能√,很开森. 先%FlashHu大佬,反正我是看了他的题解和精美的配图才明白的,%%%巨佬. 废话不多说,看题: 题目大意 已知一个长度为n的序 ...

  9. JMeter 的调式工具

    任何的编程工具都会相应的调式工具,JMeter的调式 工具主要有五种: 1.查看结果树:含请求信息.响应信息等 2.HTTP 镜像服务器:HTTP Mirror Server用于查看请求信息 3.De ...

  10. spring-boot-devtools在Idea中热部署方法

    1 pom.xml文件 注:热部署功能spring-boot-1.3开始有的 <!--添加依赖--> <dependency> <groupId>org.sprin ...