Эх сурвалжийг харах

Merge branch 'dev' into 20241213_fr_diyweb

AI 4 сар өмнө
parent
commit
fca81bf03e
59 өөрчлөгдсөн 4091 нэмэгдсэн , 1480 устгасан
  1. 4 2
      .gitignore
  2. 53 13
      app/Amqp/Consumer/MqConsumer.php
  3. 4 2
      app/Amqp/Producer/MqProducer.php
  4. 0 20
      app/Cache/Contracts/HashRedisInterface.php
  5. 0 20
      app/Cache/Contracts/StreamRedisInterface.php
  6. 57 0
      app/Command/Test.php
  7. 2 2
      app/Controller/AbstractController.php
  8. 95 12
      app/Controller/AdController.php
  9. 998 189
      app/Controller/ChatController.php
  10. 694 13
      app/Controller/CollectorController.php
  11. 1 0
      app/Controller/IndexController.php
  12. 69 9
      app/Controller/LinkController.php
  13. 33 7
      app/Controller/LoginController.php
  14. 1 10
      app/Controller/NewsController.php
  15. 38 43
      app/Controller/OrderController.php
  16. 543 7
      app/Controller/PublicController.php
  17. 66 0
      app/Controller/SseController.php
  18. 32 4
      app/Controller/UserController.php
  19. 5 9
      app/Controller/WebController.php
  20. 200 68
      app/Controller/WebSocketController.php
  21. 1 1
      app/Controller/WebsiteController.php
  22. 0 39
      app/Job/GatherExampleJob.php
  23. 15 10
      app/Job/ImportExampleJob.php
  24. 11 0
      app/JsonRpc/AdService.php
  25. 7 0
      app/JsonRpc/AdServiceInterface.php
  26. 76 222
      app/JsonRpc/ChatService.php
  27. 46 222
      app/JsonRpc/ChatServiceInterface.php
  28. 106 0
      app/JsonRpc/CollectorService.php
  29. 65 0
      app/JsonRpc/CollectorServiceInterface.php
  30. 9 0
      app/JsonRpc/LinkService.php
  31. 5 1
      app/JsonRpc/LinkServiceInterface.php
  32. 1 1
      app/JsonRpc/NewsService.php
  33. 4 3
      app/JsonRpc/NewsServiceInterface.php
  34. 1 2
      app/JsonRpc/OrderService.php
  35. 2 1
      app/JsonRpc/OrderServiceInterface.php
  36. 9 0
      app/JsonRpc/UserService.php
  37. 6 0
      app/JsonRpc/UserServiceInterface.php
  38. 8 6
      app/JsonRpc/WebsiteService.php
  39. 12 9
      app/JsonRpc/WebsiteServiceInterface.php
  40. 2 1
      app/Middleware/CorsMiddleware.php
  41. 34 18
      app/Service/RedisService.php
  42. 41 0
      app/Service/Server/StreamServer.php
  43. 63 0
      app/Tools/PublicData.php
  44. 34 0
      bin/hyperf.php
  45. 8 1
      composer.json
  46. 469 106
      composer.lock
  47. 7 0
      config/api/ad.php
  48. 49 9
      config/api/chat.php
  49. 27 13
      config/api/collector.php
  50. 6 0
      config/api/link.php
  51. 2 2
      config/api/login.php
  52. 11 9
      config/api/order.php
  53. 12 3
      config/api/user.php
  54. 12 7
      config/autoload/amqp.php
  55. 32 4
      config/autoload/redis.php
  56. 2 1
      config/autoload/server.php
  57. 1 1
      config/autoload/services.php
  58. 0 179
      storage/languages/en/validation.php
  59. 0 179
      storage/languages/zh_CN/validation.php

+ 4 - 2
.gitignore

@@ -3,14 +3,14 @@ bin-debug/
 bin-release/
 [Oo]bj/
 [Bb]in/
-
+.env/
 # Other files and folders
 .settings/
 public
 vendor
 runtime
 runtime/*
-# Executables
+
 *.swf
 *.air
 *.ipa
@@ -21,3 +21,5 @@ runtime/*
 # should NOT be excluded as they contain compiler settings and other important
 # information for Eclipse / Flash Builder.
 runtime/container/scan.cache
+.env
+*.env

+ 53 - 13
app/Amqp/Consumer/MqConsumer.php

@@ -1,33 +1,73 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 
 namespace App\Amqp\Consumer;
 
-use Hyperf\Amqp\Result;
+use App\JsonRpc\ChatServiceInterface;
 use Hyperf\Amqp\Annotation\Consumer;
 use Hyperf\Amqp\Message\ConsumerMessage;
+use Hyperf\Amqp\Result;
 use Hyperf\Di\Annotation\Inject;
 use PhpAmqpLib\Message\AMQPMessage;
-use App\JsonRpc\ChatServiceInterface;
-#[Consumer(exchange: 'hyperf', routingKey: 'hyperf', queue: 'hyperf', name: "MqConsumer", nums: 1)]
+use Psr\Log\LoggerInterface;
+use Hyperf\Redis\RedisFactory;
+
+#[Consumer(exchange: 'chatdev', routingKey: 'chatdev', queue: 'chatdev', name: "chatdev", nums: 1)]
 class MqConsumer extends ConsumerMessage
 {
     /**
      * @var ChatServiceInterface
      */
     #[Inject]
-    private  $chatServiceClient;
+    private $chatServiceClient;
+
+    protected $logger;
+    #[Inject]
+    protected RedisFactory $redisFactory;
+
+    public function __construct(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
     public function consumeMessage($data, AMQPMessage $message): Result
     {
-        //数据存储
-        $result = $this->chatServiceClient->addTalkRecords($data);
-        var_dump("消费成功:",$result);
-        return Result::ACK;
+        $redis = $this->redisFactory->get('default');
+        $lockKey = 'mq_consumer_lock';
+        $lockValue = uniqid();
+
+        // 获取锁
+        $lockAcquired = $redis->setnx($lockKey, $lockValue);
+        if (!$lockAcquired) {
+            $this->logger->info('Another consumer instance is already running.');
+            $this->logger->info($redis->get($lockKey));
+            // return Result::ACK;
+            return Result::REQUEUE;
+        }
+
+        // 设置锁过期时间,防止死锁
+        $redis->expire($lockKey, 60);
+        try {
+            // 数据存储
+            $this->logger->info('消费数据', ['data' => $data]);
+            var_dump($data, '=================消费数据==============');
+            // 调用数据处理服务
+            $result = $this->chatServiceClient->addChatRecords($data);
+            // 记录处理结果
+            $this->logger->info("消费成功:", ['result' => $result]);
+            return Result::ACK;
+        } catch (\Exception $e) {
+            // 记录错误
+            $this->logger->error("消费失败:", ['error' => $e->getMessage()]);
+            // 返回拒绝,重新入队
+            // return Result::REQUEUE;
+        }
+
     }
 
-//    public function isEnable(): bool
-//    {
-//        return false;
-//    }
+    public function isEnable(): bool
+    {
+        return true;
+    }
 }

+ 4 - 2
app/Amqp/Producer/MqProducer.php

@@ -1,18 +1,20 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 
 namespace App\Amqp\Producer;
 
 use Hyperf\Amqp\Annotation\Producer;
 use Hyperf\Amqp\Message\ProducerMessage;
 
-#[Producer(exchange: 'hyperf', routingKey: 'hyperf')]
+#[Producer(exchange: 'chatdev', routingKey: 'chatdev')]
 class MqProducer extends ProducerMessage
 {
     public function __construct($data)
     {
 //        $this->poolName = 'default';
+        var_dump($data, '生产者数据');
+
         $this->payload = $data;
     }
 }

+ 0 - 20
app/Cache/Contracts/HashRedisInterface.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace App\Cache\Contracts;
-
-interface SetRedisInterface
-{
-    public function count();
-
-    public function add(string ...$member);
-
-    public function rem(string ...$member);
-
-    public function isMember(string $member);
-
-    public function randMember($count = 1);
-
-    public function all();
-
-    public function delete();
-}

+ 0 - 20
app/Cache/Contracts/StreamRedisInterface.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace App\Cache\Contracts;
-
-interface SetRedisInterface
-{
-    public function count();
-
-    public function add(string ...$member);
-
-    public function rem(string ...$member);
-
-    public function isMember(string $member);
-
-    public function randMember($count = 1);
-
-    public function all();
-
-    public function delete();
-}

+ 57 - 0
app/Command/Test.php

@@ -0,0 +1,57 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Command;
+
+use Hyperf\Command\Command as HyperfCommand;
+use Hyperf\Command\Annotation\Command;
+use Psr\Container\ContainerInterface;
+
+use App\Amqp\Producer\MqProducer;
+use App\JsonRpc\ChatServiceInterface;
+use App\JsonRpc\UserServiceInterface;
+use App\Service\Message\ReceiveHandleService;
+use App\Service\RedisService;
+use Hyperf\Amqp\Producer;
+use Hyperf\Context\ApplicationContext as ContextApplicationContext;
+use Hyperf\Contract\OnCloseInterface;
+use Hyperf\Contract\OnMessageInterface;
+use Hyperf\Contract\OnOpenInterface;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\Engine\WebSocket\Response;
+use Phper666\JWTAuth\JWT;
+
+
+#[Command]
+class Test extends HyperfCommand
+{
+    public function __construct(protected ContainerInterface $container)
+    {
+        parent::__construct('demo:command');
+    }
+
+    public function configure()
+    {
+        parent::configure();
+        $this->setDescription('Hyperf Demo Command');
+    }
+
+    public function handle()
+    {
+        //记录执行时间
+        $start = microtime(true);
+        for ($i = 0; $i < 200000; $i++) {
+            $chatdata['receiver_id'] = 1;
+            $chatdata['user_id'] = $i;
+            $chatdata['group_receiver_id'] = 0;
+            $chatdata['is_read'] = 1;
+            $chatdata['action'] = 'said';
+            $message = new MqProducer($chatdata);
+            $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+            $re = $producer->produce($message);
+        }
+        $this->info(microtime(true) - $start);
+        $this->line('Hello Hyperf!', 'info');
+    }
+}

+ 2 - 2
app/Controller/AbstractController.php

@@ -17,7 +17,9 @@ use Hyperf\HttpServer\Contract\RequestInterface;
 use Hyperf\HttpServer\Contract\ResponseInterface;
 
 
+use Hyperf\Logger\LoggerFactory;
 use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
 
 abstract class AbstractController
 {
@@ -29,7 +31,6 @@ abstract class AbstractController
 
     #[Inject]
     protected ResponseInterface $response;
-
     
     /**
      * @var LoggerInterface
@@ -41,5 +42,4 @@ abstract class AbstractController
 //        $this->logger->info("项目启动访问一次");
 //    }
 
-
 }

+ 95 - 12
app/Controller/AdController.php

@@ -29,6 +29,10 @@ class AdController extends AbstractController
     #[Inject]
     private  $adServiceClient;
 
+    /**
+     * 创建广告-todo
+     * @return array
+     */
     public function createAd()
     {
         $requireData = $this->request->all();
@@ -80,11 +84,30 @@ class AdController extends AbstractController
         return Result::success($result['data']);
     }
 
+    /**
+     * 获取广告列表
+     * @return array
+     */
     public function getAdList()
     {
-
         $requireData = $this->request->all();
-
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pid'=> 'required',
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'pid.required' => '广告位id不能为空',
+                'page.required' => '页码数不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
         $nowTime = date("Y-m-d H:i:s");
         $result = $this->adServiceClient->getAdList($requireData);
         if($result['data']){
@@ -93,7 +116,7 @@ class AdController extends AbstractController
             foreach ($result['data']['rows'] as $k=>$v) {
                 $result['data']['rows'][$k]['type_name'] = $typeList[$v['typeid']];
                 $result['data']['rows'][$k]['status_name'] = $statusName[$v['status']];
-                $result['data']['rows'][$k]['day'] = PublicData::residueDay(date("Y-m-d H:i:s"),$v['totime']);
+                $result['data']['rows'][$k]['day'] = PublicData::residueDay(date("Y-m-d H:i:s"),$v['totime'])>0?PublicData::residueDay(date("Y-m-d H:i:s"),$v['totime']):0;
                 if($nowTime<$v['fromtime']){
                     $result['data']['rows'][$k]['runing_name'] = '未开始';
                 }else if($nowTime>$v['totime']){
@@ -159,7 +182,21 @@ class AdController extends AbstractController
     {
 
         $requireData = $this->request->all();
-        var_dump($requireData);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '页码数不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
         $result = $this->adServiceClient->getAdPlaceList($requireData);
         if($result['data']){
             $typeList = ['1'=>'文字','2'=>'图文'];
@@ -172,20 +209,32 @@ class AdController extends AbstractController
         return $result?Result::success($result['data']):Result::error($result['message']);
     }
 
+    /**
+     * 创建广告位
+     * @return array
+     */
     public function createAdPlace()
     {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'name' => 'required',
-                'website_id' => 'required',
-                'price' => 'required',
+                'name' => 'required', //广告位名称
+                'website_id' => 'required',//关联的网站id
+                'price' => 'required',//价格
+                'thumb'=>'required', //广告示意图
+                'typeid'=>'required', //广告类型
+                'ad_size_id'=>'required', //广告位大小
+                'status'=>'required', //状态
             ],
             [
                 'name.required' => '名称不能为空',
                 'website_id.required' => '站点不能为空',
                 'price.required' => '价格不能为空',
+                'thumb.required'=>'广告示意图必传', //广告示意图
+                'typeid.required'=>'广告类型必选', //广告类型
+                'ad_size_id.required'=>'广告大小必选', //广告位大小
+                'status.required'=>'广告状态必选', //状态
             ]
         );
         if ($validator->fails()){
@@ -203,15 +252,23 @@ class AdController extends AbstractController
             $requireData,
             [
                 'id' => 'required',
-                'name' => 'required',
-                'website_id' => 'required',
-                'price' => 'required',
+                'name' => 'required', //广告位名称
+                'website_id' => 'required',//关联的网站id
+                'price' => 'required',//价格
+                'thumb'=>'required', //广告示意图
+                'typeid'=>'required', //广告类型
+                'ad_size_id'=>'required', //广告位大小
+                'status'=>'required', //状态
             ],
             [
                 'id.required' => 'id不能为空',
                 'name.required' => '名称不能为空',
                 'website_id.required' => '站点不能为空',
                 'price.required' => '价格不能为空',
+                'thumb.required'=>'广告示意图必传', //广告示意图
+                'typeid.required'=>'广告类型必选', //广告类型
+                'ad_size_id.required'=>'广告大小必选', //广告位大小
+                'status.required'=>'广告状态必选', //状态
             ]
         );
         if ($validator->fails()){
@@ -222,6 +279,10 @@ class AdController extends AbstractController
         return $result?Result::success($result['data']):Result::error($result['message']);
     }
 
+    /**
+     * 删除广告位
+     * @return array
+     */
     public function delAdPlace()
     {
         $requireData = $this->request->all();
@@ -238,9 +299,31 @@ class AdController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-
         $result = $this->adServiceClient->delAdPlace($requireData);
-        var_dump($result);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取广告位详情
+     * @return array
+     */
+    public function getAdPlaceInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->getAdPlaceInfo(intval($requireData['id']));
         return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 }

+ 998 - 189
app/Controller/ChatController.php

@@ -1,21 +1,21 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 namespace App\Controller;
 
 use App\JsonRpc\ChatServiceInterface;
+use App\JsonRpc\UserServiceInterface;
+use App\Service\RedisService;
 use App\Tools\PublicData;
-use Hyperf\Di\Annotation\Inject;
-use Hyperf\HttpServer\Annotation\AutoController;
 use App\Tools\Result;
-use Hyperf\Validation\Contract\ValidatorFactoryInterface;
-use App\Amqp\Producer\DemoProducer;
-use Hyperf\Context\ApplicationContext;
-use App\Amqp\Producer;
-use Hyperf\Snowflake\IdGeneratorInterface;
-use PHPStan\Type\Accessory\OversizedArrayType;
 use function Hyperf\Support\env;
 use Hyperf\Context\Context;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+// use App\Controller\WebSocketController as WebSocket;
+use Hyperf\Context\ApplicationContext as ApplicationContext;
+use App\Controller\WebSocketController;
+use Swoole\WebSocket\Frame;
 
 /**
  *
@@ -31,13 +31,17 @@ class ChatController extends AbstractController
      * @var ChatServiceInterface
      */
     #[Inject]
-    private  $chatServiceClient;
+    private $chatServiceClient;
+    #[Inject]
+    private UserServiceInterface $userServiceClient;
+    // #[Inject]
+    // private WebSocket $webSocketController;
 
     /**
      * 申请添加好友
      * @return array
      */
-    public function addContactApply()
+    public function addFriend()
     {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
@@ -49,65 +53,213 @@ class ChatController extends AbstractController
                 'friend_id.required' => '好友ID不能为空',
             ]
         );
-        if ($validator->fails()){
+        if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
-        var_dump("用户id:",$requireData);
-        $result = $this->chatServiceClient->addContactApply($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        //判断UserId是否是friend_id
+        $userId = $requireData['user_id'];
+        $friendId = $requireData['friend_id'];
+        if ($userId == $friendId) {
+            return Result::error('不能添加自己为好友');
+        }
+        //判断friend_id是否可用
+        $friendInfo = $this->userServiceClient->getUserInfo((int) $friendId);
+        if ($friendInfo['code'] == 0) {
+            return Result::error('好友ID不存在');
+        }
+        $result = $this->chatServiceClient->addFriend($requireData);
+       
+        return $result ? Result::success($result['message']) : Result::error($result['message']);
     }
 
+   
     /**
-     * 获取我的好友申请列表
+     * 话题分类
      * @return array
      */
-    public function getContactApplyList()
+    public function topicType()
     {
-        $requireData = [];
-        $requireData['user_id'] =Context::get("UserId");
-        $result = $this->chatServiceClient->getContactApplyList($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        $type = array(
+            '1' => '课题',
+            '2' => '维权',
+            '3' => '讨论',
+        );
+        $result = array();
+        foreach ($type as $k => $v) {
+            $result[] = ['value' => $k, 'label' => $v];
+        }
+        return Result::success($result);
+    }
+    /**
+     * 获取话题列表
+     * @return array
+     */
+    public function topicStatus()
+    {
+        $status = array(
+            '1' => '未审核',
+            '2' => '已通过',
+            '3' => '已拒绝',
+        );
+        $result = array();
+        foreach ($status as $k => $v) {
+            $result[] = ['value' => $k, 'label' => $v];
+        }
+        return Result::success($result);
     }
 
     /**
-     * 好有审核通过或拒绝
-     * @return void
+     * 搜索好友列表
+     * @return array
+     */
+    public function searchFriend()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'keyword' => 'required',
+            ],
+            [
+                'keyword.required' => '搜索关键字不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        // return Result::success($requireData);
+        $result = $this->chatServiceClient->searchFriend($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取好友详情
+     * @return array
      */
-    public function updateContactApply()
+    public function getFriendInfo()
     {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
                 'friend_id' => 'required',
-                'type'=>'required'
             ],
             [
                 'friend_id.required' => '好友ID不能为空',
-                'type.required' => '操作状态不能为空',
-
             ]
         );
-        if ($validator->fails()){
+        if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-        $requireData['user_id'] =Context::get("UserId");
-        //type==1 同意 type==2 拒绝
-        $result = $this->chatServiceClient->updateContactApply($requireData);
-        if($requireData['type']==1){
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getFriendInfo($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+
+    }
+
+    /**
+     * 获取我的好友列表
+     * @return array
+     */
+    public function getFriendsList()
+    {
+        $requireData = [];
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['status'] = 2;
+        $result = $this->chatServiceClient->getFriendsList($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取好友申请列表
+     * @return array
+     */
+    public function getFriendsApplyList()
+    {
+        $requireData = [];
+        $requireData['friend_id'] = Context::get("UserId");
+        $requireData['status'] = 1;
+        $result = $this->chatServiceClient->getFriendsApplyList($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
 
+    /**
+     * 好友申请审核通过或拒绝
+     * @return array
+     */
+    public function applyFriend()
+    {
+        $requireData = $this->request->all();
+        $frindid =$requireData['apply_id'];
+        unset($requireData['apply_id']);
+        // 定义验证规则
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+                'status' => 'required|in:2,4',
+            ],
+            [
+                'friend_id.required' => 'ID不能为空',
+                'status.required' => '状态不能为空',
+                'status.in' => '状态错误',
+            ]
+        );
+        // 验证请求数据
+        if ($validator->fails()) {
+            var_dump($validator->errors()->all());
+            return Result::error(implode(', ', $validator->errors()->all()), 0);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        // var_dump($requireData,'1111test');
+        $result = $this->chatServiceClient->applyFriend($requireData);
+        if ($result && $result['code'] != 0) {
+            $realResult = $result;
+            $redisClient = new RedisService();
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $requireData['user_id'], 'status' => 2]);
+            // var_dump($myFriends, '--------------------1');
+            $redisClient->setUserFriends((string)$requireData['user_id'], $myFriends['data']);
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $frindid, 'status' => 2]);
+            // var_dump($myFriends, '-------------3-------1');
+            $redisClient->setUserFriends((string)$frindid, $myFriends['data']);
+            $result =  $redisClient->getUserFriends((string)$requireData['user_id']);
+            // var_dump($result,'redis-结果');
+            $result =  $redisClient->getUserFriends((string)$frindid);
+            // var_dump($result,'redis-结果');
+            //redis 添加好友
+            $result = $realResult;
+        }
+        return $result && $result['code'] != 0 ? Result::success($result['data']) :     Result::error($result['message']);
+    }
+     /**
+     * 批量设置redis好友
+     * @return array
+     */
+    public function setFriends()
+    {
+        //获取所有用户
+        $userList = $this->userServiceClient->getUserList(['page' => 1, 'pageSize' => 1000 ]);
+        //获取id,循环写入redis
+        $userList = $userList['data']['rows'];
+        var_dump($userList,'111111111111');
+        
+        $redisClient = new RedisService();
+        foreach ($userList as $key => $value) {
+            var_dump($value,'----------------------');
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $value['id'], 'status' => 2]);
+            $redisClient->setUserFriends((string)$value['id'], $myFriends['data']);
         }
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return Result::success();
     }
 
     /**
      * 删除好友
      * @return array
      */
-    public function delContact()
+    public function delFriend()
     {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
@@ -119,178 +271,835 @@ class ChatController extends AbstractController
                 'friend_id.required' => '好友ID不能为空',
             ]
         );
-        if ($validator->fails()){
+        if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-        $requireData['user_id'] =Context::get("UserId");
-        $result = $this->chatServiceClient->delContact($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delFriend($requireData);
+        //redis 删除好友
+        if ($result && $result['code'] != 0) {
+            $redisClient = new RedisService();
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $requireData['user_id'], 'status' => 2]);
+            $redisClient->setUserFriends((string)$requireData['user_id'], $myFriends['data']);
+
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $requireData['friend_id'], 'status' => 2]);
+            $redisClient->setUserFriends((string)$requireData['friend_id'], $myFriends['data']);
+        }
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
 
     /**
-     * 获取好友列表
+     * 是否好友
      * @return array
      */
-    public function getContactList()
+    public function isFriend()
     {
         $requireData = $this->request->all();
-        $requireData['user_id'] =Context::get("UserId");
-        $requireData['keyWord'] = $this->request->input('keyWord','');
-        $result = $this->chatServiceClient->getContactList($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'friend_id' => 'required',
+            ],
+            [
+                'friend_id.required' => '好友ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->isFriend($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
 
     /**
-     * 获取会话列表
-     * @return array
-     */
-      public function getTalkSessionList()
-      {
-          $requireData = $this->request->all();
-          $requireData['user_id'] =Context::get("UserId");
-          var_dump("会话列表:",$requireData);
-          $result = $this->chatServiceClient->getTalkSessionList($requireData);
-          var_dump($result);
-          if($result['data']['row']){
-              foreach ($result['data']['row'] as $k=>$v){
-                  $result['data']['row'][$k]['messages'] = [];
-              }
-          }
-          return $result?Result::success($result['data']):Result::error($result['message']);
-      }
-
+     * 更新好友备注
+     * @return array
+     */
+    public function updateFriend()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'friend_id' => 'required',
+                'remark' => 'required',
+            ],
+            [
+                'friend_id.required' => '好友ID不能为空',
+                'remark.required' => '备注不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->updateFriend($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
-     * 创建用户群
-     * @return array
-     */
-      public function addTalkGroup()
-      {
-          $requireData = $this->request->all();
-          $validator = $this->validationFactory->make(
-              $requireData,
-              [
-                  'group_name' => 'required',
-                  'user_id_arr' => 'required'
-              ],
-              [
-                  'group_name.required' => '群名称不能为空',
-                  'user_id_arr.required' => '好友ID不能为空',
-              ]
-          );
-          if ($validator->fails()){
-              $errorMessage = $validator->errors()->first();
-              return Result::error($errorMessage);
-          }
-          $requireData['user_id'] = Context::get("UserId");
-          $requireData['user_id_arr'] = $requireData['user_id_arr'];
-          var_dump($requireData);
-          $result = $this->chatServiceClient->addTalkGroup($requireData);
-          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
-
-      }
-
+     * 会话
+     * @return array
+     */
+    public function getConversation()
+    {
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getConversation($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
-     * 会话详情
-     * @return void
-     */
-      public function getTalkRecordsList()
-      {
-          $requireData = $this->request->all();
-          $validator = $this->validationFactory->make(
-              $requireData,
-              [
-                  'session_id' => 'required',
-                  'talk_type' => 'required'
-              ],
-              [
-                  'session_id.required' => '会话ID不能为空',
-                  'talk_type.required' => '会话类型不能为空',
-              ]
-          );
-          if ($validator->fails()){
-              $errorMessage = $validator->errors()->first();
-              return Result::error($errorMessage);
-          }
-          $requireData['page'] = $requireData['page']??1;
-          $requireData['pageSize'] = $requireData['pageSize']??30;
-          $result = $this->chatServiceClient->getTalkRecordsList($requireData);
-          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
-      }
-
+     * 获取聊天记录
+     * @return array
+     */
+    public function getChatRecords()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'friend_id' => 'required',
+            ],
+            [
+                'friend_id.required' => '好友ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getChatRecords($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
-     * 添加聊天
-     * @return void
-     */
-      public function addTalkRecords()
-      {
-          $requireData = $this->request->all();
-          $validator = $this->validationFactory->make(
-              $requireData,
-              [
-                  'type' => 'required',
-                  'content' => 'required',
-                  'receiver'=>'required',
-
-              ],
-              [
-                  'type.required' => '消息类型不能为空',
-                  'content.required' => '内容不能为空',
-                  'receiver.required' => '会话信息不能为空',
-              ]
-          );
-          if ($validator->fails()){
-              $errorMessage = $validator->errors()->first();
-              return Result::error($errorMessage);
-          }
-          $requireData['user_id'] =Context::get("UserId");
-          $result = $this->chatServiceClient->addTalkRecords($requireData);
-          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
-      }
-
+     * 获取群聊天
+     * @return array
+     */
+    public function getGroupChatRecords()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getGroupChatRecords($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
-     * 获取openId
-     * @return array|void
-     */
-      public function wechatOpenInfo()
-      {
-          $requireData = $this->request->all();
-          $validator = $this->validationFactory->make(
-              $requireData,
-              [
-                  'code' => 'required',
-              ],
-              [
-                  'code.required' => 'code不能为空',
-              ]
-          );
-          if ($validator->fails()){
-              $errorMessage = $validator->errors()->first();
-              return Result::error($errorMessage);
-          }
-          $url = env("WECHAT")."sns/jscode2session?appid=".env("APPID")."&secret=".env("APP_SECRET")."&js_code=".$requireData['code']."&grant_type=authorization_code";
-          $result =  PublicData::http_get($url);
-          $resultData = json_decode($result,true);
-          if (isset($resultData['errcode'])){
-             return  Result::error($resultData['errmsg']);
-          }
-          return Result::success($resultData);
-      }
-
+     * 获取群成员列表
+     * @return array
+     */
+    public function getGroupMembers()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getGroupMembers($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
-     * 获取 access_token
+     * 获取群信息
      * @return array
      */
-      public function getAccessToken()
-      {
-          $url = env("WECHAT")."cgi-bin/token?appid=".env("APPID")."&secret=".env("APP_SECRET")."&grant_type=client_credential";
-          $result =  PublicData::http_get($url);
-          $resultData = json_decode($result,true);
-          var_dump($url,$resultData);
-          if (isset($resultData['errcode'])){
-              return  Result::error($resultData['errmsg']);
-          }
-          return Result::success($resultData);
-      }
-
-}
+    public function getGroupInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getGroupInfo($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取群列表
+     * @return array
+     */
+    public function getGroupList()
+    {
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getGroupList($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 新建群
+     * @return array
+     */
+    public function addGroup()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_name' => 'required',
+                'group_desc' => 'required',
+                // 'group_avatar' => 'required',
+                // 'group_member' => 'required',
+            ]
+            ,
+            [
+                'group_name.required' => '群名称不能为空',
+                'group_desc.required' => '群描述不能为空',
+                // 'group_avatar.required' => '群头像不能为空',
+                // 'group_member.required' => '群成员不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['group_member'] = explode(',', ($requireData['group_member']));
+        $result = $this->chatServiceClient->addGroup($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 退出群
+     * @return array
+     */
+    public function quitGroup()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->quitGroup($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除群
+     * @return array
+     */
+    public function delGroup()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delGroup($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除群成员
+     * @return array
+     */
+    public function delGroupMembers()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+                'group_member' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+                'group_member.required' => '群成员不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['group_member'] = explode(',', ($requireData['group_member']));
+        $result = $this->chatServiceClient->delGroupMembers($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 添加群成员
+     * @return array
+     */
+    public function updateGroupMembers()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+                'group_member' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+                'group_member.required' => '群成员不能为空',
+            ]
+        );
+
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['group_member'] = explode(',', ($requireData['group_member']));
+        $result = $this->chatServiceClient->updateGroupMembers($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 删除群成员
+     * @return array
+     */
+    public function deleteGroupMember()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+                'group_member' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+                'group_member.required' => '群成员不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['group_member'] = explode(',', ($requireData['group_member']));
+        $result = $this->chatServiceClient->deleteGroupMember($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 加入群
+     * @return array
+     */
+    public function joinGroup()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->joinGroup($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新群信息
+     * @return array
+     */
+    public function updateGroup()
+    {
+        $requireData = $this->request->all();
+        // 只接受指定的四个字段
+        $validatedData = $this->validationFactory->make(
+            $requireData,
+            [
+                'group_id' => 'required|string',
+                'group_name' => 'nullable|string',
+                'profile' => 'nullable|string',
+                'avatar' => 'nullable|string',
+            ],
+            [
+                'group_id.required' => '群ID不能为空',
+                // 'group_name.required' => '群名称不能为空',
+            ]
+        );
+
+        if ($validatedData->fails()) {
+            $errorMessage = $validatedData->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->updateGroup($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取商圈
+     * @return array
+     */
+    public function getTopicsList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required|integer',
+                'page_size' => 'required|integer',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'page_size.required' => '每页数量不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getTopicsList($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 新增话题商圈
+     * @return array
+     */
+    public function addTopic()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'title' => 'required|string',
+                'type' => 'required|int',
+                'content' => 'required|string',
+            ],
+            [
+                'title.required' => '商圈名称不能为空',
+                'type.required' => '商圈类型不能为空',
+                'content.required' => '商圈内容不能为空',
+                'type.int' => '商圈类型只能是数字',
+                'content.string' => '商圈内容只能是字符串',
+                'title.string' => '商圈名称只能是字符串',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->addTopic($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 更新话题商圈
+     * @return array
+     */
+    public function updateTopic()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|string',
+                // 'status' => 'required|integer',
+            ],
+            [
+                'topic_id.required' => '商圈ID不能为空',
+                // 'status.required' => '商圈状态不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->updateTopic($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除话题商圈
+     * @return array
+     */
+    public function delTopic()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|string',
+            ],
+            [
+                'id.required' => '商圈ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delTopic($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取商圈详情
+     * @return array
+     */
+    public function getTopicInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|string',
+            ],
+            [
+                'id.required' => '商圈ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getTopicInfo($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取商圈回复
+     * @return array
+     */
+    public function addReply()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|string',
+                'content' => 'required|string',
+            ],
+            [
+                'id.required' => '商圈ID不能为空',
+                'content.required' => '回复内容不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->addReply($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取商圈评论
+     * @return array
+     */
+    public function getTopicReply()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|string',
+                'page' => 'required|integer',
+                'page_size' => 'required|integer',
+            ],
+            [
+                'id.required' => '商圈ID不能为空',
+                'page.required' => '页码不能为空',
+                'page_size.required' => '每页数量不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getTopicReply($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    
+    
+    /**
+     * 获取 access_token
+     * @return array
+     */
+    public function getAccessToken()
+    {
+        $url = env("WECHAT") . "cgi-bin/token?appid=" . env("APPID") . "&secret=" . env("APP_SECRET") . "&grant_type=client_credential";
+        $result = PublicData::http_get($url);
+        $resultData = json_decode($result, true);
+        var_dump($url, $resultData);
+        if (isset($resultData['errcode'])) {
+            return Result::error($resultData['errmsg']);
+        }
+        return Result::success($resultData);
+    }
+    /**
+     * 删除一条聊天记录
+     * @return array
+     */
+    public function delRecords()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => '聊天记录ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delRecords($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除所有聊天记录
+     * @return array
+     */
+    public function clearRecords()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'friend_id' => 'required',
+            ],
+            [
+                'friend_id.required' => '聊天记录ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage =$validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->clearRecords($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除群聊记录
+     * @return array
+     */
+    public function clearGroupRecords()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => '聊天记录ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage= $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->clearGroupRecords($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 撤回一条聊天记录
+     * @return array
+     */
+    public function recallRecord()
+    { 
+
+        $webSocketController = ApplicationContext::getContainer()->get(WebSocketController::class);
+        $frame = new Frame();
+        $frame->fd = 1; // 替换为实际的客户端 fd
+        $frame->data = json_encode([
+            'talk_type' => 1,
+            'receiver_id' => 2, // 接收者 ID
+            'content' => 'Hello, this is a test message!'
+        ]);
+    
+        $webSocketController->send(1, 'Hello, World!');
+        return Result::success('');
+    
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'content' => 'required',
+            ],
+            [
+                'content.required' => '聊天记录不能为空',
+            ]
+        );
+        $requireData['user_id'] = Context::get("UserId");
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        //接入websocket,发送撤回消息
+        $redisClient = new RedisService();
+        $fd = $redisClient->findFd((int) 32);
+        $maxRetries = 1;
+        $retryCount = 0;
+        $interval = 1; // 秒
+        while ($retryCount < $maxRetries) {
+            $response = $this->chatServiceClient->getRecordByContent($requireData);
+            // 如果成功,返回结果
+            if ($response['code'] === 0) {
+                if(!empty($response['data']['id'])){
+                    $records = $response['data'];
+                    foreach($records as $record){
+                        //判断 created_at 是否大于一分钟
+                        $createdAt = strtotime($record['created_at']);
+                        $currentTime = time();
+                        $timeDifference = $currentTime - $createdAt;
+                        if ($timeDifference > 60) {
+                             return Result::error('超过一分钟,无法撤回');
+                        }
+                    }
+                }
+                $result = $this->chatServiceClient->recallRecord($response['data']);
+                return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+            }
+            // 如果失败,等待一段时间后重试
+            sleep($interval);
+            $retryCount++;
+        }
+        return Result::error('获取失败');
+    }
+    /**
+     * 获取一条信息
+     * @return array
+     */
+    public function getRecord()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => '聊天记录ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage= $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getRecord($requireData);
+            return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除一条topicRely
+     * @return array
+     */
+    public function delReply()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => '回复ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delReply($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除所有回复
+     * @return array
+     */
+    public function delAllReply()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'topicid' => 'required',
+            ],
+            [
+                'topicid.required' => '回复ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage =$validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->delAllReply($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取所有Topic
+     * @return array
+     */
+    public function getTopicsListAdmin()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'limit' => 'required',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'limit.required' => '每页数量不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getTopicsListAdmin($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    
+}

+ 694 - 13
app/Controller/CollectorController.php

@@ -11,7 +11,7 @@ use App\Tools\Result;
 use Hyperf\Validation\Contract\ValidatorFactoryInterface;
 use App\Constants\ErrorCode;
 use Hyperf\Context\Context;
-use App\Service\GatherQueueService;
+//use App\Service\GatherQueueService;
 use App\Service\ImportQueueService;
 /**
  * ClassCollectorController
@@ -22,8 +22,8 @@ class CollectorController extends AbstractController
 {
     #[Inject]
     protected ValidatorFactoryInterface $validationFactory;
-    #[Inject]
-    protected GatherQueueService $Gservice;
+//    #[Inject]
+//    protected GatherQueueService $Gservice;
     #[Inject]
     protected ImportQueueService $Iservice;
 
@@ -65,7 +65,7 @@ class CollectorController extends AbstractController
         return Result::success($result['data']);
     }
      /**
-     * 获取网站
+     * 获取及搜索网站
      * @return array
      */
     public function getWeb()
@@ -104,10 +104,454 @@ class CollectorController extends AbstractController
         }
         return Result::success($result['data']);
     }
+    /**
+     * 修改网站
+     * @return array
+     */
+    public function upWeb()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name'=> 'required',
+                'url'=> 'required',
+                'id' => 'required'
+            ],
+            [
+                'name.required' => '网站名称不能为空',
+                'url.required' => '网站地址不能为空',
+                'id.required' => '网站id不能为空'
+            ]
+        );        
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }        
+        $result = $this->collectorServiceClient->upWeb($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 删除网站 
+     * @return array
+     */
+    public function delWeb()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required'
+            ],
+            [
+                'id.required' => '网站id不能为空'
+            ]
+        );        
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }        
+        $result = $this->collectorServiceClient->delWeb($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    
+    /**
+     * 添加规则任务
+     * @return array
+     */
+    public function addRule()
+    {
+        
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'web_id' => 'required',
+                'type' => 'required'
+            ],
+            [
+                'name.required' => '任务规则名称不能为空',
+                'web_id.required' => '网站id不能为空',
+                'type.required' => '网站类型不能为空'
+            ]
+        );  
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        switch($requireData['type']){
+            case 1:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'first_url' => 'required',
+                        'second_start' => 'required',
+                        'second_num' => 'required',
+                        'second_end' => 'required',
+                        'end_pagenum' => 'required',
+                        'start' => 'required',
+                        'con_url' => 'required',
+                        'title' => 'required',
+                        'content' => 'required'
+                    ],
+                    [
+                        'first_url.required' => '第1页网址不能为空',
+                        'second_start.required' => '第2页网址开头不能为空',
+                        'second_num.required' => '第2页代码页数不能为空',
+                        'second_end.required' => '第2页网址结束字符串不能为空',
+                        'end_pagenum.required' => '列表页结束页码不能为空',
+                        'start.required' => '开始代码不能为空',
+                        'con_url.required' => '详情页前缀地址不能为空',
+                        'title.required' => '标题标签类名不能为空',
+                        'content.required' => '内容标签类名不能为空'
+                    ]
+                ); 
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                } 
 
+                break; 
+            case 2:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'first_url' => 'required',
+                        'parameter' => 'required',
+                        'start' => 'required',
+                        'title' => 'required',
+                        'content' => 'required',
+                    ],
+                    [
+                        'first_url.required' => '开始采集地址不能为空',
+                        'parameter.required' => '接口参数不能为空',
+                        'start.required' => '列表标签不能为空',
+                        'title.required' => '标题标签不能为空',
+                        'content.required' => '内容标签不能为空'
+                    ]
+                );  
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                }  
+                // var_dump("============2============");                    
+                break;
+            case 3:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'diy_rule' => 'required'
+                    ],
+                    [
+                        'diy_rule.required' => '采集规则不能为空'
+                    ]
+                ); 
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                }  
+                // var_dump("============3============");  
+                break;
+            default:
+                return Result::error('请输入正确的网站类型');
+                break;
+                
+        }
+        if(isset($requireData['writer_class']) && $requireData['type'] == 2){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'writer_class' => 'required'
+                ],
+                [
+                    'writer_class.required' => '作者标签不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }  
+        }
+
+        if(isset($requireData['writer']) && $requireData['type'] != 3){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'writer' => 'required'
+                ],
+                [
+                    'writer.required' => '文章作者不能为空'
+                ]
+            );  
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }  
+        }
+        // return Result::success($requireData);
+        $result = $this->collectorServiceClient->addRule($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    
+    /**
+     * 获取并搜索任务规则
+     * @return array
+     */
+    public function getRule()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pageSize' => 'required',
+                'page' => 'required'
+            ],
+            [
+                'pageSize.required' => '每页显示数量不能为空',
+                'page.required' => '第几页不能为空',
+            ]
+        ); 
+        if(isset($requireData['keyWord'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'keyWord' => 'required'
+                ],
+                [
+                    'keyWord.required' => '搜索词不能为空'
+                ]
+            ); 
+        }      
 
+        if(isset($requireData['web_id'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'web_id' => 'required'
+                ],
+                [
+                    'web_id.required' => '网站id不能为空'
+                ]
+            ); 
+        }   
+             
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }        
+        $result = $this->collectorServiceClient->getRule($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
     /**
-     * 采集动作
+     * 获取某个规则任务
+     * @return array
+     */
+    public function getOneRule()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required'
+            ],
+            [
+                'id.required' => '任务规则id不能为空'
+            ]
+        );        
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }        
+        $result = $this->collectorServiceClient->getOneRule($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    } 
+    /**
+     * 修改规则任务
+     * @return array
+     */
+
+    public function upRule()
+    {
+        $requireData = $this->request->all();
+        // var_dump("&&&&:",$requireData);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'name' => 'required',
+                'type' => 'required'
+            ],
+            [
+                'name.required' => '任务规则名称不能为空',
+                'id.required' => '任务规则id不能为空',
+                'type.required' => '网站类型不能为空'
+            ]
+        );  
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        switch($requireData['type']){
+            case 1:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'first_url' => 'required',
+                        'second_start' => 'required',
+                        'second_num' => 'required',
+                        'second_end' => 'required',
+                        'start' => 'required',
+                        'con_url' => 'required',
+                        'title' => 'required',
+                        'content' => 'required',
+                    ],
+                    [
+                        'first_url.required' => '第1页网址不能为空',
+                        'second_start.required' => '第2页网址开头不能为空',
+                        'second_num.required' => '第2页代码页数不能为空',
+                        'second_end.required' => '第2页网址结束字符串不能为空',
+                        'end_pagenum.required' => '列表页结束页码不能为空',
+                        'start.required' => '开始代码不能为空',
+                        'con_url.required' => '详情页前缀地址不能为空',
+                        'title.required' => '标题标签类名不能为空',
+                        'content.required' => '内容标签类名不能为空',
+                    ]
+                ); 
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                }  
+                // var_dump("============1============");  
+                break;                
+            case 2:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'first_url' => 'required',
+                        'parameter' => 'required',
+                        'start' => 'required',
+                        'title' => 'required',
+                        'content' => 'required',
+                    ],
+                    [
+                        'first_url.required' => '开始采集地址不能为空',
+                        'parameter.required' => '接口参数不能为空',
+                        'start.required' => '列表标签不能为空',
+                        'title.required' => '标题标签不能为空',
+                        'content.required' => '内容标签不能为空'
+                    ]
+                );  
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                }  
+                // var_dump("============2============");                    
+                break;
+            case 3:
+                $validator = $this->validationFactory->make(
+                    $requireData,
+                    [
+                        'diy_rule' => 'required'
+                    ],
+                    [
+                        'diy_rule.required' => '采集规则不能为空'
+                    ]
+                ); 
+                if ($validator->fails()) {
+                    $errorMessage = $validator->errors()->first();
+                    return Result::error($errorMessage);
+                }  
+                // var_dump("============3============");  
+                break;
+            default:
+                return Result::error('请输入正确的网站类型');
+                break;
+                
+        }
+
+        if(isset($requireData['writer_class']) && $requireData['type'] != 3){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'writer_class' => 'required'
+                ],
+                [
+                    'writer_class.required' => '作者标签不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }  
+        }
+        if(isset($requireData['writer']) && $requireData['type'] != 3){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'writer' => 'required'
+                ],
+                [
+                    'writer.required' => '文章作者不能为空'
+                ]
+            );  
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }  
+        }
+        // var_dump("++++++++++",$requireData);
+        $result = $this->collectorServiceClient->upRule($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+
+    } 
+    /**
+    * 删除任务规则
+    * @return array
+    */
+    public function delRule()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'rule_id' => 'required'
+            ],
+            [
+                'rule_id.required' => '任务规则id不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }        
+        $result = $this->collectorServiceClient->delRule($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 开始采集
      * @return array
      */
     public function sendCrawler()
@@ -131,22 +575,259 @@ class CollectorController extends AbstractController
         }
 //        $b  = $this->Iservice->push($data,1);
         $data['id'] = $requireData['id'];
-        $result = $this->Gservice->push($data,3);
-        return Result::success($result);
+        var_dump("发送数据:",$data);
+        $result =  $this->collectorServiceClient->sendCrawler($data);
+        return $result['code']==200?Result::success($result['data']):Result::error('采集失败');
 
     }
 
+
     /**
-     * 发送请求
-     * @param $data
+     * 获取并搜索资讯
      * @return array
      */
-    public function goSendCrawler($data=[])
+    public function getInfo()
     {
-        var_dump("我要开始采集了!!!");
-        $this->collectorServiceClient->sendCrawler($data);
-        return Result::success([]);
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'rule_id' => 'required',
+                'pageSize' => 'required',
+                'page' => 'required'
+            ],
+            [
+                'rule_id.required' => '规则任务id不能为空',
+                'pageSize.required' => '每页显示数量不能为空',
+                'page.required' => '第几页不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        if(isset($requireData['title'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'title' => 'required'
+                ],
+                [
+                    'title.required' => '资讯题目不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+        }
+        if(isset($requireData['source'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'source' => 'required'
+                ],
+                [
+                    'source.required' => '资讯来源不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+
+
+
+        }
+        if(isset($requireData['state'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'state' => 'required'
+                ],
+                [
+                    'state.required' => '资讯状态不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+        }
+        $result = $this->collectorServiceClient->getInfo($requireData);        
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
+    /**
+     * 获取某个资讯
+     * @return array
+     */
+    public function getOneInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'art_id' => 'required'
+            ],
+            [
+                'art_id.required' => '资讯id不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->collectorServiceClient->getOneInfo($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     *修改资讯
+     * @return array
+     */
+    public function upInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'art_id' => 'required',
+                'title' => 'required',
+                'level' => 'required',
+                'keyword' => 'required',
+                'content' => 'required',
+                'hits' => 'required',
+                'is_original' => 'required',
+                'islink' => 'required'
+            ],
+            [
+                'art_id.required' => '资讯id不能为空',
+                'title.required' => '资讯标题不能为空',
+                'level.required' => '推荐级别不能为空',
+                'keyword.required' => '资讯关键词不能为空',
+                'content.required' => '资讯内容不能为空',
+                'hits.required' => '浏览量不能为空',
+                'is_original.required' => '原创不能为空',
+                'islink.required' => '外链不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        if($requireData['islink']==1){
+            $requireData = $this->request->all();
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'linkurl' => 'required'
+                ],
+                [
+                    'linkurl.required' => '外链地址不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+        }
+        if($requireData['is_original']==0){
+            $requireData = $this->request->all();
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'fromurl' => 'required',
+                    'copyfrom' => 'required'
+                ],
+                [
+                    'fromurl.required' => '采集来源地址不能为空',
+                    'copyfrom' => '采集来源不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+        }
+        $result = $this->collectorServiceClient->upInfo($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 删除资讯
+     * @return array
+     */
+    public function delInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'art_id' => 'required'
+            ],
+            [
+                'art_id.required' => '资讯id不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->collectorServiceClient->delInfo($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 关联导航池
+     * @return array
+     */
+    public function addCatid()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'rule_id' => 'required'
+            ],
+            [
+                'rule_id.required' => '任务规则id不能为空'
+            ]
+        ); 
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->collectorServiceClient->addCatid($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+     /**
+     * 开始导入
+     * @return array
+     */
+    public function addArt()
+    {
+        $requireData = $this->request->all();
+        if(!empty($requireData)){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'rule_id' => 'required'
+                ],
+                [
+                    'rule_id.required' => '任务规则id不能为空'
+                ]
+            ); 
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+        }
+        $data['rule_id'] = $requireData['rule_id'];
+        $data['time'] = microtime();
+        
+        // var_dump("=====111",$data);
+        $result  = $this->collectorServiceClient->addArt($data);
+        // var_dump("=====222",$result);
+        return Result::success($result);
+    }
+   
 
 }

+ 1 - 0
app/Controller/IndexController.php

@@ -63,5 +63,6 @@ class IndexController extends AbstractController
 //        return $result->getImageBase64();
 
     }
+    // 1
 
 }

+ 69 - 9
app/Controller/LinkController.php

@@ -35,13 +35,22 @@ class LinkController extends AbstractController
     public function getLinkList()
     {
         $requireData = $this->request->all();
-        $result = $this->linkServiceClient->getLinkList($requireData);
-        if($result['data']){
-            $statusList = ['1'=>"通过",'2'=>"待审"];
-            foreach ($result['data']['rows'] as $k=>$v) {
-                $result['data']['rows'][$k]['status_name'] =$statusList[$v['status']];
-            }
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '当前页码不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
         }
+        $result = $this->linkServiceClient->getLinkList($requireData);
         return $result?Result::success($result['data']):Result::error($result['message']);
     }
 
@@ -56,9 +65,17 @@ class LinkController extends AbstractController
             $requireData,
             [
                 'title' => 'required',
+                'website_id' => 'required',
+                'sort' => 'required',
+                'url' => 'required',
+                'type' => 'required',
             ],
             [
                 'title.required' => '名称不能为空',
+                'website_id.required' => '网站id不能为空',
+                'sort.required' => '排序不能为空',
+                'url.required' => '跳转地址不能为空',
+                'type.required' => '类型不能为空',
             ]
         );
         if ($validator->fails()){
@@ -81,21 +98,26 @@ class LinkController extends AbstractController
             [
                 'id' => 'required',
                 'title' => 'required',
+                'website_id' => 'required',
+                'sort' => 'required',
                 'url' => 'required',
+                'type' => 'required',
             ],
             [
                 'id.required' => 'id不能为空',
                 'title.required' => '名称不能为空',
-                'url.required' => 'url不能为空',
+                'website_id.required' => '网站id不能为空',
+                'sort.required' => '排序不能为空',
+                'url.required' => '跳转地址不能为空',
+                'type.required' => '类型不能为空',
             ]
         );
         if ($validator->fails()){
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-        $requireData = $this->request->all();
         $result = $this->linkServiceClient->updateLink($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     /**
@@ -105,9 +127,47 @@ class LinkController extends AbstractController
     public function delLink()
     {
         $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
         $result = $this->linkServiceClient->delLink($requireData);
         return $result?Result::success($result['data']):Result::error($result['message']);
     }
 
+    /**
+     * 获取友情链接详情
+     * @return array
+     */
+    public function getLinkInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->linkServiceClient->getLinkInfo($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+
 
 }

+ 33 - 7
app/Controller/LoginController.php

@@ -28,6 +28,7 @@ class LoginController extends AbstractController
     private $userServiceClient;
     public function login(Jwt $jwt)
     {
+        var_dump("我要登陆了");
 //        $this->logger->info("验证之前");
 
         $reqData = $this->request->all();
@@ -56,8 +57,8 @@ class LoginController extends AbstractController
         if (empty($code)) {
             return Result::error("验证码已过期");
         }
-        var_dump("验证码:", $code);
-        if (strtolower($code) != $reqData['captcha']) {
+//        var_dump("验证码:", $code);
+        if (strtolower($code) != strtolower($reqData['captcha'])) {
             return Result::error("验证码错误");
         }
         //$reqData
@@ -70,23 +71,27 @@ class LoginController extends AbstractController
 //        $this->logger->info("验证之前");
         $userInfos = $this->userServiceClient->verifyUserInfo($where);
         if ($userInfos['code'] == 0) {
-            return Result::error("用户名或密码错误");
+            return Result::error("用户不存在");
         }
-        var_dump("用户信息:", $userInfos);
+//        var_dump("数据:",$userInfos);
+        if($userInfos['data']['status']==0){
+            return Result::error("用户已经冻结");
+        }
+//        var_dump("用户信息:", $userInfos);
 //        $this->logger->info("验证用户返回值:", $userInfos);
         if (md5(md5($reqData['password']) . $userInfos['data']['salt']) != $userInfos['data']['password']) {
-            return Result::error("用户名或密码错误");
+            return Result::error("登陆密码错误");
         }
         $userData = [
             'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
             'user_name' => $userInfos['data']['user_name'],
             'mobile' => $userInfos['data']['mobile'],
             'email' => $userInfos['data']['email'],
-//            'rong_token' => $userInfos['data']['rong_token'],
+            // 'rong_token' => $userInfos['data']['rong_token'],
             'level_id' => $userInfos['data']['level_id'],
             'type_id' => $userInfos['data']['type_id'],
         ];
-        var_dump($userData);
+//        var_dump($userData);
         // 使用默认场景登录
         $token = $jwt->getToken('default', $userData);
         $data = [
@@ -238,6 +243,27 @@ class LoginController extends AbstractController
         return Result::success($data);
 
     }
+    public function getToken(JWT $jwt)
+    {
+        $reqData = $this->request->all();
+        $userInfos = $this->userServiceClient->getUserInfo((int) $reqData['id']);
+        $userData = [
+            'uid' => $userInfos['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
+            'user_name' => $userInfos['data']['user_name'],
+            'mobile' => $userInfos['data']['mobile'],
+            'email' => $userInfos['data']['email'],
+
+            'level_id' => $userInfos['data']['level_id'],
+
+            'type_id' => $userInfos['data']['type_id'],
+
+        ];
+        var_dump($userInfos);
+        // 使用默认场景登录
+        $token = $jwt->getToken('default', $userData);
+
+        return Result::success($token->toString());
+    }
 
     public function httpPost()
     {

+ 1 - 10
app/Controller/NewsController.php

@@ -63,7 +63,6 @@ class NewsController extends AbstractController
      */
     public function categoryList()
     {
-
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
@@ -78,9 +77,7 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-
-        $requireData['website_id'] = Context::get("SiteId");
-
+//        $requireData['website_id'] = Context::get("SiteId");
         $result = $this->newsServiceClient->categoryList($requireData);
         $rep = PublicData::buildMenuTree($result['data']);
         return $result ? Result::success($rep) : Result::error($result['message']);
@@ -199,7 +196,6 @@ class NewsController extends AbstractController
     public function getArticleList()
     {
         $requireData = $this->request->all();
-
         $validator = $this->validationFactory->make(
             $requireData,
             [
@@ -298,8 +294,6 @@ class NewsController extends AbstractController
 
         $loginIp = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
         $requireData['ip'] = $loginIp;
-
-        $requireData['website_id'] = Context::get("SiteId");
         $requireData['admin_user_id'] =Context::get("UserId");
         
         $requireData['level'] = isset($requireData['level']) &&  $requireData['level']?$requireData['level']:0;
@@ -338,7 +332,6 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-
         $requireData['catid'] = isset($requireData['cat_arr_id'])?end($requireData['cat_arr_id']):'';
         $requireData['cat_arr_id'] = isset($requireData['cat_arr_id'])?json_encode($requireData['cat_arr_id']):'';
 
@@ -391,8 +384,6 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-
-        $requireData['website_id'] = Context::get("SiteId");
         $result = $this->newsServiceClient->delArticle($requireData);
         return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
     }

+ 38 - 43
app/Controller/OrderController.php

@@ -34,6 +34,7 @@ class OrderController extends AbstractController
     /***
      * 状态说明
      */
+    
     public function getStauts()
     {
         $data['order'] = [
@@ -59,36 +60,38 @@ class OrderController extends AbstractController
 
     }
     /**
-     * 查询广告位
+     * 获取广告尺寸及查询广告位
      */
     public function getAD()
     {
         $requireData = $this->request->all();
-        $validator = $this->validationFactory->make(
-            $requireData,
-            [
-                'width' => 'required',
-                'height' => 'required',
-                'starttime' => 'required',
-                'endtime' => 'required',
-                'pageSize' => 'required',
-                'page' => 'required',
-
-            ],
-            [
-                'width.required' => '图片宽度不能为空',
-                'height.required' => '图片高度不能为空',
-                'starttime.required' => '广告开始时间不能为空',
-                'endtime.required' => '广告结束时间不能为空',
-                'pageSize.required' => '显示条数不能为空',
-                'page.required' => '分页不能为空',
-
-            ]
-        );
-        if ($validator->fails()) {
-            $errorMessage = $validator->errors()->first();
-            return Result::error($errorMessage);
+        if(!empty($requireData)){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'ad_size_id' => 'required',
+                    'starttime' => 'required',
+                    'endtime' => 'required',
+                    'pageSize' => 'required',
+                    'page' => 'required',
+    
+                ],
+                [
+                    'ad_size_id.required' => '广告尺寸id不能为空',
+                    'starttime.required' => '广告开始时间不能为空',
+                    'endtime.required' => '广告结束时间不能为空',
+                    'pageSize.required' => '显示条数不能为空',
+                    'page.required' => '分页不能为空',
+    
+                ]
+            );
+            if ($validator->fails()) {
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
         }
+        
+        
         $result = $this->orderServiceClient->getAD($requireData);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -102,34 +105,28 @@ class OrderController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'width' => 'required',
-                'height' => 'required',
+                'ad_size_id' => 'required',
                 'starttime' => 'required',
                 'endtime' => 'required',
-
+                'pageSize' => 'required',
+                'page' => 'required',
             ],
             [
-                'width.required' => '图片宽度不能为空',
-                'height.required' => '图片高度不能为空',
+                'ad_size_id.required' => '广告尺寸id不能为空',
                 'starttime.required' => '广告开始时间不能为空',
                 'endtime.required' => '广告结束时间不能为空',
-
+                'pageSize.required' => '显示条数不能为空',
+                'page.required' => '分页不能为空'
             ]
         );
         if (!empty($requireData['website_id'])) {
             $validator = $this->validationFactory->make(
                 $requireData,
                 [
-                    'website_id' => 'required',
-                    'pageSize' => 'required',
-                    'page' => 'required',
-
+                    'website_id' => 'required'
                 ],
                 [
-                    'website_id.required' => '网站id不能为空',
-                    'pageSize.required' => '显示条数不能为空',
-                    'page.required' => '分页不能为空',
-
+                    'website_id.required' => '网站id不能为空'
                 ]
             );
         }
@@ -176,8 +173,7 @@ class OrderController extends AbstractController
             [
 
                 'name' => 'required',
-                'width' => 'required',
-                'height' => 'required',
+                'ad_size_id' => 'required',
                 'starttime' => 'required',
                 'endtime' => 'required',
                 'imgurl' => 'required',
@@ -186,8 +182,7 @@ class OrderController extends AbstractController
             ],
             [
                 'name.required' => '广告名称不能为空',
-                'width.required' => '图片宽度不能为空',
-                'height.required' => '图片高度不能为空',
+                'ad_size_id.required' => '广告图片尺寸id不能为空',
                 'starttime.required' => '广告开始时间不能为空',
                 'endtime.required' => '广告结束时间不能为空',
                 'imgurl.required' => '图片广告链接不能为空',

+ 543 - 7
app/Controller/PublicController.php

@@ -63,14 +63,19 @@ class PublicController extends AbstractController
     {
         $urlN = new CommonService();
         $file = $this->request->file('file');
-        $fileName = $this->request->input("fileName", '');
+       
         try {
             if ($file == null) {
                 return Result::error("未找到上传文件");
             }
-            $data = CommonService::uploadFile($file, ['png', 'jpg', 'jpeg', 'gif', 'xls', 'xlsx', 'pdf', 'doc', 'docx', 'ppt', 'zip', 'pptx', 'mp4', 'flv','rar','tar'], 'image');
-
+ 
+            $data = CommonService::uploadFile($file, ['txt','png', 'jpg', 'png', 'jpeg', 'gif', 'xls', 'xlsx', 'pdf', 'xls', 'xlsx', 'doc', 'docx', 'ppt', 'zip', 'pptx', 'mp4', 'flv'], 'image');
+            var_dump($data);
+            if (isset($data['code'])&&$data['code'] != 200) {
+                return Result::error($data['message']);
+            }
             $data['imgUrl'] = $urlN->imgUrl($data['src']);
+            $fileName = $file->getClientFilename();
             $data['oldFileName'] = $fileName;
             return Result::success($data, '上传成功');
         } catch (\Exception $e) {
@@ -79,15 +84,546 @@ class PublicController extends AbstractController
         }
     }
     /**
-     * 获取风格名称
+     * 添加用户等级
      * @return array
      */
-    public function getTemplateClass()
+    public function addUserLevel()
     {
         $requireData = $this->request->all();
-        $result = $this->publicServiceClient->getLetterType($requireData);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+            ],
+            [
+                'name.required' => '等级名不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->publicServiceClient->addUserLevel($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除用户等级
+     * @return array
+     */
+    public function delUserLevel()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'ID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->publicServiceClient->delUserLevel($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 更新用户等级
+     * @return array
+     */
+    public function updateUserLevel()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'ID不能为空',
+                'name.required' => '名称不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->publicServiceClient->updateUserLevel($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 城市列表
+     * @return array
+     */
+    public function getCityList()
+    {
+        $requireData = $this->request->all();
+        var_dump($requireData);
+        $result = $this->publicServiceClient->getDistrictList($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 投诉举报
+     * @return void
+     */
+    public function addComplaint()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'title' => 'required',
+                'nature' => 'required',
+                'nature_level0' => 'required',
+                'name' => 'required',
+                'mobile' => 'required',
+                'describe' => 'required',
+            ],
+            [
+                'title.required' => '标题不能为空',
+                'nature.required' => '类型不能为空',
+                'nature_level0.required' => '类型进度不能为空',
+                'name.required' => '姓名不能为空',
+                'mobile.required' => '手机号码不能为空',
+                'describe.required' => '详细说明不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        if ($requireData['id']) {
+            $result = $this->publicServiceClient->userUpLetterOfComplaint($requireData);
+        } else {
+            $result = $this->publicServiceClient->addLetterOfComplaint($requireData);
+        }
+
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新投诉举报信息
+     * @return array
+     */
+    public function upComplaint()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        var_dump($requireData);
+        if (isset($requireData['is_admin']) && !empty($requireData['is_admin'])) {
+            $requireData['admin_id'] = Context::get("UserId");
+        }
+        $result = $this->publicServiceClient->upLetterOfComplaint($requireData);
+        return $result ? Result::success([]) : Result::error($result['message']);
+    }
+    /**
+     * 获取投诉列表
+     * @return array
+     */
+    public function getComplaint()
+    {
+
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        if (isset($requireData['is_admin']) && !empty($requireData['is_admin'])) {
+            unset($requireData['user_id']);
+        }
+        $result = $this->publicServiceClient->getLetterOfComplaint($requireData);
+        if($result['code']==200){
+            foreach ($result['data']['rows']as $key=>$val){
+                $result['data']['rows'][$key]['created_at'] = date("Y-m-d",strtotime($val['created_at']));
+            }
+        }
         return $result ? Result::success($result['data']) : Result::error($result['message']);
     }
-   
+
+    /**
+     * 获取投诉举报信息
+     * @return array
+     */
+    public function getLetterOfComplaintInfo()
+    {
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        if (isset($requireData['is_admin']) && !empty($requireData['is_admin'])) {
+            unset($requireData['user_id']);
+        }
+        $result = $this->publicServiceClient->getLetterOfComplaintInfo($requireData);
+        if ($result) {
+            $result['data']['judgment'] = $result['data']['judgment'] ? json_decode($result['data']['judgment']) : '';
+            $result['data']['audio_and_video'] = $result['data']['audio_and_video'] ? json_decode($result['data']['audio_and_video']) : '';
+            $result['data']['contract'] = $result['data']['contract'] ? json_decode($result['data']['contract']) : '';
+            $result['data']['qualifications'] = $result['data']['qualifications'] ? json_decode($result['data']['qualifications']) : '';
+        }
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 删除投诉举报信息
+     * @return array
+     */
+    public function delLetterOfComplaint()
+    {
+        $requireData = $this->request->all();
+        $requireData['user_id'] = Context::get("UserId");
+        if (isset($requireData['is_admin']) && !empty($requireData['is_admin'])) {
+            unset($requireData['user_id']);
+        }
+        $result = $this->publicServiceClient->delLetterOfComplaint($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取投诉分类信息
+     * @return array
+     */
+    public function getLetterType()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'type' => 'required',
+            ],
+            [
+                'type.required' => '类型不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->publicServiceClient->getLetterType($requireData);
+        $rep = PublicData::buildMenuTree($result['data']);
+        return $rep ? Result::success($rep) : Result::error("查询失败");
+    }
+
+    /**
+     * @return array
+     */
+    public function getLetterTypeChildren()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'type' => 'required',
+                'pid' => 'required',
+            ],
+            [
+                'type.required' => '类型不能为空',
+                'pid.required' => 'PID不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->publicServiceClient->getLetterType($requireData);
+        return $result['code']==200 ? Result::success($result['data']) : Result::error("查询失败");
+    }
+
+    public function downloadFile(RequestInterface $request, ResponseInterface $response)
+    {
+        //验证是否有传参数
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'files' => 'required',
+            ],
+            [
+                'files.required' => '文件不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['fileName'] = $requireData['fileName'] ?? '政讯通';
+        //打包文件
+        $zip = new ZipArchive();
+        $fileType = 'zip';
+        $date = date('Ymd');
+        $filePath = $fileType . DIRECTORY_SEPARATOR . $date;
+        $allDir = 'public' . DIRECTORY_SEPARATOR . $filePath;
+        if (!is_dir($allDir)) {
+            if (!mkdir($allDir, 0755, true)) {
+                return Result::error('创建文件夹失败');
+            }
+        }
+        $fileName = $requireData['fileName'] . time() . mt_rand(1, 1000000) . '.zip';
+        $zipFileName = $allDir . DIRECTORY_SEPARATOR . $requireData['fileName'] . time() . mt_rand(1, 1000000) . '.zip';
+//        $zipFileName = 'public/zip/files.zip';
+
+        if ($zip->open($zipFileName, ZipArchive::CREATE) === true) {
+            // 将要下载的文件逐个添加到zip文件中
+//            $string = trim($requireData['files'], "[]'"); // 去掉最外层的方括号和单引号(注意:这里假设了单引号,如果是双引号则替换为 ")
+//            $string = str_replace("'", '', $string); // 去掉所有剩余的单引号(如果原字符串中使用的是双引号,则替换为双引号)
+//            $filePaths = explode(',', $string);
+            foreach ($requireData['files'] as $filePathu) {
+                $attachmentItem = 'public/' . $filePathu;
+                $zip->addFile($attachmentItem, pathinfo($attachmentItem, PATHINFO_BASENAME));
+            }
+            // 关闭zip文件
+            $zip->close();
+            // 将zip文件提供给用户进行下载
+//            readfile($zipFileName);
+            $fileUrlName = explode("public", $zipFileName);
+            return Result::success(['fileUrl' => env('HOST') . $fileUrlName[1]]);
+        } else {
+            return Result::error('无法创建zip文件');
+        }
+    }
+    /**
+     * 检测是否被处理
+     * @return array
+     */
+    public function checkMeasure()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->checkMeasure($requireData);
+        return $result['code'] == 200 ? Result::success() : Result::error("已经处理了");
+    }
+    /**
+     * 获取职能部门
+     * @return void
+     */
+    public function getDepartment()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pid' => 'required',
+            ],
+            [
+                'pid.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->publicServiceClient->getDepartment($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error("查询失败");
+    }
+
+
+    /**
+     * 获取职能部门
+     * @return array
+     */
+    public function getZhinengbumenList()
+    {
+
+        // 获取请求参数
+        $requireData = $this->request->all();
+
+        // 参数验证
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'integer|min:1',
+                'pagesize' => 'integer|min:1',
+                'search' => 'string|nullable',
+            ],
+            [
+                'page.integer' => 'page 必须是整数',
+                'page.min' => 'page 必须大于等于 1',
+                'pagesize.integer' => 'pagesize 必须是整数',
+                'pagesize.min' => 'pagesize 必须大于等于 1',
+                'search.string' => 'search 必须是字符串',
+            ]
+        );
+
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        // 添加用户 ID
+        $requireData['user_id'] = Context::get("UserId");
+
+        // 调用服务客户端方法获取分页数据
+        $result = $this->publicServiceClient->getZhinengbumenList($requireData);
+
+        // 处理结果
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error("查询失败");
+    }
+
+    /**
+     * 添加职能部门
+     * @return array
+     */
+    public function addZhinengbumen()
+    {
+        // 获取请求参数
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required|string|regex:/^[\x{4e00}-\x{9fa5}]+$/u',
+                'pid' => 'required|integer',
+            ],
+            [
+                'name.required' => 'name 不能为空',
+                'name.string' => 'name 必须是字符串',
+                'name.regex' => 'name 必须是汉字',
+                'pid.required' => 'pid 不能为空',
+                'pid.integer' => 'pid 必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        // $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->addZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success() : Result::error("添加失败");
+    }
+    /**
+     * 删除职能部门
+     * @return array
+     */
+    public function delZhinengbumen()
+    {
+        $requireData = $this->request->all();
+
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+            ],
+            [
+                'id.required' => 'id 不能为空',
+                'id.integer' => 'id 必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->delZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success() : Result::error("删除失败");
+    }
+    /**
+     * 职能部门详情
+     * @return array
+     */
+    public function getZhinengbumen()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+            ],
+            [
+                'id.required' => 'id 不能为空',
+                'id.integer' => 'id 必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->getZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error("查询失败");
+    }
+    /**
+     * 获取职能部门某pid的所有子级,默认0级
+     * @return array
+     */
+    public function getPidZhinengbumen()
+    {
+        // 获取请求参数
+        $requireData = $this->request->all();
+
+        // 参数验证
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pid' => 'integer|min:0',
+            ],
+            [
+                'pid.integer' => 'pid 必须是整数',
+                'pid.min' => 'pid 必须大于等于 0',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->getPidZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error("查询失败");
+    }
+    /**
+     * 修改职能部门名称
+     * @return array
+     */
+    public function modZhinengbumen()
+    {
+        $requireData = $this->request->all();
+
+        // 参数验证
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+                'name' => 'required|string|regex:/^[\x{4e00}-\x{9fa5}]+$/u',
+            ],
+            [
+                'id.required' => 'id 不能为空',
+                'id.integer' => 'id 必须是整数',
+                'name.required' => 'name 不能为空',
+                'name.string' => 'name 必须是字符串',
+                'name.regex' => 'name 必须是汉字',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->publicServiceClient->modZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success() : Result::error("修改失败");
+        // test
+    }
 }
 

+ 66 - 0
app/Controller/SseController.php

@@ -0,0 +1,66 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+class SseController extends AbstractController
+{
+    public function stream(RequestInterface $request, ResponseInterface $response)
+    {
+          $params = [
+              "model"=>"glm-4",
+              "messages"=>[
+                  [
+                      "role"=>"system",
+                      "content"=>"你是一个乐于解答各种问题的助手,你的任务是为用户提供专业、准确、有见地的建议。"//$requireData['message']
+                  ],
+                  [
+                      "role"=>"user",
+                      "content"=>"我是一个初级程序员,如何快速的提升自己"//$requireData['message']
+                  ]
+              ],
+              "stream"=>true
+          ];
+         $apiUrl = "https://open.bigmodel.cn/api/paas/v4/chat/completions";
+         $result= $this->callApi($apiUrl, 'POST', $params, ['Authorization: Bearer be1856920c54ac537b530d69bc2eda73.gOO2BMq9NXavzEMq']);
+          $arr =  preg_split('/\n\s*\n/', $result);
+        // 开始流式传输
+        $this->container->get(\Swoole\Http\Response::class)->status(200);
+        foreach ($arr as $val){
+            $response->write("$val\n\n");
+            usleep(1000000); // 暂停1秒
+        }
+        return $response;
+    }
+
+
+    function callApi($url, $method = 'GET', $data = null, $headers = [])
+    {
+        $ch = curl_init();
+
+        // 配置 CURL
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
+        // 如果是 POST/PUT 请求,附加数据
+        if ($data && ($method === 'POST' || $method === 'PUT')) {
+            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
+            $headers[] = 'Content-Type: application/json';
+        }
+        // 附加头部信息
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        // 执行请求
+        $response = curl_exec($ch);
+        // 错误处理
+        if (curl_errno($ch)) {
+            $response = json_encode(['error' => curl_error($ch)]);
+        }
+        curl_close($ch);
+        return $response;
+    }
+
+}

+ 32 - 4
app/Controller/UserController.php

@@ -37,13 +37,13 @@ class UserController extends AbstractController
                 'password' => 'required|min:6',//密码
                 'confirm_password' => 'required',
                 'real_name' => 'required',
-                'mobile' =>'required'
+//                'mobile' =>'required'
             ],
             [
                 'user_name.required' => '用户名不能为空',
                 'password.required' => '密码不能为空',
 //                'email.email' => '请填写一个有效的邮箱',
-                'mobile.required' => '手机号码必填',
+//                'mobile.required' => '手机号码必填',
 //                'mobile.telephone_number' => '请填写一个有效的手机号',
                 'confirm_password.required' =>"确认密码不能为空",
                 'type_id.required' =>"用户类型不能为空",
@@ -81,6 +81,32 @@ class UserController extends AbstractController
         return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
+    /**
+     * @return array|void
+     */
+    public function resetPassword()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'password'=>'required',
+            ],
+            [
+                'id.required' =>"id不能为空",
+                'password.required' =>"密码不能为空",
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $salt = rand(1, 999999);
+        $requireData['salt'] = $salt;
+        $result =  $this->userServiceClient->resetPassword($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
     /**
      * 更新用户
      * @return array
@@ -94,12 +120,12 @@ class UserController extends AbstractController
                 'user_name' => 'required',//登陆账号
                 'type_id'=> 'required',//用户类型
                 'real_name' => 'required',
-                'mobile' =>'required',
+//                'mobile' =>'required',
                 'id'=>'required'
             ],
             [
                 'user_name.required' => '用户名不能为空',
-                'mobile.required' => '手机号码必填',
+//                'mobile.required' => '手机号码必填',
                 'type_id.required' =>"用户类型不能为空",
                 'real_name.required' =>"姓名不能为空",
                 'id.required' =>"id不能为空",
@@ -109,6 +135,7 @@ class UserController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
+
         $loginIp = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
         $requireData['last_login_ip'] = $loginIp;
 
@@ -262,6 +289,7 @@ class UserController extends AbstractController
     public function  verifyUserInfo()
     {
         $requireData = $this->request->all();
+        var_dump($requireData);
         $result =  $this->userServiceClient->verifyUserInfo($requireData);
         if ($result['code'] != ErrorCode::SUCCESS) {
             return Result::error($result['message'],0,[]);

+ 5 - 9
app/Controller/WebController.php

@@ -6,13 +6,11 @@ use App\JsonRpc\NewsServiceInterface;
 use App\JsonRpc\WebsiteServiceInterface;
 use App\Tools\PublicData;
 use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
 use App\Tools\Result;
 use Hyperf\Validation\Contract\ValidatorFactoryInterface;
 use App\Constants\ErrorCode;
-use App\Controller\PublicController;
 use Hyperf\Context\Context;
-use Hyperf\HttpServer\Contract\RequestInterface;
-use Hyperf\HttpServer\Contract\ResponseInterface;
 /**
  * Class WebController
  * @package App\Controller
@@ -22,7 +20,7 @@ class WebController extends AbstractController
 
     #[Inject]
     protected ValidatorFactoryInterface $validationFactory;
-    private $publicServiceClient;
+
     /**
      * @var NewsServiceInterface
      */
@@ -37,7 +35,6 @@ class WebController extends AbstractController
 
 
     private $PublicController;
-
     public function __construct(PublicController $PublicController)
     {
         $this->PublicController = $PublicController;
@@ -66,10 +63,9 @@ class WebController extends AbstractController
         }
 
         $data = [
-            'website_id'=>Context::get("SiteId"),
-            'pageSize'=>$requireData['pageSize']
+            'website_id'=>Context::get("SiteId")
         ];
-        // var_dump("网站id:",Context::get("SiteId"));
+        var_dump("网站id:",Context::get("SiteId"));
         $result = $this->websiteServiceClient->getWebsiteCategory($data);
         if ($result['code'] != ErrorCode::SUCCESS) {
             return Result::error($result['message'],0,[]);
@@ -153,7 +149,6 @@ class WebController extends AbstractController
         return Result::success($result['data']);
     }
 
-
     /**
      *各省市查询 
      */
@@ -480,4 +475,5 @@ class WebController extends AbstractController
         return Result::success($result['data']);
         
     }
+
 }

+ 200 - 68
app/Controller/WebSocketController.php

@@ -1,30 +1,24 @@
 <?php
-declare(strict_types=1);
+declare (strict_types = 1);
 
 namespace App\Controller;
 
 use App\Amqp\Producer\MqProducer;
+use App\JsonRpc\ChatServiceInterface;
+use App\JsonRpc\UserServiceInterface;
+use App\Service\Message\ReceiveHandleService;
+use App\Service\RedisService;
 use Hyperf\Amqp\Producer;
 use Hyperf\Context\ApplicationContext as ContextApplicationContext;
 use Hyperf\Contract\OnCloseInterface;
 use Hyperf\Contract\OnMessageInterface;
 use Hyperf\Contract\OnOpenInterface;
-use Hyperf\Engine\WebSocket\Frame;
-use Hyperf\Engine\WebSocket\Response;
-use Hyperf\WebSocketServer\Annotation\MessageHandler;
-use Hyperf\WebSocketServer\Context\WebSocketContext;
-use Hyperf\WebSocketServer\Message\Text;
 use Hyperf\Di\Annotation\Inject;
+use Hyperf\Engine\WebSocket\Response;
 use Phper666\JWTAuth\JWT;
-use App\JsonRpc\ChatServiceInterface;
-use Hyperf\WebSocketServer\Constant\Opcode;
-use App\Service\RedisService;
-use App\Service\Message\ReceiveHandleService;
-use http\Client\Request;
-use App\Controller\AbstractController;
-use App\JsonRpc\UserServiceInterface;
+use swoole\Server;
 
-class WebSocketController  implements OnMessageInterface, OnOpenInterface, OnCloseInterface
+class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface
 {
 
     #[Inject]
@@ -45,99 +39,237 @@ class WebSocketController  implements OnMessageInterface, OnOpenInterface, OnClo
      * @var ReceiveHandleService
      */
     protected $receiveHandle;
+    protected $server;
 
+    
     public function onMessage($server, $frame): void
     {
-
         //把数据推给前端
         $redisClient = new RedisService();
-        $userId = $redisClient->findUser((string)$frame->fd);
-
+        $userId = $redisClient->findUser((string) $frame->fd);
         //存入队列
         $result = json_decode($frame->data, true);
         $result['user_id'] = $userId;
-
-        $userInfo = $redisClient->getUserInfo($userId);
-        if($userInfo){
+        var_dump($result, '-------------1----');
+        $userInfo = $redisClient->getUserInfo((string) $userId);
+        if ($userInfo) {
             $userInfoArr = json_decode($userInfo);
             $result['user_avatar'] = $userInfoArr['avatar'];
-        }else{
-            $userInfos = $this->userServiceClient->getUserInfo((int)$userId);
-            $redisClient->setUserInfo($userId,$userInfos['data']);
+        } else {
+            $userInfos = $this->userServiceClient->getUserInfo((int) $userId);
+            $redisClient->setUserInfo($userId, $userInfos['data']);
             $result['user_avatar'] = $userInfos['data']['avatar'];
         }
-        var_dump("接收到的数据:",$result);
-        $message = new MqProducer($result);
-        $producer = ContextApplicationContext::getContainer()->get(Producer::class);
-        $producer->produce($message);
+        $myFriends = $redisClient->getUserFriends((string) $userId);
+        $myFriendsArr = [];
+        if ($myFriends) {
+            $myFriendsArr = json_decode($myFriends);
+
+        } else {
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
+            $redisClient->setUserFriends($userId, $myFriends['data']);
+            $myFriendsArr = $myFriends['data'];
+        }
+        
         //推送给前台
         //组装数据+头像
-        if($result['talk_type']==1){
+        if ($result['talk_type'] == 1) {
+            //判断$result['receiver_id']是否是好友
+        $myFriendsID = array_column($myFriendsArr, 'friend_id');
+        if (!in_array($result['receiver_id'], $myFriendsID)) {
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
+            $redisClient->setUserFriends($userId, $myFriends['data']);
+            $myFriendsArr = $myFriends['data'];
+                if (!in_array($result['receiver_id'], $myFriendsID)) {
+                    $result['content'] = '您还不是好友,无法发送消息!';
+                    $server->push((int) $frame->fd, json_encode($result));
+                }
+            return;
+        }
             //给自己推一条数据
             if ($server->isEstablished($frame->fd)) {
-                $server->push($frame->fd, json_encode($result));
+                $result['is_read'] = 1;
+                $server->push((int) $frame->fd, json_encode($result));
+                // 尝试连接
+                try {
+                    $saiddata = $result;
+                    $saiddata['action'] = 'said';
+                    $message = new MqProducer($saiddata);
+                    $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                    $re = $producer->produce($message);
+                    var_dump('消息发送成功' . $frame->fd);
+                } catch (\Exception $e) {
+                    var_dump('消息发送失败: ' . $e->getMessage());
+                    $this->retry($message);
+                }
+            } else {
+                //给自己发一条未读消息
+                try {
+                    $saiddata = $result;
+                    $saiddata['action'] = 'said';
+                    $saiddata['is_read'] = 0;
+                    $message = new MqProducer($saiddata);
+                    $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                    $re = $producer->produce($message);
+                    var_dump('消息发送成功' . $frame->fd);
+                } catch (\Exception $e) {
+                    var_dump('消息发送失败: ' . $e->getMessage());
+                    $this->retry($message);
+                }
             }
             //给好友推送消息
-            $fd = $redisClient->findFd((int)$result['receiver_id']);
-//            $result['user_id'] = $result['friend_id'];
-            if ($server->isEstablished((int)$fd)) {
-               $b =  $server->push((int)$fd, json_encode($result));
-               var_dump("推送成功:",$b);
+            $fd = $redisClient->findFd((int) $result['receiver_id']);
+            if ($server->isEstablished((int) $fd)) {
+                $data = $result;
+
+                $data['is_read'] = 1;
+                $server->push((int) $fd, json_encode(value: $data));
+                var_dump('消息给好友发送成功' . $fd);
+                // 尝试连接
+                try {
+                    $chatdata = $result;
+                    $chatdata['action'] = 'recieved';
+                    $chatdata['receiver_id'] = $result['user_id'];
+                    $chatdata['user_id'] = $result['receiver_id'];
+                    $message = new MqProducer($chatdata);
+                    $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                    $re = $producer->produce($message);
+                    var_dump('消息发送成功');
+                } catch (\Exception $e) {
+                    var_dump('消息发送失败: ' . $e->getMessage());
+                    $this->retry($message);
+                }
+            } else {
+                try {
+                    $chatdata = $result;
+                    $chatdata['action'] = 'recieved';
+                    $chatdata['receiver_id'] = $result['user_id'];
+                    $chatdata['user_id'] = $result['receiver_id'];
+                    $chatdata['is_read'] = 0;
+                    $message = new MqProducer($chatdata);
+                    $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                    $re = $producer->produce($message);
+                    var_dump('消息发送成功');
+                } catch (\Exception $e) {
+                    var_dump('消息发送失败: ' . $e->getMessage());
+                    $this->retry($message);
+                }
             }
-        }else if($result['talk_type']==2){
+        } else if ($result['talk_type'] == 2) {
             //根据群找到 群用户,群发一遍消息
-            $groupUserList = $this->chatServiceClient->getAllTalkGroupMember(['group_id'=>$result['receiver_id']]);
-            var_dump($groupUserList['data']);
-            if($groupUserList['data']){
-                foreach ($groupUserList['data'] as $val){
-                    $fd = $redisClient->findFd((int)$val['user_id']);
-                    if ($server->isEstablished((int)$fd)) {
-                        $server->push((int)$fd, json_encode($result));
+            $groupUserList = $this->chatServiceClient->getGroupMembers(['group_id' => $result['receiver_id']]);
+            var_dump($groupUserList['data'],'----------------------------------');
+            if ($groupUserList['data']) {
+                $chatdata = $result;
+                foreach ($groupUserList['data'] as $val) {
+                    $fd = $redisClient->findFd((int) $val['user_id']);
+                    if ($server->isEstablished((int) $fd)) {
+                        var_dump($fd, $val['user_id']);
+                        $server->push((int) $fd, json_encode($result));
+                        try {
+                            //分发说,只记录自己对自己
+                            if ($result['user_id'] == $val['user_id']) {
+                                $chatdata['receiver_id'] = $result['receiver_id'];
+                                $chatdata['user_id'] = $result['user_id'];
+                                $chatdata['group_receiver_id'] = $val['user_id'];
+                                $chatdata['is_read'] = 1;
+                                $chatdata['action'] = 'said';
+                                $message = new MqProducer($chatdata);
+                                $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                                $re = $producer->produce($message);
+                            }
+                            //分发接收,不记录自己
+                            if ($chatdata['user_id'] != $val['user_id']) {
+                                $chatdata['receiver_id'] = $result['receiver_id'];
+                                $chatdata['user_id'] = $val['user_id'];
+                                $chatdata['group_receiver_id'] = $result['user_id'];
+                                $chatdata['is_read'] = 1;
+                                $chatdata['action'] = 'recieved';
+                                $message = new MqProducer($chatdata);
+                                $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                                $re = $producer->produce($message);
+                                var_dump('消息发送成功');
+                            }
+                        } catch (\Exception $e) {
+                            var_dump('消息发送失败: ' . $e->getMessage());
+                        }
+                    } else {
+                        try {
+                            //分发说,只记录自己对自己
+                            if ($result['user_id'] == $val['user_id']) {
+                                $chatdata['receiver_id'] = $result['receiver_id'];
+                                $chatdata['user_id'] = $result['user_id'];
+                                $chatdata['group_receiver_id'] = $val['user_id'];
+                                $chatdata['is_read'] = 0;
+                                $chatdata['action'] = 'said';
+                                $message = new MqProducer($chatdata);
+                                $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                                $re = $producer->produce($message);
+                            }
+                            //分发接收,不记录自己
+                            if ($chatdata['user_id'] != $val['user_id']) {
+                                $chatdata['receiver_id'] = $result['receiver_id'];
+                                $chatdata['user_id'] = $val['user_id'];
+                                $chatdata['group_receiver_id'] = $result['user_id'];
+                                $chatdata['is_read'] = 0;
+                                $chatdata['action'] = 'recieved';
+                                $message = new MqProducer($chatdata);
+                                $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                                $re = $producer->produce($message);
+                                var_dump('消息发送成功');
+                            }
+                        } catch (\Exception $e) {
+                            var_dump('消息发送失败: ' . $e->getMessage());
+                        }
                     }
                 }
             }
-
         }
-
     }
-
+    public function retry($message): void
+    {
+        $maxRetries = 10; // 最大重试次数
+        $retryCount = 0;
+        while ($retryCount < $maxRetries) {
+            try {
+                $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+                $re = $producer->produce($message);
+                var_dump('重试消息发送成功');
+                break;
+            } catch (\Exception $e) {
+                $retryCount++;
+                if ($retryCount >= $maxRetries) {
+                    var_dump('达到最大重试次数,消息发送失败: ' . $e->getMessage());
+                } else {
+                    var_dump('第 ' . $retryCount . ' 次重试失败: ' . $e->getMessage());
+                }
+            }
+        }
+    }
     public function onClose($server, int $fd, int $reactorId): void
     {
-        var_dump('closed::::::::::::::::::',$fd,"======",$reactorId,"+++++++++++");
-//        $data = [
-//            'fd'=>$fd
-//        ];
-//        $this->chatServiceClient->delChatChannel($data);
-
+        var_dump('closed::::::::::::::::::', $fd, "======", $reactorId, "+++++++++++");
         $redisClient = new RedisService();
-        $userId = $redisClient->findUser((string)$fd);
-        $redisClient->unbind((string)$fd,(int)$userId);
+        $userId = $redisClient->findUser((string) $fd);
+        $redisClient->unbind((string) $fd, (int) $userId);
     }
-
     public function onOpen($server, $request): void
     {
-
         $token = $request->get['token'];
         $userInfo = $this->jwt->getClaimsByToken($token);
         $response = (new Response($server))->init($request);
         $fd = $response->getFd();
-//        var_dump("管道ID:",$fd);
-//        $data = [
-//            'user_id'=>$userInfo['uid'],
-//            'fd'=>$fd
-//        ];
-//        var_dump(SERVER_RUN_ID,"+++++++++++++");
-//      $this->chatServiceClient->addChatChannel($data);
-
-        $server->bind($fd,$userInfo['uid']);
+        $server->bind($fd, $userInfo['uid']);
         $redisClient = new RedisService();
-        $redisClient->bind((string)$fd,$userInfo['uid']);
+        $redisClient->bind((string) $fd, $userInfo['uid']);
         $server->push($request->fd, json_encode([
-            "event"   => "connect",
+            "event" => "connect",
             "content" => [
                 "ping_interval" => 20,
-                "ping_timeout"  => 20 * 3,
-                "content" =>"连接成功"
+                "ping_timeout" => 20 * 3,
+                "content" => "连接成功",
+                "fd" => $fd,
+                "user_id" => $userInfo['uid'],
             ],
         ]));
     }

+ 1 - 1
app/Controller/WebsiteController.php

@@ -1046,7 +1046,7 @@ class WebsiteController extends AbstractController
     }
 
     /**
-     * 检测网站网址是否存在
+     * 检测网站网址是否存在1
      * @return array
      */
     public function checkWebsiteUrl()

+ 0 - 39
app/Job/GatherExampleJob.php

@@ -1,39 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace App\Job;
-
-use Hyperf\AsyncQueue\Job;
-use App\Controller\CollectorController;
-/**
- * @Job(name="default")
- */
-class GatherExampleJob extends Job
-{
-    public $params;
-
-    /**
-     * 任务执行失败后的重试次数,即最大执行次数为 $maxAttempts+1 次
-     */
-    protected int $maxAttempts = 2;
-
-    public function __construct($params)
-    {
-        // 这里最好是普通数据,不要使用携带 IO 的对象,比如 PDO 对象
-        $this->params = $params;
-    }
-
-
-    public function handle()
-    {
-        try {
-            var_dump("消费者");
-            $collector = new CollectorController();
-            $result = $collector->goSendCrawler($this->params);
-            var_dump("消费消息队列:",$this->params,$result);
-        }catch (\Exception $e){
-            var_dump($e->getMessage());
-        }
-    }
-}

+ 15 - 10
app/Job/ImportExampleJob.php

@@ -12,7 +12,7 @@ class ImportExampleJob extends Job
     /**
      * 任务执行失败后的重试次数,即最大执行次数为 $maxAttempts+1 次
      */
-    protected int $maxAttempts = 3;
+    protected int $maxAttempts = 10;
 
     public function __construct($params)
     {
@@ -21,15 +21,20 @@ class ImportExampleJob extends Job
     }
     public function handle()
     {
-        try {
-            //冯蕊自己修改
-            $collector = new CollectorController();
-            $result = $collector->goSendCrawler($this->params);
-            var_dump("消费消息队列:",$this->params,$result);
-        }catch (\Exception $e){
-            var_dump($e->getMessage());
-        }
+        // if(isset($data['admin_user_id'])){
+ 
+        // }else{
 
-    }
+            try {
+                var_dump("============",$this->params);
+                $collector = new CollectorController();
+                $result = $collector->goaddArt($this->params);
+                var_dump("消费消息队列:",$this->params,$result);
+            }catch (\Exception $e){
+                var_dump($e->getMessage());
+            }
+            // var_dump($$this->params);
+        // }
 
+    }
 }

+ 11 - 0
app/JsonRpc/AdService.php

@@ -97,4 +97,15 @@ class AdService extends AbstractServiceClient implements AdServiceInterface
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getAdPlaceInfo(int $id)
+    {
+        return $this->__request(__FUNCTION__, compact('id'));
+    }
+
+
 }

+ 7 - 0
app/JsonRpc/AdServiceInterface.php

@@ -56,4 +56,11 @@ interface AdServiceInterface
      * @return mixed
      */
     public function delAdPlace(array $data);
+
+    /**
+     * 获取广告位详情
+     * @param int $id
+     * @return mixed
+     */
+    public function getAdPlaceInfo(int $id);
 }

+ 76 - 222
app/JsonRpc/ChatService.php

@@ -18,328 +18,182 @@ class ChatService extends AbstractServiceClient implements ChatServiceInterface
     protected string $protocol = 'jsonrpc-http';
 
     /**
+     * 添加申请
      * @param array $data
-     * @return array|mixed
+     * @return mixed
      */
-    public function getChatChannelList(array $data)
+    public function addFriend(array $data): mixed
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function delChatChannel(array $data)
+    public function getFriendsList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function addChatChannel(array $data)
+    public function applyFriend(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 添加申请
-     * @param array $data
-     * @return array
-     */
-    public function addContactApply(array $data)
+    public function delFriend(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 更新申请
-     * @param array $data
-     * @return array
-     */
-    public function updateContactApply(array $data)
+    public function getFriendInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 好友申请列表
-     * @param array $data
-     * @return array
-     */
-    public function getContactApplyList(array $data)
+    public function isFriend(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 好有查询
-     * @param array $data
-     * @return array
-     */
-    public function getContactList(array $data)
+    public function updateFriend(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 添加好友
-     * @param array $data
-     * @return array
-     */
-    public function addContact(array $data)
+    public function searchFriend(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 更新好友
-     * @param array $data
-     * @return array
-     */
-    public function updateContact(array $data)
+    public function addChatRecords(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 删除好友
-     * @param array $data
-     * @return array
-     */
-    public function delContact(array $data)
+    public function getChatRecords(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
 
-    /**
-     * 会话列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkSessionList(array $data)
+    public function getConversation(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 添加会话
-     * @param array $data
-     * @return array
-     */
-    public function addTalkSession(array $data)
+    public function getGroupMembers(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 更新会话
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkSession(array $data)
+    public function getGroupInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 删除会话
-     * @param array $data
-     * @return array
-     */
-    public function delTalkSession(array $data)
+    public function getGroupList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-
-    /**
-     * 聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function getTalkRecordsList(array $data)
+    public function addGroup(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 添加聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function addTalkRecords(array $data)
+    public function addGroupMembers(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 更新聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkRecords(array $data)
+    public function delGroupMember(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 删除聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function delTalkRecords(array $data)
+    public function getChatGroupList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-
-    /**
-     * 聊天内容-附件列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkRecordsFileList(array $data)
+    public function getFriendsApplyList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 聊天内容-添加附件
-     * @param array $data
-     * @return array
-     */
-    public function addTalkRecordsFile(array $data)
+    public function updateGroup(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 聊天内容 - 更新附件
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkRecordsFile(array $data)
+    public function quitGroup(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 聊天内容 - 删除附件
-     * @param array $data
-     * @return array
-     */
-    public function delTalkRecordsFile(array $data)
+    public function joinGroup(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 群组 - 群列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkGroupList(array $data)
+    public function getGroupApplyList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 群组 - 创建群
-     * @param array $data
-     * @return array
-     */
-    public function addTalkGroup(array $data)
+    public function delGroup(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 群组 - 更新群
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkGroup(array $data)
+    public function delGroupMembers(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
 
-    /**
-     * 群组 - 删除群
-     * @param array $data
-     * @return array
-     */
-    public function delTalkGroup(array $data)
+    public function getGroupMemberInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-
-    /**
-     * 群组 - 群用户列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkGroupMember(array $data)
+    public function getTopicsList(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 群组 - 全部群用户列表
-     * @param array $data
-     * @return array
-     */
-    public function getAllTalkGroupMember(array $data)
+    public function addTopic(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    /**
-     * 群组 - 创建群用户
-     * @param array $data
-     * @return array
-     */
-    public function addTalkGroupMember(array $data)
+    public function updateTopic(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 群组 - 更新群用户
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkGroupMember(array $data)
+    public function delTopic(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * 群组 - 删除群用户
-     * @param array $data
-     * @return array
-     */
-    public function delTalkGroupMember(array $data)
+    public function getTopicInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * @param array $data
-     * @return array|mixed
-     */
-    public function addTalkSessionAssociation(array $data)
+    public function addReply(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
-    /**
-     * @param array $data
-     * @return array|mixed
-     */
-    public function updateTalkSessionAssociation(array $data)
+    public function getTopicReply(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    
-
-
-}
+    public function getGroupChatRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateGroupMembers(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function clearRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function recallRecord(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function clearGroupRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getRecord(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delReply(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delAllReply(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getTopicsListAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 46 - 222
app/JsonRpc/ChatServiceInterface.php

@@ -1,228 +1,52 @@
 <?php
 
 namespace App\JsonRpc;
+
 interface ChatServiceInterface
 {
     /**
-     * @param array $data
-     * @return array
-     */
-    public function getChatChannelList(array $data);
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function delChatChannel(array $data);
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function addChatChannel(array $data);
-
-    /**
-     * 添加申请
-     * @param array $data
-     * @return array
-     */
-    public function addContactApply(array $data);
-
-    /**
-     * 更新申请
-     * @param array $data
-     * @return array
-     */
-    public function updateContactApply(array $data);
-
-    /**
-     * 好友申请列表
-     * @param array $data
-     * @return array
-     */
-    public function getContactApplyList(array $data);
-
-    /**
-     * 好有查询
-     * @param array $data
-     * @return array
-     */
-    public function getContactList(array $data);
-    /**
-     * 添加好友
-     * @param array $data
-     * @return array
-     */
-    public function addContact(array $data);
-
-    /**
-     * 更新好友
-     * @param array $data
-     * @return array
-     */
-    public function updateContact(array $data);
-
-    /**
-     * 删除好友
-     * @param array $data
-     * @return array
-     */
-    public function delContact(array $data);
-
-    /**
-     * 会话列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkSessionList(array $data);
-    /**
-     * 添加会话
-     * @param array $data
-     * @return array
-     */
-    public function addTalkSession(array $data);
-
-    /**
-     * 更新会话
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkSession(array $data);
-
-    /**
-     * 删除会话
-     * @param array $data
-     * @return array
-     */
-    public function delTalkSession(array $data);
-
-
-    /**
-     * 聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function getTalkRecordsList(array $data);
-    /**
-     * 添加聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function addTalkRecords(array $data);
-
-    /**
-     * 更新聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkRecords(array $data);
-
-    /**
-     * 删除聊天内容
-     * @param array $data
-     * @return array
-     */
-    public function delTalkRecords(array $data);
-
-
-    /**
-     * 聊天内容-附件列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkRecordsFileList(array $data);
-    /**
-     * 聊天内容-添加附件
-     * @param array $data
-     * @return array
-     */
-    public function addTalkRecordsFile(array $data);
-
-    /**
-     * 聊天内容 - 更新附件
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkRecordsFile(array $data);
-
-    /**
-     * 聊天内容 - 删除附件
-     * @param array $data
-     * @return array
-     */
-    public function delTalkRecordsFile(array $data);
-
-    /**
-     * 群组 - 群列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkGroupList(array $data);
-    /**
-     * 群组 - 创建群
-     * @param array $data
-     * @return array
-     */
-    public function addTalkGroup(array $data);
-
-    /**
-     * 群组 - 更新群
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkGroup(array $data);
-
-    /**
-     * 群组 - 删除群
-     * @param array $data
-     * @return array
-     */
-    public function delTalkGroup(array $data);
-
-
-    /**
-     * 群组 - 群用户列表
-     * @param array $data
-     * @return array
-     */
-    public function getTalkGroupMember(array $data);
-    /**
-     * 群组 - 全部群用户列表
-     * @param array $data
-     * @return array
-     */
-    public function getAllTalkGroupMember(array $data);
-    /**
-     * 群组 - 创建群用户
-     * @param array $data
-     * @return array
-     */
-    public function addTalkGroupMember(array $data);
-
-    /**
-     * 群组 - 更新群用户
-     * @param array $data
-     * @return array
-     */
-    public function updateTalkGroupMember(array $data);
-
-    /**
-     * 群组 - 删除群用户
-     * @param array $data
-     * @return array
-     */
-    public function delTalkGroupMember(array $data);
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function addTalkSessionAssociation(array $data);
-
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function updateTalkSessionAssociation(array $data);
-
-}
+     * 添加好友申请
+     * @param array $data
+     * @return array
+     */
+    public function addFriend(array $data);
+    public function getFriendsList(array $data);
+    public function applyFriend(array $data);
+    public function delFriend(array $data);
+    public function isFriend(array $data);
+    public function updateFriend(array $data);
+    public function searchFriend(array $data);
+    public function addChatRecords(array $data);
+    public function getConversation(array $data);
+    public function getChatRecords(array $data);
+    public function getGroupList(array $data);
+    public function getGroupInfo(array $data);
+    public function addGroup(array $data);
+    public function getGroupMembers(array $data);
+    public function getFriendsApplyList(array $data);
+    public function updateGroup(array $data);
+    public function delGroup(array $data);
+    public function quitGroup(array $data);
+    public function joinGroup(array $data);
+    public function delGroupMembers(array $data);
+    public function getFriendInfo(array $data);
+    public function getTopicsList(array $data);
+    public function addTopic(array $data);
+    public function updateTopic(array $data);
+    public function delTopic(array $data);
+    public function getTopicInfo(array $data);
+    public function addReply(array $data);
+    public function getTopicReply(array $data);
+    public function getGroupChatRecords(array $data);
+    public function updateGroupMembers(array $data);
+    public function clearRecords(array $data);
+    public function recallRecord(array $data);
+    public function clearGroupRecords(array $data);
+    public function delRecords(array $data);
+    public function getRecord(array $data);
+    public function getGroupApplyList(array $data);
+    public function delReply(array $data);
+    public function delAllReply(array $data);
+    public function getTopicsListAdmin(array $data);
+
+}

+ 106 - 0
app/JsonRpc/CollectorService.php

@@ -30,9 +30,66 @@ class CollectorService extends AbstractServiceClient implements CollectorService
      * @return array|mixed
      */
     public function getWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addRule(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getOneRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
      /**
      * @param array $data
      * @return array|mixed
@@ -41,4 +98,53 @@ class CollectorService extends AbstractServiceClient implements CollectorService
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getOneInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addCatid(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addArt(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 65 - 0
app/JsonRpc/CollectorServiceInterface.php

@@ -13,9 +13,74 @@ interface CollectorServiceInterface
      * @param array $data
      */
     public function getWeb(array $data);
+    /**
+     * @param array $data
+     */
+    public function upWeb(array $data);
+    /**
+     * @param array $data
+     */
+    public function delWeb(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getRule(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOneRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delRule(array $data);
+
      /**
      * @param array $data
      * @return mixed
      */
     public function sendCrawler(array $data);
+
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getInfo(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOneInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addCatid(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addArt(array $data);
 }

+ 9 - 0
app/JsonRpc/LinkService.php

@@ -53,4 +53,13 @@ class LinkService extends AbstractServiceClient implements LinkServiceInterface
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getLinkInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 5 - 1
app/JsonRpc/LinkServiceInterface.php

@@ -23,6 +23,10 @@ interface LinkServiceInterface
      */
     public function delLink(array $data);
 
-
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getLinkInfo(array $data);
 
 }

+ 1 - 1
app/JsonRpc/NewsService.php

@@ -128,7 +128,7 @@ class NewsService extends AbstractServiceClient implements NewsServiceInterface
 
     /**
      * @param array $data
-     * @return array
+     * @return mixed
      */
     public function getWebsiteArticlett(array $data)
     {

+ 4 - 3
app/JsonRpc/NewsServiceInterface.php

@@ -55,6 +55,7 @@ interface NewsServiceInterface
      * @return mixed
      */
     public function getCategoryInfo(array $data);
+
     /**
      * @param array $data
      *
@@ -62,13 +63,13 @@ interface NewsServiceInterface
     public function getWebsiteArticlett(array $data);
     /**
      * @param array $data
+     * @return mixed
      */
-    public function getWebsiteModelArticles(array $data);
-
+    public function upArticleStatus(array $data);
     /**
      * @param array $data
      * @return mixed
      */
-    public function upArticleStatus(array $data);
+    public function getWebsiteModelArticles(array $data);
 
 }

+ 1 - 2
app/JsonRpc/OrderService.php

@@ -16,7 +16,7 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
      * @var string
      */
     protected string $protocol = 'jsonrpc-http';
-
+   
     /**
      * @param array $data
      * @return mixed
@@ -65,7 +65,6 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
     /**
      * @param array $data
      * @return mixed

+ 2 - 1
app/JsonRpc/OrderServiceInterface.php

@@ -4,6 +4,7 @@ namespace App\JsonRpc;
 
 interface OrderServiceInterface
 {
+   
     /**
      * @param array $data
      */
@@ -40,7 +41,7 @@ interface OrderServiceInterface
      * @param array $data
      */
     public function delOrderAdmin(array $data);
-
+    
     /**
      * @param array $data
      */

+ 9 - 0
app/JsonRpc/UserService.php

@@ -157,4 +157,13 @@ class UserService extends AbstractServiceClient implements UserServiceInterface
 
         return $this->__request(__FUNCTION__, $data);
     }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function resetPassword(array $data){
+
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 6 - 0
app/JsonRpc/UserServiceInterface.php

@@ -108,4 +108,10 @@ interface UserServiceInterface
 
     public function upUserStatus(array $data);
 
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function resetPassword(array $data);
+
 }

+ 8 - 6
app/JsonRpc/WebsiteService.php

@@ -209,10 +209,12 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
     /**
      * @param array $data
      * @return array|mixed
      */
+
     public function getWebsiteAdvertisement(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
@@ -222,22 +224,27 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param array $data
      * @return array|mixed
      */
+
     public function selectWebsiteDepartment(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
     /**
      * @param array $data
      * @return mixed
      */
+
     public function selectWebsiteArea(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
     /**
      * @param array $data
      * @return mixed
      */
+
     public function getWebsiteModelCategory(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
@@ -247,6 +254,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param array $data
      * @return mixed
      */
+
     public function selectWebsiteLinks(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
@@ -255,10 +263,6 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
 
 
 
-
-
-
-
     /**
      * @param array $data
      * @return array|mixed
@@ -340,7 +344,6 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
         return $this->__request(__FUNCTION__, $data);
     }
 
-
     /**
      * @param array $data
      * @return array|mixed
@@ -448,5 +451,4 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-
 }

+ 12 - 9
app/JsonRpc/WebsiteServiceInterface.php

@@ -118,28 +118,28 @@ interface WebsiteServiceInterface
      */
     public function delWebsiteRoleUser(int $id);
 
+
     /**
      * @param array $data
      * @return mixed
      */
+
     public function getWebsiteId(array $data);
 
+
     /**
      * @param array $data
      * @return mixed
      *
      */
-    public function getWebsiteCategory(array $data);
-     
-
 
-
-
-    /**
+    public function getWebsiteCategory(array $data);
+     /**
      * @param array $data
      * @return mixed
      *
      */
+
     public function getWebsiteAdvertisement(array $data);
 
     /**
@@ -147,18 +147,23 @@ interface WebsiteServiceInterface
      * @return mixed
      *
      */
+
     public function selectWebsiteDepartment(array $data);
+
     /**
      * @param array $data
      * @return mixed
      *
      */
+
     public function selectWebsiteArea(array $data);
+
     /**
      * @param array $data
      * @return mixed
      *
      */
+
     public function getWebsiteModelCategory(array $data);
 
     /**
@@ -166,10 +171,8 @@ interface WebsiteServiceInterface
      * @return mixed
      *
      */
-    public function selectWebsiteLinks(array $data);
-
-
 
+    public function selectWebsiteLinks(array $data);
 
 
 

+ 2 - 1
app/Middleware/CorsMiddleware.php

@@ -15,7 +15,8 @@ class CorsMiddleware implements MiddlewareInterface
     public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
     {
         $response = Context::get(ResponseInterface::class);
-        $response = $response->withHeader('Access-Control-Allow-Origin', '*')
+        $response = $response
+            ->withHeader('Access-Control-Allow-Origin', '*')
             ->withHeader('Access-Control-Allow-Credentials', 'true')
             // Headers 可以根据实际情况进行改写。
             ->withHeader('Access-Control-Allow-Headers', '*');

+ 34 - 18
app/Service/RedisService.php

@@ -2,9 +2,6 @@
 
 namespace App\Service;
 
-use App\Cache\SocketFdBindUser;
-use App\Cache\SocketUserBindFds;
-
 /**
  * websocket关系存储
  *
@@ -15,6 +12,8 @@ class RedisService extends RedisInterface
     protected $prefix_fn = 'chat_fn';
     protected $prefix_user = 'chat_user';
     protected $prefix_user_info = 'userListInfo';
+    protected $prefix_user_friends = 'myFriends';
+    const SERVER_RUN_ID = 'prod'; // 替换为实际的值
     /**
      * 绑定fd和用户关系
      * @param string $fid
@@ -23,12 +22,12 @@ class RedisService extends RedisInterface
      * @return void
      * @throws \RedisException
      */
-    public function bind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
+    public function bind(string $fid, int $userId, $run_id = self::SERVER_RUN_ID)
     {
         //站点通道+用户
-        $this->redis->hSet($run_id,$this->prefix_fn.$fid,$userId);
+        $this->redis->hSet($run_id, $this->prefix_fn . $fid, $userId);
         //站点用户+通道
-        $this->redis->hSet($run_id,$this->prefix_user.$userId,$fid);
+        $this->redis->hSet($run_id, $this->prefix_user . $userId, $fid);
     }
 
     /**
@@ -39,11 +38,11 @@ class RedisService extends RedisInterface
      * @return void
      * @throws \RedisException
      */
-    public function unbind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
+    public function unbind(string $fid, int $userId, $run_id = self::SERVER_RUN_ID)
     {
-        $this->redis->hDel($run_id,$this->prefix_fn.$fid);
+        $this->redis->hDel($run_id, $this->prefix_fn . $fid);
 
-        $this->redis->hDel($run_id,$this->prefix_user.$userId);
+        $this->redis->hDel($run_id, $this->prefix_user . $userId);
     }
 
     /**
@@ -53,9 +52,9 @@ class RedisService extends RedisInterface
      * @return false|\Redis|string
      * @throws \RedisException
      */
-    public function findUser(string $fid, $run_id = SERVER_RUN_ID)
+    public function findUser(string $fid, $run_id = self::SERVER_RUN_ID)
     {
-        return $this->redis->hGet($run_id,$this->prefix_fn.$fid);
+        return $this->redis->hGet($run_id, $this->prefix_fn . $fid);
     }
 
     /**
@@ -65,9 +64,9 @@ class RedisService extends RedisInterface
      * @return false|\Redis|string
      * @throws \RedisException
      */
-    public function findFd(int $userId, $run_id = SERVER_RUN_ID)
+    public function findFd(int $userId, $run_id = self::SERVER_RUN_ID)
     {
-        return $this->redis->hGet($run_id,$this->prefix_user.$userId);
+        return $this->redis->hGet($run_id, $this->prefix_user . $userId);
     }
 
     /**
@@ -77,9 +76,9 @@ class RedisService extends RedisInterface
      * @return void
      * @throws \RedisException
      */
-    public function setUserInfo(string $userId,array $data)
+    public function setUserInfo(string $userId, array $data)
     {
-        $this->redis->hSet($this->prefix_user_info,$userId,json_encode($data));
+        $this->redis->hSet($this->prefix_user_info, $userId, json_encode($data));
     }
 
     /**
@@ -90,8 +89,25 @@ class RedisService extends RedisInterface
      */
     public function getUserInfo(string $userId)
     {
-        $this->redis->hGet($this->prefix_user_info,$userId);
+        $this->redis->hGet($this->prefix_user_info, $userId);
+    }
+    /**
+     * 获取用户好友列表
+     * @return mixed
+     * @throws \RedisException
+     */
+    public function getUserFriends(string $userId)
+    {
+        return $this->redis->hGet($this->prefix_user_friends, $userId);
+    }
+    /**
+     * 设置用户好友列表
+     * @return void
+     * @throws \RedisException
+     */
+    public function setUserFriends(string $userId, array $friends)
+    {
+        $this->redis->hSet($this->prefix_user_friends, $userId, json_encode($friends));
     }
 
-
-}
+}

+ 41 - 0
app/Service/Server/StreamServer.php

@@ -0,0 +1,41 @@
+<?php
+
+
+namespace App\Service\Server;
+
+
+use Hyperf\Dispatcher\HttpDispatcher;
+use Hyperf\ExceptionHandler\ExceptionHandlerDispatcher;
+use Hyperf\HttpServer\ResponseEmitter;
+use Hyperf\HttpServer\Server;
+use Psr\Container\ContainerInterface;
+use Swoole\Http\Request;
+use Swoole\Http\Response;
+
+class StreamServer extends Server
+{
+    const STREAM_URL = [
+        '/chat/stream'
+    ];
+    public function __construct(ContainerInterface $container, HttpDispatcher $dispatcher, ExceptionHandlerDispatcher $exceptionHandlerDispatcher, ResponseEmitter $responseEmitter)
+    {
+        parent::__construct($container, $dispatcher, $exceptionHandlerDispatcher, $responseEmitter);
+    }
+
+    /**
+     * @param Request $request
+     * @param Response $response
+     */
+    public function onRequest($request, $response): void
+    {
+        $pathInfo = $request->server['path_info'];
+        if (in_array($pathInfo, self::STREAM_URL)) {
+            $response->header('Content-Type', 'text/event-stream');
+            $response->header('Access-Control-Allow-Origin', '*');
+            $response->header('Access-Control-Allow-Methods', 'GET');
+            $response->header('Cache-Control', 'no-cache');
+            $response->header('Connection', 'keep-alive');
+        }
+        parent::onRequest($request, $response);
+    }
+}

+ 63 - 0
app/Tools/PublicData.php

@@ -6,6 +6,7 @@ use Hyperf\Context\ApplicationContext;
 class PublicData
 {
     /**
+     * ceshi-todo
      * 递归查询
      * @param $menuItems
      * @param $parentId
@@ -127,4 +128,66 @@ class PublicData
         }
     }
 
+    /**
+     * POST 请求
+     * @param string $url
+     * @param array $param
+     * @param boolean $post_file 是否文件上传
+     * @return string content
+     */
+    public static function http_post_zp($url, $data, $options = [])
+    {
+
+        // 初始化CURL会话
+        $ch = curl_init($url);
+        var_dump("参数:",$data);
+        // 设置CURL选项
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
+        curl_setopt($ch, CURLOPT_HEADER, false); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
+        curl_setopt($ch, CURLOPT_POST, true); // 发送一个常规的POST请求。
+        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // 要传递的POST数据,这里使用http_build_query将数组转换为URL编码的查询字符串。
+        $headers = [
+            'Authorization: Bearer be1856920c54ac537b530d69bc2eda73.gOO2BMq9NXavzEMq',
+            'Content-Type: application/json',
+//            'Custom-Header: customHeaderValue'
+        ];
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        // 如果有额外的CURL选项,则合并它们
+        if (!empty($options)) {
+            curl_setopt_array($ch, $options);
+        }
+
+        // 执行CURL会话并获取响应
+        $response = curl_exec($ch);
+        // 检查是否有CURL错误
+        if (curl_errno($ch)) {
+            $error_msg = curl_error($ch);
+            curl_close($ch);
+            throw new Exception("CURL Error: $error_msg");
+        }
+
+        // 获取HTTP状态码
+        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+        // 关闭CURL会话
+        curl_close($ch);
+
+        // 返回一个包含响应和HTTP状态码的数组
+        $responseBody = $response;
+        $headerEnd = strpos($response, "\r\n\r\n");
+
+        if ($headerEnd !== false) {
+            // 去除响应头,只保留响应体
+            $responseBody = substr($response, $headerEnd + 4); // +4 是因为 "\r\n\r\n" 有4个字符
+//            echo $responseBody; // 输出:This is the response body.
+        } else {
+            // 如果没有找到空行,可能响应格式不正确或没有响应头
+//            echo "No headers found in response.";
+        }
+        return [
+            'response' => $responseBody,
+            'http_code' => $http_code
+        ];
+    }
+
 }

+ 34 - 0
bin/hyperf.php

@@ -0,0 +1,34 @@
+#!/usr/bin/env php
+<?php
+/**
+ * This file is part of Hyperf.
+ *
+ * @link     https://www.hyperf.io
+ * @document https://hyperf.wiki
+ * @contact  group@hyperf.io
+ * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
+ */
+ini_set('display_errors', 'on');
+ini_set('display_startup_errors', 'on');
+ini_set('memory_limit', '1G');
+// ..................ID
+define('SERVER_RUN_ID', uniqid());
+define('EVENT_TALK','onTalk');
+define('EVENT_TALK_KEYBOARD', 'onKeyboard');
+error_reporting(E_ALL);
+
+! defined('BASE_PATH') && define('BASE_PATH', dirname(__DIR__, 1));
+
+require BASE_PATH . '/vendor/autoload.php';
+
+! defined('SWOOLE_HOOK_FLAGS') && define('SWOOLE_HOOK_FLAGS', Hyperf\Engine\DefaultOption::hookFlags());
+
+// Self-called anonymous function that creates its own scope and keep the global namespace clean.
+(function () {
+    Hyperf\Di\ClassLoader::init();
+    /** @var Psr\Container\ContainerInterface $container */
+    $container = require BASE_PATH . '/config/container.php';
+
+    $application = $container->get(Hyperf\Contract\ApplicationInterface::class);
+    $application->run();
+})();

+ 8 - 1
composer.json

@@ -16,6 +16,7 @@
         "death_satan/hyperf-validate": "^3.71",
         "doctrine/annotations": "^2.0",
         "easyswoole/verifycode": "3.x",
+        "friendsofhyperf/openai-client": "^3.1",
         "hyperf/amqp": "^3.1",
         "hyperf/async-queue": "^3.1",
         "hyperf/cache": "~3.1.0",
@@ -34,6 +35,7 @@
         "hyperf/logger": "^3.1",
         "hyperf/memory": "~3.1.0",
         "hyperf/nacos": "^3.1",
+        "hyperf/paginator": "^3.1",
         "hyperf/process": "~3.1.0",
         "hyperf/redis": "^3.1",
         "hyperf/rpc-client": "^3.1",
@@ -43,8 +45,10 @@
         "hyperf/service-governance-nacos": "^3.1",
         "hyperf/snowflake": "^3.1",
         "hyperf/translation": "^3.1",
+        "hyperf/utils": "^3.1",
         "hyperf/validation": "^3.1",
         "hyperf/websocket-server": "^3.1",
+        "openai-php/client": "^0.10.3",
         "phper666/jwt-auth": "^4.0"
     },
     "require-dev": {
@@ -79,7 +83,10 @@
     "prefer-stable": true,
     "config": {
         "optimize-autoloader": true,
-        "sort-packages": true
+        "sort-packages": true,
+        "allow-plugins": {
+            "php-http/discovery": true
+        }
     },
     "extra": [],
     "scripts": {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 469 - 106
composer.lock


+ 7 - 0
config/api/ad.php

@@ -8,13 +8,20 @@ use App\Middleware\Auth\FooMiddleware;
 Router::addGroup(
     '/ad', function () {
         Router::post('/createAd', [AdController::class, 'createAd']);
+        //添加广告位
         Router::post('/createAdPlace', [AdController::class, 'createAdPlace']);
         Router::get('/getAdInfo', [AdController::class, 'getAdInfo']);
+        //获取广告位详情
+        Router::get('/getAdPlaceInfo', [AdController::class, 'getAdPlaceInfo']);
+        //获取广告列表
         Router::get('/getAdList', [AdController::class, 'getAdList']);
         Router::post('/updateAd', [AdController::class, 'updateAd']);
         Router::post('/delAd', [AdController::class, 'delAd']);
+        //广告位列表
         Router::get('/getAdPlaceList', [AdController::class, 'getAdPlaceList']);
+        //修改广告位
         Router::post('/updateAdPlace', [AdController::class, 'updateAdPlace']);
+        //删除广告位
         Router::post('/delAdPlace', [AdController::class, 'delAdPlace']);
     },
     ['middleware' => [FooMiddleware::class]]

+ 49 - 9
config/api/chat.php

@@ -1,16 +1,56 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 use App\Controller\ChatController;
-use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\FooMiddleware;
+use Hyperf\HttpServer\Router\Router;
+
 Router::addGroup(
     '/chat', function () {
-            Router::get('/addContactApply', [ChatController::class, 'addContactApply']);
-            Router::post('/updateContactApply', [ChatController::class, 'updateContactApply']);
-            Router::get('/getTalkSessionList', [ChatController::class, 'getTalkSessionList']);
-            Router::post('/addTalkGroup', [ChatController::class, 'addTalkGroup']);
-        },
-       ['middleware' => [FooMiddleware::class]]
-);
+        Router::post('/addFriend', [ChatController::class, 'addFriend']);
+        Router::post('/getFriendsList', [ChatController::class, 'getFriendsList']);
+        Router::post('/getFriendsApplyList', [ChatController::class, 'getFriendsApplyList']);
+        Router::post('/applyFriend', [ChatController::class, 'applyFriend']);
+        Router::post('/delFriend', [ChatController::class, 'delFriend']);
+        Router::post('/isFriend', [ChatController::class, 'isFriend']);
+        Router::post('/updateFriend', [ChatController::class, 'updateFriend']);
+        Router::post('/searchFriend', [ChatController::class, 'searchFriend']);
+        Router::post('/getFriendInfo', [ChatController::class, 'getFriendInfo']);
+
+        Router::post('/getConversation', [ChatController::class, 'getConversation']);
+        Router::post('/getChatRecords', [ChatController::class, 'getChatRecords']);
+        Router::post('/getGroupChatRecords', [ChatController::class, 'getGroupChatRecords']);
 
+        Router::post('/delRecords', [ChatController::class, 'delRecords']);
+        Router::post('/clearRecords', [ChatController::class, 'clearRecords']);
+        Router::post('/clearGroupRecords', [ChatController::class, 'clearGroupRecords']);
+        Router::post('/recallRecord', [ChatController::class, 'recallRecord']);
+        Router::post('/getRecord', [ChatController::class, 'getRecord']);
+
+        Router::post('/getGroupMembers', [ChatController::class, 'getGroupMembers']);
+        Router::post('/getGroupInfo', [ChatController::class, 'getGroupInfo']);
+        Router::post('/getGroupList', [ChatController::class, 'getGroupList']);
+        Router::post('/addGroup', [ChatController::class, 'addGroup']); //创建群
+        Router::post('/delGroup', [ChatController::class, 'delGroup']);
+        Router::post('/updateGroup', [ChatController::class, 'updateGroup']);
+        Router::post('/quitGroup', [ChatController::class, 'quitGroup']);
+        Router::post('/joinGroup', [ChatController::class, 'joinGroup']);
+        Router::post('/updateGroupMembers', [ChatController::class, 'updateGroupMembers']);
+
+        Router::post('/getTopicsList', [ChatController::class, 'getTopicsList']);
+        Router::post('/addTopic', [ChatController::class, 'addTopic']);
+        Router::post('/updateTopic', [ChatController::class, 'updateTopic']);
+        Router::post('/delTopic', [ChatController::class, 'delTopic']);
+        Router::post('/getTopicInfo', [ChatController::class, 'getTopicInfo']);
+        Router::post('/addReply', [ChatController::class, 'addReply']);
+        Router::post('/getTopicReply', [ChatController::class, 'getTopicReply']);
+        Router::post('/topicType', [ChatController::class, 'topicType']);
+        Router::post('/topicStatus', [ChatController::class, 'topicStatus']);
+        Router::post('/delReply', [ChatController::class, 'delReply']);
+        Router::post('/delAllReply', [ChatController::class, 'delAllReply']);
+        Router::post('/getTopicsListAdmin', [ChatController::class, 'getTopicsListAdmin']);
+
+        Router::post('/uploadFile', [ChatController::class, 'uploadFile']);
+    },
+    ['middleware' => [FooMiddleware::class]]
+);

+ 27 - 13
config/api/collector.php

@@ -2,10 +2,14 @@
 
 declare(strict_types=1);
 
-use App\Controller\CollectorController;
+
 use App\Middleware\Auth\FooMiddleware;
 use Hyperf\HttpServer\Router\Router;
-
+use App\Controller\CollectorController;
+//智普测试接口
+Router::addGroup('/chat', function () {
+    Router::get('/stream', 'App\Controller\SseController@stream');
+});
 Router::addGroup(
     '/collector', function () {
         Router::get('/index', [CollectorController::class, 'index']);
@@ -13,35 +17,45 @@ Router::addGroup(
         //添加网站
         Router::post('/addWeb', [CollectorController::class, 'addWeb']);
         //修改网站
-        Router::get('/upWeb', [CollectorController::class, 'upWeb']);
+        Router::post('/upWeb', [CollectorController::class, 'upWeb']);
         //查看并搜索网站
-        Router::get('/getWeb', [CollectorController::class, 'getWeb']);
+        Router::post('/getWeb', [CollectorController::class, 'getWeb']);
         //删除网站
         Router::get('/delWeb', [CollectorController::class, 'delWeb']);
 
-        //查看任务
-        Router::get('/getRule', [CollectorController::class, 'getRule']);
-        //添加规则
-        Router::get('/addRule', [CollectorController::class, 'addRule']);
+        //查看并搜索任务
+        Router::post('/getRule', [CollectorController::class, 'getRule']);
+        //添加规则型任务
+        Router::post('/addRule', [CollectorController::class, 'addRule']);
+        //获取某个规则
+        Router::get('/getOneRule', [CollectorController::class, 'getOneRule']);
         //修改规则
-        Router::get('/upRule', [CollectorController::class, 'upRule']);
+        Router::post('/upRule', [CollectorController::class, 'upRule']);
         //删除规则
         Router::get('/delRule', [CollectorController::class, 'delRule']);
 
-        //采集数据
-        Router::get('/addInfo', [CollectorController::class, 'addInfo']);
+ 
+
+        //获取并搜索资讯
+        Router::post('/getInfo', [CollectorController::class, 'getInfo']);
+        //获取某个资讯
+        Router::get('/getOneInfo', [CollectorController::class, 'getOneInfo']);
         //修改资讯
-        Router::get('/upInfo', [CollectorController::class, 'upInfo']);
+        Router::post('/upInfo', [CollectorController::class, 'upInfo']);
         //删除资讯
         Router::get('/delInfo', [CollectorController::class, 'delInfo']);
 
+        //关联导航
+        Router::post('/addCatid', [CollectorController::class, 'addCatid']);
         //导入数据
         Router::get('/addArt', [CollectorController::class, 'addArt']);
         //关联导航
         Router::get('/addCatid', [CollectorController::class, 'addCatid']);
         //开始采集
         Router::post('/sendCrawler', [CollectorController::class, 'sendCrawler']);
-        
+        //智普测试接口
+        Router::post('/zhipu', [CollectorController::class, 'zhipu']);
+
     },
     ['middleware' => [FooMiddleware::class]]
 );

+ 6 - 0
config/api/link.php

@@ -7,10 +7,16 @@ use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\FooMiddleware;
 Router::addGroup(
     '/link', function () {
+        //获取友情链接 列表
         Router::get('/getLinkList', [LinkController::class, 'getLinkList']);
+        //创建友情链接
         Router::post('/createLink', [LinkController::class, 'createLink']);
+        //更新友情链接
         Router::post('/updateLink', [LinkController::class, 'updateLink']);
+        //删除友情链接
         Router::post('/delLink', [LinkController::class, 'delLink']);
+        //获取友情链接
+        Router::get('/getLinkInfo', [LinkController::class, 'getLinkInfo']);
     },
     ['middleware' => [FooMiddleware::class]]
 );

+ 2 - 2
config/api/login.php

@@ -1,9 +1,9 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 use Hyperf\HttpServer\Router\Router;
 Router::post('/api/login', 'App\Controller\LoginController@login');
 Router::post('/api/checkVerifyCode', 'App\Controller\LoginController@checkVerifyCode');
 
 Router::post('/api/registerOrLogin', 'App\Controller\LoginController@registerOrLogin');
-
+Router::post('/api/getToken', 'App\Controller\LoginController@getToken');

+ 11 - 9
config/api/order.php

@@ -7,27 +7,26 @@ use Hyperf\HttpServer\Router\Router;
 
 Router::addGroup(
     '/order', function () {
-        //测试
-        Router::get('/index', [OrderController::class, 'index']);
-
         //订单状态对应
-        Router::post('/getStauts', [OrderController::class, 'getStauts']);
+        Router::get('/getStauts', [OrderController::class, 'getStauts']);
+        
         //查询广告
         Router::post('/getAD', [OrderController::class, 'getAD']);
         //根据网站搜索广告
         Router::post('/getWebsiteAd', [OrderController::class, 'getWebsiteAd']);
         //添加订单
-
         Router::post('/addAD', [OrderController::class, 'addAD']);
+
         //获取订单列表
-        Router::post('/getOrderList', [OrderController::class, 'getOrderList']);
+        Router::get('/getOrderList', [OrderController::class, 'getOrderList']);
         //获取订单详情
-        Router::post('/getOrderDetail', [OrderController::class, 'getOrderDetail']);
+        Router::get('/getOrderDetail', [OrderController::class, 'getOrderDetail']);
         //撤回订单
-        Router::post('/cancelOrder', [OrderController::class, 'cancelOrder']);
+        Router::get('/cancelOrder', [OrderController::class, 'cancelOrder']);
         //删除广告
-        Router::post('/delOrderAD', [OrderController::class, 'delOrderAD']);
+        Router::get('/delOrderAD', [OrderController::class, 'delOrderAD']);
 
+        
         //后台管理
         //获取订单列表
         Router::post('/getOrderListAdmin', [OrderController::class, 'getOrderListAdmin']);
@@ -44,6 +43,8 @@ Router::addGroup(
         //删除订单
         Router::post('/delOrderAdmin', [OrderController::class, 'delOrderAdmin']);
 
+
+
         //获取广告列表
         Router::post('/getADList', [OrderController::class, 'getADList']);
         //获取广告详情
@@ -57,4 +58,5 @@ Router::addGroup(
 
     },
     ['middleware' => [FooMiddleware::class]]
+    
 );

+ 12 - 3
config/api/user.php

@@ -1,10 +1,11 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 
 use App\Controller\UserController;
-use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\FooMiddleware;
+use Hyperf\HttpServer\Router\Router;
+
 Router::addGroup(
     '/user', function () {
         Router::post('/createUser', [UserController::class, 'createUser']);
@@ -26,11 +27,19 @@ Router::addGroup(
         Router::post('/delRole', [UserController::class, 'delRole']);
         //更新角色
         Router::post('/updateRole', [UserController::class, 'updateRole']);
+
         Router::post('/changePassword', [UserController::class, 'changePassword']);
+
         //修改用户状态
         Router::post('/upUserStatus', [UserController::class, 'upUserStatus']);
 
+        Router::post('/getToken', [UserController::class, 'getToken']);
+
+
+        //重置密码
+        Router::post('/resetPassword', [UserController::class, 'resetPassword']);
+
+
     },
     ['middleware' => [FooMiddleware::class]]
 );
-

+ 12 - 7
config/autoload/amqp.php

@@ -1,20 +1,25 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 use function Hyperf\Support\env;
 return [
     'enable' => true,
     'default' => [
-        'host' =>  env('AMQP_HOST', '192.168.1.201'),
-        'port' =>  (int)env('AMQP_PORT', 5672),
-        'user' =>  env('AMQP_USER', 'admin'),
-        'password' =>  env('AMQP_PASSWORD', '123456'),
+        'host' => env('AMQP_HOST', '192.168.1.127'),
+        'port' => (int) env('AMQP_PORT', 5672),
+        'user' => env('AMQP_USER', 'guest'),
+        'password' => env('AMQP_PASSWORD', 'guest'),
         'vhost' => '/',
         'concurrent' => [
             'limit' => 1,
         ],
         'pool' => [
-            'connections' => 1,
+            'min_connections' => 1,
+            'max_connections' => 1, // 限制最大连接数为1
+            'connect_timeout' => 10.0,
+            'wait_timeout' => 3.0,
+            'heartbeat' => -1,
+            
         ],
         'params' => [
             'insist' => false,
@@ -33,5 +38,5 @@ return [
     ],
     'pool2' => [
 
-    ]
+    ],
 ];

+ 32 - 4
config/autoload/redis.php

@@ -19,11 +19,39 @@ return [
         'db' => (int) env('REDIS_DB', 0),
         'pool' => [
             'min_connections' => 1,
-            'max_connections' => 10,
-            'connect_timeout' => 10.0,
-            'wait_timeout' => 3.0,
+            'max_connections' => 100,
+            'connect_timeout' => 100000000.0,
+            'wait_timeout' => 30000000.0,
             'heartbeat' => -1,
-            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
+            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 6000000000),
         ],
+        'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class,
+        'redis' => [
+            'pool' => 'default'
+        ],
+        'channel' => '{queue:import}',
+        'timeout' => 20,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 100,
+        'concurrent' => [
+            'limit' => 10000,
+        ],
+        'max_messages' => 0,
+    ],
+    'import' => [
+        'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class,
+        'redis' => [
+            'pool' => 'default'
+        ],
+        'channel' => '{queue:import}',
+        'timeout' => 20,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 100,
+        'concurrent' => [
+            'limit' => 10000,
+        ],
+        'max_messages' => 0,
     ],
 ];

+ 2 - 1
config/autoload/server.php

@@ -23,7 +23,8 @@ return [
             'port' => 9501,
             'sock_type' => SWOOLE_SOCK_TCP,
             'callbacks' => [
-                Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
+                Event::ON_REQUEST => [App\Service\Server\StreamServer::class, 'onRequest'],
+//                Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
             ],
         ],
         [

+ 1 - 1
config/autoload/services.php

@@ -84,7 +84,7 @@ return [
             ],
         ],
         [
-            //采集服务
+            //采集服务
             'name' => 'CollectorService',
             'service' => \App\JsonRpc\CollectorServiceInterface::class,
 

+ 0 - 179
storage/languages/en/validation.php

@@ -1,179 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * This file is part of Hyperf.
- *
- * @link     https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact  group@hyperf.io
- * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
-return [
-    /*
-    |--------------------------------------------------------------------------
-    | Validation Language Lines
-    |--------------------------------------------------------------------------
-    |
-    | The following language lines contain the default error messages used by
-    | the validator class. Some of these rules have multiple versions such
-    | as the size rules. Feel free to tweak each of these messages here.
-    |
-    */
-
-    'accepted' => 'The :attribute must be accepted.',
-    'active_url' => 'The :attribute is not a valid URL.',
-    'after' => 'The :attribute must be a date after :date.',
-    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
-    'alpha' => 'The :attribute may only contain letters.',
-    'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.',
-    'alpha_num' => 'The :attribute may only contain letters and numbers.',
-    'array' => 'The :attribute must be an array.',
-    'before' => 'The :attribute must be a date before :date.',
-    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
-    'between' => [
-        'numeric' => 'The :attribute must be between :min and :max.',
-        'file' => 'The :attribute must be between :min and :max kilobytes.',
-        'string' => 'The :attribute must be between :min and :max characters.',
-        'array' => 'The :attribute must have between :min and :max items.',
-    ],
-    'boolean' => 'The :attribute field must be true or false.',
-    'confirmed' => 'The :attribute confirmation does not match.',
-    'date' => 'The :attribute is not a valid date.',
-    'date_format' => 'The :attribute does not match the format :format.',
-    'decimal' => 'The :attribute must have :decimal decimal places.',
-    'different' => 'The :attribute and :other must be different.',
-    'digits' => 'The :attribute must be :digits digits.',
-    'digits_between' => 'The :attribute must be between :min and :max digits.',
-    'dimensions' => 'The :attribute has invalid image dimensions.',
-    'distinct' => 'The :attribute field has a duplicate value.',
-    'email' => 'The :attribute must be a valid email address.',
-    'exists' => 'The selected :attribute is invalid.',
-    'file' => 'The :attribute must be a file.',
-    'filled' => 'The :attribute field is required.',
-    'gt' => [
-        'numeric' => 'The :attribute must be greater than :value',
-        'file' => 'The :attribute must be greater than :value kb',
-        'string' => 'The :attribute must be greater than :value characters',
-        'array' => 'The :attribute must be greater than :value items',
-    ],
-    'gte' => [
-        'numeric' => 'The :attribute must be great than or equal to :value',
-        'file' => 'The :attribute must be great than or equal to :value kb',
-        'string' => 'The :attribute must be great than or equal to :value characters',
-        'array' => 'The :attribute must be great than or equal to :value items',
-    ],
-    'image' => 'The :attribute must be an image.',
-    'in' => 'The selected :attribute is invalid.',
-    'in_array' => 'The :attribute field does not exist in :other.',
-    'integer' => 'The :attribute must be an integer.',
-    'ip' => 'The :attribute must be a valid IP address.',
-    'ipv4' => 'The :attribute must be a valid IPv4 address.',
-    'ipv6' => 'The :attribute must be a valid IPv6 address.',
-    'json' => 'The :attribute must be a valid JSON string.',
-    'list' => 'The :attribute must be a list.',
-    'lt' => [
-        'numeric' => 'The :attribute must be less than :value',
-        'file' => 'The :attribute must be less than :value kb',
-        'string' => 'The :attribute must be less than :value characters',
-        'array' => 'The :attribute must be less than :value items',
-    ],
-    'lte' => [
-        'numeric' => 'The :attribute must be less than or equal to :value',
-        'file' => 'The :attribute must be less than or equal to :value kb',
-        'string' => 'The :attribute must be less than or equal to :value characters',
-        'array' => 'The :attribute must be less than or equal to :value items',
-    ],
-    'max' => [
-        'numeric' => 'The :attribute may not be greater than :max.',
-        'file' => 'The :attribute may not be greater than :max kilobytes.',
-        'string' => 'The :attribute may not be greater than :max characters.',
-        'array' => 'The :attribute may not have more than :max items.',
-    ],
-    'mimes' => 'The :attribute must be a file of type: :values.',
-    'mimetypes' => 'The :attribute must be a file of type: :values.',
-    'min' => [
-        'numeric' => 'The :attribute must be at least :min.',
-        'file' => 'The :attribute must be at least :min kilobytes.',
-        'string' => 'The :attribute must be at least :min characters.',
-        'array' => 'The :attribute must have at least :min items.',
-    ],
-    'not_in' => 'The selected :attribute is invalid.',
-    'not_regex' => 'The :attribute cannot match a given regular rule.',
-    'numeric' => 'The :attribute must be a number.',
-    'present' => 'The :attribute field must be present.',
-    'regex' => 'The :attribute format is invalid.',
-    'required' => 'The :attribute field is required.',
-    'required_if' => 'The :attribute field is required when :other is :value.',
-    'required_unless' => 'The :attribute field is required unless :other is in :values.',
-    'required_with' => 'The :attribute field is required when :values is present.',
-    'required_with_all' => 'The :attribute field is required when :values is present.',
-    'required_without' => 'The :attribute field is required when :values is not present.',
-    'required_without_all' => 'The :attribute field is required when none of :values are present.',
-    'same' => 'The :attribute and :other must match.',
-    'size' => [
-        'numeric' => 'The :attribute must be :size.',
-        'file' => 'The :attribute must be :size kilobytes.',
-        'string' => 'The :attribute must be :size characters.',
-        'array' => 'The :attribute must contain :size items.',
-    ],
-    'starts_with' => 'The :attribute must be start with :values ',
-    'string' => 'The :attribute must be a string.',
-    'timezone' => 'The :attribute must be a valid zone.',
-    'unique' => 'The :attribute has already been taken.',
-    'uploaded' => 'The :attribute failed to upload.',
-    'url' => 'The :attribute format is invalid.',
-    'uuid' => 'The :attribute is invalid UUID.',
-    'max_if' => [
-        'numeric' => 'The :attribute may not be greater than :max when :other is :value.',
-        'file' => 'The :attribute may not be greater than :max kilobytes when :other is :value.',
-        'string' => 'The :attribute may not be greater than :max characters when :other is :value.',
-        'array' => 'The :attribute may not have more than :max items when :other is :value.',
-    ],
-    'min_if' => [
-        'numeric' => 'The :attribute must be at least :min when :other is :value.',
-        'file' => 'The :attribute must be at least :min kilobytes when :other is :value.',
-        'string' => 'The :attribute must be at least :min characters when :other is :value.',
-        'array' => 'The :attribute must have at least :min items when :other is :value.',
-    ],
-    'between_if' => [
-        'numeric' => 'The :attribute must be between :min and :max when :other is :value.',
-        'file' => 'The :attribute must be between :min and :max kilobytes when :other is :value.',
-        'string' => 'The :attribute must be between :min and :max characters when :other is :value.',
-        'array' => 'The :attribute must have between :min and :max items when :other is :value.',
-    ],
-    /*
-    |--------------------------------------------------------------------------
-    | Custom Validation Language Lines
-    |--------------------------------------------------------------------------
-    |
-    | Here you may specify custom validation messages for attributes using the
-    | convention "attribute.rule" to name the lines. This makes it quick to
-    | specify a specific custom language line for a given attribute rule.
-    |
-    */
-
-    'custom' => [
-        'attribute-name' => [
-            'rule-name' => 'custom-message',
-        ],
-    ],
-
-    /*
-    |--------------------------------------------------------------------------
-    | Custom Validation Attributes
-    |--------------------------------------------------------------------------
-    |
-    | The following language lines are used to swap attribute place-holders
-    | with something more reader friendly such as E-Mail Address instead
-    | of "email". This simply helps us make messages a little cleaner.
-    |
-    */
-
-    'attributes' => [],
-    'phone_number' => 'The :attribute must be a valid phone number',
-    'telephone_number' => 'The :attribute must be a valid telephone number',
-
-    'chinese_word' => 'The :attribute must contain valid characters(chinese/english character, number, underscore)',
-    'sequential_array' => 'The :attribute must be sequential array',
-];

+ 0 - 179
storage/languages/zh_CN/validation.php

@@ -1,179 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * This file is part of Hyperf.
- *
- * @link     https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact  group@hyperf.io
- * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
-return [
-    /*
-    |--------------------------------------------------------------------------
-    | Validation Language Lines
-    |--------------------------------------------------------------------------
-    |
-    | The following language lines contain the default error messages used by
-    | the validator class. Some of these rules have multiple versions such
-    | as the size rules. Feel free to tweak each of these messages here.
-    |
-    */
-
-    'accepted' => ':attribute 必须接受',
-    'active_url' => ':attribute 必须是一个合法的 URL',
-    'after' => ':attribute 必须是 :date 之后的一个日期',
-    'after_or_equal' => ':attribute 必须是 :date 之后或相同的一个日期',
-    'alpha' => ':attribute 只能包含字母',
-    'alpha_dash' => ':attribute 只能包含字母、数字、中划线或下划线',
-    'alpha_num' => ':attribute 只能包含字母和数字',
-    'array' => ':attribute 必须是一个数组',
-    'before' => ':attribute 必须是 :date 之前的一个日期',
-    'before_or_equal' => ':attribute 必须是 :date 之前或相同的一个日期',
-    'between' => [
-        'numeric' => ':attribute 必须在 :min 到 :max 之间',
-        'file' => ':attribute 必须在 :min 到 :max kb 之间',
-        'string' => ':attribute 必须在 :min 到 :max 个字符之间',
-        'array' => ':attribute 必须在 :min 到 :max 项之间',
-    ],
-    'boolean' => ':attribute 字符必须是 true 或 false, 1 或 0',
-    'confirmed' => ':attribute 二次确认不匹配',
-    'date' => ':attribute 必须是一个合法的日期',
-    'date_format' => ':attribute 与给定的格式 :format 不符合',
-    'decimal' => ':attribute 必须有 :decimal 位小数',
-    'different' => ':attribute 必须不同于 :other',
-    'digits' => ':attribute 必须是 :digits 位',
-    'digits_between' => ':attribute 必须在 :min 和 :max 位之间',
-    'dimensions' => ':attribute 具有无效的图片尺寸',
-    'distinct' => ':attribute 字段具有重复值',
-    'email' => ':attribute 必须是一个合法的电子邮件地址',
-    'exists' => '选定的 :attribute 是无效的',
-    'file' => ':attribute 必须是一个文件',
-    'filled' => ':attribute 的字段是必填的',
-    'gt' => [
-        'numeric' => ':attribute 必须大于 :value',
-        'file' => ':attribute 必须大于 :value kb',
-        'string' => ':attribute 必须大于 :value 个字符',
-        'array' => ':attribute 必须大于 :value 项',
-    ],
-    'gte' => [
-        'numeric' => ':attribute 必须大于等于 :value',
-        'file' => ':attribute 必须大于等于 :value kb',
-        'string' => ':attribute 必须大于等于 :value 个字符',
-        'array' => ':attribute 必须大于等于 :value 项',
-    ],
-    'image' => ':attribute 必须是 jpg, jpeg, png, bmp 或者 gif 格式的图片',
-    'in' => '选定的 :attribute 是无效的',
-    'in_array' => ':attribute 字段不存在于 :other',
-    'integer' => ':attribute 必须是个整数',
-    'ip' => ':attribute 必须是一个合法的 IP 地址',
-    'ipv4' => ':attribute 必须是一个合法的 IPv4 地址',
-    'ipv6' => ':attribute 必须是一个合法的 IPv6 地址',
-    'json' => ':attribute 必须是一个合法的 JSON 字符串',
-    'list' => ':attribute 必须是一个数组列表',
-    'lt' => [
-        'numeric' => ':attribute 必须小于 :value',
-        'file' => ':attribute 必须小于 :value kb',
-        'string' => ':attribute 必须小于 :value 个字符',
-        'array' => ':attribute 必须小于 :value 项',
-    ],
-    'lte' => [
-        'numeric' => ':attribute 必须小于等于 :value',
-        'file' => ':attribute 必须小于等于 :value kb',
-        'string' => ':attribute 必须小于等于 :value 个字符',
-        'array' => ':attribute 必须小于等于 :value 项',
-    ],
-    'max' => [
-        'numeric' => ':attribute 的最大值为 :max',
-        'file' => ':attribute 的最大为 :max kb',
-        'string' => ':attribute 的最大长度为 :max 字符',
-        'array' => ':attribute 至多有 :max 项',
-    ],
-    'mimes' => ':attribute 的文件类型必须是 :values',
-    'mimetypes' => ':attribute 的文件MIME必须是 :values',
-    'min' => [
-        'numeric' => ':attribute 的最小值为 :min',
-        'file' => ':attribute 大小至少为 :min kb',
-        'string' => ':attribute 的最小长度为 :min 字符',
-        'array' => ':attribute 至少有 :min 项',
-    ],
-    'not_in' => '选定的 :attribute 是无效的',
-    'not_regex' => ':attribute 不能匹配给定的正则',
-    'numeric' => ':attribute 必须是数字',
-    'present' => ':attribute 字段必须存在',
-    'regex' => ':attribute 格式是无效的',
-    'required' => ':attribute 字段是必须的',
-    'required_if' => ':attribute 字段是必须的当 :other 是 :value',
-    'required_unless' => ':attribute 字段是必须的,除非 :other 是在 :values 中',
-    'required_with' => ':attribute 字段是必须的当 :values 是存在的',
-    'required_with_all' => ':attribute 字段是必须的当 :values 是存在的',
-    'required_without' => ':attribute 字段是必须的当 :values 是不存在的',
-    'required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的',
-    'same' => ':attribute 和 :other 必须匹配',
-    'size' => [
-        'numeric' => ':attribute 必须是 :size',
-        'file' => ':attribute 必须是 :size kb',
-        'string' => ':attribute 必须是 :size 个字符',
-        'array' => ':attribute 必须包括 :size 项',
-    ],
-    'starts_with' => ':attribute 必须以 :values 为开头',
-    'string' => ':attribute 必须是一个字符串',
-    'timezone' => ':attribute 必须是个有效的时区',
-    'unique' => ':attribute 已存在',
-    'uploaded' => ':attribute 上传失败',
-    'url' => ':attribute 无效的格式',
-    'uuid' => ':attribute 无效的UUID格式',
-    'max_if' => [
-        'numeric' => '当 :other 为 :value 时 :attribute 不能大于 :max',
-        'file' => '当 :other 为 :value 时 :attribute 不能大于 :max kb',
-        'string' => '当 :other 为 :value 时 :attribute 不能大于 :max 个字符',
-        'array' => '当 :other 为 :value 时 :attribute 最多只有 :max 个单元',
-    ],
-    'min_if' => [
-        'numeric' => '当 :other 为 :value 时 :attribute 必须大于等于 :min',
-        'file' => '当 :other 为 :value 时 :attribute 大小不能小于 :min kb',
-        'string' => '当 :other 为 :value 时 :attribute 至少为 :min 个字符',
-        'array' => '当 :other 为 :value 时 :attribute 至少有 :min 个单元',
-    ],
-    'between_if' => [
-        'numeric' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 之间',
-        'file' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max kb 之间',
-        'string' => '当 :other 为 :value 时 :attribute 必须介于 :min - :max 个字符之间',
-        'array' => '当 :other 为 :value 时 :attribute 必须只有 :min - :max 个单元',
-    ],
-    /*
-    |--------------------------------------------------------------------------
-    | Custom Validation Language Lines
-    |--------------------------------------------------------------------------
-    |
-    | Here you may specify custom validation messages for attributes using the
-    | convention "attribute.rule" to name the lines. This makes it quick to
-    | specify a specific custom language line for a given attribute rule.
-    |
-    */
-
-    'custom' => [
-        'attribute-name' => [
-            'rule-name' => 'custom-message',
-        ],
-    ],
-
-    /*
-    |--------------------------------------------------------------------------
-    | Custom Validation Attributes
-    |--------------------------------------------------------------------------
-    |
-    | The following language lines are used to swap attribute place-holders
-    | with something more reader friendly such as E-Mail Address instead
-    | of "email". This simply helps us make messages a little cleaner.
-    |
-    */
-
-    'attributes' => [],
-    'phone_number' => ':attribute 必须为一个有效的电话号码',
-    'telephone_number' => ':attribute 必须为一个有效的手机号码',
-
-    'chinese_word' => ':attribute 必须包含以下有效字符 (中文/英文,数字, 下划线)',
-    'sequential_array' => ':attribute 必须是一个有序数组',
-];

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно