laravel 黑名单功能实现
创建黑名单表迁移: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 黑名单功能实现的更多相关文章
- FreeSWITCH黑名单功能设置
功能描述:对呼叫的号码进行过滤 步骤: 1.编译mod_blacklist 模块:进入源目录/usr/local/src/freeswitch --> make mod_blacklist-i ...
- [android] 手机卫士黑名单功能(短信拦截)
前面我们把需要拦截的手机号都存储和展示出来了,接下来是使用广播接收者拦截短信了,这个广播接收者需要和一个服务绑定,服务开启的时候,接收者存在,服务停掉时,接收者关闭 在service包下定义一个类Ca ...
- [android] 手机卫士黑名单功能(列表展示)
先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截 新建Activity类CallSmsSafeActivity.java 新建布局文件activity_ ...
- 再谈缓存和Redis
自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...
- Android 基础概念了解
Android 的前世今生Android 系统框架Android 主要组成 部分Android 常用的操作 Android 的前世今生 Android 的诞生 2003年10月,有"Andr ...
- Mina架构与优化指南
MINA架构 这里,我借用了一张Trustin Lee在Asia 2006的ppt里面的图片来介绍MINA的架构. Remote Peer就是客户端,而下方的框是MINA的主要结构,各个框之间的箭头代 ...
- Jexus-5.6.3使用详解、Jexus Web Server配置
一.Jexus Web Server配置 在 jexus 的工作文件夹中(一般是“/usr/jexus”)有一个基本的配置文件,文件名是“jws.conf”. jws.conf 中至少有 Site ...
- Jexus-5.6.3使用详解
一.Jexus Web Server配置 在 jexus 的工作文件夹中(一般是"/usr/jexus")有一个基本的配置文件,文件名是"jws.conf".j ...
- 限制非安全IP访问
这个是一个检测ip是否非法的php函数,适应于白名单,黑名单功能开发,主要场景应用于:api来源限制,访问限制等. /** * 安全IP检测,支持IP段检测 * @param string $ip 要 ...
随机推荐
- ReSharper 2017破解详细方法:
VS里面,打开ReSharper的注册窗口:ReSharper ——> Help ——> License Information... Use License Server,右侧加号,点击 ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- 8.docker的安全性
在查看Docker安全性时,有四个主要方面需要考虑: 内核的内在安全性及其对命名空间和cgroup的支持; Docker守护进程本身的攻击面; 容器配置配置文件中的漏洞,默认情况下或用户自定义时. 内 ...
- 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)
产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...
- 一分钟学会JavaMail(假)__手动滑稽
因为公司内部办公系统(OA)需要增加一个发送邮件的功能,所以学习了这个感觉比较冷门的JavaMail 1.先上成功截图 : 2.准备事项:Java Mail虽然是官方写的,但是没有集成到jdk里面 ...
- python学习日记(OOP访问限制)
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- [JSOI2008]Blue Mary开公司[李超线段树]
题面 bzoj luogu 好久以前听lxl讲过 咕掉了.. 竟然又遇到了 安利blog #include <cmath> #include <cstring> #includ ...
- css 函数
css还有一些强大的函数: 1. calc 可以混合多种单位来计算 div { font-size: calc(100vw/5 + 1rem - 100px) } 2. max.min.clamp m ...
- CMDB资产管理系统开发【day26】:Django admin
想实现的是一个表里面的字段 选择性的出现在菜单栏 1.如何自定义菜单 自定义菜单前 在asset\admin.py里添加如下代码: class NewAssetApprovalZoneAdmin(ad ...
- HTML/CSS: 如何制作未读信息图标
最近公司项目中涉及到制作通讯界面中未读信息的带数字的红色圆点图标. 拿我目前的博客头像图片为例(其实就是谷歌图片中粗略挑了一张顺眼的图片),效果图如下: HTML代码如下: <img id=&q ...