Explorar o código

Merge branch '20241106_lj_chat' into pre

AI hai 3 meses
pai
achega
bca0b5a784

+ 2 - 0
.gitignore

@@ -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;
     }
 }

+ 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');
+    }
+}

+ 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']);
+    }
+    
+}

+ 24 - 2
app/Controller/LoginController.php

@@ -56,7 +56,8 @@ class LoginController extends AbstractController
         if (empty($code)) {
             return Result::error("验证码已过期");
         }
-//        var_dump("验证码:", $code);
+        var_dump("验证码:", $code);
+        var_dump((strtolower($code) . strtolower($reqData['captcha'])));
         if (strtolower($code) != strtolower($reqData['captcha'])) {
             return Result::error("验证码错误");
         }
@@ -86,7 +87,7 @@ class LoginController extends AbstractController
             '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'],
         ];
@@ -242,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()
     {

+ 7 - 2
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) {

+ 200 - 60
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,78 +39,222 @@ 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);
@@ -129,15 +267,17 @@ class WebSocketController  implements OnMessageInterface, OnOpenInterface, OnClo
 //        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'],
             ],
         ]));
     }

+ 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);
+
+}

+ 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));
     }
 
-
-}
+}

+ 1 - 0
composer.json

@@ -43,6 +43,7 @@
         "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",
         "phper666/jwt-auth": "^4.0"

+ 4 - 0
composer.lock

@@ -4,7 +4,11 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
+<<<<<<< HEAD
     "content-hash": "408b8e53c4a0d313ed75355b91296895",
+=======
+    "content-hash": "4a54c2fdd37817347cb2a2874b90a274",
+>>>>>>> 20241106_lj_chat
     "packages": [
         {
             "name": "carbonphp/carbon-doctrine-types",

+ 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]]
+);

+ 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');

+ 4 - 4
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']);
@@ -31,8 +32,7 @@ Router::addGroup(
         Router::post('/upUserStatus', [UserController::class, 'upUserStatus']);
         //重置密码
         Router::post('/resetPassword', [UserController::class, 'resetPassword']);
-
+        Router::post('/getToken', [UserController::class, 'getToken']);
     },
     ['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' => [
 
-    ]
+    ],
 ];

+ 672 - 0
runtime/container/proxy/App_Controller_ChatController.proxy.php

@@ -0,0 +1,672 @@
+<?php
+
+declare (strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\ChatServiceInterface;
+use App\JsonRpc\UserServiceInterface;
+use App\Service\RedisService;
+use App\Tools\PublicData;
+use App\Tools\Result;
+use function Hyperf\Support\env;
+use Hyperf\Context\Context;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+/**
+ *
+ * Class ChatController
+ * @package App\Controller
+ */
+//#[AutoController]
+class ChatController extends AbstractController
+{
+    use \Hyperf\Di\Aop\ProxyTrait;
+    use \Hyperf\Di\Aop\PropertyHandlerTrait;
+    function __construct()
+    {
+        if (method_exists(parent::class, '__construct')) {
+            parent::__construct(...func_get_args());
+        }
+        $this->__handlePropertyHandler(__CLASS__);
+    }
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var ChatServiceInterface
+     */
+    #[Inject]
+    private $chatServiceClient;
+    #[Inject]
+    private UserServiceInterface $userServiceClient;
+    /**
+     * 申请添加好友
+     * @return array
+     */
+    public function addFriend()
+    {
+        $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");
+        //判断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);
+        //redis 添加好友
+        if ($result && $result['code'] != 0) {
+            $redisClient = new RedisService();
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
+            $redisClient->setUserFriends($userId, $myFriends['data']);
+        }
+        return $result ? Result::success($result['message']) : Result::error($result['message']);
+    }
+    /**
+     * 话题分类
+     * @return array
+     */
+    public function topicType()
+    {
+        $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 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 getFriendInfo()
+    {
+        $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->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();
+        // 定义验证规则
+        $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");
+        $result = $this->chatServiceClient->applyFriend($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除好友
+     * @return array
+     */
+    public function delFriend()
+    {
+        $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->delFriend($requireData);
+        //redis 删除好友
+        if ($result && $result['code'] != 0) {
+            $redisClient = new RedisService();
+            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $requireData['user_id'], 'status' => 2]);
+            $redisClient->setUserFriends($requireData['user_id'], $myFriends['data']);
+        }
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 是否好友
+     * @return array
+     */
+    public function isFriend()
+    {
+        $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->isFriend($requireData);
+        return $result && $result['code'] != 0 ? 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 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 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 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']);
+    }
+    /**
+     * 获取群成员列表
+     * @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']);
+    }
+    /**
+     * 获取群信息
+     * @return array
+     */
+    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_name.required' => '群名称不能为空', 'group_desc.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不能为空']);
+        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|string', 'content' => 'required|string'], ['title.required' => '商圈名称不能为空', 'type.required' => '商圈类型不能为空', 'content.required' => '商圈内容不能为空']);
+        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'], ['topic_id.required' => '商圈ID不能为空']);
+        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']);
+    }
+    /**-=-------------------------------------------------------
+     * 获取好友列表
+     * @return array
+     */
+    public function getContactList()
+    {
+        $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']);
+    }
+    /**
+     * 获取会话列表
+     * @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 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 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 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']);
+    }
+    /**
+     * 获取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);
+    }
+    /**
+     * 获取 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);
+    }
+}

+ 217 - 0
runtime/container/proxy/App_Controller_LoginController.proxy.php

@@ -0,0 +1,217 @@
+<?php
+
+declare (strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\UserServiceInterface;
+use App\Tools\CommonService;
+use App\Tools\PublicData;
+use App\Tools\Result;
+use function Hyperf\Support\env;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Phper666\JWTAuth\JWT;
+/**
+ * @AutoController()
+ */
+class LoginController extends AbstractController
+{
+    use \Hyperf\Di\Aop\ProxyTrait;
+    use \Hyperf\Di\Aop\PropertyHandlerTrait;
+    function __construct()
+    {
+        if (method_exists(parent::class, '__construct')) {
+            parent::__construct(...func_get_args());
+        }
+        $this->__handlePropertyHandler(__CLASS__);
+    }
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var UserServiceInterface
+     */
+    #[Inject]
+    private $userServiceClient;
+    public function login(Jwt $jwt)
+    {
+        //        $this->logger->info("验证之前");
+        $reqData = $this->request->all();
+        $validator = $this->validationFactory->make($reqData, ['username' => 'required', 'password' => 'required', 'type' => 'required'], ['username.required' => '用户名不能为空', 'password.required' => '密码不能为空', 'type.required' => '登录方式必填']);
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $comm = new CommonService();
+        $ip = $comm->userIp();
+        $redis = $this->container->get(\Hyperf\Redis\Redis::class);
+        $code = $redis->get('code' . $ip);
+        if (empty($code)) {
+            return Result::error("验证码已过期");
+        }
+        var_dump("验证码:", $code);
+        var_dump(strtolower($code) . strtolower($reqData['captcha']));
+        if (strtolower($code) != strtolower($reqData['captcha'])) {
+            // return Result::error("验证码错误");
+        }
+        //$reqData
+        $where = [];
+        if ($reqData['type'] == 1) {
+            //密码登录
+            $where = ['user_name' => $reqData['username']];
+        }
+        //        $this->logger->info("验证之前");
+        $userInfos = $this->userServiceClient->verifyUserInfo($where);
+        if ($userInfos['code'] == 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("用户名或密码错误");
+        }
+        $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'],
+            'level_id' => $userInfos['data']['level_id'],
+            'type_id' => $userInfos['data']['type_id'],
+        ];
+        var_dump($userData);
+        // 使用默认场景登录
+        $token = $jwt->getToken('default', $userData);
+        $data = ['token' => $token->toString(), 'exp' => $jwt->getTTL($token->toString())];
+        return Result::success($data);
+    }
+    /**
+     * @return void
+     */
+    public function checkVerifyCode(Jwt $jwt)
+    {
+        //其它信息暂时不管 先以openid
+        $reqData = $this->request->all();
+        $validator = $this->validationFactory->make($reqData, ['token' => 'required'], ['token.required' => 'token不能为空']);
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $userInfo = $jwt->getClaimsByToken($reqData['token']);
+        if ($userInfo) {
+            return Result::success(['token' => $reqData['token']]);
+        } else {
+            return Result::error("token无效");
+        }
+    }
+    /**
+     * 注册或登陆
+     * @return void
+     */
+    public function registerOrLogin(Jwt $jwt)
+    {
+        //获取access_token
+        $reqData = $this->request->all();
+        $validator = $this->validationFactory->make($reqData, ['code' => 'required'], ['code.required' => 'code不能为空']);
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $url = env("WECHAT") . "cgi-bin/token?appid=" . env("APPID") . "&secret=" . env("APP_SECRET") . "&grant_type=client_credential";
+        $result = PublicData::http_get($url);
+        $accessTokenData = json_decode($result, true);
+        //获取openid
+        $url = env("WECHAT") . "sns/jscode2session?appid=" . env("APPID") . "&secret=" . env("APP_SECRET") . "&js_code=" . $reqData['loginCode'] . "&grant_type=authorization_code";
+        $result = PublicData::http_get($url);
+        $openInfoData = json_decode($result, true);
+        if (isset($openInfoData['errcode']) && in_array($openInfoData['errcode'], [40163, 40029])) {
+            return Result::error($openInfoData['errmsg']);
+        }
+        $data = ['code' => $reqData['code'], 'openid' => $openInfoData['openid']];
+        // 将数组转换为JSON字符串
+        $jsonData = json_encode($data);
+        // 初始化cURL会话
+        $ch = curl_init(env("WECHAT") . "wxa/business/getuserphonenumber?access_token=" . $accessTokenData['access_token']);
+        // 设置cURL选项 Todo 这里有一万个wc 封装成post方法就报错,后期再研究
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($jsonData)]);
+        // 执行cURL会话
+        $response = curl_exec($ch);
+        // 检查是否有错误发生
+        if (curl_errno($ch)) {
+            return Result::error("获取手机号失败");
+        }
+        // 关闭cURL会话
+        curl_close($ch);
+        $response = json_decode($response, true);
+        if ($response['errcode'] == '40029') {
+            return Result::error($openInfoData['errmsg']);
+        }
+        // 打印响应内容
+        var_dump($openInfoData, $response);
+        //根据openid 获取token
+        $checkUserInfo = $this->userServiceClient->verifyUserInfo(['user_name' => $response['phone_info']['purePhoneNumber']]);
+        if ($checkUserInfo['code'] == 0) {
+            $salt = rand(1, 999999);
+            $createUserData = ['user_name' => $response['phone_info']['purePhoneNumber'], 'salt' => $salt, 'password' => $openInfoData['openid']];
+            $checkUserInfo = $this->userServiceClient->createUser($createUserData);
+        }
+        //根据openid和手机号判断是否注册,未注册直接注册
+        $wechatReqData = ['openid' => $openInfoData['openid'], 'purePhoneNumber' => $response['phone_info']['purePhoneNumber']];
+        $wechatInfo = $this->userServiceClient->getWechatInfo($wechatReqData);
+        if ($wechatInfo['code'] == 0) {
+            $wechatData = ['openid' => $openInfoData['openid'], 'phoneNumber' => $response['phone_info']['phoneNumber'], 'purePhoneNumber' => $response['phone_info']['purePhoneNumber'], 'countryCode' => $response['phone_info']['countryCode'], 'watermark' => json_encode($response['phone_info']['watermark']), 'user_id' => $checkUserInfo['data']['id']];
+            $this->userServiceClient->addWechatInfo($wechatData);
+        }
+        var_dump($checkUserInfo);
+        $userData = [
+            'uid' => $checkUserInfo['data']['id'],
+            // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
+            'user_name' => $response['phone_info']['phoneNumber'],
+            'mobile' => $checkUserInfo['data']['mobile'] ?? '',
+            'email' => $checkUserInfo['data']['email'],
+            //            'rong_token' => $userInfos['data']['rong_token'],
+            'level_id' => $checkUserInfo['data']['level_id'],
+            'type_id' => $checkUserInfo['data']['type_id'],
+        ];
+        // 使用默认场景登录
+        $token = $jwt->getToken('default', $userData);
+        $data = ['token' => $token->toString(), 'exp' => $jwt->getTTL($token->toString())];
+        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()
+    {
+    }
+    # http头部必须携带token才能访问的路由
+    public function getData(Jwt $jwt)
+    {
+        //        var_dump($this->UserId);
+        $h = $this->request->getHeaders();
+        //        var_dump($this->request->getHeaders());
+        //        $a= 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwicm9sZV9pZCI6MSwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjo4LCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82Njc1MjJkZDQ3YWYxMi41MTE5MjI5MiIsImlhdCI6MTcxODk1MjY2OSwibmJmIjoxNzE4OTUyNjY5LCJleHAiOjE3MjE1NDQ2Njl9.e0JW8fgNrwBdFgmQ8GNtES2ME1SbcbIih5MsQWzT6sk';
+        $arr = $jwt->getClaimsByToken($h['token'][0]);
+        var_dump($h['token'][0], "+++++++++++", $arr, "===####");
+        return $this->response->json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
+    }
+}

+ 417 - 0
runtime/container/proxy/App_Controller_PublicController.proxy.php

@@ -0,0 +1,417 @@
+<?php
+
+declare (strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\PublicRpcServiceInterface;
+use App\Tools\CommonService;
+use App\Tools\PublicData;
+use App\Tools\Result;
+use function Hyperf\Support\env;
+use Hyperf\Context\Context;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use ZipArchive;
+/**
+ * Class PublicController
+ * @package App\Controller
+ */
+//#[AutoController]
+class PublicController extends AbstractController
+{
+    use \Hyperf\Di\Aop\ProxyTrait;
+    use \Hyperf\Di\Aop\PropertyHandlerTrait;
+    function __construct()
+    {
+        if (method_exists(parent::class, '__construct')) {
+            parent::__construct(...func_get_args());
+        }
+        $this->__handlePropertyHandler(__CLASS__);
+    }
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var PublicRpcServiceInterface
+     */
+    #[Inject]
+    private $publicServiceClient;
+    /**
+     * 地区
+     * @return array
+     */
+    public function getDistrictList()
+    {
+        $pid = $this->request->input("pid", 0);
+        $data = ['pid' => $pid];
+        $result = $this->publicServiceClient->getDistrictList($data);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取用户等级
+     * @return array
+     */
+    public function getUserLevelList()
+    {
+        $requireData = $this->request->all();
+        $result = $this->publicServiceClient->getUserLevelList($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 上传图片
+     * @return array
+     */
+    public function uploadFile()
+    {
+        $urlN = new CommonService();
+        $file = $this->request->file('file');
+        $fileName = $file->getClientFilename();
+        try {
+            if ($file == null) {
+                return Result::error("未找到上传文件");
+            }
+            $data = CommonService::uploadFile($file, ['png', 'jpg', 'png', 'jpeg', 'gif', 'xls', 'xlsx', 'pdf', 'xls', 'xlsx', 'doc', 'docx', 'ppt', 'zip', 'pptx', 'mp4', 'flv'], 'image');
+            $data['imgUrl'] = $urlN->imgUrl($data['src']);
+            $data['oldFileName'] = $fileName;
+            return Result::success($data, '上传成功');
+        } catch (\Exception $e) {
+            return Result::error($e->getMessage());
+        }
+    }
+    /**
+     * 添加用户等级
+     * @return array
+     */
+    public function addUserLevel()
+    {
+        $requireData = $this->request->all();
+        $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_level' => 'required', 'type' => 'required', 'name' => 'required', 'mobile' => 'required', 'describe' => 'required', 'type_level' => 'required'], ['title.required' => '标题不能为空', 'nature.required' => '性质不能为空', 'nature_level.required' => '进度不能为空', 'type.required' => '类型不能为空', 'name.required' => '姓名不能为空', 'mobile.required' => '手机号码不能为空', 'describe.required' => '详细说明不能为空', 'type_level.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");
+        var_dump("用户id:", Context::get("UserId"));
+        if (isset($requireData['is_admin']) && !empty($requireData['is_admin'])) {
+            unset($requireData['user_id']);
+        }
+        $result = $this->publicServiceClient->getLetterOfComplaint($requireData);
+        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();
+        $result = $this->publicServiceClient->getLetterType($requireData);
+        $rep = PublicData::buildMenuTree($result['data']);
+        return $rep ? Result::success($rep) : 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->upZhinengbumen($requireData);
+        return $result['code'] == 200 ? Result::success() : Result::error("修改失败");
+    }
+}

+ 1 - 0
runtime/container/scan.cache

@@ -0,0 +1 @@
+a:3:{i:0;a:0:{}i:1;a:0:{}i:2;a:0:{}}

+ 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 必须是一个有序数组',
-];