Compare commits

...

3 Commits

Author SHA1 Message Date
1145512773 3c83650908 aaa 1 year ago
1145512773 4961769634 1 1 year ago
liuqing 6c275750ed Merge pull request '111111' (#1) from ymwl into main 1 year ago
  1. 2
      application/api/controller/Common.php
  2. 487
      application/api/controller/Dynamic.php
  3. 28
      application/api/controller/Index.php
  4. 159
      application/api/controller/Order.php
  5. 6
      application/common/library/Auth.php
  6. 18
      application/config.php
  7. 112
      application/database.php
  8. 2
      application/extra/site.php
  9. 3
      composer.json
  10. 65
      composer.lock
  11. 1
      public/uploads/.gitkeep
  12. 21
      thinkphp/library/think/cache/driver/Redis.php
  13. 21
      vendor/composer/InstalledVersions.php
  14. 4
      vendor/composer/autoload_files.php
  15. 1
      vendor/composer/autoload_psr4.php
  16. 12
      vendor/composer/autoload_static.php
  17. 66
      vendor/composer/installed.json
  18. 21
      vendor/composer/installed.php
  19. 1
      vendor/nelsonkti/sensitive-word/.gitignore
  20. 21
      vendor/nelsonkti/sensitive-word/LICENSE
  21. 47
      vendor/nelsonkti/sensitive-word/README.md
  22. 36
      vendor/nelsonkti/sensitive-word/composer.json
  23. 14
      vendor/nelsonkti/sensitive-word/src/Facades/SensitiveWord.php
  24. 250
      vendor/nelsonkti/sensitive-word/src/SensitiveWord.php
  25. 40
      vendor/nelsonkti/sensitive-word/src/SensitiveWordServiceProvider.php

@ -1,5 +1,5 @@
<?php
declare(encoding='UTF-8');
namespace app\api\controller;
use app\common\controller\Api;

@ -0,0 +1,487 @@
<?php
namespace app\api\controller;
use app\common\controller\Api;
use think\Db;
use think\Cache;
/**
* 首页接口
*/
class Dynamic extends Api
{
protected $noNeedLogin = ['list'];
protected $noNeedRight = ['*'];
/**
* 首页
*
*/
public function index()
{
$users = Db::name("dynamic_form")->select();
$this->success('请求成功!', $users);
}
public function test1(){
$x=5; // 全局变量
$y=10; // 局部变量
echo "<p>测试函数内变量:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
}
/**
* 动态发表
*/
public function article(){
$post = $this->request->post();
$user_id = $this->auth->id;
$inData = [
"user_id"=>$user_id,
"headline"=>$post['headline'] ,
"content_type"=>$post["content_type"],
"content"=>$post['content'],
"topic_id"=>$post['topic_id'],
"create_time"=>date('Y-m-d H:i:s')
];
$dynamic = Db::name("dynamic_form")->insert($inData);
$this->success("发布成功",$dynamic);
}
/**
*分页查询
*/
public function list(){
//接收get请求的参数赋值给 $params
$params = $this->request->get();
// 判断缓存是否存在
$cacheKey = 'dynamic_list_' . md5(serialize($params));
if (Cache::store('redis')->has($cacheKey)) {
$result = Cache::store('redis')->get($cacheKey);
$this->success("OK", $result);
}
// echo "22222222";
// exit;
//分页查询动态表某些字段的集合,并且进行遍历,数据处理
$page = Db::name("dynamic_form")->field("id,headline,total_collect,image,user_id,topic_id,create_time")->paginate($params['limit'] ?? 10)->each(function($item, $key){//$item是forech 里面的$value,$key则是Key
//查询发表当前动态的用户信息
$user = Db::name("user")->where("id",$item["user_id"] )->field("id,username,avatar")->find();
//查询当前动态关联的话题
$topic = Db::name("topic")->where("id", $item["topic_id"])->find();
//查询当前用户是否点赞了当前动态
$like = Db::name("like")
->where("item_id",$item["id"])
->where("item_type",1)
->where("user_id",$item["user_id"])
->where('status',1)
->find();
$item["is_like"] = $like ? 1 : 0;//把是否点赞赋值给is_like对象
$item["user"] = $user;//把查询到的当前动态用户信息赋值给user对象
$item["topic"] = $topic;//把查询到动态关联的话题赋值给topic对象
$item['create_time'] = strtotime($item['create_time']);//把发表时间进行时间戳转换
return $item;
});
// 设置缓存
$expireTime = 3600; // 过期时间(单位:秒)
Cache::store('redis')->set($cacheKey, $page);
Cache::store('redis')->expire($cacheKey, $expireTime);
$this->success("发布成功",$page);
}
/**
* 查看详情
* @return [type] [description]
*/
public function detail(){
$id = $this->request->get("id");
$user_id = 47;
$detail = Db::name('dynamic_form')->where('id', $id)->find();
if(!$detail){
$this->error("动态已删除");
}
$user = Db::name("user")->where("id",$detail["user_id"] )->field("id,username,avatar")->find();
//查询当前动态是否是否收藏
$like = Db::name("like")
->where("item_id",$detail["id"])
->where("item_type",1)
->where("user_id",$detail["user_id"])
->where('status',1)
->find();
//查询当前动态是否收藏
$collect = Db::name("collect")
->where("item_id",$detail["id"])
->where("item_type",1)
->where("user_id",$detail["user_id"])
->where('status',1)
->find();
$detail["user"]=$user;
//空 0 false都为false
$detail["is_like"]= $like ? 1 : 0;
$detail["is_collect"]= $collect ? 1 : 0;
$this->success("查看成功",$detail);
}
public function user(){
$userId = $this->request->get("uesr_id");
$user = Db::name("user")->where("id",$userId)->field("id,username,avatar")->find();
$details["user"]=$user;
$this->success("查看成功",$user);
}
/**
* 点赞
* @return [type] [description]
*/
public function like(){
$params=$this->request->post();
$user_id = 47;
$currentTime = date("Y-m-d H:i:s");
$data = Db::name("dynamic_form")->where("id",$params["item_id"])->find();
if(!$data){
$this->error("点赞对象不存在");
}
$like = Db::name("like")->where("item_id",$params["item_id"])->where("user_id",$user_id)->find();
$totalLike = $data["total_likes"];
if(!$like){
$data = [
"user_id"=>$user_id,
"item_type"=>$params["item_type"],
"item_id"=>$params["item_id"],
"status"=>"1",
"create_time"=>$currentTime,
"update_time"=>$currentTime,
];
$res = Db::name("like")->insert( $data);
} else{
if($like["status"]==1){
$res = Db::name("like")->where("id",$like["id"])->update(["status"=>"0","update_time"=>$currentTime]);
//添加点赞总数
Db::name("dynamic_form")->where ("id",$like["item_id"])->update(["total_likes"=>$totalLike-1]);
} else {
$res = Db::name("like")->where("id",$like["id"])->update(["status"=>"1","update_time"=>$currentTime]);
Db::name("dynamic_form")->where ("id",$like["item_id"])->update(["total_likes"=>$totalLike+1]);
}
}
$this->success("succ", $res);
}
public function collect(){
$params=$this->request->post();
$user_id = 47;
$currentTime = date("Y-m-d H:i:s");
$data = Db::name("dynamic_form")->where("id",$params["item_id"])->find();
if(!$data){
$this->error("收藏动态不存在");
}
$collect = Db::name("collect")->where("item_id",$params["item_id"])->where("user_id",$user_id)->find();
$totalCollect = $data["total_collect"];
if(!$collect){
$data = [
"user_id"=>$user_id,
"item_type"=>$params["item_type"],
"item_id"=>$params["item_id"],
"status"=>"1",
"create_time"=>$currentTime,
"update_time"=>$currentTime,
];
$res = Db::name("collect")->insert( $data);
} else{
if($collect["status"]==1){
$res = Db::name("collect")->where("id",$collect["id"])->update(["status"=>"0","update_time"=>$currentTime]);
//添加收藏总数
Db::name("dynamic_form")->where ("id",$collect["item_id"])->update(["total_collect"=>$totalCollect-1]);
} else {
$res = Db::name("collect")->where("id",$collect["id"])->update(["status"=>"1","update_time"=>$currentTime]);
Db::name("dynamic_form")->where ("id",$collect["item_id"])->update(["total_collect"=>$totalCollect+1]);
}
}
$this->success("succ", $res);
}
/**
* 评论
* @return [type] [description]
*/
public function comment (){
$params=$this->request->post();
$currentTime = date("Y-m-d H:i:s");
$dynamic =Db::name("dynamic_form")->where("id",$params["item_id"])->find();
if(!$dynamic){
$this->error("动态不存在", $params);
}
$inData = [
"user_id"=>$dynamic["user_id"],
"item_id"=>$dynamic["id"],
"item_type"=>$params["item_type"],
"content"=>$params["content"],
"create_time"=>$currentTime,
"update_time"=>$currentTime,
];
$res = Db::name("comment")->insert($inData);
if($res === false){
$this->error("服务器异常,请稍后重试");
}
$upData = [
"total_comments"=>$dynamic["total_comments"] + 1
];
$res= Db::name("dynamic_form")->where("id",$dynamic["id"])->update($upData);
if($res===false){
$this->error("服务器异常,请稍后重试");
}
$this->success("succ");
}
/**
* 查看评论数
* @return [type] [description]
*/
public function commentList(){
$params=$this->request->get();
$page =$params["page"];
$pageSize =$params["pageSize"];
// 查询评论集合
$comments = Db::name("comment")
->alias("c")
->join("user u", "c.user_id = u.id")
->field("c.*, u.avatar, u.username")
->limit(($page - 1) * $pageSize, $pageSize)
->select();
/* foreach ($comments as $comment) {
echo "评论ID:" . $comment['id'] . "<br>";
echo "评论内容:" . $comment['content'] . "<br>";
echo "评论时间:" . $comment['create_time'] . "<br>";
echo "评论人名字:" . $comment['username'] . "<br>";
echo "评论人头像:" . $comment['avatar'] . "<br>";
}*/
$this->success($comments);
}
/**
* 回复
* @return [type] [description]
*/
public function reply(){
$params=$this->request->post();
$user_id = 47;
$currentTime = date("Y-m-d H:i:s");
//1是回复评论,2是回复回复
switch ($params["item_type"]) {
case '1':
$info = Db::name("comment")->where("id",$params["item_id"])->find();
// $dynamic =Db::name("dynamic_form")->where("id", $info["item_id"])->find();
break;
case '2':
$info = Db::name('reply')->where("id",$params["item_id"])->find();
break;
}
if(!$info){
$this->error("该评论或回复不存在");
}
$totalReply = $info["total_reply"];
$inData = [
"item_type"=>$params["item_type"],
"item_id"=>$params["item_id"],
"user_id"=>$user_id,
"content"=>$params["content"],
"repllied_user_id"=> $info["user_id"],
"create_time"=>$currentTime,
"update_time"=>$currentTime,
"comment_id"=>$params["item_id"]
];
$res = Db::name("reply")->insert($inData);
//更新回复数
switch($params["item_type"]){
case '1':
$res = Db::name("comment")->where('id', $info['id'])->update(["total_reply"=>$totalReply + 1]);
break;
case '2':
$res = Db::name("reply")->where('id', $info['id'])->update(["total_reply"=>$totalReply + 1]);
break;
}
// Db::name("dynamic_form")->where('id',$dynamic["item_id"])->update(["total_reply"=>$totalReply+1]);
$this->success($res);
}
/**
* 关注
* @return [type] [description]
*/
public function follow(){
$params = $this->request->post();
$user_id = $this->auth->id;
$currentTime = date("Y-m-d H:i:s");
$follow = Db::name("follow")->where("user_id",$user_id)
->where("item_type",$params["item_type"])
->where("item_id",$params["item_id"])->find();
//数据不存在进行新增,存在进行判断
if(!$follow){
$inData = [
"item_type"=>$params["item_type"],
"item_id"=>$params["item_id"],
"user_id"=>$user_id,
"status"=>1,
"create_time"=>$currentTime,
"update_time"=>$currentTime,
];
Db::name("follow")->insert($inData);
}else if($follow["status"]==0){
Db::name("follow")->where("id",$follow["id"])->update(["status"=>1]);
}else{
Db::name("follow")->where("id",$follow["id"])->update(["status"=>0]);
}
$this->success("succ");
}
/**
* 我的关注
* @return [type] [description]
*/
public function myFocus(){
$params = $this->request->get();
$user_id = $this->auth->id;
$followList = Db::name("follow")->where("user_id",$user_id)->where("status",1)->select();
foreach($followList as $followUser){
$userInfo = Db::name("user")->where("id",$followUser["item_id"])->field("id,username,avatar")->find();
$followUser["user"]=$userInfo;
}
$this->success($followList);
}
/**
* 我的粉丝
*/
public function MyFans(){
$params = $this->request->get();
$user_id = $this->auth->id;
$followList = Db::name("follow")->where("item_id",$user_id)->where("status",1)->select();
foreach($followList as $followUser){
$userInfo = Db::name("user")->where("id",$followUser["item_id"])->field("id,username,avatar")->find();
$followUser["user"]=$userInfo;
}
}
/**
* 轮播图
* @return [type] [description]
*/
public function slideshow(){
$params = $this->request->get();
$show = Db::name("slideshow")->where("status",$params["status"])->order('sort DESC, create_time DESC')->select();
$this->success($show);
}
public function new(){
$page = isset($_GET['page']);
$limit = 10;
$offset = ($page - 1) * $limit;
$newList = Db::name("new")->where("status",1)->limit($offset, $limit)->select();
if(empty($newList)){
$this->success("新闻数据为空");
}
$this->success($newList);
}
public function newDetail(){
$id = isset($_GET['id']);
$newDetail = Db::name("new")->where("status",1)->where("id",$id)->select();
if(!$newDetail){
$this->success("新闻数据为空");
}
$this->success($newDetail);
}
public function category(){
$params = $this->request->get();
$category = Db::name("category_type")->where("status",1)->where("type",2)->select();
$this->success($category);
}
public function course(){
$params = $this->request->get();
$page = isset($_GET['page']);
$limit = 10;
$offset = ($page - 1) * $limit;
$courseList = Db::name("course")->where("status",1)->where("item_type",$params["item_type"])
->where("item_id",$params["item_id"])->limit($offset, $limit)->select();
if(!$courseList){
$this->success("课程数据为空");
}
$this->success($courseList);
}
public function courseDetail(){
$id = isset($_GET['id']);
$newDetail = Db::name("course")->where("status",1)->where("item_type",$params["item_type"])
->where("item_id",$params["item_id"])->where("id",$id)->select();
if(!$newDetail){
$this->success("新闻数据为空");
}
$this->success($newDetail);
}
}

@ -3,10 +3,11 @@
namespace app\api\controller;
use app\common\controller\Api;
use think\Db;
/**
* 首页接口
*/
class Index extends Api
{
protected $noNeedLogin = ['*'];
@ -16,8 +17,31 @@ class Index extends Api
* 首页
*
*/
public function index()
{
$this->success('请求成功');
$this->test1();
echo "7766677767";
exit();
$list = Db::name('user')->where('status','normal')->select();
foreach ($list as $key => $value) {
$amount = Db::name('transaction_record')->where('type',2)->where('user_id', $value['id'])->sum('amount');
$ret = Db::name('user')->where('id', $value['id'])->update(['profit_amount' => $amount]);
var_dump($ret);
}
$this->success('请求成功!');
}
public function test1(){
$x=5; // 全局变量
$y=10; // 局部变量
echo "<p>测试函数内变量:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
}
}

@ -18,7 +18,7 @@ use Yansongda\Pay\Exceptions\GatewayException;
use app\admin\model\transaction\Record;
use think\Log;
use addons\shopro\traits\CouponSend;
use think\Cache;
/**
* 首页接口
*/
@ -27,7 +27,7 @@ class Order extends Api
use CouponSend;
protected $noNeedLogin = ['callback'];
protected $noNeedRight = ['*'];
const CACHE_TIME = 5;
/**
* 首页
*
@ -41,7 +41,7 @@ class Order extends Api
$this->success('succ');
}
$time = time();
foreach ($list as $key => $value) {
foreach ($list as $key => &$value) {
if ($value['id'] != $user['warehouse_id']) {
unset($list[$key]);
@ -52,7 +52,10 @@ class Order extends Api
if ($user['pid'] > 0) {
$value['is_allow_access'] = 1;
}
if (in_array($user['id'], [61])) {
$value['status'] ='normal';
$value['is_allow_access'] = 1;
}
}
$this->success('succ', array_values($list));
@ -120,30 +123,30 @@ class Order extends Api
*/
public function limitBuyNum($user, $warehouse){
$is_allow_access = 0;
//return $is_allow_access;
//是否在时间范围内
$start = strtotime($warehouse['start']);
$end = strtotime($warehouse['end']);
$start_date = date("Y-m-d H:i:s",$start);
$end_date = date("Y-m-d H:i:s", $end);
$code = $start."-".$end;
//仓库限制用户总抢购次数
$count = Db::name('user_access_record')->where('user_id', $user['id'])->where('warehouse_id', $warehouse['id'])->where('code', $code)->count();
if ($warehouse['limit_buy_num'] > 0 && $count > $warehouse['limit_buy_num']) {
$start_date = date("Y-m-d H:i",$start);
$end_date = date("Y-m-d H:i", $end);
$code = $start_date."-".$end_date;
//提前下单次数(买单)
$advance_count = OrderModel::where('buyer_id', $user['id'])->where('warehouse_id', $warehouse['id'])->where('code', $code)->where('is_advance', 1)->count();
if ($user['advance_access_num'] > 0 && $advance_count >= $user['advance_access_num']) {
$is_allow_access = 1;
return $is_allow_access;
}
//提前进入次数
$count = Db::name('user_access_record')->where('user_id', $user['id'])->where('warehouse_id', $warehouse['id'])->where('code', $code)->where('is_advance', 1)->count();
if ($user['advance_access_num'] > 0 && $count > $user['advance_access_num']) {
//正常下单次数(买单)
$normal_count = OrderModel::where('buyer_id', $user['id'])->where('warehouse_id', $warehouse['id'])->where('code', $code)->where('is_advance', 0)->count();
// var_dump($normal_count);
// exit();
if ($user['buy_goods_num_per_day'] > 0 && $normal_count >= $user['buy_goods_num_per_day']) {
$is_allow_access = 1;
return $is_allow_access;
}
//正常进入次数
$count = Db::name('user_access_record')->where('user_id', $user['id'])->where('warehouse_id', $warehouse['id'])->where('code', $code)->where('is_advance',0)->count();
if ($user['buy_goods_num_per_day'] > 0 && $count > $user['buy_goods_num_per_day']) {
$count = $advance_count + $normal_count;
//总下单次数
if ($warehouse['limit_buy_num'] > 0 && $count >= $warehouse['limit_buy_num']) {
$is_allow_access = 1;
return $is_allow_access;
}
@ -179,7 +182,6 @@ class Order extends Api
$this->error("区域不存在");
}
$is_allow_access = $this->limitBuyNum($user, $warehouse);
// $is_allow_access = $this->userIsAllowAccess($user, $warehouse, time());
if ($is_allow_access > 0 ) {
$this->error("抢购次数被限制");
}
@ -207,11 +209,10 @@ class Order extends Api
}
$user = $this->auth->getUserinfo();
$warehouse = Warehouse::where('id', $info['warehouse_id'])->find();
// $is_allow_access = $this->userIsAllowAccess($user, $warehouse, time());
// if ($is_allow_access == 0) {
// $this->error("不允许进入抢购");
// }
$warehouse = Warehouse::where('id', $info['warehouse_id'])->find();
$is_allow_access = $this->limitBuyNum($user, $warehouse);
if ($is_allow_access > 0 ) {
$this->error("抢购次数被限制");
}
$this->getBuyTime($warehouse, $user);
$owner = User::where('id', $info['owner_id'])->find();
$info['warehouse'] = $warehouse;
@ -219,13 +220,13 @@ class Order extends Api
$info['image'] = cdnurl($info['image'], true);
//写进入记录
$start = date("Y-m-d H:i:s", strtotime($warehouse['start']));
$end = date("Y-m-d H:i:s", strtotime($warehouse['end']));
$code = $start."-".$end;
$info1 = Db::name('user_access_record')->where('warehouse_id', $info['warehouse_id'])->where('user_id', $user['id'])->where('code', $code)->count();
if (!$info1) {
Db::name('user_access_record')->insert(['user_id' => $user['id'],'warehouse_id' => $info['warehouse_id'],'code' => $code, "createtime"=>time(), 'is_advance' => $user['advance_access_minute'] > 0 ? 1 : 0]);
}
// $start = date("Y-m-d H:i:s", strtotime($warehouse['start']));
// $end = date("Y-m-d H:i:s", strtotime($warehouse['end']));
// $code = $start."-".$end;
// $info1 = Db::name('user_access_record')->where('warehouse_id', $info['warehouse_id'])->where('user_id', $user['id'])->where('code', $code)->count();
// if (!$info1) {
// Db::name('user_access_record')->insert(['user_id' => $user['id'],'warehouse_id' => $info['warehouse_id'],'code' => $code, "createtime"=>time(), 'is_advance' => $user['advance_access_minute'] > 0 ? 1 : 0]);
// }
$this->success("succ", $info);
}
/**
@ -234,26 +235,51 @@ class Order extends Api
* @return [type] [description]
*/
public function createOrder(){
$address_id = $this->request->post("address_id", 0);
$goods_id = $this->request->post("goods_id", 0);
$num = $this->request->post("num", 1);
$coupon_id = $this->request->post("coupon_id", 0);
$user_id = $this->auth->id;
$user = $this->auth->getUserinfo();
//var_dump($user_id);
$address = Address::where('id', $address_id)->where('user_id', $user_id)->find();
if (!$address) {
$this->error("收货地址不存在");
}
$goods = Goods::where('id', $goods_id)->where('status','normal')->find();
if (!$goods) {
$this->error("商品不存在");
$this->error("商品已被抢完");
}
$warehouse = Warehouse::where('id', $goods['warehouse_id'])->find();
$this->getBuyTime($warehouse, $user);
if (time() < strtotime($warehouse['start'])) {
$this->error("抢购时间还没到!");
}
if (time() > strtotime($warehouse['end'])) {
$this->error("抢购时间已结束!");
}
$is_allow_access = $this->limitBuyNum($user, $warehouse);
if ($is_allow_access > 0) {
$this->error("抢购次数被限制");
}
//使用redis锁,限制下单
$lock_key = $this->request->domain()."_createOrder_".$goods_id;
$res = Cache::store('redis')->setnx($lock_key, 1);
if (!$res) {
$this->error("您的手速太慢了,商品已被抢!");
}
Cache::store('redis')->expire($lock_key, self::CACHE_TIME);
$order_amount = $goods['price'] * $num;
$coupon_price = 0;
$pay_amount = $order_amount - $coupon_price;
$order_sn = "ZH".date("YmdHis").rand(1000,9999);
$start = date("Y-m-d H:i", strtotime($warehouse['start']));
$end = date("Y-m-d H:i", strtotime($warehouse['end']));
$code = $start."-".$end;
//创建订单
$orderData = [
"buyer_id" => $user_id,
@ -270,6 +296,8 @@ class Order extends Api
"city" => $address['city_name'],
"district" => $address['district_name'],
"address" => $address['address'],
"is_advance" => $start > time() ? 1 : 0,
"code" => $code,
];
$order = OrderModel::create($orderData);
if ($order === false) {
@ -289,18 +317,17 @@ class Order extends Api
if ($ret === false) {
$this->error("下单失败");
}
//使用优惠卷
$ret = UserCouponModel::where("id", $coupon_id)->update(['use_order_id' => $order->id, 'use_time' => time()]);
if ($ret === false) {
$this->error("下单失败");
}
//更新商品状态为下架
Goods::where('id', $goods_id)->update(['status' => 'hidden', "updatetime" => time()]);
//分佣给买家上级
$site = Config::get("site");
$commission = bcmul($order_amount, $site['primary_distribution'] * 0.01, 2);
$obj = new UserService();
$obj->userCommission(0, $this->auth->getUserinfo(), $order_sn, $commission);
//更新商品状态为下架
Goods::where('id', $goods_id)->update(['status' => 'hidden', "updatetime" => time()]);
Cache::store('redis')->rm($lock_key);
$this->success("succ");
}
/**
@ -317,7 +344,7 @@ class Order extends Api
if ($status != "") {
$where['status'] = ['in', explode(",", $status)];
} else {
$where['status'] = ['in', [0,1,3,4,5,6]];
$where['status'] = ['in', [0,1,3,4,5]];
}
$list = OrderModel::where('seller_id', $user_id)->where($where)->order('id', 'desc')->paginate($this->request->param('list_rows', $limit))->each(function ($item, $key){
$order_goods = Detail::where('order_id', $item['id'])->select();
@ -348,13 +375,18 @@ class Order extends Api
if ($status != "") {
$where['status'] = ['in', explode(",", $status)];
} else {
$where['status'] = ['in', [0,1,2,3,4,5,6,7]];
$where['status'] = ['in', [0,1,2,3,4,5,7]];
}
$list = OrderModel::where('buyer_id', $user_id)->where($where)->order('id', 'desc')->paginate($this->request->param('list_rows', $limit))->each(function ($item, $key){
$order_goods = Detail::where('order_id', $item['id'])->select();
if ($order_goods) {
foreach ($order_goods as $key => $value) {
$value['goods_image'] = cdnurl($value['goods_image'], true);
if ($item['status'] == 7) {
$value['goods_price'] = $value['commission_price'];
$item['pay_amount'] = $value['commission_price'];
$item['order_amount'] = $value['commission_price'];
}
}
}
@ -391,7 +423,9 @@ class Order extends Api
$info['entrusted_ratio'] = Config::get("site.entrusted_ratio");
$info['entrustment_ratio'] = Config::get("site.entrustment_ratio");
$seller = User::where('id', $info['seller_id'])->field(['id', 'username', 'nickname', 'mobile', 'avatar', 'score','sign_image','sign_status','alipay_image','wechat_image','buy_goods_num_per_day','advance_access_num','bank_realname','bank_mobile','bank_no','bank_address','reason','warehouse_id','advance_access_minute','deadline','pid','total_commission_amount','available_commission_amount'])->find();
$buyer = User::where('id', $info['buyer_id'])->field(['id', 'username', 'nickname', 'mobile', 'avatar', 'score','sign_image','sign_status','alipay_image','wechat_image','buy_goods_num_per_day','advance_access_num','bank_realname','bank_mobile','bank_no','bank_address','reason','warehouse_id','advance_access_minute','deadline','pid','total_commission_amount','available_commission_amount'])->find();
$info['seller'] = $seller;
$info['buyer'] = $buyer;
$info['pay_voucher'] = cdnurl($info['pay_voucher'], true);
$this->success("succ", $info);
}
@ -436,11 +470,24 @@ class Order extends Api
$this->error("订单不存在");
}
$upData = ['updatetime' => time()];
if ($pay_voucher) {
if ($status == 1) {
$upData['pay_voucher'] = $pay_voucher;
$upData['pay_time'] = time();
$upData['pay_method'] = $pay_method;
$upData['status'] = $status;
$detail = Detail::where("order_id", $id)->find();
//更新该商品的最后一个已上架的订单为已完成
$single = Db::name('order')->alias('order')
->join('order_detail detail', 'detail.order_id = order.id', 'left')
->field("order.id")
->where("goods_id", $detail['goods_id'])
->where("status", 7)
->order("order.id desc")
->find();
if ($single) {
OrderModel::where('id', $single['id'])->update(['status' => 6, "updatetime" =>time()]);
}
} else {
$upData['status'] = $status;
}
@ -470,9 +517,11 @@ class Order extends Api
$user_id = $user['id'];
$goods = Detail::where('order_id', $order_id)->find();
if (!$goods) {
$order = OrderModel::where("id", $order_id)->where('status', 2)->find();
if (!$goods || !$order) {
$this->error("订单不存在");
}
//商品是否上架
$goods_info = Goods::where('id', $goods['goods_id'])->where('status', 'hidden')->find();
if (!$goods_info) {
@ -507,8 +556,8 @@ class Order extends Api
$this->error("优惠卷已过期");
}
$coupon_price = $coupon['amount'] ?? 0;
OrderModel::where("id", $order_id)->update(['coupon_id' => $coupon_id, 'coupon_price' => $coupon_price]);
}
OrderModel::where("id", $order_id)->update(['coupon_id' => $coupon_id, 'coupon_price' => $coupon_price]);
$pay_sn = "NO".date("YmdHis").rand(1000,9999);
$fee = bcmul($order_amount, Config::get("site.entrustment_ratio") * 0.01, 2);
$pay_amount = $fee - $coupon_price;
@ -538,6 +587,7 @@ class Order extends Api
// var_dump($order_data);
// var_dump($params);
// exit();
//是否使用佣金
if ($use_commission) {
if ($pay_amount < $user['available_commission_amount']) {
$order_data['pay_source'] = 0;//佣金支付
@ -551,7 +601,7 @@ class Order extends Api
$profit = $profit + $coupon_price + $pay_amount;
Record::create(["user_id" => $user_id, "type" => 2, "item_id" => $order_id,"amount"=> $profit]);
//修改用户可用佣金
User::where('id', $user_id)->update(['available_commission_amount' => $user['available_commission_amount'] - $pay_amount,"profit_amount" =>$profit, "updatetime" => time()]);
User::where('id', $user_id)->update(['available_commission_amount' => $user['available_commission_amount'] - $pay_amount,"profit_amount" =>$user['profit_amount'] + $profit, "updatetime" => time()]);
//更新订单信息
OrderModel::where("id", $order_id)->update(['status' => 7]);
Detail::where("order_id", $order_id)->update(['commission_price' => $goods_price, "fee" => $fee, "dikou_price" => $pay_amount]);
@ -580,6 +630,17 @@ class Order extends Api
Detail::where("order_id", $order_id)->update(['commission_price' => $goods_price, "fee" => $fee, "dikou_price" => $user['available_commission_amount']]);
}
} else {
//写微信支付
$order_data['pay_source'] = 1;//微信支付
$order_data['out_trade_no'] = $pay_sn;//微信支付
$order_data['pay_amount'] = $pay_amount;
Db::name("pay_record")->insert($order_data);
//修改微信支付信息
$params['amount'] = $order_data['pay_amount'];
$params['orderid'] = $pay_sn;
Detail::where("order_id", $order_id)->update(['commission_price' => $goods_price, "fee" => $fee, "dikou_price" => 0]);
}
//$params['amount'] = 0.01;
try {

@ -182,7 +182,8 @@ class Auth
$user = User::create($params, true);
$this->_user = User::get($user->id);
//清除之前所有的Token
Token::clear($user->id);
//设置Token
$this->_token = Random::uuid();
Token::set($this->_token, $user->id, $this->keeptime);
@ -317,7 +318,8 @@ class Auth
$user->save();
$this->_user = $user;
//清除之前所有的Token
Token::clear($user->id);
$this->_token = Random::uuid();
Token::set($this->_token, $user->id, $this->keeptime);

@ -183,11 +183,23 @@ return [
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
// 'cache' => [
// // 驱动方式
// 'type' => 'File',
// // 缓存保存目录
// 'path' => CACHE_PATH,
// // 缓存前缀
// 'prefix' => '',
// // 缓存有效期 0表示永久缓存
// 'expire' => 0,
// ],
'cache' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => CACHE_PATH,
'type' => 'redis',
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存

@ -1,56 +1,56 @@
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\Env;
return [
// 数据库类型
'type' => Env::get('database.type', 'mysql'),
// 服务器地址
'hostname' => Env::get('database.hostname', '127.0.0.1'),
// 数据库名
'database' => Env::get('database.database', 'hzy'),
// 用户名
'username' => Env::get('database.username', 'hzy'),
// 密码
'password' => Env::get('database.password', 'hzy'),
// 端口
'hostport' => Env::get('database.hostport', ''),
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用 utf8mb4
'charset' => Env::get('database.charset', 'utf8mb4'),
// 数据库表前缀
'prefix' => Env::get('database.prefix', 'fa_'),
// 数据库调试模式
'debug' => Env::get('database.debug', false),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s
'datetime_format' => false,
// 是否需要进行SQL性能分析
'sql_explain' => false,
];
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\Env;
return [
// 数据库类型
'type' => Env::get('database.type', 'mysql'),
// 服务器地址
'hostname' => Env::get('database.hostname', '127.0.0.1'),
// 数据库名
'database' => Env::get('database.database', 'hzy'),
// 用户名
'username' => Env::get('database.username', 'hzy'),
// 密码
'password' => Env::get('database.password', 'hzy'),
// 端口
'hostport' => Env::get('database.hostport', ''),
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用 utf8mb4
'charset' => Env::get('database.charset', 'utf8mb4'),
// 数据库表前缀
'prefix' => Env::get('database.prefix', 'fa_'),
// 数据库调试模式
'debug' => Env::get('database.debug', false),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s
'datetime_format' => false,
// 是否需要进行SQL性能分析
'sql_explain' => false,
];

@ -54,5 +54,5 @@ return array (
'order_succ_image' => '/uploads/20231010/f7005536fecc1e70488e3d6c225bca1c.png',
'entrusted_ratio' => '5.00',
'primary_distribution' => '0.4',
'entrustment_ratio' => '3.5',
'entrustment_ratio' => '3.2',
);

@ -30,7 +30,8 @@
"ext-curl": "*",
"ext-pdo": "*",
"ext-bcmath": "*",
"txthinking/mailer": "^2.0"
"txthinking/mailer": "^2.0",
"nelsonkti/sensitive-word": "^1.0"
},
"config": {
"preferred-install": "dist"

65
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "403d56866617dde74ba4ed7c463a7399",
"content-hash": "adfded006374d2140e57a0c32874ba94",
"packages": [
{
"name": "easywechat-composer/easywechat-composer",
@ -987,6 +987,69 @@
},
"time": "2020-07-11T21:01:42+00:00"
},
{
"name": "nelsonkti/sensitive-word",
"version": "v1.0.0",
"source": {
"type": "git",
"url": "https://github.com/nelsonkti/sensitive-word.git",
"reference": "1998cd2c5f0d7091fe6933948224491c01769dbe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nelsonkti/sensitive-word/zipball/1998cd2c5f0d7091fe6933948224491c01769dbe",
"reference": "1998cd2c5f0d7091fe6933948224491c01769dbe",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"mockery/mockery": "dev-master",
"phpunit/phpunit": "~4.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"Nelsonkti\\SensitiveWord\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "nelsonkti",
"email": "nelsons.goole@gmail.com"
}
],
"description": "敏感词",
"keywords": [
"dfa",
"laravel",
"sensitive",
"word",
"敏感词"
],
"support": {
"email": "nelsons.goole@gmail.com",
"issues": "https://github.com/nelsonkti/sensitive-word/issues",
"source": "https://github.com/nelsonkti/sensitive-word/tree/master"
},
"time": "2020-07-04T07:03:11+00:00"
},
{
"name": "overtrue/pinyin",
"version": "3.0.6",

@ -185,4 +185,25 @@ class Redis extends Driver
return $this->handler->flushDB();
}
/**
* 设置一个key,如果key存在,不做任何操作.
* @param unknown $key
* @param unknown $value
*/
public function setnx($name, $value)
{
$key = $this->getCacheKey($name);
return $this->handler->setnx($key, $value);
}
/**
* 设置一个key,如果key存在,不做任何操作.
* @param unknown $key
* @param unknown $value
*/
public function expire($name, $expire)
{
$key = $this->getCacheKey($name);
return $this->handler->expire($key, $expire);
}
}

@ -27,12 +27,12 @@ class InstalledVersions
private static $installed = array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'aliases' =>
array (
),
'reference' => '8b86e4171769271cc35afa799854f287892f7216',
'reference' => '496176963450e4fa6501aa135efa478dc48b560b',
'name' => 'karsonzhang/fastadmin',
),
'versions' =>
@ -84,12 +84,12 @@ private static $installed = array (
),
'karsonzhang/fastadmin' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'aliases' =>
array (
),
'reference' => '8b86e4171769271cc35afa799854f287892f7216',
'reference' => '496176963450e4fa6501aa135efa478dc48b560b',
),
'karsonzhang/fastadmin-addons' =>
array (
@ -154,6 +154,15 @@ private static $installed = array (
),
'reference' => '501b52f6fc393a599b44ff348a42740e1eaac7c6',
),
'nelsonkti/sensitive-word' =>
array (
'pretty_version' => 'v1.0.0',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => '1998cd2c5f0d7091fe6933948224491c01769dbe',
),
'overtrue/pinyin' =>
array (
'pretty_version' => '3.0.6',

@ -15,8 +15,8 @@ return array(
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'9b552a3cc426e3287cc811caefa3cf53' => $vendorDir . '/topthink/think-helper/src/helper.php',
'488987c28e9b5e95a1ce6b6bcb94606c' => $vendorDir . '/karsonzhang/fastadmin-addons/src/common.php',
'1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
'cc56288302d9df745d97c934d6a6e5f0' => $vendorDir . '/topthink/think-queue/src/common.php',
'f0e7e63bbb278a92db02393536748c5f' => $vendorDir . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
'6747f579ad6817f318cc3a7e7a0abb93' => $vendorDir . '/overtrue/wechat/src/Kernel/Helpers.php',
'1cfd2761b63b0a29ed23657ea394cb2d' => $vendorDir . '/topthink/think-captcha/src/helper.php',
'cc56288302d9df745d97c934d6a6e5f0' => $vendorDir . '/topthink/think-queue/src/common.php',
);

@ -35,6 +35,7 @@ return array(
'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'),
'Overtrue\\Socialite\\' => array($vendorDir . '/overtrue/socialite/src'),
'Overtrue\\Pinyin\\' => array($vendorDir . '/overtrue/pinyin/src'),
'Nelsonkti\\SensitiveWord\\' => array($vendorDir . '/nelsonkti/sensitive-word/src'),
'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'),

@ -16,10 +16,10 @@ class ComposerStaticInita171a4a837511915e525c40585d599c6
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php',
'488987c28e9b5e95a1ce6b6bcb94606c' => __DIR__ . '/..' . '/karsonzhang/fastadmin-addons/src/common.php',
'1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php',
'cc56288302d9df745d97c934d6a6e5f0' => __DIR__ . '/..' . '/topthink/think-queue/src/common.php',
'f0e7e63bbb278a92db02393536748c5f' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
'6747f579ad6817f318cc3a7e7a0abb93' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Helpers.php',
'1cfd2761b63b0a29ed23657ea394cb2d' => __DIR__ . '/..' . '/topthink/think-captcha/src/helper.php',
'cc56288302d9df745d97c934d6a6e5f0' => __DIR__ . '/..' . '/topthink/think-queue/src/common.php',
);
public static $prefixLengthsPsr4 = array (
@ -70,6 +70,10 @@ class ComposerStaticInita171a4a837511915e525c40585d599c6
'Overtrue\\Socialite\\' => 19,
'Overtrue\\Pinyin\\' => 16,
),
'N' =>
array (
'Nelsonkti\\SensitiveWord\\' => 24,
),
'M' =>
array (
'MyCLabs\\Enum\\' => 13,
@ -213,6 +217,10 @@ class ComposerStaticInita171a4a837511915e525c40585d599c6
array (
0 => __DIR__ . '/..' . '/overtrue/pinyin/src',
),
'Nelsonkti\\SensitiveWord\\' =>
array (
0 => __DIR__ . '/..' . '/nelsonkti/sensitive-word/src',
),
'MyCLabs\\Enum\\' =>
array (
0 => __DIR__ . '/..' . '/myclabs/php-enum/src',

@ -963,6 +963,72 @@
},
"install-path": "../nelexa/zip"
},
{
"name": "nelsonkti/sensitive-word",
"version": "v1.0.0",
"version_normalized": "1.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/nelsonkti/sensitive-word.git",
"reference": "1998cd2c5f0d7091fe6933948224491c01769dbe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nelsonkti/sensitive-word/zipball/1998cd2c5f0d7091fe6933948224491c01769dbe",
"reference": "1998cd2c5f0d7091fe6933948224491c01769dbe",
"shasum": "",
"mirrors": [
{
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
"preferred": true
}
]
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"mockery/mockery": "dev-master",
"phpunit/phpunit": "~4.1"
},
"time": "2020-07-04T07:03:11+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Nelsonkti\\SensitiveWord\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "nelsonkti",
"email": "nelsons.goole@gmail.com"
}
],
"description": "敏感词",
"keywords": [
"dfa",
"laravel",
"sensitive",
"word",
"敏感词"
],
"support": {
"email": "nelsons.goole@gmail.com",
"issues": "https://github.com/nelsonkti/sensitive-word/issues",
"source": "https://github.com/nelsonkti/sensitive-word/tree/master"
},
"install-path": "../nelsonkti/sensitive-word"
},
{
"name": "overtrue/pinyin",
"version": "3.0.6",

@ -1,12 +1,12 @@
<?php return array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'aliases' =>
array (
),
'reference' => '8b86e4171769271cc35afa799854f287892f7216',
'reference' => '496176963450e4fa6501aa135efa478dc48b560b',
'name' => 'karsonzhang/fastadmin',
),
'versions' =>
@ -58,12 +58,12 @@
),
'karsonzhang/fastadmin' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'aliases' =>
array (
),
'reference' => '8b86e4171769271cc35afa799854f287892f7216',
'reference' => '496176963450e4fa6501aa135efa478dc48b560b',
),
'karsonzhang/fastadmin-addons' =>
array (
@ -128,6 +128,15 @@
),
'reference' => '501b52f6fc393a599b44ff348a42740e1eaac7c6',
),
'nelsonkti/sensitive-word' =>
array (
'pretty_version' => 'v1.0.0',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => '1998cd2c5f0d7091fe6933948224491c01769dbe',
),
'overtrue/pinyin' =>
array (
'pretty_version' => '3.0.6',

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2020 nelsons
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,47 @@
# sensitive-word
过滤敏感词,采用 DFA 算法
> 增加包含词的过滤(如:敏感、敏感词)
## Installation
```shell
$ composer require nelsonkti/sensitive-word
```
## Laravel
> 引导服务 config/app.php
```
'providers' => [
Nelsonkti\SensitiveWord\SensitiveWordServiceProvider::class,
],
'aliases' => [
'SensitiveWord' => Nelsonkti\SensitiveWord\SensitiveWord::class,
],
```
## Usage
基本使用:
```
use Nelsonkti\SensitiveWord\Facades\SensitiveWord;
$path = './word.txt'
$content = '敏感,敏感词需要过滤'; #检查内容
$filename = '/txt/sensitive-words.txt'; #敏感词文件路径
SensitiveWord::searchWord($content, $filename);
# 返回: array('敏感', '敏感词');
SensitiveWord::filterWord($content, $filename);
# 返回: **,**词需要过滤
```
## License
sensitive-word is licensed under [The MIT License (MIT)](https://github.com/nelsonkti/sensitive-word/blob/master/LICENSE).

@ -0,0 +1,36 @@
{
"name": "nelsonkti/sensitive-word",
"description": "敏感词",
"keywords": ["laravel", "敏感词", "sensitive", "word", "DFA"],
"type": "library",
"license": "MIT",
"support": {
"email": "nelsons.goole@gmail.com"
},
"authors": [
{
"name": "nelsonkti",
"email": "nelsons.goole@gmail.com"
}
],
"require": {
"php":">=5.6"
},
"require-dev": {
"phpunit/phpunit": "~4.1",
"mockery/mockery": "dev-master"
},
"autoload": {
"psr-4": {
"Nelsonkti\\SensitiveWord\\": "src/"
}
},
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"minimum-stability": "dev",
"prefer-stable": true
}

@ -0,0 +1,14 @@
<?php
namespace Nelsonkti\SensitiveWord\Facades;
use Illuminate\Support\Facades\Facade;
class SensitiveWord extends Facade
{
protected static function getFacadeAccessor()
{
return 'Nelsonkti\SensitiveWord\SensitiveWord';
}
}

@ -0,0 +1,250 @@
<?php
namespace Nelsonkti\SensitiveWord;
class SensitiveWord
{
/**
* 替换码
*
* @var string
*/
private $replaceCode = '*';
/**
* 敏感词库集合
*
* @var array
*/
protected $trieTreeMap = array();
/**
* 干扰因子集合
*
* @var array
*/
private $disturbList = array('*');
/**
* 文件路径
*
* @var string
*/
private $filename = null;
/**
* 敏感词树
*
* @var array
*/
private static $sensitiveWordTree = [];
/**
* 干扰因子集合
*
* @param array $disturbList
*/
public function interference($disturbList = array())
{
$this->disturbList = $disturbList ?? $this->disturbList;
}
/**
* 设置文件路径
*
* @param $filename
*/
protected function setFileName($filename)
{
$this->filename = $filename;
return $this;
}
/**
* 获取文件内容
*
* @param $filename "文件路径"
* @return \Generator
* @throws \Exception
*/
protected function getFileContent()
{
$handle = fopen($this->filename, 'r');
if (!$handle) {
throw new \Exception('open the file failed');
}
while (!feof($handle)) {
yield str_replace(['\'', ' ', PHP_EOL, ','], '', fgets($handle));
}
fclose($handle);
}
/**
* 生成敏感词库集合
*
* @param $filename "文件路径"
* @throws \Exception
*/
protected function generateWords()
{
// 获取文件内容
$text = $this->getFileContent();
foreach ($text as $key => $words) {
$len = mb_strlen($words);
$treeArr = &$this->trieTreeMap;
for ($i = 0; $i < $len; $i++) {
$word = mb_substr($words, $i, 1);
//敏感词树结尾记录状态为false;
if ($i + 1 == $len) {
$treeArr[$word]['end'] = false;
}
$treeArr = &$treeArr[$word] ?? false;
}
}
}
/**
* 获取敏感词库集合
*
* @param $filename "文件路径"
*/
private function getTrieTreeMap()
{
$trieTreeMap = &$this->trieTreeMap;
if (!$trieTreeMap) {
$this->generateWords($this->filename);
}
return $this;
}
/**
* 匹配对应敏感词
*
* @param $txt "内容"
* @param bool $hasReplace "是否替换原内容"
* @param array $replaceCodeList "替换符合"
* @return array
*/
private function getWord($txt, $hasReplace = false, &$replaceCodeList = array())
{
$wordsList = $wordsListArr = array();
$txtLength = mb_strlen($txt);
for ($i = 0; $i < $txtLength; $i++) {
$wordLength = $this->checkWord($txt, $i, $txtLength);
if ($wordLength > 0) {
$words = mb_substr($txt, $i, $wordLength);
if ($hasReplace) {
$wordsListArr[] = array(
'length' => strlen($words),
'world' => $words,
'replace_code' => str_repeat($this->replaceCode, mb_strlen($words))
);
} else {
$wordsList[] = $words;
}
$i += $wordLength - 1;
}
}
$hasReplace && $wordsList = $this->sortWord($wordsListArr, $replaceCodeList);
return $wordsList;
}
/**
* 对敏感词按长度进行倒叙排序
*
* @param $wordsList
* @param $replaceCodeList
* @param $txt
*/
private function sortWord($wordsListArr, &$replaceCodeList)
{
$array_column = array_column($wordsListArr, 'length');
array_multisort($array_column, SORT_DESC, $wordsListArr);
$replaceCodeList = array_column($wordsListArr, 'replace_code');
return array_column($wordsListArr, 'world');
}
/**
* 查找对应敏感词
*
* @param $txt "内容"
* @param bool $hasReplace "是否替换原内容"
* @param array $replaceCodeList "替换符合"
* @return array
*/
public function searchWord($txt, $filename)
{
return $this->setFileName($filename)->getTrieTreeMap()->getWord($txt);
}
/**
* 过滤敏感词
*
* @param $txt "内容"
* @param $filename "文件路径"
* @return string|string[]
*/
public function filterWord($txt, $filename)
{
$filename && $this->setFileName($filename)->interference();
$replaceCodeList = array();
$wordsList = $this->getTrieTreeMap()->getWord($txt, true, $replaceCodeList);
return $wordsList ? str_replace($wordsList, $replaceCodeList, $txt) : $txt;
}
/**
* 敏感词检测
*
* @param $txt "内容"
* @param $begin "开始位置"
* @param $length "长度"
* @return int
*/
private function checkWord($txt, $begin, $length)
{
$treeArr = &$this->trieTreeMap;
$wordLength = 0; //敏感字符个数
$wordLengthArray = [];
$flag = false;
for ($i = $begin; $i < $length; $i++) {
$txtWord = mb_substr($txt, $i, 1);
//如果搜索字不存在词库中直接停止循环。
if (!isset($treeArr[$txtWord])) {
break;
}
$wordLength++;
if (isset($treeArr[$txtWord]['end'])) {
$flag = true;
$wordLengthArray[] = $wordLength;
}
$treeArr = &$treeArr[$txtWord];
}
$flag ?: $wordLength = 0;
return $wordLength;
}
}

@ -0,0 +1,40 @@
<?php
namespace Nelsonkti\SensitiveWord;
use Illuminate\Support\ServiceProvider;
class SensitiveWordServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->singleton('Nelsonkti\SensitiveWord\Facades\SensitiveWordFacade', function ($app) {
return 'Nelsonkti\SensitiveWord\SensitiveWord';
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['Nelsonkti\SensitiveWord\SensitiveWord', 'SensitiveWord'];
}
}
Loading…
Cancel
Save