Explorar o código

Merge branch '20250919_testproducer_fr' into 20250522_diywebfr

FengR hai 2 meses
pai
achega
1974a4709e
Modificáronse 64 ficheiros con 4715 adicións e 771 borrados
  1. 13 0
      .idea/admin_consumer.iml
  2. 8 0
      .idea/modules.xml
  3. 187 0
      .idea/php.xml
  4. 6 0
      .idea/vcs.xml
  5. 23 5
      .idea/workspace.xml
  6. 119 4
      app/Amqp/Consumer/MqConsumer.php
  7. 31 7
      app/Controller/AdController.php
  8. 56 12
      app/Controller/ChatController.php
  9. 122 0
      app/Controller/ClientController.php
  10. 488 0
      app/Controller/FormController.php
  11. 24 10
      app/Controller/IndexController.php
  12. 119 106
      app/Controller/LoginController.php
  13. 137 0
      app/Controller/MessageController.php
  14. 1 0
      app/Controller/MinioController.php
  15. 404 20
      app/Controller/NewsController.php
  16. 37 1
      app/Controller/OrderController.php
  17. 225 0
      app/Controller/TestController.php
  18. 248 19
      app/Controller/WebController.php
  19. 246 40
      app/Controller/WebSocketController.php
  20. 337 145
      app/Controller/WebsiteController.php
  21. 9 0
      app/JsonRpc/AdService.php
  22. 6 0
      app/JsonRpc/AdServiceInterface.php
  23. 3 0
      app/JsonRpc/ChatService.php
  24. 1 0
      app/JsonRpc/ChatServiceInterface.php
  25. 44 2
      app/JsonRpc/ClientService.php
  26. 11 0
      app/JsonRpc/ClientServiceInterface.php
  27. 1 0
      app/JsonRpc/FooterService.php
  28. 116 0
      app/JsonRpc/FormService.php
  29. 86 0
      app/JsonRpc/FormServiceInterface.php
  30. 142 1
      app/JsonRpc/NewsService.php
  31. 106 28
      app/JsonRpc/NewsServiceInterface.php
  32. 11 3
      app/JsonRpc/OrderService.php
  33. 5 3
      app/JsonRpc/OrderServiceInterface.php
  34. 91 0
      app/JsonRpc/PublicRpcService.php
  35. 26 0
      app/JsonRpc/PublicRpcServiceInterface.php
  36. 23 0
      app/JsonRpc/UserService.php
  37. 16 0
      app/JsonRpc/UserServiceInterface.php
  38. 76 37
      app/JsonRpc/WebsiteService.php
  39. 55 32
      app/JsonRpc/WebsiteServiceInterface.php
  40. 119 0
      app/Middleware/Auth/ComplaintMiddleware.php
  41. 35 28
      app/Middleware/Auth/FooMiddleware.php
  42. 1 0
      app/Middleware/Auth/PublicMiddleware.php
  43. 1 0
      app/Middleware/Auth/WebMiddleware.php
  44. 60 0
      app/Service/FileService.php
  45. 87 87
      app/Service/Message/ReceiveHandleService.php
  46. 40 0
      app/Task/TsbbTask.php
  47. 52 1
      app/Tools/PublicData.php
  48. 1 0
      composer.json
  49. 350 140
      composer.lock
  50. 2 0
      config/api/ad.php
  51. 2 0
      config/api/chat.php
  52. 27 3
      config/api/client.php
  53. 57 0
      config/api/form.php
  54. 20 0
      config/api/news.php
  55. 8 2
      config/api/order.php
  56. 55 12
      config/api/public.php
  57. 30 0
      config/api/test.php
  58. 26 0
      config/api/web.php
  59. 29 17
      config/api/website.php
  60. 1 1
      config/autoload/amqp.php
  61. 10 4
      config/autoload/crontab.php
  62. 9 0
      config/autoload/server.php
  63. 32 1
      config/autoload/services.php
  64. 2 0
      config/routes.php

+ 13 - 0
.idea/admin_consumer.iml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/./test" isTestSource="true" packagePrefix="HyperfTest\" />
+      <sourceFolder url="file://$MODULE_DIR$/app" isTestSource="false" packagePrefix="App\" />
+      <excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/crontab" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/admin_consumer.iml" filepath="$PROJECT_DIR$/.idea/admin_consumer.iml" />
+    </modules>
+  </component>
+</project>

+ 187 - 0
.idea/php.xml

@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PhpIncludePathManager">
+    <include_path>
+      <path value="$PROJECT_DIR$/vendor/hyperf/engine-contract" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/code-parser" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/snowflake" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/redis" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/engine" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/memory" />
+      <path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/watcher" />
+      <path value="$PROJECT_DIR$/vendor/symfony/http-foundation" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/collection" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/testing" />
+      <path value="$PROJECT_DIR$/vendor/symfony/console" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/nacos" />
+      <path value="$PROJECT_DIR$/vendor/evenement/evenement" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/json-rpc" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/cache" />
+      <path value="$PROJECT_DIR$/vendor/phar-io/version" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/event" />
+      <path value="$PROJECT_DIR$/vendor/phar-io/manifest" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/service-governance-consul" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/codec" />
+      <path value="$PROJECT_DIR$/vendor/php-di/phpdoc-reader" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/config-nacos" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/config-center" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/dispatcher" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/model-listener" />
+      <path value="$PROJECT_DIR$/vendor/php-amqplib/php-amqplib" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/pool" />
+      <path value="$PROJECT_DIR$/vendor/jetbrains/phpstorm-attributes" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/translation" />
+      <path value="$PROJECT_DIR$/vendor/easyswoole/spl" />
+      <path value="$PROJECT_DIR$/vendor/clue/ndjson-react" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/logger" />
+      <path value="$PROJECT_DIR$/vendor/easyswoole/verifycode" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/contract" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/consul" />
+      <path value="$PROJECT_DIR$/vendor/swoole/ide-helper" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/utils" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/constants" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/load-balancer" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/command" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/support" />
+      <path value="$PROJECT_DIR$/vendor/paragonie/constant_time_encoding" />
+      <path value="$PROJECT_DIR$/vendor/paragonie/random_compat" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/context" />
+      <path value="$PROJECT_DIR$/vendor/vlucas/phpdotenv" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/server" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/service-governance-nacos" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/config" />
+      <path value="$PROJECT_DIR$/vendor/friendsofphp/php-cs-fixer" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/rpc" />
+      <path value="$PROJECT_DIR$/vendor/swow/psr7-plus" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/stringable" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/devtool" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/pipeline" />
+      <path value="$PROJECT_DIR$/vendor/fidry/cpu-core-counter" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/coroutine" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/http-server" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/amqp" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/http-message" />
+      <path value="$PROJECT_DIR$/vendor/composer" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/macroable" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/di" />
+      <path value="$PROJECT_DIR$/vendor/egulias/email-validator" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/coordinator" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/db-connection" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php83" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-grapheme" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/validation" />
+      <path value="$PROJECT_DIR$/vendor/symfony/stopwatch" />
+      <path value="$PROJECT_DIR$/vendor/symfony/options-resolver" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/guzzle" />
+      <path value="$PROJECT_DIR$/vendor/symfony/deprecation-contracts" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/rpc-client" />
+      <path value="$PROJECT_DIR$/vendor/symfony/finder" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/websocket-server" />
+      <path value="$PROJECT_DIR$/vendor/symfony/service-contracts" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php81" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/tappable" />
+      <path value="$PROJECT_DIR$/vendor/symfony/translation-contracts" />
+      <path value="$PROJECT_DIR$/vendor/friendsofhyperf/openai-client" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/service-governance" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-php80" />
+      <path value="$PROJECT_DIR$/vendor/hamcrest/hamcrest-php" />
+      <path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
+      <path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher" />
+      <path value="$PROJECT_DIR$/vendor/nikic/fast-route" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/conditionable" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-normalizer" />
+      <path value="$PROJECT_DIR$/vendor/symfony/process" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/stdlib" />
+      <path value="$PROJECT_DIR$/vendor/symfony/translation" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/serializer" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-intl-idn" />
+      <path value="$PROJECT_DIR$/vendor/guzzlehttp/guzzle" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/rpc-server" />
+      <path value="$PROJECT_DIR$/vendor/phpstan/phpstan" />
+      <path value="$PROJECT_DIR$/vendor/symfony/event-dispatcher-contracts" />
+      <path value="$PROJECT_DIR$/vendor/theseer/tokenizer" />
+      <path value="$PROJECT_DIR$/vendor/symfony/string" />
+      <path value="$PROJECT_DIR$/vendor/guzzlehttp/promises" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/framework" />
+      <path value="$PROJECT_DIR$/vendor/symfony/filesystem" />
+      <path value="$PROJECT_DIR$/vendor/guzzlehttp/psr7" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-code-coverage" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-file-iterator" />
+      <path value="$PROJECT_DIR$/vendor/laminas/laminas-mime" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/exception-handler" />
+      <path value="$PROJECT_DIR$/vendor/laminas/laminas-stdlib" />
+      <path value="$PROJECT_DIR$/vendor/symfony/polyfill-mbstring" />
+      <path value="$PROJECT_DIR$/vendor/php-http/multipart-stream-builder" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/process" />
+      <path value="$PROJECT_DIR$/vendor/php-http/discovery" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/phpunit" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-timer" />
+      <path value="$PROJECT_DIR$/vendor/zx/php-tools" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
+      <path value="$PROJECT_DIR$/vendor/phpunit/php-text-template" />
+      <path value="$PROJECT_DIR$/vendor/monolog/monolog" />
+      <path value="$PROJECT_DIR$/vendor/phpoption/phpoption" />
+      <path value="$PROJECT_DIR$/vendor/fig/http-message-util" />
+      <path value="$PROJECT_DIR$/vendor/markrogoyski/math-php" />
+      <path value="$PROJECT_DIR$/vendor/psr/simple-cache" />
+      <path value="$PROJECT_DIR$/vendor/psr/clock" />
+      <path value="$PROJECT_DIR$/vendor/psr/http-server-middleware" />
+      <path value="$PROJECT_DIR$/vendor/psr/cache" />
+      <path value="$PROJECT_DIR$/vendor/psr/http-message" />
+      <path value="$PROJECT_DIR$/vendor/psr/event-dispatcher" />
+      <path value="$PROJECT_DIR$/vendor/psr/container" />
+      <path value="$PROJECT_DIR$/vendor/psr/http-client" />
+      <path value="$PROJECT_DIR$/vendor/psr/http-server-handler" />
+      <path value="$PROJECT_DIR$/vendor/psr/http-factory" />
+      <path value="$PROJECT_DIR$/vendor/react/child-process" />
+      <path value="$PROJECT_DIR$/vendor/react/event-loop" />
+      <path value="$PROJECT_DIR$/vendor/react/stream" />
+      <path value="$PROJECT_DIR$/vendor/react/cache" />
+      <path value="$PROJECT_DIR$/vendor/openai-php/client" />
+      <path value="$PROJECT_DIR$/vendor/react/promise" />
+      <path value="$PROJECT_DIR$/vendor/react/socket" />
+      <path value="$PROJECT_DIR$/vendor/psr/log" />
+      <path value="$PROJECT_DIR$/vendor/lcobucci/jwt" />
+      <path value="$PROJECT_DIR$/vendor/react/dns" />
+      <path value="$PROJECT_DIR$/vendor/lcobucci/clock" />
+      <path value="$PROJECT_DIR$/vendor/phpseclib/phpseclib" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/database" />
+      <path value="$PROJECT_DIR$/vendor/mockery/mockery" />
+      <path value="$PROJECT_DIR$/vendor/ralouphie/getallheaders" />
+      <path value="$PROJECT_DIR$/vendor/phper666/jwt-auth" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/object-enumerator" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/type" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/diff" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/recursion-context" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/environment" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/version" />
+      <path value="$PROJECT_DIR$/vendor/death_satan/hyperf-validate" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/exporter" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/comparator" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
+      <path value="$PROJECT_DIR$/vendor/doctrine/deprecations" />
+      <path value="$PROJECT_DIR$/vendor/doctrine/annotations" />
+      <path value="$PROJECT_DIR$/vendor/doctrine/lexer" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/object-reflector" />
+      <path value="$PROJECT_DIR$/vendor/stella-maris/clock" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/global-state" />
+      <path value="$PROJECT_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
+      <path value="$PROJECT_DIR$/vendor/graham-campbell/result-type" />
+      <path value="$PROJECT_DIR$/vendor/doctrine/instantiator" />
+      <path value="$PROJECT_DIR$/vendor/doctrine/inflector" />
+      <path value="$PROJECT_DIR$/vendor/nesbot/carbon" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/async-queue" />
+      <path value="$PROJECT_DIR$/vendor/carbonphp/carbon-doctrine-types" />
+      <path value="$PROJECT_DIR$/vendor/aws/aws-crt-php" />
+      <path value="$PROJECT_DIR$/vendor/aws/aws-sdk-php" />
+      <path value="$PROJECT_DIR$/vendor/mtdowling/jmespath.php" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/crontab" />
+    </include_path>
+  </component>
+  <component name="PhpProjectSharedConfiguration" php_language_level="8.1" />
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 23 - 5
.idea/workspace.xml

@@ -4,7 +4,11 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="f943e179-929c-4d98-8619-4423423ee73e" name="更改" comment="" />
+    <list default="true" id="f943e179-929c-4d98-8619-4423423ee73e" name="更改" comment="">
+      <change beforePath="$PROJECT_DIR$/.env" beforeDir="false" afterPath="$PROJECT_DIR$/.env" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/Controller/PublicController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Controller/PublicController.php" afterDir="false" />
+    </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -200,11 +204,12 @@
       <path value="$PROJECT_DIR$/vendor/aws/aws-crt-php" />
       <path value="$PROJECT_DIR$/vendor/aws/aws-sdk-php" />
       <path value="$PROJECT_DIR$/vendor/mtdowling/jmespath.php" />
+      <path value="$PROJECT_DIR$/vendor/hyperf/crontab" />
     </include_path>
   </component>
-  <component name="ProjectColorInfo"><![CDATA[{
-  "associatedIndex": 3
-}]]></component>
+  <component name="ProjectColorInfo">{
+  &quot;associatedIndex&quot;: 3
+}</component>
   <component name="ProjectId" id="2qujtr8hxgPzTXMJ7F15U9bBHUB" />
   <component name="ProjectViewState">
     <option name="hideEmptyMiddlePackages" value="true" />
@@ -214,7 +219,7 @@
   "keyToString": {
     "RunOnceActivity.OpenProjectViewOnStart": "true",
     "RunOnceActivity.ShowReadmeOnStart": "true",
-    "git-widget-placeholder": "正在合并 dev",
+    "git-widget-placeholder": "master",
     "kotlin-language-version-configured": "true",
     "last_opened_file_path": "D:/wwwroot/zxt",
     "node.js.detected.package.eslint": "true",
@@ -245,10 +250,23 @@
       <option name="presentableId" value="Default" />
       <updated>1735519571105</updated>
       <workItem from="1735519572141" duration="10106000" />
+      <workItem from="1753958077075" duration="746000" />
+      <workItem from="1753960600078" duration="3129000" />
     </task>
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
     <option name="version" value="3" />
   </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
+  </component>
 </project>

+ 119 - 4
app/Amqp/Consumer/MqConsumer.php

@@ -12,7 +12,7 @@ use Hyperf\Di\Annotation\Inject;
 use PhpAmqpLib\Message\AMQPMessage;
 use Psr\Log\LoggerInterface;
 use Hyperf\Redis\RedisFactory;
-
+use App\Controller\MessageController;
 #[Consumer(exchange: 'chatprod', routingKey: 'chatprod', queue: 'chatprod', name: "chatprod", nums: 1)]
 class MqConsumer extends ConsumerMessage
 {
@@ -21,6 +21,11 @@ class MqConsumer extends ConsumerMessage
      */
     #[Inject]
     private $chatServiceClient;
+    /**
+     * @var MessageController
+     */
+    #[Inject]
+    protected MessageController $messageController;
 
     protected $logger;
     #[Inject]
@@ -52,20 +57,130 @@ class MqConsumer extends ConsumerMessage
             // 数据存储
             $this->logger->info('消费数据', ['data' => $data]);
             var_dump($data, '=================消费数据==============');
-            // 调用数据处理服务
-            $result = $this->chatServiceClient->addChatRecords($data);
+            switch (intval($data['talk_type'])) {
+                case 1:
+                    $this->messageController->sendSingleChat($data);
+                    return Result::ACK;
+                    break;
+                case 2:
+                    $this->messageController->sendGroupChat($data);
+                    return Result::ACK;
+                    break;
+                case 100:
+                    //审核资讯-通知所有的管理员
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 101:
+                    //审核资讯-通知所有的管理员
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 200:
+                    //审核商品-通知所有的管理员
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 201:
+                    //审核商品-通知发布者
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 300:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 301:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 400:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 401:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 500:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 501:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 600:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 601:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 700:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 701:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 800:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 801:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 802:
+                        $this->messageController->sendOtherUserMessage($data);
+                        return Result::ACK;
+                        break;
+                case 900:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 901:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 1000:
+                    $this->messageController->sendAdminMessage($data);
+                    return Result::ACK;
+                    break;
+                case 1001:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                case 1002:
+                    $this->messageController->sendUserMessage($data);
+                    return Result::ACK;
+                    break;
+                default:
+                    // 调用数据处理服务
+                    $result = $this->chatServiceClient->addChatRecords($data);
+                    return Result::ACK;
+                    break;
+            }
+
             // 记录处理结果
             $this->logger->info("消费成功:", ['result' => $result]);
             return Result::ACK;
         } catch (\Exception $e) {
+            var_dump($e->getMessage(), '=================消费失败==============');
             // 记录错误
             $this->logger->error("消费失败:", ['error' => $e->getMessage()]);
             // 返回拒绝,重新入队
-            // return Result::REQUEUE;
+//             return Result::REQUEUE;
+            return Result::ACK;
         }
 
+
     }
 
+
     public function isEnable(): bool
     {
         return true;

+ 31 - 7
app/Controller/AdController.php

@@ -54,7 +54,7 @@ class AdController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->adServiceClient->createAd($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     /**
@@ -127,7 +127,7 @@ class AdController extends AbstractController
 
             }
         }
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     public function updateAd()
@@ -150,7 +150,7 @@ class AdController extends AbstractController
         }
         $requireData = $this->request->all();
         $result = $this->adServiceClient->updateAd($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     public function delAd()
@@ -171,7 +171,7 @@ class AdController extends AbstractController
         }
         $result = $this->adServiceClient->delAd($requireData);
         var_dump($result);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     /**
@@ -206,7 +206,7 @@ class AdController extends AbstractController
                 $result['data']['rows'][$k]['status_name'] = $statusName[$v['status']];
             }
         }
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     /**
@@ -242,7 +242,7 @@ class AdController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->adServiceClient->createAdPlace($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     public function updateAdPlace()
@@ -276,7 +276,7 @@ class AdController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->adServiceClient->updateAdPlace($requireData);
-        return $result?Result::success($result['data']):Result::error($result['message']);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
 
     /**
@@ -326,4 +326,28 @@ class AdController extends AbstractController
         $result = $this->adServiceClient->getAdPlaceInfo(intval($requireData['id']));
         return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
     }
+
+    /**
+     * 孪生站添加广告位
+     * @return array
+     */
+    public function addTwinAdPlace()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'adPlaceList' => 'required', //广告位名称
+            ],
+            [
+                'adPlaceList.required' => '广告位列表不能为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->adServiceClient->addTwinAdPlace($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
 }

+ 56 - 12
app/Controller/ChatController.php

@@ -1,6 +1,7 @@
 <?php
 
-declare (strict_types = 1);
+declare(strict_types=1);
+
 namespace App\Controller;
 
 use App\JsonRpc\ChatServiceInterface;
@@ -87,7 +88,7 @@ class ChatController extends AbstractController
         $type = array();
         foreach ($typeArr as   $value) {
             // var_dump($value['id'], '=-===2222222222');
-           $type[$value['id']] = (string) $value['topicname'];
+            $type[$value['id']] = (string) $value['topicname'];
         }
         // var_dump($type);
         // exit;
@@ -168,7 +169,6 @@ class ChatController extends AbstractController
         $requireData['user_id'] = Context::get("UserId");
         $result = $this->chatServiceClient->getFriendInfo($requireData);
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
-
     }
 
     /**
@@ -480,8 +480,7 @@ class ChatController extends AbstractController
                 'group_desc' => 'required',
                 // 'group_avatar' => 'required',
                 // 'group_member' => 'required',
-            ]
-            ,
+            ],
             [
                 'group_name.required' => '群名称不能为空',
                 'group_desc.required' => '群描述不能为空',
@@ -649,8 +648,10 @@ class ChatController extends AbstractController
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
+        $requireData['token'] = Context::get("Token");
+
         $result = $this->chatServiceClient->joinGroup($requireData);
-        var_dump($result, '-----------1--------');
+        //        var_dump($result, '-----------1--------');
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
 
@@ -738,6 +739,23 @@ class ChatController extends AbstractController
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
+        $requireData['type_id'] = Context::get("TypeId");
+        // if($requireData['type_id']==10000 && $requireData['is_group']==1){
+        //     $url = env('IM_URL').'/api/v1/group/create';
+        //     $data = [
+        //         'avatar' => '',
+        //         'name' => $requireData['group_name'],
+        //         'profile'=>'',
+        //         'ids' => '',
+        //     ];
+        //     $options = [
+        //         'authorization'=>Context::get('Token')
+        //     ];
+        //     $res = PublicData::im_post($url,$data,$options);
+        //     if($res['code']==200){
+        //         $requireData['group_id'] = $res['data']['group_id'];
+        //     }
+        // }
         $result = $this->chatServiceClient->addTopic($requireData);
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -764,6 +782,7 @@ class ChatController extends AbstractController
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
+        $requireData['type_id'] = Context::get("TypeId");
         $result = $this->chatServiceClient->updateTopic($requireData);
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -1132,13 +1151,13 @@ class ChatController extends AbstractController
                 'status.required' => '状态不能为空',
                 'status.in' => '状态值不合法,2或者3',
             ]
-        )
-        ;
+        );
         if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
+        $requireData['token'] = Context::get('Token');
         $result = $this->chatServiceClient->applyTopic($requireData);
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -1159,8 +1178,7 @@ class ChatController extends AbstractController
             [
                 'id.required' => 'TopicID不能为空',
             ]
-        )
-        ;
+        );
         if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
@@ -1180,8 +1198,7 @@ class ChatController extends AbstractController
             [
                 'topicname.required' => '名称不能为空',
             ]
-        )
-        ;
+        );
         if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
@@ -1215,4 +1232,31 @@ class ChatController extends AbstractController
         $result = $this->chatServiceClient->deleteTopicClass($requireData);
         return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
     }
+
+    /**
+     * 获取所有商圈
+     * @return array
+     */
+    public function getBusinessDistrictList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required|integer',
+                'page_size' => 'required|integer',
+            ],
+            [
+                'page.required' => '页码不能为空',
+                'page_size.required' => '每页数量不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get("UserId");
+        $result = $this->chatServiceClient->getBusinessDistrictList($requireData);
+        return $result && $result['code'] != 0 ? Result::success($result['data']) : Result::error($result['message']);
+    }
 }

+ 122 - 0
app/Controller/ClientController.php

@@ -7,6 +7,7 @@ namespace App\Controller;
 use App\JsonRpc\ChatServiceInterface;
 use App\JsonRpc\UserServiceInterface;
 use App\JsonRpc\ClientServiceInterface;
+use Hyperf\HttpServer\Contract\RequestInterface;
 
 use App\Tools\PublicData;
 use App\Tools\Result;
@@ -39,12 +40,14 @@ class ClientController extends AbstractController
         ClientServiceInterface $clientServiceClient,
         ValidatorFactoryInterface $validationFactory,
         ChatServiceInterface $chatServiceClient,
+        RequestInterface $request,
         UserServiceInterface $userServiceClient
     ) {
         $this->clientServiceClient = $clientServiceClient;
         $this->validationFactory = $validationFactory;
         $this->chatServiceClient = $chatServiceClient;
         $this->userServiceClient = $userServiceClient;
+        $this->request = $request;
     }
     public function test()
     {
@@ -52,4 +55,123 @@ class ClientController extends AbstractController
         $test = $this->clientServiceClient->test(['name' => 'test']);
         return Result::success($test);
     }
+
+    public function indexData()
+    {
+        $request_data = $this->request->all();
+        var_dump($request_data, '---------------');
+        $data = $this->clientServiceClient->indexData($request_data);
+        var_dump($data, '-----1----------');
+        return Result::success($data);
+    }
+    public function addWeb()
+    {
+        $request_data = $this->request->all();
+        //校验数据
+        var_dump($request_data, '---------------');
+        $validator = $this->validationFactory->make(
+            $request_data,
+            [
+                'website_id' => 'required'
+            ],
+            [
+                'website_id.required' => 'website_id is required'
+            ]
+        );
+        if ($validator->fails()) {
+            return Result::error($validator->errors()->first());
+        }
+        $request_data['user_id'] =  Context::get("UserId");
+        // $request_data['website_id'] = Context::get("SiteId");
+        $result = $this->clientServiceClient->addWeb($request_data);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function deleteWeb()
+    {
+        $request_data = $this->request->all();
+        $result = $this->clientServiceClient->deleteWeb($request_data);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function getWebInfo()
+    {
+        $request_data = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $request_data,
+            [
+                'id' => 'required',
+            ],
+            [
+                'id.required' => 'ID必填',
+            ]
+        );
+        if ($validator->fails()) {
+            return Result::error($validator->errors()->first());
+        }
+        $result = $this->clientServiceClient->getWebInfo($request_data);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function updateWeb()
+    {
+
+        $request_data = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $request_data,
+            [
+                'id' => 'required',
+                'port' => 'required',
+                'dir' => 'required',
+            ],
+            [
+                'id.required' => 'ID必填',
+                'port.required' => 'Port必填',
+                'dir.required' => '路径必填'
+            ]
+        );
+        $result = $this->clientServiceClient->updateWeb($request_data);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function getWebList()
+    {
+        $request_data = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $request_data,
+            [
+                'page' => 'required',
+                'pageSize' => 'required'
+            ],
+            [
+                'page.required' => 'Page is required',
+                'pageSize.required' => 'Page size is required'
+            ]
+        );
+
+        if ($validator->fails()) {
+            return Result::error($validator->errors()->first());
+        }
+        $result = $this->clientServiceClient->getWebList($request_data);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function updateWebConfig()
+    {
+        $request_data = $this->request->all();
+        $data = $this->clientServiceClient->updateWebConfig($request_data);
+        var_dump($data, 'return data');
+        return $data['code'] == 200 ? Result::success($data['data']) : Result::error($data['message']);
+    }
+    public function updateWebOutput()
+    {
+        $request_data = $this->request->all();
+        $data = $this->clientServiceClient->updateWebOutput($request_data);
+        return $data ? Result::success($data['data']) : Result::error($data['message']);
+    }
+    public function updateWebMove()
+    {
+        $request_data = $this->request->all();
+        $data = $this->clientServiceClient->updateWebMove($request_data);
+    }
+    public function runWeb()
+    {
+        $request_data = $this->request->all();
+        $data = $this->clientServiceClient->runWeb($request_data);
+    }
 }

+ 488 - 0
app/Controller/FormController.php

@@ -0,0 +1,488 @@
+<?php
+
+declare(strict_types=1);
+namespace App\Controller;
+
+use App\JsonRpc\FormServiceInterface;
+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\ImportQueueService;
+/**
+ * ClassFormController
+ * @package App\Controller
+ */
+
+class FormController extends AbstractController
+    {
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    #[Inject]
+    protected ImportQueueService $Iservice;
+
+    /**
+     * @var FormServiceInterface
+     */
+    #[Inject]
+    private $formServiceClient;
+ 
+    /**
+     * 添加网站
+     * @return array
+     */
+    public function addGlobalTable()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name'=> 'required',
+                'table'=> 'required',
+            ],
+            [
+                'name.required' => '表单名称不能为空',
+                'table.required' => '表单表名不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+
+        
+        $result = $this->formServiceClient->addGlobalTable($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 全局表单列表
+     * @return array
+     */
+    public function getGlobalTableList()    
+    {
+        $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->formServiceClient->getGlobalTableList($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 修改全局表单
+     */
+    public function upGlobalTable()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'name'=> 'required',
+                'table'=> 'required',
+                'id'=> 'required',
+            ],
+            [
+                'name.required' => '表单名称不能为空',
+                'table.required' => '表单表名不能为空',
+                'id.required' => 'id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->formServiceClient->upGlobalTable($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /** 
+     * 删除全局表单
+    */
+    public function delGlobalTable()
+    {
+        $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->formServiceClient->delGlobalTable($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 获取全局表单详情
+     * @return array
+     */
+    public function getGlobalTable(){
+        $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->formServiceClient->getGlobalTable($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 获取表单下面的-字段
+     * @return array
+     */
+    public function getGlobalTableFieldList(){
+
+        $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->formServiceClient->getGlobalTableFieldList($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 添加字段
+     * @return array
+     */
+    public function addGlobalTableField(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'title'=>'required',
+                'field_name'=>'required',
+                'field_type'=>'required',
+                'table_id'=>'required',
+            ],
+            [
+                'title.required' => '显示名称不能为空',
+                'field_name.required' => '字段名称不能为空',
+                'field_type.required' => '字段类型不能为空',
+                'table_id.required' => '表单id不能为空',        
+
+            ]
+            );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);    
+        }
+        $result = $this->formServiceClient->addGlobalTableField($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * upGlobalTableField
+     * @return array
+     */
+    public function upGlobalTableField(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'title'=>'required',
+                'field_name'=>'required',
+                'field_type'=>'required',
+                'table_id'=>'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'title.required' => '显示名称不能为空',
+                'field_name.required' => '字段名称不能为空',        
+                'field_type.required' => '字段类型不能为空',
+            ]
+            );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->formServiceClient->upGlobalTableField($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }   
+        return Result::success($result['data']);
+    }
+    /**
+     * 删除表单字段
+     * @return array
+     */
+    public function delGlobalTableField(){
+        $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->formServiceClient->delGlobalTableField($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+
+    }
+    /**
+     * 获取表单字段详情
+     * @return array    
+     */
+    public function getGlobalTableField(){
+        $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->formServiceClient->getGlobalTableField($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 查看表单下面的数据
+     * getGlobalTableData
+     * @return array
+     */
+    public function getGlobalTableData(){
+        $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->formServiceClient->getGlobalTableData($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 字段类型列表
+     * @return array
+     */
+    public function getGlobalTableFieldTypeList(){
+        $result = $this->formServiceClient->getGlobalTableFieldTypeList([]);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 删除表单下面的数据
+     * @return array
+     */
+    public function delGlobalTableData(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'table_id'=>'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'table_id.required' => '表单id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->formServiceClient->delGlobalTableData($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * @return array
+     */
+    public function getGlobalTableDataById(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'table_id'=>'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'table_id.required' => '表单id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->formServiceClient->getGlobalTableDataById($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 更新表单下面的数据
+     * @return array
+     */
+    public function updateGlobalTableData(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id'=>'required',
+                'table_id'=>'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'table_id.required' => '表单id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->formServiceClient->updateGlobalTableData($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**、
+     * 拉取字段
+     * @return array
+     */
+    public function getWebGlobalTableFieldList(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'table_id'=>'required',
+            ],
+            [
+                'table_id.required' => '表单table_id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] = Context::get('SiteId');
+        $result = $this->formServiceClient->getWebGlobalTableFieldList($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 存储数据
+     * @return array
+     */
+    public function addWebGlobalTableData(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'data'=>'required',
+                'otherData'=>'required',
+            ],
+            [
+                'data.required' => '数据不能为空',
+                'otherData.required' => '数据不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['orderData']['website_id'] = Context::get('SiteId');
+        $result = $this->formServiceClient->addWebGlobalTableData($requireData);
+        if ($result['code']!= ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+}

+ 24 - 10
app/Controller/IndexController.php

@@ -20,7 +20,8 @@ class IndexController extends AbstractController
     #[Inject]
     protected ValidatorFactoryInterface $validationFactory;
 
-    public function index(RequestInterface $request){
+    public function index(RequestInterface $request)
+    {
         $validator = $this->validationFactory->make(
             $request->all(),
             [
@@ -33,7 +34,7 @@ class IndexController extends AbstractController
             ]
         );
 
-        if ($validator->fails()){
+        if ($validator->fails()) {
             // Handle exception
             $errorMessage = $validator->errors()->first();
             var_dump($errorMessage);
@@ -60,23 +61,36 @@ class IndexController extends AbstractController
         $img_code = $result->getImageCode();
         $code_uniqid = uniqid("code");
         //写入缓存 用于其他方法验证 并且设置过期时间
-        $redis->set($code_uniqid,$img_code,60000);
+        $redis->set($code_uniqid, $img_code, 60000);
+        //删除掉所有code_uniqid
+        $redis->del($code_uniqid);
+        $iterator = null;
+        do {
+            $keys = $redis->scan($iterator, "code*");
+            var_dump($keys, '---1');
+            if ($keys) {
+                foreach ($keys as $key) {
+                    $redis->del($key);
+                }
+            }
+        } while ($iterator > 0);
+
 
-        return $result?Result::success(['code'=>$code_uniqid,'img'=>$result->getImageBase64()]):Result::error('失败');
-//        return $result->getImageBase64();
+        return $result ? Result::success(['code' => $code_uniqid, 'img' => $result->getImageBase64()]) : Result::error('失败');
+        //        return $result->getImageBase64();
 
     }
 
-// test
-      /**
+    // test
+    /**
      * 获取验证码
      */
-    public function getverifyCode(){
+    public function getverifyCode()
+    {
         $comm = new CommonService();
         $ip = $comm->userIp();
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
-        $img_code  =  $redis->get('code'.$ip);
+        $img_code  =  $redis->get('code' . $ip);
         return Result::success($img_code);
     }
-
 }

+ 119 - 106
app/Controller/LoginController.php

@@ -1,5 +1,7 @@
 <?php
-declare (strict_types = 1);
+
+declare(strict_types=1);
+
 namespace App\Controller;
 
 use App\JsonRpc\UserServiceInterface;
@@ -19,6 +21,7 @@ use Hyperf\HttpServer\Response;
 use Hyperf\HttpMessage\Cookie\Cookie;
 use App\Controller\UserController;
 use App\JsonRpc\WebsiteServiceInterface;
+
 /**
  * @AutoController()
  */
@@ -27,7 +30,7 @@ class LoginController extends AbstractController
 
     #[Inject]
     protected ValidatorFactoryInterface $validationFactory;
-//    protected JWT $JWT;
+    //    protected JWT $JWT;
     /**
      * @var UserServiceInterface
      */
@@ -41,11 +44,11 @@ class LoginController extends AbstractController
     /**
      * @var Response
      */
-//    private $response;
-//    public function __construct(Jwt $JWT)
-//    {
-//        $this->JWT = $JWT;
-//    }
+    //    private $response;
+    //    public function __construct(Jwt $JWT)
+    //    {
+    //        $this->JWT = $JWT;
+    //    }
     public function login(Jwt $jwt)
     {
 
@@ -92,23 +95,23 @@ class LoginController extends AbstractController
             return Result::error("用户不存在");
         }
 
-        if($userInfos['data']['status']==0){
+        if ($userInfos['data']['status'] == 0) {
             return Result::error("用户已经冻结");
         }
 
         if (md5(md5($reqData['password']) . $userInfos['data']['salt']) != $userInfos['data']['password']) {
             return Result::error("登陆密码错误");
         }
-        if($userInfos['data']['type_id']!=10000){
+        if ($userInfos['data']['type_id'] != 10000) {
             $authData = [
 
-                'id'=>$userInfos['data']['sszq'],
-                'SiteId'=>Context::get("SiteId")
+                'id' => $userInfos['data']['sszq'],
+                'SiteId' => Context::get("SiteId")
             ];
-            var_dump("参数:",$authData);
+            var_dump("参数:", $authData);
             $resultAuth =  $this->checkUserAuth($authData);
 
-            if(!$resultAuth){
+            if (!$resultAuth) {
                 return Result::error("您没有权限登陆此网站");
             }
         }
@@ -119,6 +122,10 @@ class LoginController extends AbstractController
             'email' => $userInfos['data']['email'],
             'level_id' => $userInfos['data']['level_id'],
             'type_id' => $userInfos['data']['type_id'],
+            'metadata' => [
+                'user_id' => $userInfos['data']['id'] ?? 0,
+            ],
+            'iss' => 'web', // 与 Go 系统保持一致
         ];
         // 使用默认场景登录
         $token = $jwt->getToken('default', $userData);
@@ -128,19 +135,18 @@ class LoginController extends AbstractController
             $jwt->logout($old_token->token);
             try {
                 $jwt->verifyToken($old_token->token);
-            }catch (\Exception $exception){
+            } catch (\Exception $exception) {
                 $code = $exception->getCode();
-                if ($code== 400) {
+                if ($code == 400) {
                     $new_token = UserToken::where('user_id', $userData['uid'])->update(['token' => $token->toString()]);
                     if (empty($new_token)) {
                         return Result::error("Token过期失败!");
                     }
-
-                } else{
+                } else {
                     return Result::error("Token过期失败!");
                 }
             }
-        }else{
+        } else {
             $usernew_token = $token->toString();
             $user_token =  UserToken::create([
                 'user_id' => $userData['uid'],
@@ -150,8 +156,20 @@ class LoginController extends AbstractController
                 return Result::error("登录失败!");
             }
         }
+        $claims = [
+            'iss' => 'web', // 与 Go 系统保持一致
+            'metadata' => [
+                'user_id' => $userInfos['data']['id'] ?? 0,
+            ],
+            // 可以保留其他字段,但要确保 Go 系统也能处理
+            // 'exp' => time() + 3600,
+            // 'iat' => time(),
+            // 'jti' => md5(uniqid($userInfos['data']['id'] . $userInfos['data']['mobile'] ?? '', true)),
+        ];
+        $token_im = $jwt->getToken('default', $claims);
         $data = [
             'token' => $token->toString(),
+            'token_im' => $token_im->toString(),
             'exp' => $jwt->getTTL($token->toString()),
         ];
         return Result::success($data);
@@ -252,6 +270,7 @@ class LoginController extends AbstractController
         $checkUserInfo = $this->userServiceClient->verifyUserInfo([
             'user_name' => $response['phone_info']['purePhoneNumber'],
         ]);
+        var_dump("检测返回值用户信息:", $checkUserInfo);
         if ($checkUserInfo['code'] == 0) {
             $salt = rand(1, 999999);
             $createUserData = [
@@ -259,9 +278,14 @@ class LoginController extends AbstractController
                 'salt' => $salt,
                 'password' => $openInfoData['openid'],
                 'type_id' => 20000,
+                'mobile' => $response['phone_info']['purePhoneNumber'],
+                'other' => [],
+                'city_arr_id' => [],
+                'address_arr_id' => []
             ];
             $checkUserInfo = $this->userServiceClient->createUser($createUserData);
         }
+        var_dump("返回值用户信息:", $checkUserInfo);
         //根据openid和手机号判断是否注册,未注册直接注册
         $wechatReqData = [
             'openid' => $openInfoData['openid'],
@@ -275,19 +299,20 @@ class LoginController extends AbstractController
                 'purePhoneNumber' => $response['phone_info']['purePhoneNumber'],
                 'countryCode' => $response['phone_info']['countryCode'],
                 'watermark' => json_encode($response['phone_info']['watermark']),
-                'user_id' => $checkUserInfo['data']['id'],
+                'user_id' => $checkUserInfo['data']['id'] ?? 0,
             ];
+            var_dump("##插入的值:", $wechatData);
             $this->userServiceClient->addWechatInfo($wechatData);
         }
         var_dump($checkUserInfo);
         $userData = [
-            'uid' => $checkUserInfo['data']['id'], // 如果使用单点登录,必须存在配置文件中的sso_key的值,一般设置为用户的id
-            'user_name' => $response['phone_info']['phoneNumber'],
+            'uid' => $checkUserInfo['data']['id'] ?? 0, // 如果使用单点登录,必须存在配置文件中的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'],
+            '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);
@@ -296,7 +321,6 @@ class LoginController extends AbstractController
             'exp' => $jwt->getTTL($token->toString()),
         ];
         return Result::success($data);
-
     }
     public function getToken(JWT $jwt)
     {
@@ -320,19 +344,16 @@ class LoginController extends AbstractController
         return Result::success($token->toString());
     }
 
-    public function httpPost()
-    {
-
-    }
+    public function httpPost() {}
     # http头部必须携带token才能访问的路由
     public function getData(Jwt $jwt)
     {
-//        var_dump($this->UserId);
+        //        var_dump($this->UserId);
         $h = $this->request->getHeaders();
-//        var_dump($this->request->getHeaders());
-//        $a= 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwicm9sZV9pZCI6MSwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjo4LCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82Njc1MjJkZDQ3YWYxMi41MTE5MjI5MiIsImlhdCI6MTcxODk1MjY2OSwibmJmIjoxNzE4OTUyNjY5LCJleHAiOjE3MjE1NDQ2Njl9.e0JW8fgNrwBdFgmQ8GNtES2ME1SbcbIih5MsQWzT6sk';
+        //        var_dump($this->request->getHeaders());
+        //        $a= 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwaHBlcjY2Ni9qd3QiLCJ1aWQiOjMyLCJ1c2VyX25hbWUiOiIxIiwicm9sZV9pZCI6MSwibW9iaWxlIjoiMTU4MDEyNDU3NTUiLCJlbWFpbCI6IjVAcXEuY29tIiwicm9uZ190b2tlbiI6IiIsImxldmVsX2lkIjo4LCJqd3Rfc2NlbmUiOiJkZWZhdWx0IiwianRpIjoiZGVmYXVsdF82Njc1MjJkZDQ3YWYxMi41MTE5MjI5MiIsImlhdCI6MTcxODk1MjY2OSwibmJmIjoxNzE4OTUyNjY5LCJleHAiOjE3MjE1NDQ2Njl9.e0JW8fgNrwBdFgmQ8GNtES2ME1SbcbIih5MsQWzT6sk';
         $arr = $jwt->getClaimsByToken($h['token'][0]);
-        var_dump($h['token'][0], "+++++++++++", $arr, "===####");
+        // var_dump($h['token'][0], "+++++++++++", $arr, "===####");
         return $this->response->json(['code' => 0, 'msg' => 'success', 'data' => ['a' => 1]]);
     }
 
@@ -342,20 +363,20 @@ class LoginController extends AbstractController
      */
     public function checkUserAuth($data)
     {
-//        var_dump("进没进来呢::",$data);
+        //        var_dump("进没进来呢::",$data);
         $websiteGroup = [
-            'id'=>$data['id']
+            'id' => $data['id']
         ];
         $result = $this->userServiceClient->getWebsiteGroupInfo($websiteGroup);
-//        var_dump("checkUserAuth:",$result);
-        if($result['code']==200){
-            if($data['SiteId'] && $result['data']['web_ids']){
-                if(in_array($data['SiteId'],json_decode($result['data']['web_ids'],true))){
+        var_dump("checkUserAuth:", $result);
+        if ($result['code'] == 200) {
+            if ($data['SiteId'] && $result['data']['web_ids']) {
+                if (in_array($data['SiteId'], json_decode($result['data']['web_ids'], true))) {
                     return true;
-                }else{
+                } else {
                     return false;
                 }
-            }else{
+            } else {
                 return false;
             }
         }
@@ -373,7 +394,7 @@ class LoginController extends AbstractController
         $header = $this->request->getHeader('userurl');
         $origin = $header[0];
         $logindevice = explode("//", $origin);
-        if(!isset($logindevice[1]) && !$logindevice[1]){
+        if (!isset($logindevice[1]) && !$logindevice[1]) {
             return Result::error('userurl不存在,请登录');
         }
         $reqData = $this->request->all();
@@ -393,20 +414,20 @@ class LoginController extends AbstractController
         try {
             $jwt->verifyToken($reqData['token']);
             $results = $this->checkAuth([
-                'token'=>$reqData['token'],
-                'userurl'=>$logindevice[1]
+                'token' => $reqData['token'],
+                'userurl' => $logindevice[1]
             ]);
-            if($results['code']==200){
+            if ($results['code'] == 200) {
                 return Result::success(['isLogin' => true]);
-            }elseif($results['code']==-1){
-                return Result::error("没有权限登陆".$logindevice[1]."这个域名",-1);
-            }elseif($results['code']==-2){
-                return Result::error("token已过期",-2);
-            }else{
+            } elseif ($results['code'] == -1) {
+                return Result::error("没有权限登陆" . $logindevice[1] . "这个域名", -1);
+            } elseif ($results['code'] == -2) {
+                return Result::error("token已过期", -2);
+            } else {
                 return Result::error("参数错误");
             }
-        }catch(\Exception $e){
-            return Result::error('token已过期:'.$e->getMessage(),-2);
+        } catch (\Exception $e) {
+            return Result::error('token已过期:' . $e->getMessage(), -2);
         }
     }
 
@@ -434,9 +455,9 @@ class LoginController extends AbstractController
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
         $ticket = md5($reqData['token']);
 
-        $res = $redis->set('ticket:' . $ticket, $reqData['token'],  3600*24);
-        if ($res){
-            return Result::success(['ticket' => $ticket ,'isSave' => 1]);
+        $res = $redis->set('ticket:' . $ticket, $reqData['token'],  3600 * 24);
+        if ($res) {
+            return Result::success(['ticket' => $ticket, 'isSave' => 1]);
         } else {
             return Result::error('存储失败');
         }
@@ -464,12 +485,12 @@ class LoginController extends AbstractController
         if ($redis->exists('ticket:' . $ticket)) {
             $res = $redis->del('ticket:' . $ticket);
             if (!!$res && $res == 1) $isDel = 1;
-        }else{
+        } else {
             $isDel = 1;
         }
         try {
             $jwt->logout($reqData['token']);
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
             return Result::success(['isDel' => $isDel]);
         }
         return Result::success(['isDel' => $isDel]);
@@ -493,42 +514,38 @@ class LoginController extends AbstractController
         if (empty($theHost)) {
             return Result::error('系统配置错误:THE_HOST 未定义');
         }
-        var_dump("admintoken:",$adminToken);
+        var_dump("admintoken:", $adminToken);
         // 如果存在 adminToken,则进行登录校验
         if (!empty($adminToken)) {
             // 处理登录
             $redis = $this->container->get(\Hyperf\Redis\Redis::class);
-            var_dump("ticket1111:",$ticket);
-            if(!empty($ticket)){
+            var_dump("ticket1111:", $ticket);
+            if (!empty($ticket)) {
                 if (!empty($ticket) && $redis->exists('ticket:' . $ticket)) {
-                    if(isset($reqData['userurl']) && $reqData['userurl']){
+                    if (isset($reqData['userurl']) && $reqData['userurl']) {
                         $resultR = $this->checkAuth([
-                            'token'=>$redis->get('ticket:' . $ticket),
-                            'userurl'=>$reqData['userurl']
+                            'token' => $redis->get('ticket:' . $ticket),
+                            'userurl' => $reqData['userurl']
                         ]);
-                        if($resultR['code']==-1){
-                            return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/loginAlert'), 302);
+                        if ($resultR['code'] == -1) {
+                            return $this->response->redirect($this->fun_http('http://' . $theHost . '/#/loginAlert'), 302);
                         }
-                    }else{
+                    } else {
                         $backurl = rtrim($backurl, '/');
                         return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
                     }
-
-
-                }else{
+                } else {
                     var_dump("222222222:");
-                    return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
+                    return $this->response->redirect($this->fun_http('http://' . $theHost . '/#/login?backurl=' . urlencode($backurl)), 302);
                 }
-
-            }else{
+            } else {
                 $ticket = md5($adminToken);
             }
             var_dump("333333333333333:");
             return $this->response->redirect($this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken)), 302);
-
-        }else{
+        } else {
             var_dump("444444444444444:");
-            return $this->response->redirect($this->fun_http('http://'.$theHost.'/#/login?backurl='.urlencode($backurl)), 302);
+            return $this->response->redirect($this->fun_http('http://' . $theHost . '/#/login?backurl=' . urlencode($backurl)), 302);
         }
     }
 
@@ -565,8 +582,8 @@ class LoginController extends AbstractController
         $backurl = rtrim($backurl, '/');
         $redirectUrl = $this->fun_http($backurl . '?ticket=' . $ticket . '&admintoken=' . urlencode($adminToken));
 
-//        $loginUrl = 'http://' . $theHost . '/#/login?backurl=' . urlencode($backurl);
-//        return $this->response->redirect($loginUrl, 302);
+        //        $loginUrl = 'http://' . $theHost . '/#/login?backurl=' . urlencode($backurl);
+        //        return $this->response->redirect($loginUrl, 302);
         return $this->response->redirect($redirectUrl, 302);
     }
 
@@ -617,14 +634,13 @@ class LoginController extends AbstractController
         // 获取所有 Cookie
         $cookies = $this->request->getCookieParams();
         var_dump("获取cookie:", $cookies);
-        if($cookies){
+        if ($cookies) {
             foreach ($cookies as $name => $value) {
-                if($name){
+                if ($name) {
                     $expire = time() - 3600; // 设置过期时间为过去的时间
                     $cookie = new Cookie((string)$name, '', $expire, '/');
                     $this->response = $this->response->withCookie($cookie);
                 }
-
             }
         }
         try {
@@ -647,7 +663,7 @@ class LoginController extends AbstractController
     {
 
         $reqData = $this->request->all();
-        var_dump("===============接收参数:",$reqData);
+        var_dump("===============接收参数:", $reqData);
         $validator = $this->validationFactory->make(
             $reqData,
             [
@@ -665,19 +681,19 @@ class LoginController extends AbstractController
         }
         $redis = $this->container->get(\Hyperf\Redis\Redis::class);
         $ticket = md5($reqData['token']);
-        $res = $redis->set('ticket:' . $ticket, $reqData['token'],  3600*24);
-        var_dump("===============返回值:",$res);
-        $expire = time()+3600*24;
+        $res = $redis->set('ticket:' . $ticket, $reqData['token'],  3600 * 24);
+        var_dump("===============返回值:", $res);
+        $expire = time() + 3600 * 24;
         $cookieName = 'Admin-Token';
         // 创建 Cookie 实例
         $cookie = new Cookie($cookieName, $reqData['token'], $expire, '/');
         // 清空 Cookie
         $r = $this->response = $this->response->withCookie($cookie);
         var_dump("设置token:", $r);
-        if($res && !empty($ticket)){
+        if ($res && !empty($ticket)) {
             $url = $reqData['backurl'] . '/?ticket=' . $ticket . '&admintoken=' . urlencode($reqData['token']);
             $url = $this->fun_http($url);
-            var_dump("跳转地址gogo:",$url);
+            var_dump("跳转地址gogo:", $url);
             return $this->response->redirect($url, 302);
         }
     }
@@ -692,19 +708,19 @@ class LoginController extends AbstractController
     public function checkAuth($data)
     {
         $jwt = new JWT();
-        $ver =$jwt->getClaimsByToken($data['token']);
+        $ver = $jwt->getClaimsByToken($data['token']);
         $tokenTime =  $jwt->getTokenDynamicCacheTime($data['token']);
-        if($tokenTime==0){
-            return Result::error("token已过期,请重新登录",-2);
+        if ($tokenTime == 0) {
+            return Result::error("token已过期,请重新登录", -2);
         }
-        if(isset($data['userurl']) && $data['userurl']){
-            $result = $this->websiteServiceClient->getWebsiteId(['website_url'=>$data['userurl']]);
-            if(!isset($result['data']['id']) || !$result['data']['id']){
-                return Result::error("网站不存在...",-2);
+        if (isset($data['userurl']) && $data['userurl']) {
+            $result = $this->websiteServiceClient->getWebsiteId(['website_url' => $data['userurl']]);
+            if (!isset($result['data']['id']) || !$result['data']['id']) {
+                return Result::error("网站不存在...", -2);
             }
-            if($ver['type_id']!=10000){
+            if ($ver['type_id'] != 10000) {
                 $userInfo = $this->userServiceClient->getUserInfo($ver['uid']);
-                if($userInfo['code'] == 200 && isset($userInfo['data']) && !empty($userInfo['data']['sszq'])){
+                if ($userInfo['code'] == 200 && isset($userInfo['data']) && !empty($userInfo['data']['sszq'])) {
                     $sszq = $userInfo['data']['sszq'];
                     //组id
                     $authData = [
@@ -715,21 +731,18 @@ class LoginController extends AbstractController
                     $resultAuth = $this->checkUserAuth($authData);
                     if (!$resultAuth) {
                         // 如果没有权限,返回错误响应
-                        return Result::error("没有权限登陆此网站...",-1);
-                    }else{
+                        return Result::error("没有权限登陆此网站...", -1);
+                    } else {
                         return Result::success([]);
                     }
-                }else{
-                    return Result::error("用户没有群组...",-2);
+                } else {
+                    return Result::error("用户没有群组...", -2);
                 }
-            }else{
+            } else {
                 return Result::success([]);
             }
-        }else{
-            return Result::error("userurl不能为空...",-2);
+        } else {
+            return Result::error("userurl不能为空...", -2);
         }
-
     }
-
-
 }

+ 137 - 0
app/Controller/MessageController.php

@@ -0,0 +1,137 @@
+<?php
+
+declare(strict_types=1);
+namespace App\Controller;
+
+/**
+ * MessageController
+ * @package App\Controller
+ */
+use App\JsonRpc\UserServiceInterface;
+use Hyperf\Di\Annotation\Inject;
+use Hyperf\Context\ApplicationContext;
+use Swoole\WebSocket\Server as WebSocketServer;
+use App\Service\RedisService;
+use Hyperf\Server\ServerManager;
+use function Hyperf\Support\call;
+use swoole\Server;
+class MessageController extends AbstractController
+{
+
+    /**
+     * @var UserServiceInterface
+     */
+    #[Inject]
+    private $userServiceClient;
+    public function sendAdminMessage($data)
+    {
+        try {
+            // 获取管理员列表
+            $adminList = $this->userServiceClient->getTypeUserList(['type_id' => 10000]);
+            // 获取 Swoole WebSocket Server 实例
+            $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
+            $redisClient = new RedisService();
+            if ($adminList && isset($adminList['data'])) {
+                foreach ($adminList['data'] as $admin) {
+                    $fd = $redisClient->findFd((int)$admin['id']);
+                    if ($fd && $server->isEstablished((int)$fd)) {
+                        $server->push((int)$fd, json_encode($data));
+                    }
+                }
+            }
+            return true;
+        } catch (\Throwable $e) {
+            var_dump('发送消息错误: ' . $e->getMessage());
+            return false;
+        }
+    }
+    public function sendUserMessage($data){
+        try { 
+            // 获取 Swoole WebSocket Server 实例
+            $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
+            $redisClient = new RedisService();
+            $fd = $redisClient->findFd((int)$data['user_id']);
+//            var_dump("用户信息:",$fd,$data['user_id'],$data);
+            if ($fd && $server->isEstablished((int)$fd)) {
+                $server->push((int)$fd, json_encode($data));
+            }
+        } catch (\Throwable $e) {
+            var_dump('发送消息错误: ' . $e->getMessage());
+            return false;
+        }
+    }
+    public function sendOtherUserMessage($data){
+        try {
+            // 获取 Swoole WebSocket Server 实例
+            $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
+            $redisClient = new RedisService();
+            $data['user_id'] = json_decode($data['user_id'],true);
+            if(is_array($data['user_id'])){
+                foreach($data['user_id'] as $user_id){
+                    $fd = $redisClient->findFd((int)$user_id);
+                    if ($fd && $server->isEstablished((int)$fd)) {
+                        $server->push((int)$fd, json_encode($data));
+                    }
+                }
+            }
+           
+        } catch (\Throwable $e) {
+            var_dump('发送消息错误: ' . $e->getMessage());
+            return false;
+        }
+    }
+    /**
+     * 单聊
+     */
+    public function sendSingleChat($data){
+        $userInfo = $this->userServiceClient->getImContact([
+            'user_id' => $data['receiver_id'],
+            'friend_id' => $data['user_id'],
+        ]);
+//        var_dump("用户信息:",$userInfo);
+        $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
+        $redisClient = new RedisService();
+        $message = [
+            'talk_type' => 1,
+            'title' => isset($userInfo['data']['remark']) && $userInfo['data']['remark'] != '' ? $userInfo['data']['remark'] : '好友',
+            'content' => $data['content'],
+            'messageType' => 1,
+            'receiver_id'=> $data['user_id'],
+//                    'user_id' => $user['user_id'] ?? '',
+            'time' => microtime(),
+        ];
+        $fd = $redisClient->findFd((int)$data['receiver_id']);
+        if ($fd && $server->isEstablished((int)$fd)) {
+            $server->push((int)$fd, json_encode($message));
+        }
+        return true;
+    }
+    /**
+     * 群聊
+     */
+    public function sendGroupChat($data){
+        $userList = $this->userServiceClient->getImGroupMember(['user_id' => $data['user_id'],'group_id' => $data['receiver_id']]);
+        // 获取 Swoole WebSocket Server 实例
+        $server = \Hyperf\Context\ApplicationContext::getContainer()->get(\Swoole\Server::class);
+        $redisClient = new RedisService();
+        if($userList && isset($userList['data'])){
+            foreach($userList['data'] as $user){
+                $message = [
+                    'talk_type' => 2,
+                    'title' => $user['group_name'],
+                    'content' => $data['content'],
+                    'messageType' => 1,
+                    'receiver_id'=> $data['receiver_id'],
+//                    'user_id' => $user['user_id'] ?? '',
+                    'time' => microtime(),
+                ];
+                $fd = $redisClient->findFd((int)$user['user_id']);
+                if ($fd && $server->isEstablished((int)$fd)) {
+                    $server->push((int)$fd, json_encode($message));
+                }
+            }
+        }
+    }
+
+
+}

+ 1 - 0
app/Controller/MinioController.php

@@ -38,6 +38,7 @@ class MinioController extends AbstractController
         if ($uploadedFile && $uploadedFile->isValid()) {
             $filename = $uploadedFile->getClientFilename();
             $fileContent = base64_encode(file_get_contents($uploadedFile->getRealPath()));
+            var_dump("look============:",$fileContent);
             $mimeType = $uploadedFile->getMimeType();
 //            var_dump("大小:",$uploadedFile->getSize());
             if($uploadedFile->getSize()>2097152){

+ 404 - 20
app/Controller/NewsController.php

@@ -104,7 +104,7 @@ class NewsController extends AbstractController
         //获取用户信息
         $user_id = Context::get("UserId");
         $userInfo = $this->userServiceClient->getUserInfo((int)$user_id);
-        var_dump("用户信息:", $userInfo);
+        // var_dump("用户信息:", $userInfo);
         $sszq = $userInfo['data']['sszq'];
         $type_id = $userInfo['data']['type_id']; //'1:个人会员 2:政务会员 3:企业会员 4:调研员 10000:管理员 20000:游客(小程序)'
         //管理员看所有
@@ -129,15 +129,15 @@ class NewsController extends AbstractController
             $requireData,
             [
                 'name' => 'required',
-                'seo_title' => 'required',
-                'seo_keywords' => 'required',
-                'seo_description' => 'required',
+                // 'seo_title' => 'required',
+                // 'seo_keywords' => 'required',
+                // 'seo_description' => 'required',
             ],
             [
                 'name.required' => '导航池名称不能为空',
-                'seo_title.required' => 'seo标题名称不能为空',
-                'seo_keywords.required' => 'seo关键词不能为空',
-                'seo_description.required' => 'seo描述不能为空',
+                // 'seo_title.required' => 'seo标题名称不能为空',
+                // 'seo_keywords.required' => 'seo关键词不能为空',
+                // 'seo_description.required' => 'seo描述不能为空',
             ]
         );
         if ($validator->fails()) {
@@ -170,16 +170,16 @@ class NewsController extends AbstractController
             [
                 'id' => 'required',
                 'name' => 'required',
-                'seo_title' => 'required',
-                'seo_keywords' => 'required',
-                'seo_description' => '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描述不能为空',
+                // 'seo_title.required' => 'seo标题名称不能为空',
+                // 'seo_keywords.required' => 'seo关键词不能为空',
+                // 'seo_description.required' => 'seo描述不能为空',
             ]
         );
         if ($validator->fails()) {
@@ -253,7 +253,7 @@ class NewsController extends AbstractController
         //获取用户信息
         $user_id = Context::get("UserId");
         $userInfo = $this->userServiceClient->getUserInfo((int)$user_id);
-        var_dump("用户信息:", $userInfo);
+        // var_dump("用户信息:", $userInfo);
         $sszq = $userInfo['data']['sszq'];
         //获取websiteid
         // $groupInfo = $this->WebsiteServiceClient->getWebsiteGroupInfo(['id' => $sszq]);
@@ -447,6 +447,34 @@ class NewsController extends AbstractController
         $result = $this->newsServiceClient->delArticle($requireData);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
+    /**
+     * 获取资讯手动推荐列表
+     * @return array
+     */
+    public function getArticleCommend()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required',
+                'pageSize' => 'required',
+                'website_id' => 'required'
+            ],
+            [
+                'page.required' => 'page不能为空',
+                'pageSize.required' => 'limit不能为空',
+                'website_id.required' => 'website_id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+
+        $result = $this->newsServiceClient->getArticleCommend($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
 
     /**
      * 获取资讯信息
@@ -569,9 +597,9 @@ class NewsController extends AbstractController
         );
         $user_id = Context::get("UserId");
         $userInfo = $this->userServiceClient->getUserInfo((int)$user_id);
-        var_dump("用户信息:", $userInfo);
+        // var_dump("用户信息:", $userInfo);
         $type_id = $userInfo['data']['type_id']; //'1:个人会员 2:政务会员 3:企业会员 4:调研员 10000:管理员 20000:游客(小程序)'
-        $requireData['type_id'] = $type_id;
+        $requireData['user_type_id'] = $type_id; //重名了
         $requireData['user_id'] = $user_id;
 
         if ($validator->fails()) {
@@ -922,6 +950,7 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
+        $requireData['user_id'] = Context::get("UserId");
         $result = $this->newsServiceClient->getNoticeInfo($requireData);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -1034,6 +1063,7 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
+        $requireData['user_id'] = Context::get("UserId");
         $result = $this->newsServiceClient->getComplaintInfo($requireData);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -1221,8 +1251,8 @@ class NewsController extends AbstractController
     *后端-招聘 新增职位
     * @return array
     */
-    public function addJobRecruiting()
-    {
+    public function addJobRecruiting(){
+        var_dump('111------********************----controller');
         $requireData = $this->request->all();
         // 定义验证规则数组
         $jobValidationRules = [
@@ -1288,7 +1318,7 @@ class NewsController extends AbstractController
         if (!isset($requireData['user_type']) || $requireData['user_type'] === null) {
             return Result::error('参数错误');
         }
-
+        var_dump('111------**********初步验证**********----controller');
         switch ($requireData['user_type']) {
             case 3:
                 $validator = $this->validationFactory->make($requireData, $jobValidationRules, $jobValidationMessages);
@@ -1311,7 +1341,9 @@ class NewsController extends AbstractController
             default:
                 return Result::error('不支持的用户类型');
         }
+        var_dump('111------**********最终验证**********----controller');
         $requireData['user_id'] = Context::get("UserId") ?? 0;
+        var_dump('111------********************----controller',$requireData['user_id']);
         $result = $this->newsServiceClient->addJobRecruiting($requireData);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
@@ -1817,7 +1849,7 @@ class NewsController extends AbstractController
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
-        // $requireData['user_id'] = Context::get("UserId");
+        $requireData['user_id'] = Context::get("UserId");
         $requireData['type_id'] = Context::get("TypeId");
         // $requireData['website_id'] = Context::get("SiteId");
         $result = $this->newsServiceClient->addBook($requireData);
@@ -1911,4 +1943,356 @@ class NewsController extends AbstractController
     }
 
     //20250422  书刊音像
+
+
+    // 20250623  项目管理
+    /**
+     * 项目列表
+     * @return array
+     */
+    public function getProjectList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required|integer',
+                'pageSize' => 'required|integer',
+                'status' => 'required|integer',
+            ],
+            [
+                'page.required' => 'page不能为空',
+                'page.integer' => 'page必须是整数',
+                'pageSize.required' => 'page_size不能为空',
+                'pageSize.integer' => 'page_size必须是整数',
+                'status.required' => 'status不能为空',
+                'status.integer' => 'status必须是整数',
+            ]
+
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        $result = $this->newsServiceClient->getProjectList($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 添加项目
+     * @return array
+     */
+    public function addProject()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required|integer',
+                'category_id' => 'required|integer',
+                'cat_arr_id' => 'required',
+                'title' => 'required',
+                'business_name' => 'required',
+                'content_person' => 'required',
+                'telephone' => 'required',
+                'city_id' => 'required',
+                'city_arr_id' => 'required',
+                'introduce' => 'required',
+                'franchise_details' => 'required',
+            ],
+            [
+                'website_id.required' => '网站id不能为空',
+                'website_id.integer' => '网站id必须是整数',
+                'category_id.required' => '栏目id不能为空',
+                'category_id.integer' => '栏目id必须是整数',
+                'cat_arr_id.required' => '栏目集合不能为空',
+                'title.required' => '标题不能为空',
+                'business_name.required' => '企业名称不能为空',
+                'content_person.required' => '联系人不能为空',
+                'telephone.required' => '联系电话不能为空',
+                'city_id.required' => '城市id不能为空',
+                'city_id.integer' => '城市id必须是整数',
+                'city_arr_id.required' => '城市不能为空',
+                'introduce.required' => '企业介绍不能为空',
+                'franchise_details.required' => '加盟详情不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        $result = $this->newsServiceClient->addProject($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 更新项目
+     * @return array
+     */
+    public function upProject()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+                'website_id' => 'required|integer',
+                'category_id' => 'required|integer',
+                'cat_arr_id' => 'required',
+                'title' => 'required',
+                'business_name' => 'required',
+                'content_person' => 'required',
+                'telephone' => 'required',
+                'city_id' => 'required',
+                'city_arr_id' => 'required',
+                'introduce' => 'required',
+                'franchise_details' => 'required',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'id.integer' => 'id必须是整数',
+                'website_id.required' => '网站id不能为空',
+                'website_id.integer' => '网站id必须是整数',
+                'category_id.required' => '栏目id不能为空',
+                'category_id.integer' => '栏目id必须是整数',
+                'cat_arr_id.required' => '栏目集合不能为空',
+                'title.required' => '标题不能为空',
+                'business_name.required' => '企业名称不能为空',
+                'content_person.required' => '联系人不能为空',
+                'telephone.required' => '联系电话不能为空',
+                'city_id.required' => '城市id不能为空',
+                'city_id.integer' => '城市id必须是整数',
+                'city_arr_id.required' => '城市不能为空',
+                'introduce.required' => '企业介绍不能为空',
+                'franchise_details.required' => '加盟详情不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        $result = $this->newsServiceClient->upProject($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 删除项目
+     * @return array
+     */
+    public function delProject()
+    {
+        $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->newsServiceClient->delProject($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 审核项目
+     * @return array
+     */
+    public function checkProject()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' => 'required|integer',
+                'status' => 'required|integer',
+            ],
+            [
+                'id.required' => 'id不能为空',
+                'id.integer' => 'id必须是整数',
+                'status.required' => '状态不能为空',
+                'status.integer' => '状态必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        $result = $this->newsServiceClient->checkProject($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 获取项目详情
+     * @return array
+     */
+    public function getProjectInfo()
+    {
+        $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);
+        }
+        $result = $this->newsServiceClient->getProjectInfo($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 已读未读
+     * @return array
+     */
+    public function readNotice()
+    {
+        $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->newsServiceClient->readNotice($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 已读未读
+     * @return array
+     */
+    public function readComplaint()
+    {
+        $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->newsServiceClient->readComplaint($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function readJobResume()
+    {
+        $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->newsServiceClient->readJobResume($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function readjobApply()
+    {
+        $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->newsServiceClient->readjobApply($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    public function noticeList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required|integer',
+                'page_size' => 'required|integer',
+            ],
+            [
+                'page.required' => 'page不能为空',
+                'page.integer' => 'page必须是整数',
+                'page_size.required' => 'page_size不能为空',
+                'page_size.integer' => 'page_size必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        //type_id
+        $requireData['type_id'] = Context::get('TypeId');
+        $result = $this->newsServiceClient->noticeList($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function complaintList()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'page' => 'required|integer',
+                'page_size' => 'required|integer',
+            ],
+            [
+                'page.required' => 'page不能为空',
+                'page.integer' => 'page必须是整数',
+                'page_size.required' => 'page_size不能为空',
+                'page_size.integer' => 'page_size必须是整数',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['user_id'] = Context::get('UserId');
+        $requireData['type_id'] = Context::get('TypeId');
+        $result = $this->newsServiceClient->complaintList($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
 }

+ 37 - 1
app/Controller/OrderController.php

@@ -191,7 +191,7 @@ class OrderController extends AbstractController
             return Result::error($errorMessage);
         }
         $requireData['user_id'] = Context::get("UserId");
-        $requireData['website_id'] = Context::get("SiteId")??'2';
+        $requireData['website_id'] = Context::get("SiteId") ?? '2';
         $result = $this->orderServiceClient->addAD($requireData);
         // return $requireData;
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
@@ -548,4 +548,40 @@ class OrderController extends AbstractController
         $result = $this->orderServiceClient->getAdSize();
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
+    /**
+     * 检测站点是否有订单
+     */
+    public function checkWebsiteOrder()
+    {
+        $requireData['website_id'] = Context::get("SiteId");
+        $result = $this->orderServiceClient->checkWebsiteOrder($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+     * 批量删除订单
+     */
+    public function batchDelWebsiteOrder()
+    {
+
+
+        $requireData = $this->request->all();
+        var_dump($requireData);
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'ids' => 'required|array',
+            ],
+            [
+                'ids.required' => '订单id不能为空',
+                'ids.array' => '订单id格式不正确',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] = Context::get("SiteId");
+        $result = $this->orderServiceClient->batchDelWebsiteOrder($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
 }

+ 225 - 0
app/Controller/TestController.php

@@ -0,0 +1,225 @@
+<?php
+declare(strict_types=1);
+namespace App\Controller;
+
+
+
+
+use App\JsonRpc\NewsServiceInterface;
+use App\JsonRpc\WebsiteServiceInterface;
+use App\JsonRpc\AdServiceInterface; 
+use App\JsonRpc\UserServiceInterface;
+use App\JsonRpc\ChatServiceInterface;
+use App\JsonRpc\OrderServiceInterface;
+use App\JsonRpc\CollectorServiceInterface;
+use App\JsonRpc\ClientServiceInterface;
+use App\Controller\IndexController;
+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 \Phper666\JWTAuth\JWT;
+/**
+ * Class WebController
+ * @package App\Controller
+ */
+class TestController extends AbstractController
+{
+
+    #[Inject]
+    protected ValidatorFactoryInterface $validationFactory;
+
+    #[Inject]
+    protected IndexController $IndexController;
+    // #[Inject]
+    // protected JWT $jwt;
+    /**
+     * @var NewsServiceInterface
+     */
+    #[Inject]
+    private $newsServiceClient;
+
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+
+    /**
+     * @var AdServiceInterface
+     */
+    #[Inject]
+    private $adServiceClient;
+
+    /**
+     * @var UserServiceInterface
+     */
+    #[Inject]
+    private $userServiceClient;
+
+    /**
+     * @var ChatServiceInterface
+     */
+    #[Inject]
+    private $chatServiceClient;
+
+    /**
+     * @var OrderServiceInterface
+     */
+    #[Inject]
+    private $orderServiceClient;
+
+    /**
+     * @var CollectorServiceInterface
+     */
+    #[Inject]
+    private $collectorServiceClient;
+
+    /**
+     * @var ClientServiceInterface
+     */
+    #[Inject]
+    private $clientServiceClient;
+
+
+
+    /**
+     * 测试admin_consumer
+     * @return array
+     */
+    public function testAdminConsumer()
+    {
+        $user = [
+            'user_id' => 32,
+            'username' => 'admin',
+            'password' => '123456',
+        ];
+        return Result::success($user);
+    }   
+
+    /**
+     * 测试public_producer
+     */
+    public function testPublicProducer()
+    {
+        $requireData = $this->request->all();
+        // return Result::success($requireData);                          
+        $result = $this->websiteServiceClient->selectWebsiteArea($requireData);
+        if ($result['code'] != ErrorCode::SUCCESS) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 测试ad_producer
+     */
+    public function testAdProducer()
+    {
+        // $requireData = $this->request->all();
+        $data = [
+            'page' => 1,
+            'pageSize' => 1,
+        ];
+        $result = $this->adServiceClient->getAdPlaceList($data);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 测试user_producer
+     */
+    public function testUserProducer()
+    {
+        // return Result::success($this->request->all());
+        $data = $this->request->all();
+        $user = $data['user_id'] ?? 32;
+        // return Result::success($user);
+        $result =  $this->userServiceClient->getUserInfo((int)$user);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+     /**
+     * 测试news_producer
+     */
+    public function testNewsProducer()
+    {
+        $requestData = $this->request->all();
+        // $catid = $data['catid'] ?? 11;
+        $data = [
+            'website_id'=> $requestData['website_id'] ?? 2,
+            'catid' => $requestData['catid'] ?? 11,
+            'level' => $requestData['level'] ?? 1,
+            'pagesize' => 1
+        ];    
+        $result = $this->newsServiceClient->getWebsiteModelArticles($data);
+        // var_dump($result);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        // 增加对返回数据是否为空的检查,避免尝试访问空数组元素导致的错误
+        if (empty($result['data'])) {
+            return Result::error('未获取到模块新闻数据', 0, []);
+        }
+        return Result::success($result['data']);
+    }
+     
+    /**
+     * 测试order_producer
+     */
+    public function testOrderProducer()
+    {
+        $data = [
+            'website_id' => 2,
+        ];
+        $result =  $this->orderServiceClient->getAD($data);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+
+    /**
+     * 测试chat_producer
+     */
+    public function testChatProducer()
+    {
+        $data['page'] = 1;
+        $data['page_size'] = 1;
+        $result =  $this->chatServiceClient->getTopicsList($data);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 测试collector_producer
+     */
+    public function testCollectorProducer()
+    {
+        $data['web_id'] = 49;
+        $data['pageSize'] = 1;
+        $data['page'] = 1;
+        $result =  $this->collectorServiceClient->getRule($data);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+    /**
+     * 测试client_producer
+     */
+    public function testClientProducer()
+    {
+        $result =  $this->clientServiceClient->test(['name' => 'test']);
+        if ($result['code'] != 200) {
+            return Result::error($result['message'],0,[]);
+        }
+        return Result::success($result['data']);
+    }
+}

+ 248 - 19
app/Controller/WebController.php

@@ -85,7 +85,7 @@ class WebController extends AbstractController
     {
         $requireData = $this->request->all();
         $data = ['website_id'=>Context::get("SiteId")]; 
-        if($requireData['ad_tag']){
+        if(isset($requireData['ad_tag'])){
             $validator = $this->validationFactory->make(
                 $requireData,
                 [
@@ -259,7 +259,8 @@ class WebController extends AbstractController
             'pid' => $requireData['pid'],
             'placeid' => $requireData['placeid'],
             'num' => $requireData['num'],
-            'type' => $requireData['type'] ?? null
+            'type' => $requireData['type'] ?? null,
+            'is_show' => $requireData['is_show'] ?? null,
         ];    
         $result=$this->websiteServiceClient->getWebsiteModelCategory($data);
         
@@ -1216,23 +1217,23 @@ class WebController extends AbstractController
     public function checkWebsiteRoute()
     {
         $requireData = $this->request->all();
-        $validator = $this->validationFactory->make(
-            $requireData,
-            [
-                'last_route' =>'required|string',
-                'all_route' =>'required|string',
-            ],
-            [
-                'last_route.required' => 'last_route不能为空',
-                'last_route.string' => 'last_route必须为字符串',
-                'all_route.required' => 'all_route不能为空',
-                'all_route.string' => 'all_route必须为字符串',
-            ]
-        );
-        if ($validator->fails()){
-            $errorMessage = $validator->errors()->first();
-            return Result::error($errorMessage);
-        }
+//        $validator = $this->validationFactory->make(
+//            $requireData,
+//            [
+//                'last_route' =>'required|string',
+//                'all_route' =>'required|string',
+//            ],
+//            [
+//                'last_route.required' => 'last_route不能为空',
+//                'last_route.string' => 'last_route必须为字符串',
+//                'all_route.required' => 'all_route不能为空',
+//                'all_route.string' => 'all_route必须为字符串',
+//            ]
+//        );
+//        if ($validator->fails()){
+//            $errorMessage = $validator->errors()->first();
+//            return Result::error($errorMessage);
+//        }
         $requireData['website_id'] =  Context::get("SiteId")?? 0;
         // return Result::success($requireData);
         $result = $this->newsServiceClient->checkWebsiteRoute($requireData);
@@ -1337,6 +1338,233 @@ class WebController extends AbstractController
         $result = $this->newsServiceClient->getWebsiteLevelJob($requireData);
         return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
     }
+
+    /**
+     * 农网导航首页数据
+     * @return array
+     */
+    public function getWebsiteNwHomeList()
+    {
+        $requireData = $this->request->all();
+        var_dump("====:",$requireData);
+        $requireData['website_id'] =  Context::get("SiteId");
+        $result = $this->newsServiceClient->getWebsiteNwHomeList($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /**
+     * c端-企业 模块企业
+     * @return array
+     */
+    public function getWebsiteCompany(){
+        $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")?? 0;
+        $result = $this->newsServiceClient->getWebsiteCompany($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /*
+    *c端-企业 企业列表
+    * @return array
+    */
+    public function getWebsiteCompanyList(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'keyword' =>'nullable|string',
+                'category_id' =>'nullable|integer',
+                'page' => 'required|integer',
+                'pageSize' =>'required|integer',
+                // 自定义验证规则,确保 level 和 category_id 只有一个能为空
+                // 'keyword_or_category_id' => 'required_without_all:keyword,category_id|in:1',
+            ],
+            [
+                'category_id.interger' => '栏目id必须为整数',   
+                'keyword.string' => '搜索关键字必须为字符串',
+                'page.required' => '当前页不能为空',
+                'page.integer' => '当前页必须为整数',
+                'pageSize.required' => '每页数量不能为空',
+                'pageSize.integer' => '每页数量必须为整数',
+                // 'keyword_or_category_id.required_without_all' => '搜索关键字和栏目 ID 不能同时为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] =  Context::get("SiteId")?? 0;
+        $result = $this->newsServiceClient->getWebsiteCompanyList($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+    *c端-企业 企业详情
+    * @return array
+    */
+    public function getWebsiteCompanyInfo(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'id' =>'required|integer',
+            ],
+            [
+                'id.required' => 'company_id不能为空',
+                'id.integer' => 'company_id必须为整数',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] =  Context::get("SiteId")?? 0;
+        $result = $this->newsServiceClient->getWebsiteCompanyInfo($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /*
+    *c端-项目 项目模块
+    * @return array
+    */
+    public function getWebsiteProject(){
+        $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")?? 0;
+        $result = $this->newsServiceClient->getWebsiteProject($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+    *c端-项目 项目列表
+    * @return array
+    */
+    public function getWebsiteProjectList(){
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'category_id' =>'nullable|integer',
+                'page' => 'required|integer',
+                'pageSize' =>'required|integer',
+                // 'keyword_or_category_id' => 'required_without_all:keyword,category_id|in:1',
+            ],
+            [
+                'category_id.interger' => '栏目id必须为整数',   
+                'keyword.string' => '搜索关键字必须为字符串',
+                'page.required' => '当前页不能为空',
+                'page.integer' => '当前页必须为整数',
+                'pageSize.required' => '每页数量不能为空',
+                'pageSize.integer' => '每页数量必须为整数',
+                // 'keyword_or_category_id.required_without_all' => '搜索关键字和栏目 ID 不能同时为空',
+            ]
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $requireData['website_id'] =  Context::get("SiteId")?? 0;
+        $result = $this->newsServiceClient->getWebsiteProjectList($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+    /**
+    *c端-项目 项目详情
+    * @return array
+    */
+    public function getWebsiteProjectInfo(){
+        $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['website_id'] =  Context::get("SiteId")?? 0;
+        $result = $this->newsServiceClient->getWebsiteProjectInfo($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
+     /*
+     * 获取底部所有信息
+     * 
+     * */
+    public function getWebsiteAllinfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'link_textnum' => 'required|integer',
+                'link_imgnum' => 'required|integer',
+                'link_footnum' => 'required|integer',
+            ],
+            [
+                'link_textnum.required' => '文字类型友情链接数量不能为空',
+                'link_textnum.integer' => '文字类型友情链接数量必须为整数',
+                'link_imgnum.required' => '图片类型友情链接数量不能为空',
+                'link_imgnum.integer' => '图片类型友情链接数量必须为整数',
+                'link_footnum.required' => '底部友情链接数量不能为空',
+                'link_footnum.integer' => '底部友情链接数量必须为整数',
+            ] 
+        );
+        if ($validator->fails()){
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage); 
+        }
+        $requireData['website_id'] =  Context::get("SiteId");
+        $result = $this->websiteServiceClient->getWebsiteAllinfo($requireData);
+        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+    }
+    /*
+    *c端-企业 企业模块
+    * @return array
+    */
+    public function getWebsiteCategoryJob(){
+        $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")?? 0;
+        $result = $this->newsServiceClient->getWebsiteCategoryJob($requireData);
+        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+    }
     /**
      * 自助建站-流程管理-获取导航栏
      */
@@ -1373,4 +1601,5 @@ class WebController extends AbstractController
         $result = $this->websiteServiceClient->getWebsiteModelCategory($requireData);
         return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
     }
+
 }

+ 246 - 40
app/Controller/WebSocketController.php

@@ -1,5 +1,6 @@
 <?php
-declare (strict_types = 1);
+
+declare(strict_types=1);
 
 namespace App\Controller;
 
@@ -14,82 +15,119 @@ use Hyperf\Contract\OnCloseInterface;
 use Hyperf\Contract\OnMessageInterface;
 use Hyperf\Contract\OnOpenInterface;
 use Hyperf\Di\Annotation\Inject;
+
 use Hyperf\Engine\WebSocket\Response;
+use Hyperf\Redis\Redis;
 use Phper666\JWTAuth\JWT;
 use swoole\Server;
+use Hyperf\Coroutine\Coroutine;
 
 class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface
 {
-
     #[Inject]
     protected JWT $jwt;
-    /**
-     * @var ChatServiceInterface
-     */
+    
     #[Inject]
-    private $chatServiceClient;
-    /**
-     * @var UserServiceInterface
-     */
+    private ChatServiceInterface $chatServiceClient;
+    
     #[Inject]
-    private $userServiceClient;
+    private UserServiceInterface $userServiceClient;
 
-    /**
-     * @Inject
-     * @var ReceiveHandleService
-     */
-    protected $receiveHandle;
+    #[Inject]
+    protected ReceiveHandleService $receiveHandle;
+    
+    #[Inject]
+    protected Redis $redis;
+    
     protected $server;
-
     
+    // 持久连接配置
+    private const HEARTBEAT_INTERVAL = 30; // 心跳间隔(秒)
+    private const CONNECTION_TIMEOUT = 90;  // 连接超时(秒)
+    private const MAX_RECONNECT_ATTEMPTS = 5; // 最大重连次数
+    
+    // 存储连接信息
+    private static $connections = [];
+    private static $heartbeatTasks = [];
+
     public function onMessage($server, $frame): void
     {
-        //把数据推给前端
         $redisClient = new RedisService();
         $userId = $redisClient->findUser((string) $frame->fd);
+        
+        // 处理心跳消息
+        if ($frame->data === 'ping') {
+            $server->push($frame->fd, 'pong');
+            $this->updateLastActivity($frame->fd);
+            return;
+        }
+        
+        if ($frame->data === 'pong') {
+            $this->updateLastActivity($frame->fd);
+            $this->redis->hSet('websocket:heartbeat', (string)$frame->fd, time());
+            return;
+        }
+        
+        // 处理重连请求
+        if (strpos($frame->data, 'reconnect') === 0) {
+            $this->handleReconnect($server, $frame);
+            return;
+        }
+        
         //存入队列
         $result = json_decode($frame->data, true);
         $result['user_id'] = $userId;
+        
+        // 更新最后活动时间
+        $this->updateLastActivity($frame->fd);
 
         // $show_id = $result['show_id'];
 
-        var_dump($result, '-------------1----');
+        // var_dump($result, '-------------1----');
         $userInfo = $redisClient->getUserInfo((string) $userId);
+        // var_dump($userInfo, '-------------22----');
         if ($userInfo) {
             $userInfoArr = json_decode($userInfo);
             $result['user_avatar'] = $userInfoArr['avatar'];
+            $result['user_name'] = $userInfoArr['user_name'];
         } else {
             $userInfos = $this->userServiceClient->getUserInfo((int) $userId);
+            // var_dump($userInfos, '-------------33----');
             $redisClient->setUserInfo($userId, $userInfos['data']);
             $result['user_avatar'] = $userInfos['data']['avatar'];
+            $result['user_name'] = $userInfos['data']['user_name'];
         }
         $myFriends = $redisClient->getUserFriends((string) $userId);
         $myFriendsArr = [];
         if ($myFriends) {
             $myFriendsArr = json_decode($myFriends);
-
         } else {
             $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
             $redisClient->setUserFriends($userId, $myFriends['data']);
             $myFriendsArr = $myFriends['data'];
         }
-        
+
         //推送给前台
+        if (isset($result['type']) && in_array($result['type'], ['offer', 'answer', 'ice-candidate', 'call-ended'])) {
+            // 是视频通话信令,走特殊处理逻辑
+            $this->handleVideoSignaling($server, $frame, $userId, $result);
+            return;
+        }
         //组装数据+头像
-        if ($result['talk_type'] == 1) {
+        if (isset($result['talk_type']) && $result['talk_type'] == 1) {
             //判断$result['receiver_id']是否是好友
-        $myFriendsID = array_column($myFriendsArr, 'friend_id');
-        if (!in_array($result['receiver_id'], $myFriendsID)) {
-            $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
-            $redisClient->setUserFriends($userId, $myFriends['data']);
-            $myFriendsArrdata = $myFriends['data'];
-            $myFriendsArrID = array_column($myFriendsArrdata, 'friend_id');
+            $myFriendsID = array_column($myFriendsArr, 'friend_id');
+            if (!in_array($result['receiver_id'], $myFriendsID)) {
+                $myFriends = $this->chatServiceClient->getFriendsList(['user_id' => $userId, 'status' => 2]);
+                $redisClient->setUserFriends($userId, $myFriends['data']);
+                $myFriendsArrdata = $myFriends['data'];
+                $myFriendsArrID = array_column($myFriendsArrdata, 'friend_id');
                 if (!in_array($result['receiver_id'], $myFriendsArrID)) {
                     $result['content'] = '您还不是好友,无法发送消息!';
                     $server->push((int) $frame->fd, json_encode($result));
                     return;
                 }
-        }
+            }
             //给自己推一条数据
             if ($server->isEstablished($frame->fd)) {
                 $result['is_read'] = 1;
@@ -101,7 +139,7 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
                     $message = new MqProducer($saiddata);
                     $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                     $re = $producer->produce($message);
-                    var_dump('消息发送成功' . $frame->fd);
+                    var_dump('消息发送成功' . $frame->fd,$result);
                 } catch (\Exception $e) {
                     var_dump('消息发送失败: ' . $e->getMessage());
                     $this->retry($message);
@@ -128,18 +166,19 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
 
                 $data['is_read'] = 0;
                 $server->push((int) $fd, json_encode(value: $data));
-                var_dump('消息给好友发送成功' . $fd);
+                var_dump('消息给好友发送成功' . $fd,$data);
                 // 尝试连接
                 try {
                     $chatdata = $result;
                     $chatdata['action'] = 'recieved';
                     $chatdata['receiver_id'] = $result['user_id'];
                     $chatdata['user_id'] = $result['receiver_id'];
+                    // $chatdata['user_name'] = $result['user_name'];
                     $chatdata['is_read'] = 0;
                     $message = new MqProducer($chatdata);
                     $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                     $re = $producer->produce($message);
-                    var_dump('消息发送成功');
+                    var_dump('消息发送成功#');
                 } catch (\Exception $e) {
                     var_dump('消息发送失败: ' . $e->getMessage());
                     $this->retry($message);
@@ -150,27 +189,30 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
                     $chatdata['action'] = 'recieved';
                     $chatdata['receiver_id'] = $result['user_id'];
                     $chatdata['user_id'] = $result['receiver_id'];
+                    // $chatdata['user_name'] = $result['user_name'];
                     $chatdata['is_read'] = 0;
                     $message = new MqProducer($chatdata);
                     $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                     $re = $producer->produce($message);
-                    var_dump('消息发送成功');
+                    var_dump('消息发送成功!');
                 } catch (\Exception $e) {
                     var_dump('消息发送失败: ' . $e->getMessage());
                     $this->retry($message);
                 }
             }
-        } else if ($result['talk_type'] == 2) {
+        } else if (isset($result['talk_type']) && $result['talk_type'] == 2) {
             //根据群找到 群用户,群发一遍消息
             $groupUserList = $this->chatServiceClient->getGroupMembers(['group_id' => $result['receiver_id']]);
-            var_dump($groupUserList['data'],'----------------------------------');
+            // var_dump($groupUserList['data'], '-----------------############-----------------');
             if ($groupUserList['data']) {
                 $chatdata = $result;
                 foreach ($groupUserList['data'] as $val) {
                     $fd = $redisClient->findFd((int) $val['user_id']);
                     if ($server->isEstablished((int) $fd)) {
                         var_dump($fd, $val['user_id']);
+                        $result['user_name'] = $val['group_name']??'';
                         $server->push((int) $fd, json_encode($result));
+                        var_dump($val, '-------------44----');
                         try {
                             //分发说,只记录自己对自己
                             if ($result['user_id'] == $val['user_id']) {
@@ -193,7 +235,7 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
                                 $message = new MqProducer($chatdata);
                                 $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                                 $re = $producer->produce($message);
-                                var_dump('消息发送成功');
+                                var_dump('消息发送成功@');
                             }
                         } catch (\Exception $e) {
                             var_dump('消息发送失败: ' . $e->getMessage());
@@ -207,6 +249,7 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
                                 $chatdata['group_receiver_id'] = $val['user_id'];
                                 $chatdata['is_read'] = 0;
                                 $chatdata['action'] = 'said';
+                                $chatdata['group_name'] = $val['group_name']??'';
                                 $message = new MqProducer($chatdata);
                                 $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                                 $re = $producer->produce($message);
@@ -218,10 +261,11 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
                                 $chatdata['group_receiver_id'] = $result['user_id'];
                                 $chatdata['is_read'] = 0;
                                 $chatdata['action'] = 'recieved';
+                                $chatdata['group_name'] = $val['group_name']??'';
                                 $message = new MqProducer($chatdata);
                                 $producer = ContextApplicationContext::getContainer()->get(Producer::class);
                                 $re = $producer->produce($message);
-                                var_dump('消息发送成功');
+                                var_dump('消息发送成功$');
                             }
                         } catch (\Exception $e) {
                             var_dump('消息发送失败: ' . $e->getMessage());
@@ -231,6 +275,30 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
             }
         }
     }
+    protected function handleVideoSignaling($server, $frame, $userId, $message)
+    {
+        $redisClient = new RedisService();
+        $receiverId = $message['receiver_id'] ?? null;
+        if (!$receiverId) {
+            $server->push($frame->fd, json_encode(['error' => 'Missing receiver_id']));
+            return;
+        }
+        // 获取接收方 fd
+        $fd = $redisClient->findFd((int)$receiverId);
+
+        // 判断接收者是否在线
+        if ($server->isEstablished((int)$fd)) {
+            // 转发消息给接收方
+            $server->push((int)$fd, json_encode($message));
+        } else {
+            // 可选:缓存或通知对方不在线
+            $server->push($frame->fd, json_encode([
+                'type' => 'offline',
+                'receiver_id' => $receiverId,
+                'content' => '对方不在线'
+            ]));
+        }
+    }
     public function retry($message): void
     {
         $maxRetries = 10; // 最大重试次数
@@ -253,10 +321,23 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
     }
     public function onClose($server, int $fd, int $reactorId): void
     {
-        var_dump('closed::::::::::::::::::', $fd, "======", $reactorId, "+++++++++++");
+        // var_dump('closed::::::::::::::::::', $fd, "======", $reactorId, "+++++++++++");
         $redisClient = new RedisService();
         $userId = $redisClient->findUser((string) $fd);
+        
+        // 清理连接信息
+        $this->redis->hDel('websocket:connections', (string)$fd);
+        $this->redis->hDel('websocket:activity', (string)$fd);
+        $this->redis->hDel('websocket:heartbeat', (string)$fd);
+        
         $redisClient->unbind((string) $fd, (int) $userId);
+        
+        // 记录断开连接
+        $this->redis->lPush('websocket:disconnections', json_encode([
+            'fd' => $fd,
+            'user_id' => $userId,
+            'time' => time()
+        ]));
     }
     public function onOpen($server, $request): void
     {
@@ -264,19 +345,144 @@ class WebSocketController implements OnMessageInterface, OnOpenInterface, OnClos
         $userInfo = $this->jwt->getClaimsByToken($token);
         $response = (new Response($server))->init($request);
         $fd = $response->getFd();
+        
+        // 绑定连接
         $server->bind($fd, $userInfo['uid']);
         $redisClient = new RedisService();
         $redisClient->bind((string) $fd, $userInfo['uid']);
+        
+        // 更新连接信息
+        $this->updateConnection($fd, $userInfo['uid']);
+        
+        // 启动心跳检测
+        $this->startHeartbeat($server, $fd);
+        
+        // 发送连接成功消息
         $server->push($request->fd, json_encode([
             "event" => "connect",
             "content" => [
-                "ping_interval" => 20,
-                "ping_timeout" => 20 * 3,
+                "ping_interval" => self::HEARTBEAT_INTERVAL,
+                "ping_timeout" => self::CONNECTION_TIMEOUT,
                 "content" => "连接成功",
                 "fd" => $fd,
                 "user_id" => $userInfo['uid'],
+                "reconnect_attempts" => self::MAX_RECONNECT_ATTEMPTS
             ],
         ]));
+        
+        // 记录连接成功
+        $this->redis->lPush('websocket:connections', json_encode([
+            'fd' => $fd,
+            'user_id' => $userInfo['uid'],
+            'time' => time()
+        ]));
+    }
+    
+    /**
+     * 处理重连请求
+     */
+    private function handleReconnect($server, $frame): void
+    {
+        $data = json_decode($frame->data, true);
+        $userId = $data['user_id'] ?? null;
+        $attempt = $data['attempt'] ?? 1;
+        
+        if ($attempt > self::MAX_RECONNECT_ATTEMPTS) {
+            $server->push($frame->fd, json_encode([
+                'type' => 'reconnect_failed',
+                'message' => '重连次数超限'
+            ]));
+            return;
+        }
+        
+        // 更新连接信息
+        $this->updateConnection($frame->fd, $userId);
+        
+        $server->push($frame->fd, json_encode([
+            'type' => 'reconnect_success',
+            'attempt' => $attempt,
+            'message' => '重连成功'
+        ]));
+    }
+    
+    /**
+     * 更新最后活动时间
+     */
+    private function updateLastActivity($fd): void
+    {
+        $this->redis->hSet('websocket:activity', (string)$fd, time());
+    }
+    
+    /**
+     * 更新连接信息
+     */
+    private function updateConnection($fd, $userId): void
+    {
+        $connectionInfo = [
+            'fd' => $fd,
+            'user_id' => $userId,
+            'connected_at' => time(),
+            'last_activity' => time(),
+            'status' => 'connected'
+        ];
+        
+        $this->redis->hSet('websocket:connections', (string)$fd, json_encode($connectionInfo));
+    }
+    
+    /**
+     * 启动心跳检测
+     */
+    private function startHeartbeat($server, $fd): void
+    {
+        Coroutine::create(function() use ($server, $fd) {
+            while (true) {
+                // 检查连接是否还存在
+                if (!$server->isEstablished($fd)) {
+                    break;
+                }
+                
+                // 发送ping
+                $server->push($fd, 'ping');
+                
+                // 等待pong响应
+                $this->waitForPong($server, $fd);
+                
+                // 等待下次心跳
+                Coroutine::sleep(self::HEARTBEAT_INTERVAL);
+            }
+        });
+    }
+    
+    /**
+     * 等待pong响应
+     */
+    private function waitForPong($server, $fd): void
+    {
+        $startTime = time();
+        
+        while (time() - $startTime < self::CONNECTION_TIMEOUT) {
+            if (!$server->isEstablished($fd)) {
+                return;
+            }
+            
+            // 检查是否收到pong
+            $pongTime = $this->redis->hGet('websocket:heartbeat', (string)$fd);
+            if ($pongTime && (time() - $pongTime) < self::HEARTBEAT_INTERVAL) {
+                return; // 收到pong响应
+            }
+            
+            Coroutine::sleep(1);
+        }
+        
+        // 超时,断开连接
+        if ($server->isEstablished($fd)) {
+            $server->close($fd);
+        }
+    }
+    // 握手回调(使用 Hyperf 内置的,不要自定义阻断逻辑)
+    public function onHandShake($server, $request, $response)
+    {
+        // 直接使用 Hyperf 内置的握手处理(标准流程)
+        return \Hyperf\WebSocketServer\Server::onHandShake($server, $request, $response);
     }
-
 }

+ 337 - 145
app/Controller/WebsiteController.php

@@ -16,6 +16,9 @@ use Phper666\JWTAuth\JWT;
 use DateTime;
 use App\JsonRpc\UserServiceInterface;
 use PhpParser\Node\Stmt\Return_;
+use Hyperf\Redis\Redis;
+use function Hyperf\Support\env;
+use Swoole\Coroutine;
 
 /**
  * Class WebsiteController
@@ -40,6 +43,10 @@ class WebsiteController extends AbstractController
     #[Inject]
     private $userServiceClient;
 
+    #[Inject]
+    protected Redis $redis;
+
+
 
     protected JWT $JWT;
     public function __construct(Jwt $JWT)
@@ -108,6 +115,7 @@ class WebsiteController extends AbstractController
             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']) : [];
+                $result['data']['rows'][$k]['website_column_arr_id'] = $v['website_column_arr_id'] ? json_decode($v['website_column_arr_id']) : [];
             }
         }
 
@@ -749,13 +757,29 @@ class WebsiteController extends AbstractController
         //        var_dump("有效时间:",$time);
 
         $typeId = intval(Context::get("TypeId"));
-        var_dump("用户类型:", $typeId);
+        $websiteId = intval(Context::get("WebsiteId"));
+        $cacheKey = "admin_index_processed_data_{$typeId}";
+        $cacheKeyLong = "admin_index_processed_data_{$typeId}_long";
+        $originUrl = (string)Context::get("originUrl");
+        // 如果originUrl含有localhost,就根据env是dev 换成 http://nwpre.bjzxtw.org.cn,根据env是prod 换成 http://nwpre.bjzxtw.org.cn
+        if (strpos($originUrl, "localhost") !== false) {
+            if (env("APP_ENV") == "dev") {
+                $originUrl = 'http://nwpre.bjzxtw.org.cn'; //str_replace("localhost", 'http://nwpre.bjzxtw.org.cn', $originUrl);
+            } else {
+                $originUrl = 'https://nw.bjzxtw.org.cn'; //str_replace("localhost", 'https://nw.bjzxtw.org.cn', $originUrl);
+            }
+        }
+        // var_dump("用户类型:", $typeId);
+        // var_dump("网站id:", $websiteId);
+        // var_dump("来源地址:", $originUrl);
         switch ($typeId) {
             case 1:
             case 2:
             case 3:
                 $user_id = Context::get("UserId");
                 $result = $this->websiteServiceClient->getAdminIndex(['type_id' => $typeId, 'user_id' => $user_id]);
+                $result['data']['originUrl'] = $originUrl;
+                $result['data']['websiteId'] =  $websiteId;
                 return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
             case 4:
                 $dates = [];
@@ -783,13 +807,44 @@ class WebsiteController extends AbstractController
                 $res = array_merge($runturn, $res);
                 return $result['code'] == 200 ? Result::success($res) : Result::error($result['message']);
             case 10000:
-                $result = $this->websiteServiceClient->getAdminIndex(['type_id' => $typeId]);
-                if (!$result || $result['code'] != 200) {
-                    return Result::error($result['message'] ?? '获取数据失败');
-                }
+                // 检查 Redis 中是否存在缓存
+                $cachedData = $this->redis->get($cacheKey);
+                $cachedDataLong = $this->redis->get($cacheKeyLong);
+                var_dump("缓存数据:", $cachedData);
+                if ($cachedDataLong) {
+                    // 情况1:有长缓存,直接返回长缓存数据
+                    $result = json_decode($cachedDataLong, true);
+
+                    // 异步刷新短缓存和长缓存(可以放后台执行)
+                    Coroutine::create(function () use ($cacheKey, $cacheKeyLong, $typeId) {
+                        $freshResult = $this->websiteServiceClient->getAdminIndex(['type_id' => $typeId]);
+                        if ($freshResult && $freshResult['code'] == 200) {
+                            $data = json_encode($freshResult);
+                            $this->redis->setex($cacheKey, 60 * 5, $data);
+                            $this->redis->setex($cacheKeyLong, 60 * 60 * 24, $data);
+                        }
+                    });
+                } elseif ($cachedData) {
+                    // 情况2:没有长缓存,但有短缓存
+                    $result = json_decode($cachedData, true);
+
+                    // 用短缓存刷新长缓存
+                    $this->redis->setex($cacheKeyLong, 60 * 60 * 24, $cachedData); // 设置长缓存
 
-                $data = $result['data'];
+                } else {
+                    // 情况3:都没有,查数据库
+                    $result = $this->websiteServiceClient->getAdminIndex(['type_id' => $typeId]);
 
+                    if (!$result || $result['code'] != 200) {
+                        return Result::error($result['message'] ?? '获取数据失败');
+                    }
+
+                    // 同时写入短缓存和长缓存
+                    $jsonData = json_encode($result);
+                    $this->redis->setex($cacheKey, 60 * 5, $jsonData);         // 短缓存 5分钟
+                    $this->redis->setex($cacheKeyLong, 60 * 60 * 24, $jsonData); // 长缓存 24小时
+                }
+                $data = $result['data'];
                 $userTypeMapping = [
                     1 => '个人会员',
                     2 => '政务会员',
@@ -806,8 +861,11 @@ class WebsiteController extends AbstractController
                     'monthBook' => $this->processMonthlyData($data['monthBook']),
                     'monthJobHunting' => $this->processMonthlyData($data['monthJobHunting']),
                     'monthJobRecruiting' => $this->processMonthlyData($data['monthJobRecruiting']),
+                    'monthCompany' => $this->processMonthlyData($data['monthCompany']),
+                    'monthProject' => $this->processMonthlyData($data['monthProject']),
                 ];
 
+
                 // 用户类型映射
                 if (!empty($data['userType'])) {
                     foreach ($data['userType'] as &$item) {
@@ -1295,7 +1353,7 @@ class WebsiteController extends AbstractController
         }
     }
 
-    
+
 
     /**
      * 获取分类下的模板
@@ -1458,10 +1516,10 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' => 'required'
+                'website_name' => 'required'
             ],
             [
-                'id.required' => '网站id不能为空'
+                'website_name.required' => '网站名称不能为空'
             ]
         );
         if ($validator->fails()) {
@@ -1629,7 +1687,7 @@ class WebsiteController extends AbstractController
         $user_id = Context::get("UserId");
         var_dump("用户id:", $user_id);
         $userInfo = $this->userServiceClient->getUserInfo((int)$user_id);
-        var_dump("用户信息:", $userInfo);
+        // var_dump("用户信息:", $userInfo);
         $sszq = $userInfo['data']['sszq'];
         $type_id = $userInfo['data']['type_id'];
         //  if($type_id != 10000){
@@ -1676,7 +1734,7 @@ class WebsiteController extends AbstractController
         $user_id = Context::get("UserId");
         var_dump("用户id:", $user_id);
         $userInfo = $this->userServiceClient->getUserInfo((int)$user_id);
-        var_dump("用户信息:", $userInfo);
+        // var_dump("用户信息:", $userInfo);
         $sszq = $userInfo['data']['sszq'];
         $type_id = $userInfo['data']['type_id'];
         $sszqarr = '';
@@ -1729,6 +1787,7 @@ class WebsiteController extends AbstractController
         }
         $data = [
             'category_id' => $requireData['category_id'],
+            'article_id' => $requireData['article_id'] ?? 0,
         ];
         $result = $this->websiteServiceClient->getWebsiteNavPoolSite($data);
         return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
@@ -2189,12 +2248,42 @@ class WebsiteController extends AbstractController
     {
         $id = Context::get("SiteId");
         $result = $this->websiteServiceClient->getWebsiteInfo(intval($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']):'';
+        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{
+        } else {
+            return Result::error($result['message']);
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getAdminSiteInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required|numeric'
+            ],
+            [
+                'website_id.required' => '网站id不能为空'
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWebsiteInfo(intval($requireData['website_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']);
         }
     }
@@ -2204,9 +2293,10 @@ class WebsiteController extends AbstractController
      */
     public function getSiteCategory()
     {
-        $requireData['website_id'] = Context::get("SiteId");
+        $requireData = $this->request->all();
+        $requireData['website_id'] = $requireData['website_id'] ?? Context::get("SiteId");
         $result = $this->websiteServiceClient->getWebsiteAllCategory($requireData);
-        return $result['code']==200?Result::success(PublicData::buildCategoryTree($result['data'])):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success(PublicData::buildCategoryTree($result['data'])) : Result::error($result['message']);
     }
 
     /**
@@ -2215,9 +2305,9 @@ class WebsiteController extends AbstractController
     public function getFooterCategoryList()
     {
         $requireData['website_id'] = Context::get("SiteId");
-        var_dump("ceshi:",$requireData);
+        var_dump("ceshi:", $requireData);
         $result = $this->websiteServiceClient->getFooterCategoryList($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
 
     // --自助建站-----------20250522fr----------------------start
@@ -2225,13 +2315,14 @@ class WebsiteController extends AbstractController
      * 获取所有的静态资源
      * @return array
      */
-    public function getStaticResourceList(){
+    public function getStaticResourceList()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'page' =>'required|integer',
-                'pageSize' =>'required|integer'
+                'page' => 'required|integer',
+                'pageSize' => 'required|integer'
             ],
             [
                 'page.required' => '页码不能为空',
@@ -2247,29 +2338,30 @@ class WebsiteController extends AbstractController
         }
         // return $requireData;
         $result = $this->websiteServiceClient->getStaticResourceList($requireData);
-        Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 底部导航详细内容
      * @return array
      */
-    public function getFooterContentInfo(){
-        $requireData = $this->request->all();
-                $validator = $this->validationFactory->make(
-                    $requireData,
-                    [
-                        'content_id' => 'required',
-                    ],
-                    [
-                        'content_id.required' => '内容id不能为空',
-                    ]
-                );
-                if ($validator->fails()){
-                    $errorMessage = $validator->errors()->first();
-                    return Result::error($errorMessage);
-                }
+    public function getFooterContentInfo()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'content_id' => 'required',
+            ],
+            [
+                'content_id.required' => '内容id不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
         $result = $this->websiteServiceClient->getFooterContentInfo($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 底部导航详情页/列表页
@@ -2289,12 +2381,12 @@ class WebsiteController extends AbstractController
                 'type.required' => '类型不能为空',
             ]
         );
-        if ($validator->fails()){
+        if ($validator->fails()) {
             $errorMessage = $validator->errors()->first();
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->getFooterContentList($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 添加静态资源
@@ -2306,8 +2398,8 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'img_url' =>'required',
-                'img_size' =>'required',
+                'img_url' => 'required',
+                'img_size' => 'required',
             ],
             [
                 'img_url.required' => '图片地址不能为空',
@@ -2319,7 +2411,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->addStaticResource($requireData);
-        Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 删除静态资源
@@ -2331,7 +2423,7 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' =>'required|integer',
+                'id' => 'required|integer',
             ],
             [
                 'id.required' => 'id不能为空',
@@ -2343,7 +2435,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->delStaticResource($requireData);
-        Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 获取尺寸列表
@@ -2355,13 +2447,13 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'page' =>'required|integer',
-                'pageSize' =>'required|integer'
+                'page' => 'required|integer',
+                'pageSize' => 'required|integer'
             ],
             [
                 'page.required' => '页码不能为空',
                 'page.integer' => '页码必须是整数',
-                'pageSize.required' => '每页显示数量不能为空',  
+                'pageSize.required' => '每页显示数量不能为空',
                 'pageSize.integer' => '每页显示数量必须是整数'
             ]
         );
@@ -2370,7 +2462,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->getSizeList($requireData);
-        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 添加尺寸
@@ -2382,8 +2474,8 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'width' =>'required|integer',
-                'height' =>'required|integer',
+                'width' => 'required|integer',
+                'height' => 'required|integer',
             ],
             [
                 'width.required' => '尺寸宽度不能为空',
@@ -2397,7 +2489,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->addSize($requireData);
-        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 修改尺寸
@@ -2409,18 +2501,18 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-               'id' =>'required|integer',
-               'width' =>'required|integer',
-               'height' =>'required|integer',
-            
+                'id' => 'required|integer',
+                'width' => 'required|integer',
+                'height' => 'required|integer',
+
             ],
             [
-               'id.required' => 'id不能为空',
-               'id.integer' => 'id必须是整数类型',
-               'width.required' => '尺寸宽度不能为空',
-               'width.integer' => '尺寸宽度必须是整数类型',
-               'height.required' => '尺寸高度不能为空',
-               'height.integer' => '尺寸高度必须是整数类型',
+                'id.required' => 'id不能为空',
+                'id.integer' => 'id必须是整数类型',
+                'width.required' => '尺寸宽度不能为空',
+                'width.integer' => '尺寸宽度必须是整数类型',
+                'height.required' => '尺寸高度不能为空',
+                'height.integer' => '尺寸高度必须是整数类型',
             ]
         );
         if ($validator->fails()) {
@@ -2428,7 +2520,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->upSize($requireData);
-        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 删除尺寸
@@ -2440,11 +2532,11 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-               'id' =>'required|integer',
+                'id' => 'required|integer',
             ],
             [
-               'id.required' => 'id不能为空',
-               'id.integer' => 'id必须是整数类型',
+                'id.required' => 'id不能为空',
+                'id.integer' => 'id必须是整数类型',
             ]
         );
         if ($validator->fails()) {
@@ -2452,7 +2544,7 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->delSize($requireData);
-        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 获取网站模板信息
@@ -2464,11 +2556,11 @@ class WebsiteController extends AbstractController
         $validator = $this->validationFactory->make(
             $requireData,
             [
-               'id' =>'required|integer',
+                'id' => 'required|integer',
             ],
             [
-               'id.required' => 'id不能为空',
-               'id.integer' => 'id必须是整数类型',
+                'id.required' => 'id不能为空',
+                'id.integer' => 'id必须是整数类型',
             ]
         );
         if ($validator->fails()) {
@@ -2476,149 +2568,178 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->getSizeInfo($requireData);
-        return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
-
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     // --自助建站-----------20250522fr----------------------end
     /**
      * 获取网站路由白名单列表
      * @return array    
      */
-    public function getWhiteRouterList(){
+    public function getWhiteRouterList()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'page' =>'required|integer',
-                'pageSize' =>'required|integer'
+                'page' => 'required|integer',
+                'pageSize' => 'required|integer'
             ],
             [
                 'page.required' => '页码不能为空',
                 'page.integer' => '页码必须是整数',
                 'pageSize.required' => '每页显示数量不能为空',
-                'pageSize.integer' => '每页显示数量必须是整数'  
+                'pageSize.integer' => '每页显示数量必须是整数'
             ]
 
-            );
-            if ($validator->fails()) {
-                $errorMessage = $validator->errors()->first();
-                return Result::error($errorMessage);
-            }
-            // return $requireData;
-            $result = $this->websiteServiceClient->getWhiteRouterList($requireData);
-            Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        // return $requireData;
+        $result = $this->websiteServiceClient->getWhiteRouterList($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 添加白名单
      * @return array
      */
-    public function addWhiteRouter(){
-        $requireData = $this->request->all();   
+    public function addWhiteRouter()
+    {
+        $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'website_id' =>'required',
-                'function_name' =>'required',
-                'router_url' =>'required',
+                //                'website_id' => 'required',
+                'function_name' => 'required',
+                'router_url' => 'required',
             ],
             [
-                'website_id.required' => '网站id不能为空',
+                //                'website_id.required' => '网站id不能为空',
                 'function_name.required' => '功能名称不能为空',
                 'router_url.required' => '路由地址不能为空',
             ]
 
-            );
-            if ($validator->fails()) {
-                $errorMessage = $validator->errors()->first();
-                return Result::error($errorMessage);    
-            }
-            $result = $this->websiteServiceClient->addWhiteRouter($requireData);    
-            Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->addWhiteRouter($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 删除白名单
      * @return array
      */
-    public function delWhiteRouter(){
+    public function delWhiteRouter()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' =>'required|integer',
+                'id' => 'required|integer',
             ],
             [
                 'id.required' => 'id不能为空',
                 'id.integer' => 'id必须是整数类型',
-            ]   
-            );
-            if ($validator->fails()) {
-                $errorMessage = $validator->errors()->first();
-                return Result::error($errorMessage);    
-            }
-            $result = $this->websiteServiceClient->delWhiteRouter($requireData);
-            Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->delWhiteRouter($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 获取白名单信息
      * @return array
      */
-    public function getWhiteRouterInfo(){
-        $requireData = $this->request->all();       
+    public function getWhiteRouterInfo()
+    {
+        $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' =>'required|integer'
+                'id' => 'required|integer'
             ],
             [
                 'id.required' => '网站id不能为空',
                 'id.integer' => '网站id必须是整数类型'
             ]
-            );
-            if ($validator->fails()) {
-                $errorMessage = $validator->errors()->first();
-                return Result::error($errorMessage);
-            }
-            $result = $this->websiteServiceClient->getWhiteRouterInfo($requireData);
-            Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->getWhiteRouterInfo($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 修改白名单
      * @return array
      */
-    public function upWhiteRouter(){
-        $requireData = $this->request->all();   
+    public function upWhiteRouter()
+    {
+        $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' =>'required|integer',
-                'website_id' =>'required',
-                'function_name' =>'required',
-                'router_url' =>'required',
+                'id' => 'required|integer',
+                //                'website_id' => 'required',
+                'function_name' => 'required',
+                'router_url' => 'required',
             ],
             [
                 'id.required' => 'id不能为空',
-                'website_id.required' => '网站id不能为空',
+                //                'website_id.required' => '网站id不能为空',
                 'function_name.required' => '功能名称不能为空',
                 'router_url.required' => '路由地址不能为空',
             ]
-            );
-            if ($validator->fails()) {
-                $errorMessage = $validator->errors()->first();
-                return Result::error($errorMessage);    
-            }
-            $result = $this->websiteServiceClient->upWhiteRouter($requireData);
-            Return $result['code'] == 200? Result::success($result['data']) : Result::error($result['message']);
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
+        $result = $this->websiteServiceClient->upWhiteRouter($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 克隆网站
+     * @return array
+     */
+    public function cloneWebsite()
+    {
+        $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->cloneWebsite($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 获取网站名称简称
      * @return array
      */
-    public function getWebsiteAdkey(){
+    public function getWebsiteAdkey()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'website_name' =>'required',
+                'website_name' => 'required',
             ],
             [
                 'website_name.required' => '网站名称不能为空',
@@ -2629,19 +2750,20 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->getWebsiteAdkey($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 静态资源-修改图片别名
      * @return array
      */
-    public function upStaticResource(){
+    public function upStaticResource()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'id' =>'required',
-                'img_alias' =>'required',
+                'id' => 'required',
+                'img_alias' => 'required',
             ],
             [
                 'id.required' => '网站id不能为空',
@@ -2653,19 +2775,46 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->upStaticResource($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+
+    /**
+     * 更新网站状态
+     * @return array
+     */
+    public function updateWebsiteStatus()
+    {
+        $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->websiteServiceClient->updateWebsiteStatus($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
     /**
      * 自助建站-修改网站应用状态
      * @return array
      */
-    public function upWebsiteStatus(){
+    public function upWebsiteStatus()
+    {
         $requireData = $this->request->all();
         $validator = $this->validationFactory->make(
             $requireData,
             [
-                'website_id' =>'required|integer',
-                'status' =>'required|integer',
+                'website_id' => 'required|integer',
+                'status' => 'required|integer',
             ],
             [
                 'website_id.required' => '网站id不能为空',
@@ -2679,10 +2828,53 @@ class WebsiteController extends AbstractController
             return Result::error($errorMessage);
         }
         $result = $this->websiteServiceClient->upWebsiteStatus($requireData);
-        return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
     }
 
 
 
-}
+    /**
+     * 删除网站地址
+     */
+    public function delWebsiteUrl()
+    {
+        $requireData = $this->request->all();
+        $validator = $this->validationFactory->make(
+            $requireData,
+            [
+                'website_id' => 'required',
+                'website_url' => 'required',
+            ],
+            [
+                'website_id.required' => '网站id不能为空',
+                'website_url.required' => '网站地址不能为空',
+            ]
+        );
+        if ($validator->fails()) {
+            $errorMessage = $validator->errors()->first();
+            return Result::error($errorMessage);
+        }
 
+        $result = $this->websiteServiceClient->delWebsiteUrl($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+    public function checkPath()
+    {
+        $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->checkPath($requireData);
+        return $result['code'] == 200 ? Result::success($result['data']) : Result::error($result['message']);
+    }
+}

+ 9 - 0
app/JsonRpc/AdService.php

@@ -107,5 +107,14 @@ class AdService extends AbstractServiceClient implements AdServiceInterface
         return $this->__request(__FUNCTION__, compact('id'));
     }
 
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function addTwinAdPlace(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
 
 }

+ 6 - 0
app/JsonRpc/AdServiceInterface.php

@@ -63,4 +63,10 @@ interface AdServiceInterface
      * @return mixed
      */
     public function getAdPlaceInfo(int $id);
+
+    /**
+     * @param int $id
+     * @return mixed
+     */
+    public function addTwinAdPlace(array $data);
 }

+ 3 - 0
app/JsonRpc/ChatService.php

@@ -217,4 +217,7 @@ class ChatService extends AbstractServiceClient implements ChatServiceInterface
     public function getTopicClassInfo(array $data){
         return $this->__request(__FUNCTION__, $data);
     }
+    public function getBusinessDistrictList(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 1 - 0
app/JsonRpc/ChatServiceInterface.php

@@ -55,5 +55,6 @@ interface ChatServiceInterface
     public function updateTopicClass(array $data);
     public function deleteTopicClass(array $data);
     public function getTopicClassInfo(array $data);
+    public function getBusinessDistrictList(array $data);
 
 }

+ 44 - 2
app/JsonRpc/ClientService.php

@@ -32,8 +32,50 @@ class ClientService extends AbstractServiceClient implements ClientServiceInterf
      */
     public function test(array $data): array
     {
-        var_dump($data, $this->serviceName, $this->protocol);
-        $this->logger->info('请求数据: ' . json_encode($data));
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function indexData(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function addWeb(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function deleteWeb(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateWeb(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getWebList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getWebInfo(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateWebConfig(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateWebOutput(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateWebMove(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function runWeb(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function stopWeb(array $data): array
+    {
         return $this->__request(__FUNCTION__, $data);
     }
 }

+ 11 - 0
app/JsonRpc/ClientServiceInterface.php

@@ -8,4 +8,15 @@ interface ClientServiceInterface
      * @param array $data
      */
     public function test(array $data);
+    public function indexData(array $data);
+    public function addWeb(array $data);
+    public function deleteWeb(array $data);
+    public function updateWeb(array $data);
+    public function getWebList(array $data);
+    public function updateWebConfig(array $data);
+    public function updateWebOutput(array $data);
+    public function updateWebMove(array $data);
+    public function runWeb(array $data);
+    public function stopWeb(array $data);
+    public function getWebInfo(array $data);
 }

+ 1 - 0
app/JsonRpc/FooterService.php

@@ -90,4 +90,5 @@ class FooterService extends AbstractServiceClient implements FooterServiceInterf
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
 }

+ 116 - 0
app/JsonRpc/FormService.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace App\JsonRpc;
+
+use Hyperf\RpcClient\AbstractServiceClient;
+use App\Model\GlobalTable;
+use App\Tools\Result;
+
+class FormService extends AbstractServiceClient implements FormServiceInterface
+{
+    /**
+     * 定义对应服务提供者的服务名称
+     * @var string
+     */
+    protected string $serviceName = 'FormService';
+    /**
+     * 定义对应服务提供者的服务协议
+     * @var string
+     */
+    protected string $protocol = 'jsonrpc-http';
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function addGlobalTable(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getGlobalTableList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getGlobalTable(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function upGlobalTable(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function delGlobalTable(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getGlobalTableFieldList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function addGlobalTableField(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function upGlobalTableField(array $data) 
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delGlobalTableField(array $data)   
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getGlobalTableField(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getGlobalTableData(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getGlobalTableFieldTypeList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delGlobalTableData(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getGlobalTableDataById(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function updateGlobalTableData(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getWebGlobalTableFieldList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function addWebGlobalTableData(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 86 - 0
app/JsonRpc/FormServiceInterface.php

@@ -0,0 +1,86 @@
+<?php
+
+namespace App\JsonRpc;
+
+interface FormServiceInterface
+{
+    /**
+     * @param array $data
+     */
+    public function addGlobalTable(array $data);
+    /**
+     * @param array $data
+     */
+    public function getGlobalTableList(array $data);
+    /**
+     * @param array $data
+     */
+    public function getGlobalTable(array $data);
+    /**
+     * @param array $data
+     */
+    public function upGlobalTable(array $data);
+    /**
+     * @param array $data
+     */
+    public function delGlobalTable(array $data);
+    /**
+     * @param array $data
+     */
+    public function getGlobalTableFieldList(array $data);
+    /**
+     * @param array $data
+     */
+    public function addGlobalTableField(array $data);
+    /**
+     * @param array $data
+     */
+    public function upGlobalTableField(array $data);
+    /**
+     * @param array $data
+     */
+    public function delGlobalTableField(array $data);
+    /**
+     * @param array $data
+     */
+    public function getGlobalTableField(array $data);
+    /**
+     * @param array $data
+     */
+    public function getGlobalTableData(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getGlobalTableFieldTypeList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delGlobalTableData(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getGlobalTableDataById(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function updateGlobalTableData(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebGlobalTableFieldList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function addWebGlobalTableData(array $data);
+}

+ 142 - 1
app/JsonRpc/NewsService.php

@@ -88,6 +88,11 @@ class NewsService extends AbstractServiceClient implements NewsServiceInterface
     {
         return $this->__request(__FUNCTION__, $data);
     }
+    public function getArticleCommend(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
 
     /**
      * @param array $data
@@ -507,7 +512,7 @@ class NewsService extends AbstractServiceClient implements NewsServiceInterface
      * @param array $data
      * @return mixed
      */
-    public function getWebsiteJobSelect(array $data) 
+    public function getWebsiteJobSelect(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
     }
@@ -527,6 +532,54 @@ class NewsService extends AbstractServiceClient implements NewsServiceInterface
     {
         return $this->__request(__FUNCTION__, $data);
     }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCompany(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCompanyInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCompanyList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteProject(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteProjectInfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteProjectList(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
     /**
      * @param array $data
      * @return mixed
@@ -743,4 +796,92 @@ class NewsService extends AbstractServiceClient implements NewsServiceInterface
     {
         return $this->__request(__FUNCTION__, $data);
     }
+    public function getWebsiteNwHomeList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getCompanyList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function addCompany(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function upCompany(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delCompany(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function checkCompany(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getCompanyInfo(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getProjectList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function addProject(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function checkProject(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function delProject(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function upProject(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function getProjectInfo(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteCategoryJob(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function readNotice(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function readComplaint(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function readJobResume(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function readJobApply(array $data)
+
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function noticeList(array $data)
+
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function complaintList(array $data)
+
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 106 - 28
app/JsonRpc/NewsServiceInterface.php

@@ -43,6 +43,8 @@ interface NewsServiceInterface
    * @param array $data
    */
   public function addArticle(array $data);
+  public function getArticleCommend(array $data);
+
 
   /**
    * @param array $data
@@ -197,16 +199,16 @@ interface NewsServiceInterface
    * @return mixed
    */
   public function test(array $data);
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function getWebsiteJobRecruiting(array $data);
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function checkWebsiteRoute(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteJobRecruiting(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function checkWebsiteRoute(array $data);
 
   /**
    * @param array $data
@@ -370,24 +372,100 @@ interface NewsServiceInterface
    * @return mixed
    */
   public function getJobResumeList(array $data);
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function getWebsiteJobSelect(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteJobSelect(array $data);
+
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteTsbb(array $data);
+  public function getWebsiteTsbbList(array $data);
+  public function getWebsiteTsbbDetail(array $data);
+
+  public function getWebsiteCatidshop(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteLevelJob(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteCompany(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteCompanyInfo(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteCompanyList(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteProject(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteProjectInfo(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteProjectList(array $data);
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteCategoryJob(array $data);
+
+
+  /**
+   * @param array $data
+   * @return mixed
+   */
+  public function getWebsiteNwHomeList(array $data);
+  // 企业管理
+  // 获取企业列表
+  public function getCompanyList(array $data);
+  // 添加企业
+  public function addCompany(array $data);
+  // 更新企业
+  public function upCompany(array $data);
+  // 删除企业
+  public function delCompany(array $data);
+  // 审核企业
+  public function checkCompany(array $data);
+  // 获取企业信息
+  public function getCompanyInfo(array $data);
 
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function getWebsiteTsbb(array $data);
-    public function getWebsiteTsbbList(array $data);
-    public function getWebsiteTsbbDetail(array $data);
+  //  项目管理
+  // 获取项目列表
+  public function getProjectList(array $data);
+  // 添加项目
+  public function addProject(array $data);
+  // 更新项目
+  public function upProject(array $data);
+  // 删除项目
+  public function delProject(array $data);
+  // 审核项目
+  public function checkProject(array $data);
+  // 获取项目详情
+  public function getProjectInfo(array $data);
 
-    public function getWebsiteCatidshop(array $data);
-    /**
-     * @param array $data
-     * @return mixed
-     */
-    public function getWebsiteLevelJob(array $data);
+  public function noticeList(array $data);
+  public function complaintList(array $data);
+  public function readComplaint(array $data);
+  public function readJobResume(array $data);
+  public function readJobApply(array $data);
+  public function readNotice(array $data);
 }

+ 11 - 3
app/JsonRpc/OrderService.php

@@ -16,7 +16,7 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
      * @var string
      */
     protected string $protocol = 'jsonrpc-http';
-   
+
     /**
      * @param array $data
      * @return mixed
@@ -65,7 +65,7 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -114,7 +114,7 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
         return $this->__request(__FUNCTION__, $data);
     }
 
-    
+
     /**
      * @param array $data
      * @return mixed
@@ -155,4 +155,12 @@ class OrderService extends AbstractServiceClient implements OrderServiceInterfac
     {
         return $this->__request(__FUNCTION__, []);
     }
+    public function batchDelWebsiteOrder(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function checkWebsiteOrder(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 5 - 3
app/JsonRpc/OrderServiceInterface.php

@@ -4,7 +4,7 @@ namespace App\JsonRpc;
 
 interface OrderServiceInterface
 {
-   
+
     /**
      * @param array $data
      */
@@ -46,7 +46,7 @@ interface OrderServiceInterface
      * @param array $data
      */
     public function getPrice(array $data);
-    
+
     /**
      * @param array $data
      */
@@ -68,7 +68,7 @@ interface OrderServiceInterface
      */
     public function delOrderAD(array $data);
 
-    
+
     /**
      * @param array $data
      */
@@ -89,4 +89,6 @@ interface OrderServiceInterface
      * @return mixed
      */
     public function getAdSize();
+    public function checkWebsiteOrder(array $data);
+    public function batchDelWebsiteOrder(array $data);
 }

+ 91 - 0
app/JsonRpc/PublicRpcService.php

@@ -512,6 +512,97 @@ class PublicRpcService extends AbstractServiceClient implements PublicRpcService
     {
         return $this->__request(__FUNCTION__, $data);
     }
+    /**
+     * 自助建站-随机获取模板
+     */
+    public function randomWebTemplate(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-获取某皮肤下的通栏、组件、组件预览图
+     */
+    public function getAllSectorComponentStyle(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }   
+    /**
+     * 自助建站-ai会话-获取会话列表
+     */
+    public function getAiSessionList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-创建会话
+     */
+    public function addAiSession(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-修改会话
+     */
+    public function upAiSession(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-删除会话
+     */
+    public function delAiSession(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-发送消息
+     */
+    public function sendAiMessage(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-获取消息列表
+     */
+    public function getAiMessageList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-添加模板草稿
+     */
+    public function addTemplateDraftbox(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-修改模板草稿
+     */
+    public function upTemplateDraftbox(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-ai会话-删除模板草稿
+     */
+    public function getTemplateDraftboxList(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-验证关键词填写重复问题
+     */
+    public function checkRepeatKeyword(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * 自助建站-验证临时模板
+     */
+    public function checkWebTemplate(array $data): array
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
     /**
      * 自助建站-添加样式代码
      */

+ 26 - 0
app/JsonRpc/PublicRpcServiceInterface.php

@@ -251,6 +251,32 @@ interface PublicRpcServiceInterface
     public function getStyleCode(array $data);
 
 
+    //自助建站-随机获取模板
+    public function randomWebTemplate(array $data);
+    //自助建站-获取某皮肤下的通栏、组件、组件预览图
+    public function getAllSectorComponentStyle(array $data);
+    //自助建站-ai会话-获取会话列表
+    public function getAiSessionList(array $data);
+    //自助建站-ai会话-创建会话
+    public function addAiSession(array $data);
+    //自助建站-ai会话-修改会话
+    public function upAiSession(array $data);
+    //自助建站-ai会话-删除会话
+    public function delAiSession(array $data);
+    //自助建站-ai会话-发送消息
+    public function sendAiMessage(array $data);
+    //自助建站-ai会话-获取消息列表
+    public function getAiMessageList(array $data);
+    //自助建站-ai会话-获取模板草稿列表
+    public function getTemplateDraftboxList(array $data);
+    //自助建站-ai会话-添加模板草稿
+    public function addTemplateDraftbox(array $data);
+    //自助建站-ai会话-修改模板草稿
+    public function upTemplateDraftbox(array $data);
+    //自助建站-验证关键词填写重复问题
+    public function checkRepeatKeyword(array $data);
+    //自助建站-验证临时模板
+    public function checkWebTemplate(array $data);
 
 
 }

+ 23 - 0
app/JsonRpc/UserService.php

@@ -181,4 +181,27 @@ class UserService extends AbstractServiceClient implements UserServiceInterface
     public function getWebsiteGroupInfo(array $data){
         return $this->__request(__FUNCTION__, $data);
     }
+    /**
+     * @param array $data
+     * @return array|mixed
+     */
+    public function getTypeUserList(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getImGroupMember(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getImContact(array $data){
+        return $this->__request(__FUNCTION__, $data);
+    }
 }

+ 16 - 0
app/JsonRpc/UserServiceInterface.php

@@ -119,5 +119,21 @@ interface UserServiceInterface
      * @return mixed
      */
     public function getWebsiteGroupInfo(array $data);
+    /**
+     * @param array $data
+     */
+    public function getTypeUserList(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getImGroupMember(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getImContact(array $data);
+
 
 }

+ 76 - 37
app/JsonRpc/WebsiteService.php

@@ -45,7 +45,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function updateWebsite(int $id, array $data)
     {
-        return $this->__request(__FUNCTION__,compact('id', 'data'));
+        return $this->__request(__FUNCTION__, compact('id', 'data'));
     }
 
     /**
@@ -54,7 +54,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function delWebsite(int $id)
     {
-        return $this->__request(__FUNCTION__,compact('id'));
+        return $this->__request(__FUNCTION__, compact('id'));
     }
 
     /**
@@ -63,7 +63,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function getWebsiteInfo(int $id)
     {
-        return $this->__request(__FUNCTION__,compact('id'));
+        return $this->__request(__FUNCTION__, compact('id'));
     }
 
     /**
@@ -84,7 +84,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function getWebsiteColumnList(array $data)
     {
-//        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize'));
+        //        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize'));
         return $this->__request(__FUNCTION__, $data);
     }
 
@@ -104,7 +104,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function updateWebsiteColumn(int $id, array $data)
     {
-        return $this->__request(__FUNCTION__,compact('id', 'data'));
+        return $this->__request(__FUNCTION__, compact('id', 'data'));
     }
 
     /**
@@ -113,7 +113,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function delWebsiteColumn(int $id)
     {
-        return $this->__request(__FUNCTION__,compact('id'));
+        return $this->__request(__FUNCTION__, compact('id'));
     }
 
     /**
@@ -122,9 +122,9 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param int $pageSize
      * @return mixed
      */
-    public function getWebsiteRoleList(string $keyword, int $page, int $pageSize,int $websiteId)
+    public function getWebsiteRoleList(string $keyword, int $page, int $pageSize, int $websiteId)
     {
-        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize','websiteId'));
+        return $this->__request(__FUNCTION__, compact('keyword', 'page', 'pageSize', 'websiteId'));
     }
     /**
      * @param array $data
@@ -142,7 +142,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function updateWebsiteRole(int $id, array $data)
     {
-        return $this->__request(__FUNCTION__,compact('id', 'data'));
+        return $this->__request(__FUNCTION__, compact('id', 'data'));
     }
 
     /**
@@ -151,7 +151,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function delWebsiteRole(int $id)
     {
-        return $this->__request(__FUNCTION__,compact('id'));
+        return $this->__request(__FUNCTION__, compact('id'));
     }
     /**
      * @param string $keyword
@@ -159,9 +159,9 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param int $pageSize
      * @return mixed
      */
-    public function getWebsiteRoleUserList(string $keyword, int $page, int $pageSize,int $websiteId,int $roleId)
+    public function getWebsiteRoleUserList(string $keyword, int $page, int $pageSize, int $websiteId, int $roleId)
     {
-        return $this->__request(__FUNCTION__, compact('keyword','page','pageSize','websiteId','roleId'));
+        return $this->__request(__FUNCTION__, compact('keyword', 'page', 'pageSize', 'websiteId', 'roleId'));
     }
 
     /**
@@ -180,7 +180,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function updateWebsiteRoleUser(int $id, array $data)
     {
-        return $this->__request(__FUNCTION__,compact('id', 'data'));
+        return $this->__request(__FUNCTION__, compact('id', 'data'));
     }
 
     /**
@@ -189,7 +189,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function delWebsiteRoleUser(int $id)
     {
-        return $this->__request(__FUNCTION__,compact('id'));
+        return $this->__request(__FUNCTION__, compact('id'));
     }
 
     /**
@@ -220,7 +220,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
         return $this->__request(__FUNCTION__, $data);
     }
 
-     /**
+    /**
      * @param array $data
      * @return array|mixed
      */
@@ -418,10 +418,10 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
         return $this->__request(__FUNCTION__, $data);
     }
 
-    
 
 
-    
+
+
     /**
      * @param array $data
      * @return mixed
@@ -430,7 +430,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -446,7 +446,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -454,7 +454,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -462,7 +462,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -478,7 +478,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-    
+
 
     //20250212  网站标识
     public function addWebsiteGroup(array $data)
@@ -537,7 +537,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
 
 
     // --自助建站-----------fr----------------------start
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
@@ -545,15 +545,15 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
     public function checkWebsiteBuild(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
-    } 
-     /**
+    }
+    /**
      * @param array $data
      * @return mixed
      */
@@ -561,14 +561,14 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
-     /**
+    /**
      * @param array $data
      * @return mixed
      */
     public function upWebsiteTemplateintel(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
-    }   
+    }
     /**
      *@param array $data
      * @return mixed
@@ -615,7 +615,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     /**
      * @param array $data
      * @return mixed
-    */
+     */
     public function getWebFootInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
@@ -631,7 +631,7 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     /**
      * @param array $data
      * @return mixed
-    */
+     */
     public function upWebFootInfo(array $data)
     {
         return $this->__request(__FUNCTION__, $data);
@@ -670,10 +670,18 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      */
     public function getWebsiteRoute(array $data)
     {
-        return $this->__request(__FUNCTION__, $data); 
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteAllinfo(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
     }
 
-   /*
+    /*
     * @param array $data
     * @return mixed
     */
@@ -703,7 +711,8 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param array $data
      * @return array|mixed
      */
-    public function getFooterContentList(array $data){
+    public function getFooterContentList(array $data)
+    {
         return $this->__request(__FUNCTION__, $data);
     }
     public function addStaticResource(array $data)
@@ -713,7 +722,8 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     /**
      * @param array $data
      */
-    public function getFooterContentInfo(array $data){
+    public function getFooterContentInfo(array $data)
+    {
         return $this->__request(__FUNCTION__, $data);
     }
     /**
@@ -804,6 +814,15 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
     {
         return $this->__request(__FUNCTION__, $data);
     }
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function cloneWebsite(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
     /**
      * @param array $data
      * @return mixed
@@ -824,9 +843,29 @@ class WebsiteService extends AbstractServiceClient implements WebsiteServiceInte
      * @param array $data
      * @return mixed
      */
-    public function upWebsiteStatus(array $data) 
-    { 
+    public function upWebsiteStatus(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsiteStatus(array $data)
+    {
         return $this->__request(__FUNCTION__, $data);
     }
 
-}
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteUrl(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+    public function checkPath(array $data)
+    {
+        return $this->__request(__FUNCTION__, $data);
+    }
+}

+ 55 - 32
app/JsonRpc/WebsiteServiceInterface.php

@@ -1,4 +1,5 @@
 <?php
+
 namespace App\JsonRpc;
 
 interface WebsiteServiceInterface
@@ -180,7 +181,7 @@ interface WebsiteServiceInterface
      */
     public function getAdminIndex(array $data);
 
-    
+
 
     /**
      * @param array $data
@@ -339,7 +340,7 @@ interface WebsiteServiceInterface
      */
     public function upWebsiteCategorySort(array $data);
 
-    
+
 
     // --自助建站-----------fr----------------------start
     /**
@@ -349,11 +350,11 @@ interface WebsiteServiceInterface
      */
     public function getWebsiteintel(array $data);
     /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
-   public function checkWebsiteBuild(array $data);
+     * @param array $data
+     * @return mixed
+     *
+     */
+    public function checkWebsiteBuild(array $data);
     /**
      * @param array $data
      * @return mixed
@@ -367,34 +368,34 @@ interface WebsiteServiceInterface
      */
     public function upWebsiteTemplateintel(array $data);
     /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
+     * @param array $data
+     * @return mixed
+     *
+     */
     public function getAllTemplateClass(array $data);
-     /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
+    /** 
+     * @param array $data
+     * @return mixed
+     *
+     */
     public function getWebsiteTemplateList(array $data);
-   /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
+    /** 
+     * @param array $data
+     * @return mixed
+     *
+     */
     public function addWebsiteTemplateclassintel(array $data);
     /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
+     * @param array $data
+     * @return mixed
+     *
+     */
     public function getWebsiteTemplateclassintel(array $data);
     /** 
-    * @param array $data
-    * @return mixed
-    *
-    */
+     * @param array $data
+     * @return mixed
+     *
+     */
     public function getWebsiteSectorList(array $data);
     // --自助建站-----------fr----------------------end
 
@@ -402,13 +403,13 @@ interface WebsiteServiceInterface
     /**
      * @param array $data
      * @return mixed
-    */
+     */
     public function getWebFootInfo(array $data);
     /**
      * @param array $data
      * @return mixed
      *
-    */
+     */
     public function addWebFootInfo(array $data);
     /**
      * @param array $data
@@ -441,6 +442,11 @@ interface WebsiteServiceInterface
      * @return mixed
      */
     public function getWebsiteRoute(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function getWebsiteAllinfo(array $data);
 
     /**
      * @param array $data
@@ -516,6 +522,23 @@ interface WebsiteServiceInterface
      * @param array $data
      * @return mixed
      */
-    public function upWebsiteStatus(array $data);  
+    public function cloneWebsite(array $data);
+
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function updateWebsiteStatus(array $data);
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function upWebsiteStatus(array $data);
 
+    /**
+     * @param array $data
+     * @return mixed
+     */
+    public function delWebsiteUrl(array $data);
+    public function checkPath(array $data);
 }

+ 119 - 0
app/Middleware/Auth/ComplaintMiddleware.php

@@ -0,0 +1,119 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Middleware\Auth;
+use App\Controller\LoginController;
+use App\Controller\UserController;
+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 ComplaintMiddleware implements MiddlewareInterface
+{
+    protected ContainerInterface $container;
+
+    protected RequestInterface $request;
+
+    protected HttpResponse $response;
+    protected JWT $JWT;
+    /**
+     * @var WebsiteServiceInterface
+     */
+    #[Inject]
+    private $websiteServiceClient;
+    /**
+     * @var LoginController
+     */
+    #[Inject]
+    protected $loginController;
+
+    /**
+     * @var UserController
+     */
+    #[Inject]
+    protected $userController;
+    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]);
+                $this->JWT->verifyToken($header['token'][0]);
+                if($tokenTime==0){
+                   return $this->response->json(
+                       [
+                           'code' => -1,
+                           'data' => [],
+                           'message' => 'token无效,请重新登录',
+                       ]
+                   );
+                }
+                if(isset($header['userurl']) && $header['userurl'] && $header['userurl'][0]){
+                    $origin = $header['userurl'][0];
+                    $data = [
+                        'website_url'=>$origin
+                    ];
+
+                    $result = $this->websiteServiceClient->getWebsiteId($data);
+                    if(!isset($result['data']['id']) || !$result['data']['id']){
+                        return $this->response->json(
+                            [
+                                'code' => -1,
+                                'data' => [],
+
+                                'message' => '网站不存在...',
+                            ]
+                        );
+                    }
+                    Context::set("SiteId",$result['data']['id']);
+                }
+                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;
+    }
+}

+ 35 - 28
app/Middleware/Auth/FooMiddleware.php

@@ -3,6 +3,7 @@
 declare(strict_types=1);
 
 namespace App\Middleware\Auth;
+
 use App\Controller\LoginController;
 use App\Controller\UserController;
 use Hyperf\Di\Annotation\Inject;
@@ -16,6 +17,7 @@ use Psr\Http\Server\RequestHandlerInterface;
 use Hyperf\Context\Context;
 use App\JsonRpc\WebsiteServiceInterface;
 use Phper666\JWTAuth\JWT;
+
 class FooMiddleware implements MiddlewareInterface
 {
     protected ContainerInterface $container;
@@ -40,43 +42,48 @@ class FooMiddleware implements MiddlewareInterface
      */
     #[Inject]
     protected $userController;
-    public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request,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();
+        // var_dump("请求头:", $header);
         try {
 
-            if($header &&  isset($header['token']) && $header['token'][0]!='null' && $header['token'][0]!='' && isset($header['token'][0])){
-//                var_dump("token类型:",$header['token'][0]);
+            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]);
+                // var_dump("token解析:", $ver);
                 $tokenTime =  $this->JWT->getTokenDynamicCacheTime($header['token'][0]);
                 $this->JWT->verifyToken($header['token'][0]);
-                if($tokenTime==0){
-                   return $this->response->json(
-                       [
-                           'code' => -1,
-                           'data' => [],
-                           'message' => 'token无效,请重新登录',
-                       ]
-                   );
+                if ($tokenTime == 0) {
+                    return $this->response->json(
+                        [
+                            'code' => -1,
+                            'data' => [],
+                            'message' => 'token无效,请重新登录',
+                        ]
+                    );
                 }
-                if(isset($header['userurl']) && $header['userurl'] && $header['userurl'][0]){
+                if (isset($header['userurl']) && $header['userurl'] && $header['userurl'][0]) {
                     $origin = $header['userurl'][0];
+                    Context::set("originUrl", $origin);
+                    // var_dump("来源地址:", $origin);
                     $data = [
-                        'website_url'=>$origin
+                        'website_url' => $origin
                     ];
 
                     $result = $this->websiteServiceClient->getWebsiteId($data);
-                    if(!isset($result['data']['id']) || !$result['data']['id']){
+                    // var_dump($result, '获取网站id--------------------');
+                    if (!isset($result['data']['id']) || !$result['data']['id']) {
                         return $this->response->json(
                             [
                                 'code' => -1,
@@ -86,10 +93,11 @@ class FooMiddleware implements MiddlewareInterface
                             ]
                         );
                     }
-                    Context::set("SiteId",$result['data']['id']);
-                    if($ver['type_id']!=10000){
+                    Context::set("SiteId", $result['data']['id']);
+                    // Context::set("websiteUrl", json_decode($result['data']['website_url'], true)[0] ?? "http://nwpre.bjzxtw.org.cn");
+                    if (in_array($ver['type_id'], [1, 2, 3, 4])) {
                         $userInfo = $this->userController->getUserInfo($ver['uid']);
-                        if($userInfo['code'] == 200 && isset($userInfo['data']) && !empty($userInfo['data']['sszq'])){
+                        if ($userInfo['code'] == 200 && isset($userInfo['data']) && !empty($userInfo['data']['sszq'])) {
                             $sszq = $userInfo['data']['sszq'];
                             //组id
                             $authData = [
@@ -108,7 +116,7 @@ class FooMiddleware implements MiddlewareInterface
                                     ]
                                 );
                             }
-                        }else{
+                        } else {
                             return $this->response->json(
                                 [
                                     'code' => -1,
@@ -117,16 +125,16 @@ class FooMiddleware implements MiddlewareInterface
                                 ]
                             );
                         }
-
                     }
                 }
-               var_dump("中间件:",$ver);
-                Context::set("UserId",$ver['uid']);
-                Context::set("TypeId",$ver['type_id']);
+                // var_dump("中间件:", $ver);
+                Context::set("UserId", $ver['uid']);
+                Context::set("TypeId", $ver['type_id']);
+                Context::set("Token", $header['token'][0]);
                 if ($ver) {
                     return $handler->handle($request);
                 }
-            }else{
+            } else {
                 return $this->response->json(
                     [
                         'code' => -1,
@@ -135,9 +143,8 @@ class FooMiddleware implements MiddlewareInterface
                     ]
                 );
             }
-
-        }catch (\Exception $e){
-            var_dump("错误消息1:",$e->getMessage(),$e->getCode());
+        } catch (\Exception $e) {
+            var_dump("错误消息1:", $e->getMessage(), $e->getCode());
             return $this->response->json(
                 [
                     'code' => $e->getCode(),
@@ -148,4 +155,4 @@ class FooMiddleware implements MiddlewareInterface
         }
         return false;
     }
-}
+}

+ 1 - 0
app/Middleware/Auth/PublicMiddleware.php

@@ -50,6 +50,7 @@ class PublicMiddleware implements MiddlewareInterface
                 ];
 
                 $result = $this->websiteServiceClient->getWebsiteId($data);
+                var_dump($result);
                 if(!isset($result['data']['id']) || !$result['data']['id']){
                     return $this->response->json(
                         [

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

@@ -41,6 +41,7 @@ class WebMiddleware implements MiddlewareInterface
     {
 
         $header = $request->getHeaders();
+        // var_dump("==============header:",$header);
         try {
             if($header &&  isset($header['siteid']) && $header['siteid'][0]!='null' && isset($header['siteid'][0])){
                 Context::set("SiteId",intval($header['siteid'][0]));

+ 60 - 0
app/Service/FileService.php

@@ -0,0 +1,60 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Service;
+
+use Hyperf\Redis\Redis;
+
+class FileService
+{
+    private Redis $redis;
+    private string $cachePrefix = 'file_cache:';
+    private int $cacheExpire = 3600; // 1小时缓存
+
+    public function __construct(Redis $redis)
+    {
+        $this->redis = $redis;
+    }
+
+    public function getCachedFile(string $url): ?string
+    {
+        $cacheKey = $this->cachePrefix . md5($url);
+        $result = $this->redis->get($cacheKey);
+        return $result === false ? null : $result;
+    }
+
+    public function cacheFile(string $url, string $content): void
+    {
+        $cacheKey = $this->cachePrefix . md5($url);
+        $this->redis->setex($cacheKey, $this->cacheExpire, $content);
+    }
+
+    public function downloadWithProgress(string $url, callable $progressCallback = null): string|false
+    {
+        $ch = curl_init();
+        curl_setopt_array($ch, [
+            CURLOPT_URL => $url,
+            CURLOPT_RETURNTRANSFER => true,
+            CURLOPT_TIMEOUT => 120,
+            CURLOPT_CONNECTTIMEOUT => 30,
+            CURLOPT_FOLLOWLOCATION => true,
+            CURLOPT_MAXREDIRS => 5,
+            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
+            CURLOPT_SSL_VERIFYPEER => false,
+            CURLOPT_SSL_VERIFYHOST => false,
+            CURLOPT_ENCODING => '',
+            CURLOPT_NOPROGRESS => false,
+            CURLOPT_PROGRESSFUNCTION => $progressCallback
+        ]);
+
+        $content = curl_exec($ch);
+        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+        curl_close($ch);
+
+        if ($content === false || $httpCode !== 200) {
+            return false;
+        }
+
+        return $content;
+    }
+}

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

@@ -1,87 +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'],
-//        ]));
-//    }
-}
+<?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 = [
+        'onTalk'          => 'onTalk',
+        'onKeyboard' => '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'],
+//        ]));
+//    }
+}

+ 40 - 0
app/Task/TsbbTask.php

@@ -0,0 +1,40 @@
+<?php
+
+declare (strict_types = 1);
+
+namespace App\Task;
+use App\JsonRpc\NewsServiceInterface;
+use Hyperf\Contract\StdoutLoggerInterface;
+use Hyperf\Di\Annotation\Inject;
+use Psr\Log\LoggerInterface;
+
+class TsbbTask
+{
+    /**
+     * @var NewsServiceInterface
+     */
+    #[Inject]
+    private $newsServiceClient;
+    /**
+     * @Inject
+     * @var StdoutLoggerInterface
+     */
+    private $logger;
+    public function __construct(LoggerInterface $logger)
+    {
+        date_default_timezone_set('Asia/Shanghai');
+        $this->logger = $logger;
+    }
+    public function __invoke()
+    {
+        var_dump("TsbbTask================");
+        $this->logger->info('TsbbTask================');
+        $requireData = [
+            'website_id' => 50,
+        ];
+        var_dump("#############");
+        $this->newsServiceClient->getWebsiteTsbb($requireData);;
+
+    }
+
+}

+ 52 - 1
app/Tools/PublicData.php

@@ -22,6 +22,8 @@ class PublicData
                 // 如果子菜单存在,则添加到当前菜单的children中
                 if ($children) {
                     $item['children'] = $children;
+                }else{
+                     $item['children'] = [];
                 }
                 // 将当前菜单添加到树中
                 $tree[] = $item;
@@ -155,7 +157,6 @@ class PublicData
      */
     public static function http_post_zp($url, $data, $options = [])
     {
-
         // 初始化CURL会话
         $ch = curl_init($url);
         var_dump("参数:",$data);
@@ -267,5 +268,55 @@ class PublicData
         return $data;
     }
 
+    public static function im_post($url, $data, $options = [])
+    {
+        // 初始化CURL会话
+        $ch = curl_init($url);
+        // JSON 编码(保持中文不转义)
+        $jsonBody = is_string($data) ? $data : json_encode($data, JSON_UNESCAPED_UNICODE);
+        // 基础选项
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_POST, true);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonBody);
+        // HTTPS 兼容
+        if (stripos($url, 'https://') === 0) {
+            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+        }
+        // Header:Content-Type JSON,Authorization(优先使用传入的)
+        $authorization = $options['authorization'] ?? 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI';
+        $headers = [
+            'Content-Type: application/json',
+            'Accept: application/json',
+            'Authorization: ' . $authorization,
+        ];
+        // 允许外部追加自定义 header(数组,形如 ['X-xxx: yyy'])
+        if (!empty($options['headers']) && is_array($options['headers'])) {
+            $headers = array_merge($headers, $options['headers']);
+        }
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        // 超时设置(可通过 options 覆盖)
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, (int)($options['connect_timeout'] ?? 5));
+        curl_setopt($ch, CURLOPT_TIMEOUT, (int)($options['timeout'] ?? 15));
+        // 追加额外的 CURL 选项(如需)
+        if (!empty($options['curl']) && is_array($options['curl'])) {
+            curl_setopt_array($ch, $options['curl']);
+        }
+        // 执行请求
+        $response = curl_exec($ch);
+        if ($response === false) {
+            $errorMsg = curl_error($ch);
+            curl_close($ch);
+            throw new \Exception('CURL Error: ' . $errorMsg);
+        }
+        // 获取HTTP状态码
+        $httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
+        // 关闭会话
+        curl_close($ch);
+        // 返回结果
+        return json_decode($response,true);
+    }
+
 
 }

+ 1 - 0
composer.json

@@ -48,6 +48,7 @@
         "hyperf/translation": "^3.1",
         "hyperf/validation": "^3.1",
         "hyperf/websocket-server": "^3.1",
+        "nesbot/carbon": "^2.73",
         "openai-php/client": "^0.10.3",
         "phper666/jwt-auth": "^4.0"
     },

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 350 - 140
composer.lock


+ 2 - 0
config/api/ad.php

@@ -23,6 +23,8 @@ Router::addGroup(
         Router::post('/updateAdPlace', [AdController::class, 'updateAdPlace']);
         //删除广告位
         Router::post('/delAdPlace', [AdController::class, 'delAdPlace']);
+        //孪生站广告位
+        Router::post('/addTwinAdPlace', [AdController::class, 'addTwinAdPlace']); 
     },
     ['middleware' => [FooMiddleware::class]]
 );

+ 2 - 0
config/api/chat.php

@@ -60,6 +60,8 @@ Router::addGroup(
         Router::post('/deleteTopicClass', [ChatController::class, 'deleteTopicClass']);
         Router::post('/updateTopicClass', [ChatController::class, 'updateTopicClass']);
         Router::post('/getTopicClassInfo', [ChatController::class, 'getTopicClassInfo']);
+
+        Router::get('/getBusinessDistrictList', [ChatController::class, 'getBusinessDistrictList']);
     },
     ['middleware' => [FooMiddleware::class]]
 );

+ 27 - 3
config/api/client.php

@@ -2,14 +2,38 @@
 
 declare(strict_types=1);
 
-use App\Controller\clientController;
+use App\Controller\ClientController;
 use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\WebMiddleware;
 
 Router::addGroup(
     '/client',
     function () {
-        Router::post('/test', [clientController::class, 'test']);
+        Router::post('/test', [ClientController::class, 'test']);
+        Router::post('/indexData', [ClientController::class, 'indexData']);
+        //搭建增删改查
+        Router::post('/addWeb', [ClientController::class, 'addWeb']);
+        Router::post('/deleteWeb', [ClientController::class, 'deleteWeb']);
+        Router::post('/updateWeb', [ClientController::class, 'updateWeb']);
+        Router::post('/getWebList', [ClientController::class, 'getWebList']);
+        Router::post('/getWebInfo', [ClientController::class, 'getWebInfo']);
+        //改配置
+        Router::post('/updateWebConfig', [ClientController::class, 'updateWebConfig']);
+        //输出目录
+        Router::post('/updateWebOutput', [ClientController::class, 'updateWebOutput']);
+        //移动目录
+        Router::post('/updateWebMove', [ClientController::class, 'updateWebMove']);
+        //运行
+        Router::post('/runWeb', [ClientController::class, 'runWeb']);
+        //停止
+        Router::post('/stopWeb', [ClientController::class, 'stopWeb']);
+
+
+
+
+        Router::post('/getPageList', [ClientController::class, 'getPageList']);
+        Router::post('/getUserInfo', [ClientController::class, 'getUserInfo']);
+        Router::post('/channelData', [ClientController::class, 'channelData']);
+        Router::post('/getData', [ClientController::class, 'getData']);
     },
-    // ['middleware' => [WebMiddleware::class]]
 );

+ 57 - 0
config/api/form.php

@@ -0,0 +1,57 @@
+<?php
+
+declare(strict_types=1);
+
+
+use App\Middleware\Auth\FooMiddleware;
+use Hyperf\HttpServer\Router\Router;
+use App\Controller\FormController;
+
+Router::addGroup(
+    '/form', function () {
+        //添加全局表单
+        Router::post('/addGlobalTable', [FormController::class, 'addGlobalTable']);
+        //修改全局表单
+        Router::post('/upGlobalTable', [FormController::class, 'upGlobalTable']);
+        //查看全局表单 
+        Router::get('/getGlobalTable', [FormController::class, 'getGlobalTable']);
+        //全局表单列表 
+        Router::get('/getGlobalTableList', [FormController::class, 'getGlobalTableList']);
+        //删除全局表单
+        Router::post('/delGlobalTable', [FormController::class, 'delGlobalTable']);
+        //getGlobalTableFieldList
+        Router::get('/getGlobalTableFieldList', [FormController::class, 'getGlobalTableFieldList']);
+        //添加全局表单字段
+        Router::post('/addGlobalTableField', [FormController::class, 'addGlobalTableField']);
+        //修改全局表单字段
+        Router::post('/upGlobalTableField', [FormController::class, 'upGlobalTableField']);
+        //删除全局表单字段
+        Router::post('/delGlobalTableField', [FormController::class, 'delGlobalTableField']);
+        //获取全局表单字段详情
+        Router::get('/getGlobalTableField', [FormController::class, 'getGlobalTableField']);
+        //获取表单下面的数据
+        Router::get('/getGlobalTableData', [FormController::class, 'getGlobalTableData']);
+        //获取表单字段类型列表
+        Router::get('/getGlobalTableFieldTypeList', [FormController::class, 'getGlobalTableFieldTypeList']);
+        //删除表单下面的数据
+        Router::post('/delGlobalTableData', [FormController::class, 'delGlobalTableData']);
+        //获取表单下面的数据详情
+        Router::get('/getGlobalTableDataById', [FormController::class, 'getGlobalTableDataById']);
+        //修改表单下面的数据
+        Router::post('/updateGlobalTableData', [FormController::class, 'updateGlobalTableData']);
+
+    },
+    ['middleware' => [FooMiddleware::class]]
+);
+
+Router::addGroup(
+    '/form', function () {
+    //全局表单列表
+    Router::get('/getWebGlobalTableFieldList', [FormController::class, 'getWebGlobalTableFieldList']);
+    //删除全局表单
+    Router::post('/addWebGlobalTableData', [FormController::class, 'addWebGlobalTableData']);
+
+
+},
+    ['middleware' => [\App\Middleware\Auth\WebMiddleware::class]]
+);

+ 20 - 0
config/api/news.php

@@ -5,6 +5,7 @@ declare(strict_types=1);
 use App\Controller\NewsController;
 use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\FooMiddleware;
+use App\Model\Role;
 use FastRoute\Route;
 
 Router::addGroup(
@@ -35,6 +36,9 @@ Router::addGroup(
         Router::post('/upArticleStatus', [NewsController::class, 'upArticleStatus']);
         //查看资讯
         Router::get('/getArticleInfo', [NewsController::class, 'getArticleInfo']);
+        //首页推荐
+        Router::get('/getArticleCommend', [NewsController::class, 'getArticleCommend']);
+
         // 前端-搜索资讯
         Router::get('/selectWebsiteCategory', [NewsController::class, 'selectWebsiteArticle']);
         //获取导航池信息
@@ -132,6 +136,22 @@ Router::addGroup(
 
 
         // 20250306 招聘
+
+        // 20250623  项目管理
+        Router::post('/getProjectList', [NewsController::class, 'getProjectList']);
+        Router::post('/addProject', [NewsController::class, 'addProject']);
+        Router::post('/upProject', [NewsController::class, 'upProject']);
+        Router::post('/delProject', [NewsController::class, 'delProject']);
+        Router::post('/checkProject', [NewsController::class, 'checkProject']);
+        Router::post('/getProjectInfo', [NewsController::class, 'getProjectInfo']);
+
+        //已读未读
+        Router::post('/readNotice', [NewsController::class, 'readNotice']);
+        Router::post('/readComplaint', [NewsController::class, 'readComplaint']);
+        Router::post('/readJobResume', [NewsController::class, 'readJobResume']);
+        Router::post('/readJobApply', [NewsController::class, 'readJobApply']);
+        Router::post('/noticeList', [NewsController::class, 'noticeList']);
+        Router::post('/complaintList', [NewsController::class, 'complaintList']);
     },
     ['middleware' => [FooMiddleware::class, \App\Middleware\Auth\SensitiveMiddleware::class]]
 );

+ 8 - 2
config/api/order.php

@@ -1,12 +1,14 @@
 <?php
 
-declare (strict_types = 1);
+declare(strict_types=1);
+
 use App\Controller\OrderController;
 use App\Middleware\Auth\FooMiddleware;
 use Hyperf\HttpServer\Router\Router;
 
 Router::addGroup(
-    '/order', function () {
+    '/order',
+    function () {
         //订单状态对应
         Router::get('/getStatus', [OrderController::class, 'getStatus']);
         //查询广告
@@ -65,6 +67,10 @@ Router::addGroup(
         //获取广告位的尺寸
         Router::post('/getAdSize', [OrderController::class, 'getAdSize']);
 
+        //检测站点是否有订单
+        Router::post('/checkWebsiteOrder', [OrderController::class, 'checkWebsiteOrder']);
+        //批量删除站点订单
+        Router::post('/batchDelWebsiteOrder', [OrderController::class, 'batchDelWebsiteOrder']);
     },
     ['middleware' => [FooMiddleware::class]]
 );

+ 55 - 12
config/api/public.php

@@ -17,17 +17,8 @@ Router::addGroup(
         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']);
 
         //下载文件
@@ -132,17 +123,69 @@ Router::addGroup(
         // 自助建站-6.返显保存的模版
         Router::post('/getWebsiteTemplate', [PublicController::class, 'getWebsiteTemplate']);
 
+        
+        // 企业管理
+        // 获取企业列表
+        Router::get('/getCompanyList', [PublicController::class, 'getCompanyList']);
+        // 添加企业
+        Router::post('/addCompany', [PublicController::class, 'addCompany']);
+        // 更新企业
+        Router::post('/upCompany', [PublicController::class, 'upCompany']);
+        // 删除企业
+        Router::post('/delCompany', [PublicController::class, 'delCompany']);
+        // 审核企业
+        Router::post('/checkCompany', [PublicController::class, 'checkCompany']);
+        // 获取企业信息
+        Router::get('/getCompanyInfo', [PublicController::class, 'getCompanyInfo']);
+
         //获取所有的通栏版式
         Router::post('/getAllSectorPlace', [PublicController::class, 'getAllSectorPlace']);
 
+        // 获取所有通栏分类
         // 获取所有通栏分类
         Router::post('/getSectorType', [PublicController::class, 'getSectorType']);
-        
-
+        // 随机模板
+        Router::post('/randomWebTemplate', [PublicController::class, 'randomWebTemplate']);
+        // 获取某皮肤下的通栏、组件、组件预览图
+        Router::post('/getAllSectorComponentStyle', [PublicController::class, 'getAllSectorComponentStyle']);
+        // 自助建站-ai会话-获取会话列表
+        Router::post('/getAiSessionList', [PublicController::class, 'getAiSessionList']);
+        // 自助建站-ai会话-创建会话
+        Router::post('/addAiSession', [PublicController::class, 'addAiSession']);
+        // 自助建站-ai会话-修改会话
+        Router::post('/upAiSession', [PublicController::class, 'upAiSession']);
+        // 自助建站-ai会话-删除会话
+        Router::post('/delAiSession', [PublicController::class, 'delAiSession']);
+        // 自助建站-ai会话-发送消息
+        Router::post('/sendAiMessage', [PublicController::class, 'sendAiMessage']);
+        // 自助建站-ai会话-获取消息列表
+        Router::post('/getAiMessageList', [PublicController::class, 'getAiMessageList']);
+        // 自助建站-ai会话-添加模板草稿
+        Router::post('/addTemplateDraftbox', [PublicController::class, 'addTemplateDraftbox']);
+        // 自助建站-ai会话-修改模板草稿
+        Router::post('/upTemplateDraftbox', [PublicController::class, 'upTemplateDraftbox']);
+        // 自助建站-ai会话-获取模板草稿列表
+        Router::post('/getTemplateDraftboxList', [PublicController::class, 'getTemplateDraftboxList']);
+        // 自助建站-验证关键词填写重复问题
+        Router::post('/checkRepeatKeyword', [PublicController::class, 'checkRepeatKeyword']);
+        // 自助建站-验证临时模板
+        Router::post('/checkWebTemplate', [PublicController::class, 'checkWebTemplate']);
     },
     ['middleware' => [FooMiddleware::class]]
 );
 
+Router::addGroup(
+    '/public', function () {
+    //添加投诉举报
+    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']);
+},
+    ['middleware' => [\App\Middleware\Auth\ComplaintMiddleware::class]]);
 Router::addGroup(
     '/public', function () {
         //获取所有的职能部门

+ 30 - 0
config/api/test.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Controller\TestController;
+use Hyperf\HttpServer\Router\Router;
+// --招工招聘交互-----------fr----------------------start
+Router::addGroup(
+    '/test', function () {
+        // 测试admin_consumer
+        Router::post('/testAdminConsumer', [TestController::class, 'testAdminConsumer']);
+        // 测试public_producer
+        Router::post('/testPublicProducer', [TestController::class, 'testPublicProducer']);
+        // 测试news_producer
+        Router::post('/testNewsProducer', [TestController::class, 'testNewsProducer']);
+        // 测试ad_producer
+        Router::post('/testAdProducer', [TestController::class, 'testAdProducer']);
+        // 测试user_producer
+        Router::post('/testUserProducer', [TestController::class, 'testUserProducer']);
+        // 测试order_producer
+        Router::post('/testOrderProducer', [TestController::class, 'testOrderProducer']);
+        // 测试chat_producer
+        Router::post('/testChatProducer', [TestController::class, 'testChatProducer']);
+        // 测试collector_producer
+        Router::post('/testCollectorProducer', [TestController::class, 'testCollectorProducer']);
+        // 测试client_producer
+        Router::post('/testClientProducer', [TestController::class, 'testClientProducer']);
+    },
+);
+// --招工招聘交互-----------fr----------------------end

+ 26 - 0
config/api/web.php

@@ -6,6 +6,7 @@ use App\Controller\WebController;
 use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\WebMiddleware;
 use App\Middleware\Auth\FooMiddleware;
+use App\Controller\WebsiteController;
 Router::addGroup(
     '/web', function () {
                 Router::get('/getWebsiteCategory', [WebController::class, 'getWebsiteCategory']);
@@ -82,6 +83,8 @@ Router::addGroup(
 
 
                 // 求职招聘
+                // 招工招聘栏目首页
+                Router::get('/getWebsiteCategoryJob', [WebController::class, 'getWebsiteCategoryJob']);
                 // 获取求职招聘下拉选框
                 Router::get('/getWebsiteJobSelect', [WebController::class, 'getWebsiteJobSelect']);
                 // 获取求职招聘
@@ -102,6 +105,26 @@ Router::addGroup(
                 Router::get('/getWebsiteTsbbList', [WebController::class, 'getWebsiteTsbbList']);
                 //详情页
                 Router::get('/getWebsiteTsbbDetail', [WebController::class, 'getWebsiteTsbbDetail']);
+                //农网导航
+                Router::get('/getWebsiteNwHomeList', [WebController::class, 'getWebsiteNwHomeList']);
+
+                // c端  
+                // 企业模块
+                Router::get('/getWebsiteCompany', [WebController::class, 'getWebsiteCompany']);
+                // 企业列表
+                Router::get('/getWebsiteCompanyList', [WebController::class, 'getWebsiteCompanyList']);
+                // 企业详情
+                Router::get('/getWebsiteCompanyInfo', [WebController::class, 'getWebsiteCompanyInfo']);
+                // 项目模块
+                Router::get('/getWebsiteProject', [WebController::class, 'getWebsiteProject']);
+                // 项目列表
+                Router::get('/getWebsiteProjectList', [WebController::class, 'getWebsiteProjectList']);
+                // 项目详情
+                Router::get('/getWebsiteProjectInfo', [WebController::class, 'getWebsiteProjectInfo']);
+
+                // 自助建站-c端获取头部及底部所有网站信息
+                Router::get('/getWebsiteAllinfo', [WebController::class, 'getWebsiteAllinfo']);
+                
                 
             },
     ['middleware' => [WebMiddleware::class]]
@@ -126,6 +149,9 @@ Router::addGroup(
     '/web', function () {
         // 获取底部所有信息
         Router::get('/getAdminWebsiteFootAll', [WebController::class, 'getAdminWebsiteFootAll']);
+        //获取网站基本信息
+        Router::get('/getAdminSiteInfo', [WebsiteController::class, 'getAdminSiteInfo']);
+
     }
 
 );

+ 29 - 17
config/api/website.php

@@ -1,12 +1,14 @@
 <?php
 
-declare (strict_types = 1);
+declare(strict_types=1);
 
 use App\Controller\WebsiteController;
 use Hyperf\HttpServer\Router\Router;
 use App\Middleware\Auth\FooMiddleware;
+
 Router::addGroup(
-    '/website', function () {
+    '/website',
+    function () {
         //添加网站
         Router::post('/addWebsite', [WebsiteController::class, 'addWebsite']);
         //获取网站列表
@@ -34,7 +36,7 @@ Router::addGroup(
         Router::get('/getWebsiteRoleUserList', [WebsiteController::class, 'getWebsiteRoleUserList']);
         Router::post('/createWebsiteRoleUser', [WebsiteController::class, 'createWebsiteRoleUser']);
         Router::post('/delWebsiteRoleUser', [WebsiteController::class, 'delWebsiteRoleUser']);
-        
+
         //获取分类下模板列表
         Router::get('/getTemplate', [WebsiteController::class, 'getTemplate']);
         //获取分类下模板列表
@@ -97,6 +99,9 @@ Router::addGroup(
         Router::post('/getWebsiteGroupList', [WebsiteController::class, 'getWebsiteGroupList']);
         //获取网站下导航列表
         Router::post('/getWebsiteNavList', [WebsiteController::class, 'getWebsiteNavList']);
+        //checkPath 检测路径是否存在
+        Router::post('/checkPath', [WebsiteController::class, 'checkPath']);
+
 
         // 20250307 根据网站标识获取导航池
         Router::post('/getWebsiteNavPool', [WebsiteController::class, 'getWebsiteNavPool']);
@@ -156,13 +161,20 @@ Router::addGroup(
         Router::post('/delWhiteRouter', [WebsiteController::class, 'delWhiteRouter']);
         Router::get('/getWhiteRouterInfo', [WebsiteController::class, 'getWhiteRouterInfo']);
         Router::post('/upWhiteRouter', [WebsiteController::class, 'upWhiteRouter']);
+        // 克隆网站
+        Router::post('/cloneWebsite', [WebsiteController::class, 'cloneWebsite']);
+        //更新网站状态
+        Router::post('/updateWebsiteStatus', [WebsiteController::class, 'updateWebsiteStatus']);
+
         // --网站路由白名单-----------fr----------------------end
+        Router::post('/delWebsiteUrl', [WebsiteController::class, 'delWebsiteUrl']);
     },
     ['middleware' => [FooMiddleware::class]]
 );
 // --自助建站-----------fr----------------------start
 Router::addGroup(
-    '/website', function () {
+    '/website',
+    function () {
         // 获取职能部门
         Router::post('/selectWebsiteDepartment', [WebsiteController::class, 'selectWebsiteDepartment']);
         // 获取行政区划
@@ -172,18 +184,18 @@ Router::addGroup(
 // --自助建站-----------fr----------------------end
 
 Router::addGroup(
-    '/web', function () {
-    //获取网站基本信息
-    Router::post('/getSiteInfo', [WebsiteController::class, 'getSiteInfo']);
-    //获取网站导航池
-    Router::get('/getSiteCategory', [WebsiteController::class, 'getSiteCategory']);
-    //获取底部导航
-    Router::get('/getFooterCategoryList', [WebsiteController::class, 'getFooterCategoryList']);
-    //获取底部导航详情
-    Router::get('/getFooterContentList', [WebsiteController::class, 'getFooterContentList']);
-    //底部导航详情页
-    Router::get('/getFooterContentInfo', [WebsiteController::class, 'getFooterContentInfo']);
-
-},
+    '/web',
+    function () {
+        //获取网站基本信息
+        Router::post('/getSiteInfo', [WebsiteController::class, 'getSiteInfo']);
+        //获取网站导航池
+        Router::get('/getSiteCategory', [WebsiteController::class, 'getSiteCategory']);
+        //获取底部导航
+        Router::get('/getFooterCategoryList', [WebsiteController::class, 'getFooterCategoryList']);
+        //获取底部导航详情
+        Router::get('/getFooterContentList', [WebsiteController::class, 'getFooterContentList']);
+        //底部导航详情页
+        Router::get('/getFooterContentInfo', [WebsiteController::class, 'getFooterContentInfo']);
+    },
     ['middleware' => [\App\Middleware\Auth\WebMiddleware::class]]
 );

+ 1 - 1
config/autoload/amqp.php

@@ -16,7 +16,7 @@ return [
         'pool' => [
             'min_connections' => 1,
             'max_connections' => 1, // 限制最大连接数为1
-            'connect_timeout' => 10.0,
+            'connect_timeout' => 1000.0,
             'wait_timeout' => 3.0,
             'heartbeat' => -1,
             

+ 10 - 4
config/autoload/crontab.php

@@ -8,11 +8,17 @@ return [
     // 是否开启定时任务
     'enable' => true,
     'crontab' => [
+//        (new Crontab())
+//            ->setName('HistoryTodayTask')
+//            ->setRule('0 0 0  * * *') // 每天凌晨执行一次
+//            ->setCallback([App\Task\HistoryTodayTask::class, '__invoke'])
+//            ->setMemo('获取历史上的今天')
+//            ->setTimezone('Asia/Shanghai'),
         (new Crontab())
-            ->setName('HistoryTodayTask')
-            ->setRule('0 0 0  * * *') // 每天凌晨执行一次
-            ->setCallback([App\Task\HistoryTodayTask::class, '__invoke'])
-            ->setMemo('获取历史上的今天')
+            ->setName('tsbbTask') // 任务名称
+            ->setRule('* * 1 * * *') // 每天凌晨1点执行
+            ->setCallback([App\Task\TsbbTask::class, '__invoke']) // 替换为你的任务类
+            ->setMemo('贴身宝贝') // 描述
             ->setTimezone('Asia/Shanghai'),
     ],
 ];

+ 9 - 0
config/autoload/server.php

@@ -38,6 +38,15 @@ return [
                 Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
                 Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
             ],
+            'settings' => [
+                // 关键:设置连接最大闲置时间(秒),0 表示永不超时
+                'max_idle_time' => 300, // 例如设置为 5 分钟
+                // 其他可能相关的配置
+                'open_tcp_keepalive' => 1, // 开启 TCP 保活机制
+                'tcp_keepidle' => 60, // 60 秒内无数据则发送保活探针
+                'tcp_keepinterval' => 10, // 探针间隔 10 秒
+                'tcp_keepcount' => 3, // 探针失败 3 次后关闭连接
+            ],
         ],
     ],
     'settings' => [

+ 32 - 1
config/autoload/services.php

@@ -85,7 +85,7 @@ return [
                 'package_length_field' => 'length',
             ],
             'options' => [
-                'connect_timeout' => 50.0, // 连接超时时间,单位为秒
+                'connect_timeout' => 500.0, // 连接超时时间,单位为秒
                 'read_timeout' => 100.0, // 读取超时时间,单位为秒
                 'write_timeout' => 100.0, // 写入超时时间,单位为秒
             ],
@@ -152,6 +152,37 @@ return [
             'nodes' => [
                 ['host' => '127.0.0.1', 'port' => 9510],
             ],
+            'settings' => [
+                'open_length_check' => true,
+                'package_max_length' => 15 * 1024 * 1024, // 最大包长度
+                'package_length_type' => 'N',
+                'package_body_offset' => 8,
+                'package_length_offset' => 4,
+                'package_length_field' => 'length',
+            ],
+            'options' => [
+                'connect_timeout' => 500.0, // 连接超时时间,单位为秒
+                'read_timeout' => 100.0, // 读取超时时间,单位为秒
+                'write_timeout' => 100.0, // 写入超时时间,单位为秒
+            ],
+            'pool' => [
+                'min_connections' => 1,
+                'max_connections' => 30,
+                'connect_timeout' => 100.0, // 连接池连接超时时间,单位为秒
+                'wait_timeout' => 30.0, // 等待连接池可用连接的超时时间,单位为秒
+                'heartbeat' => -1, // 心跳检测间隔,-1 表示禁用心跳检测
+                'max_idle_time' => 60.0, // 连接的最大空闲时间,单位为秒
+            ],
+        ],
+        [
+            //全局表单服务
+            'name' => 'FormService',
+            'service' => \App\JsonRpc\FormServiceInterface::class,
+
+            // 直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
+            'nodes' => [
+                ['host' => '127.0.0.1', 'port' => 9509],
+            ],
         ],
     ],
 

+ 2 - 0
config/routes.php

@@ -39,3 +39,5 @@ require __DIR__ . '/api/order.php';
 require __DIR__ . '/api/collector.php';
 require __DIR__ . '/api/footer.php';
 require __DIR__ . '/api/client.php';
+require __DIR__ . '/api/form.php';
+require __DIR__ . '/api/test.php';

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio