Sfoglia il codice sorgente

同步origin/master分支的app, config文件夹到pre分支

the_bug 5 mesi fa
parent
commit
c21dc3b24d
98 ha cambiato i file con 11629 aggiunte e 344 eliminazioni
  1. 33 0
      app/Amqp/Consumer/MqConsumer.php
  2. 18 0
      app/Amqp/Producer/MqProducer.php
  3. 18 0
      app/Cache/Contracts/ListRedisInterface.php
  4. 10 0
      app/Cache/Contracts/LockRedisInterface.php
  5. 20 0
      app/Cache/Contracts/SetRedisInterface.php
  6. 16 0
      app/Cache/Contracts/StringRedisInterface.php
  7. 26 0
      app/Cache/Contracts/ZSetRedisInterface.php
  8. 57 0
      app/Command/DelayCommand.php
  9. 29 0
      app/Command/FooCommand.php
  10. 51 0
      app/Constant/TalkEventConstant.php
  11. 38 0
      app/Constant/TalkMessageType.php
  12. 30 0
      app/Constant/TalkModeConstant.php
  13. 15 0
      app/Constants/ErrorCode.php
  14. 246 0
      app/Controller/AdController.php
  15. 178 0
      app/Controller/AuthorityController.php
  16. 296 0
      app/Controller/ChatController.php
  17. 843 0
      app/Controller/CollectorController.php
  18. 55 15
      app/Controller/IndexController.php
  19. 113 0
      app/Controller/LinkController.php
  20. 261 0
      app/Controller/LoginController.php
  21. 428 0
      app/Controller/NewsController.php
  22. 467 0
      app/Controller/OrderController.php
  23. 634 0
      app/Controller/PublicController.php
  24. 66 0
      app/Controller/SseController.php
  25. 476 0
      app/Controller/UserController.php
  26. 483 0
      app/Controller/WebController.php
  27. 145 0
      app/Controller/WebSocketController.php
  28. 1073 0
      app/Controller/WebsiteController.php
  29. 29 0
      app/Event/TalkEvent.php
  30. 24 19
      app/Exception/Handler/AppExceptionHandler.php
  31. 65 160
      app/JsonRpc/AdService.php
  32. 8 9
      app/JsonRpc/AdServiceInterface.php
  33. 84 0
      app/JsonRpc/AuthorityService.php
  34. 53 0
      app/JsonRpc/AuthorityServiceInterface.php
  35. 345 0
      app/JsonRpc/ChatService.php
  36. 228 0
      app/JsonRpc/ChatServiceInterface.php
  37. 150 0
      app/JsonRpc/CollectorService.php
  38. 86 0
      app/JsonRpc/CollectorServiceInterface.php
  39. 19 0
      app/JsonRpc/DistrictServiceInterface.php
  40. 56 0
      app/JsonRpc/LinkService.php
  41. 28 0
      app/JsonRpc/LinkServiceInterface.php
  42. 147 0
      app/JsonRpc/NewsService.php
  43. 74 0
      app/JsonRpc/NewsServiceInterface.php
  44. 110 0
      app/JsonRpc/OrderService.php
  45. 65 0
      app/JsonRpc/OrderServiceInterface.php
  46. 220 0
      app/JsonRpc/PublicRpcService.php
  47. 132 0
      app/JsonRpc/PublicRpcServiceInterface.php
  48. 169 0
      app/JsonRpc/UserService.php
  49. 117 0
      app/JsonRpc/UserServiceInterface.php
  50. 452 0
      app/JsonRpc/WebsiteService.php
  51. 309 0
      app/JsonRpc/WebsiteServiceInterface.php
  52. 81 0
      app/Listener/DbQueryExecutedListener.php
  53. 91 0
      app/Middleware/Auth/WebMiddleware.php
  54. 31 0
      app/Middleware/CorsMiddleware.php
  55. 63 0
      app/Middleware/JWTAuthMiddleware.php
  56. 56 0
      app/Middleware/WebSocketAuthMiddleware.php
  57. 14 0
      app/Model/Model.php
  58. 34 0
      app/Service/GatherQueueService.php
  59. 32 0
      app/Service/ImportQueueService.php
  60. 87 0
      app/Service/Message/ReceiveHandleService.php
  61. 35 0
      app/Service/RedisInterface.php
  62. 97 0
      app/Service/RedisService.php
  63. 41 0
      app/Service/Server/StreamServer.php
  64. 89 0
      app/Service/SocketClientService.php
  65. 96 0
      app/Tools/CommonService.php
  66. 192 0
      app/Tools/PublicData.php
  67. 3 0
      app/Tools/Result.php
  68. 21 6
      composer.json
  69. 590 95
      composer.lock
  70. 22 0
      config/api/ad.php
  71. 26 0
      config/api/authority.php
  72. 16 0
      config/api/chat.php
  73. 56 0
      config/api/collector.php
  74. 5 0
      config/api/complaint.php
  75. 16 0
      config/api/link.php
  76. 9 0
      config/api/login.php
  77. 37 0
      config/api/news.php
  78. 57 0
      config/api/order.php
  79. 61 0
      config/api/public.php
  80. 38 0
      config/api/user.php
  81. 24 0
      config/api/web.php
  82. 86 0
      config/api/website.php
  83. 37 0
      config/autoload/amqp.php
  84. 44 0
      config/autoload/annotations.php
  85. 2 11
      config/autoload/cache.php
  86. 0 3
      config/autoload/databases.php
  87. 2 0
      config/autoload/dependencies.php
  88. 2 3
      config/autoload/devtool.php
  89. 108 0
      config/autoload/jwt.php
  90. 7 11
      config/autoload/listeners.php
  91. 1 0
      config/autoload/processes.php
  92. 34 6
      config/autoload/redis.php
  93. 19 4
      config/autoload/server.php
  94. 97 0
      config/autoload/services.php
  95. 23 0
      config/autoload/snowflake.php
  96. 16 0
      config/autoload/translation.php
  97. 13 0
      config/autoload/validate.php
  98. 23 2
      config/config.php

+ 33 - 0
app/Amqp/Consumer/MqConsumer.php

@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Amqp\Consumer;
+
+use Hyperf\Amqp\Result;
+use Hyperf\Amqp\Annotation\Consumer;
+use Hyperf\Amqp\Message\ConsumerMessage;
+use Hyperf\Di\Annotation\Inject;
+use PhpAmqpLib\Message\AMQPMessage;
+use App\JsonRpc\ChatServiceInterface;
+#[Consumer(exchange: 'hyperf', routingKey: 'hyperf', queue: 'hyperf', name: "MqConsumer", nums: 1)]
+class MqConsumer extends ConsumerMessage
+{
+    /**
+     * @var ChatServiceInterface
+     */
+    #[Inject]
+    private  $chatServiceClient;
+    public function consumeMessage($data, AMQPMessage $message): Result
+    {
+        //数据存储
+        $result = $this->chatServiceClient->addTalkRecords($data);
+        var_dump("消费成功:",$result);
+        return Result::ACK;
+    }
+
+//    public function isEnable(): bool
+//    {
+//        return false;
+//    }
+}

+ 18 - 0
app/Amqp/Producer/MqProducer.php

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

+ 18 - 0
app/Cache/Contracts/ListRedisInterface.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Cache\Contracts;
+
+interface ListRedisInterface
+{
+    public function push(string ...$value);
+
+    public function pop();
+
+    public function count();
+
+    public function clear();
+
+    public function all();
+
+    public function delete();
+}

+ 10 - 0
app/Cache/Contracts/LockRedisInterface.php

@@ -0,0 +1,10 @@
+<?php
+
+namespace App\Cache\Contracts;
+
+interface LockRedisInterface
+{
+    public function lock(string $key, $expired = 1, int $timeout = 0);
+
+    public function delete(string $key);
+}

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

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

+ 16 - 0
app/Cache/Contracts/StringRedisInterface.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Cache\Contracts;
+
+interface StringRedisInterface
+{
+    public function set(string $key, string $value, $expires = null);
+
+    public function get(string $key);
+
+    public function delete(string $key);
+
+    public function isExist(string $key);
+
+    public function ttl(string $key);
+}

+ 26 - 0
app/Cache/Contracts/ZSetRedisInterface.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Cache\Contracts;
+
+interface ZSetRedisInterface
+{
+    public function add(string $member, float $score);
+
+    public function rem(string ...$member);
+
+    public function incr(string $member, float $score);
+
+    public function isMember(string $member);
+
+    public function count();
+
+    public function all($asc = true, $is_score = true);
+
+    public function rank($page = 1, $size = 10, $asc = true);
+
+    public function getMemberRank(string $member, $asc = true);
+
+    public function getMemberScore(string $member);
+
+    public function delete();
+}

+ 57 - 0
app/Command/DelayCommand.php

@@ -0,0 +1,57 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Command;
+
+use App\Amqp\Producer\DelayDirectProducer;
+use App\Amqp\Producer\MqProducer;
+use Hyperf\Amqp\Producer;
+use Hyperf\Command\Command as HyperfCommand;
+use Hyperf\Command\Annotation\Command;
+use Hyperf\Context\ApplicationContext as ContextApplicationContext;
+use Hyperf\Utils\ApplicationContext;
+use Psr\Container\ContainerInterface;
+
+/**
+ * @Command
+ */
+#[Command]
+class DelayCommand extends HyperfCommand
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+
+        parent::__construct('demo:queue');
+    }
+
+    public function configure()
+    {
+        parent::configure();
+        $this->setDescription('生产消息发布 ');
+    }
+
+    public function handle()
+    {
+        for ($i = 0; $i < 100; $i++) {
+            $data = [
+                "ss" => 122,
+                "num" => $i,
+                "number" => mt_rand(1111, 9999),
+                "time" => time(),
+            ];
+            $message = new MqProducer($data);
+            $producer = ContextApplicationContext::getContainer()->get(Producer::class);
+            $ret = $producer->produce($message);
+        }
+        print_r($ret);
+        $this->line('Hello Hyperf!', 'info');
+        exit();
+    }
+}

+ 29 - 0
app/Command/FooCommand.php

@@ -0,0 +1,29 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Command;
+
+use Hyperf\Command\Command as HyperfCommand;
+use Hyperf\Command\Annotation\Command;
+use Psr\Container\ContainerInterface;
+
+#[Command]
+class FooCommand 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()
+    {
+        $this->line('Hello Hyperf!', 'info');
+    }
+}

+ 51 - 0
app/Constant/TalkEventConstant.php

@@ -0,0 +1,51 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Constant;
+
+/**
+ * WebSocket 消息事件枚举
+ *
+ * @package App\Constants
+ */
+class TalkEventConstant
+{
+    /**
+     * 对话消息通知 - 事件名
+     */
+    const EVENT_TALK = 'event_talk';
+
+    /**
+     * 键盘输入事件通知 - 事件名
+     */
+    const EVENT_TALK_KEYBOARD = 'event_talk_keyboard';
+
+    /**
+     * 用户在线状态通知 - 事件名
+     */
+    const EVENT_LOGIN = 'event_login';
+
+    /**
+     * 聊天消息撤销通知 - 事件名
+     */
+    const EVENT_TALK_REVOKE = 'event_talk_revoke';
+
+    /**
+     * 好友申请消息通知 - 事件名
+     */
+    const EVENT_CONTACT_APPLY = 'event_contact_apply';
+
+    /**
+     * @return array
+     */
+    public static function getMap(): array
+    {
+        return [
+            self::EVENT_TALK          => '对话消息通知',
+            self::EVENT_TALK_KEYBOARD => '键盘输入事件通知',
+            self::EVENT_LOGIN         => '用户在线状态通知',
+            self::EVENT_TALK_REVOKE   => '聊天消息撤销通知',
+            self::EVENT_CONTACT_APPLY => '好友申请消息通知'
+        ];
+    }
+}

+ 38 - 0
app/Constant/TalkMessageType.php

@@ -0,0 +1,38 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Constant;
+
+/**
+ * Class TalkMessageType
+ *
+ * @package App\Constants
+ */
+class TalkMessageType
+{
+    const SYSTEM_TEXT_MESSAGE  = 0;  //系统文本消息
+    const TEXT_MESSAGE         = 1;  //文本消息
+    const FILE_MESSAGE         = 2;  //文件消息
+    const FORWARD_MESSAGE      = 3;  //会话消息
+    const CODE_MESSAGE         = 4;  //代码消息
+    const VOTE_MESSAGE         = 5;  //投票消息
+    const GROUP_NOTICE_MESSAGE = 6;  //群组公告
+    const FRIEND_APPLY_MESSAGE = 7;  //好友申请
+    const USER_LOGIN_MESSAGE   = 8;  //登录通知
+    const GROUP_INVITE_MESSAGE = 9;  //入群退群消息
+    const LOCATION_MESSAGE     = 10; //位置消息(预留)
+
+    /**
+     * 获取可转发的消息类型列表
+     *
+     * @return array
+     */
+    public static function getForwardTypes(): array
+    {
+        return [
+            self::TEXT_MESSAGE,
+            self::FILE_MESSAGE,
+            self::CODE_MESSAGE
+        ];
+    }
+}

+ 30 - 0
app/Constant/TalkModeConstant.php

@@ -0,0 +1,30 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Constant;
+
+/**
+ * 聊天对话模式
+ *
+ * @package App\Constants
+ */
+class TalkModeConstant
+{
+    /**
+     * 私信
+     */
+    const PRIVATE_CHAT = 1;
+
+    /**
+     * 群聊
+     */
+    const GROUP_CHAT = 2;
+
+    public static function getTypes(): array
+    {
+        return [
+            self::PRIVATE_CHAT,
+            self::GROUP_CHAT
+        ];
+    }
+}

+ 15 - 0
app/Constants/ErrorCode.php

@@ -15,6 +15,8 @@ namespace App\Controller;
 use Hyperf\Di\Annotation\Inject;
 use Hyperf\HttpServer\Contract\RequestInterface;
 use Hyperf\HttpServer\Contract\ResponseInterface;
+
+
 use Psr\Container\ContainerInterface;
 
 abstract class AbstractController
@@ -27,4 +29,17 @@ abstract class AbstractController
 
     #[Inject]
     protected ResponseInterface $response;
+
+    
+    /**
+     * @var LoggerInterface
+     */
+//    private $logger;
+//    public function __construct(LoggerFactory $loggerFactory)
+//    {
+//        $this->logger =  $loggerFactory->get('admin_consumer:', 'default');
+//        $this->logger->info("项目启动访问一次");
+//    }
+
+
 }

+ 246 - 0
app/Controller/AdController.php

@@ -0,0 +1,246 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\JsonRpc\AdServiceInterface;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use App\Constants\ErrorCode;
+use Hyperf\Logger;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Hyperf\Context\Context;
+
+/**
+ * Class AdController
+ * @package App\Controller
+ */
+//#[AutoController]
+class AdController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var AdServiceInterface
+     */
+    #[Inject]
+    private  $adServiceClient;
+
+    public function createAd()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'website_id' => 'required',
+                'price' => 'required',
+            ],
+            [
+                'name.required' => '名称不能为空',
+                'website_id.required' => '站点不能为空',
+                'price.required' => '价格不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->createAd($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * @return array|void
+     */
+    public function getAdInfo()
+    {
+        $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);
+        }
+        $id = (int)$requireData['id'];
+        $result =  $this->adServiceClient->getAdInfo($id);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0);
+        }
+        return Result::success($result['data']);
+    }
+
+    public function getAdList()
+    {
+
+        $requireData = $this->request->all();
+
+        $nowTime = date("Y-m-d H:i:s");
+        $result = $this->adServiceClient->getAdList($requireData);
+        if($result['data']){
+            $typeList = ['1'=>'文字','2'=>'图文'];
+            $statusName = ['1'=>'通过','2'=>'待审'];
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['type_name'] = $typeList[$v['typeid']];
+                $result['data']['rows'][$k]['status_name'] = $statusName[$v['status']];
+                $result['data']['rows'][$k]['day'] = PublicData::residueDay(date("Y-m-d H:i:s"),$v['totime']);
+                if($nowTime<$v['fromtime']){
+                    $result['data']['rows'][$k]['runing_name'] = '未开始';
+                }else if($nowTime>$v['totime']){
+                    $result['data']['rows'][$k]['runing_name'] = '已过期';
+                }else{
+                    $result['data']['rows'][$k]['runing_name'] = '投放中';
+                }
+
+            }
+        }
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    public function updateAd()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'status' => 'required',
+            ],
+            [
+                'name.required' => '名称不能为空',
+                'status.required' => '状态不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData = $this->request->all();
+        $result = $this->adServiceClient->updateAd($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    public function delAd()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->delAd($requireData);
+        var_dump($result);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取广告位列表
+     * @return array
+     */
+    public function getAdPlaceList()
+    {
+
+        $requireData = $this->request->all();
+        var_dump($requireData);
+        $result = $this->adServiceClient->getAdPlaceList($requireData);
+        if($result['data']){
+            $typeList = ['1'=>'文字','2'=>'图文'];
+            $statusName = ['1'=>'通过','2'=>'待审'];
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['type_name'] = $typeList[$v['typeid']];
+                $result['data']['rows'][$k]['status_name'] = $statusName[$v['status']];
+            }
+        }
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    public function createAdPlace()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'website_id' => 'required',
+                'price' => 'required',
+            ],
+            [
+                'name.required' => '名称不能为空',
+                'website_id.required' => '站点不能为空',
+                'price.required' => '价格不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->createAdPlace($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    public function updateAdPlace()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'name' => 'required',
+                'website_id' => 'required',
+                'price' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'name.required' => '名称不能为空',
+                'website_id.required' => '站点不能为空',
+                'price.required' => '价格不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->updateAdPlace($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    public function delAdPlace()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->adServiceClient->delAdPlace($requireData);
+        var_dump($result);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+}

+ 178 - 0
app/Controller/AuthorityController.php

@@ -0,0 +1,178 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\JsonRpc\AuthorityServiceInterface;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use App\Constants\ErrorCode;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Hyperf\Context\Context;
+/**
+ * Class AuthorityController
+ * @package App\Controller
+ */
+//#[AutoController]
+class AuthorityController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var AuthorityServiceInterface
+     */
+    #[Inject]
+    private $authorityServiceClient;
+
+    /**
+     * 获取菜单列表
+     * @return array
+     */
+    public function getMenuList()
+    {
+        $result = $this->authorityServiceClient->getMenuList([]);
+        $result =  PublicData:: buildMenuTree($result['data']);
+        return $result?Result::success($result):Result::error('查询失败');
+    }
+
+    /**
+     * 删除菜单
+     * @return array
+     */
+    public function delMenu()
+    {
+        $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);
+        }
+        $getData = [
+            'id'=>$requireData['id']
+        ];
+        $result = $this->authorityServiceClient->getMenuList($getData);
+//        var_dump("菜单返回数据:",$result);
+        if(count($result['data'])>0){
+            return Result::error("有子菜单不能删除");
+        }
+        $data = ['id'=>$requireData['id']];
+        return $this->authorityServiceClient->delMenu($data);
+
+    }
+
+    /**
+     * 添加菜单
+     * @return array|void
+     */
+    public function addMenu()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'label' => 'required',
+            ],
+            [
+                'label.required' => '菜单名称不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
+        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';
+
+        $result = $this->authorityServiceClient->addMenu($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 查看菜单信息
+     * @return array
+     */
+    public function getMenuInfo()
+    {
+        $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->authorityServiceClient->getMenuInfo($requireData);
+        $result['data']['pid_arr'] = isset($result['data']['pid_arr']) && $result['data']['pid_arr']?json_decode($result['data']['pid_arr']):[];
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 修改菜单
+     * @return array|void
+     */
+    public function updateMenu()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'label' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'label.required' => '菜单名称不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
+        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';
+        $result = $this->authorityServiceClient->updateMenu($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 菜单递归查询处理
+     * @return void
+     */
+    public  function  getRecursionMenu()
+    {
+        $reqData = [
+            'user_id' =>Context::get("UserId"),
+        ];
+        $result =  $this->authorityServiceClient->getRecursionMenu($reqData);
+        $rep = PublicData::buildMenuTree($result['data']);
+        return $rep?Result::success($rep):Result::error("查询失败");
+    }
+
+    /**
+     * 查询所有的菜单
+     * @return array
+     */
+    public function getAllMenuList()
+    {
+        $result =  $this->authorityServiceClient->getAllMenuList([]);
+        $rep = PublicData::buildMenuTree($result['data']);
+        return $rep?Result::success($rep):Result::error("查询失败");
+    }
+
+}

+ 296 - 0
app/Controller/ChatController.php

@@ -0,0 +1,296 @@
+<?php
+
+declare(strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\ChatServiceInterface;
+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;
+
+/**
+ *
+ * Class ChatController
+ * @package App\Controller
+ */
+//#[AutoController]
+class ChatController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var ChatServiceInterface
+     */
+    #[Inject]
+    private  $chatServiceClient;
+
+    /**
+     * 申请添加好友
+     * @return array
+     */
+    public function addContactApply()
+    {
+        $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");
+        var_dump("用户id:",$requireData);
+        $result = $this->chatServiceClient->addContactApply($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取我的好友申请列表
+     * @return array
+     */
+    public function getContactApplyList()
+    {
+        $requireData = [];
+        $requireData['user_id'] =Context::get("UserId");
+        $result = $this->chatServiceClient->getContactApplyList($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 好有审核通过或拒绝
+     * @return void
+     */
+    public function updateContactApply()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'friend_id' => 'required',
+                'type'=>'required'
+            ],
+            [
+                'friend_id.required' => '好友ID不能为空',
+                'type.required' => '操作状态不能为空',
+
+            ]
+        );
+        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){
+
+        }
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除好友
+     * @return array
+     */
+    public function delContact()
+    {
+        $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->delContact($requireData);
+        return $result?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);
+      }
+
+}

+ 843 - 0
app/Controller/CollectorController.php

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

+ 55 - 15
app/Controller/IndexController.php

@@ -1,27 +1,67 @@
 <?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
- */
 
 namespace App\Controller;
 
+use App\Tools\CommonService;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use App\Request\FooRequest;
+use App\Request\SceneRequest;
+use App\Tools\Result;
+use ZipArchive;
+
+
 class IndexController extends AbstractController
 {
-    public function index()
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    public function index(RequestInterface $request){
+        $validator = $this->validationFactory->make(
+            $request->all(),
+            [
+                'foo' => 'required',
+                'bar' => 'required',
+            ],
+            [
+                'foo.required' => 'foo必填',
+                'bar.required' => 'bar必填',
+            ]
+        );
+
+        if ($validator->fails()){
+            // Handle exception
+            $errorMessage = $validator->errors()->first();
+            var_dump($errorMessage);
+        }
+    }
+
+    public function verifyCode()
     {
-        $user = $this->request->input('user', 'Hyperf');
-        $method = $this->request->getMethod();
+        $comm = new CommonService();
+        $ip = $comm->userIp();
+        $redis = $this->container->get(\Hyperf\Redis\Redis::class);
+
+        $config = new \EasySwoole\VerifyCode\Config();
+        $code = new \EasySwoole\VerifyCode\VerifyCode($config);
+        $img_code = '';
+        $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+        $charLength = strlen($characters);
+        for ($i = 0; $i < 4; $i++) {
+            $img_code .= $characters[rand(0, $charLength - 1)];
+        }
+        //重写验证码
+        $result = $code->DrawCode((string)$img_code);
+        $img_code = $result->getImageCode();
+        //写入缓存 用于其他方法验证 并且设置过期时间
+        $redis->set('code'.$ip,$img_code,60000);
+        return $result?Result::success($result->getImageBase64()):Result::error('失败');
+//        return $result->getImageBase64();
 
-        return [
-            'method' => $method,
-            'message' => "Hello {$user}.",
-        ];
     }
+
 }

+ 113 - 0
app/Controller/LinkController.php

@@ -0,0 +1,113 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\JsonRpc\LinkServiceInterface;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use Hyperf\Context\Context;
+
+use Hyperf\Logger;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+
+/**
+ * Class LinkController
+ * @package App\Controller
+ */
+//#[AutoController]
+class LinkController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var LinkServiceInterface
+     */
+    #[Inject]
+    private $linkServiceClient;
+
+    /**
+     * 友情链接列表
+     * @return array
+     */
+    public function getLinkList()
+    {
+        $requireData = $this->request->all();
+        $result = $this->linkServiceClient->getLinkList($requireData);
+        if($result['data']){
+            $statusList = ['1'=>"通过",'2'=>"待审"];
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['status_name'] =$statusList[$v['status']];
+            }
+        }
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 创建友情链接
+     * @return array
+     */
+    public function createLink()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'title' => 'required',
+            ],
+            [
+                'title.required' => '名称不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->linkServiceClient->createLink($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新友情链接
+     * @return array
+     */
+    public function updateLink()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'title' => 'required',
+                'url' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'title.required' => '名称不能为空',
+                'url.required' => 'url不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData = $this->request->all();
+        $result = $this->linkServiceClient->updateLink($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除友情链接
+     * @return array
+     */
+    public function delLink()
+    {
+        $requireData = $this->request->all();
+        $result = $this->linkServiceClient->delLink($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+
+}

+ 261 - 0
app/Controller/LoginController.php

@@ -0,0 +1,261 @@
+<?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
+{
+
+    #[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);
+        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);
+        if($userInfos['data']['status']==0){
+            return Result::error("用户已经冻结");
+        }
+//        var_dump("用户信息:", $userInfos);
+//        $this->logger->info("验证用户返回值:", $userInfos);
+        if (md5(md5($reqData['password']) . $userInfos['data']['salt']) != $userInfos['data']['password']) {
+            return Result::error("登陆密码错误");
+        }
+        $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'],
+                'type_id' => 20000,
+            ];
+            $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 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]]);
+    }
+}

+ 428 - 0
app/Controller/NewsController.php

@@ -0,0 +1,428 @@
+<?php
+declare(strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\NewsServiceInterface;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Hyperf\Context\Context;
+/**
+ * Class NewsController
+ * @package App\Controller
+ */
+//#[AutoController]
+class NewsController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    /**
+     * @var NewsServiceInterface
+     */
+    #[Inject]
+    private $newsServiceClient;
+
+    /**
+     * 导航池列表
+     * @return void
+     */
+    public function getCategoryList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page'=> 'required',
+                'pageSize'=> 'required',
+            ],
+            [
+                'page.required' => '第几页不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+
+        $result = $this->newsServiceClient->getCategoryList($requireData);
+        if($result['data']){
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['pid_arr'] = $v['pid_arr']?json_decode($v['pid_arr']):[0];
+            }
+        }
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 站点下的导航池
+     * @return void
+     */
+    public function categoryList()
+    {
+
+        $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);
+        }
+
+        $requireData['website_id'] = Context::get("SiteId");
+
+        $result = $this->newsServiceClient->categoryList($requireData);
+//        $rep = PublicData::buildMenuTree($result['data']);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 添加导航
+     * @return array|void
+     */
+    public function addCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name'=> 'required',
+                'seo_title'=> 'required',
+                'seo_keywords'=> 'required',
+                'seo_description'=> 'required',
+            ],
+            [
+                'name.required' => '导航池名称不能为空',
+                'seo_title.required' => 'seo标题名称不能为空',
+                'seo_keywords.required' => 'seo关键词不能为空',
+                'seo_description.required' => 'seo描述不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
+        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';
+
+        $requireData['city_id'] = isset($requireData['city_arr_id'])?end($requireData['city_arr_id']):'';
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id'])?json_encode($requireData['city_arr_id']):'';
+
+        $requireData['department_id'] = isset($requireData['department_arr_id'])?end($requireData['department_arr_id']):'';
+        $requireData['department_arr_id'] = isset($requireData['department_arr_id'])?json_encode($requireData['department_arr_id']):'';
+
+        $result = $this->newsServiceClient->addCategory($requireData);
+        return $result ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新导航池
+     * @return array
+     */
+    public function updateCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'name'=> 'required',
+                'seo_title'=> 'required',
+                'seo_keywords'=> 'required',
+                'seo_description'=> 'required',
+            ],
+            [
+                'id.required' =>'ID不能为空',
+                'name.required' => '栏目池名称不能为空',
+                'seo_title.required' => 'seo标题名称不能为空',
+                'seo_keywords.required' => 'seo关键词不能为空',
+                'seo_description.required' => 'seo描述不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
+        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';
+
+        $requireData['city_id'] = isset($requireData['city_arr_id'])?end($requireData['city_arr_id']):'';
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id'])?json_encode($requireData['city_arr_id']):'';
+
+        $requireData['department_id'] = isset($requireData['department_arr_id'])?end($requireData['department_arr_id']):'';
+        $requireData['department_arr_id'] = isset($requireData['department_arr_id'])?json_encode($requireData['department_arr_id']):'';
+
+        $result = $this->newsServiceClient->updateCategory($requireData);
+        return $result['code']==200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除分类
+     * @return array
+     */
+    public function delCategory()
+    {
+        $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->newsServiceClient->delCategory($requireData);
+        return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 资讯列表
+     * @return void
+     */
+    public function getArticleList()
+    {
+        $requireData = $this->request->all();
+
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page'=> 'required',
+                'pageSize'=> 'required',
+
+            ],
+            [
+                'page.required' => 'id不能为空',
+                'pageSize.required' => 'id不能为空',
+
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] = Context::get("SiteId");
+        var_dump("资讯:",$requireData);
+        $result = $this->newsServiceClient->getArticleList($requireData);
+        //1通过,2待审核,3待发 4,拒绝 5删除
+        $statusList = [
+            '0'=>'待审核',
+            '1'=>'已发布',
+            '2'=>'待审核',
+            '3'=>'待发',
+            '4'=>'拒绝',
+            '5'=>'删除',
+        ];
+        if($result['data']){
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['cat_arr_id'] = $v['cat_arr_id']?json_decode($v['cat_arr_id']):[0];
+                $result['data']['rows'][$k]['tag'] = $v['tag']?json_decode($v['tag']):[];
+                $result['data']['rows'][$k]['status_name'] = $statusList[$v['status']];
+                $result['data']['rows'][$k]['level'] = (string)$v['level'];
+                $result['data']['rows'][$k]['islink'] = isset($v['islink']) && $v['islink']>0?true:false;
+            }
+        }
+        $result = $this->newsServiceClient->getArticleList($requireData);
+
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 获取导航池信息
+     * @return void
+     */
+    public function getCategoryInfo()
+    {
+        $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->newsServiceClient->getCategoryInfo($requireData);
+        return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 添加分类
+     * @return array|void
+     */
+    public function addArticle()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'title'=> 'required',
+                'cat_arr_id'=> 'required',
+                'author'=> 'required',
+
+            ],
+            [
+                'title.required' => '标题不能为空',
+                'cat_arr_id.required' => '导航池ID不能为空',
+                'author.required' => '作者不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['catid'] = isset($requireData['cat_arr_id'])?end($requireData['cat_arr_id']):'';
+        $requireData['cat_arr_id'] = isset($requireData['cat_arr_id'])?json_encode($requireData['cat_arr_id']):'';
+
+        $loginIp = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
+        $requireData['ip'] = $loginIp;
+
+//        $requireData['website_id'] = Context::get("SiteId");
+        $requireData['admin_user_id'] =Context::get("UserId");
+        
+        $requireData['level'] = isset($requireData['level']) &&  $requireData['level']?$requireData['level']:0;
+        $requireData['hits'] = isset($requireData['hits']) &&  $requireData['hits']?$requireData['hits']:0;
+        $requireData['is_original'] = isset($requireData['is_original']) &&  $requireData['is_original']?$requireData['is_original']:0;
+        $requireData['status'] = isset($requireData['status']) &&  $requireData['status']?$requireData['status']:0;
+//        var_dump("入参:",$requireData);
+        $result = $this->newsServiceClient->addArticle($requireData);
+
+        return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新资讯
+     * @return array
+     */
+    public function updateArticle()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'title'=> 'required',
+                'cat_arr_id'=> 'required',
+                'author'=> 'required',
+            ],
+            [
+                'title.required' => '标题不能为空',
+                'cat_arr_id.required' => '导航池ID不能为空',
+                'author.required' => '作者不能为空',
+                'id.required' =>'ID不能为空'
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $requireData['catid'] = isset($requireData['cat_arr_id'])?end($requireData['cat_arr_id']):'';
+        $requireData['cat_arr_id'] = isset($requireData['cat_arr_id'])?json_encode($requireData['cat_arr_id']):'';
+
+        $result = $this->newsServiceClient->updateArticle($requireData);
+        return $result['code']==200? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新资讯状态
+     * @return array
+     */
+    public function upArticleStatus()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'status'=> 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'status.required' => '状态不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->newsServiceClient->upArticleStatus($requireData);
+        return $result['code']==200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除分类
+     * @return array
+     */
+    public function delArticle()
+    {
+        $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['website_id'] = Context::get("SiteId");
+        $result = $this->newsServiceClient->delArticle($requireData);
+        return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 获取资讯信息
+     * @return array
+     */
+    public function  getArticleInfo()
+    {
+        $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->newsServiceClient->getArticleInfo($requireData);
+        $result['data']['cat_arr_id'] =  $result['data']['cat_arr_id']?json_decode($result['data']['cat_arr_id']):[];
+        return $result['code']==200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+
+}

+ 467 - 0
app/Controller/OrderController.php

@@ -0,0 +1,467 @@
+<?php
+
+declare (strict_types = 1);
+
+namespace App\Controller;
+
+use App\JsonRpc\OrderServiceInterface;
+use App\Tools\Result;
+use Hyperf\Context\Context;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+
+/**
+ * Class OrderController
+ * @package App\Controller
+ */
+class OrderController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    /**
+     * @var OrderServiceInterface
+     */
+    #[Inject]
+    private $orderServiceClient;
+    public function index(RequestInterface $request, ResponseInterface $response)
+    {
+        return $response->raw('Hello Hyperf!');
+    }
+
+    /***
+     * 状态说明
+     */
+    
+    public function getStauts()
+    {
+        $data['order'] = [
+            1 => '已通过',
+            2 => '已驳回',
+            3 => '已撤回',
+            4 => '已修改',
+            5 => '已过期',
+            6 => '待审核',
+            7 => '已结束'
+        ];
+        $data['order_ad'] = [
+            1 => '待投放',
+            2 => '已驳回',
+            3 => '已撤回',
+            4 => '已修改',
+            5 => '已过期',
+            6 => '待审核',
+            7 => '已结束',
+            8 => '投放中'
+        ];
+
+        return Result::success($data);
+
+    }
+    /**
+     * 查询广告位
+     */
+    public function getAD()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'width' => 'required',
+                'height' => 'required',
+                'starttime' => 'required',
+                'endtime' => 'required',
+                'pageSize' => 'required',
+                'page' => 'required',
+
+            ],
+            [
+                'width.required' => '图片宽度不能为空',
+                'height.required' => '图片高度不能为空',
+                'starttime.required' => '广告开始时间不能为空',
+                'endtime.required' => '广告结束时间不能为空',
+                'pageSize.required' => '显示条数不能为空',
+                'page.required' => '分页不能为空',
+
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->orderServiceClient->getAD($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 根据网站查找广告位
+     */
+    public function getWebsiteAd()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'width' => 'required',
+                'height' => 'required',
+                'starttime' => 'required',
+                'endtime' => 'required',
+
+            ],
+            [
+                'width.required' => '图片宽度不能为空',
+                'height.required' => '图片高度不能为空',
+                'starttime.required' => '广告开始时间不能为空',
+                'endtime.required' => '广告结束时间不能为空',
+
+            ]
+        );
+        if (!empty($requireData['website_id'])) {
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'website_id' => 'required',
+                    'pageSize' => 'required',
+                    'page' => 'required',
+
+                ],
+                [
+                    'website_id.required' => '网站id不能为空',
+                    'pageSize.required' => '显示条数不能为空',
+                    'page.required' => '分页不能为空',
+
+                ]
+            );
+        }
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->orderServiceClient->getWebsiteAd($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function getOrderListAdmin()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pageSize' => 'required',
+                'page' => 'required',
+
+            ],
+            [
+                'pageSize.required' => '显示条数不能为空',
+                'page.required' => '分页不能为空',
+
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->orderServiceClient->getOrderListAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 添加订单
+     */
+    public function addAD()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+
+                'name' => 'required',
+                'width' => 'required',
+                'height' => 'required',
+                'starttime' => 'required',
+                'endtime' => 'required',
+                'imgurl' => 'required',
+                'imgsrc' => 'required',
+                'pid' => 'required',
+            ],
+            [
+                'name.required' => '广告名称不能为空',
+                'width.required' => '图片宽度不能为空',
+                'height.required' => '图片高度不能为空',
+                'starttime.required' => '广告开始时间不能为空',
+                'endtime.required' => '广告结束时间不能为空',
+                'imgurl.required' => '图片广告链接不能为空',
+                'imgsrc.required' => '图片广告地址不能为空',
+                'pid.required' => '广告位id不能为空',
+
+            ]
+        );
+
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $commaSeparatedString = $requireData['pid'];
+        $array = explode(",", $commaSeparatedString);
+        $requireData['pid'] = $array;
+        $result = $this->orderServiceClient->addAD($requireData);
+        // return $requireData;
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取订单列表
+     */
+    public function getOrderList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pageSize' => 'required',
+                'page' => 'required',
+            ],
+            [
+                'pageSize.required' => '显示条数不能为空',
+                'page.required' => '分页不能为空',
+
+            ]
+        );
+        if (isset($requireData['status'])) {
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'status' => 'required',
+                ],
+                [
+                    'status.required' => '状态不能为空',
+                ]
+            );
+        }
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->orderServiceClient->getOrderList($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取订单详情
+     */
+    public function getOrderDetail()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'order_id' => 'required',
+                'pageSize' => 'required',
+                'page' => 'required',
+            ],
+            [
+                'name.required' => '订单id不能为空',
+                'pageSize.required' => '显示条数不能为空',
+                'page.required' => '分页不能为空',
+
+            ]
+        );
+
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->orderServiceClient->getOrderDetail($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /***
+     * 撤回订单
+     */
+    public function cancelOrder()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'order_id' => 'required',
+            ],
+            [
+                'name.required' => '订单id不能为空',
+            ]
+        );
+
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->orderServiceClient->cancelOrder($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+
+    }
+    // 获取订单详情
+    public function getOrderDetailAdmin()
+    {
+        $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->orderServiceClient->getOrderDetailAdmin($requireData);
+
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除订单
+     */
+    public function delOrderAdmin()
+    {
+        $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->orderServiceClient->delOrderAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    //审核订单状态
+    public function applyOrderStatusAdmin()
+    {
+        $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->orderServiceClient->applyOrderStatusAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    //修改订单价格
+    public function editPriceOrderAdmin()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'price' => 'required|decimal:2',
+
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'price.required' => '价格不能为空',
+                'price.decimal' => '价格格式不正确',
+
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->orderServiceClient->editPriceOrderAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function rejectOrderAdmin()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'reason' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'reason.required' => '原因不能为空',
+
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->orderServiceClient->rejectOrderAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+
+    }
+    public function endOrderAdmin()
+    {
+        $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->orderServiceClient->endOrderAdmin($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 用户删除自己已失效的订单
+     */
+    public function delOrderAD()
+    {
+        $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->orderServiceClient->delOrderAD($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+}

+ 634 - 0
app/Controller/PublicController.php

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

+ 66 - 0
app/Controller/SseController.php

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

+ 476 - 0
app/Controller/UserController.php

@@ -0,0 +1,476 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\JsonRpc\UserServiceInterface;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use App\Constants\ErrorCode;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Hyperf\Context\Context;
+/**
+ * Class UserController
+ * @package App\Controller
+ */
+//#[AutoController]
+class UserController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    /**
+     * @var UserServiceInterface
+     */
+    #[Inject]
+    private $userServiceClient;
+
+    public function createUser()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'user_name' => 'required',//登陆账号
+                'type_id'=> 'required',//用户类型
+                'password' => 'required|min:6',//密码
+                'confirm_password' => 'required',
+                'real_name' => 'required',
+//                'mobile' =>'required'
+            ],
+            [
+                'user_name.required' => '用户名不能为空',
+                'password.required' => '密码不能为空',
+//                'email.email' => '请填写一个有效的邮箱',
+//                'mobile.required' => '手机号码必填',
+//                'mobile.telephone_number' => '请填写一个有效的手机号',
+                'confirm_password.required' =>"确认密码不能为空",
+                'type_id.required' =>"用户类型不能为空",
+                'real_name.required' =>"姓名不能为空",
+                'password.min' =>"密码长度不能低于6位数",
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        if($requireData['password']!=$requireData['confirm_password']){
+            return Result::error("两次密码不一致");
+        }
+        $salt = rand(1, 999999);
+        $requireData['salt'] = $salt;
+        $loginIp = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
+        $requireData['last_login_ip'] = $loginIp;
+        $requireData['admin_id'] = Context::get("UserId");
+
+        $requireData['administrative_unit_id'] = isset($requireData['administrative_unit_arr_id']) && count($requireData['administrative_unit_arr_id'])>0 ?end($requireData['administrative_unit_arr_id']):0;
+        $requireData['administrative_unit_arr_id'] = isset($requireData['administrative_unit_arr_id']) && count($requireData['administrative_unit_arr_id'])>0?json_encode($requireData['administrative_unit_arr_id']):'';
+
+        $requireData['address_id'] = isset($requireData['address_arr_id']) && count($requireData['address_arr_id'])>0?end($requireData['address_arr_id']):0;
+        $requireData['address_arr_id'] = isset($requireData['address_arr_id']) && count($requireData['address_arr_id'])>0 ?json_encode($requireData['address_arr_id']):'';
+
+        $requireData['native_place_id'] = isset($requireData['native_place_arr_id']) && count($requireData['native_place_arr_id'])>0?end($requireData['native_place_arr_id']):0;
+        $requireData['native_place_arr_id'] = isset($requireData['native_place_arr_id']) && count($requireData['native_place_arr_id'])>0?json_encode($requireData['native_place_arr_id']):'';
+
+        $requireData['city_id'] = isset($requireData['city_arr_id']) && count($requireData['city_arr_id'])>0?end($requireData['city_arr_id']):0;
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id']) && count($requireData['city_arr_id'])>0?json_encode($requireData['city_arr_id']):'';
+
+        $requireData['other'] = isset($requireData['other'])?json_encode($requireData['other']):'';
+        $result =  $this->userServiceClient->createUser($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * @return array|void
+     */
+    public function resetPassword()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'password'=>'required',
+            ],
+            [
+                'id.required' =>"id不能为空",
+                'password.required' =>"密码不能为空",
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $salt = rand(1, 999999);
+        $requireData['salt'] = $salt;
+        $result =  $this->userServiceClient->resetPassword($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 更新用户
+     * @return array
+     */
+    public function updateUser()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'user_name' => 'required',//登陆账号
+                'type_id'=> 'required',//用户类型
+                'real_name' => 'required',
+//                'mobile' =>'required',
+                'id'=>'required'
+            ],
+            [
+                'user_name.required' => '用户名不能为空',
+//                'mobile.required' => '手机号码必填',
+                'type_id.required' =>"用户类型不能为空",
+                'real_name.required' =>"姓名不能为空",
+                'id.required' =>"id不能为空",
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $loginIp = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
+        $requireData['last_login_ip'] = $loginIp;
+
+        $requireData['administrative_unit_id'] = isset($requireData['administrative_unit_arr_id']) && count($requireData['administrative_unit_arr_id'])>0 ?end($requireData['administrative_unit_arr_id']):0;
+        $requireData['administrative_unit_arr_id'] = isset($requireData['administrative_unit_arr_id']) && count($requireData['administrative_unit_arr_id'])>0?json_encode($requireData['administrative_unit_arr_id']):'';
+
+        $requireData['address_id'] = isset($requireData['address_arr_id']) && count($requireData['address_arr_id'])>0?end($requireData['address_arr_id']):0;
+        $requireData['address_arr_id'] = isset($requireData['address_arr_id']) && count($requireData['address_arr_id'])>0 ?json_encode($requireData['address_arr_id']):'';
+
+        $requireData['native_place_id'] = isset($requireData['native_place_arr_id']) && count($requireData['native_place_arr_id'])>0?end($requireData['native_place_arr_id']):0;
+        $requireData['native_place_arr_id'] = isset($requireData['native_place_arr_id']) && count($requireData['native_place_arr_id'])>0?json_encode($requireData['native_place_arr_id']):'';
+
+        $requireData['city_id'] = isset($requireData['city_arr_id']) && count($requireData['city_arr_id'])>0?end($requireData['city_arr_id']):0;
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id']) && count($requireData['city_arr_id'])>0?json_encode($requireData['city_arr_id']):'';
+
+        $requireData['other'] = isset($requireData['other'])?json_encode($requireData['other']):'';
+        $requireData['admin_id'] = Context::get("UserId");
+
+        $result =  $this->userServiceClient->updateUser($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取用户信息内容
+     * @return void
+     */
+    public function getUser()
+    {
+        $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->userServiceClient->getUserInfo((int)$requireData['id']);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 获取用户信息
+     * @return array|void
+     */
+    public function getUserInfo()
+    {
+
+        $result =  $this->userServiceClient->getUserInfo((int)Context::get("UserId"));
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 获取用户列表
+     * @return array
+     */
+    public function getUserList(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result =  $this->userServiceClient->getUserList($requireData);
+
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 删除用户
+     * @return array
+     */
+//    public function delUser()
+//    {
+//        $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->userServiceClient->delUser($requireData['id']);
+//        if ($result['code'] != ErrorCode::SUCCESS) {
+//            return Result::error($result['message'],0,[]);
+//        }
+//        return Result::success($result['data']);
+//    }
+
+    /**
+     * 查看角色信息
+     * @return array
+     */
+    public function roleInfo()
+    {
+        $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->userServiceClient->roleInfo($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        $result['data']['rule'] = isset($result['data']['rule'])?json_decode($result['data']['rule']):[];
+        return Result::success($result['data']);
+    }
+    /**
+     * 验证用户是否存在
+     * @return void
+     */
+    public function  verifyUserInfo()
+    {
+        $requireData = $this->request->all();
+        var_dump($requireData);
+        $result =  $this->userServiceClient->verifyUserInfo($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 角色列表
+     * @return array|void
+     */
+    public function roleList()
+    {
+        $requireData = $this->request->all();
+        $result =  $this->userServiceClient->roleList($requireData);
+        if($result['data']){
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['rule'] = $v['rule']?json_decode($v['rule']):[];
+            }
+        }
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 添加角色
+     * @return array
+     */
+    public function addRole()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'role_name' => 'required',
+                'rule' => 'required',
+                'remark' => 'required',
+            ],
+            [
+                'role_name.required' => '角色名称不能为空',
+                'rule.required' => '权限不能为空',
+                'remark.required' => '职能描述不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['rule'] = isset($requireData['rule']) && $requireData['rule']?json_encode($requireData['rule']):[];
+        $result =  $this->userServiceClient->addRole($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 删除角色
+     * @return array
+     */
+    public function delRole()
+    {
+        $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->userServiceClient->delRole($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 更新角色
+     * @return array
+     */
+    public function updateRole()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'role_name' => 'required',
+                'rule' => 'required',
+                'remark' => 'required',
+                'id' => 'required'
+            ],
+            [
+                'id.required' => '角色ID不能为空',
+                'role_name.required' => '角色名称不能为空',
+                'rule.required' => '权限不能为空',
+                'remark.required' => '职能描述不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $requireData['rule'] = isset($requireData['rule']) && $requireData['rule']?json_encode($requireData['rule']):[];
+        $result =  $this->userServiceClient->updateRole($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+
+     /**
+     * 修改密码
+     * @return array
+     */
+    public function  changePassword()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'password' => 'required',
+                'new_password' => 'required|min:6',
+                'new_password1' => 'required|same:new_password',
+            ],
+            [
+                'password.required' => '密码不能为空',
+                'new_password1.required' => '确认密码不能为空',
+                'new_password1.same' => '新密码和确认密码不一致',
+                'new_password.min' =>"密码长度不能低于6位数",
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] =Context::get("UserId");
+        $result =  $this->userServiceClient->changePassword($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+     public function upUserStatus()
+     {
+         $requireData = $this->request->all();
+         $validator = $this->validationFactory->make(
+             $requireData,
+             [
+                 'status' => 'required',
+                 'id' => 'required'
+             ],
+             [
+                 'id.required' => 'ID不能为空',
+                 'status.required' => '状态不能为空',
+             ]
+         );
+         if ($validator->fails()){
+             $errorMessage = $validator->errors()->first();
+             return Result::error($errorMessage);
+         }
+         $result =  $this->userServiceClient->upUserStatus($requireData);
+         if ($result['code'] != ErrorCode::SUCCESS) {
+             return Result::error($result['message'],0,[]);
+         }
+         return Result::success($result['data']);
+     }
+
+
+
+
+}

+ 483 - 0
app/Controller/WebController.php

@@ -0,0 +1,483 @@
+<?php
+declare(strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\NewsServiceInterface;
+use App\JsonRpc\WebsiteServiceInterface;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use App\Tools\Result;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use App\Constants\ErrorCode;
+use App\Controller\PublicController;
+use Hyperf\Context\Context;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface;
+/**
+ * Class WebController
+ * @package App\Controller
+ */
+class WebController extends AbstractController
+{
+
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+    private $publicServiceClient;
+    /**
+     * @var NewsServiceInterface
+     */
+    #[Inject]
+    private $newsServiceClient;
+
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+
+
+    private $PublicController;
+
+    public function __construct(PublicController $PublicController)
+    {
+        $this->PublicController = $PublicController;
+    }
+
+    /**
+     * 获取栏目导航
+     * @return array
+     */
+    public function getWebsiteCategory()
+    {
+
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'pageSize' => 'required'
+            ],
+            [
+                'pageSize.required' => '显示条数不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $data = [
+            'website_id'=>Context::get("SiteId"),
+            'pageSize'=>$requireData['pageSize']
+        ];
+        // var_dump("网站id:",Context::get("SiteId"));
+        $result = $this->websiteServiceClient->getWebsiteCategory($data);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 获取各省名称
+     */
+    public function getWebsiteDistrit()
+    {
+        $data= [
+            'pid' => 0,
+            'website_id'=>Context::get("SiteId")
+        ];
+        $result=$this->PublicController->getDistrictList($data);
+        
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        // var_dump($result['data']);
+        return Result::success($result['data']);
+        
+    }
+
+     /**
+     * 获取广告1
+     * @return array
+     */
+    public function getWebsiteAdvertisement()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'adPlace' => 'required'
+            ],
+            [
+                'adPlace.required' => '广告位置编号不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'website_id'=>Context::get("SiteId"),
+            'ad_placeid'=>$requireData['adPlace']
+        ]; 
+        
+        $result = $this->websiteServiceClient->getWebsiteAdvertisement($data);
+
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 搜索并获取职能部门
+     */
+    public function selectWebsiteDepartment(){
+        $requireData = $this->request->all();
+        $data = [
+            
+            'website_id'=>Context::get("SiteId")
+        ]; 
+       
+        if(!empty($requireData)){
+            $data = [
+                'keyword'=>$requireData['keyword'],
+                'website_id'=>Context::get("SiteId")
+            ]; 
+        }
+   
+        $result = $this->websiteServiceClient->selectWebsiteDepartment($data);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+
+    /**
+     *各省市查询 
+     */
+    public function selectWebsiteArea()
+    {
+        $requireData = $this->request->all();
+       
+        $data=[];
+        if(!empty($requireData)){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'province' => 'required'
+                ],
+                [
+                    'province.required' => '请先选择省份'
+                ]
+            );
+            if ($validator->fails()){
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+            $data=[
+                'province' => $requireData['province']
+            ];
+            if(isset($requireData['city'])){
+                
+                $data=[
+                    'city' => $requireData['city'],
+                    'province' => $requireData['province']
+                    
+                ];
+                
+                if(isset($requireData['region'])){
+                    $data=[
+                        'province' => $requireData['province'],
+                        'city' => $requireData['city'],
+                        'region' => $requireData['region']
+                    ];
+                }
+            }
+        }
+        $result = $this->websiteServiceClient->selectWebsiteArea($data);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    
+    /**
+     * 获取新闻
+     */
+    public function getWebsiteArticlett()
+    {
+       
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'level' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'level.required' => '新闻类型不能为空',
+                'pageSize.required' => '显示条数不能为空',
+
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        if(isset($requireData['placeid']) && !empty($requireData['placeid'])){
+            $data =[
+            'website_id'=>Context::get("SiteId"),
+            'level'=>$requireData['level'],
+            'pageSize'=>$requireData['pageSize'],
+            'placeid' => $requireData['placeid']
+            ];
+            
+        }else{
+            $data = [
+                'website_id'=>Context::get("SiteId"),
+                'level'=>$requireData['level'],
+                'pageSize'=>$requireData['pageSize']
+            ]; 
+        }
+        $result = $this->newsServiceClient->getWebsiteArticlett($data);
+        // var_dump($result);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+        
+    }
+
+     /**
+     * 获取模块新闻
+     */
+    public function getWebsiteModelArticles()
+    {
+        $requireData = $this->request->all();     
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'catid' => 'required',
+                'level' => 'required',
+                'pagesize' => 'required'
+            ],
+            [
+                'catid.required' => '栏目id不能为空',
+                'level.required' => '新闻类型不能为空',
+                'pagesize.required' => '新闻条数不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        if(isset($requireData['placeid']) && !empty($requireData['placeid'])){
+            $data =[
+                'website_id'=>Context::get("SiteId"),
+                'catid' => $requireData['catid'],
+                'level' => $requireData['level'],
+                'pagesize' => $requireData['pagesize'],
+                'placeid' => $requireData['placeid']
+            ];
+        }else{
+            $data = [
+                'website_id'=>Context::get("SiteId"),
+                'catid' => $requireData['catid'],
+                'level' => $requireData['level'],
+                'pagesize' => $requireData['pagesize']
+            ];   
+        }      
+        $result = $this->newsServiceClient->getWebsiteModelArticles($data);
+        // var_dump($result);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 获取模块栏目
+     */
+    public function getWebsiteModelCategory()
+    {
+        $requireData = $this->request->all();     
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'placeid' => 'required',
+                'pid' => 'required',
+                'num' => 'required'
+            ],
+            [
+                'placeid.required' => '栏目位置不能为空',
+                'pid' => '栏目类型不能为空',
+                'num' => '父级栏目数量'
+            ]
+        );
+        
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'website_id'=>Context::get("SiteId"),
+            'placeid' => $requireData['placeid'],
+            'pid' => $requireData['pid'],
+            'num' => $requireData['num']
+        ];    
+        $result=$this->websiteServiceClient->getWebsiteModelCategory($data);
+        
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        // var_dump($result['data']);
+        return Result::success($result['data']);
+        
+    }
+
+     /**
+     * 获取友情链接
+     * @return array
+     */
+    public function selectWebsiteLinks()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'type' => 'required',
+                'num' => 'required'
+            ],
+            [
+                'type.required' => '友情链接类型不能为空',
+                'num.required' => '友情链接数量不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'website_id'=>Context::get("SiteId"),
+            'type'=>$requireData['type'],
+            'num' =>$requireData['num']
+        ];
+        $result = $this->websiteServiceClient->selectWebsiteLinks($data);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 获取文章列表
+     */
+    public function getWebsiteArticlesList()
+    {
+       
+        $requireData = $this->request->all();
+        if(isset($requireData['catid'])){
+            $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'catid' => 'required'
+            ],
+            [
+                'catid.required' => '栏目id不能为空'
+
+            ]
+            );
+            $data['catid'] =  $requireData['catid']; 
+        }elseif(isset($requireData['keyword'])){
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'keyword' => 'required'
+                ],
+                [
+                    'keyword.required' => '搜索词不能为空'
+    
+                ]
+            );
+            $data['keyword'] =  $requireData['keyword']; 
+        }else{
+            $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'catid' => 'required',
+                    'keyword' => 'required'
+                ],
+                [
+                    'catid.required' => '栏目id不能为空',
+                    'keyword.required' => '搜索词不能为空'
+    
+                ]
+            );
+            $data['catid'] =  $requireData['catid']; 
+            $data['keyword'] =  $requireData['keyword']; 
+        }
+        $validator = $this->validationFactory->make(
+                $requireData,
+                [
+                    'page' => 'required',
+                    'pageSize' => 'required'
+                ],
+                [
+                    'page.required' => '分页不能为空',
+                    'pageSize.required' => '显示条数不能为空'
+    
+                ]
+            );
+            if ($validator->fails()){
+                $errorMessage = $validator->errors()->first();
+                return Result::error($errorMessage);
+            }
+            $data['website_id'] = Context::get("SiteId");
+            $data['pageSize'] = $requireData['pageSize']; 
+            $data['page'] = $requireData['page']; 
+        $result = $this->newsServiceClient->getArticleList($data);
+        // var_dump($result);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        // $result = $data; 
+        return Result::success($result['data']);
+        
+    }
+    
+     /**
+     * 获取文章详情
+     */
+    public function selectWebsiteArticleInfo()
+    {
+       
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'articleid' => 'required'
+            ],
+            [
+                'articleid.required' => '新闻id不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'website_id'=>Context::get("SiteId"),
+            'id'=>$requireData['articleid'],
+        ]; 
+        $result = $this->newsServiceClient->getArticleInfo($data);
+        // var_dump($result);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+        
+    }
+}

+ 145 - 0
app/Controller/WebSocketController.php

@@ -0,0 +1,145 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Controller;
+
+use App\Amqp\Producer\MqProducer;
+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 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;
+
+class WebSocketController  implements OnMessageInterface, OnOpenInterface, OnCloseInterface
+{
+
+    #[Inject]
+    protected JWT $jwt;
+    /**
+     * @var ChatServiceInterface
+     */
+    #[Inject]
+    private $chatServiceClient;
+    /**
+     * @var UserServiceInterface
+     */
+    #[Inject]
+    private $userServiceClient;
+
+    /**
+     * @Inject
+     * @var ReceiveHandleService
+     */
+    protected $receiveHandle;
+
+    public function onMessage($server, $frame): void
+    {
+
+        //把数据推给前端
+        $redisClient = new RedisService();
+        $userId = $redisClient->findUser((string)$frame->fd);
+
+        //存入队列
+        $result = json_decode($frame->data, true);
+        $result['user_id'] = $userId;
+
+        $userInfo = $redisClient->getUserInfo($userId);
+        if($userInfo){
+            $userInfoArr = json_decode($userInfo);
+            $result['user_avatar'] = $userInfoArr['avatar'];
+        }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);
+        //推送给前台
+        //组装数据+头像
+        if($result['talk_type']==1){
+            //给自己推一条数据
+            if ($server->isEstablished($frame->fd)) {
+                $server->push($frame->fd, json_encode($result));
+            }
+            //给好友推送消息
+            $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);
+            }
+        }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));
+                    }
+                }
+            }
+
+        }
+
+    }
+
+    public function onClose($server, int $fd, int $reactorId): void
+    {
+        var_dump('closed::::::::::::::::::',$fd,"======",$reactorId,"+++++++++++");
+//        $data = [
+//            'fd'=>$fd
+//        ];
+//        $this->chatServiceClient->delChatChannel($data);
+
+        $redisClient = new RedisService();
+        $userId = $redisClient->findUser((string)$fd);
+        $redisClient->unbind((string)$fd,(int)$userId);
+    }
+
+    public function onOpen($server, $request): void
+    {
+
+        $token = $request->get['token'];
+        $userInfo = $this->jwt->getClaimsByToken($token);
+        $response = (new Response($server))->init($request);
+        $fd = $response->getFd();
+//        var_dump("管道ID:",$fd);
+//        $data = [
+//            'user_id'=>$userInfo['uid'],
+//            'fd'=>$fd
+//        ];
+//        var_dump(SERVER_RUN_ID,"+++++++++++++");
+//      $this->chatServiceClient->addChatChannel($data);
+
+        $server->bind($fd,$userInfo['uid']);
+        $redisClient = new RedisService();
+        $redisClient->bind((string)$fd,$userInfo['uid']);
+        $server->push($request->fd, json_encode([
+            "event"   => "connect",
+            "content" => [
+                "ping_interval" => 20,
+                "ping_timeout"  => 20 * 3,
+                "content" =>"连接成功"
+            ],
+        ]));
+    }
+
+}

+ 1073 - 0
app/Controller/WebsiteController.php

@@ -0,0 +1,1073 @@
+<?php
+declare(strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\WebsiteServiceInterface;
+use App\Tools\PublicData;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Annotation\AutoController;
+use App\Tools\Result;
+use Hyperf\Validation\Contract\ValidatorFactoryInterface;
+use Hyperf\Context\Context;
+use Phper666\JWTAuth\JWT;
+use DateTime;
+/**
+ * Class WebsiteController
+ * @package App\Controller
+ */
+//#[AutoController]
+class WebsiteController extends AbstractController
+{
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+
+    protected JWT $JWT;
+    public function __construct(Jwt $JWT)
+    {
+        $this->JWT = $JWT;
+    }
+    /**
+     * 创建站点
+     * @return array
+     */
+    public function addWebsite()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_column_arr_id' => 'required',
+                'website_name' => 'required',
+                'website_url' => 'required',
+            ],
+            [
+                'website_column_id.required' => '上级网系id不能为空',
+                'website_name.required' => '站点名称不能为空',
+                'website_url.required' => '网站地址不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_url'] = json_encode($requireData['website_url']);
+        $requireData['city_id'] = isset($requireData['city_arr_id'])?end($requireData['city_arr_id']):0;
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id'])?json_encode($requireData['city_arr_id']):[0];
+        $requireData['website_column_id'] = isset($requireData['website_column_arr_id'])?end($requireData['website_column_arr_id']):'';
+        $requireData['website_column_arr_id'] = isset($requireData['website_column_arr_id'])?json_encode($requireData['website_column_arr_id']):'';
+        var_dump($requireData);
+        $result = $this->websiteServiceClient->createWebsite($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取站点列表
+     * @return void
+     */
+    public function getWebsiteList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsitetList($requireData);
+        if($result['data']){
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['city_arr_id'] = $v['city_arr_id']?json_decode($v['city_arr_id']):'';
+                $result['data']['rows'][$k]['website_url'] = $v['website_url']?json_decode($v['website_url']):[];
+            }
+        }
+
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新站点
+     * @return array
+     */
+    public function updateWebsite()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required',
+                'website_column_arr_id' => 'required',
+                'website_name' => 'required',
+                'website_url' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'website_column_id.required' => '网系id不能为空',
+                'website_name.required' => '站点名称不能为空',
+                'website_url.required' => '网站地址不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_url'] = json_encode($requireData['website_url']);
+        $requireData['city_id'] = isset($requireData['city_arr_id'])?end($requireData['city_arr_id']):0;
+        $requireData['city_arr_id'] = isset($requireData['city_arr_id'])?json_encode($requireData['city_arr_id']):[0];
+        $requireData['website_column_id'] = isset($requireData['website_column_arr_id'])?end($requireData['website_column_arr_id']):'';
+        $requireData['website_column_arr_id'] = isset($requireData['website_column_arr_id'])?json_encode($requireData['website_column_arr_id']):'';
+        $result = $this->websiteServiceClient->updateWebsite((int)$requireData['id'],$requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除站点
+     * @return array
+     */
+    public function delWebsite()
+    {
+        $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);
+        }
+        $id = (int)$requireData['id'];
+        $result = $this->websiteServiceClient->delWebsite($id);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取站点信息
+     * @return array
+     */
+    public function getWebsiteInfo()
+    {
+        $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);
+        }
+        $id = (int)$requireData['id'];
+        $result = $this->websiteServiceClient->getWebsiteInfo($id);
+        if($result['code']==200){
+            $result['data']['website_url'] = isset($result['data']['website_url']) && $result['data']['website_url']?json_decode($result['data']['website_url']):'';
+            $result['data']['website_column_arr_id'] = isset($result['data']['website_column_arr_id']) && $result['data']['website_column_arr_id']?json_decode($result['data']['website_column_arr_id']):'';
+            $result['data']['city_arr_id'] = isset($result['data']['city_arr_id']) && $result['data']['city_arr_id']?json_decode($result['data']['city_arr_id']):'';
+            return Result::success($result['data']);
+        }else{
+            return Result::error($result['message']);
+        }
+
+    }
+
+    /**
+     * 添加的时候 选择上级网系
+     * @return array
+     */
+    public function getWebsiteColumn()
+    {
+        $result = $this->websiteServiceClient->getWebsiteColumn([]);
+        $rep = PublicData::buildMenuTree($result['data']);
+        return $rep?Result::success($rep):Result::error("查询失败");
+    }
+
+    /**
+     * 获取网系列表
+     * @return void
+     */
+    public function getWebsiteColumnList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsiteColumnList($requireData);
+        if($result['data']){
+            foreach ($result['data']['rows'] as $k=>$v) {
+                $result['data']['rows'][$k]['column_arr_id'] = $v['column_arr_id']?json_decode($v['column_arr_id']):[0];
+            }
+        }
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 创建网系
+     * @return array
+     */
+    public function addWebsiteColumn()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'column_name' => 'required',
+            ],
+            [
+                'column_name.required' => '网系名称不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $requireData['pid'] = isset($requireData['column_arr_id'])?end($requireData['column_arr_id']):'';
+        $requireData['column_arr_id'] = isset($requireData['column_arr_id'])?json_encode($requireData['column_arr_id']):'';
+        $result = $this->websiteServiceClient->createWebsiteColumn($requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新网系
+     * @return array
+     */
+    public function updateWebsiteColumn()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'column_name' => 'required',
+            ],
+            [
+                'column_name.required' => '栏目名称不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['pid'] = isset($requireData['column_arr_id'])?end($requireData['column_arr_id']):'';
+        $requireData['column_arr_id'] = isset($requireData['column_arr_id'])?json_encode($requireData['column_arr_id']):'';
+        $result = $this->websiteServiceClient->updateWebsiteColumn($requireData['id'],$requireData);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除网系
+     * @return array
+     */
+    public function delWebsiteColumn()
+    {
+        $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->websiteServiceClient->delWebsiteColumn(intval($requireData['id']));
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取站点角色列表
+     * @return void
+     */
+    public function getWebsiteRoleList()
+    {
+        $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);
+        }
+        $keyword = $this->request->input("keyword",'');
+        $page = (int)$this->request->input("page",1);
+        $pageSize = (int)$this->request->input("pageSize",10);
+        $websiteId = (int)$this->request->input("id",'');
+        $result = $this->websiteServiceClient->getWebsiteRoleList($keyword,$page,$pageSize,$websiteId);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 创建站点角色
+     * @return array
+     */
+    public function createWebsiteRole()
+    {
+        $requireData = $this->request->all();
+
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'type' => 'required',
+                'role_id' => 'required',
+                'website_id' => 'required'
+            ],
+            [
+                'type.required' => '类型不能为空',
+                'type_id.required' => 'ID不能为空',
+                'website_id.required' => '站点ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['admin_user_id']  =Context::get("UserId");
+        $result = $this->websiteServiceClient->createWebsiteRole($requireData);
+        return $result['code']!=0?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 删除站点角色
+     * @return array
+     */
+    public function delWebsiteRole()
+    {
+        $id = (int)$this->request->input("id",'');
+        $result = $this->websiteServiceClient->delWebsiteRole($id);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 获取站点角色用户列表
+     * @return void
+     */
+    public function getWebsiteRoleUserList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'role_id' => 'required',
+            ],
+            [
+                'website_id.required' => '站点ID不能为空',
+                'role_id.required' => '角色ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $keyword = $this->request->input("keyword",'');
+        $page = (int)$this->request->input("page",1);
+        $pageSize = (int)$this->request->input("pageSize",10);
+        $roleId = (int)$this->request->input("role_id",'');
+        $websiteId = (int)$this->request->input("website_id",'');
+        $result = $this->websiteServiceClient->getWebsiteRoleUserList($keyword,$page,$pageSize,$websiteId,$roleId);
+        return $result?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 创建站点角色用户
+     * @return array
+     */
+    public function createWebsiteRoleUser()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'type' => 'required',
+                'role_id' => 'required',
+                'website_id' => 'required',
+                'user_id' => 'required',
+            ],
+            [
+                'type.required' => '类型不能为空',
+                'website_id.required' => '站点ID不能为空',
+                'role_id.required' => '角色ID不能为空',
+                'user_id.required' => '用户ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['admin_user_id']  =Context::get("UserId");
+        $requireData['role_id']  = (int)$requireData['role_id'];
+        $requireData['type']  = (int)$requireData['type'];
+        $requireData['website_id']  =(int)$requireData['website_id'];
+        $requireData['user_id']  = (int)$requireData['user_id'];
+        $result = $this->websiteServiceClient->createWebsiteRoleUser($requireData);
+        return $result['code']!=0?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 删除站点角色用户
+     * @return array
+     */
+    public function delWebsiteRoleUser()
+    {
+        $id = (int)$this->request->input("id",'');
+        $result = $this->websiteServiceClient->delWebsiteRoleUser($id);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 网站栏目映射
+     * @return void
+     */
+    public function addWebsiteCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'category_arr_id' => 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+                'category_arr_id.required' => '网站导航ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->addWebsiteCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除网站导航
+     * @return void
+     */
+    public function delWebsiteCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'category_id' => 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+                'category_id.required' => '网站导航ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->delWebsiteCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取网站导航
+     * @return void
+     */
+    public function getAdminWebsiteCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getAdminWebsiteCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新网站导航
+     * @return void
+     */
+    public function upWebsiteCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->upWebsiteCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取网站与导航
+     * @return array
+     */
+    public function getWebsiteCategoryList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+            ],
+            [
+                'page.required' => '当前页码数不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsiteCategoryList($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除网站下面的所有导航
+     * @return void
+     */
+    public function delWebsiteAllCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required'
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->delWebsiteAllCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 查看指定的导航
+     * @return array
+     */
+    public function getWebsiteCategoryOnes()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'category_id' => 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+                'category_id.required' => '网站导航ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsiteCategoryOnes($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新指定的某一个导航
+     * @return array
+     */
+    public function upWebsiteCategoryones()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'category_id'=> 'required',
+                'alias'=> 'required',
+                'seo_title'=> 'required',
+                'seo_keywords'=> 'required',
+                'seo_description'=> 'required',
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+                'category_id.required' => '导航ID不能为空',
+                'alias.required' => '名称不能为空',
+                'seo_title.required' => 'seo标题不能为空',
+                'seo_keywords.required' => '关键词不能为空',
+                'seo_description.required' => '网站描述不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->upWebsiteCategoryones($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 站下的所有导航包含子导航
+     * @return array
+     */
+    public function getWebsiteAllCategory()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required'
+            ],
+            [
+                'website_id.required' => '网站ID不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsiteAllCategory($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * 管理后台首页统计
+     * @return array
+     */
+    public function getAdminIndex()
+    {
+//        $token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjoxLCJ0eXBlX2lkIjoxLCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82NzFiNDc3MDcwODI2OC4wOTk4ODA3NyIsImlhdCI6MTcyOTg0MTAwOCwibmJmIjoxNzI5ODQxMDA4LCJleHAiOjE3Mjk4NDQwMDh9.4X-Q-vwPxddX75q6CKtOXqWgtnFAikRwX308T0iDxYE";
+//        $time =  $this->JWT->getTokenDynamicCacheTime($token);
+//        var_dump("有效时间:",$time);
+
+        $typeId = intval(Context::get("TypeId"));
+        var_dump("用户类型:",$typeId);
+        switch ($typeId){
+            case 4:
+                $dates = [];
+                $startDate = (new DateTime())->modify('-29 day'); // 从 29 天前开始(因为我们要 30 天,包括今天的前一天)
+                for ($i = 0; $i < 30; $i++) {
+                    $dates[] = $startDate->format('Y-m-d');
+                    $startDate->modify('+1 day'); // 每天递增一天
+                }
+                $result = $this->websiteServiceClient->getAdminIndex(['type_id'=>$typeId]);
+                $list = [];
+                if($result['data']){
+
+                    $list = PublicData::arrayColumnAsKey($result['data'],'date');
+                    var_dump($list);
+                }
+                $newResult = [];
+                if($dates){
+                    foreach ($dates as $key=>$val){
+                        $newResult[$key]['date'] = $val;
+                        $newResult[$key]['total_count'] = $list[$val]['total_count']??0;
+                    }
+                }
+                //投诉举报列表
+                $res['letterOfComplaintList'] = $newResult;
+                return $result['code']==200?Result::success($res):Result::error($result['message']);
+                break;
+            case 10000:
+
+                $result = $this->websiteServiceClient->getAdminIndex(['type_id'=>$typeId]);
+                if($result){
+                    $dates = [];
+                    $startDate = (new DateTime())->modify('-29 day'); // 从 29 天前开始(因为我们要 30 天,包括今天的前一天)
+                    for ($i = 0; $i < 30; $i++) {
+                        $dates[] = $startDate->format('Y-m-d');
+                        $startDate->modify('+1 day'); // 每天递增一天
+                    }
+                    $list = [];
+                    if($result['data']['monthArticle']){
+                        $list = PublicData::arrayColumnAsKey($result['data']['monthArticle'],'date');
+                    }
+                    $newResult = [];
+                    if($dates){
+                        foreach ($dates as $key=>$val){
+                            $newResult[$key]['date'] = $val;
+                            $newResult[$key]['total_count'] = $list[$val]['total_count']??0;
+                        }
+                    }
+                    //1:个人会员 2:政务会员 3:企业会员 4:调研员 10000:管理员
+                    $userType=[
+                        '1'=>'个人会员',
+                        '2'=>'政务会员',
+                        '3'=>'企业会员',
+                        '4'=>'调研员',
+                        '10000'=>'管理员',
+                        '20000'=>'游客',
+                    ];
+                    if($result['data']['userType']){
+                        foreach ($result['data']['userType'] as $k=>$v){
+                            $result['data']['userType'][$k]['typeName'] = $userType[$v['type_id']];
+                        }
+                    }
+                    $result['data']['monthArticle'] = $newResult;
+                    return Result::success($result['data']);
+
+                }else{
+                    return Result::error($result['message']);
+                }
+
+                return Result::success($result);
+                break;
+        }
+    }
+
+    /**
+     * 获取模板皮肤分类
+     * @return void
+     */
+    public function getTemplateClass()
+    {
+        $requireData = $this->request->all();
+        $result = $this->websiteServiceClient->getTemplateClass($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 添加模板分类
+     * @return void
+     */
+    public function addTemplateClass()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required'
+            ],
+            [
+                'name.required' => '模板类型不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'name' => $requireData['name'],
+            'sort' => $requireData['sort']??0,
+        ];
+        $result = $this->websiteServiceClient->addTemplateClass($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新模板分类
+     * @return array
+     */
+    public function upTemplateClass()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name' => 'required',
+                'id'=> 'required',
+            ],
+            [
+                'name.required' => '模板类型不能为空',
+                'name.id' => '模板类型ID不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'id'=> $requireData['id'],
+            'name' => $requireData['name'],
+            'sort' => $requireData['sort']??0,
+        ];
+        $result = $this->websiteServiceClient->upTemplateClass($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除模板分类
+     * @return array
+     */
+    public function delTemplateClass()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required'
+            ],
+            [
+                'name.required' => '类型id不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'id' => $requireData['id']
+        ];
+        $result = $this->websiteServiceClient->delTemplateClass($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 获取分类下的模板
+     * @return array
+     */
+    public function getTemplate()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+//                'template_class_id' => 'required',
+                'page' => 'required',
+                'pageSize' => 'required',
+
+            ],
+            [
+//                'template_class_id.required' => '类型template_class_id不能为空',
+                'page.required' => 'page不能为空',
+                'pageSize.required' => '每页显示条数不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'template_class_id' => $requireData['template_class_id'],
+            'page' =>  $requireData['page'],
+            'pageSize' =>  $requireData['pageSize'],
+        ];
+        $result = $this->websiteServiceClient->getTemplate($data);
+        var_dump("模板列表:",$result['data']['rows']);
+        if($result['data']['rows']){
+            foreach ($result['data']['rows'] as $key=>$val){
+                $result['data']['rows'][$key]['template_img'] = json_decode($val['template_img'],true);
+            }
+        }
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 创建皮肤模板
+     * @return array
+     */
+    public function addTemplate()
+    {
+        $requireData = $this->request->all();
+//        var_dump("FCK:",$requireData);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'template_name' => 'required',
+                'template_class_id' => 'required',
+                'template_img' => 'required'
+            ],
+            [
+                'template_name.required' => '模板名称不能为空',
+                'template_class_id.required' => '模板类型id不能为空',
+                'template_img.required' => '模板图片不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+//        var_dump($requireData);
+        $data = [
+            'template_name' => $requireData['template_name'],
+            'template_class_id' => $requireData['template_class_id'],
+            'template_img' => $requireData['template_img'],
+        ];
+        $result = $this->websiteServiceClient->addTemplate($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 更新模板
+     * @return array
+     */
+    public function upTemplate()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'template_name' => 'required',
+                'template_class_id' => 'required',
+                'template_img' => 'required',
+                'id' => 'required',
+
+            ],
+            [
+                'template_name.required' => '模板名称不能为空',
+                'template_class_id.required' => '模板类型id不能为空',
+                'template_img.required' => '模板图片不能为空',
+                'id.required' => '模板id不能为空',
+
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'id'=> $requireData['id'],
+            'template_name' => $requireData['template_name'],
+            'template_img' => $requireData['template_img'],
+            'template_class_id' => $requireData['template_class_id'],
+        ];
+        $result = $this->websiteServiceClient->upTemplate($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 删除模板
+     * @return array
+     */
+    public function delTemplate()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required'
+            ],
+            [
+                'name.required' => '模板id不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $data = [
+            'id' => $requireData['id']
+        ];
+        $result = $this->websiteServiceClient->delTemplate($data);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 搜索网站
+     * @return array
+     */
+    public function websiteList()
+    {
+        $requireData = $this->request->all();
+        $result = $this->websiteServiceClient->websiteList($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 检测网站名称是否存在
+     * @return array
+     */
+    public function checkWebsiteName()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_name' => 'required'
+            ],
+            [
+                'website_name.required' => '网站名称不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->websiteServiceClient->checkWebsiteName($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+    /**
+     * 检测网站网址是否存在
+     * @return array
+     */
+    public function checkWebsiteUrl()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_url' => 'required'
+            ],
+            [
+                'website_url.required' => '网站网址不能为空'
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->websiteServiceClient->checkWebsiteUrl($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+
+}

+ 29 - 0
app/Event/TalkEvent.php

@@ -0,0 +1,29 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Event;
+
+class TalkEvent
+{
+    /**
+     * @var string 消息事件名
+     */
+    public $event_name;
+
+    /**
+     * @var array 消息数据
+     */
+    public $data;
+
+    /**
+     * TalkMessageEvent constructor.
+     *
+     * @param string $event_name
+     * @param array  $data
+     */
+    public function __construct(string $event_name, array $data = [])
+    {
+        $this->event_name = $event_name;
+        $this->data       = $data;
+    }
+}

+ 24 - 19
app/Exception/Handler/AppExceptionHandler.php

@@ -1,38 +1,43 @@
 <?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
- */
-
 namespace App\Exception\Handler;
-
 use Hyperf\Contract\StdoutLoggerInterface;
 use Hyperf\ExceptionHandler\ExceptionHandler;
 use Hyperf\HttpMessage\Stream\SwooleStream;
 use Psr\Http\Message\ResponseInterface;
 use Throwable;
+/**
+ * Create a new validation exception from a plain array of messages.
+ *
+ * @return static
+ */
 
 class AppExceptionHandler extends ExceptionHandler
 {
-    public function __construct(protected StdoutLoggerInterface $logger)
-    {
-    }
-
+    /**
+     * Create a new validation exception from a plain array of messages.
+     *
+     * @return static
+     */
     public function handle(Throwable $throwable, ResponseInterface $response)
     {
-        $this->logger->error(sprintf('%s[%s] in %s', $throwable->getMessage(), $throwable->getLine(), $throwable->getFile()));
-        $this->logger->error($throwable->getTraceAsString());
-        return $response->withHeader('Server', 'Hyperf')->withStatus(500)->withBody(new SwooleStream('Internal Server Error.'));
+//        var_dump($throwable->getMessage());
+        // 格式化输出
+        $data = json_encode([
+            'code' => $throwable->getCode(),
+            'message' => $throwable->getMessage(),
+        ], JSON_UNESCAPED_UNICODE);
+        // 阻止异常冒泡
+        $this->stopPropagation();
+        return $response
+            ->withAddedHeader('Content-Type', ' application/json; charset=UTF-8')
+            ->withStatus(500)
+            ->withBody(new SwooleStream($data));
     }
-
     public function isValid(Throwable $throwable): bool
     {
         return true;
     }
-}
+
+}

+ 65 - 160
app/JsonRpc/AdService.php

@@ -1,195 +1,100 @@
 <?php
+
 namespace App\JsonRpc;
-use App\Model\Ad;
-use App\Model\AdPlace;
-use Hyperf\RpcServer\Annotation\RpcService;
-use App\Tools\Result;
-#[RpcService(name: "AdService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
-class AdService implements AdServiceInterface
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class AdService extends AbstractServiceClient implements AdServiceInterface
 {
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'AdService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
     /**
      * @param array $data
-     * @return string
+     * @return array|mixed
      */
-    public function createAd(array $data): array
+    public function createAd(array $data)
     {
-        $insertData = [
-            'name'=>$data['name']??'',
-            'pid'=>$data['pid']??0,
-            'areaid'=>$data['areaid']??0,
-            'amount'=>$data['amount']??0,//浏览数量
-            'introduce'=>$data['introduce']??'',
-            'hits'=>$data['hits']??0, //点击数量
-            'fromtime'=>$data['f_t_date'][0]??0,
-            'totime'=>$data['f_t_date'][1]??0,
-            'text_name'=>$data['text_name']??'',
-            'text_url'=>$data['text_url']??'',
-            'text_title'=>$data['text_title']??'',
-            'image_src'=>$data['image_src']??'',
-            'image_url'=>$data['image_url']??'',
-            'image_alt'=>$data['image_alt']??'',
-            'video_src'=>$data['video_src']??'',//视频
-            'video_url'=>$data['video_url']??'',
-            'video_auto'=>$data['video_auto'] ??0,
-            'video_loop'=>$data['video_loop'] ??0,
-            'status'=>$data['status']??2,
-            'remark'=>$data['remark']??'',
-        ];
-        $result = Ad::query()->insertGetId($insertData);
-        if($result){
-            return Result::success();
-        }else{
-            return Result::error("创建广告失败",500);
-        }
+        return $this->__request(__FUNCTION__, $data);
     }
+
     /**
      * @param int $id
-     * @return array
+     * @return array|mixed
      */
-    public function getAdInfo(int $id): array
+    public function getAdInfo(int $id)
     {
-        $adInfo = Ad::query()->find($id);
-        if (empty($adInfo)) {
-            return Result::error("没有数据",0);
-        }
-        return Result::success($adInfo->toArray());
+        return $this->__request(__FUNCTION__, compact('id'));
     }
 
-    public function getAdList(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAdList(array $data)
     {
-        $where = [
-            ['ad.name','like','%'.$data['keyWord'].'%'],
-        ];
-        if(isset($data['pid'])){
-            $where[]=   ['ad.pid','=',$data['pid']];
-        }
-        $rep = Ad::where($where)
-            ->leftJoin("ad_place","ad.pid","ad_place.id")
-            ->select("ad.*","ad_place.name as place_name","ad_place.typeid")
-            ->limit($data['pageSize'])->orderBy("id","asc")->offset(($data['page']-1)*$data['pageSize'])->get();
-        $count =  Ad::where($where)->count();
-        $data = [
-            'rows'=>$rep->toArray(),
-            'count'=>$count
-        ];
-        if(empty($rep->toArray())){
-            return Result::error("没有数据");
-        }
-        return Result::success($data);
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function updateAd(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function updateAd(array $data)
     {
-        $where = [
-            'id'=>$data['id']
-        ];
-        $insertData = [
-            'name'=>$data['name']??'',
-            'pid'=>$data['pid']??0,
-            'areaid'=>$data['areaid']??0,
-            'amount'=>$data['amount']??0,//浏览数量
-            'introduce'=>$data['introduce']??'',
-            'hits'=>$data['hits']??0, //点击数量
-            'fromtime'=>$data['f_t_date'][0]??0,
-            'totime'=>$data['f_t_date'][1]??0,
-            'text_name'=>$data['text_name']??'',
-            'text_url'=>$data['text_url']??'',
-            'text_title'=>$data['text_title']??'',
-            'image_src'=>$data['image_src']??'',
-            'image_url'=>$data['image_url']??'',
-            'image_alt'=>$data['image_alt']??'',
-            'video_src'=>$data['video_src']??'',//视频
-            'video_url'=>$data['video_url']??'',
-            'video_auto'=>isset($data['video_auto']) && empty($data['video_auto'])?0:$data['video_auto'],
-            'video_loop'=>isset($data['video_loop']) && empty($data['video_loop'])?0:$data['video_loop'],
-            'status'=>$data['status']??2,
-            'remark'=>$data['remark']??'',
-        ];
-        $result = Ad::where($where)->update($insertData);
-        if($result){
-            return Result::success($result);
-        }else{
-            return Result::error("更新失败");
-        }
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function delAd(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delAd(array $data)
     {
-        $result = Ad::where($data)->delete();
-        if(!$result){
-            return Result::error("删除失败");
-        }
-        return Result::success($result);
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function getAdPlaceList(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAdPlaceList(array $data)
     {
-        $where = [
-            ['name','like','%'.$data['keyWord'].'%'],
-        ];
-        if(isset($data['website_id'])){
-            $where[]=   ['website_id','=',$data['website_id']];
-        }
-        $rep = AdPlace::where($where)->limit($data['pageSize'])->orderBy("id","desc")->offset(($data['page']-1)*$data['pageSize'])->get();
-        $count =  AdPlace::where($where)->count();
-        $data = [
-            'rows'=>$rep->toArray(),
-            'count'=>$count
-        ];
-        if(empty($rep->toArray())){
-            return Result::error("没有数据");
-        }
-        return Result::success($data);
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function createAdPlace(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function createAdPlace(array $data)
     {
-        unset($data['size']);
-        $result = AdPlace::query()->insertGetId($data);
-        if($result){
-            return Result::success();
-        }else{
-            return Result::error("创建广告位失败",500);
-        }
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function updateAdPlace(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function updateAdPlace(array $data)
     {
-        $where = [
-            'id'=>$data['id']
-        ];
-        $Insdata = [
-            'website_id'=>$data['website_id']??'',
-            'typeid'=>$data['typeid']??1,
-            'status'=>$data['status']??2,
-            'name'=>$data['name']??'',
-            'thumb'=>$data['thumb']??'',
-            'introduce'=>$data['introduce']??'',
-            'code'=>$data['code']??'',
-            'width'=>empty($data['width'])?0:$data['width'],
-            'height'=>empty($data['height'])?0:$data['height'],
-            'price'=>$data['price']??0,
-        ];
-        var_dump($Insdata);
-        $result = AdPlace::where($where)->update($Insdata);
-        if($result){
-            return Result::success($result);
-        }else{
-            return Result::error("更新失败");
-        }
+        return $this->__request(__FUNCTION__, $data);
     }
 
-    public function delAdPlace(array $data): array
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delAdPlace(array $data)
     {
-        $adList = Ad::where(['pid'=>$data['id']])->get();
-        if($adList->toArray()){
-            return Result::error("广告位里面还有广告,不能删除广告位");
-        }
-        $result = AdPlace::where($data)->delete();
-        if(!$result){
-            return Result::error("删除失败");
-        }
-        return Result::success($result);
+        return $this->__request(__FUNCTION__, $data);
     }
-
 }

+ 8 - 9
app/JsonRpc/AdServiceInterface.php

@@ -5,9 +5,15 @@ interface AdServiceInterface
 {
     /**
      * @param array $data
-     * @return string
+     * @return array
+     */
+    public function createAd(array $data);
+
+    /**
+     * @param int $id
+     * @return array
      */
-    public function createAd(array $data): array;
+    public function getAdInfo(int $id);
 
     /**
      * @param array $data
@@ -27,12 +33,6 @@ interface AdServiceInterface
      */
     public function delAd(array $data);
 
-    /**
-     * @param int $id
-     * @return array
-     */
-    public function getAdInfo(int $id): array;
-
     /**
      * @param array $data
      * @return mixed
@@ -56,5 +56,4 @@ interface AdServiceInterface
      * @return mixed
      */
     public function delAdPlace(array $data);
-
 }

+ 84 - 0
app/JsonRpc/AuthorityService.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class AuthorityService extends AbstractServiceClient implements AuthorityServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'AuthorityService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getMenuList(array $data)
+    {
+
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getMenuInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function updateMenu(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function delMenu(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function addMenu(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getRecursionMenu(array $data )
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getAllMenuList(array $data )
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 53 - 0
app/JsonRpc/AuthorityServiceInterface.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\JsonRpc;
+interface AuthorityServiceInterface
+{
+    /**
+     * 菜单列表
+     * @param array $data
+     * @return array
+     */
+    public function getMenuList(array $data);
+
+    /**
+     * 获取菜单信息
+     * @param array $data
+     * @return array
+     */
+    public function getMenuInfo(array $data);
+
+    /**
+     * 更新菜单
+     * @param array $data
+     * @return array
+     */
+    public function updateMenu(array $data);
+
+    /**
+     * 删除惨淡
+     * @param array $data
+     * @return array
+     */
+    public function delMenu(array $data);
+
+    /**
+     * 创建菜单
+     * @param array $data
+     * @return array
+     */
+    public function addMenu(array $data);
+
+    /**
+     * 查询菜单
+     * @param array $data
+     * @return array
+     */
+    public function getRecursionMenu(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAllMenuList(array $data);
+}

+ 345 - 0
app/JsonRpc/ChatService.php

@@ -0,0 +1,345 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class ChatService extends AbstractServiceClient implements ChatServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'ChatService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getChatChannelList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delChatChannel(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addChatChannel(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 添加申请
+     * @param array $data
+     * @return array
+     */
+    public function addContactApply(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新申请
+     * @param array $data
+     * @return array
+     */
+    public function updateContactApply(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 好友申请列表
+     * @param array $data
+     * @return array
+     */
+    public function getContactApplyList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 好有查询
+     * @param array $data
+     * @return array
+     */
+    public function getContactList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 添加好友
+     * @param array $data
+     * @return array
+     */
+    public function addContact(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新好友
+     * @param array $data
+     * @return array
+     */
+    public function updateContact(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 删除好友
+     * @param array $data
+     * @return array
+     */
+    public function delContact(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 会话列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkSessionList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 添加会话
+     * @param array $data
+     * @return array
+     */
+    public function addTalkSession(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新会话
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkSession(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 删除会话
+     * @param array $data
+     * @return array
+     */
+    public function delTalkSession(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * 聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 添加聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 删除聊天内容
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecords(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * 聊天内容-附件列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkRecordsFileList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 聊天内容-添加附件
+     * @param array $data
+     * @return array
+     */
+    public function addTalkRecordsFile(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 聊天内容 - 更新附件
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkRecordsFile(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 聊天内容 - 删除附件
+     * @param array $data
+     * @return array
+     */
+    public function delTalkRecordsFile(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 群列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 群组 - 创建群
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroup(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 更新群
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroup(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 删除群
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroup(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * 群组 - 群用户列表
+     * @param array $data
+     * @return array
+     */
+    public function getTalkGroupMember(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 全部群用户列表
+     * @param array $data
+     * @return array
+     */
+    public function getAllTalkGroupMember(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 群组 - 创建群用户
+     * @param array $data
+     * @return array
+     */
+    public function addTalkGroupMember(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 更新群用户
+     * @param array $data
+     * @return array
+     */
+    public function updateTalkGroupMember(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 群组 - 删除群用户
+     * @param array $data
+     * @return array
+     */
+    public function delTalkGroupMember(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addTalkSessionAssociation(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function updateTalkSessionAssociation(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    
+
+
+}

+ 228 - 0
app/JsonRpc/ChatServiceInterface.php

@@ -0,0 +1,228 @@
+<?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);
+
+}

+ 150 - 0
app/JsonRpc/CollectorService.php

@@ -0,0 +1,150 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class CollectorService extends AbstractServiceClient implements CollectorServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'CollectorService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delWeb(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getOneRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delRule(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function sendCrawler(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getOneInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addCatid(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addArt(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 86 - 0
app/JsonRpc/CollectorServiceInterface.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace App\JsonRpc;
+
+interface CollectorServiceInterface
+{
+    /**
+     * @param array $data
+     */
+    public function addWeb(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function getWeb(array $data);
+    /**
+     * @param array $data
+     */
+    public function upWeb(array $data);
+    /**
+     * @param array $data
+     */
+    public function delWeb(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getRule(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOneRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upRule(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delRule(array $data);
+
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function sendCrawler(array $data);
+
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getInfo(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOneInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delInfo(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addCatid(array $data);
+     /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addArt(array $data);
+}

+ 19 - 0
app/JsonRpc/DistrictServiceInterface.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\JsonRpc;
+interface DistrictServiceInterface
+{
+
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function getDistrictInfo(int $id);
+
+    /**
+     * @param string $keyword
+     * @param int $pid
+     */
+    public function getDistrictList(string $keyword,int $pid);
+}

+ 56 - 0
app/JsonRpc/LinkService.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class LinkService extends AbstractServiceClient implements LinkServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'LinkService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getLinkList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function createLink(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function updateLink(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function delLink(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 28 - 0
app/JsonRpc/LinkServiceInterface.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\JsonRpc;
+interface LinkServiceInterface
+{
+
+    /**
+     * @param array $data
+     */
+    public function getLinkList(array $data);
+    /**
+     * @param array $data
+     */
+    public function createLink(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function updateLink(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function delLink(array $data);
+
+
+
+}

+ 147 - 0
app/JsonRpc/NewsService.php

@@ -0,0 +1,147 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class NewsService extends AbstractServiceClient implements NewsServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'NewsService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getCategoryList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function categoryList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function addCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function delCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function updateCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getArticleList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function addArticle(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function delArticle(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function updateArticle(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getArticleInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getCategoryInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * 更新资讯状态
+     * @param array $data
+     * @return mixed
+     */
+    public function upArticleStatus(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getWebsiteArticlett(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getWebsiteModelArticles(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    
+
+}

+ 74 - 0
app/JsonRpc/NewsServiceInterface.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\JsonRpc;
+interface NewsServiceInterface
+{
+
+    /**
+     * @param array $data
+     */
+    public function getCategoryList(array $data);
+    /**
+     * @param array $data
+     */
+    public function categoryList(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function addCategory(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function delCategory(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function updateCategory(array $data);
+
+    /**
+     * @param array $data
+    */
+    public function getArticleList(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function addArticle(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function delArticle(array $data);
+    /**
+     * @param array $data
+     */
+    public function updateArticle(array $data);
+    /**
+     * @param array $data
+     */
+    public function getArticleInfo(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getCategoryInfo(array $data);
+    /**
+     * @param array $data
+     *
+     */
+    public function getWebsiteArticlett(array $data);
+    /**
+     * @param array $data
+     */
+    public function getWebsiteModelArticles(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upArticleStatus(array $data);
+
+}

+ 110 - 0
app/JsonRpc/OrderService.php

@@ -0,0 +1,110 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class OrderService extends AbstractServiceClient implements OrderServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'OrderService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAD(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteAd(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOrderListAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getOrderDetailAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function applyOrderStatusAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function editPriceOrderAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function rejectOrderAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function endOrderAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delOrderAdmin(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addAD(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOrderList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getOrderDetail(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function cancelOrder(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delOrderAD(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+}

+ 65 - 0
app/JsonRpc/OrderServiceInterface.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\JsonRpc;
+
+interface OrderServiceInterface
+{
+    /**
+     * @param array $data
+     */
+    public function getAD(array $data);
+    /**
+     * @param array $data
+     */
+    public function getWebsiteAd(array $data);
+    /**
+     * @param array $data
+     */
+    public function getOrderListAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function getOrderDetailAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function applyOrderStatusAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function editPriceOrderAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function rejectOrderAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function endOrderAdmin(array $data);
+    /**
+     * @param array $data
+     */
+    public function delOrderAdmin(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function addAD(array $data);
+    /**
+     * @param array $data
+     */
+    public function getOrderList(array $data);
+    /**
+     * @param array $data
+     */
+    public function getOrderDetail(array $data);
+    /**
+     * @param array $data
+     */
+    public function cancelOrder(array $data);
+    /**
+     * @param array $data
+     */
+    public function delOrderAD(array $data);
+
+}

+ 220 - 0
app/JsonRpc/PublicRpcService.php

@@ -0,0 +1,220 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class PublicRpcService extends AbstractServiceClient implements PublicRpcServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'PublicRpcService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getDistrictList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getUserLevelList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 添加等级
+     * @param array $data
+     * @return array
+     */
+    public function addUserLevel(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 删除等级
+     * @param array $data
+     * @return array
+     */
+    public function delUserLevel(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新等级
+     * @param array $data
+     * @return array
+     */
+    public function updateUserLevel(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getLetterOfComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addLetterOfComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upLetterOfComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function userUpLetterOfComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getLetterOfComplaintInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delLetterOfComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getLetterType(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upLetterType(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addLetterType(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delLetterType(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function checkMeasure(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getDepartment(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getZhinengbumenList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addZhinengbumen(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getZhinengbumen(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getPidZhinengbumen(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delZhinengbumen(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+
+    public function modZhinengbumen(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 132 - 0
app/JsonRpc/PublicRpcServiceInterface.php

@@ -0,0 +1,132 @@
+<?php
+
+namespace App\JsonRpc;
+
+interface PublicRpcServiceInterface
+{
+    /**
+     * @param array $data
+     */
+    public function getDistrictList(array $data);
+    /**
+     * @param array $data
+     */
+    public function getUserLevelList(array $data);
+    /**
+     * @param array $data
+     */
+    public function addUserLevel(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function delUserLevel(array $data);
+
+    /**
+     * @param array $data
+     */
+    public function updateUserLevel(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getLetterOfComplaint(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addLetterOfComplaint(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upLetterOfComplaint(array $data);
+
+    /**
+     * 用户端更新投诉举报信息
+     * @param array $data
+     * @return mixed
+     */
+    public function userUpLetterOfComplaint(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getLetterOfComplaintInfo(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delLetterOfComplaint(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getLetterType(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upLetterType(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addLetterType(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delLetterType(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function checkMeasure(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getDepartment(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getZhinengbumenList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addZhinengbumen(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getZhinengbumen(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getPidZhinengbumen(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delZhinengbumen(array $data); 
+    /**
+     * 
+     */
+    public function modZhinengbumen(array $data);
+}

+ 169 - 0
app/JsonRpc/UserService.php

@@ -0,0 +1,169 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class UserService extends AbstractServiceClient implements UserServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'UserService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param string $name
+     * @param int $gender
+     * @return mixed|string
+     */
+    public function createUser(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param int $id
+     * @return array|mixed
+     */
+    public function getUserInfo(int $id)
+    {
+        return $this->__request(__FUNCTION__, compact('id'));
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getUserList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function verifyUserInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @remark 创建登录日志信息
+     * @param array $data
+     */
+    public function createUserLogin(array $data): mixed{
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新用户信息
+     * @param array $data
+     */
+    public function updateUser(array $data): mixed{
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 更新用户
+     * @param array $data
+     */
+    public function updateUserInfo(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * 删除用户
+     * @param int $id
+     */
+    public function  delUser(int $id){
+        return $this->__request(__FUNCTION__, compact('id'));
+    }
+
+    /**
+     * 添加角色
+     * @param array $data
+     * @return array
+     */
+    public function addRole(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 删除角色
+     * @param array $data
+     * @return array
+     */
+    public function delRole(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 更新角色
+     * @param array $data
+     * @return array
+     */
+    public function updateRole(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 角色列表
+     * @param array $data
+     * @return array
+     */
+    public function roleList(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 角色信息
+     * @param array $data
+     * @return array
+     */
+    public function roleInfo(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWechatInfo(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addWechatInfo(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function changePassword(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upUserStatus(array $data){
+
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function resetPassword(array $data){
+
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 117 - 0
app/JsonRpc/UserServiceInterface.php

@@ -0,0 +1,117 @@
+<?php
+
+namespace App\JsonRpc;
+
+interface UserServiceInterface
+{
+    /**
+     * @param array $data
+     */
+    public function createUser(array $data);
+
+    /**
+     * @param int $id
+     */
+    public function getUserInfo(int $id);
+    /**
+     * @param array $data
+     */
+    public function getUserList(array $data);
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function verifyUserInfo(array $data);
+
+    /**
+     * @remark 创建登录日志信息
+     * @param array $data
+     * @return array
+     */
+    public function createUserLogin(array $data);
+
+    /**
+     * 更新用户信息
+     * @param array $data
+     * @return array
+     */
+    public function updateUser(array $data);
+
+    /**
+     * 更新用户
+     * @param array $data
+     * @return array
+     */
+    public function updateUserInfo(array $data);
+
+    /**
+     * 删除用户
+     * @param int $id
+     * @return array
+     */
+    public function  delUser(int $id);
+
+
+    /**
+     * 添加角色
+     * @param array $data
+     * @return array
+     */
+    public function addRole(array $data);
+
+    /**
+     * 删除角色
+     * @param array $data
+     * @return array
+     */
+    public function delRole(array $data);
+
+    /**
+     * 更新角色
+     * @param array $data
+     * @return array
+     */
+    public function updateRole(array $data);
+
+    /**
+     * 角色列表
+     * @param array $data
+     * @return array
+     */
+    public function roleList(array $data);
+
+    /**
+     * 角色信息
+     * @param array $data
+     * @return array
+     */
+    public function roleInfo(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWechatInfo(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addWechatInfo(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+
+    public function changePassword(array $data);
+
+    public function upUserStatus(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function resetPassword(array $data);
+
+}

+ 452 - 0
app/JsonRpc/WebsiteService.php

@@ -0,0 +1,452 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+
+class WebsiteService extends AbstractServiceClient implements WebsiteServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'WebsiteService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     * @return mixed
+     */
+    public function getWebsitetList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function createWebsite(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsite(int $id, array $data)
+    {
+        return $this->__request(__FUNCTION__,compact('id', 'data'));
+    }
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function delWebsite(int $id)
+    {
+        return $this->__request(__FUNCTION__,compact('id'));
+    }
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function getWebsiteInfo(int $id)
+    {
+        return $this->__request(__FUNCTION__,compact('id'));
+    }
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function getWebsiteColumn(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     * @return mixed
+     */
+    public function getWebsiteColumnList(array $data)
+    {
+//        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize'));
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function createWebsiteColumn(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsiteColumn(int $id, array $data)
+    {
+        return $this->__request(__FUNCTION__,compact('id', 'data'));
+    }
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function delWebsiteColumn(int $id)
+    {
+        return $this->__request(__FUNCTION__,compact('id'));
+    }
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     * @return mixed
+     */
+    public function getWebsiteRoleList(string $keyword, int $page, int $pageSize,int $websiteId)
+    {
+        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize','websiteId'));
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function createWebsiteRole(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsiteRole(int $id, array $data)
+    {
+        return $this->__request(__FUNCTION__,compact('id', 'data'));
+    }
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function delWebsiteRole(int $id)
+    {
+        return $this->__request(__FUNCTION__,compact('id'));
+    }
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     * @return mixed
+     */
+    public function getWebsiteRoleUserList(string $keyword, int $page, int $pageSize,int $websiteId,int $roleId)
+    {
+        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize','websiteId','roleId'));
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function createWebsiteRoleUser(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsiteRoleUser(int $id, array $data)
+    {
+        return $this->__request(__FUNCTION__,compact('id', 'data'));
+    }
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function delWebsiteRoleUser(int $id)
+    {
+        return $this->__request(__FUNCTION__,compact('id'));
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWebsiteId(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWebsiteCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getWebsiteAdvertisement(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+     /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function selectWebsiteDepartment(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function selectWebsiteArea(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteModelCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function selectWebsiteLinks(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+
+
+
+
+
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getAdminIndex(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getTemplateClass(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addTemplateClass(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upTemplateClass(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delTemplateClass(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getTemplate(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addTemplate(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upTemplate(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delTemplate(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function websiteList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addWebsiteCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteAllCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCategoryOnes(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upWebsiteCategoryones(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteAllCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAdminWebsiteCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upWebsiteCategory(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCategoryList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function checkWebsiteName(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function checkWebsiteUrl(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+}

+ 309 - 0
app/JsonRpc/WebsiteServiceInterface.php

@@ -0,0 +1,309 @@
+<?php
+namespace App\JsonRpc;
+interface WebsiteServiceInterface
+{
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     */
+    public function getWebsitetList(array $data);
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function createWebsite(array $data);
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return array
+     */
+    public function updateWebsite(int $id,array $data);
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function delWebsite(int $id);
+
+    /**
+     * 查询网站信息
+     * @param int $id
+     * @return array
+     */
+    public function getWebsiteInfo(int $id);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteColumn(array $data);
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     */
+    public function getWebsiteColumnList(array $data);
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function createWebsiteColumn(array $data);
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return array
+     */
+    public function updateWebsiteColumn(int $id,array $data);
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function delWebsiteColumn(int $id);
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     */
+    public function getWebsiteRoleList(string $keyword,int $page,int $pageSize,int $websiteId);
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function createWebsiteRole(array $data);
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return array
+     */
+    public function updateWebsiteRole(int $id,array $data);
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function delWebsiteRole(int $id);
+
+    /**
+     * @param string $keyword
+     * @param int $page
+     * @param int $pageSize
+     */
+    public function getWebsiteRoleUserList(string $keyword,int $page,int $pageSize,int $websiteId,int $roleId);
+
+    /**
+     * @param array $data
+     * @return array
+     */
+    public function createWebsiteRoleUser(array $data);
+
+    /**
+     * @param int $id
+     * @param array $data
+     * @return array
+     */
+    public function updateWebsiteRoleUser(int $id,array $data);
+
+    /**
+     * @param int $id
+     * @return array
+     */
+    public function delWebsiteRoleUser(int $id);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteId(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function getWebsiteCategory(array $data);
+     
+
+
+
+
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function getWebsiteAdvertisement(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function selectWebsiteDepartment(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function selectWebsiteArea(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function getWebsiteModelCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function selectWebsiteLinks(array $data);
+
+
+
+
+
+
+
+
+
+
+
+
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAdminIndex(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getTemplateClass(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addTemplateClass(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upTemplateClass(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delTemplateClass(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getTemplate(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addTemplate(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upTemplate(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delTemplate(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function websiteList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addWebsiteCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getAdminWebsiteCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upWebsiteCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCategoryList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteAllCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCategoryOnes(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upWebsiteCategoryones(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteAllCategory(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function checkWebsiteName(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function checkWebsiteUrl(array $data);
+
+}

+ 81 - 0
app/Listener/DbQueryExecutedListener.php

@@ -0,0 +1,81 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Middleware\Auth;
+
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
+use Psr\Container\ContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Hyperf\Context\Context;
+
+use Phper666\JWTAuth\JWT;
+class FooMiddleware implements MiddlewareInterface
+{
+    protected ContainerInterface $container;
+
+    protected RequestInterface $request;
+
+    protected HttpResponse $response;
+    protected JWT $JWT;
+
+    public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request,Jwt $JWT)
+    {
+        $this->container = $container;
+        $this->response = $response;
+        $this->request = $request;
+        $this->JWT = $JWT;
+
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+
+        $header = $request->getHeaders();
+        try {
+            if($header &&  isset($header['token']) && $header['token'][0]!='null' && $header['token'][0]!='' && isset($header['token'][0])){
+                var_dump("token类型:",$header['token'][0]);
+                $ver = $this->JWT->getClaimsByToken($header['token'][0]);
+                $tokenTime =  $this->JWT->getTokenDynamicCacheTime($header['token'][0]);
+                if($tokenTime==0){
+                   return $this->response->json(
+                       [
+                           'code' => -1,
+                           'data' => [],
+                           'message' => 'token无效,请重新登录',
+                       ]
+                   );
+                }
+//                var_dump("中间件:",$ver);
+                Context::set("UserId",$ver['uid']);
+                Context::set("TypeId",$ver['type_id']);
+                if ($ver) {
+                    return $handler->handle($request);
+                }
+            }else{
+                return $this->response->json(
+                    [
+                        'code' => -1,
+                        'data' => [],
+                        'message' => 'token无效,请重新登录',
+                    ]
+                );
+            }
+
+        }catch (\Exception $e){
+            var_dump("错误消息1:",$e->getMessage(),$e->getCode());
+            return $this->response->json(
+                [
+                    'code' => $e->getCode(),
+                    'data' => [],
+                    'message' => $e->getMessage(),
+                ]
+            );
+        }
+        return false;
+    }
+}

+ 91 - 0
app/Middleware/Auth/WebMiddleware.php

@@ -0,0 +1,91 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Middleware\Auth;
+
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
+use Psr\Container\ContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+use Hyperf\Context\Context;
+use App\JsonRpc\WebsiteServiceInterface;
+use Phper666\JWTAuth\JWT;
+class WebMiddleware implements MiddlewareInterface
+{
+    protected ContainerInterface $container;
+
+    protected RequestInterface $request;
+
+    protected HttpResponse $response;
+    protected JWT $JWT;
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+    public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request,Jwt $JWT)
+    {
+        $this->container = $container;
+        $this->response = $response;
+        $this->request = $request;
+        $this->JWT = $JWT;
+
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+
+        $header = $request->getHeaders();
+        try {
+          
+            if($header &&  isset($header['origin']) && $header['origin'][0]!='null' && isset($header['origin'][0])){
+                $origin = $header['origin'][0];
+                $logindevice = explode("//", $origin);
+                $data = [
+                    'website_url'=>$logindevice[1]
+                ];
+                // var_dump("222:",$data);
+                $result = $this->websiteServiceClient->getWebsiteId($data);
+                // var_dump("3333333:",$result);
+                if(!isset($result['data']['id']) || !$result['data']['id']){
+                    return $this->response->json(
+                        [
+                            'code' => -1,
+                            'data' => [],
+                            'message' => '网站不存在',
+                        ]
+                    );
+                }
+                // var_dump("获取站点id:",$result);
+                Context::set("SiteId",$result['data']['id']);
+                if ($result) {
+                    return $handler->handle($request);
+                }
+            }else{
+                return $this->response->json(
+                    [
+                        'code' => -1,
+                        'data' => [],
+                        'message' => 'origin:必填',
+                    ]
+                );
+            }
+
+        }catch (\Exception $e){
+            var_dump("错误消息:",$e->getMessage(),$e->getCode());
+            return $this->response->json(
+                [
+                    'code' => $e->getCode(),
+                    'data' => [],
+                    'message' => '网址必填:'.$e->getMessage(),
+                ]
+            );
+        }
+        return false;
+    }
+}

+ 31 - 0
app/Middleware/CorsMiddleware.php

@@ -0,0 +1,31 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Middleware;
+
+use Hyperf\Context\Context;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+class CorsMiddleware implements MiddlewareInterface
+{
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        $response = Context::get(ResponseInterface::class);
+        $response = $response
+            ->withHeader('Access-Control-Allow-Origin', '*')
+            ->withHeader('Access-Control-Allow-Credentials', 'true')
+            // Headers 可以根据实际情况进行改写。
+            ->withHeader('Access-Control-Allow-Headers', '*');
+
+        Context::set(ResponseInterface::class, $response);
+        if ($request->getMethod() == 'OPTIONS') {
+            return $response;
+        }
+//        var_dump($request);
+        return $handler->handle($request);
+    }
+}

+ 63 - 0
app/Middleware/JWTAuthMiddleware.php

@@ -0,0 +1,63 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * This is my open source code, please do not use it for commercial applications.
+ * For the full copyright and license information,
+ * please view the LICENSE file that was distributed with this source code
+ *
+ * @author Yuandong<837215079@qq.com>
+ * @link   https://github.com/gzydong/hyperf-chat
+ */
+
+namespace App\Middleware;
+
+use Hyperf\HttpServer\Contract\RequestInterface;
+use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+/**
+ * Http Token 授权验证中间件
+ *
+ * @package App\Middleware
+ */
+class JWTAuthMiddleware implements MiddlewareInterface
+{
+    /**
+     * @var RequestInterface
+     */
+    protected $request;
+
+    /**
+     * @var HttpResponse
+     */
+    protected $response;
+
+    /**
+     * 授权验证守卫
+     *
+     * @var string
+     */
+    private $guard = 'jwt';
+
+    public function __construct(HttpResponse $response, RequestInterface $request)
+    {
+        $this->response = $response;
+        $this->request  = $request;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        if (auth($this->guard)->guest()) {
+            return $this->response->withStatus(401)->json([
+                'code'    => 401,
+                'message' => 'Token authentication does not pass !',
+            ]);
+        }
+
+        return $handler->handle($request);
+    }
+}

+ 56 - 0
app/Middleware/WebSocketAuthMiddleware.php

@@ -0,0 +1,56 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * This is my open source code, please do not use it for commercial applications.
+ * For the full copyright and license information,
+ * please view the LICENSE file that was distributed with this source code
+ *
+ * @author Yuandong<837215079@qq.com>
+ * @link   https://github.com/gzydong/hyperf-chat
+ */
+
+namespace App\Middleware;
+
+use Hyperf\Di\Annotation\Inject;
+use Psr\Container\ContainerInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Server\MiddlewareInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+
+/**
+ * WebSocket token 授权验证中间件
+ *
+ * @package App\Middleware
+ */
+class WebSocketAuthMiddleware implements MiddlewareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    protected $container;
+
+    /**
+     * 授权验证守卫
+     *
+     * @var string
+     */
+    private $guard = 'jwt';
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
+    {
+        // 授权验证拦截握手请求并实现权限检查
+//        if (auth($this->guard)->guest()) {
+//            return $this->container->get(\Hyperf\HttpServer\Contract\ResponseInterface::class)->raw('Forbidden');
+//        }
+
+        return $handler->handle($request);
+    }
+}

+ 14 - 0
app/Model/Model.php

@@ -0,0 +1,14 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Process;
+
+use Hyperf\AsyncQueue\Process\ConsumerProcess;
+use Hyperf\Process\Annotation\Process;
+#[Process]
+class AsyncQueueConsumer extends ConsumerProcess
+{
+    protected string $queue = 'import';
+
+}

+ 34 - 0
app/Service/GatherQueueService.php

@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Service;
+
+use App\Job\GatherExampleJob;
+use Hyperf\AsyncQueue\Driver\DriverFactory;
+use Hyperf\AsyncQueue\Driver\DriverInterface;
+/**
+ * @Job(name="default")
+ */
+class GatherQueueService
+{
+    protected DriverInterface $driver;
+
+    public function __construct(DriverFactory $driverFactory)
+    {
+        $this->driver = $driverFactory->get('default');
+    }
+
+    /**
+     * 生产消息.
+     * @param $params 数据
+     * @param int $delay 延时时间 单位秒
+     */
+    public function push($params, int $delay = 0): bool
+    {
+        // 这里的 `ExampleJob` 会被序列化存到 Redis 中,所以内部变量最好只传入普通数据
+        // 同理,如果内部使用了注解 @Value 会把对应对象一起序列化,导致消息体变大。
+        // 所以这里也不推荐使用 `make` 方法来创建 `Job` 对象。
+        return $this->driver->push(new GatherExampleJob($params), $delay);
+    }
+}

+ 32 - 0
app/Service/ImportQueueService.php

@@ -0,0 +1,32 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Service;
+
+use App\Job\ImportExampleJob;
+use Hyperf\AsyncQueue\Driver\DriverFactory;
+use Hyperf\AsyncQueue\Driver\DriverInterface;
+
+class ImportQueueService
+{
+    protected DriverInterface $driver;
+
+    public function __construct(DriverFactory $driverFactory)
+    {
+        $this->driver = $driverFactory->get('import');
+    }
+
+    /**
+     * 生产消息.
+     * @param $params 数据
+     * @param int $delay 延时时间 单位秒
+     */
+    public function push($params, int $delay = 0): bool
+    {
+        // 这里的 `ExampleJob` 会被序列化存到 Redis 中,所以内部变量最好只传入普通数据
+        // 同理,如果内部使用了注解 @Value 会把对应对象一起序列化,导致消息体变大。
+        // 所以这里也不推荐使用 `make` 方法来创建 `Job` 对象。
+        return $this->driver->push(new ImportExampleJob($params), $delay);
+    }
+}

+ 87 - 0
app/Service/Message/ReceiveHandleService.php

@@ -0,0 +1,87 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Service\Message;
+
+
+use App\Service\SocketClientService;
+
+use Swoole\Http\Response;
+use Swoole\WebSocket\Frame;
+use Swoole\WebSocket\Server;
+
+class ReceiveHandleService
+{
+    /**
+     * @var SocketClientService
+     */
+    private $client;
+
+    // 消息事件绑定
+    const EVENTS = [
+        EVENT_TALK          => 'onTalk',
+        EVENT_TALK_KEYBOARD => 'onKeyboard',
+    ];
+
+    /**
+     * ReceiveHandleService constructor.
+     *
+     * @param SocketClientService $client
+     */
+//    public function __construct(SocketClientService $client)
+//    {
+//        $this->client = $client;
+//    }
+
+    /**
+     * 对话文本消息
+     *
+     * @param Response|Server $server
+     * @param Frame           $frame
+     * @param array|string    $data 解析后数据
+     * @return void
+     */
+    public function onTalk($server, Frame $frame, $data)
+    {
+
+        var_dump("测试数据发送==========");
+        return true;
+//        $user_id = $this->client->findFdUserId($frame->fd);
+//        if ($user_id != $data['sender_id']) return;
+//
+//        // 验证消息类型
+//        if (!in_array($data['talk_type'], TalkModeConstant::getTypes())) return;
+//
+//        // 验证发送消息用户与接受消息用户之间是否存在好友或群聊关系
+//        $isTrue = UserRelation::isFriendOrGroupMember($user_id, (int)$data['receiver_id'], (int)$data['talk_type']);
+//        if (!$isTrue) {
+//            $server->push($frame->fd, json_encode(['event_error', [
+//                'message' => '暂不属于好友关系或群聊成员,无法发送聊天消息!'
+//            ]]));
+//            return;
+//        }
+
+//        di()->get(TalkMessageService::class)->insertText([
+//            'talk_type'   => $data['talk_type'],
+//            'user_id'     => $data['sender_id'],
+//            'receiver_id' => $data['receiver_id'],
+//            'content'     => $data['text_message'],
+//        ]);
+    }
+
+    /**
+     * 键盘输入消息
+     *
+     * @param Response|Server $server
+     * @param Frame           $frame
+     * @param array|string    $data 解析后数据
+     * @return void
+     */
+//    public function onKeyboard($server, Frame $frame, $data)
+//    {
+//        event()->dispatch(new TalkEvent(TalkEventConstant::EVENT_TALK_KEYBOARD, [
+//            'sender_id'   => (int)$data['sender_id'],
+//            'receiver_id' => (int)$data['receiver_id'],
+//        ]));
+//    }
+}

+ 35 - 0
app/Service/RedisInterface.php

@@ -0,0 +1,35 @@
+<?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
+ */
+
+namespace App\Service;
+
+use Hyperf\Di\Annotation\Inject;
+use Psr\Container\ContainerInterface;
+abstract class RedisInterface
+{
+
+    protected $redis;
+    #[Inject]
+    protected ContainerInterface $container;
+    public function __construct()
+    {
+        /**
+         * 生成图片验证码
+         * @return string
+         * @throws \Psr\Container\ContainerExceptionInterface
+         * @throws \Psr\Container\NotFoundExceptionInterface
+         * @throws \RedisException
+         */
+       $this->redis =  $this->container->get(\Hyperf\Redis\Redis::class);
+
+    }
+}

+ 97 - 0
app/Service/RedisService.php

@@ -0,0 +1,97 @@
+<?php
+
+namespace App\Service;
+
+use App\Cache\SocketFdBindUser;
+use App\Cache\SocketUserBindFds;
+
+/**
+ * websocket关系存储
+ *
+ * @package App\Service
+ */
+class RedisService extends RedisInterface
+{
+    protected $prefix_fn = 'chat_fn';
+    protected $prefix_user = 'chat_user';
+    protected $prefix_user_info = 'userListInfo';
+    /**
+     * 绑定fd和用户关系
+     * @param string $fid
+     * @param int $userId
+     * @param $run_id
+     * @return void
+     * @throws \RedisException
+     */
+    public function bind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
+    {
+        //站点通道+用户
+        $this->redis->hSet($run_id,$this->prefix_fn.$fid,$userId);
+        //站点用户+通道
+        $this->redis->hSet($run_id,$this->prefix_user.$userId,$fid);
+    }
+
+    /**
+     * 解绑通道和用户关系
+     * @param string $fid
+     * @param int $userId
+     * @param $run_id
+     * @return void
+     * @throws \RedisException
+     */
+    public function unbind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
+    {
+        $this->redis->hDel($run_id,$this->prefix_fn.$fid);
+
+        $this->redis->hDel($run_id,$this->prefix_user.$userId);
+    }
+
+    /**
+     * 通过FD获取userID
+     * @param string $fid
+     * @param $run_id
+     * @return false|\Redis|string
+     * @throws \RedisException
+     */
+    public function findUser(string $fid, $run_id = SERVER_RUN_ID)
+    {
+        return $this->redis->hGet($run_id,$this->prefix_fn.$fid);
+    }
+
+    /**
+     * 通过UserID 获取fd
+     * @param int $userId
+     * @param $run_id
+     * @return false|\Redis|string
+     * @throws \RedisException
+     */
+    public function findFd(int $userId, $run_id = SERVER_RUN_ID)
+    {
+        return $this->redis->hGet($run_id,$this->prefix_user.$userId);
+    }
+
+    /**
+     * 存储用户信息
+     * @param int $userId
+     * @param array $data
+     * @return void
+     * @throws \RedisException
+     */
+    public function setUserInfo(string $userId,array $data)
+    {
+        $this->redis->hSet($this->prefix_user_info,$userId,json_encode($data));
+    }
+
+    /**
+     * 获取用户信息
+     * @param int $userId
+     * @return void
+     * @throws \RedisException
+     */
+    public function getUserInfo(string $userId)
+    {
+        $this->redis->hGet($this->prefix_user_info,$userId);
+    }
+
+
+}

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

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

+ 89 - 0
app/Service/SocketClientService.php

@@ -0,0 +1,89 @@
+<?php
+
+namespace App\Service;
+
+//use App\Cache\SocketFdBindUser;
+//use App\Cache\SocketUserBindFds;
+
+/**
+ * Socket客户端ID服务
+ *
+ * @package App\Service
+ */
+class SocketClientService
+{
+    /**
+     * 客户端fd与用户ID绑定关系
+     *
+     * @param int    $fd      客户端fd
+     * @param int    $user_id 用户ID
+     * @param string $run_id  服务运行ID(默认当前服务ID)
+     */
+//    public function bind(int $fd, int $user_id, $run_id = SERVER_RUN_ID)
+//    {
+//        SocketFdBindUser::getInstance()->bind($fd, $user_id, $run_id);
+//        SocketUserBindFds::getInstance()->bind($fd, $user_id, $run_id);
+//    }
+
+    /**
+     * 解除指定的客户端fd与用户绑定关系
+     *
+     * @param int    $fd     客户端ID
+     * @param string $run_id 服务运行ID(默认当前服务ID)
+     */
+//    public function unbind(int $fd, $run_id = SERVER_RUN_ID)
+//    {
+//        $user_id = $this->findFdUserId($fd);
+//
+//        SocketFdBindUser::getInstance()->unBind($fd, $run_id);
+//        SocketUserBindFds::getInstance()->unBind($fd, $user_id, $run_id);
+//    }
+
+    /**
+     * 检测用户当前是否在线(指定运行服务器)
+     *
+     * @param int    $user_id 用户ID
+     * @param string $run_id  服务运行ID(默认当前服务ID)
+     * @return bool
+     */
+//    public function isOnline(int $user_id, $run_id = SERVER_RUN_ID): bool
+//    {
+//        return SocketUserBindFds::getInstance()->isOnline($user_id, $run_id);
+//    }
+
+    /**
+     * 检测用户当前是否在线(查询所有在线服务器)
+     *
+     * @param int   $user_id 用户ID
+     * @param array $run_ids 服务运行ID
+     * @return bool
+     */
+//    public function isOnlineAll(int $user_id, array $run_ids = []): bool
+//    {
+//        return SocketUserBindFds::getInstance()->isOnlineAll($user_id, $run_ids);
+//    }
+
+    /**
+     * 查询客户端fd对应的用户ID
+     *
+     * @param int    $fd     客户端ID
+     * @param string $run_id 服务运行ID(默认当前服务ID)
+     * @return int
+     */
+    public function findFdUserId(int $fd, $run_id = SERVER_RUN_ID): int
+    {
+//        return SocketFdBindUser::getInstance()->findUserId($fd, $run_id);
+    }
+
+    /**
+     * 查询用户的客户端fd集合(用户可能存在多端登录)
+     *
+     * @param int    $user_id 用户ID
+     * @param string $run_id  服务运行ID(默认当前服务ID)
+     * @return array
+     */
+//    public function findUserFds(int $user_id, $run_id = SERVER_RUN_ID): array
+//    {
+//        return SocketUserBindFds::getInstance()->findFds($user_id, $run_id);
+//    }
+}

+ 96 - 0
app/Tools/CommonService.php

@@ -0,0 +1,96 @@
+<?php
+namespace App\Tools;
+use App\Constants\ErrorCode;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\HttpMessage\Upload\UploadedFile;
+use App\Tools\Result;
+use ZX\Tools\File\MimeTypes;
+use function Hyperf\Support\env;
+use Hyperf\HttpServer\Contract\RequestInterface;
+
+
+class CommonService
+{
+    #[Inject]
+    protected RequestInterface $request;
+    public static function uploadFile(UploadedFile $uploadedFile, array $acceptExt, string $fileType = 'image')
+    {
+        $ext = $uploadedFile->getExtension();
+        if (!in_array($ext, $acceptExt)) {
+            return Result::error('文件名后缀不允许');
+        }
+        //图片检测安全
+        if ($fileType == 'image') {
+            $res = self::checkMimeType($uploadedFile, $ext);
+            if ($res == false) {
+                return Result::error('文件安全检测未通过');
+            }
+        }
+        $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 = time().mt_rand(1, 1000000) . '.' . $ext;
+        $finalPath = BASE_PATH . DIRECTORY_SEPARATOR . $allDir . DIRECTORY_SEPARATOR . $fileName;
+        $showPath = $filePath . DIRECTORY_SEPARATOR . $fileName;
+        $uploadedFile->moveTo($finalPath);
+
+        return ['id' => uniqid(), 'src' => $showPath, 'fileName' => $fileName,'fileType'=>$ext];
+    }
+
+
+    //检测文件是否合法
+    public static function checkMimeType(UploadedFile $uploadedFile, string $ext = '')
+    {
+        try {
+            $filePath = $uploadedFile->getRealPath();
+            $fileMimeType = mime_content_type($filePath);
+            $mimeTypes = MimeTypes::getImage();
+            $isExist = array_key_exists($fileMimeType, $mimeTypes);
+            if (!$isExist) {
+                return Result::error('非允许mime types类型');
+            }
+            list($width, $height, $type, $attr) = getimagesize($filePath, $ext);
+            if ($width <= 0 || $height <= 0) {
+                return false;
+            } else {
+                return true;
+            }
+
+        } catch (\Exception $e) {
+            return false;
+        }
+
+    }
+
+    public  function imgUrl(string $str)
+    {
+        $scheme = $this->request->getUri()->getScheme() ?? 'http';
+        $host =  $this->request->getUri()->getHost() ?? '127.0.0.1';
+        $port = $this->request->getUri()->getPort() ?? '';
+
+        $url = '';
+        if ($port == 80 || $port == 443 || empty($port)) {
+            $url = "{$scheme}://{$host}/{$str}";
+        } else {
+            $url = "{$scheme}://{$host}:{$port}/{$str}";
+        }
+        return $url;
+    }
+
+    /**
+     * 获取用户IP
+     * @return mixed|string
+     */
+    public  function userIp()
+    {
+        $Ip = $this->request->getHeader('x-forwarded-for')[0] ?? $this->request->getHeader('x-real-ip')[0] ?? $this->request->getServerParams()['remote_addr'] ?? '0.0.0.0';
+        return $Ip;
+    }
+
+
+}

+ 192 - 0
app/Tools/PublicData.php

@@ -0,0 +1,192 @@
+<?php
+namespace App\Tools;
+use Hyperf\Snowflake\IdGeneratorInterface;
+use Hyperf\Context\ApplicationContext;
+
+class PublicData
+{
+    /**
+     * 递归查询
+     * @param $menuItems
+     * @param $parentId
+     * @return array
+     */
+    public static  function buildMenuTree($menuItems, $parentId = 0) {
+        $tree = [];
+        foreach ($menuItems as $item) {
+            if ($item['pid'] == $parentId) {
+                // 找到子菜单
+                $children = self::buildMenuTree($menuItems, $item['id']);
+                // 如果子菜单存在,则添加到当前菜单的children中
+                if ($children) {
+                    $item['children'] = $children;
+                }
+                // 将当前菜单添加到树中
+                $tree[] = $item;
+            }
+        }
+        return $tree;
+    }
+
+    /**
+     * 把数组里面的某一个字段作为key
+     * @param $array
+     * @param $column
+     * @return array
+     */
+    public static  function arrayColumnAsKey($array, $column) {
+        $result = [];
+        foreach ($array as $item) {
+            if (isset($item[$column])) {
+                $result[$item[$column]] = $item;
+            } else {
+                // 如果字段不存在,你可以选择跳过、使用默认值或抛出异常
+                // 这里我们选择跳过
+                continue;
+            }
+        }
+        return $result;
+    }
+    /**
+     * 计算两个时间差的天数
+     * @param $sTime
+     * @param $eTime
+     * @return float
+     */
+    public static function residueDay($sTime,$eTime)
+    {
+        $startTime = strtotime($sTime);
+        $endTime = strtotime($eTime);
+        $diffDays = floor(($endTime - $startTime) / (60 * 60 * 24));
+        return $diffDays;
+    }
+
+    public static function uuid()
+    {
+        $container = ApplicationContext::getContainer();
+        $generator = $container->get(IdGeneratorInterface::class);
+
+        return $generator->generate();
+    }
+
+    public static function http_get($url)
+    {
+        $oCurl = curl_init();
+        if (stripos($url, "https://") !== false) {
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
+            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
+        }
+        curl_setopt($oCurl, CURLOPT_URL, $url);
+        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
+        $sContent = curl_exec($oCurl);
+        $aStatus = curl_getinfo($oCurl);
+        curl_close($oCurl);
+        if (intval($aStatus["http_code"]) == 200) {
+            return $sContent;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * POST 请求
+     * @param string $url
+     * @param array $param
+     * @param boolean $post_file 是否文件上传
+     * @return string content
+     */
+    public static function http_post($url, $param, $post_file = false)
+    {
+        $oCurl = curl_init();
+        if (stripos($url, "https://") !== false) {
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
+            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
+        }
+        if (is_string($param) || $post_file) {
+            $strPOST = $param;
+        } else {
+            $aPOST = [];
+            foreach ($param as $key => $val) {
+                $aPOST[] = $key . "=" . urlencode($val);
+            }
+            $strPOST = join("&", $aPOST);
+        }
+        curl_setopt($oCurl, CURLOPT_URL, $url);
+        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($oCurl, CURLOPT_POST, true);
+        curl_setopt($oCurl, CURLOPT_POSTFIELDS, $strPOST);
+        $sContent = curl_exec($oCurl);
+        $aStatus = curl_getinfo($oCurl);
+        curl_close($oCurl);
+        if (intval($aStatus["http_code"]) == 200) {
+            return $sContent;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * POST 请求
+     * @param string $url
+     * @param array $param
+     * @param boolean $post_file 是否文件上传
+     * @return string content
+     */
+    public static function http_post_zp($url, $data, $options = [])
+    {
+
+        // 初始化CURL会话
+        $ch = curl_init($url);
+        var_dump("参数:",$data);
+        // 设置CURL选项
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
+        curl_setopt($ch, CURLOPT_HEADER, false); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
+        curl_setopt($ch, CURLOPT_POST, true); // 发送一个常规的POST请求。
+        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // 要传递的POST数据,这里使用http_build_query将数组转换为URL编码的查询字符串。
+        $headers = [
+            'Authorization: Bearer be1856920c54ac537b530d69bc2eda73.gOO2BMq9NXavzEMq',
+            'Content-Type: application/json',
+//            'Custom-Header: customHeaderValue'
+        ];
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        // 如果有额外的CURL选项,则合并它们
+        if (!empty($options)) {
+            curl_setopt_array($ch, $options);
+        }
+
+        // 执行CURL会话并获取响应
+        $response = curl_exec($ch);
+        // 检查是否有CURL错误
+        if (curl_errno($ch)) {
+            $error_msg = curl_error($ch);
+            curl_close($ch);
+            throw new Exception("CURL Error: $error_msg");
+        }
+
+        // 获取HTTP状态码
+        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+
+        // 关闭CURL会话
+        curl_close($ch);
+
+        // 返回一个包含响应和HTTP状态码的数组
+        $responseBody = $response;
+        $headerEnd = strpos($response, "\r\n\r\n");
+
+        if ($headerEnd !== false) {
+            // 去除响应头,只保留响应体
+            $responseBody = substr($response, $headerEnd + 4); // +4 是因为 "\r\n\r\n" 有4个字符
+//            echo $responseBody; // 输出:This is the response body.
+        } else {
+            // 如果没有找到空行,可能响应格式不正确或没有响应头
+//            echo "No headers found in response.";
+        }
+        return [
+            'response' => $responseBody,
+            'http_code' => $http_code
+        ];
+    }
+
+}

+ 3 - 0
app/Tools/Result.php

@@ -3,6 +3,7 @@ namespace App\Tools;
 use App\Constants\ErrorCode;
 class Result
 {
+    protected Request $request;
     public static function success($data = [])
     {
         return static::result(ErrorCode::SUCCESS, ErrorCode::getMessage(ErrorCode::SUCCESS), $data);
@@ -23,4 +24,6 @@ class Result
             'data' => $data,
         ];
     }
+
+
 }

+ 21 - 6
composer.json

@@ -13,9 +13,14 @@
     "license": "Apache-2.0",
     "require": {
         "php": ">=8.1",
+        "death_satan/hyperf-validate": "^3.71",
         "doctrine/annotations": "^2.0",
+        "easyswoole/verifycode": "3.x",
+        "friendsofhyperf/openai-client": "^3.1",
+        "hyperf/amqp": "^3.1",
+        "hyperf/async-queue": "^3.1",
         "hyperf/cache": "~3.1.0",
-        "hyperf/command": "~3.1.0",
+        "hyperf/command": "^3.1",
         "hyperf/config": "~3.1.0",
         "hyperf/config-nacos": "^3.1",
         "hyperf/constants": "^3.1",
@@ -27,16 +32,22 @@
         "hyperf/guzzle": "~3.1.0",
         "hyperf/http-server": "~3.1.0",
         "hyperf/json-rpc": "*",
-        "hyperf/logger": "~3.1.0",
+        "hyperf/logger": "^3.1",
         "hyperf/memory": "~3.1.0",
         "hyperf/nacos": "^3.1",
         "hyperf/process": "~3.1.0",
-        "hyperf/redis": "~3.1.0",
+        "hyperf/redis": "^3.1",
+        "hyperf/rpc-client": "^3.1",
         "hyperf/rpc-server": "*",
         "hyperf/service-governance": "^3.1",
         "hyperf/service-governance-consul": "^3.1",
         "hyperf/service-governance-nacos": "^3.1",
-        "hyperf/utils": "^3.1"
+        "hyperf/snowflake": "^3.1",
+        "hyperf/translation": "^3.1",
+        "hyperf/validation": "^3.1",
+        "hyperf/websocket-server": "^3.1",
+        "openai-php/client": "^0.10.3",
+        "phper666/jwt-auth": "^4.0"
     },
     "require-dev": {
         "friendsofphp/php-cs-fixer": "^3.0",
@@ -45,7 +56,8 @@
         "hyperf/watcher": "^3.1",
         "mockery/mockery": "^1.0",
         "phpstan/phpstan": "^1.0",
-        "swoole/ide-helper": "^5.0"
+        "swoole/ide-helper": "^5.0",
+        "zx/php-tools": "^0.0.1"
     },
     "suggest": {
         "ext-openssl": "Required to use HTTPS.",
@@ -69,7 +81,10 @@
     "prefer-stable": true,
     "config": {
         "optimize-autoloader": true,
-        "sort-packages": true
+        "sort-packages": true,
+        "allow-plugins": {
+            "php-http/discovery": true
+        }
     },
     "extra": [],
     "scripts": {

File diff suppressed because it is too large
+ 590 - 95
composer.lock


+ 22 - 0
config/api/ad.php

@@ -0,0 +1,22 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\AdController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/ad', function () {
+        Router::post('/createAd', [AdController::class, 'createAd']);
+        Router::post('/createAdPlace', [AdController::class, 'createAdPlace']);
+        Router::get('/getAdInfo', [AdController::class, 'getAdInfo']);
+        Router::get('/getAdList', [AdController::class, 'getAdList']);
+        Router::post('/updateAd', [AdController::class, 'updateAd']);
+        Router::post('/delAd', [AdController::class, 'delAd']);
+        Router::get('/getAdPlaceList', [AdController::class, 'getAdPlaceList']);
+        Router::post('/updateAdPlace', [AdController::class, 'updateAdPlace']);
+        Router::post('/delAdPlace', [AdController::class, 'delAdPlace']);
+    },
+    ['middleware' => [FooMiddleware::class]]
+);
+

+ 26 - 0
config/api/authority.php

@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\AuthorityController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/authority', function () {
+        //获取菜单列表
+        Router::get('/getMenuList', [AuthorityController::class, 'getMenuList']);
+        //删除菜单
+        Router::post('/delMenu', [AuthorityController::class, 'delMenu']);
+        //添加菜单
+        Router::post('/addMenu', [AuthorityController::class, 'addMenu']);
+        //获取菜单信息
+        Router::get('/getMenuInfo', [AuthorityController::class, 'getMenuInfo']);
+        //更新菜单
+        Router::post('/updateMenu', [AuthorityController::class, 'updateMenu']);
+        //用户拥有的菜单
+        Router::get('/getRecursionMenu', [AuthorityController::class, 'getRecursionMenu']);
+        //获取所有菜单列表
+        Router::get('/getAllMenuList', [AuthorityController::class, 'getAllMenuList']);
+    },
+    ['middleware' => [FooMiddleware::class]]
+);

+ 16 - 0
config/api/chat.php

@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+use App\Controller\ChatController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+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]]
+);
+

+ 56 - 0
config/api/collector.php

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

+ 5 - 0
config/api/complaint.php

@@ -0,0 +1,5 @@
+<?php
+
+declare(strict_types=1);
+use Hyperf\HttpServer\Router\Router;
+Router::post('/api/addComplaint', 'App\Controller\publicController@addComplaint');

+ 16 - 0
config/api/link.php

@@ -0,0 +1,16 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\LinkController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/link', function () {
+        Router::get('/getLinkList', [LinkController::class, 'getLinkList']);
+        Router::post('/createLink', [LinkController::class, 'createLink']);
+        Router::post('/updateLink', [LinkController::class, 'updateLink']);
+        Router::post('/delLink', [LinkController::class, 'delLink']);
+    },
+    ['middleware' => [FooMiddleware::class]]
+);

+ 9 - 0
config/api/login.php

@@ -0,0 +1,9 @@
+<?php
+
+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');
+

+ 37 - 0
config/api/news.php

@@ -0,0 +1,37 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\NewsController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/news', function () {
+        //获取导航池列表
+        Router::get('/getCategoryList', [NewsController::class, 'getCategoryList']);
+        //导航池 筛选 搜索
+        Router::get('/categoryList', [NewsController::class, 'categoryList']);
+        //添加导航池
+        Router::post('/addCategory', [NewsController::class, 'addCategory']);
+        //更新导航池
+        Router::post('/updateCategory', [NewsController::class, 'updateCategory']);
+        //删除导航池
+        Router::post('/delCategory', [NewsController::class, 'delCategory']);
+        //获取资讯列表
+        Router::get('/getArticleList', [NewsController::class, 'getArticleList']);
+        //添加资讯
+        Router::post('/addArticle', [NewsController::class, 'addArticle']);
+        //修改资讯
+        Router::post('/updateArticle', [NewsController::class, 'updateArticle']);
+        //删除资讯
+        Router::post('/delArticle', [NewsController::class, 'delArticle']);
+        //更新资讯状态
+        Router::post('/upArticleStatus', [NewsController::class, 'upArticleStatus']);
+        //查看资讯
+        Router::get('/getArticleInfo', [NewsController::class, 'getArticleInfo']);
+        //获取导航池信息
+        Router::get('/getCategoryInfo', [NewsController::class, 'getCategoryInfo']);
+
+},
+    ['middleware' => [FooMiddleware::class]]
+);

+ 57 - 0
config/api/order.php

@@ -0,0 +1,57 @@
+<?php
+
+declare (strict_types = 1);
+use App\Controller\OrderController;
+use App\Middleware\Auth\FooMiddleware;
+use Hyperf\HttpServer\Router\Router;
+
+Router::addGroup(
+    '/order', function () {
+        //订单状态对应
+        Router::get('/getStauts', [OrderController::class, 'getStauts']);
+        
+        //查询广告
+        Router::post('/getAD', [OrderController::class, 'getAD']);
+        //根据网站搜索广告
+        Router::post('/getWebsiteAd', [OrderController::class, 'getWebsiteAd']);
+        //添加订单
+        Router::post('/addAD', [OrderController::class, 'addAD']);
+        //获取订单列表
+        Router::get('/getOrderList', [OrderController::class, 'getOrderList']);
+        //获取订单详情
+        Router::get('/getOrderDetail', [OrderController::class, 'getOrderDetail']);
+        //撤回订单
+        Router::get('/cancelOrder', [OrderController::class, 'cancelOrder']);
+        //删除广告
+        Router::get('/delOrderAD', [OrderController::class, 'delOrderAD']);
+
+        //后台管理
+        //获取订单列表
+        Router::post('/getOrderListAdmin', [OrderController::class, 'getOrderListAdmin']);
+        //获取订单详情
+        Router::post('/getOrderDetailAdmin', [OrderController::class, 'getOrderDetailAdmin']);
+        //审核订单
+        Router::post('/applyOrderStatusAdmin', [OrderController::class, 'applyOrderStatusAdmin']);
+        //修改订单价格
+        Router::post('/editPriceOrderAdmin', [OrderController::class, 'editPriceOrderAdmin']);
+        //驳回订单
+        Router::post('/rejectOrderAdmin', [OrderController::class, 'rejectOrderAdmin']);
+        //结束订单
+        Router::post('/endOrderAdmin', [OrderController::class, 'endOrderAdmin']);
+        //删除订单
+        Router::post('/delOrderAdmin', [OrderController::class, 'delOrderAdmin']);
+
+        //获取广告列表
+        Router::post('/getADList', [OrderController::class, 'getADList']);
+        //获取广告详情
+        Router::post('/getADDetail', [OrderController::class, 'getADDetail']);
+        //添加广告
+        Router::post('/addADAdmin', [OrderController::class, 'addAD']);
+        //修改广告
+        Router::post('/editAD', [OrderController::class, 'editAD']);
+        //删除广告
+        Router::post('/delAD', [OrderController::class, 'delAD']);
+
+    },
+    ['middleware' => [FooMiddleware::class]]
+);

+ 61 - 0
config/api/public.php

@@ -0,0 +1,61 @@
+<?php
+
+declare (strict_types = 1);
+use App\Controller\PublicController;
+use App\Middleware\Auth\FooMiddleware;
+use Hyperf\HttpServer\Router\Router;
+
+Router::addRoute(['GET', 'POST'], '/verifyCode', 'App\Controller\IndexController@verifyCode');
+
+Router::addGroup(
+    '/public', function () {
+        Router::get('/getDistrictList', [PublicController::class, 'getDistrictList']);
+        Router::get('/getUserLevelList', [PublicController::class, 'getUserLevelList']);
+        Router::post('/uploadFile', [PublicController::class, 'uploadFile']);
+        Router::post('/addUserLevel', [PublicController::class, 'addUserLevel']);
+        Router::post('/delUserLevel', [PublicController::class, 'delUserLevel']);
+        Router::post('/updateUserLevel', [PublicController::class, 'updateUserLevel']);
+        Router::get('/getCityList', [PublicController::class, 'getCityList']);
+        //添加投诉举报
+        Router::post('/addComplaint', [PublicController::class, 'addComplaint']);
+
+
+        //修改投诉举报
+        Router::addRoute(['GET', 'POST'],'/upComplaint', [PublicController::class, 'upComplaint']);
+        //投诉举报列表
+        Router::addRoute(['GET', 'POST'],'/getComplaint', [PublicController::class, 'getComplaint']);
+        //查看投诉举报信息
+        Router::addRoute(['GET', 'POST'],'/getLetterOfComplaintInfo', [PublicController::class, 'getLetterOfComplaintInfo']);
+        //删除投诉举报信息
+
+        Router::post('/delLetterOfComplaint', [PublicController::class, 'delLetterOfComplaint']);
+
+        //下载文件
+        Router::addRoute(['GET', 'POST'],'/downloadFile', [PublicController::class, 'downloadFile']);
+        //检测是否已经被审核
+        Router::addRoute(['GET', 'POST'],'/checkMeasure', [PublicController::class, 'checkMeasure']);
+        //获取职能部门
+        Router::get('/getDepartment', [PublicController::class, 'getDepartment']);
+
+
+        Router::post('/getZhinengbumenList', [PublicController::class, 'getZhinengbumenList']);
+        Router::post('/addZhinengbumen', [PublicController::class, 'addZhinengbumen']);
+        Router::post('/delZhinengbumen', [PublicController::class, 'delZhinengbumen']);
+        Router::post('/getZhinengbumen', [PublicController::class, 'getZhinengbumen']);
+        Router::post('/modZhinengbumen', [PublicController::class, 'modZhinengbumen']);
+        Router::post('/getPidZhinengbumen', [PublicController::class, 'getPidZhinengbumen']);
+
+    },
+    ['middleware' => [FooMiddleware::class]]
+);
+
+Router::addGroup(
+    '/public', function () {
+        //获取所有的职能部门
+        Router::get('/getAllDepartment', [PublicController::class, 'getAllDepartment']);
+        //获取类型
+        Router::get('/getLetterType', [PublicController::class, 'getLetterType']);
+        //获取子类型
+        Router::get('/getLetterTypeChildren', [PublicController::class, 'getLetterTypeChildren']);
+    }
+);

+ 38 - 0
config/api/user.php

@@ -0,0 +1,38 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\UserController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/user', function () {
+        Router::post('/createUser', [UserController::class, 'createUser']);
+        Router::post('/updateUser', [UserController::class, 'updateUser']);
+        //通过token获取用户信息
+        Router::get('/getUserInfo', [UserController::class, 'getUserInfo']);
+        //获取用户信息
+        Router::get('/getUser', [UserController::class, 'getUser']);
+        Router::get('/getUserList', [UserController::class, 'getUserList']);
+        Router::post('/delUser', [UserController::class, 'delUser']);
+        Router::post('/verifyUserInfo', [UserController::class, 'verifyUserInfo']);
+        //角色列表
+        Router::get('/roleList', [UserController::class, 'roleList']);
+        //查看角色
+        Router::get('/roleInfo', [UserController::class, 'roleInfo']);
+        //添加角色
+        Router::post('/addRole', [UserController::class, 'addRole']);
+        //删除角色
+        Router::post('/delRole', [UserController::class, 'delRole']);
+        //更新角色
+        Router::post('/updateRole', [UserController::class, 'updateRole']);
+        Router::post('/changePassword', [UserController::class, 'changePassword']);
+        //修改用户状态
+        Router::post('/upUserStatus', [UserController::class, 'upUserStatus']);
+        //重置密码
+        Router::post('/resetPassword', [UserController::class, 'resetPassword']);
+
+    },
+    ['middleware' => [FooMiddleware::class]]
+);
+

+ 24 - 0
config/api/web.php

@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\WebController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\WebMiddleware;
+Router::addGroup(
+    '/web', function () {
+                Router::get('/getWebsiteCategory', [WebController::class, 'getWebsiteCategory']);
+                Router::get('/getWebsiteDistrit', [WebController::class, 'getWebsiteDistrit']);
+                Router::get('/getWebsiteAdvertisement', [WebController::class, 'getWebsiteAdvertisement']);
+                Router::get('/selectWebsiteDepartment', [WebController::class, 'selectWebsiteDepartment']);
+                Router::get('/selectWebsiteArea', [WebController::class, 'selectWebsiteArea']);
+                Router::get('/getWebsiteArticlett', [WebController::class, 'getWebsiteArticlett']);
+                Router::get('/getWebsiteModelArticles', [WebController::class, 'getWebsiteModelArticles']);
+                Router::get('/getWebsiteModelCategory', [WebController::class, 'getWebsiteModelCategory']);
+                Router::get('/getWebsiteArticlesList', [WebController::class, 'getWebsiteArticlesList']);
+                Router::get('/selectWebsiteArticleInfo', [WebController::class, 'selectWebsiteArticleInfo']);
+
+                Router::get('/selectWebsiteLinks', [WebController::class, 'selectWebsiteLinks']);
+            },
+    ['middleware' => [WebMiddleware::class]]
+);

+ 86 - 0
config/api/website.php

@@ -0,0 +1,86 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\WebsiteController;
+use Hyperf\HttpServer\Router\Router;
+use App\Middleware\Auth\FooMiddleware;
+Router::addGroup(
+    '/website', function () {
+        //添加网站
+        Router::post('/addWebsite', [WebsiteController::class, 'addWebsite']);
+        //获取网站列表
+        Router::get('/getWebsiteList', [WebsiteController::class, 'getWebsiteList']);
+        //更新网站
+        Router::post('/updateWebsite', [WebsiteController::class, 'updateWebsite']);
+        //删除网站
+        Router::post('/delWebsite', [WebsiteController::class, 'delWebsite']);
+        //获取网站信息
+        Router::get('/getWebsiteInfo', [WebsiteController::class, 'getWebsiteInfo']);
+        //获取网站 网系
+        Router::get('/getWebsiteColumn', [WebsiteController::class, 'getWebsiteColumn']);
+        //获取网站 网系
+        Router::get('/getWebsiteColumnList', [WebsiteController::class, 'getWebsiteColumnList']);
+        //创建网站网系
+        Router::post('/addWebsiteColumn', [WebsiteController::class, 'addWebsiteColumn']);
+        //更新网站网系
+        Router::post('/updateWebsiteColumn', [WebsiteController::class, 'updateWebsiteColumn']);
+        //删除网站网系
+        Router::post('/delWebsiteColumn', [WebsiteController::class, 'delWebsiteColumn']);
+
+        Router::get('/getWebsiteRoleList', [WebsiteController::class, 'getWebsiteRoleList']);
+        Router::post('/createWebsiteRole', [WebsiteController::class, 'createWebsiteRole']);
+        Router::post('/delWebsiteRole', [WebsiteController::class, 'delWebsiteRole']);
+        Router::get('/getWebsiteRoleUserList', [WebsiteController::class, 'getWebsiteRoleUserList']);
+        Router::post('/createWebsiteRoleUser', [WebsiteController::class, 'createWebsiteRoleUser']);
+        Router::post('/delWebsiteRoleUser', [WebsiteController::class, 'delWebsiteRoleUser']);
+        //获取模板分类
+        Router::get('/getTemplateClass', [WebsiteController::class, 'getTemplateClass']);
+        //添加模板分类
+        Router::post('/addTemplateClass', [WebsiteController::class, 'addTemplateClass']);
+        //更新模板分类
+        Router::post('/upTemplateClass', [WebsiteController::class, 'upTemplateClass']);
+        //删除模板分类
+        Router::post('/delTemplateClass', [WebsiteController::class, 'delTemplateClass']);
+        //获取分类下模板列表
+        Router::get('/getTemplate', [WebsiteController::class, 'getTemplate']);
+        //获取分类下模板列表
+        Router::post('/addTemplate', [WebsiteController::class, 'addTemplate']);
+        //更新分类下模板列表
+        Router::post('/upTemplate', [WebsiteController::class, 'upTemplate']);
+        //删除分类下模板列表
+        Router::post('/delTemplate', [WebsiteController::class, 'delTemplate']);
+        //添加网站导航
+        Router::post('/addWebsiteCategory', [WebsiteController::class, 'addWebsiteCategory']);
+        //删除网站导航
+        Router::post('/delWebsiteCategory', [WebsiteController::class, 'delWebsiteCategory']);
+        //获取网站导航
+        Router::get('/getAdminWebsiteCategory', [WebsiteController::class, 'getAdminWebsiteCategory']);
+        //更新网站导航
+        Router::post('/upWebsiteCategory', [WebsiteController::class, 'upWebsiteCategory']);
+        //网站导航
+        Router::get('/getWebsiteCategoryList', [WebsiteController::class, 'getWebsiteCategoryList']);
+        //删除网站所有的导航
+        Router::post('/delWebsiteAllCategory', [WebsiteController::class, 'delWebsiteAllCategory']);
+        //查看指定的导航
+        Router::get('/getWebsiteCategoryOnes', [WebsiteController::class, 'getWebsiteCategoryOnes']);
+        //更新指定的某一个导航
+        Router::post('/upWebsiteCategoryones', [WebsiteController::class, 'upWebsiteCategoryones']);
+        //网站下的所有导航包含子导航
+        Router::get('/getWebsiteAllCategory', [WebsiteController::class, 'getWebsiteAllCategory']);
+        //管理后台数据统计
+        Router::get('/getAdminIndex', [WebsiteController::class, 'getAdminIndex']);
+
+
+
+        //搜索网站列表
+        Router::get('/websiteList', [WebsiteController::class, 'websiteList']);
+        //检测网站名称是否存在
+        Router::post('/checkWebsiteName', [WebsiteController::class, 'checkWebsiteName']);
+        //检测域名是否被重复解析
+        Router::post('/checkWebsiteUrl', [WebsiteController::class, 'checkWebsiteUrl']);
+
+
+    },
+    ['middleware' => [FooMiddleware::class]]
+);

+ 37 - 0
config/autoload/amqp.php

@@ -0,0 +1,37 @@
+<?php
+
+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'),
+        'vhost' => '/',
+        'concurrent' => [
+            'limit' => 1,
+        ],
+        'pool' => [
+            'connections' => 1,
+        ],
+        'params' => [
+            'insist' => false,
+            'login_method' => 'AMQPLAIN',
+            'login_response' => null,
+            'locale' => 'en_US',
+            'connection_timeout' => 3.0,
+            // 尽量保持是 heartbeat 数值的两倍
+            'read_write_timeout' => 6.0,
+            'context' => null,
+            'keepalive' => false,
+            // 尽量保证每个消息的消费时间小于心跳时间
+            'heartbeat' => 3,
+            'close_on_destruct' => false,
+        ],
+    ],
+    'pool2' => [
+
+    ]
+];

+ 44 - 0
config/autoload/annotations.php

@@ -0,0 +1,44 @@
+<?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
+ */
+use Hyperf\AsyncQueue\Driver\RedisDriver;
+
+return [
+    'default' => [
+        'driver' => RedisDriver::class,
+        'redis' => [
+            'pool' => 'default',
+        ],
+        'channel' => '{gatherList}',
+        'timeout' => 2,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 1,
+        'concurrent' => [
+            'limit' => 10,
+        ],
+        'max_messages' => 0,
+    ],
+    'import' => [
+        'driver' => RedisDriver::class,
+        'redis' => [
+            'pool' => 'default'
+        ],
+        'channel' => '{importList}',
+        'timeout' => 2,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 1,
+        'concurrent' => [
+            'limit' => 5,
+        ],
+    ],
+];

+ 2 - 11
config/autoload/cache.php

@@ -14,15 +14,6 @@ use Hyperf\ConfigCenter\Mode;
 use function Hyperf\Support\env;
 
 return [
-//    'enable' => (bool) env('CONFIG_CENTER_ENABLE', true),
-//    'driver' => env('CONFIG_CENTER_DRIVER', 'nacos'),
-//    'mode' => env('CONFIG_CENTER_MODE', Mode::PROCESS),
-//    'drivers' => [
-//
-//    ],
-    'server' => [
-        'settings' => [
-            'timezone' => 'Asia/Shanghai',
-        ],
-    ],
+
+
 ];

+ 0 - 3
config/autoload/databases.php

@@ -30,9 +30,6 @@ return [
             'heartbeat' => -1,
             'max_idle_time' => (float) env('DB_MAX_IDLE_TIME', 60),
         ],
-        'variables' => [
-            'time_zone' => '+08:00', // 设置MySQL连接的时区
-        ],
         'commands' => [
             'gen:model' => [
                 'path' => 'app/Model',

+ 2 - 0
config/autoload/dependencies.php

@@ -10,4 +10,6 @@ declare(strict_types=1);
  * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
  */
 return [
+
 ];
+

+ 2 - 3
config/autoload/devtool.php

@@ -12,11 +12,10 @@ declare(strict_types=1);
 return [
     'handler' => [
         'http' => [
+            Hyperf\Validation\ValidationExceptionHandler::class,
             Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler::class,
             App\Exception\Handler\AppExceptionHandler::class,
-        ],
-        'jsonrpc-http' => [
-            App\Exception\Handler\JsonRpcExceptionHandler::class,
+
         ],
     ],
 ];

+ 108 - 0
config/autoload/jwt.php

@@ -0,0 +1,108 @@
+<?php
+declare(strict_types=1);
+use function Hyperf\Support\env;
+return [
+    /**
+     * 不需要检查的路由,如果使用jwt提供的默认中间件,可以对某些不用做检验的路由进行配置,例如登录等
+     * 具体的逻辑可以效仿JWT提供的默认中间件
+     * [
+     *      ["GET", "/index/test"],
+     *      ["**", "/test"]
+     * ]
+     *
+     * 第一个填写请求方法('**'代表支持所有的请求方法),第二个填写路由路径('/**'代表支持所有的路径)
+     * 如果数组中存在["**", "/**"],则默认所有的请求路由都不做jwt token的校验,直接放行,如果no_check_route为一个空数组,则
+     * 所有的请求路由都需要做jwt token校验
+     * 路由路径支持正则的写法
+     * 正则写法:["**", "/api/{name:.+}"]  支持模块化不做jwt token的校验,例如:/api/login/login
+     */
+    'no_check_route' => [
+//        ["**", "/api/{name:.+}"],
+    ],
+
+    'login_type' => env('JWT_LOGIN_TYPE', 'mpop'), //  登录方式,sso为单点登录,同一个用户只能登录一个端,mpop为多点登录
+
+    /**
+     * 单点登录自定义数据中必须存在uid的键值,这个key你可以自行定义,只要自定义数据中存在该键即可
+     */
+    'sso_key' => 'uid',
+
+    /**
+     * 只能用于Hmac包下的加密非对称算法,其它的都会使用公私钥
+     */
+    'secret' => env('JWT_SECRET', 'phper666'),
+
+    /**
+     * JWT 权限keys
+     * 对称算法: HS256, HS384 & HS512 使用 `JWT_SECRET`.
+     * 非对称算法: RS256, RS384 & RS512 / ES256, ES384 & ES512 使用下面的公钥私钥,需要自己去生成.
+     */
+    'keys' => [
+//        'public' => env('JWT_PUBLIC_KEY'), // 公钥,例如:'file:///path/to/public/key'
+//        'private' => env('JWT_PRIVATE_KEY'), // 私钥,例如:'file:///path/to/private/key'
+
+        /**
+         * 你的私钥的密码。不需要密码可以不用设置
+         */
+//        'passphrase' => env('JWT_PASSPHRASE'),
+    ],
+
+    'ttl' => env('JWT_TTL', 300), // token过期时间,单位为秒
+
+    /**
+     * 支持的对称算法:HS256、HS384、HS512
+     * 支持的非对称算法:RS256、RS384、RS512、ES256、ES384、ES512
+     */
+    'alg' => env('JWT_ALG', 'HS256'), // jwt的hearder加密算法
+
+    /**
+     * jwt使用到的缓存前缀
+     * 建议使用独立的redis做缓存,这样比较好做分布式
+     */
+    'cache_prefix' => 'phper666:jwt',
+
+    /**
+     * 是否开启黑名单,单点登录和多点登录的注销、刷新使原token失效,必须要开启黑名单,目前黑名单缓存只支持hyperf缓存驱动
+     */
+    'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
+
+    /**
+     * 黑名单的宽限时间 单位为:秒,注意:如果使用单点登录,该宽限时间无效
+     */
+    'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
+
+    /**
+     * 签发者
+     */
+    'issued_by' => 'phper666/jwt',
+
+    /**
+     * 区分不同场景的token,比如你一个项目可能会有多种类型的应用接口鉴权,下面自行定义,我只是举例子
+     * 下面的配置会自动覆盖根配置,比如application1会里面的数据会覆盖掉根数据
+     * 下面的scene会和根数据合并
+     * scene必须存在一个default
+     * 什么叫根数据,这个配置的一维数组,除了scene都叫根配置
+     */
+    'scene' => [
+        'default' => [
+            'ttl' => 86400,
+        ],
+        'application' => [
+            'secret' => 'application', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'sso', //  登录方式,sso为单点登录,mpop为多点登录
+            'sso_key' => 'uid',
+            'ttl' => 7200, // token过期时间,单位为秒
+        ],
+        'application1' => [
+            'secret' => 'application1', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'sso', //  登录方式,sso为单点登录,mpop为多点登录
+            'sso_key' => 'uid',
+            'ttl' => 7200, // token过期时间,单位为秒
+        ],
+        'application2' => [
+            'secret' => 'application2', // 非对称加密使用字符串,请使用自己加密的字符串
+            'login_type' => 'mpop', //  登录方式,sso为单点登录,mpop为多点登录
+            'ttl' => 7200, // token过期时间,单位为秒
+        ]
+    ]
+];

+ 7 - 11
config/autoload/listeners.php

@@ -1,15 +1,11 @@
 <?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 [
     'http' => [
+        \App\Middleware\CorsMiddleware::class,
+//        \App\Middleware\Auth\FooMiddleware::class,
+        \Hyperf\Validation\Middleware\ValidationMiddleware::class,
     ],
-];
+    'ws' => [
+        \App\Middleware\WebSocketAuthMiddleware::class
+    ]
+];

+ 1 - 0
config/autoload/processes.php

@@ -10,4 +10,5 @@ declare(strict_types=1);
  * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
  */
 return [
+    Hyperf\AsyncQueue\Process\ConsumerProcess::class, //异步消费进程
 ];

+ 34 - 6
config/autoload/redis.php

@@ -13,17 +13,45 @@ use function Hyperf\Support\env;
 
 return [
     'default' => [
-        'host' => env('REDIS_HOST', 'localhost'),
-        'auth' => env('REDIS_AUTH', null),
+        'host' => env('REDIS_HOST', '127.0.0.1'),
+        'auth' => env('REDIS_AUTH', '123456'),
         'port' => (int) env('REDIS_PORT', 6379),
         'db' => (int) env('REDIS_DB', 0),
         'pool' => [
             'min_connections' => 1,
-            'max_connections' => 10,
-            'connect_timeout' => 10.0,
-            'wait_timeout' => 3.0,
+            'max_connections' => 100,
+            'connect_timeout' => 100000000.0,
+            'wait_timeout' => 30000000.0,
             'heartbeat' => -1,
-            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 60),
+            'max_idle_time' => (float) env('REDIS_MAX_IDLE_TIME', 6000000000),
         ],
+        'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class,
+        'redis' => [
+            'pool' => 'default'
+        ],
+        'channel' => '{queue:import}',
+        'timeout' => 20,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 100,
+        'concurrent' => [
+            'limit' => 10000,
+        ],
+        'max_messages' => 0,
+    ],
+    'import' => [
+        'driver' => Hyperf\AsyncQueue\Driver\RedisDriver::class,
+        'redis' => [
+            'pool' => 'default'
+        ],
+        'channel' => '{queue:import}',
+        'timeout' => 20,
+        'retry_seconds' => 5,
+        'handle_timeout' => 10,
+        'processes' => 100,
+        'concurrent' => [
+            'limit' => 10000,
+        ],
+        'max_messages' => 0,
     ],
 ];

+ 19 - 4
config/autoload/server.php

@@ -17,18 +17,32 @@ return [
     'mode' => SWOOLE_PROCESS,
     'servers' => [
         [
-            'name' => 'jsonrpc-http',
+            'name' => 'http',
             'type' => Server::SERVER_HTTP,
             'host' => '0.0.0.0',
-            'port' => 9503,
+            'port' => 9501,
             'sock_type' => SWOOLE_SOCK_TCP,
             'callbacks' => [
-                Event::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
+                Event::ON_REQUEST => [App\Service\Server\StreamServer::class, 'onRequest'],
+//                Event::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'],
+            ],
+        ],
+        [
+            'name' => 'ws',
+            'type' => Server::SERVER_WEBSOCKET,
+            'host' => '0.0.0.0',
+            'port' => 9506,
+            'sock_type' => SWOOLE_SOCK_TCP,
+            'callbacks' => [
+                Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
+                Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
+                Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
             ],
         ],
-
     ],
     'settings' => [
+        'document_root' => BASE_PATH . '/public',
+        'enable_static_handler' => true,
         Constant::OPTION_ENABLE_COROUTINE => true,
         Constant::OPTION_WORKER_NUM => swoole_cpu_num(),
         Constant::OPTION_PID_FILE => BASE_PATH . '/runtime/hyperf.pid',
@@ -44,4 +58,5 @@ return [
         Event::ON_PIPE_MESSAGE => [Hyperf\Framework\Bootstrap\PipeMessageCallback::class, 'onPipeMessage'],
         Event::ON_WORKER_EXIT => [Hyperf\Framework\Bootstrap\WorkerExitCallback::class, 'onWorkerExit'],
     ],
+
 ];

+ 97 - 0
config/autoload/services.php

@@ -0,0 +1,97 @@
+<?php
+
+return [
+    'consumers' => [
+        [
+            // 用戶中心
+            'name' => 'UserService',
+            'service' => \App\JsonRpc\UserServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9504],
+            ],
+        ],
+        [
+            // 权限管理
+            'name' => 'AuthorityService',
+            'service' => \App\JsonRpc\AuthorityServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9504],
+            ],
+        ],
+        [
+            // 广告中心
+            'name' => 'AdService',
+            'service' => \App\JsonRpc\AdServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9503],
+            ],
+        ],
+        [
+            //网站管理
+            'name' => 'WebsiteService',
+            'service' => \App\JsonRpc\WebsiteServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9502],
+            ],
+        ],
+        [
+            //公共方法
+            'name' => 'PublicRpcService',
+            'service' => \App\JsonRpc\PublicRpcServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9502],
+            ],
+        ],
+        [
+            //资讯-新闻
+            'name' => 'NewsService',
+            'service' => \App\JsonRpc\NewsServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9505],
+            ],
+        ],
+        [
+            //友情链接服务
+            'name' => 'LinkService',
+            'service' => \App\JsonRpc\LinkServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9502],
+            ],
+        ],
+        [
+            //友情链接服务
+            'name' => 'ChatService',
+            'service' => \App\JsonRpc\ChatServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9507],
+            ],
+        ],
+        [
+            //广告订单服务
+            'name' => 'OrderService',
+            'service' => \App\JsonRpc\OrderServiceInterface::class,
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9508],
+            ],
+        ],
+        [
+            //采集服务
+            'name' => 'CollectorService',
+            'service' => \App\JsonRpc\CollectorServiceInterface::class,
+
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9509],
+            ],
+        ],
+    ],
+];

+ 23 - 0
config/autoload/snowflake.php

@@ -0,0 +1,23 @@
+<?php
+
+declare(strict_types=1);
+
+use Hyperf\Snowflake\MetaGenerator\RedisMilliSecondMetaGenerator;
+use Hyperf\Snowflake\MetaGenerator\RedisSecondMetaGenerator;
+use Hyperf\Snowflake\MetaGeneratorInterface;
+
+return [
+    'begin_second' => MetaGeneratorInterface::DEFAULT_BEGIN_SECOND,
+    RedisMilliSecondMetaGenerator::class => [
+        // Redis Pool
+        'pool' => 'default',
+        // 用于计算 WorkerId 的 Key 键
+        'key' => RedisMilliSecondMetaGenerator::DEFAULT_REDIS_KEY
+    ],
+    RedisSecondMetaGenerator::class => [
+        // Redis Pool
+        'pool' => 'default',
+        // 用于计算 WorkerId 的 Key 键
+        'key' => RedisMilliSecondMetaGenerator::DEFAULT_REDIS_KEY
+    ],
+];

+ 16 - 0
config/autoload/translation.php

@@ -0,0 +1,16 @@
+<?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 [
+    'locale' => 'zh_CN',
+    'fallback_locale' => 'en',
+    'path' => BASE_PATH . '/storage/languages',
+];

+ 13 - 0
config/autoload/validate.php

@@ -0,0 +1,13 @@
+<?php
+return [
+    /**
+     * --------------------------------------------------------------------------------
+     * 自定义数据提供者.
+     * 如果你想自己向验证器提供数据,那么可以尝试修改这个选项
+     * 指定类名,如果不存在则会抛出\RuntimeException异常
+     * 请让你的自定义数据提供者实现\DeathSatan\Hyperf\Validate\Contract\CustomHandle契约.
+     * 只有这样它才不会抛出异常.
+     * --------------------------------------------------------------------------------
+     */
+    'customHandle'=>\DeathSatan\Hyperf\Validate\Driver\RequestHandle::class,
+];

+ 23 - 2
config/config.php

@@ -1,6 +1,6 @@
 <?php
 
-declare(strict_types=1);
+declare (strict_types = 1);
 /**
  * This file is part of Hyperf.
  *
@@ -11,8 +11,29 @@ declare(strict_types=1);
  */
 use Hyperf\HttpServer\Router\Router;
 
-Router::addRoute(['GET', 'POST', 'HEAD'], '/', 'App\Controller\IndexController@index');
+Router::addRoute(['GET', 'POST', 'HEAD'], '/index', 'App\Controller\IndexController@index');
+Router::addRoute(['GET', 'POST', 'HEAD'], '/download', 'App\Controller\IndexController@download');
+Router::get('/api/getData', 'App\Controller\LoginController@getData');
 
 Router::get('/favicon.ico', function () {
     return '';
 });
+
+Router::addServer('ws', function () {
+    Router::get('/', 'App\Controller\WebSocketController');
+});
+
+require __DIR__ . '/api/user.php';
+require __DIR__ . '/api/public.php';
+require __DIR__ . '/api/ad.php';
+require __DIR__ . '/api/complaint.php';
+require __DIR__ . '/api/authority.php';
+require __DIR__ . '/api/chat.php';
+require __DIR__ . '/api/link.php';
+require __DIR__ . '/api/login.php';
+require __DIR__ . '/api/news.php';
+require __DIR__ . '/api/website.php';
+require __DIR__ . '/api/web.php';
+require __DIR__ . '/api/order.php';
+require __DIR__ . '/api/collector.php';
+

Some files were not shown because too many files changed in this diff