From 91493c36d45b8fa932531df76bd4940a6af20415 Mon Sep 17 00:00:00 2001 From: Lilixu007 <1273914445@qq.com> Date: Sat, 28 Feb 2026 09:40:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E9=80=9A=E8=AF=9D-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- 0.4 | 53 + lover/.env | 4 +- xuniYou/.hbuilderx/launch.json | 2 +- xuniYou/manifest.json | 4 +- xuniYou/pages/chat/phone.vue | 282 +- xuniYou/utils/request.js | 4 +- xuniYou/按住说话调试指南.md | 161 + xuniYou/语音通话配置说明.md | 101 + xuniYou/麦克风图标说明.md | 41 + xunifriend_RaeeC/.env | 6 +- .../application/common/controller/Api.php | 2 +- xunifriend_RaeeC/composer.lock | 3133 +++++++++++++++++ .../thinkphp/library/think/App.php | 2 +- .../thinkphp/library/think/Request.php | 2 +- .../thinkphp/library/think/debug/Html.php | 2 +- xunifriend_RaeeC/vendor/autoload.php | 5 +- .../vendor/composer/InstalledVersions.php | 45 +- .../vendor/composer/autoload_classmap.php | 2 +- .../vendor/composer/autoload_psr4.php | 5 +- .../vendor/composer/autoload_static.php | 129 +- .../vendor/composer/installed.json | 520 ++- .../vendor/composer/installed.php | 123 +- .../vendor/composer/platform_check.php | 13 +- .../fastadmin-addons/composer.json | 4 +- .../src/addons/Controller.php | 2 +- .../fastadmin-addons/src/addons/Service.php | 3 +- .../fastadmin-addons/src/common.php | 11 +- .../vendor/guzzlehttp/guzzle/CHANGELOG.md | 19 + .../vendor/guzzlehttp/guzzle/composer.json | 4 +- .../guzzle/src/Cookie/SetCookie.php | 4 + .../guzzle/src/Handler/CurlFactory.php | 9 +- .../guzzle/src/Handler/CurlMultiHandler.php | 5 +- .../guzzlehttp/guzzle/src/Handler/Proxy.php | 12 +- .../guzzle/src/Handler/StreamHandler.php | 19 +- .../guzzlehttp/guzzle/src/Middleware.php | 4 +- .../vendor/guzzlehttp/guzzle/src/Pool.php | 2 +- .../vendor/guzzlehttp/guzzle/src/Utils.php | 2 +- .../guzzlehttp/guzzle/src/functions.php | 2 +- .../maennchen/zipstream-php/.editorconfig | 22 + .../maennchen/zipstream-php/.phive/phars.xml | 2 +- .../zipstream-php/.php-cs-fixer.dist.php | 10 +- .../.phpdoc/template/base.html.twig | 2 +- .../maennchen/zipstream-php/.tool-versions | 2 +- .../vendor/maennchen/zipstream-php/README.md | 193 +- .../maennchen/zipstream-php/composer.json | 47 +- .../zipstream-php/guides/ContentLength.rst | 102 +- .../zipstream-php/guides/FlySystem.rst | 19 +- .../zipstream-php/guides/Options.rst | 90 +- .../zipstream-php/guides/PSR7Streams.rst | 7 +- .../zipstream-php/guides/StreamOutput.rst | 96 +- .../zipstream-php/guides/Symfony.rst | 30 +- .../maennchen/zipstream-php/guides/index.rst | 73 +- .../maennchen/zipstream-php/phpdoc.dist.xml | 2 +- .../maennchen/zipstream-php/phpunit.xml.dist | 13 +- .../vendor/maennchen/zipstream-php/psalm.xml | 46 +- .../maennchen/zipstream-php/src/Bigint.php | 174 - .../src/CentralDirectoryFileHeader.php | 52 + .../zipstream-php/src/CompressionMethod.php | 109 + .../zipstream-php/src/DataDescriptor.php | 26 + .../zipstream-php/src/DeflateStream.php | 71 - .../src/EndOfCentralDirectory.php | 35 + .../maennchen/zipstream-php/src/Exception.php | 6 +- .../Exception/DosTimeOverflowException.php | 25 + .../src/Exception/EncodingException.php | 14 - .../src/Exception/FileNotFoundException.php | 11 +- .../Exception/FileNotReadableException.php | 13 +- .../Exception/FileSizeIncorrectException.php | 25 + .../IncompatibleOptionsException.php | 14 - .../src/Exception/OverflowException.php | 5 + .../src/Exception/ResourceActionException.php | 31 + .../SimulationFileUnknownException.php | 21 + .../Exception/StreamNotReadableException.php | 12 +- .../Exception/StreamNotSeekableException.php | 24 + .../maennchen/zipstream-php/src/File.php | 759 ++-- .../src/GeneralPurposeBitFlag.php | 89 + .../zipstream-php/src/LocalFileHeader.php | 40 + .../zipstream-php/src/OperationMode.php | 37 + .../zipstream-php/src/Option/Archive.php | 276 -- .../zipstream-php/src/Option/File.php | 122 - .../zipstream-php/src/Option/Method.php | 21 - .../zipstream-php/src/Option/Version.php | 25 - .../maennchen/zipstream-php/src/PackField.php | 56 + .../maennchen/zipstream-php/src/Stream.php | 265 -- .../src/Stream/CallbackStreamWrapper.php | 253 ++ .../maennchen/zipstream-php/src/Time.php | 39 + .../maennchen/zipstream-php/src/Version.php | 15 + .../src/Zip64/DataDescriptor.php | 28 + .../src/Zip64/EndOfCentralDirectory.php | 43 + .../Zip64/EndOfCentralDirectoryLocator.php | 29 + .../Zip64/ExtendedInformationExtraField.php | 45 + .../maennchen/zipstream-php/src/ZipStream.php | 1065 +++--- .../src/Zs/ExtendedInformationExtraField.php | 23 + .../zipstream-php/test/Assertions.php | 49 + .../zipstream-php/test/BigintTest.php | 66 - .../zipstream-php/test/CallbackOutputTest.php | 202 ++ .../test/CentralDirectoryFileHeaderTest.php | 60 + .../zipstream-php/test/DataDescriptorTest.php | 26 + .../test/EndOfCentralDirectoryTest.php | 35 + .../zipstream-php/test/EndlessCycleStream.php | 104 + .../test/FaultInjectionResource.php | 141 + .../test/LocalFileHeaderTest.php | 47 + .../zipstream-php/test/PackFieldTest.php | 42 + .../zipstream-php/test/ResourceStream.php | 159 + .../maennchen/zipstream-php/test/Tempfile.php | 42 + .../maennchen/zipstream-php/test/TimeTest.php | 44 + .../maennchen/zipstream-php/test/Util.php | 127 + .../test/Zip64/DataDescriptorTest.php | 28 + .../EndOfCentralDirectoryLocatorTest.php | 28 + .../test/Zip64/EndOfCentralDirectoryTest.php | 41 + .../ExtendedInformationExtraFieldTest.php | 42 + .../zipstream-php/test/ZipStreamTest.php | 1283 +++++-- .../Zs/ExtendedInformationExtraFieldTest.php | 22 + .../test/bug/BugHonorFileTimeTest.php | 40 - .../vendor/monolog/monolog/CHANGELOG.md | 7 + .../vendor/monolog/monolog/composer.json | 2 +- .../monolog/src/Monolog/ErrorHandler.php | 4 +- .../Monolog/Formatter/MongoDBFormatter.php | 32 - .../monolog/src/Monolog/Handler/Curl/Util.php | 4 +- .../src/Monolog/Handler/MongoDBHandler.php | 13 +- .../Monolog/Handler/RotatingFileHandler.php | 2 +- .../Monolog/Handler/TelegramBotHandler.php | 4 + .../src/Monolog/Processor/GitProcessor.php | 2 +- .../Monolog/Processor/MercurialProcessor.php | 2 +- .../monolog/src/Monolog/SignalHandler.php | 1 + .../vendor/myclabs/php-enum/LICENSE | 18 - .../vendor/myclabs/php-enum/README.md | 194 - .../vendor/myclabs/php-enum/SECURITY.md | 11 - .../vendor/myclabs/php-enum/composer.json | 36 - .../vendor/myclabs/php-enum/src/Enum.php | 318 -- .../php-enum/src/PHPUnit/Comparator.php | 54 - .../myclabs/php-enum/stubs/Stringable.php | 11 - .../phpoffice/phpspreadsheet/CHANGELOG.md | 9 - .../vendor/phpoffice/phpspreadsheet/README.md | 17 +- .../phpoffice/phpspreadsheet/composer.json | 2 +- .../pimple/pimple/.github/workflows/tests.yml | 4 + .../vendor/pimple/pimple/composer.json | 2 +- .../vendor/pimple/pimple/phpunit.xml.dist | 2 +- .../pimple/pimple/src/Pimple/Container.php | 6 +- .../pimple/src/Pimple/Tests/PimpleTest.php | 19 +- xunifriend_RaeeC/vendor/psr/cache/README.md | 17 +- .../vendor/psr/cache/composer.json | 4 +- .../vendor/psr/cache/src/CacheException.php | 2 +- .../psr/cache/src/CacheItemInterface.php | 8 +- .../psr/cache/src/CacheItemPoolInterface.php | 10 +- .../vendor/psr/http-factory/composer.json | 7 +- .../src/UploadedFileFactoryInterface.php | 12 +- .../vendor/psr/http-message/composer.json | 4 +- .../psr/http-message/src/MessageInterface.php | 24 +- .../psr/http-message/src/RequestInterface.php | 15 +- .../http-message/src/ResponseInterface.php | 8 +- .../src/ServerRequestInterface.php | 24 +- .../psr/http-message/src/StreamInterface.php | 28 +- .../src/UploadedFileInterface.php | 14 +- .../psr/http-message/src/UriInterface.php | 34 +- .../symfony/deprecation-contracts/README.md | 2 +- .../deprecation-contracts/composer.json | 4 +- .../deprecation-contracts/function.php | 2 +- .../event-dispatcher-contracts/Event.php | 5 +- .../EventDispatcherInterface.php | 6 +- .../event-dispatcher-contracts/README.md | 2 +- .../event-dispatcher-contracts/composer.json | 7 +- .../vendor/symfony/finder/CHANGELOG.md | 16 + .../symfony/finder/Comparator/Comparator.php | 93 +- .../finder/Comparator/DateComparator.php | 10 +- .../finder/Comparator/NumberComparator.php | 6 +- .../vendor/symfony/finder/Finder.php | 269 +- .../vendor/symfony/finder/Gitignore.php | 6 +- .../vendor/symfony/finder/Glob.php | 11 +- .../finder/Iterator/CustomFilterIterator.php | 7 +- .../Iterator/DateRangeFilterIterator.php | 7 +- .../Iterator/DepthRangeFilterIterator.php | 7 +- .../ExcludeDirectoryFilterIterator.php | 61 +- .../Iterator/FileTypeFilterIterator.php | 19 +- .../Iterator/FilecontentFilterIterator.php | 13 +- .../Iterator/FilenameFilterIterator.php | 9 +- .../symfony/finder/Iterator/LazyIterator.php | 4 +- .../Iterator/MultiplePcreFilterIterator.php | 28 +- .../finder/Iterator/PathFilterIterator.php | 13 +- .../Iterator/RecursiveDirectoryIterator.php | 56 +- .../Iterator/SizeRangeFilterIterator.php | 7 +- .../finder/Iterator/SortableIterator.php | 71 +- .../Iterator/VcsIgnoredFilterIterator.php | 56 +- .../vendor/symfony/finder/SplFileInfo.php | 24 +- .../vendor/symfony/finder/composer.json | 7 +- .../symfony/http-foundation/Request.php | 5 +- .../service-contracts/Attribute/Required.php | 25 + .../Attribute/SubscribedService.php | 47 + .../symfony/service-contracts/CHANGELOG.md | 5 + .../vendor/symfony/service-contracts/LICENSE | 2 +- .../symfony/service-contracts/README.md | 4 +- .../service-contracts/ResetInterface.php | 3 + .../ServiceCollectionInterface.php | 26 + .../service-contracts/ServiceLocatorTrait.php | 44 +- .../ServiceMethodsSubscriberTrait.php | 80 + .../ServiceProviderInterface.php | 11 +- .../ServiceSubscriberInterface.php | 15 +- .../ServiceSubscriberTrait.php | 67 +- .../Test/ServiceLocatorTest.php | 79 +- .../Test/ServiceLocatorTestCase.php | 97 + .../symfony/service-contracts/composer.json | 20 +- .../vendor/symfony/var-exporter/CHANGELOG.md | 13 + .../Exception/ClassNotFoundException.php | 2 +- .../var-exporter/Exception/LogicException.php | 16 + .../NotInstantiableTypeException.php | 2 +- .../vendor/symfony/var-exporter/Hydrator.php | 78 + .../symfony/var-exporter/Instantiator.php | 63 +- .../var-exporter/Internal/Exporter.php | 72 +- .../var-exporter/Internal/Hydrator.php | 219 +- .../Internal/LazyObjectRegistry.php | 177 + .../var-exporter/Internal/LazyObjectState.php | 133 + .../var-exporter/Internal/LazyObjectTrait.php | 34 + .../var-exporter/Internal/Reference.php | 12 +- .../var-exporter/Internal/Registry.php | 32 +- .../symfony/var-exporter/LazyGhostTrait.php | 409 +++ .../var-exporter/LazyObjectInterface.php | 32 + .../symfony/var-exporter/LazyProxyTrait.php | 355 ++ .../symfony/var-exporter/ProxyHelper.php | 553 +++ .../vendor/symfony/var-exporter/README.md | 119 +- .../symfony/var-exporter/VarExporter.php | 3 +- .../vendor/symfony/var-exporter/composer.json | 10 +- 修复Python依赖.bat | 69 + 创建虚拟环境.bat | 110 + 启动前检查清单.md | 364 ++ 启动移动端.bat | 79 + 启动项目.bat | 2 +- 安装完整依赖.bat | 68 + 导入完整数据库.bat | 45 + 强制关闭并重新导入.py | 0 强制清理并重启.bat | 0 强制重建数据库.py | 73 + 快速启动指南.md | 385 ++ 快速安装依赖.bat | 84 + 故障排查指南.md | 340 ++ 数据库_修正.sql | 2324 ++++++++++++ 数据库配置已修复.md | 170 + 最终验证.py | 25 + 检查ai_friend数据库.py | 41 + 检查fastadmin.py | 20 + 检查磁盘空间.bat | 62 + 测试PHP接口.py | 19 + 测试数据库连接.py | 69 + 直接导入数据库.py | 67 + 移动端APP启动指南.md | 0 移动端使用指南.md | 410 +++ 移动端登录说明.md | 276 ++ 终极修复依赖.bat | 91 + 运行指南.md | 508 +++ 配置PHP扩展.bat | 81 + 配置总结.md | 383 ++ 重启服务.bat | 49 + 重新导入数据库.bat | 25 + 项目启动总结.md | 224 ++ 验证.py | 15 + 254 files changed, 18570 insertions(+), 4614 deletions(-) create mode 100644 0.4 create mode 100644 xuniYou/按住说话调试指南.md create mode 100644 xuniYou/语音通话配置说明.md create mode 100644 xuniYou/麦克风图标说明.md create mode 100644 xunifriend_RaeeC/composer.lock create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/.editorconfig delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Bigint.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CentralDirectoryFileHeader.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CompressionMethod.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/DataDescriptor.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/DeflateStream.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/EndOfCentralDirectory.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/DosTimeOverflowException.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/EncodingException.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/FileSizeIncorrectException.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/ResourceActionException.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/SimulationFileUnknownException.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/StreamNotSeekableException.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/GeneralPurposeBitFlag.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/LocalFileHeader.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/OperationMode.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Archive.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/File.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Method.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Version.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/PackField.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream/CallbackStreamWrapper.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Time.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Version.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zip64/DataDescriptor.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zip64/EndOfCentralDirectory.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zip64/EndOfCentralDirectoryLocator.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zip64/ExtendedInformationExtraField.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zs/ExtendedInformationExtraField.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Assertions.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/BigintTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CallbackOutputTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CentralDirectoryFileHeaderTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/DataDescriptorTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndOfCentralDirectoryTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndlessCycleStream.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/FaultInjectionResource.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/LocalFileHeaderTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/PackFieldTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ResourceStream.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Tempfile.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/TimeTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Util.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/DataDescriptorTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryLocatorTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/ExtendedInformationExtraFieldTest.php create mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zs/ExtendedInformationExtraFieldTest.php delete mode 100644 xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/LICENSE delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/README.md delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/SECURITY.md delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/composer.json delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/src/Enum.php delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php delete mode 100644 xunifriend_RaeeC/vendor/myclabs/php-enum/stubs/Stringable.php create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/Required.php create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/SubscribedService.php create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/CHANGELOG.md create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceCollectionInterface.php create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php create mode 100644 xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/LogicException.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/Hydrator.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectState.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/LazyGhostTrait.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/LazyObjectInterface.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/LazyProxyTrait.php create mode 100644 xunifriend_RaeeC/vendor/symfony/var-exporter/ProxyHelper.php create mode 100644 修复Python依赖.bat create mode 100644 创建虚拟环境.bat create mode 100644 启动前检查清单.md create mode 100644 启动移动端.bat create mode 100644 安装完整依赖.bat create mode 100644 导入完整数据库.bat create mode 100644 强制关闭并重新导入.py create mode 100644 强制清理并重启.bat create mode 100644 强制重建数据库.py create mode 100644 快速启动指南.md create mode 100644 快速安装依赖.bat create mode 100644 故障排查指南.md create mode 100644 数据库_修正.sql create mode 100644 数据库配置已修复.md create mode 100644 最终验证.py create mode 100644 检查ai_friend数据库.py create mode 100644 检查fastadmin.py create mode 100644 检查磁盘空间.bat create mode 100644 测试PHP接口.py create mode 100644 测试数据库连接.py create mode 100644 直接导入数据库.py create mode 100644 移动端APP启动指南.md create mode 100644 移动端使用指南.md create mode 100644 移动端登录说明.md create mode 100644 终极修复依赖.bat create mode 100644 运行指南.md create mode 100644 配置PHP扩展.bat create mode 100644 配置总结.md create mode 100644 重启服务.bat create mode 100644 重新导入数据库.bat create mode 100644 项目启动总结.md create mode 100644 验证.py diff --git a/.env b/.env index c76967f..a7c7b19 100644 --- a/.env +++ b/.env @@ -7,7 +7,7 @@ DEBUG=True BACKEND_URL=http://127.0.0.1:8000 # ===== 数据库配置 ===== -DATABASE_URL=mysql+pymysql://fastadmin:root@1.15.149.240:3306/fastadmin?charset=utf8mb4 +DATABASE_URL=mysql+pymysql://root:rootx77@localhost:3306/fastadmin?charset=utf8mb4 # ===== 用户信息接口 (PHP后端) ===== # PHP 后端地址,用于用户认证 diff --git a/0.4 b/0.4 new file mode 100644 index 0000000..2771592 --- /dev/null +++ b/0.4 @@ -0,0 +1,53 @@ +Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple +Requirement already satisfied: fastapi in d:\environment\python\lib\site-packages (0.133.1) +Requirement already satisfied: sqlalchemy in d:\environment\python\lib\site-packages (2.0.47) +Requirement already satisfied: pymysql in d:\environment\python\lib\site-packages (1.1.2) +Requirement already satisfied: pydantic in d:\environment\python\lib\site-packages (2.12.5) +Requirement already satisfied: pydantic-settings in d:\environment\python\lib\site-packages (2.13.1) +Requirement already satisfied: python-dotenv in d:\environment\python\lib\site-packages (1.2.1) +Requirement already satisfied: requests in d:\environment\python\lib\site-packages (2.32.5) +Requirement already satisfied: oss2 in d:\environment\python\lib\site-packages (2.19.1) +Requirement already satisfied: dashscope in d:\environment\python\lib\site-packages (1.25.12) +Requirement already satisfied: pyyaml in d:\environment\python\lib\site-packages (6.0.3) +Requirement already satisfied: imageio-ffmpeg in d:\environment\python\lib\site-packages (0.6.0) +Collecting python-multipart + Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl (24 kB) +Requirement already satisfied: uvicorn[standard] in d:\environment\python\lib\site-packages (0.41.0) +Requirement already satisfied: starlette>=0.40.0 in d:\environment\python\lib\site-packages (from fastapi) (0.52.1) +Requirement already satisfied: typing-extensions>=4.8.0 in d:\environment\python\lib\site-packages (from fastapi) (4.15.0) +Requirement already satisfied: typing-inspection>=0.4.2 in d:\environment\python\lib\site-packages (from fastapi) (0.4.2) +Requirement already satisfied: annotated-doc>=0.0.2 in d:\environment\python\lib\site-packages (from fastapi) (0.0.4) +Requirement already satisfied: click>=7.0 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (8.3.1) +Requirement already satisfied: h11>=0.8 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (0.16.0) +Requirement already satisfied: colorama>=0.4 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (0.4.6) +Requirement already satisfied: httptools>=0.6.3 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (0.7.1) +Requirement already satisfied: watchfiles>=0.20 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (1.1.1) +Requirement already satisfied: websockets>=10.4 in d:\environment\python\lib\site-packages (from uvicorn[standard]) (16.0) +Requirement already satisfied: greenlet>=1 in d:\environment\python\lib\site-packages (from sqlalchemy) (3.3.2) +Requirement already satisfied: annotated-types>=0.6.0 in d:\environment\python\lib\site-packages (from pydantic) (0.7.0) +Requirement already satisfied: pydantic-core==2.41.5 in d:\environment\python\lib\site-packages (from pydantic) (2.41.5) +Requirement already satisfied: charset_normalizer<4,>=2 in d:\environment\python\lib\site-packages (from requests) (3.4.4) +Requirement already satisfied: idna<4,>=2.5 in d:\environment\python\lib\site-packages (from requests) (3.11) +Requirement already satisfied: urllib3<3,>=1.21.1 in d:\environment\python\lib\site-packages (from requests) (2.6.3) +Requirement already satisfied: certifi>=2017.4.17 in d:\environment\python\lib\site-packages (from requests) (2026.2.25) +Requirement already satisfied: crcmod>=1.7 in d:\environment\python\lib\site-packages (from oss2) (1.7) +Requirement already satisfied: pycryptodome>=3.4.7 in d:\environment\python\lib\site-packages (from oss2) (3.23.0) +Requirement already satisfied: aliyun-python-sdk-kms>=2.4.1 in d:\environment\python\lib\site-packages (from oss2) (2.16.5) +Requirement already satisfied: aliyun-python-sdk-core>=2.13.12 in d:\environment\python\lib\site-packages (from oss2) (2.16.0) +Requirement already satisfied: six in d:\environment\python\lib\site-packages (from oss2) (1.17.0) +Requirement already satisfied: aiohttp in d:\environment\python\lib\site-packages (from dashscope) (3.13.3) +Requirement already satisfied: websocket-client in d:\environment\python\lib\site-packages (from dashscope) (1.9.0) +Requirement already satisfied: cryptography in d:\environment\python\lib\site-packages (from dashscope) (46.0.5) +Requirement already satisfied: jmespath<1.0.0,>=0.9.3 in d:\environment\python\lib\site-packages (from aliyun-python-sdk-core>=2.13.12->oss2) (0.10.0) +Requirement already satisfied: cffi>=2.0.0 in d:\environment\python\lib\site-packages (from cryptography->dashscope) (2.0.0) +Requirement already satisfied: pycparser in d:\environment\python\lib\site-packages (from cffi>=2.0.0->cryptography->dashscope) (3.0) +Requirement already satisfied: anyio<5,>=3.6.2 in d:\environment\python\lib\site-packages (from starlette>=0.40.0->fastapi) (4.12.1) +Requirement already satisfied: aiohappyeyeballs>=2.5.0 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (2.6.1) +Requirement already satisfied: aiosignal>=1.4.0 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (1.4.0) +Requirement already satisfied: attrs>=17.3.0 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (25.4.0) +Requirement already satisfied: frozenlist>=1.1.1 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (1.8.0) +Requirement already satisfied: multidict<7.0,>=4.5 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (6.7.1) +Requirement already satisfied: propcache>=0.2.0 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (0.4.1) +Requirement already satisfied: yarl<2.0,>=1.17.0 in d:\environment\python\lib\site-packages (from aiohttp->dashscope) (1.22.0) +Installing collected packages: python-multipart +Successfully installed python-multipart-0.0.22 diff --git a/lover/.env b/lover/.env index f87e7b6..e5db62e 100644 --- a/lover/.env +++ b/lover/.env @@ -1,2 +1,2 @@ -DATABASE_URL=mysql+pymysql://fastadmin:root@1.15.149.240:3306/fastadmin?charset=utf8mb4 -USER_INFO_API=http://1.15.149.240:30100/api/user_basic/get_user_basic \ No newline at end of file +DATABASE_URL=mysql+pymysql://root:rootx77@localhost:3306/fastadmin?charset=utf8mb4 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic \ No newline at end of file diff --git a/xuniYou/.hbuilderx/launch.json b/xuniYou/.hbuilderx/launch.json index f98344b..a816f72 100644 --- a/xuniYou/.hbuilderx/launch.json +++ b/xuniYou/.hbuilderx/launch.json @@ -26,7 +26,7 @@ "customPlaygroundType" : "device", "localRepoPath" : "C:/Users/Administrator/Desktop/Project/AI_GirlFriend/xuniYou", "packageName" : "uni.app.UNIF098CA6", - "playground" : "standard", + "playground" : "custom", "type" : "uni-app:app-android" }, { diff --git a/xuniYou/manifest.json b/xuniYou/manifest.json index 33163d1..c8659be 100644 --- a/xuniYou/manifest.json +++ b/xuniYou/manifest.json @@ -43,7 +43,9 @@ "", "", "", - "" + "", + "", + "" ], "minSdkVersion" : 24 }, diff --git a/xuniYou/pages/chat/phone.vue b/xuniYou/pages/chat/phone.vue index 0024d3f..95b7598 100644 --- a/xuniYou/pages/chat/phone.vue +++ b/xuniYou/pages/chat/phone.vue @@ -7,6 +7,10 @@ :src="loverBasicList.image_url ? loverBasicList.image_url : 'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20251226/39c6f8899c15f60fc59207835f95e07a.png'" mode="aspectFill"> + + + {{ micEnabled ? '🎤' : '🔇' }} + {{ isVip ? 'VIP 无限通话' : '通话剩余时间' }} @@ -23,14 +27,19 @@ - + 挂断 - + + - 麦克风权限 + {{ isTalking ? '松开结束' : '按住说话' }} @@ -58,7 +67,10 @@ import notHave from '@/components/not-have.vue'; import { baseURLPy } from '@/utils/request.js' import topSafety from '@/components/top-safety.vue'; - const recorderManager = uni.getRecorderManager(); + + // 在组件外部初始化 recorderManager + let recorderManager = null; + export default { components: { notHave, @@ -81,7 +93,9 @@ totalDuration: 300000, // 默认 5 分钟 remainingTime: 300000, timer: null, - isVip: false + isVip: false, + isTalking: false, // 是否正在说话 + micEnabled: true // 麦克风是否开启 } }, onLoad() { @@ -90,6 +104,12 @@ console.log('systemInfo', systemInfo) // console.log('plus', plus) this.isApp = systemInfo.uniPlatform === 'app' + + // 初始化 recorderManager(非 App 端) + if (!this.isApp) { + recorderManager = uni.getRecorderManager(); + } + this.getCallDuration() this.initAudio() }, @@ -222,8 +242,9 @@ success: () => console.log('WS 连接成功') }); this.socketTask.onOpen((res) => { - console.log('onOpen:', res) - this.startRecording(); + console.log('WebSocket onOpen:', res) + // 不要在这里自动开始录音,等用户按住按钮时再开始 + // this.startRecording(); this.startTimer(); }); this.socketTask.onMessage((res) => { @@ -234,65 +255,138 @@ console.error('WS 错误', err); }); this.socketTask.onClose((res) => { - console.log('关闭:', res) - if (this.isApp) { - console.log('关闭1:', recorder) + console.log('WebSocket 关闭:', res) + if (this.isApp && this.isRecording) { + console.log('关闭录音') recorder.stop() } }) }, // 开始录制 async startRecording() { - console.log('开始录制', ) - if (this.isRecording) return; + console.log('=== startRecording 被调用 ===') + console.log('isRecording:', this.isRecording) + console.log('isApp:', this.isApp) + console.log('socketTask 状态:', this.socketTask ? this.socketTask.readyState : 'null') + + if (this.isRecording) { + console.log('录音已在进行中,跳过') + return; + } - // App 端不支持 onFrameRecorded this.isRecording = true; this.status = 'Call Started'; + if (this.isApp) { - console.log('this.isApp:', this.isApp) + console.log('App 端:启动原生录音') this.startRecord() } else { // 小程序和 H5 端支持 onFrameRecorded + if (!recorderManager) { + console.error('recorderManager 未初始化') + uni.showToast({ + title: '录音功能初始化失败', + icon: 'none' + }) + this.isRecording = false + return + } + + console.log('小程序/H5 端:设置录音监听器') + + // 监听录音开始 + recorderManager.onStart(() => { + console.log('✅ 录音已开始') + }) + + // 监听录音错误 + recorderManager.onError((err) => { + console.error('❌ 录音错误:', err) + uni.showToast({ + title: '录音失败: ' + (err.errMsg || '未知错误'), + icon: 'none' + }) + this.isRecording = false + }) + + // 监听录音停止 + recorderManager.onStop((res) => { + console.log('录音已停止:', res) + }) + + // 监听音频帧 recorderManager.onFrameRecorded((res) => { - // console.log('onFrameRecorded:', res) const { frameBuffer, isLastFrame } = res; - if (this.socketTask && this.socketTask.readyState === 1) { + + console.log('收到音频帧, isTalking:', this.isTalking, 'frameBuffer size:', frameBuffer.byteLength) + + // 只有在说话状态下才发送音频数据 + if (this.isTalking && this.socketTask && this.socketTask.readyState === 1) { + console.log('✅ 发送音频数据到服务器') this.socketTask.send({ - data: frameBuffer + data: frameBuffer, + success: () => { + console.log('音频数据发送成功') + }, + fail: (err) => { + console.error('音频数据发送失败:', err) + } }); + } else { + console.log('⏸️ 不发送音频数据 - isTalking:', this.isTalking, 'socketTask.readyState:', this.socketTask ? this.socketTask.readyState : 'null') } }); - recorderManager.start({ - duration: this.totalDuration, - format: 'pcm', // ⚠️ 必须用 PCM,Paraformer 实时版只吃 PCM - sampleRate: 16000, // ⚠️ 必须 16000Hz,这是 ASR 的标准 - numberOfChannels: 1, // 单声道 - frameSize: 2, // 单位是 KB。设置小一点(2-4KB)延迟低,设置太大延迟高 - audioSource: 'voice_communication' - }); + + console.log('启动 recorderManager') + try { + recorderManager.start({ + duration: this.totalDuration, + format: 'pcm', // ⚠️ 必须用 PCM,Paraformer 实时版只吃 PCM + sampleRate: 16000, // ⚠️ 必须 16000Hz,这是 ASR 的标准 + numberOfChannels: 1, // 单声道 + frameSize: 2, // 单位是 KB。设置小一点(2-4KB)延迟低,设置太大延迟高 + audioSource: 'voice_communication' + }); + console.log('recorderManager.start 已调用') + } catch (err) { + console.error('启动录音失败:', err) + this.isRecording = false + uni.showToast({ + title: '启动录音失败', + icon: 'none' + }) + } } - }, startRecord() { + console.log('=== startRecord (App原生) 被调用 ===') const doStart = () => { + console.log('开始启动原生录音器') recorder.start({ sampleRate: 16000, frameSize: 640, source: 'mic' }, (res) => { - // console.log('socket---res',res) if (res.type === 'frame') { const ab = uni.base64ToArrayBuffer(res.data) - // console.log('ab',ab) - this.socketTask.send({ - data: ab - }) + + console.log('收到原生音频帧, isTalking:', this.isTalking, 'buffer size:', ab.byteLength) + + // 只有在说话状态下才发送音频数据 + if (this.isTalking && this.socketTask && this.socketTask.readyState === 1) { + console.log('发送原生音频数据到服务器') + this.socketTask.send({ + data: ab + }) + } else { + console.log('不发送原生音频数据 - isTalking:', this.isTalking) + } } }) + console.log('原生录音器已启动') } if (uni.getSystemInfoSync().platform !== 'android') { @@ -302,27 +396,89 @@ if (typeof plus === 'undefined') { // 还没到 plusready + console.log('等待 plusready') document.addEventListener('plusready', () => { plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], (e) => { - if (e.granted && e.granted.length) doStart() - else uni.showModal({ - title: '权限不足', - content: '请允许麦克风权限' - }) + if (e.granted && e.granted.length) { + console.log('录音权限已授予') + doStart() + } else { + console.error('录音权限被拒绝') + uni.showModal({ + title: '权限不足', + content: '请允许麦克风权限' + }) + } }) }) return } + console.log('请求录音权限') plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], (e) => { - console.log('e.granted', e.granted) - if (e.granted && e.granted.length) doStart() - else uni.showModal({ - title: '权限不足', - content: '请允许麦克风权限' - }) + console.log('权限请求结果:', e) + if (e.granted && e.granted.length) { + console.log('录音权限已授予') + doStart() + } else { + console.error('录音权限被拒绝') + uni.showModal({ + title: '权限不足', + content: '请允许麦克风权限' + }) + } }) }, + // 切换麦克风权限开关 + toggleMicPermission() { + this.micEnabled = !this.micEnabled + if (this.micEnabled) { + uni.showToast({ + title: '麦克风已开启', + icon: 'none' + }) + } else { + uni.showToast({ + title: '麦克风已关闭', + icon: 'none' + }) + // 如果正在说话,停止录音 + if (this.isTalking) { + this.stopTalking() + } + } + }, + // 开始说话(按住) + startTalking() { + console.log('startTalking 被调用, micEnabled:', this.micEnabled, 'isRecording:', this.isRecording) + + if (!this.micEnabled) { + uni.showToast({ + title: '请先开启麦克风权限', + icon: 'none' + }) + return + } + + this.isTalking = true + console.log('开始说话, isTalking 设置为:', this.isTalking) + + // 如果录音还没开始,先启动录音 + if (!this.isRecording) { + console.log('录音未启动,开始启动录音') + this.startRecording() + } else { + console.log('录音已在运行') + } + }, + // 停止说话(松开) + stopTalking() { + this.isTalking = false + console.log('停止说话, isTalking 设置为:', this.isTalking) + + // 注意:不要停止录音,只是停止发送数据 + // 录音会持续进行,但数据不会被发送到服务器 + }, openMicPermission() { plus.android.requestPermissions(['android.permission.RECORD_AUDIO'], (e) => { console.log('e.granted', e) @@ -341,7 +497,9 @@ }, stopCall() { this.isRecording = false; - recorderManager.stop(); + if (recorderManager) { + recorderManager.stop(); + } if (this.socketTask) { this.socketTask.close(); } @@ -908,13 +1066,36 @@ } } + /* 麦克风权限开关样式 */ + .mic-permission-switch { + position: absolute; + right: 28rpx; + top: 100rpx; + z-index: 10; + width: 80rpx; + height: 80rpx; + background: rgba(0, 0, 0, 0.3); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(10rpx); + } + + .mic-emoji { + font-size: 48rpx; + } + .opt { position: absolute; left: 0; right: 0; bottom: 15%; - margin: 0 140rpx; + margin: 0 auto; z-index: 5; + display: flex; + justify-content: center; + gap: 100rpx; } .opt_item { @@ -937,6 +1118,19 @@ text-align: center; } + /* 按住说话按钮样式 */ + .mic-button { + transition: transform 0.2s; + } + + .mic-button.talking { + transform: scale(1.1); + } + + .mic-button.talking .opt_image { + box-shadow: 0 0 20rpx rgba(159, 71, 255, 0.8); + } + .black { position: absolute; left: 0; diff --git a/xuniYou/utils/request.js b/xuniYou/utils/request.js index b22a2c2..3900195 100644 --- a/xuniYou/utils/request.js +++ b/xuniYou/utils/request.js @@ -1,7 +1,7 @@ // Windows 本地开发 - 混合架构 -export const baseURL = 'http://192.168.1.164:30100' // PHP 处理用户管理和界面 +export const baseURL = 'http://192.168.1.141:30100' // PHP 处理用户管理和界面 // export const baseURL = 'http://1.15.149.240:30100' // PHP 处理用户管理和界面 -export const baseURLPy = 'http://192.168.1.164:30101' // FastAPI 处理 AI 功能 +export const baseURLPy = 'http://192.168.1.141:30101' // FastAPI 处理 AI 功能 // export const baseURLPy = 'http://1.15.149.240:30101' // FastAPI 处理 AI 功能 // 远程服务器 - 需要时取消注释 diff --git a/xuniYou/按住说话调试指南.md b/xuniYou/按住说话调试指南.md new file mode 100644 index 0000000..949aa8c --- /dev/null +++ b/xuniYou/按住说话调试指南.md @@ -0,0 +1,161 @@ +# 按住说话功能调试指南 + +## 问题现象 +按住说话按钮后,日志显示"开始说话"和"停止说话",但没有音频数据发送。 + +## 已添加的调试日志 + +### 1. 按住按钮时 +``` +startTalking 被调用, micEnabled: true, isRecording: false +开始说话, isTalking 设置为: true +录音未启动,开始启动录音 +``` + +### 2. 录音启动时 +``` +=== startRecording 被调用 === +isRecording: false +isApp: true/false +socketTask 状态: 1 (1表示已连接) +``` + +### 3. App 端原生录音 +``` +=== startRecord (App原生) 被调用 === +请求录音权限 +权限请求结果: {...} +录音权限已授予 +开始启动原生录音器 +原生录音器已启动 +收到原生音频帧, isTalking: true, buffer size: xxx +✅ 发送原生音频数据到服务器 +``` + +### 4. 小程序/H5 端录音 +``` +小程序/H5 端:设置录音监听器 +启动 recorderManager +recorderManager.start 已调用 +✅ 录音已开始 +收到音频帧, isTalking: true, frameBuffer size: xxx +✅ 发送音频数据到服务器 +音频数据发送成功 +``` + +## 检查清单 + +### 1. WebSocket 连接状态 +查看日志中的 `socketTask 状态`: +- `0` = CONNECTING (连接中) +- `1` = OPEN (已连接) ✅ +- `2` = CLOSING (关闭中) +- `3` = CLOSED (已关闭) + +如果不是 `1`,说明 WebSocket 未连接成功。 + +### 2. 录音权限 +App 端查看: +``` +权限请求结果: { granted: [...], deniedAlways: [], deniedPresent: [] } +``` +- `granted` 数组应该包含 `android.permission.RECORD_AUDIO` +- 如果在 `deniedAlways` 或 `deniedPresent` 中,需要手动授权 + +### 3. 录音是否真正启动 +查看是否有: +- App 端:`原生录音器已启动` +- 小程序端:`✅ 录音已开始` + +如果没有,可能是: +- 权限被拒绝 +- recorderManager 初始化失败 +- 录音参数不支持 + +### 4. 音频帧是否产生 +查看是否有: +- `收到音频帧` 或 `收到原生音频帧` + +如果没有,说明录音器没有产生音频数据。 + +### 5. isTalking 状态 +查看日志中的 `isTalking` 值: +- 按住时应该是 `true` +- 松开时应该是 `false` + +如果一直是 `false`,说明状态没有正确更新。 + +## 常见问题及解决方案 + +### 问题1:录音权限被拒绝 +**现象**:日志显示 `录音权限被拒绝` + +**解决**: +1. 进入手机设置 → 应用管理 → 找到你的应用 +2. 权限管理 → 麦克风 → 允许 + +### 问题2:recorderManager 未初始化 +**现象**:日志显示 `recorderManager 未初始化` + +**解决**: +1. 确认 manifest.json 中 `Record` 模块已启用 +2. 重新编译项目 +3. 检查是否在 App 端(App 端不使用 recorderManager) + +### 问题3:WebSocket 未连接 +**现象**:`socketTask 状态: null` 或不是 `1` + +**解决**: +1. 检查后端服务是否启动 +2. 检查 WebSocket URL 是否正确 +3. 检查 token 是否有效 + +### 问题4:音频帧不发送 +**现象**:有 `收到音频帧` 但没有 `发送音频数据` + +**解决**: +1. 检查 `isTalking` 是否为 `true` +2. 检查 `socketTask.readyState` 是否为 `1` +3. 确认按住按钮时没有松开 + +### 问题5:录音格式不支持 +**现象**:录音启动失败或报错 + +**解决**: +尝试修改录音参数: +```javascript +recorderManager.start({ + format: 'mp3', // 改为 mp3 试试 + sampleRate: 16000, + numberOfChannels: 1, + frameSize: 1 // 改小一点 +}); +``` + +## 测试步骤 + +1. **清空控制台** +2. **进入语音通话页面** + - 查看 WebSocket 是否连接成功 + - 查看是否有 `WebSocket onOpen` 日志 + +3. **按住"按住说话"按钮** + - 应该看到 `startTalking 被调用` + - 应该看到 `isTalking 设置为: true` + - 应该看到 `=== startRecording 被调用 ===` + - 应该看到录音启动成功的日志 + +4. **保持按住 2-3 秒** + - 应该看到多个 `收到音频帧` 日志 + - 应该看到多个 `✅ 发送音频数据到服务器` 日志 + +5. **松开按钮** + - 应该看到 `停止说话, isTalking 设置为: false` + - 之后的音频帧应该显示 `⏸️ 不发送音频数据` + +## 下一步 + +如果按照上述步骤仍然无法工作,请: +1. 截图完整的控制台日志 +2. 说明是在什么平台测试(App/小程序/H5) +3. 说明具体卡在哪一步 diff --git a/xuniYou/语音通话配置说明.md b/xuniYou/语音通话配置说明.md new file mode 100644 index 0000000..f9c77e9 --- /dev/null +++ b/xuniYou/语音通话配置说明.md @@ -0,0 +1,101 @@ +# 语音通话功能配置说明 + +## 已完成的配置 + +### 1. manifest.json 配置 + +已添加以下权限: + +#### Android 权限 +```json +"", +"" +``` + +#### iOS 权限 +```json +"privacyDescription" : { + "NSMicrophoneUsageDescription" : "与模拟女友聊天" +} +``` + +#### 模块配置 +```json +"modules" : { + "Record" : {}, + "Camera" : {}, + "VideoPlayer" : {}, + "OAuth" : {} +} +``` + +### 2. 小程序配置 + +微信小程序权限已配置: +```json +"permission" : { + "scope.record" : { + "desc" : "你的麦克风将用于音频录制" + } +} +``` + +## 使用说明 + +### 按住说话功能 + +1. **进入语音通话页面**:录音会自动初始化 +2. **按住麦克风按钮**:开始发送音频数据 +3. **松开按钮**:停止发送音频数据(录音继续但不发送) +4. **右上角开关**:控制麦克风权限的开启/关闭 + +### 交互逻辑 + +- 🎤 表示麦克风已开启 +- 🔇 表示麦克风已关闭 +- 按住说话时按钮会放大并发光 +- 如果麦克风关闭,按住说话会提示"请先开启麦克风权限" + +## 重新编译 + +修改 manifest.json 后需要: + +1. **App 端**:重新打包(云打包或本地打包) +2. **小程序端**:重新编译并上传 +3. **H5 端**:重新编译即可 + +## 调试建议 + +### 控制台日志 +- 查看 "开始录制" 日志确认录音启动 +- 查看 "开始说话" / "停止说话" 日志确认按钮事件 +- 查看 WebSocket 连接状态 + +### 常见问题 + +1. **录音权限被拒绝** + - Android:检查应用权限设置 + - iOS:检查隐私设置中的麦克风权限 + - 小程序:首次使用会弹出授权提示 + +2. **recorderManager 未定义** + - 已修复:现在会在 onLoad 时根据平台初始化 + - App 端使用原生插件,小程序端使用 uni.getRecorderManager() + +3. **音频数据未发送** + - 确保 WebSocket 连接成功 + - 确保按住了说话按钮 + - 确保麦克风权限已开启 + +## 技术细节 + +### 录音参数 +- 格式:PCM +- 采样率:16000Hz +- 声道:单声道 +- 帧大小:2KB(低延迟) + +### 按住说话实现 +- 使用 `@touchstart` 和 `@touchend` 事件 +- 录音持续进行,但只在按住时发送数据 +- 避免频繁启停录音造成的延迟 diff --git a/xuniYou/麦克风图标说明.md b/xuniYou/麦克风图标说明.md new file mode 100644 index 0000000..fdef654 --- /dev/null +++ b/xuniYou/麦克风图标说明.md @@ -0,0 +1,41 @@ +# 麦克风图标说明 + +语音通话页面需要以下两个图标文件: + +## 需要的图标 + +1. `/static/images/mic_on.png` - 麦克风开启状态图标 +2. `/static/images/mic_off.png` - 麦克风关闭状态图标 + +## 图标规格建议 + +- 尺寸:48x48 像素(或更高分辨率) +- 格式:PNG(支持透明背景) +- 颜色:白色或浅色(因为背景是半透明黑色) + +## 临时解决方案 + +如果暂时没有这些图标,可以: + +1. 使用现有的 `/static/images/phone_a1.png` 作为临时图标 +2. 或者在代码中使用文字代替图标 + +## 修改方式(如果使用现有图标) + +在 `xuniYou/pages/chat/phone.vue` 中找到: + +```vue + +``` + +替换为: + +```vue + +``` + +或使用文字: + +```vue +{{ micEnabled ? '🎤' : '🔇' }} +``` diff --git a/xunifriend_RaeeC/.env b/xunifriend_RaeeC/.env index 762e1ba..d45fdf4 100644 --- a/xunifriend_RaeeC/.env +++ b/xunifriend_RaeeC/.env @@ -3,10 +3,10 @@ app_trace = false [database] type = mysql -hostname = 1.15.149.240 +hostname = localhost database = fastadmin -username = fastadmin -password = root +username = root +password = rootx77 hostport = 3306 charset = utf8mb4 prefix = nf_ diff --git a/xunifriend_RaeeC/application/common/controller/Api.php b/xunifriend_RaeeC/application/common/controller/Api.php index 9739748..994259d 100644 --- a/xunifriend_RaeeC/application/common/controller/Api.php +++ b/xunifriend_RaeeC/application/common/controller/Api.php @@ -69,7 +69,7 @@ class Api * @access public * @param Request $request Request 对象 */ - public function __construct(Request $request = null) + public function __construct(?Request $request = null) { $this->request = is_null($request) ? Request::instance() : $request; diff --git a/xunifriend_RaeeC/composer.lock b/xunifriend_RaeeC/composer.lock new file mode 100644 index 0000000..5730b1a --- /dev/null +++ b/xunifriend_RaeeC/composer.lock @@ -0,0 +1,3133 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "6bdc55def8f268e8e193323e98b04718", + "packages": [ + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "easywechat-composer/easywechat-composer", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/mingyoung/easywechat-composer.git", + "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", + "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.0" + }, + "require-dev": { + "composer/composer": "^1.0 || ^2.0", + "phpunit/phpunit": "^6.5 || ^7.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EasyWeChatComposer\\Plugin" + }, + "autoload": { + "psr-4": { + "EasyWeChatComposer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "张铭阳", + "email": "mingyoungcheung@gmail.com" + } + ], + "description": "The composer plugin for EasyWeChat", + "support": { + "issues": "https://github.com/mingyoung/easywechat-composer/issues", + "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1" + }, + "time": "2021-07-05T04:03:22+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "time": "2025-10-17T16:34:55+00:00" + }, + { + "name": "fastadminnet/fastadmin-addons", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/fastadminnet/fastadmin-addons.git", + "reference": "5a02139c773821c9ac646b7950fedf6950330054" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fastadminnet/fastadmin-addons/zipball/5a02139c773821c9ac646b7950fedf6950330054", + "reference": "5a02139c773821c9ac646b7950fedf6950330054", + "shasum": "" + }, + "require": { + "nelexa/zip": "^3.3 || ^4.0", + "php": ">=7.1.0" + }, + "type": "library", + "extra": { + "think-config": { + "addons": "src/config.php" + } + }, + "autoload": { + "files": [ + "src/common.php" + ], + "psr-4": { + "think\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Karson", + "email": "karson@fastadmin.net" + }, + { + "name": "xiaobo.sun", + "email": "xiaobo.sun@qq.com" + } + ], + "description": "addons package for fastadmin", + "homepage": "https://github.com/fastadminnet/fastadmin-addons", + "support": { + "issues": "https://github.com/fastadminnet/fastadmin-addons/issues", + "source": "https://github.com/fastadminnet/fastadmin-addons/tree/v1.4.4" + }, + "time": "2026-01-15T03:02:43+00:00" + }, + { + "name": "fastadminnet/fastadmin-mailer", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/fastadminnet/fastadmin-mailer.git", + "reference": "bca635ac5f564ed6688d818d215021ffb0813746" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fastadminnet/fastadmin-mailer/zipball/bca635ac5f564ed6688d818d215021ffb0813746", + "reference": "bca635ac5f564ed6688d818d215021ffb0813746", + "shasum": "" + }, + "require": { + "php": ">=7.4", + "psr/log": "~1.0" + }, + "require-dev": { + "monolog/monolog": "~1.13", + "phpunit/phpunit": "~5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tx\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cloud", + "email": "cloud@txthinking.com", + "homepage": "http://www.txthinking.com", + "role": "Thinker" + }, + { + "name": "Matt Sowers", + "email": "msowers@erblearn.org" + } + ], + "description": "A very lightweight PHP SMTP mail sender", + "homepage": "https://github.com/fastadminnet/fastadmin-mailer", + "keywords": [ + "mail", + "smtp" + ], + "support": { + "source": "https://github.com/fastadminnet/fastadmin-mailer/tree/v2.1.1" + }, + "time": "2025-06-25T10:21:31+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-08-23T21:21:41+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.3" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.86", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^12.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-12-10T09:58:31+00:00" + }, + { + "name": "maniac/easemob-php", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/easemob/im-php-server-sdk.git", + "reference": "36b550328c9911957becde2fd62b9379ba45865c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easemob/im-php-server-sdk/zipball/36b550328c9911957becde2fd62b9379ba45865c", + "reference": "36b550328c9911957becde2fd62b9379ba45865c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "tests\\": "tests/", + "Easemob\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "maniac", + "email": "maniac.liu@easemob.com" + } + ], + "description": "PHP Server SDK for IM.", + "support": { + "issues": "https://github.com/easemob/im-php-server-sdk/issues", + "source": "https://github.com/easemob/im-php-server-sdk/tree/1.0.0" + }, + "time": "2022-06-13T07:32:04+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "37308608e599f34a1a4845b16440047ec98a172a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/37308608e599f34a1a4845b16440047ec98a172a", + "reference": "37308608e599f34a1a4845b16440047ec98a172a", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.11.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-01T13:05:00+00:00" + }, + { + "name": "nelexa/zip", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/Ne-Lexa/php-zip.git", + "reference": "88a1b6549be813278ff2dd3b6b2ac188827634a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Ne-Lexa/php-zip/zipball/88a1b6549be813278ff2dd3b6b2ac188827634a7", + "reference": "88a1b6549be813278ff2dd3b6b2ac188827634a7", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^7.4 || ^8.0", + "psr/http-message": "*", + "symfony/finder": "*" + }, + "require-dev": { + "ext-bz2": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-iconv": "*", + "ext-openssl": "*", + "ext-xml": "*", + "friendsofphp/php-cs-fixer": "^3.4.0", + "guzzlehttp/psr7": "^1.6", + "phpunit/phpunit": "^9", + "symfony/http-foundation": "*", + "symfony/var-dumper": "*", + "vimeo/psalm": "^4.6" + }, + "suggest": { + "ext-bz2": "Needed to support BZIP2 compression", + "ext-fileinfo": "Needed to get mime-type file", + "ext-iconv": "Needed to support convert zip entry name to requested character encoding", + "ext-openssl": "Needed to support encrypt zip entries or use ext-mcrypt" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpZip\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ne-Lexa", + "email": "alexey@nelexa.ru", + "role": "Developer" + } + ], + "description": "PhpZip is a php-library for extended work with ZIP-archives. Open, create, update, delete, extract and get info tool. Supports appending to existing ZIP files, WinZip AES encryption, Traditional PKWARE Encryption, BZIP2 compression, external file attributes and ZIP64 extensions. Alternative ZipArchive. It does not require php-zip extension.", + "homepage": "https://github.com/Ne-Lexa/php-zip", + "keywords": [ + "archive", + "extract", + "unzip", + "winzip", + "zip", + "ziparchive" + ], + "support": { + "issues": "https://github.com/Ne-Lexa/php-zip/issues", + "source": "https://github.com/Ne-Lexa/php-zip/tree/4.0.2" + }, + "time": "2022-06-17T11:17:46+00:00" + }, + { + "name": "overtrue/pinyin", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/overtrue/pinyin.git", + "reference": "3b781d267197b74752daa32814d3a2cf5d140779" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/pinyin/zipball/3b781d267197b74752daa32814d3a2cf5d140779", + "reference": "3b781d267197b74752daa32814d3a2cf5d140779", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\Pinyin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Carlos", + "homepage": "http://github.com/overtrue" + } + ], + "description": "Chinese to pinyin translator.", + "homepage": "https://github.com/overtrue/pinyin", + "keywords": [ + "Chinese", + "Pinyin", + "cn2pinyin" + ], + "support": { + "issues": "https://github.com/overtrue/pinyin/issues", + "source": "https://github.com/overtrue/pinyin/tree/master" + }, + "time": "2017-07-10T07:20:01+00:00" + }, + { + "name": "overtrue/socialite", + "version": "2.0.24", + "source": { + "type": "git", + "url": "https://github.com/overtrue/socialite.git", + "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/overtrue/socialite/zipball/ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec", + "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^5.0|^6.0|^7.0", + "php": ">=5.6", + "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0" + }, + "require-dev": { + "mockery/mockery": "~1.2", + "phpunit/phpunit": "^6.0|^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Overtrue\\Socialite\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.", + "keywords": [ + "login", + "oauth", + "qq", + "social", + "wechat", + "weibo" + ], + "support": { + "issues": "https://github.com/overtrue/socialite/issues", + "source": "https://github.com/overtrue/socialite/tree/2.0.24" + }, + "funding": [ + { + "url": "https://www.patreon.com/overtrue", + "type": "patreon" + } + ], + "time": "2021-05-13T16:04:48+00:00" + }, + { + "name": "overtrue/wechat", + "version": "4.9.0", + "source": { + "type": "git", + "url": "https://github.com/w7corp/easywechat.git", + "reference": "92791f5d957269c633b9aa175f842f6006f945b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/w7corp/easywechat/zipball/92791f5d957269c633b9aa175f842f6006f945b1", + "reference": "92791f5d957269c633b9aa175f842f6006f945b1", + "shasum": "" + }, + "require": { + "easywechat-composer/easywechat-composer": "^1.1", + "ext-fileinfo": "*", + "ext-openssl": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.2 || ^7.0", + "monolog/monolog": "^1.22 || ^2.0", + "overtrue/socialite": "~2.0", + "php": ">=7.2", + "pimple/pimple": "^3.0", + "psr/simple-cache": "^1.0", + "symfony/cache": "^3.3 || ^4.3 || ^5.0", + "symfony/event-dispatcher": "^4.3 || ^5.0", + "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0", + "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.15", + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2.3", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/Kernel/Support/Helpers.php", + "src/Kernel/Helpers.php" + ], + "psr-4": { + "EasyWeChat\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "overtrue", + "email": "anzhengchao@gmail.com" + } + ], + "description": "微信SDK", + "keywords": [ + "easywechat", + "sdk", + "wechat", + "weixin", + "weixin-sdk" + ], + "support": { + "issues": "https://github.com/w7corp/easywechat/issues", + "source": "https://github.com/w7corp/easywechat/tree/4.9.0" + }, + "funding": [ + { + "url": "https://github.com/overtrue", + "type": "github" + } + ], + "abandoned": "w7corp/easywechat", + "time": "2023-04-28T03:30:34+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.30.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "2f39286e0136673778b7a142b3f0d141e43d1714" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/2f39286e0136673778b7a142b3f0d141e43d1714", + "reference": "2f39286e0136673778b7a142b3f0d141e43d1714", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": "^7.4 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.0" + }, + "time": "2025-08-10T06:28:02+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.6.2", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/8cfe7f74ac22a433d303914eba9ea4c2a834edce", + "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.6.2" + }, + "time": "2026-02-26T08:23:44+00:00" + }, + { + "name": "psr/cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/2.0.0" + }, + "time": "2021-02-03T23:23:37+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.46", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", + "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "^1.6|^2.0", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.46" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-04T11:43:55+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v8.0.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/441404f09a54de6d1bd6ad219e088cdf4c91f97c", + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v8.0.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-29T09:41:02+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.50", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a0706e8b8041046052ea2695eb8aeee04f97609", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.50" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-03T12:58:48+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "reference": "581ca6067eb62640de5ff08ee1ba6850a0ee472e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", + "symfony/http-foundation": "^5.4 || ^6.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/browser-kit": "^5.4 || ^6.0", + "symfony/config": "^5.4 || ^6.0", + "symfony/event-dispatcher": "^5.4 || ^6.0", + "symfony/framework-bundle": "^5.4 || ^6.0", + "symfony/http-kernel": "^5.4 || ^6.0", + "symfony/phpunit-bridge": "^6.2" + }, + "suggest": { + "nyholm/psr7": "For a super lightweight PSR-7/17 implementation" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-main": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "http://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/symfony/psr-http-message-bridge/issues", + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.3.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-07-26T11:53:26+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.26", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T09:57:09+00:00" + }, + { + "name": "topthink/framework", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://gitee.com/fastadminnet/framework.git", + "reference": "9a2e7c2a1b6302afb61035c99c85bf0cfe0c52ec" + }, + "require": { + "ext-fileinfo": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=7.1.0", + "topthink/think-installer": "~1.0" + }, + "require-dev": { + "johnkary/phpunit-speedtrap": "^1.0", + "mikey179/vfsstream": "~1.6", + "phpdocumentor/reflection-docblock": "^2.0", + "phploc/phploc": "2.*", + "phpunit/phpunit": "4.8.*", + "sebastian/phpcpd": "2.*" + }, + "default-branch": true, + "type": "think-framework", + "autoload": { + "psr-4": { + "think\\": "library/think" + } + }, + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "the new thinkphp framework", + "homepage": "http://thinkphp.cn/", + "keywords": [ + "ORM", + "framework", + "thinkphp" + ], + "time": "2025-10-21T02:31:08+00:00" + }, + { + "name": "topthink/think-captcha", + "version": "v1.0.9", + "source": { + "type": "git", + "url": "https://gitee.com/fastadminnet/think-captcha.git", + "reference": "9be9dd7e61c7fa3c478c4b92910d7230b94d0d23" + }, + "require": { + "topthink/framework": "~5.0.0 || dev-master", + "topthink/think-installer": ">=1.0.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\captcha\\": "src/" + }, + "files": [ + "src/helper.php" + ] + }, + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "captcha package for thinkphp5", + "time": "2023-07-16T09:41:14+00:00" + }, + { + "name": "topthink/think-helper", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-helper.git", + "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-helper/zipball/5f92178606c8ce131d36b37a57c58eb71e55f019", + "reference": "5f92178606c8ce131d36b37a57c58eb71e55f019", + "shasum": "" + }, + "type": "library", + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "think\\helper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP5 Helper Package", + "support": { + "issues": "https://github.com/top-think/think-helper/issues", + "source": "https://github.com/top-think/think-helper/tree/master" + }, + "time": "2018-10-05T00:43:21+00:00" + }, + { + "name": "topthink/think-installer", + "version": "v1.0.14", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-installer.git", + "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-installer/zipball/eae1740ac264a55c06134b6685dfb9f837d004d1", + "reference": "eae1740ac264a55c06134b6685dfb9f837d004d1", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0||^2.0" + }, + "require-dev": { + "composer/composer": "^1.0||^2.0" + }, + "type": "composer-plugin", + "extra": { + "class": "think\\composer\\Plugin" + }, + "autoload": { + "psr-4": { + "think\\composer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "support": { + "issues": "https://github.com/top-think/think-installer/issues", + "source": "https://github.com/top-think/think-installer/tree/v1.0.14" + }, + "time": "2021-03-25T08:34:02+00:00" + }, + { + "name": "topthink/think-queue", + "version": "v1.1.6", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-queue.git", + "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-queue/zipball/250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245", + "reference": "250650eb0e8ea5af4cfdc7ae46f3f4e0a24ac245", + "shasum": "" + }, + "require": { + "topthink/think-helper": ">=1.0.4", + "topthink/think-installer": ">=1.0.10" + }, + "require-dev": { + "topthink/framework": "~5.0.0" + }, + "type": "think-extend", + "extra": { + "think-config": { + "queue": "src/config.php" + } + }, + "autoload": { + "files": [ + "src/common.php" + ], + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP5 Queue Package", + "support": { + "issues": "https://github.com/top-think/think-queue/issues", + "source": "https://github.com/top-think/think-queue/tree/master" + }, + "time": "2018-10-15T10:16:55+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "topthink/framework": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.4.0", + "ext-json": "*", + "ext-curl": "*", + "ext-pdo": "*", + "ext-bcmath": "*" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/xunifriend_RaeeC/thinkphp/library/think/App.php b/xunifriend_RaeeC/thinkphp/library/think/App.php index 9b57562..49320d4 100644 --- a/xunifriend_RaeeC/thinkphp/library/think/App.php +++ b/xunifriend_RaeeC/thinkphp/library/think/App.php @@ -74,7 +74,7 @@ class App * @return Response * @throws Exception */ - public static function run(Request $request = null) + public static function run(?Request $request = null) { $request = is_null($request) ? Request::instance() : $request; diff --git a/xunifriend_RaeeC/thinkphp/library/think/Request.php b/xunifriend_RaeeC/thinkphp/library/think/Request.php index 4baf026..a8d9d22 100644 --- a/xunifriend_RaeeC/thinkphp/library/think/Request.php +++ b/xunifriend_RaeeC/thinkphp/library/think/Request.php @@ -1151,7 +1151,7 @@ class Request break; // 布尔 case 'b': - $data = (boolean) $data; + $data = (bool) $data; break; // 字符串 case 's': diff --git a/xunifriend_RaeeC/thinkphp/library/think/debug/Html.php b/xunifriend_RaeeC/thinkphp/library/think/debug/Html.php index b6be7ad..fb10b26 100644 --- a/xunifriend_RaeeC/thinkphp/library/think/debug/Html.php +++ b/xunifriend_RaeeC/thinkphp/library/think/debug/Html.php @@ -47,7 +47,7 @@ class Html $request = Request::instance(); $contentType = $response->getHeader('Content-Type'); $accept = $request->header('accept'); - if (strpos($accept, 'application/json') === 0 || $request->isAjax()) { + if (strpos($accept ?? '', 'application/json') === 0 || $request->isAjax()) { return false; } elseif (!empty($contentType) && strpos($contentType, 'html') === false) { return false; diff --git a/xunifriend_RaeeC/vendor/autoload.php b/xunifriend_RaeeC/vendor/autoload.php index 66b8843..6f3cc6f 100644 --- a/xunifriend_RaeeC/vendor/autoload.php +++ b/xunifriend_RaeeC/vendor/autoload.php @@ -14,10 +14,7 @@ if (PHP_VERSION_ID < 50600) { echo $err; } } - trigger_error( - $err, - E_USER_ERROR - ); + throw new RuntimeException($err); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/xunifriend_RaeeC/vendor/composer/InstalledVersions.php b/xunifriend_RaeeC/vendor/composer/InstalledVersions.php index 51e734a..2052022 100644 --- a/xunifriend_RaeeC/vendor/composer/InstalledVersions.php +++ b/xunifriend_RaeeC/vendor/composer/InstalledVersions.php @@ -26,12 +26,23 @@ use Composer\Semver\VersionParser; */ class InstalledVersions { + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + /** * @var mixed[]|null * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; + /** + * @var bool + */ + private static $installedIsLocalDir; + /** * @var bool|null */ @@ -309,6 +320,24 @@ class InstalledVersions { self::$installed = $data; self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; } /** @@ -322,19 +351,27 @@ class InstalledVersions } $installed = array(); + $copiedLocalDir = false; if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ $required = require $vendorDir.'/composer/installed.php'; - $installed[] = self::$installedByVendor[$vendorDir] = $required; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; } } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } } } @@ -350,7 +387,7 @@ class InstalledVersions } } - if (self::$installed !== array()) { + if (self::$installed !== array() && !$copiedLocalDir) { $installed[] = self::$installed; } diff --git a/xunifriend_RaeeC/vendor/composer/autoload_classmap.php b/xunifriend_RaeeC/vendor/composer/autoload_classmap.php index 016c54b..f79184e 100644 --- a/xunifriend_RaeeC/vendor/composer/autoload_classmap.php +++ b/xunifriend_RaeeC/vendor/composer/autoload_classmap.php @@ -10,7 +10,7 @@ return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Stringable' => $vendorDir . '/myclabs/php-enum/stubs/Stringable.php', + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', ); diff --git a/xunifriend_RaeeC/vendor/composer/autoload_psr4.php b/xunifriend_RaeeC/vendor/composer/autoload_psr4.php index 9383608..24f6988 100644 --- a/xunifriend_RaeeC/vendor/composer/autoload_psr4.php +++ b/xunifriend_RaeeC/vendor/composer/autoload_psr4.php @@ -9,7 +9,7 @@ return array( 'think\\helper\\' => array($vendorDir . '/topthink/think-helper/src'), 'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'), 'think\\captcha\\' => array($vendorDir . '/topthink/think-captcha/src'), - 'think\\' => array($baseDir . '/thinkphp/library/think', $vendorDir . '/topthink/think-queue/src', $vendorDir . '/fastadminnet/fastadmin-addons/src'), + 'think\\' => array($vendorDir . '/topthink/think-queue/src', $vendorDir . '/fastadminnet/fastadmin-addons/src', $baseDir . '/thinkphp/library/think'), 'tests\\' => array($vendorDir . '/maniac/easemob-php/tests'), 'addons\\' => array($baseDir . '/addons'), 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), @@ -28,7 +28,7 @@ return array( 'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), @@ -37,7 +37,6 @@ return array( 'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'), 'Overtrue\\Socialite\\' => array($vendorDir . '/overtrue/socialite/src'), 'Overtrue\\Pinyin\\' => array($vendorDir . '/overtrue/pinyin/src'), - 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), diff --git a/xunifriend_RaeeC/vendor/composer/autoload_static.php b/xunifriend_RaeeC/vendor/composer/autoload_static.php index 198b4fd..1b2a2a7 100644 --- a/xunifriend_RaeeC/vendor/composer/autoload_static.php +++ b/xunifriend_RaeeC/vendor/composer/autoload_static.php @@ -24,7 +24,7 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 ); public static $prefixLengthsPsr4 = array ( - 't' => + 't' => array ( 'think\\helper\\' => 13, 'think\\composer\\' => 15, @@ -32,19 +32,19 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 'think\\' => 6, 'tests\\' => 6, ), - 'a' => + 'a' => array ( 'addons\\' => 7, ), - 'Z' => + 'Z' => array ( 'ZipStream\\' => 10, ), - 'T' => + 'T' => array ( 'Tx\\' => 3, ), - 'S' => + 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, @@ -59,7 +59,7 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 'Symfony\\Component\\Cache\\' => 24, 'Symfony\\Bridge\\PsrHttpMessage\\' => 30, ), - 'P' => + 'P' => array ( 'Psr\\SimpleCache\\' => 16, 'Psr\\Log\\' => 8, @@ -71,30 +71,29 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 'PhpZip\\' => 7, 'PhpOffice\\PhpSpreadsheet\\' => 25, ), - 'O' => + 'O' => array ( 'Overtrue\\Socialite\\' => 19, 'Overtrue\\Pinyin\\' => 16, ), - 'M' => + 'M' => array ( - 'MyCLabs\\Enum\\' => 13, 'Monolog\\' => 8, 'Matrix\\' => 7, ), - 'G' => + 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, ), - 'E' => + 'E' => array ( 'EasyWeChat\\' => 11, 'EasyWeChatComposer\\' => 19, 'Easemob\\' => 8, ), - 'C' => + 'C' => array ( 'Composer\\Pcre\\' => 14, 'Complex\\' => 8, @@ -102,190 +101,186 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 ); public static $prefixDirsPsr4 = array ( - 'think\\helper\\' => + 'think\\helper\\' => array ( 0 => __DIR__ . '/..' . '/topthink/think-helper/src', ), - 'think\\composer\\' => + 'think\\composer\\' => array ( 0 => __DIR__ . '/..' . '/topthink/think-installer/src', ), - 'think\\captcha\\' => + 'think\\captcha\\' => array ( 0 => __DIR__ . '/..' . '/topthink/think-captcha/src', ), - 'think\\' => + 'think\\' => array ( - 0 => __DIR__ . '/../..' . '/thinkphp/library/think', - 1 => __DIR__ . '/..' . '/topthink/think-queue/src', - 2 => __DIR__ . '/..' . '/fastadminnet/fastadmin-addons/src', + 0 => __DIR__ . '/..' . '/topthink/think-queue/src', + 1 => __DIR__ . '/..' . '/fastadminnet/fastadmin-addons/src', + 2 => __DIR__ . '/../..' . '/thinkphp/library/think', ), - 'tests\\' => + 'tests\\' => array ( 0 => __DIR__ . '/..' . '/maniac/easemob-php/tests', ), - 'addons\\' => + 'addons\\' => array ( 0 => __DIR__ . '/../..' . '/addons', ), - 'ZipStream\\' => + 'ZipStream\\' => array ( 0 => __DIR__ . '/..' . '/maennchen/zipstream-php/src', ), - 'Tx\\' => + 'Tx\\' => array ( 0 => __DIR__ . '/..' . '/fastadminnet/fastadmin-mailer/src', ), - 'Symfony\\Polyfill\\Php80\\' => + 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), - 'Symfony\\Polyfill\\Php73\\' => + 'Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), - 'Symfony\\Polyfill\\Mbstring\\' => + 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), - 'Symfony\\Contracts\\Service\\' => + 'Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'Symfony\\Contracts\\EventDispatcher\\' => + 'Symfony\\Contracts\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', ), - 'Symfony\\Contracts\\Cache\\' => + 'Symfony\\Contracts\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), - 'Symfony\\Component\\VarExporter\\' => + 'Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), - 'Symfony\\Component\\HttpFoundation\\' => + 'Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), - 'Symfony\\Component\\Finder\\' => + 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'Symfony\\Component\\EventDispatcher\\' => + 'Symfony\\Component\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), - 'Symfony\\Component\\Cache\\' => + 'Symfony\\Component\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache', ), - 'Symfony\\Bridge\\PsrHttpMessage\\' => + 'Symfony\\Bridge\\PsrHttpMessage\\' => array ( 0 => __DIR__ . '/..' . '/symfony/psr-http-message-bridge', ), - 'Psr\\SimpleCache\\' => + 'Psr\\SimpleCache\\' => array ( 0 => __DIR__ . '/..' . '/psr/simple-cache/src', ), - 'Psr\\Log\\' => + 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), - 'Psr\\Http\\Message\\' => + 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-message/src', - 1 => __DIR__ . '/..' . '/psr/http-factory/src', + 0 => __DIR__ . '/..' . '/psr/http-factory/src', + 1 => __DIR__ . '/..' . '/psr/http-message/src', ), - 'Psr\\Http\\Client\\' => + 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), - 'Psr\\EventDispatcher\\' => + 'Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), - 'Psr\\Container\\' => + 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'Psr\\Cache\\' => + 'Psr\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), - 'PhpZip\\' => + 'PhpZip\\' => array ( 0 => __DIR__ . '/..' . '/nelexa/zip/src', ), - 'PhpOffice\\PhpSpreadsheet\\' => + 'PhpOffice\\PhpSpreadsheet\\' => array ( 0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet', ), - 'Overtrue\\Socialite\\' => + 'Overtrue\\Socialite\\' => array ( 0 => __DIR__ . '/..' . '/overtrue/socialite/src', ), - 'Overtrue\\Pinyin\\' => + 'Overtrue\\Pinyin\\' => array ( 0 => __DIR__ . '/..' . '/overtrue/pinyin/src', ), - 'MyCLabs\\Enum\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/php-enum/src', - ), - 'Monolog\\' => + 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), - 'Matrix\\' => + 'Matrix\\' => array ( 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src', ), - 'GuzzleHttp\\Psr7\\' => + 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), - 'GuzzleHttp\\Promise\\' => + 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), - 'GuzzleHttp\\' => + 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), - 'EasyWeChat\\' => + 'EasyWeChat\\' => array ( 0 => __DIR__ . '/..' . '/overtrue/wechat/src', ), - 'EasyWeChatComposer\\' => + 'EasyWeChatComposer\\' => array ( 0 => __DIR__ . '/..' . '/easywechat-composer/easywechat-composer/src', ), - 'Easemob\\' => + 'Easemob\\' => array ( 0 => __DIR__ . '/..' . '/maniac/easemob-php/src', ), - 'Composer\\Pcre\\' => + 'Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), - 'Complex\\' => + 'Complex\\' => array ( 0 => __DIR__ . '/..' . '/markbaker/complex/classes/src', ), ); public static $prefixesPsr0 = array ( - 'P' => + 'P' => array ( - 'Pimple' => + 'Pimple' => array ( 0 => __DIR__ . '/..' . '/pimple/pimple/src', ), ), - 'H' => + 'H' => array ( - 'HTMLPurifier' => + 'HTMLPurifier' => array ( 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library', ), @@ -297,7 +292,7 @@ class ComposerStaticInitf3106b6ef3260b6914241eab0bed11c1 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Stringable' => __DIR__ . '/..' . '/myclabs/php-enum/stubs/Stringable.php', + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', ); diff --git a/xunifriend_RaeeC/vendor/composer/installed.json b/xunifriend_RaeeC/vendor/composer/installed.json index bf1a6db..8c324a0 100644 --- a/xunifriend_RaeeC/vendor/composer/installed.json +++ b/xunifriend_RaeeC/vendor/composer/installed.json @@ -205,30 +205,24 @@ }, { "name": "fastadminnet/fastadmin-addons", - "version": "1.4.2", - "version_normalized": "1.4.2.0", + "version": "1.4.4", + "version_normalized": "1.4.4.0", "source": { "type": "git", "url": "https://github.com/fastadminnet/fastadmin-addons.git", - "reference": "14af178a62fb4cc897f954fa9d7d53798ad2cf37" + "reference": "5a02139c773821c9ac646b7950fedf6950330054" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fastadminnet/fastadmin-addons/zipball/14af178a62fb4cc897f954fa9d7d53798ad2cf37", - "reference": "14af178a62fb4cc897f954fa9d7d53798ad2cf37", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/fastadminnet/fastadmin-addons/zipball/5a02139c773821c9ac646b7950fedf6950330054", + "reference": "5a02139c773821c9ac646b7950fedf6950330054", + "shasum": "" }, "require": { "nelexa/zip": "^3.3 || ^4.0", - "php": ">=7.0.0" + "php": ">=7.1.0" }, - "time": "2025-06-03T03:09:28+00:00", + "time": "2026-01-15T03:02:43+00:00", "type": "library", "extra": { "think-config": { @@ -262,7 +256,7 @@ "homepage": "https://github.com/fastadminnet/fastadmin-addons", "support": { "issues": "https://github.com/fastadminnet/fastadmin-addons/issues", - "source": "https://github.com/fastadminnet/fastadmin-addons/tree/v1.4.2" + "source": "https://github.com/fastadminnet/fastadmin-addons/tree/v1.4.4" }, "install-path": "../fastadminnet/fastadmin-addons" }, @@ -332,29 +326,23 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", - "version_normalized": "7.9.2.0", + "version": "7.10.0", + "version_normalized": "7.10.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -375,7 +363,7 @@ "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, - "time": "2024-07-24T11:22:20+00:00", + "time": "2025-08-23T22:36:01+00:00", "type": "library", "extra": { "bamarni-bin": { @@ -447,7 +435,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" }, "funding": [ { @@ -684,35 +672,39 @@ }, { "name": "maennchen/zipstream-php", - "version": "2.2.6", - "version_normalized": "2.2.6.0", + "version": "3.2.1", + "version_normalized": "3.2.1.0", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f" + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", - "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", "shasum": "" }, "require": { - "myclabs/php-enum": "^1.5", - "php": "^7.4 || ^8.0", - "psr/http-message": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.3" }, "require-dev": { + "brianium/paratest": "^7.7", "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.9", - "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", + "friendsofphp/php-cs-fixer": "^3.86", + "guzzlehttp/guzzle": "^7.5", "mikey179/vfsstream": "^1.6", - "php-coveralls/php-coveralls": "^2.4", - "phpunit/phpunit": "^8.5.8 || ^9.4.2", - "vimeo/psalm": "^4.1" + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^12.0", + "vimeo/psalm": "^6.0" }, - "time": "2022-11-25T18:57:19+00:00", + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "time": "2025-12-10T09:58:31+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -749,16 +741,12 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" }, "funding": [ { "url": "https://github.com/maennchen", "type": "github" - }, - { - "url": "https://opencollective.com/zipstream", - "type": "open_collective" } ], "install-path": "../maennchen/zipstream-php" @@ -931,17 +919,17 @@ }, { "name": "monolog/monolog", - "version": "2.10.0", - "version_normalized": "2.10.0.0", + "version": "2.11.0", + "version_normalized": "2.11.0.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "5cf826f2991858b54d5c3809bee745560a1042a7" + "reference": "37308608e599f34a1a4845b16440047ec98a172a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7", - "reference": "5cf826f2991858b54d5c3809bee745560a1042a7", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/37308608e599f34a1a4845b16440047ec98a172a", + "reference": "37308608e599f34a1a4845b16440047ec98a172a", "shasum": "" }, "require": { @@ -959,7 +947,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2@dev", "guzzlehttp/guzzle": "^7.4", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^1.10", @@ -987,7 +975,7 @@ "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, - "time": "2024-11-12T12:43:37+00:00", + "time": "2026-01-01T13:05:00+00:00", "type": "library", "extra": { "branch-alias": { @@ -1020,7 +1008,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.10.0" + "source": "https://github.com/Seldaek/monolog/tree/2.11.0" }, "funding": [ { @@ -1034,78 +1022,6 @@ ], "install-path": "../monolog/monolog" }, - { - "name": "myclabs/php-enum", - "version": "1.8.4", - "version_normalized": "1.8.4.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", - "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "require": { - "ext-json": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.6.2" - }, - "time": "2022-08-04T09:53:51+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - }, - "classmap": [ - "stubs/Stringable.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "description": "PHP Enum implementation", - "homepage": "http://github.com/myclabs/php-enum", - "keywords": [ - "enum" - ], - "support": { - "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.4" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", - "type": "tidelift" - } - ], - "install-path": "../myclabs/php-enum" - }, { "name": "nelexa/zip", "version": "4.0.2", @@ -1381,24 +1297,18 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.30.1", - "version_normalized": "1.30.1.0", + "version": "1.30.0", + "version_normalized": "1.30.0.0", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "fa8257a579ec623473eabfe49731de5967306c4c" + "reference": "2f39286e0136673778b7a142b3f0d141e43d1714" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/fa8257a579ec623473eabfe49731de5967306c4c", - "reference": "fa8257a579ec623473eabfe49731de5967306c4c", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/2f39286e0136673778b7a142b3f0d141e43d1714", + "reference": "2f39286e0136673778b7a142b3f0d141e43d1714", + "shasum": "" }, "require": { "composer/pcre": "^1||^2||^3", @@ -1419,7 +1329,7 @@ "maennchen/zipstream-php": "^2.1 || ^3.0", "markbaker/complex": "^3.0", "markbaker/matrix": "^3.0", - "php": ">=7.4.0 <8.5.0", + "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" @@ -1444,7 +1354,7 @@ "mpdf/mpdf": "Option for rendering PDF with PDF Writer", "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, - "time": "2025-10-26T16:01:04+00:00", + "time": "2025-08-10T06:28:02+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1490,30 +1400,24 @@ ], "support": { "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.1" + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.0" }, "install-path": "../phpoffice/phpspreadsheet" }, { "name": "pimple/pimple", - "version": "v3.6.0", - "version_normalized": "3.6.0.0", + "version": "v3.6.2", + "version_normalized": "3.6.2.0", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", - "reference": "a70f552d338f9266eec6606c1f0b324da5514c96" + "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a70f552d338f9266eec6606c1f0b324da5514c96", - "reference": "a70f552d338f9266eec6606c1f0b324da5514c96", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/8cfe7f74ac22a433d303914eba9ea4c2a834edce", + "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce", + "shasum": "" }, "require": { "php": ">=7.2.5", @@ -1522,11 +1426,11 @@ "require-dev": { "phpunit/phpunit": "*" }, - "time": "2025-11-12T12:31:38+00:00", + "time": "2026-02-26T08:23:44+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4.x-dev" + "dev-master": "3.x-dev" } }, "installation-source": "dist", @@ -1552,29 +1456,29 @@ "dependency injection" ], "support": { - "source": "https://github.com/silexphp/Pimple/tree/v3.6.0" + "source": "https://github.com/silexphp/Pimple/tree/v3.6.2" }, "install-path": "../pimple/pimple" }, { "name": "psr/cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "2.0.0", + "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, - "time": "2016-08-06T20:24:11+00:00", + "time": "2021-02-03T23:23:37+00:00", "type": "library", "extra": { "branch-alias": { @@ -1594,7 +1498,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -1604,7 +1508,7 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/2.0.0" }, "install-path": "../psr/cache" }, @@ -1774,30 +1678,24 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", - "version_normalized": "1.0.2.0", + "version": "1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, - "time": "2023-04-10T20:10:41+00:00", + "time": "2024-04-15T12:06:14+00:00", "type": "library", "extra": { "branch-alias": { @@ -1820,7 +1718,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1832,33 +1730,33 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, "install-path": "../psr/http-factory" }, { "name": "psr/http-message", - "version": "1.1", - "version_normalized": "1.1.0.0", + "version": "2.0", + "version_normalized": "2.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, - "time": "2023-04-04T09:50:52+00:00", + "time": "2023-04-04T09:54:51+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "installation-source": "dist", @@ -1874,7 +1772,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -1888,7 +1786,7 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, "install-path": "../psr/http-message" }, @@ -2230,31 +2128,31 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.4", - "version_normalized": "2.5.4.0", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", - "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, - "time": "2024-09-25T14:11:13+00:00", + "time": "2024-09-25T14:21:43+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "installation-source": "dist", @@ -2280,7 +2178,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -2388,35 +2286,32 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.4", - "version_normalized": "2.5.4.0", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", - "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "time": "2024-09-25T14:11:13+00:00", + "time": "2024-09-25T14:21:43+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "installation-source": "dist", @@ -2450,7 +2345,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -2470,25 +2365,26 @@ }, { "name": "symfony/finder", - "version": "v5.4.45", - "version_normalized": "5.4.45.0", + "version": "v8.0.6", + "version_normalized": "8.0.6.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "63741784cd7b9967975eec610b256eed3ede022b" + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", - "reference": "63741784cd7b9967975eec610b256eed3ede022b", + "url": "https://api.github.com/repos/symfony/finder/zipball/441404f09a54de6d1bd6ad219e088cdf4c91f97c", + "reference": "441404f09a54de6d1bd6ad219e088cdf4c91f97c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.4" }, - "time": "2024-09-28T13:32:08+00:00", + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" + }, + "time": "2026-01-29T09:41:02+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2516,7 +2412,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.45" + "source": "https://github.com/symfony/finder/tree/v8.0.6" }, "funding": [ { @@ -2527,6 +2423,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2536,17 +2436,17 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.48", - "version_normalized": "5.4.48.0", + "version": "v5.4.50", + "version_normalized": "5.4.50.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "3f38b8af283b830e1363acd79e5bc3412d055341" + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3f38b8af283b830e1363acd79e5bc3412d055341", - "reference": "3f38b8af283b830e1363acd79e5bc3412d055341", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1a0706e8b8041046052ea2695eb8aeee04f97609", + "reference": "1a0706e8b8041046052ea2695eb8aeee04f97609", "shasum": "" }, "require": { @@ -2567,7 +2467,7 @@ "suggest": { "symfony/mime": "To use the file extension guesser" }, - "time": "2024-11-13T18:58:02+00:00", + "time": "2025-11-03T12:58:48+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2595,7 +2495,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.48" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.50" }, "funding": [ { @@ -2606,6 +2506,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2615,8 +2519,8 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.32.0", - "version_normalized": "1.32.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", @@ -2626,13 +2530,7 @@ "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "shasum": "" }, "require": { "ext-iconv": "*", @@ -2685,7 +2583,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -2696,6 +2594,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2705,8 +2607,8 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.32.0", - "version_normalized": "1.32.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -2716,13 +2618,7 @@ "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "shasum": "" }, "require": { "php": ">=7.2" @@ -2770,7 +2666,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -2781,6 +2677,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2790,8 +2690,8 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.32.0", - "version_normalized": "1.32.0.0", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", @@ -2801,13 +2701,7 @@ "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "shasum": "" }, "require": { "php": ">=7.2" @@ -2859,7 +2753,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -2870,6 +2764,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" @@ -2971,38 +2869,46 @@ }, { "name": "symfony/service-contracts", - "version": "v1.1.2", - "version_normalized": "1.1.2.0", + "version": "v3.6.1", + "version_normalized": "3.6.1.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/191afdcb5804db960d26d8566b7e9a2843cab3a0", - "reference": "191afdcb5804db960d26d8566b7e9a2843cab3a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "psr/container": "", - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, - "time": "2019-05-28T07:50:59+00:00", + "time": "2025-07-15T11:30:57+00:00", "type": "library", "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "3.6-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3029,33 +2935,53 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v1.1.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "install-path": "../symfony/service-contracts" }, { "name": "symfony/var-exporter", - "version": "v5.4.45", - "version_normalized": "5.4.45.0", + "version": "v6.4.26", + "version_normalized": "6.4.26.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "862700068db0ddfd8c5b850671e029a90246ec75" + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/862700068db0ddfd8c5b850671e029a90246ec75", - "reference": "862700068db0ddfd8c5b850671e029a90246ec75", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", + "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2024-09-25T14:11:13+00:00", + "time": "2025-09-11T09:57:09+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3088,10 +3014,12 @@ "export", "hydrate", "instantiate", + "lazy-loading", + "proxy", "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.45" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" }, "funding": [ { @@ -3102,6 +3030,10 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" diff --git a/xunifriend_RaeeC/vendor/composer/installed.php b/xunifriend_RaeeC/vendor/composer/installed.php index ecb2089..9074f3c 100644 --- a/xunifriend_RaeeC/vendor/composer/installed.php +++ b/xunifriend_RaeeC/vendor/composer/installed.php @@ -1,9 +1,9 @@ array( 'name' => 'fastadminnet/fastadmin', - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'reference' => '50cdd33546641ce244c4733aeb5578edcb07aab8', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => '0c9fb211d1eb61cb95c42c34900db3d3774c0245', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -38,18 +38,18 @@ 'dev_requirement' => false, ), 'fastadminnet/fastadmin' => array( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'reference' => '50cdd33546641ce244c4733aeb5578edcb07aab8', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => '0c9fb211d1eb61cb95c42c34900db3d3774c0245', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'fastadminnet/fastadmin-addons' => array( - 'pretty_version' => '1.4.2', - 'version' => '1.4.2.0', - 'reference' => '14af178a62fb4cc897f954fa9d7d53798ad2cf37', + 'pretty_version' => '1.4.4', + 'version' => '1.4.4.0', + 'reference' => '5a02139c773821c9ac646b7950fedf6950330054', 'type' => 'library', 'install_path' => __DIR__ . '/../fastadminnet/fastadmin-addons', 'aliases' => array(), @@ -65,9 +65,9 @@ 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( - 'pretty_version' => '7.9.2', - 'version' => '7.9.2.0', - 'reference' => 'd281ed313b989f213357e3be1a179f02196ac99b', + 'pretty_version' => '7.10.0', + 'version' => '7.10.0.0', + 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), @@ -92,9 +92,9 @@ 'dev_requirement' => false, ), 'maennchen/zipstream-php' => array( - 'pretty_version' => '2.2.6', - 'version' => '2.2.6.0', - 'reference' => '30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f', + 'pretty_version' => '3.2.1', + 'version' => '3.2.1.0', + 'reference' => '682f1098a8fddbaf43edac2306a691c7ad508ec5', 'type' => 'library', 'install_path' => __DIR__ . '/../maennchen/zipstream-php', 'aliases' => array(), @@ -128,23 +128,14 @@ 'dev_requirement' => false, ), 'monolog/monolog' => array( - 'pretty_version' => '2.10.0', - 'version' => '2.10.0.0', - 'reference' => '5cf826f2991858b54d5c3809bee745560a1042a7', + 'pretty_version' => '2.11.0', + 'version' => '2.11.0.0', + 'reference' => '37308608e599f34a1a4845b16440047ec98a172a', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), 'dev_requirement' => false, ), - 'myclabs/php-enum' => array( - 'pretty_version' => '1.8.4', - 'version' => '1.8.4.0', - 'reference' => 'a867478eae49c9f59ece437ae7f9506bfaa27483', - 'type' => 'library', - 'install_path' => __DIR__ . '/../myclabs/php-enum', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'nelexa/zip' => array( 'pretty_version' => '4.0.2', 'version' => '4.0.2.0', @@ -182,27 +173,27 @@ 'dev_requirement' => false, ), 'phpoffice/phpspreadsheet' => array( - 'pretty_version' => '1.30.1', - 'version' => '1.30.1.0', - 'reference' => 'fa8257a579ec623473eabfe49731de5967306c4c', + 'pretty_version' => '1.30.0', + 'version' => '1.30.0.0', + 'reference' => '2f39286e0136673778b7a142b3f0d141e43d1714', 'type' => 'library', 'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet', 'aliases' => array(), 'dev_requirement' => false, ), 'pimple/pimple' => array( - 'pretty_version' => 'v3.6.0', - 'version' => '3.6.0.0', - 'reference' => 'a70f552d338f9266eec6606c1f0b324da5514c96', + 'pretty_version' => 'v3.6.2', + 'version' => '3.6.2.0', + 'reference' => '8cfe7f74ac22a433d303914eba9ea4c2a834edce', 'type' => 'library', 'install_path' => __DIR__ . '/../pimple/pimple', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/cache' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', + 'pretty_version' => '2.0.0', + 'version' => '2.0.0.0', + 'reference' => '213f9dbc5b9bfbc4f8db86d2838dc968752ce13b', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), @@ -254,9 +245,9 @@ ), ), 'psr/http-factory' => array( - 'pretty_version' => '1.0.2', - 'version' => '1.0.2.0', - 'reference' => 'e616d01114759c4c489f93b099585439f795fe35', + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), @@ -269,9 +260,9 @@ ), ), 'psr/http-message' => array( - 'pretty_version' => '1.1', - 'version' => '1.1.0.0', - 'reference' => 'cb6ce4845ce34a8ad9e68117c10ee90a29919eba', + 'pretty_version' => '2.0', + 'version' => '2.0.0.0', + 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), @@ -347,9 +338,9 @@ ), ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v2.5.4', - 'version' => '2.5.4.0', - 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918', + 'pretty_version' => 'v3.6.0', + 'version' => '3.6.0.0', + 'reference' => '63afe740e99a13ba87ec199bb07bbdee937a5b62', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), @@ -365,9 +356,9 @@ 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v2.5.4', - 'version' => '2.5.4.0', - 'reference' => 'e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f', + 'pretty_version' => 'v3.6.0', + 'version' => '3.6.0.0', + 'reference' => '59eb412e93815df44f05f342958efa9f46b1e586', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), @@ -380,26 +371,26 @@ ), ), 'symfony/finder' => array( - 'pretty_version' => 'v5.4.45', - 'version' => '5.4.45.0', - 'reference' => '63741784cd7b9967975eec610b256eed3ede022b', + 'pretty_version' => 'v8.0.6', + 'version' => '8.0.6.0', + 'reference' => '441404f09a54de6d1bd6ad219e088cdf4c91f97c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/http-foundation' => array( - 'pretty_version' => 'v5.4.48', - 'version' => '5.4.48.0', - 'reference' => '3f38b8af283b830e1363acd79e5bc3412d055341', + 'pretty_version' => 'v5.4.50', + 'version' => '5.4.50.0', + 'reference' => '1a0706e8b8041046052ea2695eb8aeee04f97609', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.32.0', - 'version' => '1.32.0.0', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', @@ -407,8 +398,8 @@ 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( - 'pretty_version' => 'v1.32.0', - 'version' => '1.32.0.0', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', 'reference' => '0f68c03565dcaaf25a890667542e8bd75fe7e5bb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', @@ -416,8 +407,8 @@ 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.32.0', - 'version' => '1.32.0.0', + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', @@ -434,18 +425,18 @@ 'dev_requirement' => false, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v1.1.2', - 'version' => '1.1.2.0', - 'reference' => '191afdcb5804db960d26d8566b7e9a2843cab3a0', + 'pretty_version' => 'v3.6.1', + 'version' => '3.6.1.0', + 'reference' => '45112560a3ba2d715666a509a0bc9521d10b6c43', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/var-exporter' => array( - 'pretty_version' => 'v5.4.45', - 'version' => '5.4.45.0', - 'reference' => '862700068db0ddfd8c5b850671e029a90246ec75', + 'pretty_version' => 'v6.4.26', + 'version' => '6.4.26.0', + 'reference' => '466fcac5fa2e871f83d31173f80e9c2684743bfc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), diff --git a/xunifriend_RaeeC/vendor/composer/platform_check.php b/xunifriend_RaeeC/vendor/composer/platform_check.php index 580fa96..99f3da9 100644 --- a/xunifriend_RaeeC/vendor/composer/platform_check.php +++ b/xunifriend_RaeeC/vendor/composer/platform_check.php @@ -4,8 +4,12 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 70400)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 80400)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.4.0". You are running ' . PHP_VERSION . '.'; +} + +if (PHP_INT_SIZE !== 8) { + $issues[] = 'Your Composer dependencies require a 64-bit build of PHP.'; } if ($issues) { @@ -19,8 +23,7 @@ if ($issues) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) ); } diff --git a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/composer.json b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/composer.json index ad98272..fe425e1 100644 --- a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/composer.json +++ b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/composer.json @@ -3,7 +3,7 @@ "description": "addons package for fastadmin", "homepage": "https://github.com/fastadminnet/fastadmin-addons", "license": "Apache-2.0", - "version": "1.4.2", + "version": "1.4.4", "authors": [ { "name": "Karson", @@ -18,7 +18,7 @@ "issues": "https://github.com/fastadminnet/fastadmin-addons/issues" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1.0", "nelexa/zip": "^3.3 || ^4.0" }, "autoload": { diff --git a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Controller.php b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Controller.php index fea2c4f..457ff5c 100644 --- a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Controller.php +++ b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Controller.php @@ -63,7 +63,7 @@ class Controller extends \think\Controller * @param Request $request Request对象 * @access public */ - public function __construct(Request $request = null) + public function __construct(?Request $request = null) { if (is_null($request)) { $request = Request::instance(); diff --git a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Service.php b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Service.php index b1562dd..b42a5ba 100644 --- a/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Service.php +++ b/xunifriend_RaeeC/vendor/fastadminnet/fastadmin-addons/src/addons/Service.php @@ -10,7 +10,6 @@ use PhpZip\Exception\ZipException; use PhpZip\ZipFile; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; -use Symfony\Component\VarExporter\VarExporter; use think\Cache; use think\Db; use think\Exception; @@ -408,7 +407,7 @@ EOD; throw new Exception(__("Unable to open file '%s' for writing", "addons.php")); } - file_put_contents($file, " // +---------------------------------------------------------------------- -use Symfony\Component\VarExporter\VarExporter; use think\addons\Service; use think\App; use think\Cache; @@ -476,6 +475,7 @@ function set_addon_info($name, $array) $res[] = "$key = " . (is_numeric($val) ? $val : $val); } } + Hook::listen($name . '_info_before_write', $array); if (file_put_contents($file, implode("\n", $res) . "\n", LOCK_EX)) { //清空当前配置缓存 Config::set($name, null, 'addoninfo'); @@ -521,8 +521,15 @@ function set_addon_config($name, $config, $writefile = true) */ function set_addon_fullconfig($name, $array) { + $config = []; + if (is_array($array)) { + foreach ($array as $key => $value) { + $config[$value['name']] = $value['value']; + } + } + Hook::listen($name . '_config_before_write', $config, $array); $file = ADDON_PATH . $name . DS . 'config.php'; - $ret = file_put_contents($file, "handle); if (\count($this->handles) >= $this->maxHandles) { - \curl_close($resource); + if (PHP_VERSION_ID < 80000) { + \curl_close($resource); + } } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array @@ -729,7 +731,10 @@ class CurlFactory implements CurlFactoryInterface public function __destruct() { foreach ($this->handles as $id => $handle) { - \curl_close($handle); + if (PHP_VERSION_ID < 80000) { + \curl_close($handle); + } + unset($this->handles[$id]); } } diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php index 73a6abe..21abbed 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -240,7 +240,10 @@ class CurlMultiHandler $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); \curl_multi_remove_handle($this->_mh, $handle); - \curl_close($handle); + + if (PHP_VERSION_ID < 80000) { + \curl_close($handle); + } return true; } diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php index f045b52..9df70cf 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -17,10 +17,10 @@ class Proxy * Sends synchronous requests to a specific handler while sending all other * requests to another handler. * - * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default Handler used for normal responses - * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $sync Handler used for synchronous responses. + * @param callable(RequestInterface, array): PromiseInterface $default Handler used for normal responses + * @param callable(RequestInterface, array): PromiseInterface $sync Handler used for synchronous responses. * - * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler. + * @return callable(RequestInterface, array): PromiseInterface Returns the composed handler. */ public static function wrapSync(callable $default, callable $sync): callable { @@ -37,10 +37,10 @@ class Proxy * performance benefits of curl while still supporting true streaming * through the StreamHandler. * - * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default Handler used for non-streaming responses - * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $streaming Handler used for streaming responses + * @param callable(RequestInterface, array): PromiseInterface $default Handler used for non-streaming responses + * @param callable(RequestInterface, array): PromiseInterface $streaming Handler used for streaming responses * - * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler. + * @return callable(RequestInterface, array): PromiseInterface Returns the composed handler. */ public static function wrapStreaming(callable $default, callable $streaming): callable { diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php index 1d89a8f..f24921f 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php @@ -53,8 +53,14 @@ class StreamHandler $request = $request->withoutHeader('Expect'); // Append a content-length header if body size is zero to match - // cURL's behavior. - if (0 === $request->getBody()->getSize()) { + // the behavior of `CurlHandler` + if ( + ( + 0 === \strcasecmp('PUT', $request->getMethod()) + || 0 === \strcasecmp('POST', $request->getMethod()) + ) + && 0 === $request->getBody()->getSize() + ) { $request = $request->withHeader('Content-Length', '0'); } @@ -327,8 +333,15 @@ class StreamHandler ); return $this->createResource( - function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) { + function () use ($uri, $contextResource, $context, $options, $request) { $resource = @\fopen((string) $uri, 'r', false, $contextResource); + + // See https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_the_http_response_header_predefined_variable + if (function_exists('http_get_last_response_headers')) { + /** @var array|null */ + $http_response_header = \http_get_last_response_headers(); + } + $this->lastHeaders = $http_response_header ?? []; if (false === $resource) { diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Middleware.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Middleware.php index 6edbb3f..9901da4 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Middleware.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Middleware.php @@ -187,12 +187,12 @@ final class Middleware * Middleware that logs requests, responses, and errors using a message * formatter. * - * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. - * * @param LoggerInterface $logger Logs messages. * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * + * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. + * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Pool.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Pool.php index 6277c61..ddc304b 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Pool.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Pool.php @@ -86,7 +86,7 @@ class Pool implements PromisorInterface * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in - * {@see \GuzzleHttp\Pool::__construct} + * {@see Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Utils.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Utils.php index df52927..c6a5893 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Utils.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/Utils.php @@ -79,7 +79,7 @@ final class Utils * * The returned handler is not wrapped by any default middlewares. * - * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. + * @return callable(\Psr\Http\Message\RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system. * * @throws \RuntimeException if no viable Handler is available. */ diff --git a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/functions.php b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/functions.php index 5edc66a..9ab4b96 100644 --- a/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/functions.php +++ b/xunifriend_RaeeC/vendor/guzzlehttp/guzzle/src/functions.php @@ -50,7 +50,7 @@ function debug_resource($value = null) * * The returned handler is not wrapped by any default middlewares. * - * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. + * @return callable(\Psr\Http\Message\RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system. * * @throws \RuntimeException if no viable Handler is available. * diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.editorconfig b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.editorconfig new file mode 100644 index 0000000..f7cd914 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 + +[*.{yml,md,xml}] +indent_style = space +indent_size = 2 + +[*.{rst,php}] +indent_style = space +indent_size = 4 + +[composer.json] +indent_style = space +indent_size = 2 + +[composer.lock] +indent_style = space +indent_size = 4 diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phive/phars.xml b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phive/phars.xml index 569106a..10f0df2 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phive/phars.xml +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phive/phars.xml @@ -1,4 +1,4 @@ - + diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php index 3ba86a4..af9423c 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php @@ -13,6 +13,7 @@ declare(strict_types=1); use PhpCsFixer\Config; use PhpCsFixer\Finder; +use PhpCsFixer\Runner; $finder = Finder::create() ->exclude('.github') @@ -26,7 +27,9 @@ $config = new Config(); return $config->setRules([ '@PER' => true, '@PER:risky' => true, - '@PHP81Migration' => true, + '@PHP83Migration' => true, + // Enable once PHP 8.4 is the minimum version + // '@PHP84Migration' => true, '@PHPUnit84Migration:risky' => true, 'array_syntax' => ['syntax' => 'short'], 'class_attributes_separation' => true, @@ -50,7 +53,6 @@ return $config->setRules([ 'semicolon_after_instruction' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, - 'single_blank_line_before_namespace' => true, 'single_class_element_per_statement' => true, 'single_line_comment_style' => true, 'single_quote' => true, @@ -68,4 +70,6 @@ return $config->setRules([ ], ]) ->setFinder($finder) - ->setRiskyAllowed(true); \ No newline at end of file + ->setRiskyAllowed(true) + ->setUnsupportedPhpVersionAllowed(true) + ->setParallelConfig(Runner\Parallel\ParallelConfigFactory::detect()); diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig index b7507fb..2a70c0a 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig @@ -9,7 +9,7 @@ "social": [ { "iconClass": "fab fa-github", "url": "https://github.com/maennchen/ZipStream-PHP"}, { "iconClass": "fas fa-envelope-open-text", "url": "https://github.com/maennchen/ZipStream-PHP/discussions"}, - { "iconClass": "fas fa-money-bill", "url": "https://opencollective.com/zipstream"}, + { "iconClass": "fas fa-money-bill", "url": "https://github.com/sponsors/maennchen"}, ] } %} \ No newline at end of file diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.tool-versions b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.tool-versions index 18e9535..727f5c9 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.tool-versions +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/.tool-versions @@ -1 +1 @@ -php 8.1.13 +php 8.5.0 diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/README.md b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/README.md index 155a265..3e527f0 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/README.md +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/README.md @@ -4,7 +4,8 @@ [![Coverage Status](https://coveralls.io/repos/github/maennchen/ZipStream-PHP/badge.svg?branch=main)](https://coveralls.io/github/maennchen/ZipStream-PHP?branch=main) [![Latest Stable Version](https://poser.pugx.org/maennchen/zipstream-php/v/stable)](https://packagist.org/packages/maennchen/zipstream-php) [![Total Downloads](https://poser.pugx.org/maennchen/zipstream-php/downloads)](https://packagist.org/packages/maennchen/zipstream-php) -[![Financial Contributors on Open Collective](https://opencollective.com/zipstream/all/badge.svg?label=financial+contributors)](https://opencollective.com/zipstream) [![License](https://img.shields.io/github/license/maennchen/zipstream-php.svg)](LICENSE) +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9524/badge)](https://www.bestpractices.dev/projects/9524) +[![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/maennchen/ZipStream-PHP/badge)](https://scorecard.dev/viewer/?uri=github.com/maennchen/ZipStream-PHP) ## Unstable Branch @@ -14,13 +15,17 @@ version. ## Overview -A fast and simple streaming zip file downloader for PHP. Using this library will save you from having to write the Zip to disk. You can directly send it to the user, which is much faster. It can work with S3 buckets or any PSR7 Stream. +A fast and simple streaming zip file downloader for PHP. Using this library will +save you from having to write the Zip to disk. You can directly send it to the +user, which is much faster. It can work with S3 buckets or any PSR7 Stream. Please see the [LICENSE](LICENSE) file for licensing and warranty information. ## Installation -Simply add a dependency on maennchen/zipstream-php to your project's composer.json file if you use Composer to manage the dependencies of your project. Use following command to add the package to your project's dependencies: +Simply add a dependency on maennchen/zipstream-php to your project's +`composer.json` file if you use Composer to manage the dependencies of your +project. Use following command to add the package to your project's dependencies: ```bash composer require maennchen/zipstream-php @@ -29,51 +34,164 @@ composer require maennchen/zipstream-php ## Usage For detailed instructions, please check the -[Documentation](https://maennchen.dev/ZipStream-PHP/). - -Here's a simple example: +[Documentation](https://maennchen.github.io/ZipStream-PHP/). ```php // Autoload the dependencies require 'vendor/autoload.php'; -// enable output of HTTP headers -$options = new ZipStream\Option\Archive(); -$options->setSendHttpHeaders(true); - // create a new zipstream object -$zip = new ZipStream\ZipStream('example.zip', $options); +$zip = new ZipStream\ZipStream( + outputName: 'example.zip', + + // enable output of HTTP headers + sendHttpHeaders: true, +); // create a file named 'hello.txt' -$zip->addFile('hello.txt', 'This is the contents of hello.txt'); +$zip->addFile( + fileName: 'hello.txt', + data: 'This is the contents of hello.txt', +); // add a file named 'some_image.jpg' from a local file 'path/to/image.jpg' -$zip->addFileFromPath('some_image.jpg', 'path/to/image.jpg'); +$zip->addFileFromPath( + fileName: 'some_image.jpg', + path: 'path/to/image.jpg', +); // finish the zip stream $zip->finish(); ``` +### Callback Output + +You can stream ZIP data to a custom callback function instead of directly to the browser: + +```php +use ZipStream\ZipStream; +use ZipStream\Stream\CallbackStreamWrapper; + +// Stream to a callback function with proper file handling +$outputFile = fopen('output.zip', 'wb'); +$backupFile = fopen('backup.zip', 'wb'); + +$zip = new ZipStream( + outputStream: CallbackStreamWrapper::open(function (string $data) use ($outputFile, $backupFile) { + // Handle ZIP data as it's generated + fwrite($outputFile, $data); + + // Send to multiple destinations efficiently + echo $data; // Browser + fwrite($backupFile, $data); // Backup file + }), + sendHttpHeaders: false, +); + +$zip->addFile('hello.txt', 'Hello World!'); +$zip->finish(); + +// Clean up resources +fclose($outputFile); +fclose($backupFile); +``` + +## Questions + +**💬 Questions? Please Read This First!** + +If you have a question about using this library, please *do not email the +authors directly*. Instead, head over to the +[GitHub Discussions](https://github.com/maennchen/ZipStream-PHP/discussions) +page — your question might already be answered there! Using Discussions helps +build a shared knowledge base, so others can also benefit from the answers. If +you need dedicated 1:1 support, check out the options available on +[@maennchen's sponsorship page](https://github.com/sponsors/maennchen?frequency=one-time&sponsor=maennchen). + +## Upgrade to version 3.1.2 + +- Minimum PHP Version: `8.2` + +## Upgrade to version 3.0.0 + +### General + +- Minimum PHP Version: `8.1` +- Only 64bit Architecture is supported. +- The class `ZipStream\Option\Method` has been replaced with the enum + `ZipStream\CompressionMethod`. +- Most classes have been flagged as `@internal` and should not be used from the + outside. + If you're using internal resources to extend this library, please open an + issue so that a clean interface can be added & published. + The externally available classes & enums are: + - `ZipStream\CompressionMethod` + - `ZipStream\Exception*` + - `ZipStream\ZipStream` + +### Archive Options + +- The class `ZipStream\Option\Archive` has been replaced in favor of named + arguments in the `ZipStream\ZipStream` constructor. +- The archive options `largeFileSize` & `largeFileMethod` has been removed. If + you want different `compressionMethods` based on the file size, you'll have to + implement this yourself. +- The archive option `httpHeaderCallback` changed the type from `callable` to + `Closure`. +- The archive option `zeroHeader` has been replaced with the option + `defaultEnableZeroHeader` and can be overridden for every file. Its default + value changed from `false` to `true`. +- The archive option `statFiles` was removed since the library no longer checks + filesizes this way. +- The archive option `deflateLevel` has been replaced with the option + `defaultDeflateLevel` and can be overridden for every file. +- The first argument (`name`) of the `ZipStream\ZipStream` constructor has been + replaced with the named argument `outputName`. +- Headers are now also sent if the `outputName` is empty. If you do not want to + automatically send http headers, set `sendHttpHeaders` to `false`. + +### File Options + +- The class `ZipStream\Option\File` has been replaced in favor of named + arguments in the `ZipStream\ZipStream->addFile*` functions. +- The file option `method` has been renamed to `compressionMethod`. +- The file option `time` has been renamed to `lastModificationDateTime`. +- The file option `size` has been renamed to `maxSize`. + ## Upgrade to version 2.0.0 -- Only the self opened streams will be closed (#139) - If you were relying on ZipStream to close streams that the library didn't open, - you'll need to close them yourself now. +https://github.com/maennchen/ZipStream-PHP/tree/2.0.0#upgrade-to-version-200 ## Upgrade to version 1.0.0 -- All options parameters to all function have been moved from an `array` to structured option objects. See [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Available-options) for examples. -- The whole library has been refactored. The minimal PHP requirement has been raised to PHP 7.1. - -## Usage with Symfony and S3 - -You can find example code on [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Symfony-example). +https://github.com/maennchen/ZipStream-PHP/tree/2.0.0#upgrade-to-version-100 ## Contributing ZipStream-PHP is a collaborative project. Please take a look at the [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) file. +## Version Support + +Versions are supported according to the table below. + +Please do not open any pull requests contradicting the current version support +status. + +Careful: Always check the `README` on `main` for up-to-date information. + +| Version | New Features | Bugfixes | Security | +|---------|--------------|----------|----------| +| *3* | ✓ | ✓ | ✓ | +| *2* | ✗ | ✗ | ✓ | +| *1* | ✗ | ✗ | ✗ | +| *0* | ✗ | ✗ | ✗ | + +This library aligns itself with the PHP core support. New features and bugfixes +will only target PHP versions according to their current status. + +See: https://www.php.net/supported-versions.php + ## About the Authors - Paul Duncan - https://pablotron.org/ @@ -81,34 +199,3 @@ ZipStream-PHP is a collaborative project. Please take a look at the - Jesse G. Donat - https://donatstudios.com - Nicolas CARPi - https://www.deltablot.com - Nik Barham - https://www.brokencube.co.uk - -## Contributors - -### Code Contributors - -This project exists thanks to all the people who contribute. -[[Contribute](.github/CONTRIBUTING.md)]. - - -### Financial Contributors - -Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/zipstream/contribute)] - -#### Individuals - - - -#### Organizations - -Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/zipstream/contribute)] - - - - - - - - - - - diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/composer.json b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/composer.json index 47eee14..f45acd4 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/composer.json +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/composer.json @@ -22,28 +22,42 @@ } ], "require": { - "php": "^7.4 || ^8.0", - "symfony/polyfill-mbstring": "^1.0", - "psr/http-message": "^1.0", - "myclabs/php-enum": "^1.5" + "php-64bit": "^8.3", + "ext-mbstring": "*", + "ext-zlib": "*" }, "require-dev": { - "phpunit/phpunit": "^8.5.8 || ^9.4.2", - "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0", + "phpunit/phpunit": "^12.0", + "guzzlehttp/guzzle": "^7.5", "ext-zip": "*", "mikey179/vfsstream": "^1.6", - "vimeo/psalm": "^4.1", - "php-coveralls/php-coveralls": "^2.4", - "friendsofphp/php-cs-fixer": "^3.9" + "php-coveralls/php-coveralls": "^2.5", + "friendsofphp/php-cs-fixer": "^3.86", + "vimeo/psalm": "^6.0", + "brianium/paratest": "^7.7" + }, + "suggest": { + "psr/http-message": "^2.0", + "guzzlehttp/psr7": "^2.4" }, "scripts": { "format": "php-cs-fixer fix", - "test": "composer run test:unit && composer run test:formatted && composer run test:lint", - "test:unit": "phpunit --coverage-clover=coverage.clover.xml", - "test:formatted": "composer run format -- --dry-run --stop-on-violation --using-cache=no", - "test:lint": "psalm --stats --show-info --find-unused-psalm-suppress", - "coverage:report": "php-coveralls --coverage_clover=coverage.clover.xml --json_path=coveralls-upload.json -v", - "install:tools": "phive install --trust-gpg-keys 0x67F861C3D889C656", + "test": [ + "@test:unit", + "@test:formatted", + "@test:lint" + ], + "test:unit:setup-cov": "@putenv XDEBUG_MODE=coverage", + "test:unit": "paratest --functional", + "test:unit:cov": ["@test:unit:setup-cov", "@test:unit --coverage-clover=coverage.clover.xml --coverage-html cov"], + "test:unit:slow": "@test:unit --group slow", + "test:unit:slow:cov": ["@test:unit:setup-cov", "@test:unit --coverage-clover=coverage.clover.xml --coverage-html cov --group slow"], + "test:unit:fast": "@test:unit --exclude-group slow", + "test:unit:fast:cov": ["@test:unit:setup-cov", "@test:unit --coverage-clover=coverage.clover.xml --coverage-html cov --exclude-group slow"], + "test:formatted": "@format --dry-run --stop-on-violation --using-cache=no", + "test:lint": "psalm --stats --show-info=true --find-unused-psalm-suppress", + "coverage:report": "php-coveralls --coverage_clover=coverage.clover.xml --json_path=coveralls-upload.json --insecure", + "install:tools": "phive install --trust-gpg-keys 0x67F861C3D889C656 --trust-gpg-keys 0x8AC0BAA79732DD42 --trust-gpg-keys 0x6DA3ACC4991FFAE5", "docs:generate": "tools/phpdocumentor --sourcecode" }, "autoload": { @@ -51,6 +65,9 @@ "ZipStream\\": "src/" } }, + "autoload-dev": { + "psr-4": { "ZipStream\\Test\\": "test/" } + }, "archive": { "exclude": [ "/composer.lock", diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/ContentLength.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/ContentLength.rst index e51e692..3b75dd7 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/ContentLength.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/ContentLength.rst @@ -1,79 +1,47 @@ Adding Content-Length header ============= -Adding a ``Content-Length`` header for ``ZipStream`` is not trivial since the -size is not known beforehand. +Adding a ``Content-Length`` header for ``ZipStream`` can be achieved by +using the options ``SIMULATION_STRICT`` or ``SIMULATION_LAX`` in the +``operationMode`` parameter. -The following workaround adds an approximated header: +In the ``SIMULATION_STRICT`` mode, ``ZipStream`` will not allow to calculate the +size based on reading the whole file. ``SIMULATION_LAX`` will read the whole +file if necessary. + +``SIMULATION_STRICT`` is therefore useful to make sure that the size can be +calculated efficiently. .. code-block:: php + use ZipStream\OperationMode; + use ZipStream\ZipStream; - class Zip - { - /** @var string */ - private $name; + $zip = new ZipStream( + operationMode: OperationMode::SIMULATE_STRICT, // or SIMULATE_LAX + defaultEnableZeroHeader: false, + sendHttpHeaders: true, + outputStream: $stream, + ); - private $files = []; + // Normally add files + $zip->addFile('sample.txt', 'Sample String Data'); - public function __construct($name) - { - $this->name = $name; + // Use addFileFromCallback and exactSize if you want to defer opening of + // the file resource + $zip->addFileFromCallback( + 'sample.txt', + exactSize: 18, + callback: function () { + return fopen('...'); } + ); - public function addFile($name, $data) - { - $this->files[] = ['type' => 'addFile', 'name' => $name, 'data' => $data]; - } + // Read resulting file size + $size = $zip->finish(); + + // Tell it to the browser + header('Content-Length: '. $size); + + // Execute the Simulation and stream the actual zip to the client + $zip->executeSimulation(); - public function addFileFromPath($name, $path) - { - $this->files[] = ['type' => 'addFileFromPath', 'name' => $name, 'path' => $path]; - } - - public function getEstimate() - { - $estimate = 22; - foreach ($this->files as $file) { - $estimate += 76 + 2 * strlen($file['name']); - if ($file['type'] === 'addFile') { - $estimate += strlen($file['data']); - } - if ($file['type'] === 'addFileFromPath') { - $estimate += filesize($file['path']); - } - } - return $estimate; - } - - public function finish() - { - header('Content-Length: ' . $this->getEstimate()); - $options = new \ZipStream\Option\Archive(); - $options->setSendHttpHeaders(true); - $options->setEnableZip64(false); - $options->setDeflateLevel(-1); - $zip = new \ZipStream\ZipStream($this->name, $options); - - $fileOptions = new \ZipStream\Option\File(); - $fileOptions->setMethod(\ZipStream\Option\Method::STORE()); - foreach ($this->files as $file) { - if ($file['type'] === 'addFile') { - $zip->addFile($file['name'], $file['data'], $fileOptions); - } - if ($file['type'] === 'addFileFromPath') { - $zip->addFileFromPath($file['name'], $file['path'], $fileOptions); - } - } - $zip->finish(); - exit; - } - } - -It only works with the following constraints: - -- All file content is known beforehand. -- Content Deflation is disabled - -Thanks to -`partiellkorrekt `_ -for this workaround. \ No newline at end of file diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/FlySystem.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/FlySystem.rst index 0243f24..4e6c6fb 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/FlySystem.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/FlySystem.rst @@ -14,20 +14,21 @@ default one, and pass it to Flysystem ``putStream`` method. // the content is lost when closing the stream / opening another one $tempStream = fopen('php://memory', 'w+'); - // Init Options - $zipStreamOptions = new Archive(); - $zipStreamOptions->setOutputStream($tempStream); - // Create Zip Archive - $zipStream = new ZipStream('test.zip', $zipStreamOptions); + $zipStream = new ZipStream( + outputStream: $tempStream, + outputName: 'test.zip', + ); $zipStream->addFile('test.txt', 'text'); $zipStream->finish(); - // Store File (see Flysystem documentation, and all its framework integration) - $adapter = new Local(__DIR__.'/path/to/folder'); // Can be any adapter (AWS, Google, Ftp, etc.) + // Store File + // (see Flysystem documentation, and all its framework integration) + // Can be any adapter (AWS, Google, Ftp, etc.) + $adapter = new Local(__DIR__.'/path/to/folder'); $filesystem = new Filesystem($adapter); - $filesystem->putStream('test.zip', $tempStream) + $filesystem->writeStream('test.zip', $tempStream) // Close Stream - fclose($tempStream); \ No newline at end of file + fclose($tempStream); diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Options.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Options.rst index eabaa6f..373afef 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Options.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Options.rst @@ -2,60 +2,68 @@ Available options =============== Here is the full list of options available to you. You can also have a look at -``src/Option/Archive.php`` file. - -First, an instance of ``ZipStream\Option\Archive`` needs to be created, and -after that you use setters methods to modify the values. +``src/ZipStream.php`` file. .. code-block:: php + use ZipStream\ZipStream; - use ZipStream\Option\Archive as ArchiveOptions; require_once 'vendor/autoload.php'; - $opt = new ArchiveOptions(); + $zip = new ZipStream( + // Define output stream + // (argument is either a resource or implementing + // `Psr\Http\Message\StreamInterface`) + // + // Setup with `psr/http-message` & `guzzlehttp/psr7` dependencies + // required when using `Psr\Http\Message\StreamInterface`. + // + // Can also use CallbackStreamWrapper for custom output handling: + // outputStream: CallbackStreamWrapper::open(function($data) { /* handle data */ }), + outputStream: $filePointer, - // Define output stream (argument is of type resource) - $opt->setOutputStream($fd); + // Set the deflate level (default is 6; use -1 to disable it) + defaultDeflateLevel: 6, - // Set the deflate level (default is 6; use -1 to disable it) - $opt->setDeflateLevel(6); + // Add a comment to the zip file + comment: 'This is a comment.', - // Add a comment to the zip file - $opt->setComment('This is a comment.'); + // Send http headers (default is true) + sendHttpHeaders: false, - // Size, in bytes, of the largest file to try and load into memory (used by addFileFromPath()). Large files may also be compressed differently; see the 'largeFileMethod' option. - $opt->setLargeFileSize(30000000); + // HTTP Content-Disposition. + // Defaults to 'attachment', where FILENAME is the specified filename. + // Note that this does nothing if you are not sending HTTP headers. + contentDisposition: 'attachment', - // How to handle large files. Legal values are STORE (the default), or DEFLATE. Store sends the file raw and is significantly faster, while DEFLATE compresses the file and is much, much slower. Note that deflate must compress the file twice and is extremely slow. - $opt->setLargeFileMethod(ZipStream\Option\Method::STORE()); - $opt->setLargeFileMethod(ZipStream\Option\Method::DEFLATE()); + // Output Name for HTTP Content-Disposition + // Defaults to no name + outputName: "example.zip", - // Send http headers (default is false) - $opt->setSendHttpHeaders(false); + // HTTP Content-Type. + // Defaults to 'application/x-zip'. + // Note that this does nothing if you are not sending HTTP headers. + contentType: 'application/x-zip', - // HTTP Content-Disposition. Defaults to 'attachment', where FILENAME is the specified filename. Note that this does nothing if you are not sending HTTP headers. - $opt->setContentDisposition('attachment'); + // Set the function called for setting headers. + // Default is the `header()` of PHP + httpHeaderCallback: header(...), - // Set the content type (does nothing if you are not sending HTTP headers) - $opt->setContentType('application/x-zip'); + // Enable streaming files with single read where general purpose bit 3 + // indicates local file header contain zero values in crc and size + // fields, these appear only after file contents in data descriptor + // block. + // Set to true if your input stream is remote + // (used with addFileFromStream()). + // Default is false. + defaultEnableZeroHeader: false, - // Set the function called for setting headers. Default is the `header()` of PHP - $opt->setHttpHeaderCallback('header'); + // Enable zip64 extension, allowing very large archives + // (> 4Gb or file count > 64k) + // Default is true + enableZip64: true, - // Enable streaming files with single read where general purpose bit 3 indicates local file header contain zero values in crc and size fields, these appear only after file contents in data descriptor block. Default is false. Set to true if your input stream is remote (used with addFileFromStream()). - $opt->setZeroHeader(false); - - // Enable reading file stat for determining file size. When a 32-bit system reads file size that is over 2 GB, invalid value appears in file size due to integer overflow. Should be disabled on 32-bit systems with method addFileFromPath if any file may exceed 2 GB. In this case file will be read in blocks and correct size will be determined from content. Default is true. - $opt->setStatFiles(true); - - // Enable zip64 extension, allowing very large archives (> 4Gb or file count > 64k) - // default is true - $opt->setEnableZip64(true); - - // Flush output buffer after every write - // default is false - $opt->setFlushOutput(true); - - // Now that everything is set you can pass the options to the ZipStream instance - $zip = new ZipStream('example.zip', $opt); + // Flush output buffer after every write + // Default is false + flushOutput: true, + ); diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/PSR7Streams.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/PSR7Streams.rst index 4b4ca4b..22af71d 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/PSR7Streams.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/PSR7Streams.rst @@ -12,7 +12,10 @@ Example --------------- .. code-block:: php - + $stream = $response->getBody(); // add a file named 'streamfile.txt' from the content of the stream - $zip->addFileFromPsr7Stream('streamfile.txt', $stream); + $zip->addFileFromPsr7Stream( + fileName: 'streamfile.txt', + stream: $stream, + ); diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/StreamOutput.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/StreamOutput.rst index 1a0495f..60593f9 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/StreamOutput.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/StreamOutput.rst @@ -5,9 +5,9 @@ Stream to S3 Bucket --------------- .. code-block:: php + use Aws\S3\S3Client; use Aws\Credentials\CredentialProvider; - use ZipStream\Option\Archive; use ZipStream\ZipStream; $bucket = 'your bucket name'; @@ -21,13 +21,93 @@ Stream to S3 Bucket $zipFile = fopen("s3://$bucket/example.zip", 'w'); - $options = new Archive(); - $options->setEnableZip64(false); - $options->setOutputStream($zipFile); + $zip = new ZipStream( + enableZip64: false, + outputStream: $zipFile, + ); - $zip = new ZipStream(null, $options); - $zip->addFile('file1.txt', 'File1 data'); - $zip->addFile('file2.txt', 'File2 data'); + $zip->addFile( + fileName: 'file1.txt', + data: 'File1 data', + ); + $zip->addFile( + fileName: 'file2.txt', + data: 'File2 data', + ); $zip->finish(); - fclose($zipFile); \ No newline at end of file + fclose($zipFile); + +Stream to Callback Function +--------------------------- + +The CallbackStreamWrapper allows you to stream ZIP data to a custom callback function, +enabling flexible output handling such as streaming to multiple destinations, +progress tracking, or data transformation. + +.. code-block:: php + + use ZipStream\ZipStream; + use ZipStream\Stream\CallbackStreamWrapper; + + // Example 1: Stream to multiple destinations with proper file handling + $backupFile = fopen('backup.zip', 'wb'); + $logFile = fopen('transfer.log', 'ab'); + + $zip = new ZipStream( + outputStream: CallbackStreamWrapper::open(function (string $data) use ($backupFile, $logFile) { + // Send to browser + echo $data; + + // Save to file efficiently + fwrite($backupFile, $data); + + // Log transfer progress + fwrite($logFile, "Transferred " . strlen($data) . " bytes\n"); + }), + sendHttpHeaders: false, + ); + + $zip->addFile('hello.txt', 'Hello World!'); + $zip->finish(); + + // Clean up resources + fclose($backupFile); + fclose($logFile); + +.. code-block:: php + + // Example 2: Progress tracking + $totalBytes = 0; + $zip = new ZipStream( + outputStream: CallbackStreamWrapper::open(function (string $data) use (&$totalBytes) { + $totalBytes += strlen($data); + reportProgress($totalBytes); // Report progress to your tracking system + + // Your actual output handling + echo $data; + }), + sendHttpHeaders: false, + ); + + $zip->addFile('large_file.txt', str_repeat('A', 10000)); + $zip->finish(); + +.. code-block:: php + + // Example 3: Data transformation using PHP stream filters + // For data transformations, prefer PHP's built-in stream filters + $outputStream = fopen('php://output', 'w'); + stream_filter_append($outputStream, 'convert.base64-encode'); + + $zip = new ZipStream( + outputStream: $outputStream, + sendHttpHeaders: false, + ); + + $zip->addFile('secret.txt', 'Confidential data'); + $zip->finish(); + fclose($outputStream); + +.. note:: + For data transformations, PHP's built-in stream filters are preferred over callback transformations. Stream filters operate at the stream level and maintain data integrity. You can register custom filters using ``stream_filter_register()`` for specialized transformations. diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Symfony.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Symfony.rst index 18f9059..902552c 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Symfony.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/Symfony.rst @@ -31,7 +31,7 @@ stored in an AWS S3 bucket by key: */ public function zipStreamAction() { - //sample test file on s3 + // sample test file on s3 $s3keys = array( "ziptestfolder/file1.txt" ); @@ -39,18 +39,18 @@ stored in an AWS S3 bucket by key: $s3Client = $this->get('app.amazon.s3'); //s3client service $s3Client->registerStreamWrapper(); //required - //using StreamedResponse to wrap ZipStream functionality for files on AWS s3. + // using StreamedResponse to wrap ZipStream functionality + // for files on AWS s3. $response = new StreamedResponse(function() use($s3keys, $s3Client) { // Define suitable options for ZipStream Archive. - $options = new \ZipStream\Option\Archive(); - $options->setContentType('application/octet-stream'); // this is needed to prevent issues with truncated zip files - $options->setZeroHeader(true); - $options->setComment('test zip file.'); - //initialise zipstream with output zip filename and options. - $zip = new ZipStream\ZipStream('test.zip', $options); + $zip = new ZipStream\ZipStream( + outputName: 'test.zip', + defaultEnableZeroHeader: true, + contentType: 'application/octet-stream', + ); //loop keys - useful for multiple files foreach ($s3keys as $key) { @@ -58,15 +58,19 @@ stored in an AWS S3 bucket by key: //file using the same name. $fileName = basename($key); - //concatenate s3path. - $bucket = 'bucketname'; //replace with your bucket name or get from parameters file. + // concatenate s3path. + // replace with your bucket name or get from parameters file. + $bucket = 'bucketname'; $s3path = "s3://" . $bucket . "/" . $key; //addFileFromStream if ($streamRead = fopen($s3path, 'r')) { - $zip->addFileFromStream($fileName, $streamRead); + $zip->addFileFromStream( + fileName: $fileName, + stream: $streamRead, + ); } else { - die('Could not open stream for reading'); + die('Could not open stream for reading'); } } @@ -123,4 +127,4 @@ You need to add correct permissions 's3' => ['ACL' => 'public-read'], ]); - fopen($path, 'w', null, $outputContext); \ No newline at end of file + fopen($path, 'w', null, $outputContext); diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/index.rst b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/index.rst index 01ea229..70211c0 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/index.rst +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/guides/index.rst @@ -22,11 +22,35 @@ Installation Simply add a dependency on ``maennchen/zipstream-php`` to your project's ``composer.json`` file if you use Composer to manage the dependencies of your -project. Use following command to add the package to your project's dependencies: +project. Use following command to add the package to your project's +dependencies: .. code-block:: sh composer require maennchen/zipstream-php +If you want to use``addFileFromPsr7Stream``` +(``Psr\Http\Message\StreamInterface``) or use a stream instead of a +``resource`` as ``outputStream``, the following dependencies must be installed +as well: + +.. code-block:: sh + composer require psr/http-message guzzlehttp/psr7 + +If ``composer install`` yields the following error, your installation is missing +the `mbstring extension `_, +either `install it `_ +or run the following command: + +.. code-block:: + Your requirements could not be resolved to an installable set of packages. + + Problem 1 + - Root composer.json requires PHP extension ext-mbstring * but it is + missing from your system. Install or enable PHP's mbstrings extension. + +.. code-block:: sh + composer require symfony/polyfill-mbstring + Usage Intro --------------- @@ -37,25 +61,42 @@ Here's a simple example: // Autoload the dependencies require 'vendor/autoload.php'; - // enable output of HTTP headers - $options = new ZipStream\Option\Archive(); - $options->setSendHttpHeaders(true); - // create a new zipstream object - $zip = new ZipStream\ZipStream('example.zip', $options); + $zip = new ZipStream\ZipStream( + outputName: 'example.zip', + + // enable output of HTTP headers + sendHttpHeaders: true, + ); // create a file named 'hello.txt' - $zip->addFile('hello.txt', 'This is the contents of hello.txt'); + $zip->addFile( + fileName: 'hello.txt', + data: 'This is the contents of hello.txt', + ); // add a file named 'some_image.jpg' from a local file 'path/to/image.jpg' - $zip->addFileFromPath('some_image.jpg', 'path/to/image.jpg'); + $zip->addFileFromPath( + fileName: 'some_image.jpg', + path: 'path/to/image.jpg', + ); // add a file named 'goodbye.txt' from an open stream resource - $fp = tmpfile(); - fwrite($fp, 'The quick brown fox jumped over the lazy dog.'); - rewind($fp); - $zip->addFileFromStream('goodbye.txt', $fp); - fclose($fp); + $filePointer = tmpfile(); + fwrite($filePointer, 'The quick brown fox jumped over the lazy dog.'); + rewind($filePointer); + $zip->addFileFromStream( + fileName: 'goodbye.txt', + stream: $filePointer, + ); + fclose($filePointer); + + // add a file named 'streamfile.txt' from the body of a `guzzle` response + // Setup with `psr/http-message` & `guzzlehttp/psr7` dependencies required. + $zip->addFileFromPsr7Stream( + fileName: 'streamfile.txt', + stream: $response->getBody(), + ); // finish the zip stream $zip->finish(); @@ -72,14 +113,14 @@ The native Mac OS archive extraction tool prior to macOS 10.15 might not open archives in some conditions. A workaround is to disable the Zip64 feature with the option ``enableZip64: false``. This limits the archive to 4 Gb and 64k files but will allow users on macOS 10.14 and below to open them without issue. -See `#116 `_. +See `#116 `_. The linux ``unzip`` utility might not handle properly unicode characters. It is recommended to extract with another tool like `7-zip `_. See `#146 `_. -It is the responsability of the client code to make sure that files are not +It is the responsibility of the client code to make sure that files are not saved with the same path, as it is not possible for the library to figure it out while streaming a zip. -See `#154 `_. \ No newline at end of file +See `#154 `_. diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpdoc.dist.xml b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpdoc.dist.xml index 0a18848..b98fe1c 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpdoc.dist.xml +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpdoc.dist.xml @@ -5,7 +5,7 @@ xmlns="https://www.phpdoc.org" xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/phpDocumentor/phpDocumentor/master/data/xsd/phpdoc.xsd" > - ZipStream-PHP + 💾 ZipStream-PHP docs diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpunit.xml.dist b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpunit.xml.dist index 8a2f318..1b02a3a 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpunit.xml.dist +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/phpunit.xml.dist @@ -1,14 +1,15 @@ - - - - src - - + + test + + + src + + diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/psalm.xml b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/psalm.xml index 4e4c4f6..56af0e6 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/psalm.xml +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/psalm.xml @@ -1,53 +1,25 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Bigint.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Bigint.php deleted file mode 100644 index f2565e9..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Bigint.php +++ /dev/null @@ -1,174 +0,0 @@ -fillBytes($value, 0, 8); - } - - /** - * Get an instance - * - * @param int $value - * @return Bigint - */ - public static function init(int $value = 0): self - { - return new self($value); - } - - /** - * Fill bytes from low to high - * - * @param int $low - * @param int $high - * @return Bigint - */ - public static function fromLowHigh(int $low, int $high): self - { - $bigint = new self(); - $bigint->fillBytes($low, 0, 4); - $bigint->fillBytes($high, 4, 4); - return $bigint; - } - - /** - * Get high 32 - * - * @return int - */ - public function getHigh32(): int - { - return $this->getValue(4, 4); - } - - /** - * Get value from bytes array - * - * @param int $end - * @param int $length - * @return int - */ - public function getValue(int $end = 0, int $length = 8): int - { - $result = 0; - for ($i = $end + $length - 1; $i >= $end; $i--) { - $result <<= 8; - $result |= $this->bytes[$i]; - } - return $result; - } - - /** - * Get low FF - * - * @param bool $force - * @return float - */ - public function getLowFF(bool $force = false): float - { - if ($force || $this->isOver32()) { - return (float)0xFFFFFFFF; - } - return (float)$this->getLow32(); - } - - /** - * Check if is over 32 - * - * @psalm-suppress ArgumentTypeCoercion - * @param bool $force - * @return bool - */ - public function isOver32(bool $force = false): bool - { - // value 0xFFFFFFFF already needs a Zip64 header - return $force || - max(array_slice($this->bytes, 4, 4)) > 0 || - min(array_slice($this->bytes, 0, 4)) === 0xFF; - } - - /** - * Get low 32 - * - * @return int - */ - public function getLow32(): int - { - return $this->getValue(0, 4); - } - - /** - * Get hexadecimal - * - * @return string - */ - public function getHex64(): string - { - $result = '0x'; - for ($i = 7; $i >= 0; $i--) { - $result .= sprintf('%02X', $this->bytes[$i]); - } - return $result; - } - - /** - * Add - * - * @param Bigint $other - * @return Bigint - */ - public function add(self $other): self - { - $result = clone $this; - $overflow = false; - for ($i = 0; $i < 8; $i++) { - $result->bytes[$i] += $other->bytes[$i]; - if ($overflow) { - $result->bytes[$i]++; - $overflow = false; - } - if ($result->bytes[$i] & 0x100) { - $overflow = true; - $result->bytes[$i] &= 0xFF; - } - } - if ($overflow) { - throw new OverflowException(); - } - return $result; - } - - /** - * Fill the bytes field with int - * - * @param int $value - * @param int $start - * @param int $count - * @return void - */ - protected function fillBytes(int $value, int $start, int $count): void - { - for ($i = 0; $i < $count; $i++) { - $this->bytes[$start + $i] = $i >= PHP_INT_SIZE ? 0 : $value & 0xFF; - $value >>= 8; - } - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CentralDirectoryFileHeader.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CentralDirectoryFileHeader.php new file mode 100644 index 0000000..ffcfc6e --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CentralDirectoryFileHeader.php @@ -0,0 +1,52 @@ +value), + new PackField(format: 'V', value: Time::dateTimeToDosTime($lastModificationDateTime)), + new PackField(format: 'V', value: $crc32), + new PackField(format: 'V', value: $compressedSize), + new PackField(format: 'V', value: $uncompressedSize), + new PackField(format: 'v', value: strlen($fileName)), + new PackField(format: 'v', value: strlen($extraField)), + new PackField(format: 'v', value: strlen($fileComment)), + new PackField(format: 'v', value: $diskNumberStart), + new PackField(format: 'v', value: $internalFileAttributes), + new PackField(format: 'V', value: $externalFileAttributes), + new PackField(format: 'V', value: $relativeOffsetOfLocalHeader), + ) . $fileName . $extraField . $fileComment; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CompressionMethod.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CompressionMethod.php new file mode 100644 index 0000000..2e1289c --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/CompressionMethod.php @@ -0,0 +1,109 @@ +filter) { - $this->removeDeflateFilter(); - $this->seek(0); - $this->addDeflateFilter($this->options); - } else { - rewind($this->stream); - } - } - - /** - * Remove the deflate filter - * - * @return void - */ - public function removeDeflateFilter(): void - { - if (!$this->filter) { - return; - } - stream_filter_remove($this->filter); - $this->filter = null; - } - - /** - * Add a deflate filter - * - * @param Option\File $options - * @return void - */ - public function addDeflateFilter(Option\File $options): void - { - $this->options = $options; - // parameter 4 for stream_filter_append expects array - // so we convert the option object in an array - $optionsArr = [ - 'comment' => $options->getComment(), - 'method' => $options->getMethod(), - 'deflateLevel' => $options->getDeflateLevel(), - 'time' => $options->getTime(), - ]; - $this->filter = stream_filter_append( - $this->stream, - 'zlib.deflate', - STREAM_FILTER_READ, - $optionsArr - ); - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/EndOfCentralDirectory.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/EndOfCentralDirectory.php new file mode 100644 index 0000000..4320add --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/EndOfCentralDirectory.php @@ -0,0 +1,35 @@ +format(DateTimeInterface::ATOM) . " can't be represented as DOS time / date."); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/EncodingException.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/EncodingException.php deleted file mode 100644 index 5b0267d..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/EncodingException.php +++ /dev/null @@ -1,14 +0,0 @@ -resource = $resource; + parent::__construct('Function ' . $function . 'failed on resource.'); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/SimulationFileUnknownException.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/SimulationFileUnknownException.php new file mode 100644 index 0000000..240f825 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Exception/SimulationFileUnknownException.php @@ -0,0 +1,21 @@ +fileName = self::filterFilename($fileName); + $this->checkEncoding(); - /** - * @var Bigint - */ - public $len; + if ($this->enableZeroHeader) { + $this->generalPurposeBitFlag |= GeneralPurposeBitFlag::ZERO_HEADER; + } - /** - * @var Bigint - */ - public $zlen; - - /** @var int */ - public $crc; - - /** - * @var Bigint - */ - public $hlen; - - /** - * @var Bigint - */ - public $ofs; - - /** - * @var int - */ - public $bits; - - /** - * @var Version - */ - public $version; - - /** - * @var ZipStream - */ - public $zip; - - /** - * @var resource - */ - private $deflate; - - /** - * @var HashContext - */ - private $hash; - - /** - * @var Method - */ - private $method; - - /** - * @var Bigint - */ - private $totalLength; - - public function __construct(ZipStream $zip, string $name, ?FileOptions $opt = null) - { - $this->zip = $zip; - - $this->name = $name; - $this->opt = $opt ?: new FileOptions(); - $this->method = $this->opt->getMethod(); - $this->version = Version::STORE(); - $this->ofs = new Bigint(); + $this->version = $this->compressionMethod === CompressionMethod::DEFLATE ? Version::DEFLATE : Version::STORE; } - public function processPath(string $path): void + public function cloneSimulationExecution(): self { - if (!is_readable($path)) { - if (!file_exists($path)) { - throw new FileNotFoundException($path); - } - throw new FileNotReadableException($path); - } - if ($this->zip->isLargeFile($path) === false) { - $data = file_get_contents($path); - $this->processData($data); + return new self( + $this->fileName, + $this->dataCallback, + OperationMode::NORMAL, + $this->startOffset, + $this->compressionMethod, + $this->comment, + $this->lastModificationDateTime, + $this->deflateLevel, + $this->maxSize, + $this->exactSize, + $this->enableZip64, + $this->enableZeroHeader, + $this->send, + $this->recordSentBytes, + ); + } + + public function process(): string + { + $forecastSize = $this->forecastSize(); + + if ($this->enableZeroHeader) { + // No calculation required + } elseif ($this->isSimulation() && $forecastSize !== null) { + $this->uncompressedSize = $forecastSize; + $this->compressedSize = $forecastSize; } else { - $this->method = $this->zip->opt->getLargeFileMethod(); - - $stream = new DeflateStream(fopen($path, 'rb')); - $this->processStream($stream); - $stream->close(); + $this->readStream(send: false); + if (rewind($this->unpackStream()) === false) { + throw new ResourceActionException('rewind', $this->unpackStream()); + } } + + $this->addFileHeader(); + + $detectedSize = $forecastSize ?? ($this->compressedSize > 0 ? $this->compressedSize : null); + + if ( + $this->isSimulation() + && $detectedSize !== null + ) { + $this->uncompressedSize = $detectedSize; + $this->compressedSize = $detectedSize; + ($this->recordSentBytes)($detectedSize); + } else { + $this->readStream(send: true); + } + + $this->addFileFooter(); + return $this->getCdrFile(); } - public function processData(string $data): void + /** + * @return resource + */ + private function unpackStream() { - $this->len = new Bigint(strlen($data)); - $this->crc = crc32($data); - - // compress data if needed - if ($this->method->equals(Method::DEFLATE())) { - $data = gzdeflate($data); + if ($this->stream) { + return $this->stream; } - $this->zlen = new Bigint(strlen($data)); - $this->addFileHeader(); - $this->zip->send($data); - $this->addFileFooter(); + if ($this->operationMode === OperationMode::SIMULATE_STRICT) { + throw new SimulationFileUnknownException(); + } + + $this->stream = ($this->dataCallback)(); + + if (!$this->enableZeroHeader && !stream_get_meta_data($this->stream)['seekable']) { + throw new StreamNotSeekableException(); + } + if (!( + str_contains(stream_get_meta_data($this->stream)['mode'], 'r') + || str_contains(stream_get_meta_data($this->stream)['mode'], 'w+') + || str_contains(stream_get_meta_data($this->stream)['mode'], 'a+') + || str_contains(stream_get_meta_data($this->stream)['mode'], 'x+') + || str_contains(stream_get_meta_data($this->stream)['mode'], 'c+') + )) { + throw new StreamNotReadableException(); + } + + return $this->stream; + } + + private function forecastSize(): ?int + { + if ($this->compressionMethod !== CompressionMethod::STORE) { + return null; + } + if ($this->exactSize !== null) { + return $this->exactSize; + } + $fstat = fstat($this->unpackStream()); + if (!$fstat || !array_key_exists('size', $fstat) || $fstat['size'] < 1) { + return null; + } + + if ($this->maxSize !== null && $this->maxSize < $fstat['size']) { + return $this->maxSize; + } + + return $fstat['size']; } /** * Create and send zip header for this file. - * - * @return void - * @throws \ZipStream\Exception\EncodingException */ - public function addFileHeader(): void + private function addFileHeader(): void { - $name = static::filterFilename($this->name); + $forceEnableZip64 = $this->enableZeroHeader && $this->enableZip64; - // calculate name length - $nameLength = strlen($name); + $footer = $this->buildZip64ExtraBlock($forceEnableZip64); - // create dos timestamp - $time = static::dosTime($this->opt->getTime()->getTimestamp()); + $zip64Enabled = $footer !== ''; - $comment = $this->opt->getComment(); - - if (!mb_check_encoding($name, 'ASCII') || - !mb_check_encoding($comment, 'ASCII')) { - // Sets Bit 11: Language encoding flag (EFS). If this bit is set, - // the filename and comment fields for this file - // MUST be encoded using UTF-8. (see APPENDIX D) - if (mb_check_encoding($name, 'UTF-8') && - mb_check_encoding($comment, 'UTF-8')) { - $this->bits |= self::BIT_EFS_UTF8; - } + if ($zip64Enabled) { + $this->version = Version::ZIP64; } - if ($this->method->equals(Method::DEFLATE())) { - $this->version = Version::DEFLATE(); + if ($this->generalPurposeBitFlag & GeneralPurposeBitFlag::EFS) { + // Put the tricky entry to + // force Linux unzip to lookup EFS flag. + $footer .= Zs\ExtendedInformationExtraField::generate(); } - $force = (bool)($this->bits & self::BIT_ZERO_HEADER) && - $this->zip->opt->isEnableZip64(); + $data = LocalFileHeader::generate( + versionNeededToExtract: $this->version->value, + generalPurposeBitFlag: $this->generalPurposeBitFlag, + compressionMethod: $this->compressionMethod, + lastModificationDateTime: $this->lastModificationDateTime, + crc32UncompressedData: $this->crc, + compressedSize: $zip64Enabled + ? 0xFFFFFFFF + : $this->compressedSize, + uncompressedSize: $zip64Enabled + ? 0xFFFFFFFF + : $this->uncompressedSize, + fileName: $this->fileName, + extraField: $footer, + ); - $footer = $this->buildZip64ExtraBlock($force); - // If this file will start over 4GB limit in ZIP file, - // CDR record will have to use Zip64 extension to describe offset - // to keep consistency we use the same value here - if ($this->zip->ofs->isOver32()) { - $this->version = Version::ZIP64(); - } - - $fields = [ - ['V', ZipStream::FILE_HEADER_SIGNATURE], - ['v', $this->version->getValue()], // Version needed to Extract - ['v', $this->bits], // General purpose bit flags - data descriptor flag set - ['v', $this->method->getValue()], // Compression method - ['V', $time], // Timestamp (DOS Format) - ['V', $this->crc], // CRC32 of data (0 -> moved to data descriptor footer) - ['V', $this->zlen->getLowFF($force)], // Length of compressed data (forced to 0xFFFFFFFF for zero header) - ['V', $this->len->getLowFF($force)], // Length of original data (forced to 0xFFFFFFFF for zero header) - ['v', $nameLength], // Length of filename - ['v', strlen($footer)], // Extra data (see above) - ]; - - // pack fields and calculate "total" length - $header = ZipStream::packFields($fields); - - // print header and filename - $data = $header . $name . $footer; - $this->zip->send($data); - - // save header length - $this->hlen = Bigint::init(strlen($data)); + ($this->send)($data); } /** * Strip characters that are not legal in Windows filenames * to prevent compatibility issues - * - * @param string $filename Unprocessed filename - * @return string */ - public static function filterFilename(string $filename): string - { + private static function filterFilename( + /** + * Unprocessed filename + */ + string $fileName + ): string { // strip leading slashes from file name // (fixes bug in windows archive viewer) - $filename = preg_replace('/^\\/+/', '', $filename); + $fileName = ltrim($fileName, '/'); - return str_replace(['\\', ':', '*', '?', '"', '<', '>', '|'], '_', $filename); + return str_replace(['\\', ':', '*', '?', '"', '<', '>', '|'], '_', $fileName); } - /** - * Create and send data descriptor footer for this file. - * - * @return void - */ - public function addFileFooter(): void + private function checkEncoding(): void { - if ($this->bits & self::BIT_ZERO_HEADER) { - // compressed and uncompressed size - $sizeFormat = 'V'; - if ($this->zip->opt->isEnableZip64()) { - $sizeFormat = 'P'; + // Sets Bit 11: Language encoding flag (EFS). If this bit is set, + // the filename and comment fields for this file + // MUST be encoded using UTF-8. (see APPENDIX D) + if (mb_check_encoding($this->fileName, 'UTF-8') + && mb_check_encoding($this->comment, 'UTF-8')) { + $this->generalPurposeBitFlag |= GeneralPurposeBitFlag::EFS; + } + } + + private function buildZip64ExtraBlock(bool $force = false): string + { + $outputZip64ExtraBlock = false; + + $originalSize = null; + if ($force || $this->uncompressedSize > 0xFFFFFFFF) { + $outputZip64ExtraBlock = true; + $originalSize = $this->uncompressedSize; + } + + $compressedSize = null; + if ($force || $this->compressedSize > 0xFFFFFFFF) { + $outputZip64ExtraBlock = true; + $compressedSize = $this->compressedSize; + } + + // If this file will start over 4GB limit in ZIP file, + // CDR record will have to use Zip64 extension to describe offset + // to keep consistency we use the same value here + $relativeHeaderOffset = null; + if ($this->startOffset > 0xFFFFFFFF) { + $outputZip64ExtraBlock = true; + $relativeHeaderOffset = $this->startOffset; + } + + if (!$outputZip64ExtraBlock) { + return ''; + } + + if (!$this->enableZip64) { + throw new OverflowException(); + } + + return Zip64\ExtendedInformationExtraField::generate( + originalSize: $originalSize, + compressedSize: $compressedSize, + relativeHeaderOffset: $relativeHeaderOffset, + diskStartNumber: null, + ); + } + + private function addFileFooter(): void + { + if (($this->compressedSize > 0xFFFFFFFF || $this->uncompressedSize > 0xFFFFFFFF) && $this->version !== Version::ZIP64) { + throw new OverflowException(); + } + + if (!$this->enableZeroHeader) { + return; + } + + if ($this->version === Version::ZIP64) { + $footer = Zip64\DataDescriptor::generate( + crc32UncompressedData: $this->crc, + compressedSize: $this->compressedSize, + uncompressedSize: $this->uncompressedSize, + ); + } else { + $footer = DataDescriptor::generate( + crc32UncompressedData: $this->crc, + compressedSize: $this->compressedSize, + uncompressedSize: $this->uncompressedSize, + ); + } + + ($this->send)($footer); + } + + private function readStream(bool $send): void + { + $this->compressedSize = 0; + $this->uncompressedSize = 0; + $hash = hash_init('crc32b'); + + $deflate = $this->compressionInit(); + + while ( + !feof($this->unpackStream()) + && ($this->maxSize === null || $this->uncompressedSize < $this->maxSize) + && ($this->exactSize === null || $this->uncompressedSize < $this->exactSize) + ) { + $readLength = min( + ($this->maxSize ?? PHP_INT_MAX) - $this->uncompressedSize, + ($this->exactSize ?? PHP_INT_MAX) - $this->uncompressedSize, + self::CHUNKED_READ_BLOCK_SIZE + ); + + $data = fread($this->unpackStream(), $readLength); + + if ($data === false) { + throw new ResourceActionException('fread', $this->unpackStream()); } - $fields = [ - ['V', ZipStream::DATA_DESCRIPTOR_SIGNATURE], - ['V', $this->crc], // CRC32 - [$sizeFormat, $this->zlen], // Length of compressed data - [$sizeFormat, $this->len], // Length of original data - ]; - $footer = ZipStream::packFields($fields); - $this->zip->send($footer); - } else { - $footer = ''; + hash_update($hash, $data); + + $this->uncompressedSize += strlen($data); + + if ($deflate) { + $data = deflate_add( + $deflate, + $data, + feof($this->unpackStream()) ? ZLIB_FINISH : ZLIB_NO_FLUSH + ); + + if ($data === false) { + throw new RuntimeException('deflate_add failed'); + } + } + + $this->compressedSize += strlen($data); + + if ($send) { + ($this->send)($data); + } } - $this->totalLength = $this->hlen->add($this->zlen)->add(Bigint::init(strlen($footer))); - $this->zip->addToCdr($this); + + if ($this->exactSize !== null && $this->uncompressedSize !== $this->exactSize) { + throw new FileSizeIncorrectException(expectedSize: $this->exactSize, actualSize: $this->uncompressedSize); + } + + $this->crc = hexdec(hash_final($hash)); } - public function processStream(StreamInterface $stream): void + private function compressionInit(): ?DeflateContext { - $this->zlen = new Bigint(); - $this->len = new Bigint(); + switch ($this->compressionMethod) { + case CompressionMethod::STORE: + // Noting to do + return null; + case CompressionMethod::DEFLATE: + $deflateContext = deflate_init( + ZLIB_ENCODING_RAW, + ['level' => $this->deflateLevel] + ); - if ($this->zip->opt->isZeroHeader()) { - $this->processStreamWithZeroHeader($stream); - } else { - $this->processStreamWithComputedHeader($stream); + if (!$deflateContext) { + // @codeCoverageIgnoreStart + throw new RuntimeException("Can't initialize deflate context."); + // @codeCoverageIgnoreEnd + } + + // False positive, resource is no longer returned from this function + return $deflateContext; + default: + // @codeCoverageIgnoreStart + throw new RuntimeException('Unsupported Compression Method ' . print_r($this->compressionMethod, true)); + // @codeCoverageIgnoreEnd } } - /** - * Send CDR record for specified file. - * - * @return string - */ - public function getCdrFile(): string + private function getCdrFile(): string { - $name = static::filterFilename($this->name); - - // get attributes - $comment = $this->opt->getComment(); - - // get dos timestamp - $time = static::dosTime($this->opt->getTime()->getTimestamp()); - $footer = $this->buildZip64ExtraBlock(); - $fields = [ - ['V', ZipStream::CDR_FILE_SIGNATURE], // Central file header signature - ['v', ZipStream::ZIP_VERSION_MADE_BY], // Made by version - ['v', $this->version->getValue()], // Extract by version - ['v', $this->bits], // General purpose bit flags - data descriptor flag set - ['v', $this->method->getValue()], // Compression method - ['V', $time], // Timestamp (DOS Format) - ['V', $this->crc], // CRC32 - ['V', $this->zlen->getLowFF()], // Compressed Data Length - ['V', $this->len->getLowFF()], // Original Data Length - ['v', strlen($name)], // Length of filename - ['v', strlen($footer)], // Extra data len (see above) - ['v', strlen($comment)], // Length of comment - ['v', 0], // Disk number - ['v', 0], // Internal File Attributes - ['V', 32], // External File Attributes - ['V', $this->ofs->getLowFF()], // Relative offset of local header - ]; - - // pack fields, then append name and comment - $header = ZipStream::packFields($fields); - - return $header . $name . $footer . $comment; + return CentralDirectoryFileHeader::generate( + versionMadeBy: ZipStream::ZIP_VERSION_MADE_BY, + versionNeededToExtract: $this->version->value, + generalPurposeBitFlag: $this->generalPurposeBitFlag, + compressionMethod: $this->compressionMethod, + lastModificationDateTime: $this->lastModificationDateTime, + crc32: $this->crc, + compressedSize: $this->compressedSize > 0xFFFFFFFF + ? 0xFFFFFFFF + : $this->compressedSize, + uncompressedSize: $this->uncompressedSize > 0xFFFFFFFF + ? 0xFFFFFFFF + : $this->uncompressedSize, + fileName: $this->fileName, + extraField: $footer, + fileComment: $this->comment, + diskNumberStart: 0, + internalFileAttributes: 0, + externalFileAttributes: 32, + relativeOffsetOfLocalHeader: $this->startOffset > 0xFFFFFFFF + ? 0xFFFFFFFF + : $this->startOffset, + ); } - /** - * @return Bigint - */ - public function getTotalLength(): Bigint + private function isSimulation(): bool { - return $this->totalLength; - } - - /** - * Convert a UNIX timestamp to a DOS timestamp. - * - * @param int $when - * @return int DOS Timestamp - */ - final protected static function dosTime(int $when): int - { - // get date array for timestamp - $d = getdate($when); - - // set lower-bound on dates - if ($d['year'] < 1980) { - $d = [ - 'year' => 1980, - 'mon' => 1, - 'mday' => 1, - 'hours' => 0, - 'minutes' => 0, - 'seconds' => 0, - ]; - } - - // remove extra years from 1980 - $d['year'] -= 1980; - - // return date string - return - ($d['year'] << 25) | - ($d['mon'] << 21) | - ($d['mday'] << 16) | - ($d['hours'] << 11) | - ($d['minutes'] << 5) | - ($d['seconds'] >> 1); - } - - protected function buildZip64ExtraBlock(bool $force = false): string - { - $fields = []; - if ($this->len->isOver32($force)) { - $fields[] = ['P', $this->len]; // Length of original data - } - - if ($this->len->isOver32($force)) { - $fields[] = ['P', $this->zlen]; // Length of compressed data - } - - if ($this->ofs->isOver32()) { - $fields[] = ['P', $this->ofs]; // Offset of local header record - } - - if (!empty($fields)) { - if (!$this->zip->opt->isEnableZip64()) { - throw new OverflowException(); - } - - array_unshift( - $fields, - ['v', 0x0001], // 64 bit extension - ['v', count($fields) * 8] // Length of data block - ); - $this->version = Version::ZIP64(); - } - - if ($this->bits & self::BIT_EFS_UTF8) { - // Put the tricky entry to - // force Linux unzip to lookup EFS flag. - $fields[] = ['v', 0x5653]; // Choose 'ZS' for proprietary usage - $fields[] = ['v', 0x0000]; // zero length - } - - return ZipStream::packFields($fields); - } - - protected function processStreamWithZeroHeader(StreamInterface $stream): void - { - $this->bits |= self::BIT_ZERO_HEADER; - $this->addFileHeader(); - $this->readStream($stream, self::COMPUTE | self::SEND); - $this->addFileFooter(); - } - - protected function readStream(StreamInterface $stream, ?int $options = null): void - { - $this->deflateInit(); - $total = 0; - $size = $this->opt->getSize(); - while (!$stream->eof() && ($size === 0 || $total < $size)) { - $data = $stream->read(self::CHUNKED_READ_BLOCK_SIZE); - $total += strlen($data); - if ($size > 0 && $total > $size) { - $data = substr($data, 0, strlen($data)-($total - $size)); - } - $this->deflateData($stream, $data, $options); - if ($options & self::SEND) { - $this->zip->send($data); - } - } - $this->deflateFinish($options); - } - - protected function deflateInit(): void - { - $hash = hash_init(self::HASH_ALGORITHM); - $this->hash = $hash; - if ($this->method->equals(Method::DEFLATE())) { - $this->deflate = deflate_init( - ZLIB_ENCODING_RAW, - ['level' => $this->opt->getDeflateLevel()] - ); - } - } - - protected function deflateData(StreamInterface $stream, string &$data, ?int $options = null): void - { - if ($options & self::COMPUTE) { - $this->len = $this->len->add(Bigint::init(strlen($data))); - hash_update($this->hash, $data); - } - if ($this->deflate) { - $data = deflate_add( - $this->deflate, - $data, - $stream->eof() - ? ZLIB_FINISH - : ZLIB_NO_FLUSH - ); - } - if ($options & self::COMPUTE) { - $this->zlen = $this->zlen->add(Bigint::init(strlen($data))); - } - } - - protected function deflateFinish(?int $options = null): void - { - if ($options & self::COMPUTE) { - $this->crc = hexdec(hash_final($this->hash)); - } - } - - protected function processStreamWithComputedHeader(StreamInterface $stream): void - { - $this->readStream($stream, self::COMPUTE); - $stream->rewind(); - - // incremental compression with deflate_add - // makes this second read unnecessary - // but it is only available from PHP 7.0 - if (!$this->deflate && $stream instanceof DeflateStream && $this->method->equals(Method::DEFLATE())) { - $stream->addDeflateFilter($this->opt); - $this->zlen = new Bigint(); - while (!$stream->eof()) { - $data = $stream->read(self::CHUNKED_READ_BLOCK_SIZE); - $this->zlen = $this->zlen->add(Bigint::init(strlen($data))); - } - $stream->rewind(); - } - - $this->addFileHeader(); - $this->readStream($stream, self::SEND); - $this->addFileFooter(); + return $this->operationMode === OperationMode::SIMULATE_LAX || $this->operationMode === OperationMode::SIMULATE_STRICT; } } diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/GeneralPurposeBitFlag.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/GeneralPurposeBitFlag.php new file mode 100644 index 0000000..23a66d8 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/GeneralPurposeBitFlag.php @@ -0,0 +1,89 @@ +value), + new PackField(format: 'V', value: Time::dateTimeToDosTime($lastModificationDateTime)), + new PackField(format: 'V', value: $crc32UncompressedData), + new PackField(format: 'V', value: $compressedSize), + new PackField(format: 'V', value: $uncompressedSize), + new PackField(format: 'v', value: strlen($fileName)), + new PackField(format: 'v', value: strlen($extraField)), + ) . $fileName . $extraField; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/OperationMode.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/OperationMode.php new file mode 100644 index 0000000..ae45e31 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/OperationMode.php @@ -0,0 +1,37 @@ + 4 GB or file count > 64k) - * - * @var bool - */ - private $enableZip64 = true; - - /** - * Enable streaming files with single read where - * general purpose bit 3 indicates local file header - * contain zero values in crc and size fields, - * these appear only after file contents - * in data descriptor block. - * - * @var bool - */ - private $zeroHeader = false; - - /** - * Enable reading file stat for determining file size. - * When a 32-bit system reads file size that is - * over 2 GB, invalid value appears in file size - * due to integer overflow. Should be disabled on - * 32-bit systems with method addFileFromPath - * if any file may exceed 2 GB. In this case file - * will be read in blocks and correct size will be - * determined from content. - * - * @var bool - */ - private $statFiles = true; - - /** - * Enable flush after every write to output stream. - * @var bool - */ - private $flushOutput = false; - - /** - * HTTP Content-Disposition. Defaults to - * 'attachment', where - * FILENAME is the specified filename. - * - * Note that this does nothing if you are - * not sending HTTP headers. - * - * @var string - */ - private $contentDisposition = 'attachment'; - - /** - * Note that this does nothing if you are - * not sending HTTP headers. - * - * @var string - */ - private $contentType = 'application/x-zip'; - - /** - * @var int - */ - private $deflateLevel = 6; - - /** - * @var StreamInterface|resource - */ - private $outputStream; - - /** - * Options constructor. - */ - public function __construct() - { - $this->largeFileMethod = Method::STORE(); - $this->outputStream = fopen('php://output', 'wb'); - } - - public function getComment(): string - { - return $this->comment; - } - - public function setComment(string $comment): void - { - $this->comment = $comment; - } - - public function getLargeFileSize(): int - { - return $this->largeFileSize; - } - - public function setLargeFileSize(int $largeFileSize): void - { - $this->largeFileSize = $largeFileSize; - } - - public function getLargeFileMethod(): Method - { - return $this->largeFileMethod; - } - - public function setLargeFileMethod(Method $largeFileMethod): void - { - $this->largeFileMethod = $largeFileMethod; - } - - public function isSendHttpHeaders(): bool - { - return $this->sendHttpHeaders; - } - - public function setSendHttpHeaders(bool $sendHttpHeaders): void - { - $this->sendHttpHeaders = $sendHttpHeaders; - } - - public function getHttpHeaderCallback(): callable - { - return $this->httpHeaderCallback; - } - - public function setHttpHeaderCallback(callable $httpHeaderCallback): void - { - $this->httpHeaderCallback = $httpHeaderCallback; - } - - public function isEnableZip64(): bool - { - return $this->enableZip64; - } - - public function setEnableZip64(bool $enableZip64): void - { - $this->enableZip64 = $enableZip64; - } - - public function isZeroHeader(): bool - { - return $this->zeroHeader; - } - - public function setZeroHeader(bool $zeroHeader): void - { - $this->zeroHeader = $zeroHeader; - } - - public function isFlushOutput(): bool - { - return $this->flushOutput; - } - - public function setFlushOutput(bool $flushOutput): void - { - $this->flushOutput = $flushOutput; - } - - public function isStatFiles(): bool - { - return $this->statFiles; - } - - public function setStatFiles(bool $statFiles): void - { - $this->statFiles = $statFiles; - } - - public function getContentDisposition(): string - { - return $this->contentDisposition; - } - - public function setContentDisposition(string $contentDisposition): void - { - $this->contentDisposition = $contentDisposition; - } - - public function getContentType(): string - { - return $this->contentType; - } - - public function setContentType(string $contentType): void - { - $this->contentType = $contentType; - } - - /** - * @return StreamInterface|resource - */ - public function getOutputStream() - { - return $this->outputStream; - } - - /** - * @param StreamInterface|resource $outputStream - */ - public function setOutputStream($outputStream): void - { - $this->outputStream = $outputStream; - } - - /** - * @return int - */ - public function getDeflateLevel(): int - { - return $this->deflateLevel; - } - - /** - * @param int $deflateLevel - */ - public function setDeflateLevel(int $deflateLevel): void - { - $this->deflateLevel = $deflateLevel; - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/File.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/File.php deleted file mode 100644 index 37e37ce..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/File.php +++ /dev/null @@ -1,122 +0,0 @@ -deflateLevel = $this->deflateLevel ?: $archiveOptions->getDeflateLevel(); - $this->time = $this->time ?: new DateTime(); - } - - /** - * @return string - */ - public function getComment(): string - { - return $this->comment; - } - - /** - * @param string $comment - */ - public function setComment(string $comment): void - { - $this->comment = $comment; - } - - /** - * @return Method - */ - public function getMethod(): Method - { - return $this->method ?: Method::DEFLATE(); - } - - /** - * @param Method $method - */ - public function setMethod(Method $method): void - { - $this->method = $method; - } - - /** - * @return int - */ - public function getDeflateLevel(): int - { - return $this->deflateLevel ?: Archive::DEFAULT_DEFLATE_LEVEL; - } - - /** - * @param int $deflateLevel - */ - public function setDeflateLevel(int $deflateLevel): void - { - $this->deflateLevel = $deflateLevel; - } - - /** - * @return DateTimeInterface - */ - public function getTime(): DateTimeInterface - { - return $this->time; - } - - /** - * @param DateTimeInterface $time - */ - public function setTime(DateTimeInterface $time): void - { - $this->time = $time; - } - - /** - * @return int - */ - public function getSize(): int - { - return $this->size; - } - - /** - * @param int $size - */ - public function setSize(int $size): void - { - $this->size = $size; - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Method.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Method.php deleted file mode 100644 index d361c22..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Option/Method.php +++ /dev/null @@ -1,21 +0,0 @@ -format; + }, ''); + + $args = array_map(function (self $field) { + switch ($field->format) { + case 'V': + if ($field->value > self::MAX_V) { + throw new RuntimeException(print_r($field->value, true) . ' is larger than 32 bits'); + } + break; + case 'v': + if ($field->value > self::MAX_v) { + throw new RuntimeException(print_r($field->value, true) . ' is larger than 16 bits'); + } + break; + case 'P': break; + default: + break; + } + + return $field->value; + }, $fields); + + return pack($fmt, ...$args); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream.php deleted file mode 100644 index d80e70f..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream.php +++ /dev/null @@ -1,265 +0,0 @@ -stream = $stream; - } - - /** - * Reads all data from the stream into a string, from the beginning to end. - * - * This method MUST attempt to seek to the beginning of the stream before - * reading data and read the stream until the end is reached. - * - * Warning: This could attempt to load a large amount of data into memory. - * - * This method MUST NOT raise an exception in order to conform with PHP's - * string casting operations. - * - * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring - * @return string - */ - public function __toString(): string - { - try { - $this->seek(0); - } catch (RuntimeException $e) { - } - return (string) stream_get_contents($this->stream); - } - - /** - * Closes the stream and any underlying resources. - * - * @return void - */ - public function close(): void - { - if (is_resource($this->stream)) { - fclose($this->stream); - } - $this->detach(); - } - - /** - * Separates any underlying resources from the stream. - * - * After the stream has been detached, the stream is in an unusable state. - * - * @return resource|null Underlying PHP stream, if any - */ - public function detach() - { - $result = $this->stream; - $this->stream = null; - return $result; - } - - /** - * Seek to a position in the stream. - * - * @link http://www.php.net/manual/en/function.fseek.php - * @param int $offset Stream offset - * @param int $whence Specifies how the cursor position will be calculated - * based on the seek offset. Valid values are identical to the built-in - * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to - * offset bytes SEEK_CUR: Set position to current location plus offset - * SEEK_END: Set position to end-of-stream plus offset. - * @throws RuntimeException on failure. - */ - public function seek($offset, $whence = SEEK_SET): void - { - if (!$this->isSeekable()) { - throw new RuntimeException(); - } - if (fseek($this->stream, $offset, $whence) !== 0) { - throw new RuntimeException(); - } - } - - /** - * Returns whether or not the stream is seekable. - * - * @return bool - */ - public function isSeekable(): bool - { - return (bool)$this->getMetadata('seekable'); - } - - /** - * Get stream metadata as an associative array or retrieve a specific key. - * - * The keys returned are identical to the keys returned from PHP's - * stream_get_meta_data() function. - * - * @link http://php.net/manual/en/function.stream-get-meta-data.php - * @param string $key Specific metadata to retrieve. - * @return array|mixed|null Returns an associative array if no key is - * provided. Returns a specific key value if a key is provided and the - * value is found, or null if the key is not found. - */ - public function getMetadata($key = null) - { - $metadata = stream_get_meta_data($this->stream); - return $key !== null ? @$metadata[$key] : $metadata; - } - - /** - * Get the size of the stream if known. - * - * @return int|null Returns the size in bytes if known, or null if unknown. - */ - public function getSize(): ?int - { - $stats = fstat($this->stream); - return $stats['size']; - } - - /** - * Returns the current position of the file read/write pointer - * - * @return int Position of the file pointer - * @throws RuntimeException on error. - */ - public function tell(): int - { - $position = ftell($this->stream); - if ($position === false) { - throw new RuntimeException(); - } - return $position; - } - - /** - * Returns true if the stream is at the end of the stream. - * - * @return bool - */ - public function eof(): bool - { - return feof($this->stream); - } - - /** - * Seek to the beginning of the stream. - * - * If the stream is not seekable, this method will raise an exception; - * otherwise, it will perform a seek(0). - * - * @see seek() - * @link http://www.php.net/manual/en/function.fseek.php - * @throws RuntimeException on failure. - */ - public function rewind(): void - { - $this->seek(0); - } - - /** - * Write data to the stream. - * - * @param string $string The string that is to be written. - * @return int Returns the number of bytes written to the stream. - * @throws RuntimeException on failure. - */ - public function write($string): int - { - if (!$this->isWritable()) { - throw new RuntimeException(); - } - if (fwrite($this->stream, $string) === false) { - throw new RuntimeException(); - } - return mb_strlen($string); - } - - /** - * Returns whether or not the stream is writable. - * - * @return bool - */ - public function isWritable(): bool - { - $mode = $this->getMetadata('mode'); - if (!is_string($mode)) { - throw new RuntimeException('Could not get stream mode from metadata!'); - } - return preg_match('/[waxc+]/', $mode) === 1; - } - - /** - * Read data from the stream. - * - * @param int $length Read up to $length bytes from the object and return - * them. Fewer than $length bytes may be returned if underlying stream - * call returns fewer bytes. - * @return string Returns the data read from the stream, or an empty string - * if no bytes are available. - * @throws RuntimeException if an error occurs. - */ - public function read($length): string - { - if (!$this->isReadable()) { - throw new RuntimeException(); - } - $result = fread($this->stream, $length); - if ($result === false) { - throw new RuntimeException(); - } - return $result; - } - - /** - * Returns whether or not the stream is readable. - * - * @return bool - */ - public function isReadable(): bool - { - $mode = $this->getMetadata('mode'); - if (!is_string($mode)) { - throw new RuntimeException('Could not get stream mode from metadata!'); - } - return preg_match('/[r+]/', $mode) === 1; - } - - /** - * Returns the remaining contents in a string - * - * @return string - * @throws RuntimeException if unable to read or an error occurs while - * reading. - */ - public function getContents(): string - { - if (!$this->isReadable()) { - throw new RuntimeException(); - } - $result = stream_get_contents($this->stream); - if ($result === false) { - throw new RuntimeException(); - } - return $result; - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream/CallbackStreamWrapper.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream/CallbackStreamWrapper.php new file mode 100644 index 0000000..fb35487 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Stream/CallbackStreamWrapper.php @@ -0,0 +1,253 @@ + Map of stream IDs to callback functions */ + private static array $callbacks = []; + + /** @var string|null Unique identifier for this stream instance */ + private ?string $id = null; + + /** @var int Current position in the stream */ + private int $pos = 0; + + /** + * Destructor - ensures cleanup even if stream_close() isn't called. + * Prevents memory leaks in long-running processes. + */ + public function __destruct() + { + $this->stream_close(); + } + + /** + * Create a new callback stream. + * + * @param callable(string):void $callback Function to call with written data + * @return resource|false Stream resource or false on failure + */ + public static function open(callable $callback) + { + if (!in_array(self::PROTOCOL, stream_get_wrappers(), true)) { + if (!stream_wrapper_register(self::PROTOCOL, self::class)) { + return false; + } + } + + // Generate cryptographically secure unique ID to prevent collisions + $id = 'cb_' . bin2hex(random_bytes(16)); + self::$callbacks[$id] = $callback; + + return fopen(self::PROTOCOL . "://{$id}", 'wb'); + } + + /** + * Clean up all registered callbacks (useful for testing). + * + * @internal + */ + public static function cleanup(): void + { + self::$callbacks = []; + } + + /** + * Open the stream. + * + * @param string $path Stream path containing the callback ID + * @param string $mode File mode (must contain 'w' for writing) + * @param int $options Stream options (required by interface, unused) + * @param string|null $opened_path Opened path reference (required by interface, unused) + * @return bool True if stream opened successfully + * @psalm-suppress UnusedParam $options and $opened_path are required by the stream wrapper interface + */ + public function stream_open(string $path, string $mode, int $options, ?string &$opened_path): bool + { + if (!str_contains($mode, 'w')) { + return false; + } + + $host = parse_url($path, PHP_URL_HOST); + if ($host === false || $host === null) { + return false; + } + + $this->id = $host; + return isset(self::$callbacks[$this->id]); + } + + /** + * Write data to the callback. + * + * @param string $data Data to write + * @return int Number of bytes written + * @throws RuntimeException If callback execution fails + */ + public function stream_write(string $data): int + { + if ($this->id === null) { + trigger_error('Stream not properly initialized', E_USER_WARNING); + return 0; + } + + $callback = self::$callbacks[$this->id] ?? null; + if ($callback === null) { + trigger_error('Callback not found for stream', E_USER_WARNING); + return 0; + } + + try { + $callback($data); + } catch (Throwable $e) { + throw new RuntimeException( + 'Callback function failed during stream write: ' . $e->getMessage(), + 0, + $e + ); + } + + $length = strlen($data); + $this->pos += $length; + return $length; + } + + /** + * Get current position in stream. + * + * @return int Current position + */ + public function stream_tell(): int + { + return $this->pos; + } + + /** + * Check if stream has reached end of file. + * + * @return bool Always false for write-only streams + */ + public function stream_eof(): bool + { + return false; + } + + /** + * Flush stream buffers. + * + * @return bool Always true (no buffering) + */ + public function stream_flush(): bool + { + return true; + } + + /** + * Close the stream and clean up callback. + */ + public function stream_close(): void + { + if ($this->id !== null) { + unset(self::$callbacks[$this->id]); + $this->id = null; + } + } + + /** + * Get stream statistics. + * + * @return array Stream statistics + */ + public function stream_stat(): array + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0o100666, // Regular file, read/write permissions + 'nlink' => 1, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => $this->pos, + 'atime' => time(), + 'mtime' => time(), + 'ctime' => time(), + 'blksize' => 4096, + 'blocks' => ceil($this->pos / 4096), + ]; + } + + /** + * Read data from stream (not supported - write-only stream). + * + * @param int $count Number of bytes to read (required by interface, unused) + * @return string Always empty string + * @psalm-suppress UnusedParam $count is required by the stream wrapper interface + */ + public function stream_read(int $count): string + { + trigger_error('Read operations not supported on callback streams', E_USER_WARNING); + return ''; + } + + /** + * Seek to position in stream (not supported). + * + * @param int $offset Offset to seek to (required by interface, unused) + * @param int $whence Seek mode (required by interface, unused) + * @return bool Always false + * @psalm-suppress UnusedParam $offset and $whence are required by the stream wrapper interface + */ + public function stream_seek(int $offset, int $whence = SEEK_SET): bool + { + trigger_error('Seek operations not supported on callback streams', E_USER_WARNING); + return false; + } + + /** + * Set options on stream (not supported). + * + * @param int $option Option to set (required by interface, unused) + * @param int $arg1 First argument (required by interface, unused) + * @param int $arg2 Second argument (required by interface, unused) + * @return bool Always false + * @psalm-suppress UnusedParam All parameters are required by the stream wrapper interface + */ + public function stream_set_option(int $option, int $arg1, int $arg2): bool + { + return false; + } + + /** + * Truncate stream (not supported). + * + * @param int $new_size New size (required by interface, unused) + * @return bool Always false + * @psalm-suppress UnusedParam $new_size is required by the stream wrapper interface + */ + public function stream_truncate(int $new_size): bool + { + trigger_error('Truncate operations not supported on callback streams', E_USER_WARNING); + return false; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Time.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Time.php new file mode 100644 index 0000000..f8fd7b2 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Time.php @@ -0,0 +1,39 @@ +getTimestamp() < $dosMinimumDate->getTimestamp()) { + throw new DosTimeOverflowException(dateTime: $dateTime); + } + + $dateTime = DateTimeImmutable::createFromInterface($dateTime)->sub(new DateInterval('P1980Y')); + + [$year, $month, $day, $hour, $minute, $second] = explode(' ', $dateTime->format('Y n j G i s')); + + return + ((int) $year << 25) + | ((int) $month << 21) + | ((int) $day << 16) + | ((int) $hour << 11) + | ((int) $minute << 5) + | ((int) $second >> 1); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Version.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Version.php new file mode 100644 index 0000000..483d25a --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Version.php @@ -0,0 +1,15 @@ +addFile('some_file.gif', $data); + * ```php + * // add first file + * $zip->addFile(fileName: 'world.txt', data: 'Hello World'); * - * * add second file - * $data = file_get_contents('some_file.gif'); - * $zip->addFile('another_file.png', $data); + * // add second file + * $zip->addFile(fileName: 'moon.txt', data: 'Hello Moon'); + * ``` * * 3. Finish the zip stream: * - * $zip->finish(); + * ```php + * $zip->finish(); + * ``` * * You can also add an archive comment, add comments to individual files, * and adjust the timestamp of files. See the API documentation for each * method below for additional information. * - * Example: + * ## Example * - * // create a new zip stream object - * $zip = new ZipStream('some_files.zip'); + * ```php + * // create a new zip stream object + * $zip = new ZipStream(outputName: 'some_files.zip'); * - * // list of local files - * $files = array('foo.txt', 'bar.jpg'); + * // list of local files + * $files = array('foo.txt', 'bar.jpg'); * - * // read and add each file to the archive - * foreach ($files as $path) - * $zip->addFile($path, file_get_contents($path)); + * // read and add each file to the archive + * foreach ($files as $path) + * $zip->addFileFromPath(fileName: $path, $path); * - * // write archive footer to stream - * $zip->finish(); + * // write archive footer to stream + * $zip->finish(); + * ``` + * + * @api */ class ZipStream { @@ -80,529 +91,783 @@ class ZipStream * Here we are using 6 for the OS, indicating OS/2 H.P.F.S. * to prevent file permissions issues upon extract (see #84) * 0x603 is 00000110 00000011 in binary, so 6 and 3 + * + * @internal */ public const ZIP_VERSION_MADE_BY = 0x603; - /** - * The following signatures end with 0x4b50, which in ASCII is PK, - * the initials of the inventor Phil Katz. - * See https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers - */ - public const FILE_HEADER_SIGNATURE = 0x04034b50; + private bool $ready = true; - public const CDR_FILE_SIGNATURE = 0x02014b50; - - public const CDR_EOF_SIGNATURE = 0x06054b50; - - public const DATA_DESCRIPTOR_SIGNATURE = 0x08074b50; - - public const ZIP64_CDR_EOF_SIGNATURE = 0x06064b50; - - public const ZIP64_CDR_LOCATOR_SIGNATURE = 0x07064b50; + private int $offset = 0; /** - * Global Options - * - * @var ArchiveOptions + * @var string[] */ - public $opt; + private array $centralDirectoryRecords = []; /** - * @var array + * @var resource */ - public $files = []; + private $outputStream; + + private readonly Closure $httpHeaderCallback; /** - * @var Bigint + * @var File[] */ - public $cdr_ofs; - - /** - * @var Bigint - */ - public $ofs; - - /** - * @var bool - */ - protected $need_headers; - - /** - * @var null|String - */ - protected $output_name; + private array $recordedSimulation = []; /** * Create a new ZipStream object. * - * Parameters: + * ##### Examples * - * @param String $name - Name of output file (optional). - * @param ArchiveOptions $opt - Archive Options + * ```php + * // create a new zip file named 'foo.zip' + * $zip = new ZipStream(outputName: 'foo.zip'); * - * Large File Support: + * // create a new zip file named 'bar.zip' with a comment + * $zip = new ZipStream( + * outputName: 'bar.zip', + * comment: 'this is a comment for the zip file.', + * ); + * ``` * - * By default, the method addFileFromPath() will send send files - * larger than 20 megabytes along raw rather than attempting to - * compress them. You can change both the maximum size and the - * compression behavior using the largeFile* options above, with the - * following caveats: + * @param OperationMode $operationMode + * The mode can be used to switch between `NORMAL` and `SIMULATION_*` modes. + * For details see the `OperationMode` documentation. * - * * For "small" files (e.g. files smaller than largeFileSize), the - * memory use can be up to twice that of the actual file. In other - * words, adding a 10 megabyte file to the archive could potentially - * occupy 20 megabytes of memory. + * Default to `NORMAL`. * - * * Enabling compression on large files (e.g. files larger than - * large_file_size) is extremely slow, because ZipStream has to pass - * over the large file once to calculate header information, and then - * again to compress and send the actual data. + * @param string $comment + * Archive Level Comment * - * Examples: + * @param StreamInterface|resource|null $outputStream + * Override the output of the archive to a different target. * - * // create a new zip file named 'foo.zip' - * $zip = new ZipStream('foo.zip'); + * By default the archive is sent to `STDOUT`. * - * // create a new zip file named 'bar.zip' with a comment - * $opt->setComment = 'this is a comment for the zip file.'; - * $zip = new ZipStream('bar.zip', $opt); + * @param CompressionMethod $defaultCompressionMethod + * How to handle file compression. Legal values are + * `CompressionMethod::DEFLATE` (the default), or + * `CompressionMethod::STORE`. `STORE` sends the file raw and is + * significantly faster, while `DEFLATE` compresses the file and + * is much, much slower. * - * Notes: + * @param int $defaultDeflateLevel + * Default deflation level. Only relevant if `compressionMethod` + * is `DEFLATE`. * - * In order to let this library send HTTP headers, a filename must be given - * _and_ the option `sendHttpHeaders` must be `true`. This behavior is to - * allow software to send its own headers (including the filename), and - * still use this library. + * See details of [`deflate_init`](https://www.php.net/manual/en/function.deflate-init.php#refsect1-function.deflate-init-parameters) + * + * @param bool $enableZip64 + * Enable Zip64 extension, supporting very large + * archives (any size > 4 GB or file count > 64k) + * + * @param bool $defaultEnableZeroHeader + * Enable streaming files with single read. + * + * When the zero header is set, the file is streamed into the output + * and the size & checksum are added at the end of the file. This is the + * fastest method and uses the least memory. Unfortunately not all + * ZIP clients fully support this and can lead to clients reporting + * the generated ZIP files as corrupted in combination with other + * circumstances. (Zip64 enabled, using UTF8 in comments / names etc.) + * + * When the zero header is not set, the length & checksum need to be + * defined before the file is actually added. To prevent loading all + * the data into memory, the data has to be read twice. If the data + * which is added is not seekable, this call will fail. + * + * @param bool $sendHttpHeaders + * Boolean indicating whether or not to send + * the HTTP headers for this file. + * + * @param ?Closure $httpHeaderCallback + * The method called to send HTTP headers + * + * @param string|null $outputName + * The name of the created archive. + * + * Only relevant if `$sendHttpHeaders = true`. + * + * @param string $contentDisposition + * HTTP Content-Disposition + * + * Only relevant if `sendHttpHeaders = true`. + * + * @param string $contentType + * HTTP Content Type + * + * Only relevant if `sendHttpHeaders = true`. + * + * @param bool $flushOutput + * Enable flush after every write to output stream. + * + * @return self */ - public function __construct(?string $name = null, ?ArchiveOptions $opt = null) - { - $this->opt = $opt ?: new ArchiveOptions(); - - $this->output_name = $name; - $this->need_headers = $name && $this->opt->isSendHttpHeaders(); - - $this->cdr_ofs = new Bigint(); - $this->ofs = new Bigint(); + public function __construct( + private OperationMode $operationMode = OperationMode::NORMAL, + private readonly string $comment = '', + $outputStream = null, + private readonly CompressionMethod $defaultCompressionMethod = CompressionMethod::DEFLATE, + private readonly int $defaultDeflateLevel = 6, + private readonly bool $enableZip64 = true, + private readonly bool $defaultEnableZeroHeader = true, + private bool $sendHttpHeaders = true, + ?Closure $httpHeaderCallback = null, + private readonly ?string $outputName = null, + private readonly string $contentDisposition = 'attachment', + private readonly string $contentType = 'application/x-zip', + private bool $flushOutput = false, + ) { + $this->outputStream = self::normalizeStream($outputStream); + $this->httpHeaderCallback = $httpHeaderCallback ?? header(...); } /** - * addFile - * * Add a file to the archive. * - * @param String $name - path of file in archive (including directory). - * @param String $data - contents of file - * @param FileOptions $options + * ##### File Options * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * method - Storage method for file ("store" or "deflate") + * See {@see addFileFromPsr7Stream()} * - * Examples: + * ##### Examples * - * // add a file named 'foo.txt' - * $data = file_get_contents('foo.txt'); - * $zip->addFile('foo.txt', $data); + * ```php + * // add a file named 'world.txt' + * $zip->addFile(fileName: 'world.txt', data: 'Hello World!'); * - * // add a file named 'bar.jpg' with a comment and a last-modified - * // time of two hours ago - * $data = file_get_contents('bar.jpg'); - * $opt->setTime = time() - 2 * 3600; - * $opt->setComment = 'this is a comment about bar.jpg'; - * $zip->addFile('bar.jpg', $data, $opt); + * // add a file named 'bar.jpg' with a comment and a last-modified + * // time of two hours ago + * $zip->addFile( + * fileName: 'bar.jpg', + * data: $data, + * comment: 'this is a comment about bar.jpg', + * lastModificationDateTime: new DateTime('2 hours ago'), + * ); + * ``` + * + * @param string $data + * + * contents of file */ - public function addFile(string $name, string $data, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processData($data); + public function addFile( + string $fileName, + string $data, + string $comment = '', + ?CompressionMethod $compressionMethod = null, + ?int $deflateLevel = null, + ?DateTimeInterface $lastModificationDateTime = null, + ?int $maxSize = null, + ?int $exactSize = null, + ?bool $enableZeroHeader = null, + ): void { + $this->addFileFromCallback( + fileName: $fileName, + callback: fn() => $data, + comment: $comment, + compressionMethod: $compressionMethod, + deflateLevel: $deflateLevel, + lastModificationDateTime: $lastModificationDateTime, + maxSize: $maxSize, + exactSize: $exactSize, + enableZeroHeader: $enableZeroHeader, + ); } /** - * addFileFromPath - * * Add a file at path to the archive. * - * Note that large files may be compressed differently than smaller - * files; see the "Large File Support" section above for more - * information. + * ##### File Options * - * @param String $name - name of file in archive (including directory path). - * @param String $path - path to file on disk (note: paths should be encoded using - * UNIX-style forward slashes -- e.g '/path/to/some/file'). - * @param FileOptions $options + * See {@see addFileFromPsr7Stream()} * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * method - Storage method for file ("store" or "deflate") + * ###### Examples * - * Examples: + * ```php + * // add a file named 'foo.txt' from the local file '/tmp/foo.txt' + * $zip->addFileFromPath( + * fileName: 'foo.txt', + * path: '/tmp/foo.txt', + * ); * - * // add a file named 'foo.txt' from the local file '/tmp/foo.txt' - * $zip->addFileFromPath('foo.txt', '/tmp/foo.txt'); + * // add a file named 'bigfile.rar' from the local file + * // '/usr/share/bigfile.rar' with a comment and a last-modified + * // time of two hours ago + * $zip->addFileFromPath( + * fileName: 'bigfile.rar', + * path: '/usr/share/bigfile.rar', + * comment: 'this is a comment about bigfile.rar', + * lastModificationDateTime: new DateTime('2 hours ago'), + * ); + * ``` * - * // add a file named 'bigfile.rar' from the local file - * // '/usr/share/bigfile.rar' with a comment and a last-modified - * // time of two hours ago - * $path = '/usr/share/bigfile.rar'; - * $opt->setTime = time() - 2 * 3600; - * $opt->setComment = 'this is a comment about bar.jpg'; - * $zip->addFileFromPath('bigfile.rar', $path, $opt); - * - * @return void * @throws \ZipStream\Exception\FileNotFoundException * @throws \ZipStream\Exception\FileNotReadableException */ - public function addFileFromPath(string $name, string $path, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); + public function addFileFromPath( + /** + * name of file in archive (including directory path). + */ + string $fileName, - $file = new File($this, $name, $options); - $file->processPath($path); + /** + * path to file on disk (note: paths should be encoded using + * UNIX-style forward slashes -- e.g '/path/to/some/file'). + */ + string $path, + string $comment = '', + ?CompressionMethod $compressionMethod = null, + ?int $deflateLevel = null, + ?DateTimeInterface $lastModificationDateTime = null, + ?int $maxSize = null, + ?int $exactSize = null, + ?bool $enableZeroHeader = null, + ): void { + if (!is_readable($path)) { + if (!file_exists($path)) { + throw new FileNotFoundException($path); + } + throw new FileNotReadableException($path); + } + + $fileTime = filemtime($path); + if ($fileTime !== false) { + $lastModificationDateTime ??= (new DateTimeImmutable())->setTimestamp($fileTime); + } + + $this->addFileFromCallback( + fileName: $fileName, + callback: function () use ($path) { + + $stream = fopen($path, 'rb'); + + if (!$stream) { + // @codeCoverageIgnoreStart + throw new ResourceActionException('fopen'); + // @codeCoverageIgnoreEnd + } + + return $stream; + }, + comment: $comment, + compressionMethod: $compressionMethod, + deflateLevel: $deflateLevel, + lastModificationDateTime: $lastModificationDateTime, + maxSize: $maxSize, + exactSize: $exactSize, + enableZeroHeader: $enableZeroHeader, + ); } /** - * addFileFromStream + * Add an open stream (resource) to the archive. * - * Add an open stream to the archive. + * ##### File Options * - * @param String $name - path of file in archive (including directory). - * @param resource $stream - contents of file as a stream resource - * @param FileOptions $options + * See {@see addFileFromPsr7Stream()} * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. + * ##### Examples * - * Examples: + * ```php + * // create a temporary file stream and write text to it + * $filePointer = tmpfile(); + * fwrite($filePointer, 'The quick brown fox jumped over the lazy dog.'); * - * // create a temporary file stream and write text to it - * $fp = tmpfile(); - * fwrite($fp, 'The quick brown fox jumped over the lazy dog.'); + * // add a file named 'streamfile.txt' from the content of the stream + * $archive->addFileFromStream( + * fileName: 'streamfile.txt', + * stream: $filePointer, + * ); + * ``` * - * // add a file named 'streamfile.txt' from the content of the stream - * $x->addFileFromStream('streamfile.txt', $fp); - * - * @return void + * @param resource $stream contents of file as a stream resource */ - public function addFileFromStream(string $name, $stream, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processStream(new DeflateStream($stream)); + public function addFileFromStream( + string $fileName, + $stream, + string $comment = '', + ?CompressionMethod $compressionMethod = null, + ?int $deflateLevel = null, + ?DateTimeInterface $lastModificationDateTime = null, + ?int $maxSize = null, + ?int $exactSize = null, + ?bool $enableZeroHeader = null, + ): void { + $this->addFileFromCallback( + fileName: $fileName, + callback: fn() => $stream, + comment: $comment, + compressionMethod: $compressionMethod, + deflateLevel: $deflateLevel, + lastModificationDateTime: $lastModificationDateTime, + maxSize: $maxSize, + exactSize: $exactSize, + enableZeroHeader: $enableZeroHeader, + ); } /** - * addFileFromPsr7Stream - * * Add an open stream to the archive. * - * @param String $name - path of file in archive (including directory). - * @param StreamInterface $stream - contents of file as a stream resource - * @param FileOptions $options + * ##### Examples * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. + * ```php + * $stream = $response->getBody(); + * // add a file named 'streamfile.txt' from the content of the stream + * $archive->addFileFromPsr7Stream( + * fileName: 'streamfile.txt', + * stream: $stream, + * ); + * ``` * - * Examples: + * @param string $fileName + * path of file in archive (including directory) * - * $stream = $response->getBody(); - * // add a file named 'streamfile.txt' from the content of the stream - * $x->addFileFromPsr7Stream('streamfile.txt', $stream); + * @param StreamInterface $stream + * contents of file as a stream resource * - * @return void + * @param string $comment + * ZIP comment for this file + * + * @param ?CompressionMethod $compressionMethod + * Override `defaultCompressionMethod` + * + * See {@see __construct()} + * + * @param ?int $deflateLevel + * Override `defaultDeflateLevel` + * + * See {@see __construct()} + * + * @param ?DateTimeInterface $lastModificationDateTime + * Set last modification time of file. + * + * Default: `now` + * + * @param ?int $maxSize + * Only read `maxSize` bytes from file. + * + * The file is considered done when either reaching `EOF` + * or the `maxSize`. + * + * @param ?int $exactSize + * Read exactly `exactSize` bytes from file. + * If `EOF` is reached before reading `exactSize` bytes, an error will be + * thrown. The parameter allows for faster size calculations if the `stream` + * does not support `fstat` size or is slow and otherwise known beforehand. + * + * @param ?bool $enableZeroHeader + * Override `defaultEnableZeroHeader` + * + * See {@see __construct()} */ public function addFileFromPsr7Stream( - string $name, + string $fileName, StreamInterface $stream, - ?FileOptions $options = null + string $comment = '', + ?CompressionMethod $compressionMethod = null, + ?int $deflateLevel = null, + ?DateTimeInterface $lastModificationDateTime = null, + ?int $maxSize = null, + ?int $exactSize = null, + ?bool $enableZeroHeader = null, ): void { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processStream($stream); + $this->addFileFromCallback( + fileName: $fileName, + callback: fn() => $stream, + comment: $comment, + compressionMethod: $compressionMethod, + deflateLevel: $deflateLevel, + lastModificationDateTime: $lastModificationDateTime, + maxSize: $maxSize, + exactSize: $exactSize, + enableZeroHeader: $enableZeroHeader, + ); } /** - * finish + * Add a file based on a callback. * + * This is useful when you want to simulate a lot of files without keeping + * all of the file handles open at the same time. + * + * ##### Examples + * + * ```php + * foreach($files as $name => $size) { + * $archive->addFileFromCallback( + * fileName: 'streamfile.txt', + * exactSize: $size, + * callback: function() use($name): Psr\Http\Message\StreamInterface { + * $response = download($name); + * return $response->getBody(); + * } + * ); + * } + * ``` + * + * @param string $fileName + * path of file in archive (including directory) + * + * @param Closure $callback + * @psalm-param Closure(): (resource|StreamInterface|string) $callback + * A callback to get the file contents in the shape of a PHP stream, + * a Psr StreamInterface implementation, or a string. + * + * @param string $comment + * ZIP comment for this file + * + * @param ?CompressionMethod $compressionMethod + * Override `defaultCompressionMethod` + * + * See {@see __construct()} + * + * @param ?int $deflateLevel + * Override `defaultDeflateLevel` + * + * See {@see __construct()} + * + * @param ?DateTimeInterface $lastModificationDateTime + * Set last modification time of file. + * + * Default: `now` + * + * @param ?int $maxSize + * Only read `maxSize` bytes from file. + * + * The file is considered done when either reaching `EOF` + * or the `maxSize`. + * + * @param ?int $exactSize + * Read exactly `exactSize` bytes from file. + * If `EOF` is reached before reading `exactSize` bytes, an error will be + * thrown. The parameter allows for faster size calculations if the `stream` + * does not support `fstat` size or is slow and otherwise known beforehand. + * + * @param ?bool $enableZeroHeader + * Override `defaultEnableZeroHeader` + * + * See {@see __construct()} + */ + public function addFileFromCallback( + string $fileName, + Closure $callback, + string $comment = '', + ?CompressionMethod $compressionMethod = null, + ?int $deflateLevel = null, + ?DateTimeInterface $lastModificationDateTime = null, + ?int $maxSize = null, + ?int $exactSize = null, + ?bool $enableZeroHeader = null, + ): void { + $file = new File( + dataCallback: function () use ($callback, $maxSize) { + $data = $callback(); + + if (is_resource($data)) { + return $data; + } + + if ($data instanceof StreamInterface) { + return StreamWrapper::getResource($data); + } + + + $stream = fopen('php://memory', 'rw+'); + if ($stream === false) { + // @codeCoverageIgnoreStart + throw new ResourceActionException('fopen'); + // @codeCoverageIgnoreEnd + } + if ($maxSize !== null && fwrite($stream, $data, $maxSize) === false) { + // @codeCoverageIgnoreStart + throw new ResourceActionException('fwrite', $stream); + // @codeCoverageIgnoreEnd + } elseif (fwrite($stream, $data) === false) { + // @codeCoverageIgnoreStart + throw new ResourceActionException('fwrite', $stream); + // @codeCoverageIgnoreEnd + } + if (rewind($stream) === false) { + // @codeCoverageIgnoreStart + throw new ResourceActionException('rewind', $stream); + // @codeCoverageIgnoreEnd + } + + return $stream; + + }, + send: $this->send(...), + recordSentBytes: $this->recordSentBytes(...), + operationMode: $this->operationMode, + fileName: $fileName, + startOffset: $this->offset, + compressionMethod: $compressionMethod ?? $this->defaultCompressionMethod, + comment: $comment, + deflateLevel: $deflateLevel ?? $this->defaultDeflateLevel, + lastModificationDateTime: $lastModificationDateTime ?? new DateTimeImmutable(), + maxSize: $maxSize, + exactSize: $exactSize, + enableZip64: $this->enableZip64, + enableZeroHeader: $enableZeroHeader ?? $this->defaultEnableZeroHeader, + ); + + if ($this->operationMode !== OperationMode::NORMAL) { + $this->recordedSimulation[] = $file; + } + + $this->centralDirectoryRecords[] = $file->process(); + } + + /** + * Add a directory to the archive. + * + * ##### File Options + * + * See {@see addFileFromPsr7Stream()} + * + * ##### Examples + * + * ```php + * // add a directory named 'world/' + * $zip->addDirectory(fileName: 'world/'); + * ``` + */ + public function addDirectory( + string $fileName, + string $comment = '', + ?DateTimeInterface $lastModificationDateTime = null, + ): void { + if (!str_ends_with($fileName, '/')) { + $fileName .= '/'; + } + + $this->addFile( + fileName: $fileName, + data: '', + comment: $comment, + compressionMethod: CompressionMethod::STORE, + deflateLevel: null, + lastModificationDateTime: $lastModificationDateTime, + maxSize: 0, + exactSize: 0, + enableZeroHeader: false, + ); + } + + /** + * Executes a previously calculated simulation. + * + * ##### Example + * + * ```php + * $zip = new ZipStream( + * outputName: 'foo.zip', + * operationMode: OperationMode::SIMULATE_STRICT, + * ); + * + * $zip->addFile('test.txt', 'Hello World'); + * + * $size = $zip->finish(); + * + * header('Content-Length: '. $size); + * + * $zip->executeSimulation(); + * ``` + */ + public function executeSimulation(): void + { + if ($this->operationMode !== OperationMode::NORMAL) { + throw new RuntimeException('Zip simulation is not finished.'); + } + + foreach ($this->recordedSimulation as $file) { + $this->centralDirectoryRecords[] = $file->cloneSimulationExecution()->process(); + } + + $this->finish(); + } + + /** * Write zip footer to stream. * - * Example: + * The class is left in an unusable state after `finish`. * - * // add a list of files to the archive - * $files = array('foo.txt', 'bar.jpg'); - * foreach ($files as $path) - * $zip->addFile($path, file_get_contents($path)); + * ##### Example * - * // write footer to stream - * $zip->finish(); - * @return void - * - * @throws OverflowException + * ```php + * // write footer to stream + * $zip->finish(); + * ``` */ - public function finish(): void + public function finish(): int { + $centralDirectoryStartOffsetOnDisk = $this->offset; + $sizeOfCentralDirectory = 0; + // add trailing cdr file records - foreach ($this->files as $cdrFile) { - $this->send($cdrFile); - $this->cdr_ofs = $this->cdr_ofs->add(Bigint::init(strlen($cdrFile))); + foreach ($this->centralDirectoryRecords as $centralDirectoryRecord) { + $this->send($centralDirectoryRecord); + $sizeOfCentralDirectory += strlen($centralDirectoryRecord); } // Add 64bit headers (if applicable) - if (count($this->files) >= 0xFFFF || - $this->cdr_ofs->isOver32() || - $this->ofs->isOver32()) { - if (!$this->opt->isEnableZip64()) { + if (count($this->centralDirectoryRecords) >= 0xFFFF + || $centralDirectoryStartOffsetOnDisk > 0xFFFFFFFF + || $sizeOfCentralDirectory > 0xFFFFFFFF) { + if (!$this->enableZip64) { throw new OverflowException(); } - $this->addCdr64Eof(); - $this->addCdr64Locator(); + $this->send(Zip64\EndOfCentralDirectory::generate( + versionMadeBy: self::ZIP_VERSION_MADE_BY, + versionNeededToExtract: Version::ZIP64->value, + numberOfThisDisk: 0, + numberOfTheDiskWithCentralDirectoryStart: 0, + numberOfCentralDirectoryEntriesOnThisDisk: count($this->centralDirectoryRecords), + numberOfCentralDirectoryEntries: count($this->centralDirectoryRecords), + sizeOfCentralDirectory: $sizeOfCentralDirectory, + centralDirectoryStartOffsetOnDisk: $centralDirectoryStartOffsetOnDisk, + extensibleDataSector: '', + )); + + $this->send(Zip64\EndOfCentralDirectoryLocator::generate( + numberOfTheDiskWithZip64CentralDirectoryStart: 0x00, + zip64centralDirectoryStartOffsetOnDisk: $centralDirectoryStartOffsetOnDisk + $sizeOfCentralDirectory, + totalNumberOfDisks: 1, + )); } // add trailing cdr eof record - $this->addCdrEof(); + $numberOfCentralDirectoryEntries = min(count($this->centralDirectoryRecords), 0xFFFF); + $this->send(EndOfCentralDirectory::generate( + numberOfThisDisk: 0x00, + numberOfTheDiskWithCentralDirectoryStart: 0x00, + numberOfCentralDirectoryEntriesOnThisDisk: $numberOfCentralDirectoryEntries, + numberOfCentralDirectoryEntries: $numberOfCentralDirectoryEntries, + sizeOfCentralDirectory: min($sizeOfCentralDirectory, 0xFFFFFFFF), + centralDirectoryStartOffsetOnDisk: min($centralDirectoryStartOffsetOnDisk, 0xFFFFFFFF), + zipFileComment: $this->comment, + )); + + $size = $this->offset; // The End $this->clear(); + + return $size; } /** - * Create a format string and argument list for pack(), then call - * pack() and return the result. - * - * @param array $fields - * @return string + * @param StreamInterface|resource|null $outputStream + * @return resource */ - public static function packFields(array $fields): string + private static function normalizeStream($outputStream) { - $fmt = ''; - $args = []; + if ($outputStream instanceof StreamInterface) { + return StreamWrapper::getResource($outputStream); + } + if (is_resource($outputStream)) { + return $outputStream; + } + $resource = fopen('php://output', 'wb'); - // populate format string and argument list - foreach ($fields as [$format, $value]) { - if ($format === 'P') { - $fmt .= 'VV'; - if ($value instanceof Bigint) { - $args[] = $value->getLow32(); - $args[] = $value->getHigh32(); - } else { - $args[] = $value; - $args[] = 0; - } - } else { - if ($value instanceof Bigint) { - $value = $value->getLow32(); - } - $fmt .= $format; - $args[] = $value; - } + if ($resource === false) { + throw new RuntimeException('fopen of php://output failed'); } - // prepend format string to argument list - array_unshift($args, $fmt); + return $resource; + } - // build output string from header and compressed data - return pack(...$args); + /** + * Record sent bytes + */ + private function recordSentBytes(int $sentBytes): void + { + $this->offset += $sentBytes; } /** * Send string, sending HTTP headers if necessary. * Flush output after write if configure option is set. - * - * @param String $str - * @return void */ - public function send(string $str): void + private function send(string $data): void { - if ($this->need_headers) { + if (!$this->ready) { + throw new RuntimeException('Archive is already finished'); + } + + if ($this->operationMode === OperationMode::NORMAL && $this->sendHttpHeaders) { $this->sendHttpHeaders(); - } - $this->need_headers = false; - - $outputStream = $this->opt->getOutputStream(); - - if ($outputStream instanceof StreamInterface) { - $outputStream->write($str); - } else { - fwrite($outputStream, $str); + $this->sendHttpHeaders = false; } - if ($this->opt->isFlushOutput()) { - // flush output buffer if it is on and flushable - $status = ob_get_status(); - if (isset($status['flags']) && ($status['flags'] & PHP_OUTPUT_HANDLER_FLUSHABLE)) { - ob_flush(); + $this->recordSentBytes(strlen($data)); + + if ($this->operationMode === OperationMode::NORMAL) { + if (fwrite($this->outputStream, $data) === false) { + throw new ResourceActionException('fwrite', $this->outputStream); } - // Flush system buffers after flushing userspace output buffer - flush(); + if ($this->flushOutput) { + // flush output buffer if it is on and flushable + $status = ob_get_status(); + if (isset($status['flags']) && is_int($status['flags']) && ($status['flags'] & PHP_OUTPUT_HANDLER_FLUSHABLE)) { + ob_flush(); + } + + // Flush system buffers after flushing userspace output buffer + flush(); + } } } /** - * Is this file larger than large_file_size? - * - * @param string $path - * @return bool - */ - public function isLargeFile(string $path): bool - { - if (!$this->opt->isStatFiles()) { - return false; - } - $stat = stat($path); - return $stat['size'] > $this->opt->getLargeFileSize(); - } - - /** - * Save file attributes for trailing CDR record. - * - * @param File $file - * @return void - */ - public function addToCdr(File $file): void - { - $file->ofs = $this->ofs; - $this->ofs = $this->ofs->add($file->getTotalLength()); - $this->files[] = $file->getCdrFile(); - } - - /** - * Send ZIP64 CDR EOF (Central Directory Record End-of-File) record. - * - * @return void - */ - protected function addCdr64Eof(): void - { - $num_files = count($this->files); - $cdr_length = $this->cdr_ofs; - $cdr_offset = $this->ofs; - - $fields = [ - ['V', static::ZIP64_CDR_EOF_SIGNATURE], // ZIP64 end of central file header signature - ['P', 44], // Length of data below this header (length of block - 12) = 44 - ['v', static::ZIP_VERSION_MADE_BY], // Made by version - ['v', Version::ZIP64], // Extract by version - ['V', 0x00], // disk number - ['V', 0x00], // no of disks - ['P', $num_files], // no of entries on disk - ['P', $num_files], // no of entries in cdr - ['P', $cdr_length], // CDR size - ['P', $cdr_offset], // CDR offset - ]; - - $ret = static::packFields($fields); - $this->send($ret); - } - - /** - * Send HTTP headers for this stream. - * - * @return void - */ - protected function sendHttpHeaders(): void + * Send HTTP headers for this stream. + */ + private function sendHttpHeaders(): void { // grab content disposition - $disposition = $this->opt->getContentDisposition(); + $disposition = $this->contentDisposition; - if ($this->output_name) { + if ($this->outputName !== null) { // Various different browsers dislike various characters here. Strip them all for safety. - $safe_output = trim(str_replace(['"', "'", '\\', ';', "\n", "\r"], '', $this->output_name)); + $safeOutput = trim(str_replace(['"', "'", '\\', ';', "\n", "\r"], '', $this->outputName)); // Check if we need to UTF-8 encode the filename - $urlencoded = rawurlencode($safe_output); + $urlencoded = rawurlencode($safeOutput); $disposition .= "; filename*=UTF-8''{$urlencoded}"; } $headers = [ - 'Content-Type' => $this->opt->getContentType(), + 'Content-Type' => $this->contentType, 'Content-Disposition' => $disposition, 'Pragma' => 'public', 'Cache-Control' => 'public, must-revalidate', 'Content-Transfer-Encoding' => 'binary', ]; - $call = $this->opt->getHttpHeaderCallback(); foreach ($headers as $key => $val) { - $call("$key: $val"); + ($this->httpHeaderCallback)("$key: $val"); } } - /** - * Send ZIP64 CDR Locator (Central Directory Record Locator) record. - * - * @return void - */ - protected function addCdr64Locator(): void - { - $cdr_offset = $this->ofs->add($this->cdr_ofs); - - $fields = [ - ['V', static::ZIP64_CDR_LOCATOR_SIGNATURE], // ZIP64 end of central file header signature - ['V', 0x00], // Disc number containing CDR64EOF - ['P', $cdr_offset], // CDR offset - ['V', 1], // Total number of disks - ]; - - $ret = static::packFields($fields); - $this->send($ret); - } - - /** - * Send CDR EOF (Central Directory Record End-of-File) record. - * - * @return void - */ - protected function addCdrEof(): void - { - $num_files = count($this->files); - $cdr_length = $this->cdr_ofs; - $cdr_offset = $this->ofs; - - // grab comment (if specified) - $comment = $this->opt->getComment(); - - $fields = [ - ['V', static::CDR_EOF_SIGNATURE], // end of central file header signature - ['v', 0x00], // disk number - ['v', 0x00], // no of disks - ['v', min($num_files, 0xFFFF)], // no of entries on disk - ['v', min($num_files, 0xFFFF)], // no of entries in cdr - ['V', $cdr_length->getLowFF()], // CDR size - ['V', $cdr_offset->getLowFF()], // CDR offset - ['v', strlen($comment)], // Zip Comment size - ]; - - $ret = static::packFields($fields) . $comment; - $this->send($ret); - } - /** * Clear all internal variables. Note that the stream object is not * usable after this. - * - * @return void */ - protected function clear(): void + private function clear(): void { - $this->files = []; - $this->ofs = new Bigint(); - $this->cdr_ofs = new Bigint(); - $this->opt = new ArchiveOptions(); + $this->centralDirectoryRecords = []; + $this->offset = 0; + + if ($this->operationMode === OperationMode::NORMAL) { + $this->ready = false; + $this->recordedSimulation = []; + } else { + $this->operationMode = OperationMode::NORMAL; + } } } diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zs/ExtendedInformationExtraField.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zs/ExtendedInformationExtraField.php new file mode 100644 index 0000000..bf621bc --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/src/Zs/ExtendedInformationExtraField.php @@ -0,0 +1,23 @@ +fail("File {$filePath} must contain {$needle}"); + } + + protected function assertFileDoesNotContain(string $filePath, string $needle): void + { + $last = ''; + + $handle = fopen($filePath, 'r'); + while (!feof($handle)) { + $line = fgets($handle, 1024); + + if (str_contains($last . $line, $needle)) { + fclose($handle); + + $this->fail("File {$filePath} must not contain {$needle}"); + } + + $last = $line; + } + + fclose($handle); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/BigintTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/BigintTest.php deleted file mode 100644 index 4d26fcd..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/BigintTest.php +++ /dev/null @@ -1,66 +0,0 @@ -assertSame('0x0000000012345678', $bigint->getHex64()); - $this->assertSame(0x12345678, $bigint->getLow32()); - $this->assertSame(0, $bigint->getHigh32()); - } - - public function testConstructLarge(): void - { - $bigint = new Bigint(0x87654321); - $this->assertSame('0x0000000087654321', $bigint->getHex64()); - $this->assertSame('87654321', bin2hex(pack('N', $bigint->getLow32()))); - $this->assertSame(0, $bigint->getHigh32()); - } - - public function testAddSmallValue(): void - { - $bigint = new Bigint(1); - $bigint = $bigint->add(Bigint::init(2)); - $this->assertSame(3, $bigint->getLow32()); - $this->assertFalse($bigint->isOver32()); - $this->assertTrue($bigint->isOver32(true)); - $this->assertSame($bigint->getLowFF(), (float)$bigint->getLow32()); - $this->assertSame($bigint->getLowFF(true), (float)0xFFFFFFFF); - } - - public function testAddWithOverflowAtLowestByte(): void - { - $bigint = new Bigint(0xFF); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertSame(0x100, $bigint->getLow32()); - } - - public function testAddWithOverflowAtInteger32(): void - { - $bigint = new Bigint(0xFFFFFFFE); - $this->assertFalse($bigint->isOver32()); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertTrue($bigint->isOver32()); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertSame('0x0000000100000000', $bigint->getHex64()); - $this->assertTrue($bigint->isOver32()); - $this->assertSame((float)0xFFFFFFFF, $bigint->getLowFF()); - } - - public function testAddWithOverflowAtInteger64(): void - { - $bigint = Bigint::fromLowHigh(0xFFFFFFFF, 0xFFFFFFFF); - $this->assertSame('0xFFFFFFFFFFFFFFFF', $bigint->getHex64()); - $this->expectException(OverflowException::class); - $bigint->add(Bigint::init(1)); - } -} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CallbackOutputTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CallbackOutputTest.php new file mode 100644 index 0000000..1f185fe --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CallbackOutputTest.php @@ -0,0 +1,202 @@ +addFile('hello.txt', 'Hello World'); + $zip->finish(); + + $tmp = tmpfile(); + fwrite($tmp, $buf); + rewind($tmp); + + $meta = stream_get_meta_data($tmp); + $za = new ZipArchive(); + $za->open($meta['uri']); + + $content = $za->getFromName('hello.txt'); + $za->close(); + fclose($tmp); + + $this->assertSame('Hello World', $content); + } + + public function testMultipleSimultaneousStreams(): void + { + $buf1 = ''; + $buf2 = ''; + + $stream1 = CallbackStreamWrapper::open( + static function (string $chunk) use (&$buf1): void { $buf1 .= $chunk; } + ); + $stream2 = CallbackStreamWrapper::open( + static function (string $chunk) use (&$buf2): void { $buf2 .= $chunk; } + ); + + $this->assertIsResource($stream1); + $this->assertIsResource($stream2); + + fwrite($stream1, 'data1'); + fwrite($stream2, 'data2'); + fclose($stream1); + fclose($stream2); + + $this->assertSame('data1', $buf1); + $this->assertSame('data2', $buf2); + } + + public function testExceptionHandlingInCallback(): void + { + $stream = CallbackStreamWrapper::open( + static function (string $chunk): void { + throw new RuntimeException('Callback error'); + } + ); + + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Callback function failed during stream write: Callback error'); + + fwrite($stream, 'test data'); + } + + public function testLargeDataChunks(): void + { + $receivedChunks = []; + $totalBytes = 0; + + $stream = CallbackStreamWrapper::open( + static function (string $chunk) use (&$receivedChunks, &$totalBytes): void { + $receivedChunks[] = strlen($chunk); + $totalBytes += strlen($chunk); + } + ); + + // Write large chunks of data + $largeData = str_repeat('x', 65536); // 64KB + fwrite($stream, $largeData); + fwrite($stream, $largeData); + fclose($stream); + + $this->assertSame(131072, $totalBytes); // 128KB total + $this->assertNotEmpty($receivedChunks); + // Large data should be written (possibly in multiple chunks) + $this->assertGreaterThan(0, max($receivedChunks)); + } + + public function testStreamPositionTracking(): void + { + $stream = CallbackStreamWrapper::open( + static function (string $chunk): void { /* no-op */ } + ); + + $this->assertSame(0, ftell($stream)); + + fwrite($stream, 'hello'); + $this->assertSame(5, ftell($stream)); + + fwrite($stream, ' world'); + $this->assertSame(11, ftell($stream)); + + fclose($stream); + } + + public function testInvalidModeRejection(): void + { + $stream = CallbackStreamWrapper::open( + static function (string $chunk): void { /* no-op */ } + ); + + // Close the stream first + fclose($stream); + + // Try to open with read mode - should fail + $readStream = fopen('zipcb://invalid', 'rb'); + $this->assertFalse($readStream); + } + + public function testStreamStatistics(): void + { + $stream = CallbackStreamWrapper::open( + static function (string $chunk): void { /* no-op */ } + ); + + fwrite($stream, 'test data'); + + $stats = fstat($stream); + $this->assertIsArray($stats); + $this->assertSame(9, $stats['size']); // Length of 'test data' + $this->assertSame(0o100666, $stats['mode']); // Regular file permissions + + fclose($stream); + } + + public function testProgressTracking(): void + { + $progress = []; + $totalBytes = 0; + + $zip = new ZipStream( + outputStream: CallbackStreamWrapper::open( + static function (string $chunk) use (&$progress, &$totalBytes): void { + $totalBytes += strlen($chunk); + $progress[] = $totalBytes; + } + ), + sendHttpHeaders: false + ); + + $zip->addFile('file1.txt', 'Content 1'); + $zip->addFile('file2.txt', 'Content 2'); + $zip->finish(); + + $this->assertNotEmpty($progress); + $this->assertGreaterThan(0, $totalBytes); + $this->assertTrue(count($progress) > 1, 'Should have multiple progress updates'); + } + + public function testCallbackCleanupOnClose(): void + { + $callbackExecuted = false; + + $stream = CallbackStreamWrapper::open( + static function (string $chunk) use (&$callbackExecuted): void { + $callbackExecuted = true; + } + ); + + fwrite($stream, 'test'); + $this->assertTrue($callbackExecuted); + + fclose($stream); + + // After closing, callback should be cleaned up + // We can't directly test this, but the tearDown cleanup should work without issues + $this->assertTrue(true); // Placeholder assertion + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CentralDirectoryFileHeaderTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CentralDirectoryFileHeaderTest.php new file mode 100644 index 0000000..3e9e385 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/CentralDirectoryFileHeaderTest.php @@ -0,0 +1,60 @@ +assertSame( + bin2hex($header), + '504b0102' // 4 bytes; central file header signature + . '0306' // 2 bytes; version made by + . '2d00' // 2 bytes; version needed to extract + . '2222' // 2 bytes; general purpose bit flag + . '0800' // 2 bytes; compression method + . '2008' // 2 bytes; last mod file time + . '2154' // 2 bytes; last mod file date + . '11111111' // 4 bytes; crc-32 + . '77777777' // 4 bytes; compressed size + . '99999999' // 4 bytes; uncompressed size + . '0800' // 2 bytes; file name length (n) + . '0c00' // 2 bytes; extra field length (m) + . '0c00' // 2 bytes; file comment length (o) + . '0000' // 2 bytes; disk number start + . '0000' // 2 bytes; internal file attributes + . '20000000' // 4 bytes; external file attributes + . '34120000' // 4 bytes; relative offset of local header + . '746573742e706e67' // n bytes; file name + . '736f6d6520636f6e74656e74' // m bytes; extra field + . '736f6d6520636f6d6d656e74' // o bytes; file comment + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/DataDescriptorTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/DataDescriptorTest.php new file mode 100644 index 0000000..349f87d --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/DataDescriptorTest.php @@ -0,0 +1,26 @@ +assertSame( + bin2hex(DataDescriptor::generate( + crc32UncompressedData: 0x11111111, + compressedSize: 0x77777777, + uncompressedSize: 0x99999999, + )), + '504b0708' // 4 bytes; Optional data descriptor signature = 0x08074b50 + . '11111111' // 4 bytes; CRC-32 of uncompressed data + . '77777777' // 4 bytes; Compressed size + . '99999999' // 4 bytes; Uncompressed size + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndOfCentralDirectoryTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndOfCentralDirectoryTest.php new file mode 100644 index 0000000..0b808d8 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndOfCentralDirectoryTest.php @@ -0,0 +1,35 @@ +assertSame( + bin2hex(EndOfCentralDirectory::generate( + numberOfThisDisk: 0x00, + numberOfTheDiskWithCentralDirectoryStart: 0x00, + numberOfCentralDirectoryEntriesOnThisDisk: 0x10, + numberOfCentralDirectoryEntries: 0x10, + sizeOfCentralDirectory: 0x22, + centralDirectoryStartOffsetOnDisk: 0x33, + zipFileComment: 'foo', + )), + '504b0506' // 4 bytes; end of central dir signature 0x06054b50 + . '0000' // 2 bytes; number of this disk + . '0000' // 2 bytes; number of the disk with the start of the central directory + . '1000' // 2 bytes; total number of entries in the central directory on this disk + . '1000' // 2 bytes; total number of entries in the central directory + . '22000000' // 4 bytes; size of the central directory + . '33000000' // 4 bytes; offset of start of central directory with respect to the starting disk number + . '0300' // 2 bytes; .ZIP file comment length + . bin2hex('foo') + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndlessCycleStream.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndlessCycleStream.php new file mode 100644 index 0000000..1020c02 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/EndlessCycleStream.php @@ -0,0 +1,104 @@ +detach(); + } + + /** + * @return null + */ + public function detach() + { + return; + } + + public function getSize(): ?int + { + return null; + } + + public function tell(): int + { + return $this->offset; + } + + public function eof(): bool + { + return false; + } + + public function isSeekable(): bool + { + return true; + } + + public function seek(int $offset, int $whence = SEEK_SET): void + { + switch ($whence) { + case SEEK_SET: + $this->offset = $offset; + break; + case SEEK_CUR: + $this->offset += $offset; + break; + case SEEK_END: + throw new RuntimeException('Infinite Stream!'); + break; + } + } + + public function rewind(): void + { + $this->seek(0); + } + + public function isWritable(): bool + { + return false; + } + + public function write(string $string): int + { + throw new RuntimeException('Not writeable'); + } + + public function isReadable(): bool + { + return true; + } + + public function read(int $length): string + { + $this->offset += $length; + return substr(str_repeat($this->toRepeat, (int) ceil($length / strlen($this->toRepeat))), 0, $length); + } + + public function getContents(): string + { + throw new RuntimeException('Infinite Stream!'); + } + + public function getMetadata(?string $key = null): ?array + { + return $key !== null ? null : []; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/FaultInjectionResource.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/FaultInjectionResource.php new file mode 100644 index 0000000..af9305b --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/FaultInjectionResource.php @@ -0,0 +1,141 @@ +context); + + if (!isset($options[self::NAME]['injectFaults'])) { + return false; + } + + $this->mode = $mode; + $this->injectFaults = $options[self::NAME]['injectFaults']; + + if ($this->shouldFail(__FUNCTION__)) { + return false; + } + + return true; + } + + public function stream_write(string $data) + { + if ($this->shouldFail(__FUNCTION__)) { + return false; + } + return true; + } + + public function stream_eof() + { + return true; + } + + public function stream_seek(int $offset, int $whence): bool + { + if ($this->shouldFail(__FUNCTION__)) { + return false; + } + + return true; + } + + public function stream_tell(): int + { + if ($this->shouldFail(__FUNCTION__)) { + return false; + } + + return 0; + } + + public static function register(): void + { + if (!in_array(self::NAME, stream_get_wrappers(), true)) { + stream_wrapper_register(self::NAME, __CLASS__); + } + } + + public function stream_stat(): array + { + static $modeMap = [ + 'r' => 33060, + 'rb' => 33060, + 'r+' => 33206, + 'w' => 33188, + 'wb' => 33188, + ]; + + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => $modeMap[$this->mode], + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0, + ]; + } + + public function url_stat(string $path, int $flags): array + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0, + ]; + } + + private static function createStreamContext(array $injectFaults) + { + return stream_context_create([ + self::NAME => ['injectFaults' => $injectFaults], + ]); + } + + private function shouldFail(string $function): bool + { + return in_array($function, $this->injectFaults, true); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/LocalFileHeaderTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/LocalFileHeaderTest.php new file mode 100644 index 0000000..6510e78 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/LocalFileHeaderTest.php @@ -0,0 +1,47 @@ +assertSame( + bin2hex((string) $header), + '504b0304' // 4 bytes; Local file header signature + . '2d00' // 2 bytes; Version needed to extract (minimum) + . '2222' // 2 bytes; General purpose bit flag + . '0800' // 2 bytes; Compression method; e.g. none = 0, DEFLATE = 8 + . '2008' // 2 bytes; File last modification time + . '2154' // 2 bytes; File last modification date + . '11111111' // 4 bytes; CRC-32 of uncompressed data + . '77777777' // 4 bytes; Compressed size (or 0xffffffff for ZIP64) + . '99999999' // 4 bytes; Uncompressed size (or 0xffffffff for ZIP64) + . '0800' // 2 bytes; File name length (n) + . '0c00' // 2 bytes; Extra field length (m) + . '746573742e706e67' // n bytes; File name + . '736f6d6520636f6e74656e74' // m bytes; Extra field + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/PackFieldTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/PackFieldTest.php new file mode 100644 index 0000000..ecd66ba --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/PackFieldTest.php @@ -0,0 +1,42 @@ +assertSame( + bin2hex(PackField::pack(new PackField(format: 'v', value: 0x1122))), + '2211', + ); + } + + public function testOverflow2(): void + { + $this->expectException(RuntimeException::class); + + PackField::pack(new PackField(format: 'v', value: 0xFFFFF)); + } + + public function testOverflow4(): void + { + $this->expectException(RuntimeException::class); + + PackField::pack(new PackField(format: 'V', value: 0xFFFFFFFFF)); + } + + public function testUnknownOperator(): void + { + $this->assertSame( + bin2hex(PackField::pack(new PackField(format: 'a', value: 0x1122))), + '34', + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ResourceStream.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ResourceStream.php new file mode 100644 index 0000000..752a1a3 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ResourceStream.php @@ -0,0 +1,159 @@ +isSeekable()) { + $this->seek(0); + } + return (string) stream_get_contents($this->stream); + } + + public function close(): void + { + $stream = $this->detach(); + if ($stream) { + fclose($stream); + } + } + + public function detach() + { + $result = $this->stream; + // According to the interface, the stream is left in an unusable state; + /** @psalm-suppress PossiblyNullPropertyAssignmentValue */ + $this->stream = null; + return $result; + } + + public function seek(int $offset, int $whence = SEEK_SET): void + { + if (!$this->isSeekable()) { + throw new RuntimeException(); + } + if (fseek($this->stream, $offset, $whence) !== 0) { + // @codeCoverageIgnoreStart + throw new RuntimeException(); + // @codeCoverageIgnoreEnd + } + } + + public function isSeekable(): bool + { + return (bool) $this->getMetadata('seekable'); + } + + public function getMetadata(?string $key = null) + { + $metadata = stream_get_meta_data($this->stream); + return $key !== null ? @$metadata[$key] : $metadata; + } + + public function getSize(): ?int + { + $stats = fstat($this->stream); + return $stats['size']; + } + + public function tell(): int + { + $position = ftell($this->stream); + if ($position === false) { + // @codeCoverageIgnoreStart + throw new RuntimeException(); + // @codeCoverageIgnoreEnd + } + return $position; + } + + public function eof(): bool + { + return feof($this->stream); + } + + public function rewind(): void + { + $this->seek(0); + } + + public function write(string $string): int + { + if (!$this->isWritable()) { + throw new RuntimeException(); + } + if (fwrite($this->stream, $string) === false) { + // @codeCoverageIgnoreStart + throw new RuntimeException(); + // @codeCoverageIgnoreEnd + } + return strlen($string); + } + + public function isWritable(): bool + { + $mode = $this->getMetadata('mode'); + if (!is_string($mode)) { + // @codeCoverageIgnoreStart + throw new RuntimeException('Could not get stream mode from metadata!'); + // @codeCoverageIgnoreEnd + } + return preg_match('/[waxc+]/', $mode) === 1; + } + + public function read(int $length): string + { + if (!$this->isReadable()) { + throw new RuntimeException(); + } + $result = fread($this->stream, $length); + if ($result === false) { + // @codeCoverageIgnoreStart + throw new RuntimeException(); + // @codeCoverageIgnoreEnd + } + return $result; + } + + public function isReadable(): bool + { + $mode = $this->getMetadata('mode'); + if (!is_string($mode)) { + // @codeCoverageIgnoreStart + throw new RuntimeException('Could not get stream mode from metadata!'); + // @codeCoverageIgnoreEnd + } + return preg_match('/[r+]/', $mode) === 1; + } + + public function getContents(): string + { + if (!$this->isReadable()) { + throw new RuntimeException(); + } + $result = stream_get_contents($this->stream); + if ($result === false) { + // @codeCoverageIgnoreStart + throw new RuntimeException(); + // @codeCoverageIgnoreEnd + } + return $result; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Tempfile.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Tempfile.php new file mode 100644 index 0000000..f03ee6c --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Tempfile.php @@ -0,0 +1,42 @@ +getTmpFileStream(); + + $this->tempfile = $tempfile; + $this->tempfileStream = $tempfileStream; + } + + protected function tearDown(): void + { + unlink($this->tempfile); + if (is_resource($this->tempfileStream)) { + fclose($this->tempfileStream); + } + + $this->tempfile = null; + $this->tempfileStream = null; + } + + protected function getTmpFileStream(): array + { + $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); + $stream = fopen($tmp, 'wb+'); + + return [$tmp, $stream]; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/TimeTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/TimeTest.php new file mode 100644 index 0000000..61cfe03 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/TimeTest.php @@ -0,0 +1,44 @@ +assertSame( + Time::dateTimeToDosTime(new DateTimeImmutable('2014-11-17T17:46:08Z')), + 1165069764 + ); + + // January 1 1980 - DOS Epoch. + $this->assertSame( + Time::dateTimeToDosTime(new DateTimeImmutable('1980-01-01T00:00:00+00:00')), + 2162688 + ); + + // Local timezone different than UTC. + $prevLocalTimezone = date_default_timezone_get(); + date_default_timezone_set('Europe/Berlin'); + $this->assertSame( + Time::dateTimeToDosTime(new DateTimeImmutable('1980-01-01T00:00:00+00:00')), + 2162688 + ); + date_default_timezone_set($prevLocalTimezone); + } + + public function testTooEarlyDateToDosTime(): void + { + $this->expectException(DosTimeOverflowException::class); + + // January 1 1980 is the minimum DOS Epoch. + Time::dateTimeToDosTime(new DateTimeImmutable('1970-01-01T00:00:00+00:00')); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Util.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Util.php new file mode 100644 index 0000000..86592b4 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Util.php @@ -0,0 +1,127 @@ +cmdExists('hexdump')) { + return ''; + } + + $output = []; + + if (!exec("hexdump -C \"$path\" | head -n 50", $output)) { + return ''; + } + + return "\nHexdump:\n" . implode("\n", $output); + } + + protected function validateAndExtractZip(string $zipPath): string + { + $tmpDir = $this->getTmpDir(); + + $zipArchive = new ZipArchive(); + $result = $zipArchive->open($zipPath); + + if ($result !== true) { + $codeName = $this->zipArchiveOpenErrorCodeName($result); + $debugInformation = $this->dumpZipContents($zipPath); + + $this->fail("Failed to open {$zipPath}. Code: $result ($codeName)$debugInformation"); + + return $tmpDir; + } + + $this->assertSame(0, $zipArchive->status); + $this->assertSame(0, $zipArchive->statusSys); + + $zipArchive->extractTo($tmpDir); + $zipArchive->close(); + + return $tmpDir; + } + + protected function zipArchiveOpenErrorCodeName(int $code): string + { + switch ($code) { + case ZipArchive::ER_EXISTS: return 'ER_EXISTS'; + case ZipArchive::ER_INCONS: return 'ER_INCONS'; + case ZipArchive::ER_INVAL: return 'ER_INVAL'; + case ZipArchive::ER_MEMORY: return 'ER_MEMORY'; + case ZipArchive::ER_NOENT: return 'ER_NOENT'; + case ZipArchive::ER_NOZIP: return 'ER_NOZIP'; + case ZipArchive::ER_OPEN: return 'ER_OPEN'; + case ZipArchive::ER_READ: return 'ER_READ'; + case ZipArchive::ER_SEEK: return 'ER_SEEK'; + default: return 'unknown'; + } + } + + protected function getTmpDir(): string + { + $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); + unlink($tmp); + mkdir($tmp) or $this->fail('Failed to make directory'); + + return $tmp; + } + + /** + * @return string[] + */ + protected function getRecursiveFileList(string $path, bool $includeDirectories = false): array + { + $data = []; + $path = (string) realpath($path); + $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); + + $pathLen = strlen($path); + foreach ($files as $file) { + $filePath = $file->getRealPath(); + + if (is_dir($filePath) && !$includeDirectories) { + continue; + } + + $data[] = substr($filePath, $pathLen + 1); + } + + sort($data); + + return $data; + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/DataDescriptorTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/DataDescriptorTest.php new file mode 100644 index 0000000..8864b85 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/DataDescriptorTest.php @@ -0,0 +1,28 @@ +assertSame( + bin2hex($descriptor), + '504b0708' // 4 bytes; Optional data descriptor signature = 0x08074b50 + . '11111111' // 4 bytes; CRC-32 of uncompressed data + . '6666666677777777' // 8 bytes; Compressed size + . '8888888899999999' // 8 bytes; Uncompressed size + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryLocatorTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryLocatorTest.php new file mode 100644 index 0000000..0f905db --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryLocatorTest.php @@ -0,0 +1,28 @@ +assertSame( + bin2hex($descriptor), + '504b0607' // 4 bytes; zip64 end of central dir locator signature - 0x07064b50 + . '11111111' // 4 bytes; number of the disk with the start of the zip64 end of central directory + . '3333333322222222' // 28 bytes; relative offset of the zip64 end of central directory record + . '44444444' // 4 bytes;total number of disks + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryTest.php new file mode 100644 index 0000000..ef046f9 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/EndOfCentralDirectoryTest.php @@ -0,0 +1,41 @@ +assertSame( + bin2hex($descriptor), + '504b0606' // 4 bytes;zip64 end of central dir signature - 0x06064b50 + . '2f00000000000000' // 8 bytes; size of zip64 end of central directory record + . '3333' // 2 bytes; version made by + . '4444' // 2 bytes; version needed to extract + . '55555555' // 4 bytes; number of this disk + . '66666666' // 4 bytes; number of the disk with the start of the central directory + . '8888888877777777' // 8 bytes; total number of entries in the central directory on this disk + . 'aaaaaaaa99999999' // 8 bytes; total number of entries in the central directory + . 'ccccccccbbbbbbbb' // 8 bytes; size of the central directory + . 'eeeeeeeedddddddd' // 8 bytes; offset of start of central directory with respect to the starting disk number + . bin2hex('foo') + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/ExtendedInformationExtraFieldTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/ExtendedInformationExtraFieldTest.php new file mode 100644 index 0000000..4dde274 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zip64/ExtendedInformationExtraFieldTest.php @@ -0,0 +1,42 @@ +assertSame( + bin2hex($extraField), + '0100' // 2 bytes; Tag for this "extra" block type + . '1c00' // 2 bytes; Size of this "extra" block + . '6666666677777777' // 8 bytes; Original uncompressed file size + . '8888888899999999' // 8 bytes; Size of compressed data + . '1111111122222222' // 8 bytes; Offset of local header record + . '33333333' // 4 bytes; Number of the disk on which this file starts + ); + } + + public function testSerializesEmptyCorrectly(): void + { + $extraField = ExtendedInformationExtraField::generate(); + + $this->assertSame( + bin2hex($extraField), + '0100' // 2 bytes; Tag for this "extra" block type + . '0000' // 2 bytes; Size of this "extra" block + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ZipStreamTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ZipStreamTest.php index 945ccea..42565ad 100644 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ZipStreamTest.php +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/ZipStreamTest.php @@ -2,83 +2,49 @@ declare(strict_types=1); -namespace ZipStreamTest; +namespace ZipStream\Test; +use DateTimeImmutable; use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Psr7\StreamWrapper; use org\bovigo\vfs\vfsStream; +use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\TestCase; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use ReflectionClass; +use Psr\Http\Message\StreamInterface; +use RuntimeException; use ZipArchive; -use ZipStream\File; -use ZipStream\Option\Archive as ArchiveOptions; -use ZipStream\Option\File as FileOptions; -use ZipStream\Option\Method; -use ZipStream\Stream; +use ZipStream\CompressionMethod; +use ZipStream\Exception\FileNotFoundException; +use ZipStream\Exception\FileNotReadableException; +use ZipStream\Exception\FileSizeIncorrectException; +use ZipStream\Exception\OverflowException; +use ZipStream\Exception\ResourceActionException; +use ZipStream\Exception\SimulationFileUnknownException; +use ZipStream\Exception\StreamNotReadableException; +use ZipStream\Exception\StreamNotSeekableException; +use ZipStream\OperationMode; +use ZipStream\PackField; use ZipStream\ZipStream; -/** - * Test Class for the Main ZipStream CLass - */ class ZipStreamTest extends TestCase { - public const OSX_ARCHIVE_UTILITY = - '/System/Library/CoreServices/Applications/Archive Utility.app/Contents/MacOS/Archive Utility'; - - public function testFileNotFoundException(): void - { - $this->expectException(\ZipStream\Exception\FileNotFoundException::class); - // Get ZipStream Object - $zip = new ZipStream(); - - // Trigger error by adding a file which doesn't exist - $zip->addFileFromPath('foobar.php', '/foo/bar/foobar.php'); - } - - public function testFileNotReadableException(): void - { - // create new virtual filesystem - $root = vfsStream::setup('vfs'); - // create a virtual file with no permissions - $file = vfsStream::newFile('foo.txt', 0)->at($root)->setContent('bar'); - $zip = new ZipStream(); - $this->expectException(\ZipStream\Exception\FileNotReadableException::class); - $zip->addFileFromPath('foo.txt', $file->url()); - } - - public function testDostime(): void - { - // Allows testing of protected method - $class = new ReflectionClass(File::class); - $method = $class->getMethod('dostime'); - $method->setAccessible(true); - - $this->assertSame($method->invoke(null, 1416246368), 1165069764); - - // January 1 1980 - DOS Epoch. - $this->assertSame($method->invoke(null, 315532800), 2162688); - - // January 1 1970 -> January 1 1980 due to minimum DOS Epoch. @todo Throw Exception? - $this->assertSame($method->invoke(null, 0), 2162688); - } + use Util; + use Assertions; + use Tempfile; public function testAddFile(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $zip->addFile('sample.txt', 'Sample String Data'); $zip->addFile('test/sample.txt', 'More Simple Sample Data'); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files); @@ -89,46 +55,38 @@ class ZipStreamTest extends TestCase public function testAddFileUtf8NameComment(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $name = 'árvíztűrő tükörfúrógép.txt'; $content = 'Sample String Data'; - $comment = - 'Filename has every special characters ' . - 'from Hungarian language in lowercase. ' . - 'In uppercase: ÁÍŰŐÜÖÚÓÉ'; + $comment + = 'Filename has every special characters ' + . 'from Hungarian language in lowercase. ' + . 'In uppercase: ÁÍŰŐÜÖÚÓÉ'; - $fileOptions = new FileOptions(); - $fileOptions->setComment($comment); - - $zip->addFile($name, $content, $fileOptions); + $zip->addFile(fileName: $name, data: $content, comment: $comment); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame([$name], $files); $this->assertStringEqualsFile($tmpDir . '/' . $name, $content); - $zipArch = new ZipArchive(); - $zipArch->open($tmp); - $this->assertSame($comment, $zipArch->getCommentName($name)); + $zipArchive = new ZipArchive(); + $zipArchive->open($this->tempfile); + $this->assertSame($comment, $zipArchive->getCommentName($name)); } public function testAddFileUtf8NameNonUtfComment(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $name = 'á.txt'; $content = 'any'; @@ -140,163 +98,111 @@ class ZipStreamTest extends TestCase // nearly CP850 (DOS-Latin-1) $guessComment = mb_convert_encoding($comment, 'UTF-8', 'CP850'); - $fileOptions = new FileOptions(); - $fileOptions->setComment($comment); + $zip->addFile(fileName: $name, data: $content, comment: $comment); - $zip->addFile($name, $content, $fileOptions); $zip->finish(); - fclose($stream); $zipArch = new ZipArchive(); - $zipArch->open($tmp); + $zipArch->open($this->tempfile); $this->assertSame($guessComment, $zipArch->getCommentName($name)); $this->assertSame($comment, $zipArch->getCommentName($name, ZipArchive::FL_ENC_RAW)); } - public function testAddFileNonUtf8NameUtfComment(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $name = mb_convert_encoding('á.txt', 'ISO-8859-2', 'UTF-8'); - $content = 'any'; - $comment = 'á'; - - // @see https://libzip.org/documentation/zip_get_name.html - // - // mb_convert_encoding hasn't CP437. - // nearly CP850 (DOS-Latin-1) - $guessName = mb_convert_encoding($name, 'UTF-8', 'CP850'); - - $fileOptions = new FileOptions(); - $fileOptions->setComment($comment); - - $zip->addFile($name, $content, $fileOptions); - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - - $this->assertNotSame([$name], $files); - $this->assertSame([$guessName], $files); - $this->assertStringEqualsFile($tmpDir . '/' . $guessName, $content); - - $zipArch = new ZipArchive(); - $zipArch->open($tmp); - $this->assertSame($guessName, $zipArch->getNameIndex(0)); - $this->assertSame($name, $zipArch->getNameIndex(0, ZipArchive::FL_ENC_RAW)); - $this->assertSame($comment, $zipArch->getCommentName($guessName)); - } - public function testAddFileWithStorageMethod(): void { - [$tmp, $stream] = $this->getTmpFileStream(); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $zip->addFile('sample.txt', 'Sample String Data', $fileOptions); - $zip->addFile('test/sample.txt', 'More Simple Sample Data'); + $zip->addFile(fileName: 'sample.txt', data: 'Sample String Data', compressionMethod: CompressionMethod::STORE); + $zip->addFile(fileName: 'test/sample.txt', data: 'More Simple Sample Data'); $zip->finish(); - fclose($stream); - $zipArch = new ZipArchive(); - $zipArch->open($tmp); + $zipArchive = new ZipArchive(); + $zipArchive->open($this->tempfile); - $sample1 = $zipArch->statName('sample.txt'); - $sample12 = $zipArch->statName('test/sample.txt'); - $this->assertSame($sample1['comp_method'], Method::STORE); - $this->assertSame($sample12['comp_method'], Method::DEFLATE); + $sample1 = $zipArchive->statName('sample.txt'); + $sample12 = $zipArchive->statName('test/sample.txt'); + $this->assertSame($sample1['comp_method'], CompressionMethod::STORE->value); + $this->assertSame($sample12['comp_method'], CompressionMethod::DEFLATE->value); - $zipArch->close(); - } - - public function testDecompressFileWithMacUnarchiver(): void - { - if (!file_exists(self::OSX_ARCHIVE_UTILITY)) { - $this->markTestSkipped('The Mac OSX Archive Utility is not available.'); - } - - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $folder = uniqid('', true); - - $zip->addFile($folder . '/sample.txt', 'Sample Data'); - $zip->finish(); - fclose($stream); - - exec(escapeshellarg(self::OSX_ARCHIVE_UTILITY) . ' ' . escapeshellarg($tmp), $output, $returnStatus); - - $this->assertSame(0, $returnStatus); - $this->assertCount(0, $output); - - $this->assertFileExists(dirname($tmp) . '/' . $folder . '/sample.txt'); - $this->assertStringEqualsFile(dirname($tmp) . '/' . $folder . '/sample.txt', 'Sample Data'); + $zipArchive->close(); } public function testAddFileFromPath(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); [$tmpExample, $streamExample] = $this->getTmpFileStream(); fwrite($streamExample, 'Sample String Data'); fclose($streamExample); - $zip->addFileFromPath('sample.txt', $tmpExample); + $zip->addFileFromPath(fileName: 'sample.txt', path: $tmpExample); [$tmpExample, $streamExample] = $this->getTmpFileStream(); fwrite($streamExample, 'More Simple Sample Data'); fclose($streamExample); - $zip->addFileFromPath('test/sample.txt', $tmpExample); + $zip->addFileFromPath(fileName: 'test/sample.txt', path: $tmpExample); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files); $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); + + unlink($tmpExample); + } + + public function testAddFileFromPathFileNotFoundException(): void + { + $this->expectException(FileNotFoundException::class); + + // Get ZipStream Object + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); + + // Trigger error by adding a file which doesn't exist + $zip->addFileFromPath(fileName: 'foobar.php', path: '/foo/bar/foobar.php'); + } + + public function testAddFileFromPathFileNotReadableException(): void + { + $this->expectException(FileNotReadableException::class); + + // create new virtual filesystem + $root = vfsStream::setup('vfs'); + // create a virtual file with no permissions + $file = vfsStream::newFile('foo.txt', 0)->at($root)->setContent('bar'); + + // Get ZipStream Object + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); + + $zip->addFileFromPath('foo.txt', $file->url()); } public function testAddFileFromPathWithStorageMethod(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); [$tmpExample, $streamExample] = $this->getTmpFileStream(); fwrite($streamExample, 'Sample String Data'); fclose($streamExample); - $zip->addFileFromPath('sample.txt', $tmpExample, $fileOptions); + $zip->addFileFromPath(fileName: 'sample.txt', path: $tmpExample, compressionMethod: CompressionMethod::STORE); [$tmpExample, $streamExample] = $this->getTmpFileStream(); fwrite($streamExample, 'More Simple Sample Data'); @@ -304,31 +210,32 @@ class ZipStreamTest extends TestCase $zip->addFileFromPath('test/sample.txt', $tmpExample); $zip->finish(); - fclose($stream); - $zipArch = new ZipArchive(); - $zipArch->open($tmp); + $zipArchive = new ZipArchive(); + $zipArchive->open($this->tempfile); - $sample1 = $zipArch->statName('sample.txt'); - $this->assertSame(Method::STORE, $sample1['comp_method']); + $sample1 = $zipArchive->statName('sample.txt'); + $this->assertSame(CompressionMethod::STORE->value, $sample1['comp_method']); - $sample2 = $zipArch->statName('test/sample.txt'); - $this->assertSame(Method::DEFLATE, $sample2['comp_method']); + $sample2 = $zipArchive->statName('test/sample.txt'); + $this->assertSame(CompressionMethod::DEFLATE->value, $sample2['comp_method']); - $zipArch->close(); + $zipArchive->close(); } public function testAddLargeFileFromPath(): void { - $methods = [Method::DEFLATE(), Method::STORE()]; - $falseTrue = [false, true]; - foreach ($methods as $method) { - foreach ($falseTrue as $zeroHeader) { - foreach ($falseTrue as $zip64) { - if ($zeroHeader && $method->equals(Method::DEFLATE())) { + foreach ([CompressionMethod::DEFLATE, CompressionMethod::STORE] as $compressionMethod) { + foreach ([false, true] as $zeroHeader) { + foreach ([false, true] as $zip64) { + if ($zeroHeader && $compressionMethod === CompressionMethod::DEFLATE) { continue; } - $this->addLargeFileFileFromPath($method, $zeroHeader, $zip64); + $this->addLargeFileFileFromPath( + compressionMethod: $compressionMethod, + zeroHeader: $zeroHeader, + zip64: $zip64 + ); } } } @@ -336,33 +243,27 @@ class ZipStreamTest extends TestCase public function testAddFileFromStream(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); // In this test we can't use temporary stream to feed data // because zlib.deflate filter gives empty string before PHP 7 // it works fine with file stream $streamExample = fopen(__FILE__, 'rb'); $zip->addFileFromStream('sample.txt', $streamExample); -// fclose($streamExample); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); + fclose($streamExample); $streamExample2 = fopen('php://temp', 'wb+'); fwrite($streamExample2, 'More Simple Sample Data'); rewind($streamExample2); // move the pointer back to the beginning of file. - $zip->addFileFromStream('test/sample.txt', $streamExample2, $fileOptions); -// fclose($streamExample2); + $zip->addFileFromStream('test/sample.txt', $streamExample2); //, $fileOptions); + fclose($streamExample2); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files); @@ -371,92 +272,412 @@ class ZipStreamTest extends TestCase $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); } + public function testAddFileFromStreamUnreadableInput(): void + { + $this->expectException(StreamNotReadableException::class); + + [$tmpInput] = $this->getTmpFileStream(); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); + + $streamUnreadable = fopen($tmpInput, 'w'); + + $zip->addFileFromStream('sample.json', $streamUnreadable); + } + + public function testAddFileFromStreamBrokenOutputWrite(): void + { + $this->expectException(ResourceActionException::class); + + $outputStream = FaultInjectionResource::getResource(['stream_write']); + + $zip = new ZipStream( + outputStream: $outputStream, + sendHttpHeaders: false, + ); + + $zip->addFile('sample.txt', 'foobar'); + } + + public function testAddFileFromStreamBrokenInputRewind(): void + { + $this->expectException(ResourceActionException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + defaultEnableZeroHeader: false, + ); + + $fileStream = FaultInjectionResource::getResource(['stream_seek']); + + $zip->addFileFromStream('sample.txt', $fileStream, maxSize: 0); + } + + public function testAddFileFromStreamUnseekableInputWithoutZeroHeader(): void + { + $this->expectException(StreamNotSeekableException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + defaultEnableZeroHeader: false, + ); + + foreach (['cat', 'more'] as $cmd) { + $streamUnseekable = @popen($cmd, 'w'); + if ($streamUnseekable !== false) { + break; + } + } + + if ($streamUnseekable === false) { + $this->markTestSkipped('Needs file /dev/null'); + } + + $zip->addFileFromStream('sample.txt', $streamUnseekable, maxSize: 2); + } + + public function testAddFileFromStreamUnseekableInputWithZeroHeader(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + defaultEnableZeroHeader: true, + defaultCompressionMethod: CompressionMethod::STORE, + ); + + $streamUnseekable = StreamWrapper::getResource(new class ('test') extends EndlessCycleStream { + public function isSeekable(): bool + { + return false; + } + + public function seek(int $offset, int $whence = SEEK_SET): void + { + throw new RuntimeException('Not seekable'); + } + }); + + $zip->addFileFromStream('sample.txt', $streamUnseekable, maxSize: 7); + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir); + $this->assertSame(['sample.txt'], $files); + + $this->assertSame(filesize($tmpDir . '/sample.txt'), 7); + } + public function testAddFileFromStreamWithStorageMethod(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $streamExample = fopen('php://temp', 'wb+'); fwrite($streamExample, 'Sample String Data'); rewind($streamExample); // move the pointer back to the beginning of file. - $zip->addFileFromStream('sample.txt', $streamExample, $fileOptions); -// fclose($streamExample); + $zip->addFileFromStream('sample.txt', $streamExample, compressionMethod: CompressionMethod::STORE); + fclose($streamExample); $streamExample2 = fopen('php://temp', 'bw+'); fwrite($streamExample2, 'More Simple Sample Data'); rewind($streamExample2); // move the pointer back to the beginning of file. - $zip->addFileFromStream('test/sample.txt', $streamExample2); -// fclose($streamExample2); + $zip->addFileFromStream('test/sample.txt', $streamExample2, compressionMethod: CompressionMethod::DEFLATE); + fclose($streamExample2); $zip->finish(); - fclose($stream); - $zipArch = new ZipArchive(); - $zipArch->open($tmp); + $zipArchive = new ZipArchive(); + $zipArchive->open($this->tempfile); - $sample1 = $zipArch->statName('sample.txt'); - $this->assertSame(Method::STORE, $sample1['comp_method']); + $sample1 = $zipArchive->statName('sample.txt'); + $this->assertSame(CompressionMethod::STORE->value, $sample1['comp_method']); - $sample2 = $zipArch->statName('test/sample.txt'); - $this->assertSame(Method::DEFLATE, $sample2['comp_method']); + $sample2 = $zipArchive->statName('test/sample.txt'); + $this->assertSame(CompressionMethod::DEFLATE->value, $sample2['comp_method']); - $zipArch->close(); + $zipArchive->close(); } public function testAddFileFromPsr7Stream(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $body = 'Sample String Data'; $response = new Response(200, [], $body); - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions); + $zip->addFileFromPsr7Stream('sample.json', $response->getBody()); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.json'], $files); $this->assertStringEqualsFile($tmpDir . '/sample.json', $body); } + #[Group('slow')] + public function testAddLargeFileFromPsr7Stream(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: true, + ); + + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: new EndlessCycleStream('0'), + maxSize: 0x100000000, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir); + $this->assertSame(['sample.json'], $files); + $this->assertFileIsReadable($tmpDir . '/sample.json'); + $this->assertStringStartsWith('000000', file_get_contents(filename: $tmpDir . '/sample.json', length: 20)); + } + + public function testContinueFinishedZip(): void + { + $this->expectException(RuntimeException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); + $zip->finish(); + + $zip->addFile('sample.txt', '1234'); + } + + #[Group('slow')] + public function testManyFilesWithoutZip64(): void + { + $this->expectException(OverflowException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: false, + ); + + for ($i = 0; $i <= 0xFFFF; $i++) { + $zip->addFile('sample' . $i, ''); + } + + $zip->finish(); + } + + #[Group('slow')] + public function testManyFilesWithZip64(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: true, + ); + + for ($i = 0; $i <= 0xFFFF; $i++) { + $zip->addFile('sample' . $i, ''); + } + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir); + + $this->assertSame(count($files), 0x10000); + } + + #[Group('slow')] + public function testLongZipWithout64(): void + { + $this->expectException(OverflowException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: false, + defaultCompressionMethod: CompressionMethod::STORE, + ); + + for ($i = 0; $i < 4; $i++) { + $zip->addFileFromPsr7Stream( + fileName: 'sample' . $i, + stream: new EndlessCycleStream('0'), + maxSize: 0xFFFFFFFF, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + } + } + + #[Group('slow')] + public function testLongZipWith64(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: true, + defaultCompressionMethod: CompressionMethod::STORE, + ); + + for ($i = 0; $i < 4; $i++) { + $zip->addFileFromPsr7Stream( + fileName: 'sample' . $i, + stream: new EndlessCycleStream('0'), + maxSize: 0x5FFFFFFF, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + } + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir); + $this->assertSame(['sample0', 'sample1', 'sample2', 'sample3'], $files); + } + + #[Group('slow')] + public function testAddLargeFileWithoutZip64WithZeroHeader(): void + { + $this->expectException(OverflowException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: false, + defaultEnableZeroHeader: true, + ); + + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: new EndlessCycleStream('0'), + maxSize: 0x100000000, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + } + + #[Group('slow')] + public function testAddsZip64HeaderWhenNeeded(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: true, + defaultEnableZeroHeader: false, + ); + + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: new EndlessCycleStream('0'), + maxSize: 0x100000000, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + $files = $this->getRecursiveFileList($tmpDir); + + $this->assertSame(['sample.json'], $files); + $this->assertFileContains($this->tempfile, PackField::pack( + new PackField(format: 'V', value: 0x06064b50) + )); + } + + #[Group('slow')] + public function testDoesNotAddZip64HeaderWhenNotNeeded(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: true, + defaultEnableZeroHeader: false, + ); + + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: new EndlessCycleStream('0'), + maxSize: 0x10, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + $files = $this->getRecursiveFileList($tmpDir); + + $this->assertSame(['sample.json'], $files); + $this->assertFileDoesNotContain($this->tempfile, PackField::pack( + new PackField(format: 'V', value: 0x06064b50) + )); + } + + #[Group('slow')] + public function testAddLargeFileWithoutZip64WithoutZeroHeader(): void + { + $this->expectException(OverflowException::class); + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + enableZip64: false, + defaultEnableZeroHeader: false, + ); + + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: new EndlessCycleStream('0'), + maxSize: 0x100000000, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + } + public function testAddFileFromPsr7StreamWithOutputToPsr7Stream(): void { - [$tmp, $resource] = $this->getTmpFileStream(); - $psr7OutputStream = new Stream($resource); + $psr7OutputStream = new ResourceStream($this->tempfileStream); - $options = new ArchiveOptions(); - $options->setOutputStream($psr7OutputStream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $psr7OutputStream, + sendHttpHeaders: false, + ); $body = 'Sample String Data'; $response = new Response(200, [], $body); - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions); + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: $response->getBody(), + compressionMethod: CompressionMethod::STORE, + ); $zip->finish(); $psr7OutputStream->close(); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.json'], $files); @@ -465,12 +686,10 @@ class ZipStreamTest extends TestCase public function testAddFileFromPsr7StreamWithFileSizeSet(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); $body = 'Sample String Data'; $fileSize = strlen($body); @@ -478,37 +697,63 @@ class ZipStreamTest extends TestCase $fakePadding = "\0\0\0\0\0\0"; $response = new Response(200, [], $body . $fakePadding); - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - $fileOptions->setSize($fileSize); - $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions); + $zip->addFileFromPsr7Stream( + fileName: 'sample.json', + stream: $response->getBody(), + compressionMethod: CompressionMethod::STORE, + maxSize: $fileSize + ); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.json'], $files); $this->assertStringEqualsFile($tmpDir . '/sample.json', $body); } + public function testCreateArchiveHeaders(): void + { + $headers = []; + + $httpHeaderCallback = function (string $header) use (&$headers) { + $headers[] = $header; + }; + + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: true, + outputName: 'example.zip', + httpHeaderCallback: $httpHeaderCallback, + ); + + $zip->addFile( + fileName: 'sample.json', + data: 'foo', + ); + $zip->finish(); + + $this->assertContains('Content-Type: application/x-zip', $headers); + $this->assertContains("Content-Disposition: attachment; filename*=UTF-8''example.zip", $headers); + $this->assertContains('Pragma: public', $headers); + $this->assertContains('Cache-Control: public, must-revalidate', $headers); + $this->assertContains('Content-Transfer-Encoding: binary', $headers); + } + public function testCreateArchiveWithFlushOptionSet(): void { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setFlushOutput(true); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + flushOutput: true, + sendHttpHeaders: false, + ); $zip->addFile('sample.txt', 'Sample String Data'); $zip->addFile('test/sample.txt', 'More Simple Sample Data'); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files); @@ -523,111 +768,433 @@ class ZipStreamTest extends TestCase ob_end_flush(); $this->assertSame(0, ob_get_level()); - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setFlushOutput(true); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + flushOutput: true, + sendHttpHeaders: false, + ); $zip->addFile('sample.txt', 'Sample String Data'); $zip->finish(); - fclose($stream); - $tmpDir = $this->validateAndExtractZip($tmp); + $tmpDir = $this->validateAndExtractZip($this->tempfile); $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); // WORKAROUND (2/2): add back output buffering so that PHPUnit doesn't complain that it is missing ob_start(); } - /** - * @return array - */ - protected function getTmpFileStream(): array + public function testAddEmptyDirectory(): void { - $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); - $stream = fopen($tmp, 'wb+'); + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + ); - return [$tmp, $stream]; + $zip->addDirectory('foo'); + + $zip->finish(); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir, includeDirectories: true); + + $this->assertContains('foo', $files); + + $this->assertFileExists($tmpDir . DIRECTORY_SEPARATOR . 'foo'); + $this->assertDirectoryExists($tmpDir . DIRECTORY_SEPARATOR . 'foo'); } - /** - * @param string $tmp - * @return string - */ - protected function validateAndExtractZip($tmp): string + public function testAddFileSimulate(): void { - $tmpDir = $this->getTmpDir(); + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultEnableZeroHeader: true, + outputStream: $this->tempfileStream, + ); - $zipArch = new ZipArchive(); - $res = $zipArch->open($tmp); + $zip->addFile('sample.txt', 'Sample String Data'); + $zip->addFile('test/sample.txt', 'More Simple Sample Data'); - if ($res !== true) { - $this->fail("Failed to open {$tmp}. Code: $res"); + return $zip->finish(); + }; - return $tmpDir; - } - $this->assertSame(0, $zipArch->status); - $this->assertSame(0, $zipArch->statusSys); + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); - $zipArch->extractTo($tmpDir); - $zipArch->close(); - - return $tmpDir; + $this->assertEquals($sizeExpected, $sizeActual); } - protected function getTmpDir(): string + public function testAddFileSimulateWithMaxSize(): void { - $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); - unlink($tmp); - mkdir($tmp) or $this->fail('Failed to make directory'); + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: true, + outputStream: $this->tempfileStream, + ); - return $tmp; + $zip->addFile('sample.txt', 'Sample String Data', maxSize: 0); + + return $zip->finish(); + }; + + + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); + + $this->assertEquals($sizeExpected, $sizeActual); } - /** - * @param string $path - * @return string[] - */ - protected function getRecursiveFileList(string $path): array + public function testAddFileSimulateWithFstat(): void { - $data = []; - $path = (string)realpath($path); - $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: true, + outputStream: $this->tempfileStream, + ); - $pathLen = strlen($path); - foreach ($files as $file) { - $filePath = $file->getRealPath(); - if (!is_dir($filePath)) { - $data[] = substr($filePath, $pathLen + 1); + $zip->addFile('sample.txt', 'Sample String Data'); + $zip->addFile('test/sample.txt', 'More Simple Sample Data'); + + return $zip->finish(); + }; + + + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); + + $this->assertEquals($sizeExpected, $sizeActual); + } + + public function testAddFileSimulateWithExactSizeZero(): void + { + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: true, + outputStream: $this->tempfileStream, + ); + + $zip->addFile('sample.txt', 'Sample String Data', exactSize: 18); + + return $zip->finish(); + }; + + + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); + + $this->assertEquals($sizeExpected, $sizeActual); + } + + public function testAddFileSimulateWithExactSizeInitial(): void + { + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: false, + outputStream: $this->tempfileStream, + ); + + $zip->addFile('sample.txt', 'Sample String Data', exactSize: 18); + + return $zip->finish(); + }; + + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); + + $this->assertEquals($sizeExpected, $sizeActual); + } + + public function testAddFileSimulateWithZeroSizeInFstat(): void + { + $create = function (OperationMode $operationMode): int { + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: $operationMode, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: false, + outputStream: $this->tempfileStream, + ); + + $zip->addFileFromPsr7Stream('sample.txt', new class implements StreamInterface { + public $pos = 0; + + public function __toString(): string + { + return 'test'; + } + + public function close(): void {} + + public function detach() {} + + public function getSize(): ?int + { + return null; + } + + public function tell(): int + { + return $this->pos; + } + + public function eof(): bool + { + return $this->pos >= 4; + } + + public function isSeekable(): bool + { + return true; + } + + public function seek(int $offset, int $whence = SEEK_SET): void + { + $this->pos = $offset; + } + + public function rewind(): void + { + $this->pos = 0; + } + + public function isWritable(): bool + { + return false; + } + + public function write(string $string): int + { + return 0; + } + + public function isReadable(): bool + { + return true; + } + + public function read(int $length): string + { + $data = substr('test', $this->pos, $length); + $this->pos += strlen($data); + return $data; + } + + public function getContents(): string + { + return $this->read(4); + } + + public function getMetadata(?string $key = null) + { + return $key !== null ? null : []; + } + }); + + return $zip->finish(); + }; + + $sizeExpected = $create(OperationMode::NORMAL); + $sizeActual = $create(OperationMode::SIMULATE_LAX); + + + $this->assertEquals($sizeExpected, $sizeActual); + } + + public function testAddFileSimulateWithWrongExactSize(): void + { + $this->expectException(FileSizeIncorrectException::class); + + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: OperationMode::SIMULATE_LAX, + ); + + $zip->addFile('sample.txt', 'Sample String Data', exactSize: 1000); + } + + public function testAddFileSimulateStrictZero(): void + { + $this->expectException(SimulationFileUnknownException::class); + + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: OperationMode::SIMULATE_STRICT, + defaultEnableZeroHeader: true + ); + + $zip->addFile('sample.txt', 'Sample String Data'); + } + + public function testAddFileSimulateStrictInitial(): void + { + $this->expectException(SimulationFileUnknownException::class); + + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: OperationMode::SIMULATE_STRICT, + defaultEnableZeroHeader: false + ); + + $zip->addFile('sample.txt', 'Sample String Data'); + } + + public function testAddFileCallbackStrict(): void + { + $this->expectException(SimulationFileUnknownException::class); + + $zip = new ZipStream( + sendHttpHeaders: false, + operationMode: OperationMode::SIMULATE_STRICT, + defaultEnableZeroHeader: false + ); + + $zip->addFileFromCallback('sample.txt', callback: function () { + return ''; + }); + } + + public function testAddFileCallbackLax(): void + { + $zip = new ZipStream( + operationMode: OperationMode::SIMULATE_LAX, + defaultEnableZeroHeader: false, + sendHttpHeaders: false, + ); + + $zip->addFileFromCallback('sample.txt', callback: function () { + return 'Sample String Data'; + }); + + $size = $zip->finish(); + + $this->assertEquals($size, 142); + } + + public function testExecuteSimulation(): void + { + $zip = new ZipStream( + operationMode: OperationMode::SIMULATE_STRICT, + defaultCompressionMethod: CompressionMethod::STORE, + defaultEnableZeroHeader: false, + sendHttpHeaders: false, + outputStream: $this->tempfileStream, + ); + + $zip->addFileFromCallback( + 'sample.txt', + exactSize: 18, + callback: function () { + return 'Sample String Data'; } - } + ); - sort($data); + $zip->addFileFromCallback( + '.gitkeep', + exactSize: 0, + callback: function () { + return ''; + } + ); - return $data; + $size = $zip->finish(); + + $this->assertEquals(filesize($this->tempfile), 0); + + $zip->executeSimulation(); + + clearstatcache(); + + $this->assertEquals(filesize($this->tempfile), $size); + + $tmpDir = $this->validateAndExtractZip($this->tempfile); + + $files = $this->getRecursiveFileList($tmpDir); + $this->assertSame(['.gitkeep', 'sample.txt'], $files); } - protected function addLargeFileFileFromPath($method, $zeroHeader, $zip64): void + public function testExecuteSimulationBeforeFinish(): void + { + $this->expectException(RuntimeException::class); + + $zip = new ZipStream( + operationMode: OperationMode::SIMULATE_LAX, + defaultEnableZeroHeader: false, + sendHttpHeaders: false, + outputStream: $this->tempfileStream, + ); + + $zip->executeSimulation(); + } + + #[Group('slow')] + public function testSimulationWithLargeZip64AndZeroHeader(): void + { + $zip = new ZipStream( + outputStream: $this->tempfileStream, + sendHttpHeaders: false, + operationMode: OperationMode::SIMULATE_STRICT, + defaultCompressionMethod: CompressionMethod::STORE, + outputName: 'archive.zip', + enableZip64: true, + defaultEnableZeroHeader: true + ); + + $zip->addFileFromPsr7Stream( + fileName: 'large', + stream: new EndlessCycleStream('large'), + exactSize: 0x120000000, // ~5gb + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + + $zip->addFileFromPsr7Stream( + fileName: 'small', + stream: new EndlessCycleStream('small'), + exactSize: 0x20, + compressionMethod: CompressionMethod::STORE, + lastModificationDateTime: new DateTimeImmutable('2022-01-01 01:01:01Z'), + ); + + $forecastedSize = $zip->finish(); + + $zip->executeSimulation(); + + $this->assertSame($forecastedSize, filesize($this->tempfile)); + + $this->validateAndExtractZip($this->tempfile); + } + + private function addLargeFileFileFromPath(CompressionMethod $compressionMethod, $zeroHeader, $zip64): void { [$tmp, $stream] = $this->getTmpFileStream(); - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setLargeFileMethod($method); - $options->setLargeFileSize(5); - $options->setZeroHeader($zeroHeader); - $options->setEnableZip64($zip64); - - $zip = new ZipStream(null, $options); + $zip = new ZipStream( + outputStream: $stream, + sendHttpHeaders: false, + defaultEnableZeroHeader: $zeroHeader, + enableZip64: $zip64, + ); [$tmpExample, $streamExample] = $this->getTmpFileStream(); for ($i = 0; $i <= 10000; $i++) { - fwrite($streamExample, sha1((string)$i)); + fwrite($streamExample, sha1((string) $i)); if ($i % 100 === 0) { fwrite($streamExample, "\n"); } @@ -645,6 +1212,8 @@ class ZipStreamTest extends TestCase $files = $this->getRecursiveFileList($tmpDir); $this->assertSame(['sample.txt'], $files); - $this->assertSame(sha1_file($tmpDir . '/sample.txt'), $shaExample, "SHA-1 Mismatch Method: {$method}"); + $this->assertSame(sha1_file($tmpDir . '/sample.txt'), $shaExample, "SHA-1 Mismatch Method: {$compressionMethod->value}"); + + unlink($tmp); } } diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zs/ExtendedInformationExtraFieldTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zs/ExtendedInformationExtraFieldTest.php new file mode 100644 index 0000000..36153a7 --- /dev/null +++ b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/Zs/ExtendedInformationExtraFieldTest.php @@ -0,0 +1,22 @@ +assertSame( + bin2hex((string) $extraField), + '5356' // 2 bytes; Tag for this "extra" block type + . '0000' // 2 bytes; TODO: Document + ); + } +} diff --git a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php b/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php deleted file mode 100644 index 05de4fe..0000000 --- a/xunifriend_RaeeC/vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php +++ /dev/null @@ -1,40 +0,0 @@ -setOutputStream(fopen('php://memory', 'wb')); - $fileOpt->setTime(clone $expectedTime); - - $zip = new ZipStream(null, $archiveOpt); - - $zip->addFile('sample.txt', 'Sample', $fileOpt); - - $zip->finish(); - - $this->assertEquals($expectedTime, $fileOpt->getTime()); - } -} diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/CHANGELOG.md b/xunifriend_RaeeC/vendor/monolog/monolog/CHANGELOG.md index 122d85c..4ecd1e0 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/CHANGELOG.md +++ b/xunifriend_RaeeC/vendor/monolog/monolog/CHANGELOG.md @@ -1,3 +1,10 @@ +### 2.11.0 (2026-01-01) + + * Added support for mongodb/mongodb 2.0+ + * Fixed deprecation warnings in PHP 8.4/8.5 + * Fixed TelegramBotHandler sending empty messages (#1992) + * Fixed RotatingFileHandler unlink errors not being suppressed correctly (#1999) + ### 2.10.0 (2024-11-12) * Added `$fileOpenMode` to `StreamHandler` to define a custom fopen mode to open the log file (#1913) diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/composer.json b/xunifriend_RaeeC/vendor/monolog/monolog/composer.json index a1f08a2..d96c94c 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/composer.json +++ b/xunifriend_RaeeC/vendor/monolog/monolog/composer.json @@ -24,7 +24,7 @@ "graylog2/gelf-php": "^1.4.2 || ^2@dev", "guzzlehttp/guzzle": "^7.4", "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", + "mongodb/mongodb": "^1.8 || ^2.0", "php-amqplib/php-amqplib": "~2.4 || ^3", "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^1.10", diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/ErrorHandler.php index 1406d34..0742490 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/ErrorHandler.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -168,7 +168,7 @@ class ErrorHandler E_USER_ERROR => LogLevel::ERROR, E_USER_WARNING => LogLevel::WARNING, E_USER_NOTICE => LogLevel::NOTICE, - E_STRICT => LogLevel::NOTICE, + 2048 => LogLevel::NOTICE, // E_STRICT E_RECOVERABLE_ERROR => LogLevel::ERROR, E_DEPRECATED => LogLevel::NOTICE, E_USER_DEPRECATED => LogLevel::NOTICE, @@ -292,7 +292,7 @@ class ErrorHandler return 'E_USER_WARNING'; case E_USER_NOTICE: return 'E_USER_NOTICE'; - case E_STRICT: + case 2048: return 'E_STRICT'; case E_RECOVERABLE_ERROR: return 'E_RECOVERABLE_ERROR'; diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php index fca69a8..e66d8fb 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -26,8 +26,6 @@ class MongoDBFormatter implements FormatterInterface private $exceptionTraceAsString; /** @var int */ private $maxNestingLevel; - /** @var bool */ - private $isLegacyMongoExt; /** * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 @@ -37,8 +35,6 @@ class MongoDBFormatter implements FormatterInterface { $this->maxNestingLevel = max($maxNestingLevel, 0); $this->exceptionTraceAsString = $exceptionTraceAsString; - - $this->isLegacyMongoExt = extension_loaded('mongodb') && version_compare((string) phpversion('mongodb'), '1.1.9', '<='); } /** @@ -128,35 +124,7 @@ class MongoDBFormatter implements FormatterInterface } protected function formatDate(\DateTimeInterface $value, int $nestingLevel): UTCDateTime - { - if ($this->isLegacyMongoExt) { - return $this->legacyGetMongoDbDateTime($value); - } - - return $this->getMongoDbDateTime($value); - } - - private function getMongoDbDateTime(\DateTimeInterface $value): UTCDateTime { return new UTCDateTime((int) floor(((float) $value->format('U.u')) * 1000)); } - - /** - * This is needed to support MongoDB Driver v1.19 and below - * - * See https://github.com/mongodb/mongo-php-driver/issues/426 - * - * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted - */ - private function legacyGetMongoDbDateTime(\DateTimeInterface $value): UTCDateTime - { - $milliseconds = floor(((float) $value->format('U.u')) * 1000); - - $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS? - ? (int) $milliseconds - : (string) $milliseconds; - - // @phpstan-ignore-next-line - return new UTCDateTime($milliseconds); - } } diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php index 7213e8e..58f6338 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php @@ -49,7 +49,7 @@ final class Util if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { $curlError = curl_error($ch); - if ($closeAfterDone) { + if (\PHP_VERSION_ID < 80000 && $closeAfterDone) { curl_close($ch); } @@ -59,7 +59,7 @@ final class Util continue; } - if ($closeAfterDone) { + if (\PHP_VERSION_ID < 80000 && $closeAfterDone) { curl_close($ch); } diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php index 3063091..150efee 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php @@ -11,12 +11,13 @@ namespace Monolog\Handler; +use MongoDB\Client; +use MongoDB\Collection; use MongoDB\Driver\BulkWrite; use MongoDB\Driver\Manager; -use MongoDB\Client; -use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\MongoDBFormatter; +use Monolog\Logger; /** * Logs to a MongoDB database. @@ -33,12 +34,12 @@ use Monolog\Formatter\MongoDBFormatter; */ class MongoDBHandler extends AbstractProcessingHandler { - /** @var \MongoDB\Collection */ + /** @var Collection */ private $collection; /** @var Client|Manager */ private $manager; - /** @var string */ - private $namespace; + /** @var string|null */ + private $namespace = null; /** * Constructor. @@ -54,7 +55,7 @@ class MongoDBHandler extends AbstractProcessingHandler } if ($mongodb instanceof Client) { - $this->collection = $mongodb->selectCollection($database, $collection); + $this->collection = method_exists($mongodb, 'getCollection') ? $mongodb->getCollection($database, $collection) : $mongodb->selectCollection($database, $collection); } else { $this->manager = $mongodb; $this->namespace = $database . '.' . $collection; diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php index 2d0c1a7..172685e 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -167,7 +167,7 @@ class RotatingFileHandler extends StreamHandler // suppress errors here as unlink() might fail if two processes // are cleaning up/rotating at the same time set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool { - return false; + return true; }); unlink($file); restore_error_handler(); diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php index a6223b7..0b1ac71 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php @@ -233,6 +233,10 @@ class TelegramBotHandler extends AbstractProcessingHandler protected function sendCurl(string $message): void { + if ('' === trim($message)) { + return; + } + $ch = curl_init(); $url = self::BOT_API . $this->apiKey . '/SendMessage'; curl_setopt($ch, CURLOPT_URL, $url); diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php index 8166bdc..6f61859 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php @@ -64,7 +64,7 @@ class GitProcessor implements ProcessorInterface return self::$cache; } - $branches = `git branch -v --no-abbrev`; + $branches = shell_exec('git branch -v --no-abbrev'); if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { return self::$cache = [ 'branch' => $matches[1], diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php index d4a628f..239e4c8 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -63,7 +63,7 @@ class MercurialProcessor implements ProcessorInterface return self::$cache; } - $result = explode(' ', trim(`hg id -nb`)); + $result = explode(' ', trim((string) shell_exec('hg id -nb'))); if (count($result) >= 3) { return self::$cache = [ diff --git a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/SignalHandler.php index d730eea..2c88b73 100644 --- a/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/SignalHandler.php +++ b/xunifriend_RaeeC/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -80,6 +80,7 @@ class SignalHandler */ public function handleSignal(int $signo, $siginfo = null): void { + /** @var array $signals */ static $signals = []; if (!$signals && extension_loaded('pcntl')) { diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/LICENSE b/xunifriend_RaeeC/vendor/myclabs/php-enum/LICENSE deleted file mode 100644 index 2a8cf22..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 My C-Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/README.md b/xunifriend_RaeeC/vendor/myclabs/php-enum/README.md deleted file mode 100644 index 681d55e..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/README.md +++ /dev/null @@ -1,194 +0,0 @@ -# PHP Enum implementation inspired from SplEnum - -[![GitHub Actions][GA Image]][GA Link] -[![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum) -[![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum) -[![Psalm Shepherd][Shepherd Image]][Shepherd Link] - -Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme). - -## Why? - -First, and mainly, `SplEnum` is not integrated to PHP, you have to install the extension separately. - -Using an enum instead of class constants provides the following advantages: - -- You can use an enum as a parameter type: `function setAction(Action $action) {` -- You can use an enum as a return type: `function getAction() : Action {` -- You can enrich the enum with methods (e.g. `format`, `parse`, …) -- You can extend the enum to add new values (make your enum `final` to prevent it) -- You can get a list of all the possible values (see below) - -This Enum class is not intended to replace class constants, but only to be used when it makes sense. - -## Installation - -``` -composer require myclabs/php-enum -``` - -## Declaration - -```php -use MyCLabs\Enum\Enum; - -/** - * Action enum - */ -final class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} -``` - -## Usage - -```php -$action = Action::VIEW(); - -// or with a dynamic key: -$action = Action::$key(); -// or with a dynamic value: -$action = Action::from($value); -// or -$action = new Action($value); -``` - -As you can see, static methods are automatically implemented to provide quick access to an enum value. - -One advantage over using class constants is to be able to use an enum as a parameter type: - -```php -function setAction(Action $action) { - // ... -} -``` - -## Documentation - -- `__construct()` The constructor checks that the value exist in the enum -- `__toString()` You can `echo $myValue`, it will display the enum value (value of the constant) -- `getValue()` Returns the current value of the enum -- `getKey()` Returns the key of the current value on Enum -- `equals()` Tests whether enum instances are equal (returns `true` if enum values are equal, `false` otherwise) - -Static methods: - -- `from()` Creates an Enum instance, checking that the value exist in the enum -- `toArray()` method Returns all possible values as an array (constant name in key, constant value in value) -- `keys()` Returns the names (keys) of all constants in the Enum class -- `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value) -- `isValid()` Check if tested value is valid on enum set -- `isValidKey()` Check if tested key is valid on enum set -- `assertValidValue()` Assert the value is valid on enum set, throwing exception otherwise -- `search()` Return key for searched value - -### Static methods - -```php -final class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} - -// Static method: -$action = Action::VIEW(); -$action = Action::EDIT(); -``` - -Static method helpers are implemented using [`__callStatic()`](http://www.php.net/manual/en/language.oop5.overloading.php#object.callstatic). - -If you care about IDE autocompletion, you can either implement the static methods yourself: - -```php -final class Action extends Enum -{ - private const VIEW = 'view'; - - /** - * @return Action - */ - public static function VIEW() { - return new Action(self::VIEW); - } -} -``` - -or you can use phpdoc (this is supported in PhpStorm for example): - -```php -/** - * @method static Action VIEW() - * @method static Action EDIT() - */ -final class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} -``` - -## Native enums and migration -Native enum arrived to PHP in version 8.1: https://www.php.net/enumerations -If your project is running PHP 8.1+ or your library has it as a minimum requirement you should use it instead of this library. - -When migrating from `myclabs/php-enum`, the effort should be small if the usage was in the recommended way: -- private constants -- final classes -- no method overridden - -Changes for migration: -- Class definition should be changed from -```php -/** - * @method static Action VIEW() - * @method static Action EDIT() - */ -final class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} -``` - to -```php -enum Action: string -{ - case VIEW = 'view'; - case EDIT = 'edit'; -} -``` -All places where the class was used as a type will continue to work. - -Usages and the change needed: - -| Operation | myclabs/php-enum | native enum | -|----------------------------------------------------------------|----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Obtain an instance will change from | `$enumCase = Action::VIEW()` | `$enumCase = Action::VIEW` | -| Create an enum from a backed value | `$enumCase = new Action('view')` | `$enumCase = Action::from('view')` | -| Get the backed value of the enum instance | `$enumCase->getValue()` | `$enumCase->value` | -| Compare two enum instances | `$enumCase1 == $enumCase2`
or
`$enumCase1->equals($enumCase2)` | `$enumCase1 === $enumCase2` | -| Get the key/name of the enum instance | `$enumCase->getKey()` | `$enumCase->name` | -| Get a list of all the possible instances of the enum | `Action::values()` | `Action::cases()` | -| Get a map of possible instances of the enum mapped by name | `Action::values()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases())`
or
`(new ReflectionEnum(Action::class))->getConstants()` | -| Get a list of all possible names of the enum | `Action::keys()` | `array_map(fn($case) => $case->name, Action::cases())` | -| Get a list of all possible backed values of the enum | `Action::toArray()` | `array_map(fn($case) => $case->value, Action::cases())` | -| Get a map of possible backed values of the enum mapped by name | `Action::toArray()` | `array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases()))`
or
`array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants()))` | - -## Related projects - -- [PHP 8.1+ native enum](https://www.php.net/enumerations) -- [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type) -- [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter) -- [PHPStan integration](https://github.com/timeweb/phpstan-enum) - - -[GA Image]: https://github.com/myclabs/php-enum/workflows/CI/badge.svg - -[GA Link]: https://github.com/myclabs/php-enum/actions?query=workflow%3A%22CI%22+branch%3Amaster - -[Shepherd Image]: https://shepherd.dev/github/myclabs/php-enum/coverage.svg - -[Shepherd Link]: https://shepherd.dev/github/myclabs/php-enum diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/SECURITY.md b/xunifriend_RaeeC/vendor/myclabs/php-enum/SECURITY.md deleted file mode 100644 index 84fd4e3..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/SECURITY.md +++ /dev/null @@ -1,11 +0,0 @@ -# Security Policy - -## Supported Versions - -Only the latest stable release is supported. - -## Reporting a Vulnerability - -To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). - -Tidelift will coordinate the fix and disclosure. diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/composer.json b/xunifriend_RaeeC/vendor/myclabs/php-enum/composer.json deleted file mode 100644 index 978cb19..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/composer.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "myclabs/php-enum", - "type": "library", - "description": "PHP Enum implementation", - "keywords": ["enum"], - "homepage": "http://github.com/myclabs/php-enum", - "license": "MIT", - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - }, - "classmap": [ - "stubs/Stringable.php" - ] - }, - "autoload-dev": { - "psr-4": { - "MyCLabs\\Tests\\Enum\\": "tests/" - } - }, - "require": { - "php": "^7.3 || ^8.0", - "ext-json": "*" - }, - "require-dev": { - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.6.2" - } -} diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/src/Enum.php b/xunifriend_RaeeC/vendor/myclabs/php-enum/src/Enum.php deleted file mode 100644 index 4c94cf6..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/src/Enum.php +++ /dev/null @@ -1,318 +0,0 @@ - - * @author Daniel Costa - * @author Mirosław Filip - * - * @psalm-template T - * @psalm-immutable - * @psalm-consistent-constructor - */ -abstract class Enum implements \JsonSerializable, \Stringable -{ - /** - * Enum value - * - * @var mixed - * @psalm-var T - */ - protected $value; - - /** - * Enum key, the constant name - * - * @var string - */ - private $key; - - /** - * Store existing constants in a static cache per object. - * - * - * @var array - * @psalm-var array> - */ - protected static $cache = []; - - /** - * Cache of instances of the Enum class - * - * @var array - * @psalm-var array> - */ - protected static $instances = []; - - /** - * Creates a new value of some type - * - * @psalm-pure - * @param mixed $value - * - * @psalm-param T $value - * @throws \UnexpectedValueException if incompatible type is given. - */ - public function __construct($value) - { - if ($value instanceof static) { - /** @psalm-var T */ - $value = $value->getValue(); - } - - /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */ - $this->key = static::assertValidValueReturningKey($value); - - /** @psalm-var T */ - $this->value = $value; - } - - /** - * This method exists only for the compatibility reason when deserializing a previously serialized version - * that didn't had the key property - */ - public function __wakeup() - { - /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */ - if ($this->key === null) { - /** - * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm - * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed - */ - $this->key = static::search($this->value); - } - } - - /** - * @param mixed $value - * @return static - */ - public static function from($value): self - { - $key = static::assertValidValueReturningKey($value); - - return self::__callStatic($key, []); - } - - /** - * @psalm-pure - * @return mixed - * @psalm-return T - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns the enum key (i.e. the constant name). - * - * @psalm-pure - * @return string - */ - public function getKey() - { - return $this->key; - } - - /** - * @psalm-pure - * @psalm-suppress InvalidCast - * @return string - */ - public function __toString() - { - return (string)$this->value; - } - - /** - * Determines if Enum should be considered equal with the variable passed as a parameter. - * Returns false if an argument is an object of different class or not an object. - * - * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4 - * - * @psalm-pure - * @psalm-param mixed $variable - * @return bool - */ - final public function equals($variable = null): bool - { - return $variable instanceof self - && $this->getValue() === $variable->getValue() - && static::class === \get_class($variable); - } - - /** - * Returns the names (keys) of all constants in the Enum class - * - * @psalm-pure - * @psalm-return list - * @return array - */ - public static function keys() - { - return \array_keys(static::toArray()); - } - - /** - * Returns instances of the Enum class of all Enum constants - * - * @psalm-pure - * @psalm-return array - * @return static[] Constant name in key, Enum instance in value - */ - public static function values() - { - $values = array(); - - /** @psalm-var T $value */ - foreach (static::toArray() as $key => $value) { - $values[$key] = new static($value); - } - - return $values; - } - - /** - * Returns all possible values as an array - * - * @psalm-pure - * @psalm-suppress ImpureStaticProperty - * - * @psalm-return array - * @return array Constant name in key, constant value in value - */ - public static function toArray() - { - $class = static::class; - - if (!isset(static::$cache[$class])) { - /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ - $reflection = new \ReflectionClass($class); - /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */ - static::$cache[$class] = $reflection->getConstants(); - } - - return static::$cache[$class]; - } - - /** - * Check if is valid enum value - * - * @param $value - * @psalm-param mixed $value - * @psalm-pure - * @psalm-assert-if-true T $value - * @return bool - */ - public static function isValid($value) - { - return \in_array($value, static::toArray(), true); - } - - /** - * Asserts valid enum value - * - * @psalm-pure - * @psalm-assert T $value - * @param mixed $value - */ - public static function assertValidValue($value): void - { - self::assertValidValueReturningKey($value); - } - - /** - * Asserts valid enum value - * - * @psalm-pure - * @psalm-assert T $value - * @param mixed $value - * @return string - */ - private static function assertValidValueReturningKey($value): string - { - if (false === ($key = static::search($value))) { - throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class); - } - - return $key; - } - - /** - * Check if is valid enum key - * - * @param $key - * @psalm-param string $key - * @psalm-pure - * @return bool - */ - public static function isValidKey($key) - { - $array = static::toArray(); - - return isset($array[$key]) || \array_key_exists($key, $array); - } - - /** - * Return key for value - * - * @param mixed $value - * - * @psalm-param mixed $value - * @psalm-pure - * @return string|false - */ - public static function search($value) - { - return \array_search($value, static::toArray(), true); - } - - /** - * Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant - * - * @param string $name - * @param array $arguments - * - * @return static - * @throws \BadMethodCallException - * - * @psalm-pure - */ - public static function __callStatic($name, $arguments) - { - $class = static::class; - if (!isset(self::$instances[$class][$name])) { - $array = static::toArray(); - if (!isset($array[$name]) && !\array_key_exists($name, $array)) { - $message = "No static method or enum constant '$name' in class " . static::class; - throw new \BadMethodCallException($message); - } - return self::$instances[$class][$name] = new static($array[$name]); - } - return clone self::$instances[$class][$name]; - } - - /** - * Specify data which should be serialized to JSON. This method returns data that can be serialized by json_encode() - * natively. - * - * @return mixed - * @link http://php.net/manual/en/jsonserializable.jsonserialize.php - * @psalm-pure - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return $this->getValue(); - } -} diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php b/xunifriend_RaeeC/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php deleted file mode 100644 index 302bf80..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php +++ /dev/null @@ -1,54 +0,0 @@ -register(new \MyCLabs\Enum\PHPUnit\Comparator()); - */ -final class Comparator extends \SebastianBergmann\Comparator\Comparator -{ - public function accepts($expected, $actual) - { - return $expected instanceof Enum && ( - $actual instanceof Enum || $actual === null - ); - } - - /** - * @param Enum $expected - * @param Enum|null $actual - * - * @return void - */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) - { - if ($expected->equals($actual)) { - return; - } - - throw new ComparisonFailure( - $expected, - $actual, - $this->formatEnum($expected), - $this->formatEnum($actual), - false, - 'Failed asserting that two Enums are equal.' - ); - } - - private function formatEnum(Enum $enum = null) - { - if ($enum === null) { - return "null"; - } - - return get_class($enum)."::{$enum->getKey()}()"; - } -} diff --git a/xunifriend_RaeeC/vendor/myclabs/php-enum/stubs/Stringable.php b/xunifriend_RaeeC/vendor/myclabs/php-enum/stubs/Stringable.php deleted file mode 100644 index 4811af7..0000000 --- a/xunifriend_RaeeC/vendor/myclabs/php-enum/stubs/Stringable.php +++ /dev/null @@ -1,11 +0,0 @@ -=7.4.0 <8.5.0", + "php": "^7.4 || ^8.0", "ext-ctype": "*", "ext-dom": "*", "ext-fileinfo": "*", diff --git a/xunifriend_RaeeC/vendor/pimple/pimple/.github/workflows/tests.yml b/xunifriend_RaeeC/vendor/pimple/pimple/.github/workflows/tests.yml index 0255c77..6ff41af 100644 --- a/xunifriend_RaeeC/vendor/pimple/pimple/.github/workflows/tests.yml +++ b/xunifriend_RaeeC/vendor/pimple/pimple/.github/workflows/tests.yml @@ -12,6 +12,10 @@ jobs: fail-fast: false matrix: php: + - "7.2" + - "7.3" + - "7.4" + - "8.0" - "8.1" - "8.2" - "8.3" diff --git a/xunifriend_RaeeC/vendor/pimple/pimple/composer.json b/xunifriend_RaeeC/vendor/pimple/pimple/composer.json index 7e3923f..15ff22b 100644 --- a/xunifriend_RaeeC/vendor/pimple/pimple/composer.json +++ b/xunifriend_RaeeC/vendor/pimple/pimple/composer.json @@ -23,7 +23,7 @@ }, "extra": { "branch-alias": { - "dev-master": "3.4.x-dev" + "dev-master": "3.x-dev" } } } diff --git a/xunifriend_RaeeC/vendor/pimple/pimple/phpunit.xml.dist b/xunifriend_RaeeC/vendor/pimple/pimple/phpunit.xml.dist index 5c8d487..ab6b545 100644 --- a/xunifriend_RaeeC/vendor/pimple/pimple/phpunit.xml.dist +++ b/xunifriend_RaeeC/vendor/pimple/pimple/phpunit.xml.dist @@ -1,7 +1,7 @@ protected->attach($callable); + $this->protected->offsetSet($callable); return $callable; } @@ -268,8 +268,8 @@ class Container implements \ArrayAccess }; if (isset($this->factories[$factory])) { - $this->factories->detach($factory); - $this->factories->attach($extended); + $this->factories->offsetUnset($factory); + $this->factories->offsetSet($extended); } return $this[$id] = $extended; diff --git a/xunifriend_RaeeC/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php b/xunifriend_RaeeC/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php index 40e87f4..52e218f 100644 --- a/xunifriend_RaeeC/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php +++ b/xunifriend_RaeeC/vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php @@ -29,6 +29,7 @@ namespace Pimple\Tests; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use Pimple\Container; +use Pimple\ServiceProviderInterface; /** * @author Igor Wiedler @@ -204,7 +205,14 @@ class PimpleTest extends TestCase public function testFluentRegister() { $pimple = new Container(); - $this->assertSame($pimple, $pimple->register($this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock())); + + $stub = new class implements ServiceProviderInterface { + public function register(Container $pimple) + { + } + }; + + $this->assertSame($pimple, $pimple->register($stub)); } public function testRawValidatesKeyIsPresent() @@ -275,11 +283,15 @@ class PimpleTest extends TestCase unset($pimple['foo']); $p = new \ReflectionProperty($pimple, 'values'); - $p->setAccessible(true); + if (PHP_VERSION_ID < 80100) { + $p->setAccessible(true); + } $this->assertEmpty($p->getValue($pimple)); $p = new \ReflectionProperty($pimple, 'factories'); - $p->setAccessible(true); + if (PHP_VERSION_ID < 80100) { + $p->setAccessible(true); + } $this->assertCount(0, $p->getValue($pimple)); } @@ -421,6 +433,7 @@ class PimpleTest extends TestCase /** * @group legacy * @expectedDeprecation How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "foo" should be protected? + * @dataProvider badServiceDefinitionProvider */ #[DataProvider('badServiceDefinitionProvider')] public function testExtendingProtectedClosureDeprecation($service) diff --git a/xunifriend_RaeeC/vendor/psr/cache/README.md b/xunifriend_RaeeC/vendor/psr/cache/README.md index c8706ce..9855a31 100644 --- a/xunifriend_RaeeC/vendor/psr/cache/README.md +++ b/xunifriend_RaeeC/vendor/psr/cache/README.md @@ -1,9 +1,12 @@ -PSR Cache -========= +Caching Interface +============== -This repository holds all interfaces defined by -[PSR-6](http://www.php-fig.org/psr/psr-6/). +This repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url]. -Note that this is not a Cache implementation of its own. It is merely an -interface that describes a Cache implementation. See the specification for more -details. +Note that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-6/ +[package-url]: https://packagist.org/packages/psr/cache +[implementation-url]: https://packagist.org/providers/psr/cache-implementation diff --git a/xunifriend_RaeeC/vendor/psr/cache/composer.json b/xunifriend_RaeeC/vendor/psr/cache/composer.json index e828fec..4b68797 100644 --- a/xunifriend_RaeeC/vendor/psr/cache/composer.json +++ b/xunifriend_RaeeC/vendor/psr/cache/composer.json @@ -6,11 +6,11 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "autoload": { "psr-4": { diff --git a/xunifriend_RaeeC/vendor/psr/cache/src/CacheException.php b/xunifriend_RaeeC/vendor/psr/cache/src/CacheException.php index e27f22f..bb785f4 100644 --- a/xunifriend_RaeeC/vendor/psr/cache/src/CacheException.php +++ b/xunifriend_RaeeC/vendor/psr/cache/src/CacheException.php @@ -5,6 +5,6 @@ namespace Psr\Cache; /** * Exception interface for all exceptions thrown by an Implementing Library. */ -interface CacheException +interface CacheException extends \Throwable { } diff --git a/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemInterface.php b/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemInterface.php index 63d05dd..893315e 100644 --- a/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemInterface.php +++ b/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemInterface.php @@ -72,12 +72,12 @@ interface CacheItemInterface * @return static * The invoked object. */ - public function set($value); + public function set(mixed $value); /** * Sets the expiration time for this cache item. * - * @param \DateTimeInterface|null $expiration + * @param ?\DateTimeInterface $expiration * The point in time after which the item MUST be considered expired. * If null is passed explicitly, a default value MAY be used. If none is set, * the value should be stored permanently or for as long as the @@ -86,7 +86,7 @@ interface CacheItemInterface * @return static * The called object. */ - public function expiresAt($expiration); + public function expiresAt(?\DateTimeInterface $expiration); /** * Sets the expiration time for this cache item. @@ -101,5 +101,5 @@ interface CacheItemInterface * @return static * The called object. */ - public function expiresAfter($time); + public function expiresAfter(int|\DateInterval|null $time); } diff --git a/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemPoolInterface.php b/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemPoolInterface.php index 0351419..9ff99da 100644 --- a/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemPoolInterface.php +++ b/xunifriend_RaeeC/vendor/psr/cache/src/CacheItemPoolInterface.php @@ -29,7 +29,7 @@ interface CacheItemPoolInterface * @return CacheItemInterface * The corresponding Cache Item. */ - public function getItem($key); + public function getItem(string $key); /** * Returns a traversable set of cache items. @@ -47,7 +47,7 @@ interface CacheItemPoolInterface * key is not found. However, if no keys are specified then an empty * traversable MUST be returned instead. */ - public function getItems(array $keys = array()); + public function getItems(array $keys = []); /** * Confirms if the cache contains specified cache item. @@ -66,7 +66,7 @@ interface CacheItemPoolInterface * @return bool * True if item exists in the cache, false otherwise. */ - public function hasItem($key); + public function hasItem(string $key); /** * Deletes all items in the pool. @@ -89,14 +89,14 @@ interface CacheItemPoolInterface * @return bool * True if the item was successfully removed. False if there was an error. */ - public function deleteItem($key); + public function deleteItem(string $key); /** * Removes multiple items from the pool. * * @param string[] $keys * An array of keys that should be removed from the pool. - + * * @throws InvalidArgumentException * If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException * MUST be thrown. diff --git a/xunifriend_RaeeC/vendor/psr/http-factory/composer.json b/xunifriend_RaeeC/vendor/psr/http-factory/composer.json index d1bbdde..82a1d32 100644 --- a/xunifriend_RaeeC/vendor/psr/http-factory/composer.json +++ b/xunifriend_RaeeC/vendor/psr/http-factory/composer.json @@ -1,6 +1,6 @@ { "name": "psr/http-factory", - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "psr", "psr-7", @@ -18,8 +18,11 @@ "homepage": "https://www.php-fig.org/" } ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "autoload": { diff --git a/xunifriend_RaeeC/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php b/xunifriend_RaeeC/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php index 7db4e30..d7adbf0 100644 --- a/xunifriend_RaeeC/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php +++ b/xunifriend_RaeeC/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php @@ -15,10 +15,10 @@ interface UploadedFileFactoryInterface * * @param StreamInterface $stream Underlying stream representing the * uploaded file content. - * @param int $size in bytes + * @param int|null $size in bytes * @param int $error PHP file upload error - * @param string $clientFilename Filename as provided by the client, if any. - * @param string $clientMediaType Media type as provided by the client, if any. + * @param string|null $clientFilename Filename as provided by the client, if any. + * @param string|null $clientMediaType Media type as provided by the client, if any. * * @return UploadedFileInterface * @@ -26,9 +26,9 @@ interface UploadedFileFactoryInterface */ public function createUploadedFile( StreamInterface $stream, - int $size = null, + ?int $size = null, int $error = \UPLOAD_ERR_OK, - string $clientFilename = null, - string $clientMediaType = null + ?string $clientFilename = null, + ?string $clientMediaType = null ): UploadedFileInterface; } diff --git a/xunifriend_RaeeC/vendor/psr/http-message/composer.json b/xunifriend_RaeeC/vendor/psr/http-message/composer.json index 56e8c0a..c66e5ab 100644 --- a/xunifriend_RaeeC/vendor/psr/http-message/composer.json +++ b/xunifriend_RaeeC/vendor/psr/http-message/composer.json @@ -7,7 +7,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "require": { @@ -20,7 +20,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } } } diff --git a/xunifriend_RaeeC/vendor/psr/http-message/src/MessageInterface.php b/xunifriend_RaeeC/vendor/psr/http-message/src/MessageInterface.php index 8cdb4ed..a83c985 100644 --- a/xunifriend_RaeeC/vendor/psr/http-message/src/MessageInterface.php +++ b/xunifriend_RaeeC/vendor/psr/http-message/src/MessageInterface.php @@ -1,7 +1,5 @@ =7.1" + "php": ">=8.1" }, "autoload": { "files": [ @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/xunifriend_RaeeC/vendor/symfony/deprecation-contracts/function.php b/xunifriend_RaeeC/vendor/symfony/deprecation-contracts/function.php index d437150..2d56512 100644 --- a/xunifriend_RaeeC/vendor/symfony/deprecation-contracts/function.php +++ b/xunifriend_RaeeC/vendor/symfony/deprecation-contracts/function.php @@ -20,7 +20,7 @@ if (!function_exists('trigger_deprecation')) { * * @author Nicolas Grekas */ - function trigger_deprecation(string $package, string $version, string $message, ...$args): void + function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void { @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); } diff --git a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/Event.php b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/Event.php index 46dcb2b..2e7f998 100644 --- a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/Event.php +++ b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/Event.php @@ -30,11 +30,8 @@ use Psr\EventDispatcher\StoppableEventInterface; */ class Event implements StoppableEventInterface { - private $propagationStopped = false; + private bool $propagationStopped = false; - /** - * {@inheritdoc} - */ public function isPropagationStopped(): bool { return $this->propagationStopped; diff --git a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php index 81f4e89..2d7840d 100644 --- a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php +++ b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php @@ -21,11 +21,13 @@ interface EventDispatcherInterface extends PsrEventDispatcherInterface /** * Dispatches an event to all registered listeners. * - * @param object $event The event to pass to the event handlers/listeners + * @template T of object + * + * @param T $event The event to pass to the event handlers/listeners * @param string|null $eventName The name of the event to dispatch. If not supplied, * the class of $event should be used instead. * - * @return object The passed $event MUST be returned + * @return T The passed $event MUST be returned */ public function dispatch(object $event, ?string $eventName = null): object; } diff --git a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/README.md b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/README.md index b1ab4c0..332b961 100644 --- a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/README.md +++ b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/README.md @@ -3,7 +3,7 @@ Symfony EventDispatcher Contracts A set of abstractions extracted out of the Symfony components. -Can be used to build on semantics that the Symfony components proved useful - and +Can be used to build on semantics that the Symfony components proved useful and that already have battle tested implementations. See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/composer.json b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/composer.json index 660df81..d156b44 100644 --- a/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/composer.json +++ b/xunifriend_RaeeC/vendor/symfony/event-dispatcher-contracts/composer.json @@ -16,19 +16,16 @@ } ], "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "autoload": { "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } }, "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/xunifriend_RaeeC/vendor/symfony/finder/CHANGELOG.md b/xunifriend_RaeeC/vendor/symfony/finder/CHANGELOG.md index 6a44e87..e838302 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/CHANGELOG.md +++ b/xunifriend_RaeeC/vendor/symfony/finder/CHANGELOG.md @@ -1,6 +1,22 @@ CHANGELOG ========= +6.4 +--- + + * Add early directory pruning to `Finder::filter()` + +6.2 +--- + + * Add `Finder::sortByExtension()` and `Finder::sortBySize()` + * Add `Finder::sortByCaseInsensitiveName()` to sort by name with case insensitive sorting methods + +6.0 +--- + + * Remove `Comparator::setTarget()` and `Comparator::setOperator()` + 5.4.0 ----- diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/Comparator.php b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/Comparator.php index 23cf94e..918a93b 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/Comparator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/Comparator.php @@ -16,102 +16,47 @@ namespace Symfony\Component\Finder\Comparator; */ class Comparator { - private $target; - private $operator = '=='; + private string $operator; - public function __construct(?string $target = null, string $operator = '==') - { - if (null === $target) { - trigger_deprecation('symfony/finder', '5.4', 'Constructing a "%s" without setting "$target" is deprecated.', __CLASS__); + public function __construct( + private string $target, + string $operator = '==', + ) { + if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='], true)) { + throw new \InvalidArgumentException(\sprintf('Invalid operator "%s".', $operator)); } - $this->target = $target; - $this->doSetOperator($operator); + $this->operator = $operator; } /** * Gets the target value. - * - * @return string */ - public function getTarget() + public function getTarget(): string { - if (null === $this->target) { - trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__); - } - return $this->target; } - /** - * @deprecated set the target via the constructor instead - */ - public function setTarget(string $target) - { - trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the target via the constructor instead.', __METHOD__); - - $this->target = $target; - } - /** * Gets the comparison operator. - * - * @return string */ - public function getOperator() + public function getOperator(): string { return $this->operator; } - /** - * Sets the comparison operator. - * - * @throws \InvalidArgumentException - * - * @deprecated set the operator via the constructor instead - */ - public function setOperator(string $operator) - { - trigger_deprecation('symfony/finder', '5.4', '"%s" is deprecated. Set the operator via the constructor instead.', __METHOD__); - - $this->doSetOperator('' === $operator ? '==' : $operator); - } - /** * Tests against the target. - * - * @param mixed $test A test value - * - * @return bool */ - public function test($test) + public function test(mixed $test): bool { - if (null === $this->target) { - trigger_deprecation('symfony/finder', '5.4', 'Calling "%s" without initializing the target is deprecated.', __METHOD__); - } - - switch ($this->operator) { - case '>': - return $test > $this->target; - case '>=': - return $test >= $this->target; - case '<': - return $test < $this->target; - case '<=': - return $test <= $this->target; - case '!=': - return $test != $this->target; - } - - return $test == $this->target; - } - - private function doSetOperator(string $operator): void - { - if (!\in_array($operator, ['>', '<', '>=', '<=', '==', '!='])) { - throw new \InvalidArgumentException(sprintf('Invalid operator "%s".', $operator)); - } - - $this->operator = $operator; + return match ($this->operator) { + '>' => $test > $this->target, + '>=' => $test >= $this->target, + '<' => $test < $this->target, + '<=' => $test <= $this->target, + '!=' => $test != $this->target, + default => $test == $this->target, + }; } } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/DateComparator.php b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/DateComparator.php index 8f651e1..bcf93cf 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/DateComparator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/DateComparator.php @@ -26,17 +26,17 @@ class DateComparator extends Comparator public function __construct(string $test) { if (!preg_match('#^\s*(==|!=|[<>]=?|after|since|before|until)?\s*(.+?)\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a date test.', $test)); + throw new \InvalidArgumentException(\sprintf('Don\'t understand "%s" as a date test.', $test)); } try { - $date = new \DateTime($matches[2]); + $date = new \DateTimeImmutable($matches[2]); $target = $date->format('U'); - } catch (\Exception $e) { - throw new \InvalidArgumentException(sprintf('"%s" is not a valid date.', $matches[2])); + } catch (\Exception) { + throw new \InvalidArgumentException(\sprintf('"%s" is not a valid date.', $matches[2])); } - $operator = $matches[1] ?? '=='; + $operator = $matches[1] ?: '=='; if ('since' === $operator || 'after' === $operator) { $operator = '>'; } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/NumberComparator.php b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/NumberComparator.php index dd30820..0ec0049 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Comparator/NumberComparator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Comparator/NumberComparator.php @@ -19,7 +19,7 @@ namespace Symfony\Component\Finder\Comparator; * magnitudes. * * The target value may use magnitudes of kilobytes (k, ki), - * megabytes (m, mi), or gigabytes (g, gi). Those suffixed + * megabytes (m, mi), or gigabytes (g, gi). Those suffixed * with an i use the appropriate 2**n version in accordance with the * IEC standard: http://physics.nist.gov/cuu/Units/binary.html * @@ -42,12 +42,12 @@ class NumberComparator extends Comparator public function __construct(?string $test) { if (null === $test || !preg_match('#^\s*(==|!=|[<>]=?)?\s*([0-9\.]+)\s*([kmg]i?)?\s*$#i', $test, $matches)) { - throw new \InvalidArgumentException(sprintf('Don\'t understand "%s" as a number test.', $test ?? 'null')); + throw new \InvalidArgumentException(\sprintf('Don\'t understand "%s" as a number test.', $test ?? 'null')); } $target = $matches[2]; if (!is_numeric($target)) { - throw new \InvalidArgumentException(sprintf('Invalid number "%s".', $target)); + throw new \InvalidArgumentException(\sprintf('Invalid number "%s".', $target)); } if (isset($matches[3])) { // magnitude diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Finder.php b/xunifriend_RaeeC/vendor/symfony/finder/Finder.php index 0b56965..ac4c38a 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Finder.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Finder.php @@ -37,7 +37,7 @@ use Symfony\Component\Finder\Iterator\SortableIterator; * * @author Fabien Potencier * - * @implements \IteratorAggregate + * @implements \IteratorAggregate */ class Finder implements \IteratorAggregate, \Countable { @@ -45,27 +45,30 @@ class Finder implements \IteratorAggregate, \Countable public const IGNORE_DOT_FILES = 2; public const IGNORE_VCS_IGNORED_FILES = 4; - private $mode = 0; - private $names = []; - private $notNames = []; - private $exclude = []; - private $filters = []; - private $depths = []; - private $sizes = []; - private $followLinks = false; - private $reverseSorting = false; - private $sort = false; - private $ignore = 0; - private $dirs = []; - private $dates = []; - private $iterators = []; - private $contains = []; - private $notContains = []; - private $paths = []; - private $notPaths = []; - private $ignoreUnreadableDirs = false; + private int $mode = 0; + private array $names = []; + private array $notNames = []; + private array $exclude = []; + private array $filters = []; + private array $pruneFilters = []; + private array $depths = []; + private array $sizes = []; + private bool $followLinks = false; + private bool $reverseSorting = false; + private \Closure|int|false $sort = false; + private int $ignore = 0; + /** @var list */ + private array $dirs = []; + private array $dates = []; + /** @var list> */ + private array $iterators = []; + private array $contains = []; + private array $notContains = []; + private array $paths = []; + private array $notPaths = []; + private bool $ignoreUnreadableDirs = false; - private static $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; + private static array $vcsPatterns = ['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg']; public function __construct() { @@ -74,10 +77,8 @@ class Finder implements \IteratorAggregate, \Countable /** * Creates a new Finder. - * - * @return static */ - public static function create() + public static function create(): static { return new static(); } @@ -87,7 +88,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function directories() + public function directories(): static { $this->mode = Iterator\FileTypeFilterIterator::ONLY_DIRECTORIES; @@ -99,7 +100,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function files() + public function files(): static { $this->mode = Iterator\FileTypeFilterIterator::ONLY_FILES; @@ -122,10 +123,10 @@ class Finder implements \IteratorAggregate, \Countable * @see DepthRangeFilterIterator * @see NumberComparator */ - public function depth($levels) + public function depth(string|int|array $levels): static { foreach ((array) $levels as $level) { - $this->depths[] = new Comparator\NumberComparator($level); + $this->depths[] = new NumberComparator($level); } return $this; @@ -150,10 +151,10 @@ class Finder implements \IteratorAggregate, \Countable * @see DateRangeFilterIterator * @see DateComparator */ - public function date($dates) + public function date(string|array $dates): static { foreach ((array) $dates as $date) { - $this->dates[] = new Comparator\DateComparator($date); + $this->dates[] = new DateComparator($date); } return $this; @@ -175,7 +176,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilenameFilterIterator */ - public function name($patterns) + public function name(string|array $patterns): static { $this->names = array_merge($this->names, (array) $patterns); @@ -191,7 +192,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilenameFilterIterator */ - public function notName($patterns) + public function notName(string|array $patterns): static { $this->notNames = array_merge($this->notNames, (array) $patterns); @@ -213,7 +214,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilecontentFilterIterator */ - public function contains($patterns) + public function contains(string|array $patterns): static { $this->contains = array_merge($this->contains, (array) $patterns); @@ -235,7 +236,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilecontentFilterIterator */ - public function notContains($patterns) + public function notContains(string|array $patterns): static { $this->notContains = array_merge($this->notContains, (array) $patterns); @@ -259,7 +260,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilenameFilterIterator */ - public function path($patterns) + public function path(string|array $patterns): static { $this->paths = array_merge($this->paths, (array) $patterns); @@ -283,7 +284,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see FilenameFilterIterator */ - public function notPath($patterns) + public function notPath(string|array $patterns): static { $this->notPaths = array_merge($this->notPaths, (array) $patterns); @@ -305,10 +306,10 @@ class Finder implements \IteratorAggregate, \Countable * @see SizeRangeFilterIterator * @see NumberComparator */ - public function size($sizes) + public function size(string|int|array $sizes): static { foreach ((array) $sizes as $size) { - $this->sizes[] = new Comparator\NumberComparator($size); + $this->sizes[] = new NumberComparator($size); } return $this; @@ -327,7 +328,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see ExcludeDirectoryFilterIterator */ - public function exclude($dirs) + public function exclude(string|array $dirs): static { $this->exclude = array_merge($this->exclude, (array) $dirs); @@ -343,7 +344,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see ExcludeDirectoryFilterIterator */ - public function ignoreDotFiles(bool $ignoreDotFiles) + public function ignoreDotFiles(bool $ignoreDotFiles): static { if ($ignoreDotFiles) { $this->ignore |= static::IGNORE_DOT_FILES; @@ -363,7 +364,7 @@ class Finder implements \IteratorAggregate, \Countable * * @see ExcludeDirectoryFilterIterator */ - public function ignoreVCS(bool $ignoreVCS) + public function ignoreVCS(bool $ignoreVCS): static { if ($ignoreVCS) { $this->ignore |= static::IGNORE_VCS_FILES; @@ -381,7 +382,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function ignoreVCSIgnored(bool $ignoreVCSIgnored) + public function ignoreVCSIgnored(bool $ignoreVCSIgnored): static { if ($ignoreVCSIgnored) { $this->ignore |= static::IGNORE_VCS_IGNORED_FILES; @@ -399,7 +400,7 @@ class Finder implements \IteratorAggregate, \Countable * * @param string|string[] $pattern VCS patterns to ignore */ - public static function addVCSPattern($pattern) + public static function addVCSPattern(string|array $pattern): void { foreach ((array) $pattern as $p) { self::$vcsPatterns[] = $p; @@ -419,13 +420,29 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sort(\Closure $closure) + public function sort(\Closure $closure): static { $this->sort = $closure; return $this; } + /** + * Sorts files and directories by extension. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByExtension(): static + { + $this->sort = SortableIterator::SORT_BY_EXTENSION; + + return $this; + } + /** * Sorts files and directories by name. * @@ -435,9 +452,41 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sortByName(bool $useNaturalSort = false) + public function sortByName(bool $useNaturalSort = false): static { - $this->sort = $useNaturalSort ? Iterator\SortableIterator::SORT_BY_NAME_NATURAL : Iterator\SortableIterator::SORT_BY_NAME; + $this->sort = $useNaturalSort ? SortableIterator::SORT_BY_NAME_NATURAL : SortableIterator::SORT_BY_NAME; + + return $this; + } + + /** + * Sorts files and directories by name case insensitive. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortByCaseInsensitiveName(bool $useNaturalSort = false): static + { + $this->sort = $useNaturalSort ? SortableIterator::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE : SortableIterator::SORT_BY_NAME_CASE_INSENSITIVE; + + return $this; + } + + /** + * Sorts files and directories by size. + * + * This can be slow as all the matching files and directories must be retrieved for comparison. + * + * @return $this + * + * @see SortableIterator + */ + public function sortBySize(): static + { + $this->sort = SortableIterator::SORT_BY_SIZE; return $this; } @@ -451,9 +500,9 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sortByType() + public function sortByType(): static { - $this->sort = Iterator\SortableIterator::SORT_BY_TYPE; + $this->sort = SortableIterator::SORT_BY_TYPE; return $this; } @@ -469,9 +518,9 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sortByAccessedTime() + public function sortByAccessedTime(): static { - $this->sort = Iterator\SortableIterator::SORT_BY_ACCESSED_TIME; + $this->sort = SortableIterator::SORT_BY_ACCESSED_TIME; return $this; } @@ -481,7 +530,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function reverseSorting() + public function reverseSorting(): static { $this->reverseSorting = true; @@ -501,9 +550,9 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sortByChangedTime() + public function sortByChangedTime(): static { - $this->sort = Iterator\SortableIterator::SORT_BY_CHANGED_TIME; + $this->sort = SortableIterator::SORT_BY_CHANGED_TIME; return $this; } @@ -519,9 +568,9 @@ class Finder implements \IteratorAggregate, \Countable * * @see SortableIterator */ - public function sortByModifiedTime() + public function sortByModifiedTime(): static { - $this->sort = Iterator\SortableIterator::SORT_BY_MODIFIED_TIME; + $this->sort = SortableIterator::SORT_BY_MODIFIED_TIME; return $this; } @@ -532,14 +581,21 @@ class Finder implements \IteratorAggregate, \Countable * The anonymous function receives a \SplFileInfo and must return false * to remove files. * + * @param \Closure(SplFileInfo): bool $closure + * @param bool $prune Whether to skip traversing directories further + * * @return $this * * @see CustomFilterIterator */ - public function filter(\Closure $closure) + public function filter(\Closure $closure, bool $prune = false): static { $this->filters[] = $closure; + if ($prune) { + $this->pruneFilters[] = $closure; + } + return $this; } @@ -548,7 +604,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function followLinks() + public function followLinks(): static { $this->followLinks = true; @@ -562,7 +618,7 @@ class Finder implements \IteratorAggregate, \Countable * * @return $this */ - public function ignoreUnreadableDirs(bool $ignore = true) + public function ignoreUnreadableDirs(bool $ignore = true): static { $this->ignoreUnreadableDirs = $ignore; @@ -578,7 +634,7 @@ class Finder implements \IteratorAggregate, \Countable * * @throws DirectoryNotFoundException if one of the directories does not exist */ - public function in($dirs) + public function in(string|array $dirs): static { $resolvedDirs = []; @@ -587,9 +643,9 @@ class Finder implements \IteratorAggregate, \Countable $resolvedDirs[] = [$this->normalizeDir($dir)]; } elseif ($glob = glob($dir, (\defined('GLOB_BRACE') ? \GLOB_BRACE : 0) | \GLOB_ONLYDIR | \GLOB_NOSORT)) { sort($glob); - $resolvedDirs[] = array_map([$this, 'normalizeDir'], $glob); + $resolvedDirs[] = array_map($this->normalizeDir(...), $glob); } else { - throw new DirectoryNotFoundException(sprintf('The "%s" directory does not exist.', $dir)); + throw new DirectoryNotFoundException(\sprintf('The "%s" directory does not exist.', $dir)); } } @@ -603,40 +659,43 @@ class Finder implements \IteratorAggregate, \Countable * * This method implements the IteratorAggregate interface. * - * @return \Iterator + * @return \Iterator * * @throws \LogicException if the in() method has not been called */ - #[\ReturnTypeWillChange] - public function getIterator() + public function getIterator(): \Iterator { - if (0 === \count($this->dirs) && 0 === \count($this->iterators)) { + if (!$this->dirs && !$this->iterators) { throw new \LogicException('You must call one of in() or append() methods before iterating over a Finder.'); } - if (1 === \count($this->dirs) && 0 === \count($this->iterators)) { + if (1 === \count($this->dirs) && !$this->iterators) { $iterator = $this->searchInDirectory($this->dirs[0]); - - if ($this->sort || $this->reverseSorting) { - $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); + } else { + $iterator = new \AppendIterator(); + foreach ($this->dirs as $dir) { + $iterator->append(new \IteratorIterator(new LazyIterator(fn () => $this->searchInDirectory($dir)))); } - return $iterator; - } + foreach ($this->iterators as $it) { + $iterator->append(new \IteratorIterator(new LazyIterator(static function () use ($it) { + foreach ($it as $file) { + if (!$file instanceof \SplFileInfo) { + $file = new \SplFileInfo($file); + } + $key = $file->getPathname(); + if (!$file instanceof SplFileInfo) { + $file = new SplFileInfo($key, $file->getPath(), $key); + } - $iterator = new \AppendIterator(); - foreach ($this->dirs as $dir) { - $iterator->append(new \IteratorIterator(new LazyIterator(function () use ($dir) { - return $this->searchInDirectory($dir); - }))); - } - - foreach ($this->iterators as $it) { - $iterator->append($it); + yield $key => $file; + } + }))); + } } if ($this->sort || $this->reverseSorting) { - $iterator = (new Iterator\SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); + $iterator = (new SortableIterator($iterator, $this->sort, $this->reverseSorting))->getIterator(); } return $iterator; @@ -647,36 +706,21 @@ class Finder implements \IteratorAggregate, \Countable * * The set can be another Finder, an Iterator, an IteratorAggregate, or even a plain array. * - * @return $this + * @param iterable $iterator * - * @throws \InvalidArgumentException when the given argument is not iterable + * @return $this */ - public function append(iterable $iterator) + public function append(iterable $iterator): static { - if ($iterator instanceof \IteratorAggregate) { - $this->iterators[] = $iterator->getIterator(); - } elseif ($iterator instanceof \Iterator) { - $this->iterators[] = $iterator; - } elseif (is_iterable($iterator)) { - $it = new \ArrayIterator(); - foreach ($iterator as $file) { - $file = $file instanceof \SplFileInfo ? $file : new \SplFileInfo($file); - $it[$file->getPathname()] = $file; - } - $this->iterators[] = $it; - } else { - throw new \InvalidArgumentException('Finder::append() method wrong argument type.'); - } + $this->iterators[] = $iterator; return $this; } /** * Check if any results were found. - * - * @return bool */ - public function hasResults() + public function hasResults(): bool { foreach ($this->getIterator() as $_) { return true; @@ -687,11 +731,8 @@ class Finder implements \IteratorAggregate, \Countable /** * Counts all the results collected by the iterators. - * - * @return int */ - #[\ReturnTypeWillChange] - public function count() + public function count(): int { return iterator_count($this->getIterator()); } @@ -701,6 +742,10 @@ class Finder implements \IteratorAggregate, \Countable $exclude = $this->exclude; $notPaths = $this->notPaths; + if ($this->pruneFilters) { + $exclude = array_merge($exclude, $this->pruneFilters); + } + if (static::IGNORE_VCS_FILES === (static::IGNORE_VCS_FILES & $this->ignore)) { $exclude = array_merge($exclude, self::$vcsPatterns); } @@ -740,13 +785,13 @@ class Finder implements \IteratorAggregate, \Countable $iterator = new Iterator\RecursiveDirectoryIterator($dir, $flags, $this->ignoreUnreadableDirs); if ($exclude) { - $iterator = new Iterator\ExcludeDirectoryFilterIterator($iterator, $exclude); + $iterator = new ExcludeDirectoryFilterIterator($iterator, $exclude); } $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); if ($minDepth > 0 || $maxDepth < \PHP_INT_MAX) { - $iterator = new Iterator\DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); + $iterator = new DepthRangeFilterIterator($iterator, $minDepth, $maxDepth); } if ($this->mode) { @@ -754,23 +799,23 @@ class Finder implements \IteratorAggregate, \Countable } if ($this->names || $this->notNames) { - $iterator = new Iterator\FilenameFilterIterator($iterator, $this->names, $this->notNames); + $iterator = new FilenameFilterIterator($iterator, $this->names, $this->notNames); } if ($this->contains || $this->notContains) { - $iterator = new Iterator\FilecontentFilterIterator($iterator, $this->contains, $this->notContains); + $iterator = new FilecontentFilterIterator($iterator, $this->contains, $this->notContains); } if ($this->sizes) { - $iterator = new Iterator\SizeRangeFilterIterator($iterator, $this->sizes); + $iterator = new SizeRangeFilterIterator($iterator, $this->sizes); } if ($this->dates) { - $iterator = new Iterator\DateRangeFilterIterator($iterator, $this->dates); + $iterator = new DateRangeFilterIterator($iterator, $this->dates); } if ($this->filters) { - $iterator = new Iterator\CustomFilterIterator($iterator, $this->filters); + $iterator = new CustomFilterIterator($iterator, $this->filters); } if ($this->paths || $notPaths) { diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Gitignore.php b/xunifriend_RaeeC/vendor/symfony/finder/Gitignore.php index d42cca1..bf05c5b 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Gitignore.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Gitignore.php @@ -43,7 +43,7 @@ class Gitignore foreach ($gitignoreLines as $line) { $line = preg_replace('~(? '['.('' !== $matches[1] ? '^' : '').str_replace('\\-', '-', $matches[2]).']', $regex); $regex = preg_replace('~(?:(?:\\\\\*){2,}(/?))+~', '(?:(?:(?!//).(? $iterator The Iterator to filter @@ -45,11 +45,8 @@ class CustomFilterIterator extends \FilterIterator /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { $fileinfo = $this->current(); diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php index f592e19..718d42b 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DateRangeFilterIterator.php @@ -22,7 +22,7 @@ use Symfony\Component\Finder\Comparator\DateComparator; */ class DateRangeFilterIterator extends \FilterIterator { - private $comparators = []; + private array $comparators = []; /** * @param \Iterator $iterator @@ -37,11 +37,8 @@ class DateRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { $fileinfo = $this->current(); diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php index f593a3f..1cddb5f 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/DepthRangeFilterIterator.php @@ -23,7 +23,7 @@ namespace Symfony\Component\Finder\Iterator; */ class DepthRangeFilterIterator extends \FilterIterator { - private $minDepth = 0; + private int $minDepth = 0; /** * @param \RecursiveIteratorIterator<\RecursiveIterator> $iterator The Iterator to filter @@ -40,11 +40,8 @@ class DepthRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { return $this->getInnerIterator()->getDepth() >= $this->minDepth; } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php index 39797c8..88be240 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/ExcludeDirectoryFilterIterator.php @@ -11,25 +11,31 @@ namespace Symfony\Component\Finder\Iterator; +use Symfony\Component\Finder\SplFileInfo; + /** * ExcludeDirectoryFilterIterator filters out directories. * * @author Fabien Potencier * - * @extends \FilterIterator + * @extends \FilterIterator * - * @implements \RecursiveIterator + * @implements \RecursiveIterator */ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \RecursiveIterator { - private $iterator; - private $isRecursive; - private $excludedDirs = []; - private $excludedPattern; + /** @var \Iterator */ + private \Iterator $iterator; + private bool $isRecursive; + /** @var array */ + private array $excludedDirs = []; + private ?string $excludedPattern = null; + /** @var list */ + private array $pruneFilters = []; /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $directories An array of directories to exclude + * @param \Iterator $iterator The Iterator to filter + * @param list $directories An array of directories to exclude */ public function __construct(\Iterator $iterator, array $directories) { @@ -37,6 +43,16 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \Recursi $this->isRecursive = $iterator instanceof \RecursiveIterator; $patterns = []; foreach ($directories as $directory) { + if (!\is_string($directory)) { + if (!\is_callable($directory)) { + throw new \InvalidArgumentException('Invalid PHP callback.'); + } + + $this->pruneFilters[] = $directory; + + continue; + } + $directory = rtrim($directory, '/'); if (!$this->isRecursive || str_contains($directory, '/')) { $patterns[] = preg_quote($directory, '#'); @@ -53,40 +69,37 @@ class ExcludeDirectoryFilterIterator extends \FilterIterator implements \Recursi /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { - if ($this->isRecursive && isset($this->excludedDirs[$this->getFilename()]) && $this->isDir()) { + if ($this->isRecursive && isset($this->excludedDirs[$this->current()->getFilename()]) && $this->current()->isDir()) { return false; } if ($this->excludedPattern) { - $path = $this->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); + $path = $this->current()->isDir() ? $this->current()->getRelativePathname() : $this->current()->getRelativePath(); $path = str_replace('\\', '/', $path); return !preg_match($this->excludedPattern, $path); } + if ($this->pruneFilters && $this->hasChildren()) { + foreach ($this->pruneFilters as $pruneFilter) { + if (!$pruneFilter($this->current())) { + return false; + } + } + } + return true; } - /** - * @return bool - */ - #[\ReturnTypeWillChange] - public function hasChildren() + public function hasChildren(): bool { return $this->isRecursive && $this->iterator->hasChildren(); } - /** - * @return self - */ - #[\ReturnTypeWillChange] - public function getChildren() + public function getChildren(): self { $children = new self($this->iterator->getChildren(), []); $children->excludedDirs = $this->excludedDirs; diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php index 793ae35..0d4a5fd 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FileTypeFilterIterator.php @@ -23,26 +23,21 @@ class FileTypeFilterIterator extends \FilterIterator public const ONLY_FILES = 1; public const ONLY_DIRECTORIES = 2; - private $mode; - /** - * @param \Iterator $iterator The Iterator to filter - * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) + * @param \Iterator $iterator The Iterator to filter + * @param int $mode The mode (self::ONLY_FILES or self::ONLY_DIRECTORIES) */ - public function __construct(\Iterator $iterator, int $mode) - { - $this->mode = $mode; - + public function __construct( + \Iterator $iterator, + private int $mode, + ) { parent::__construct($iterator); } /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { $fileinfo = $this->current(); if (self::ONLY_DIRECTORIES === (self::ONLY_DIRECTORIES & $this->mode) && $fileinfo->isFile()) { diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php index 79f8c29..bdc71ff 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilecontentFilterIterator.php @@ -11,23 +11,22 @@ namespace Symfony\Component\Finder\Iterator; +use Symfony\Component\Finder\SplFileInfo; + /** * FilecontentFilterIterator filters files by their contents using patterns (regexps or strings). * * @author Fabien Potencier * @author Włodzimierz Gajda * - * @extends MultiplePcreFilterIterator + * @extends MultiplePcreFilterIterator */ class FilecontentFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { if (!$this->matchRegexps && !$this->noMatchRegexps) { return true; @@ -51,10 +50,8 @@ class FilecontentFilterIterator extends MultiplePcreFilterIterator * Converts string to regexp if necessary. * * @param string $str Pattern: string or regexp - * - * @return string */ - protected function toRegex(string $str) + protected function toRegex(string $str): string { return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilenameFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilenameFilterIterator.php index 77b3b24..05d9535 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilenameFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/FilenameFilterIterator.php @@ -24,11 +24,8 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { return $this->isAccepted($this->current()->getFilename()); } @@ -40,10 +37,8 @@ class FilenameFilterIterator extends MultiplePcreFilterIterator * Glob strings are transformed with Glob::toRegex(). * * @param string $str Pattern: glob or regexp - * - * @return string */ - protected function toRegex(string $str) + protected function toRegex(string $str): string { return $this->isRegex($str) ? $str : Glob::toRegex($str); } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/LazyIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/LazyIterator.php index 32cc37f..5b5806b 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/LazyIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/LazyIterator.php @@ -18,11 +18,11 @@ namespace Symfony\Component\Finder\Iterator; */ class LazyIterator implements \IteratorAggregate { - private $iteratorFactory; + private \Closure $iteratorFactory; public function __construct(callable $iteratorFactory) { - $this->iteratorFactory = $iteratorFactory; + $this->iteratorFactory = $iteratorFactory(...); } public function getIterator(): \Traversable diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php index 564765d..3450c49 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -23,13 +23,13 @@ namespace Symfony\Component\Finder\Iterator; */ abstract class MultiplePcreFilterIterator extends \FilterIterator { - protected $matchRegexps = []; - protected $noMatchRegexps = []; + protected array $matchRegexps = []; + protected array $noMatchRegexps = []; /** - * @param \Iterator $iterator The Iterator to filter - * @param string[] $matchPatterns An array of patterns that need to match - * @param string[] $noMatchPatterns An array of patterns that need to not match + * @param \Iterator $iterator The Iterator to filter + * @param string[] $matchPatterns An array of patterns that need to match + * @param string[] $noMatchPatterns An array of patterns that need to not match */ public function __construct(\Iterator $iterator, array $matchPatterns, array $noMatchPatterns) { @@ -50,10 +50,8 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator * If there is no regexps defined in the class, this method will accept the string. * Such case can be handled by child classes before calling the method if they want to * apply a different behavior. - * - * @return bool */ - protected function isAccepted(string $string) + protected function isAccepted(string $string): bool { // should at least not match one rule to exclude foreach ($this->noMatchRegexps as $regex) { @@ -79,16 +77,10 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator /** * Checks whether the string is a regex. - * - * @return bool */ - protected function isRegex(string $str) + protected function isRegex(string $str): bool { - $availableModifiers = 'imsxuADU'; - - if (\PHP_VERSION_ID >= 80200) { - $availableModifiers .= 'n'; - } + $availableModifiers = 'imsxuADUn'; if (preg_match('/^(.{3,}?)['.$availableModifiers.']*$/', $str, $m)) { $start = substr($m[1], 0, 1); @@ -110,8 +102,6 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator /** * Converts string into regexp. - * - * @return string */ - abstract protected function toRegex(string $str); + abstract protected function toRegex(string $str): string; } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/PathFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/PathFilterIterator.php index 7974c4e..c6d5813 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/PathFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/PathFilterIterator.php @@ -11,23 +11,22 @@ namespace Symfony\Component\Finder\Iterator; +use Symfony\Component\Finder\SplFileInfo; + /** * PathFilterIterator filters files by path patterns (e.g. some/special/dir). * * @author Fabien Potencier * @author Włodzimierz Gajda * - * @extends MultiplePcreFilterIterator + * @extends MultiplePcreFilterIterator */ class PathFilterIterator extends MultiplePcreFilterIterator { /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { $filename = $this->current()->getRelativePathname(); @@ -49,10 +48,8 @@ class PathFilterIterator extends MultiplePcreFilterIterator * Use only / as directory separator (on Windows also). * * @param string $str Pattern: regexp or dirname - * - * @return string */ - protected function toRegex(string $str) + protected function toRegex(string $str): string { return $this->isRegex($str) ? $str : '/'.preg_quote($str, '/').'/'; } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php index ac5d720..f5fd2d4 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/RecursiveDirectoryIterator.php @@ -18,23 +18,18 @@ use Symfony\Component\Finder\SplFileInfo; * Extends the \RecursiveDirectoryIterator to support relative paths. * * @author Victor Berchet + * + * @extends \RecursiveDirectoryIterator */ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator { - /** - * @var bool - */ - private $ignoreUnreadableDirs; - - /** - * @var bool - */ - private $ignoreFirstRewind = true; + private bool $ignoreUnreadableDirs; + private bool $ignoreFirstRewind = true; // these 3 properties take part of the performance optimization to avoid redoing the same work in all iterations - private $rootPath; - private $subPath; - private $directorySeparator = '/'; + private string $rootPath; + private string $subPath; + private string $directorySeparator = '/'; /** * @throws \RuntimeException @@ -55,17 +50,15 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator /** * Return an instance of SplFileInfo with support for relative paths. - * - * @return SplFileInfo */ - #[\ReturnTypeWillChange] - public function current() + public function current(): SplFileInfo { // the logic here avoids redoing the same work in all iterations - if (null === $subPathname = $this->subPath) { - $subPathname = $this->subPath = $this->getSubPath(); + if (!isset($this->subPath)) { + $this->subPath = $this->getSubPath(); } + $subPathname = $this->subPath; if ('' !== $subPathname) { $subPathname .= $this->directorySeparator; } @@ -79,13 +72,7 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator return new SplFileInfo($basePath.$subPathname, $this->subPath, $subPathname); } - /** - * @param bool $allowLinks - * - * @return bool - */ - #[\ReturnTypeWillChange] - public function hasChildren($allowLinks = false) + public function hasChildren(bool $allowLinks = false): bool { $hasChildren = parent::hasChildren($allowLinks); @@ -97,19 +84,16 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator parent::getChildren(); return true; - } catch (\UnexpectedValueException $e) { + } catch (\UnexpectedValueException) { // If directory is unreadable and finder is set to ignore it, skip children return false; } } /** - * @return \RecursiveDirectoryIterator - * * @throws AccessDeniedException */ - #[\ReturnTypeWillChange] - public function getChildren() + public function getChildren(): \RecursiveDirectoryIterator { try { $children = parent::getChildren(); @@ -128,22 +112,14 @@ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator } } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function next() + public function next(): void { $this->ignoreFirstRewind = false; parent::next(); } - /** - * @return void - */ - #[\ReturnTypeWillChange] - public function rewind() + public function rewind(): void { // some streams like FTP are not rewindable, ignore the first rewind after creation, // as newly created DirectoryIterator does not need to be rewound diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php index 575bf29..925830a 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SizeRangeFilterIterator.php @@ -22,7 +22,7 @@ use Symfony\Component\Finder\Comparator\NumberComparator; */ class SizeRangeFilterIterator extends \FilterIterator { - private $comparators = []; + private array $comparators = []; /** * @param \Iterator $iterator @@ -37,11 +37,8 @@ class SizeRangeFilterIterator extends \FilterIterator /** * Filters the iterator values. - * - * @return bool */ - #[\ReturnTypeWillChange] - public function accept() + public function accept(): bool { $fileinfo = $this->current(); if (!$fileinfo->isFile()) { diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SortableIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SortableIterator.php index 9afde5c..1cfcea0 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/SortableIterator.php @@ -27,9 +27,14 @@ class SortableIterator implements \IteratorAggregate public const SORT_BY_CHANGED_TIME = 4; public const SORT_BY_MODIFIED_TIME = 5; public const SORT_BY_NAME_NATURAL = 6; + public const SORT_BY_NAME_CASE_INSENSITIVE = 7; + public const SORT_BY_NAME_NATURAL_CASE_INSENSITIVE = 8; + public const SORT_BY_EXTENSION = 9; + public const SORT_BY_SIZE = 10; - private $iterator; - private $sort; + /** @var \Traversable */ + private \Traversable $iterator; + private \Closure|int $sort; /** * @param \Traversable $iterator @@ -37,19 +42,19 @@ class SortableIterator implements \IteratorAggregate * * @throws \InvalidArgumentException */ - public function __construct(\Traversable $iterator, $sort, bool $reverseOrder = false) + public function __construct(\Traversable $iterator, int|callable $sort, bool $reverseOrder = false) { $this->iterator = $iterator; $order = $reverseOrder ? -1 : 1; if (self::SORT_BY_NAME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_NATURAL === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); + } elseif (self::SORT_BY_NAME_CASE_INSENSITIVE === $sort) { + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); + } elseif (self::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE === $sort) { + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_TYPE === $sort) { $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { if ($a->isDir() && $b->isFile()) { @@ -61,44 +66,50 @@ class SortableIterator implements \IteratorAggregate return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getATime() - $b->getATime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getATime() - $b->getATime()); } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getCTime() - $b->getCTime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getCTime() - $b->getCTime()); } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getMTime() - $b->getMTime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getMTime() - $b->getMTime()); + } elseif (self::SORT_BY_EXTENSION === $sort) { + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getExtension(), $b->getExtension()); + } elseif (self::SORT_BY_SIZE === $sort) { + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getSize() - $b->getSize()); } elseif (self::SORT_BY_NONE === $sort) { $this->sort = $order; } elseif (\is_callable($sort)) { - $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort; + $this->sort = $reverseOrder ? static fn (\SplFileInfo $a, \SplFileInfo $b) => -$sort($a, $b) : $sort(...); } else { throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); } } - /** - * @return \Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() + public function getIterator(): \Traversable { if (1 === $this->sort) { - return $this->iterator; + yield from $this->iterator; + + return; } - $array = iterator_to_array($this->iterator, true); + $keys = $values = []; + foreach ($this->iterator as $key => $value) { + $keys[] = $key; + $values[] = $value; + } if (-1 === $this->sort) { - $array = array_reverse($array); - } else { - uasort($array, $this->sort); + for ($i = \count($values) - 1; $i >= 0; --$i) { + yield $keys[$i] => $values[$i]; + } + + return; } - return new \ArrayIterator($array); + uasort($values, $this->sort); + + foreach ($values as $i => $v) { + yield $keys[$i] => $v; + } } } diff --git a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php index e27158c..b278706 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php @@ -13,27 +13,37 @@ namespace Symfony\Component\Finder\Iterator; use Symfony\Component\Finder\Gitignore; +/** + * @extends \FilterIterator + */ final class VcsIgnoredFilterIterator extends \FilterIterator { - /** - * @var string - */ - private $baseDir; + private string $baseDir; /** * @var array */ - private $gitignoreFilesCache = []; + private array $gitignoreFilesCache = []; /** * @var array */ - private $ignoredPathsCache = []; + private array $ignoredPathsCache = []; + /** + * @param \Iterator $iterator + */ public function __construct(\Iterator $iterator, string $baseDir) { $this->baseDir = $this->normalizePath($baseDir); + foreach ([$this->baseDir, ...$this->parentDirectoriesUpwards($this->baseDir)] as $directory) { + if (@is_dir("{$directory}/.git")) { + $this->baseDir = $directory; + break; + } + } + parent::__construct($iterator); } @@ -58,7 +68,7 @@ final class VcsIgnoredFilterIterator extends \FilterIterator $ignored = false; - foreach ($this->parentsDirectoryDownward($fileRealPath) as $parentDirectory) { + foreach ($this->parentDirectoriesDownwards($fileRealPath) as $parentDirectory) { if ($this->isIgnored($parentDirectory)) { // rules in ignored directories are ignored, no need to check further. break; @@ -89,11 +99,11 @@ final class VcsIgnoredFilterIterator extends \FilterIterator /** * @return list */ - private function parentsDirectoryDownward(string $fileRealPath): array + private function parentDirectoriesUpwards(string $from): array { $parentDirectories = []; - $parentDirectory = $fileRealPath; + $parentDirectory = $from; while (true) { $newParentDirectory = \dirname($parentDirectory); @@ -103,16 +113,28 @@ final class VcsIgnoredFilterIterator extends \FilterIterator break; } - $parentDirectory = $newParentDirectory; - - if (0 !== strpos($parentDirectory, $this->baseDir)) { - break; - } - - $parentDirectories[] = $parentDirectory; + $parentDirectories[] = $parentDirectory = $newParentDirectory; } - return array_reverse($parentDirectories); + return $parentDirectories; + } + + private function parentDirectoriesUpTo(string $from, string $upTo): array + { + return array_filter( + $this->parentDirectoriesUpwards($from), + static fn (string $directory): bool => str_starts_with($directory, $upTo) + ); + } + + /** + * @return list + */ + private function parentDirectoriesDownwards(string $fileRealPath): array + { + return array_reverse( + $this->parentDirectoriesUpTo($fileRealPath, $this->baseDir) + ); } /** diff --git a/xunifriend_RaeeC/vendor/symfony/finder/SplFileInfo.php b/xunifriend_RaeeC/vendor/symfony/finder/SplFileInfo.php index 11604a2..2afc378 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/SplFileInfo.php +++ b/xunifriend_RaeeC/vendor/symfony/finder/SplFileInfo.php @@ -18,29 +18,25 @@ namespace Symfony\Component\Finder; */ class SplFileInfo extends \SplFileInfo { - private $relativePath; - private $relativePathname; - /** * @param string $file The file name * @param string $relativePath The relative path * @param string $relativePathname The relative path name */ - public function __construct(string $file, string $relativePath, string $relativePathname) - { + public function __construct( + string $file, + private string $relativePath, + private string $relativePathname, + ) { parent::__construct($file); - $this->relativePath = $relativePath; - $this->relativePathname = $relativePathname; } /** * Returns the relative path. * * This path does not contain the file name. - * - * @return string */ - public function getRelativePath() + public function getRelativePath(): string { return $this->relativePath; } @@ -49,10 +45,8 @@ class SplFileInfo extends \SplFileInfo * Returns the relative path name. * * This path contains the file name. - * - * @return string */ - public function getRelativePathname() + public function getRelativePathname(): string { return $this->relativePathname; } @@ -67,11 +61,9 @@ class SplFileInfo extends \SplFileInfo /** * Returns the contents of the file. * - * @return string - * * @throws \RuntimeException */ - public function getContents() + public function getContents(): string { set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); try { diff --git a/xunifriend_RaeeC/vendor/symfony/finder/composer.json b/xunifriend_RaeeC/vendor/symfony/finder/composer.json index ef19911..e922961 100644 --- a/xunifriend_RaeeC/vendor/symfony/finder/composer.json +++ b/xunifriend_RaeeC/vendor/symfony/finder/composer.json @@ -16,9 +16,10 @@ } ], "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.4" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.0" }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" }, diff --git a/xunifriend_RaeeC/vendor/symfony/http-foundation/Request.php b/xunifriend_RaeeC/vendor/symfony/http-foundation/Request.php index d1103cf..393b547 100644 --- a/xunifriend_RaeeC/vendor/symfony/http-foundation/Request.php +++ b/xunifriend_RaeeC/vendor/symfony/http-foundation/Request.php @@ -1983,9 +1983,8 @@ class Request } $pathInfo = substr($requestUri, \strlen($baseUrl)); - if (false === $pathInfo || '' === $pathInfo) { - // If substr() returns false then PATH_INFO is set to an empty string - return '/'; + if (false === $pathInfo || '' === $pathInfo || '/' !== $pathInfo[0]) { + return '/'.$pathInfo; } return $pathInfo; diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/Required.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/Required.php new file mode 100644 index 0000000..9df8511 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/Required.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Attribute; + +/** + * A required dependency. + * + * This attribute indicates that a property holds a required dependency. The annotated property or method should be + * considered during the instantiation process of the containing class. + * + * @author Alexander M. Turek + */ +#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] +final class Required +{ +} diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/SubscribedService.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/SubscribedService.php new file mode 100644 index 0000000..f850b84 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/Attribute/SubscribedService.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Attribute; + +use Symfony\Contracts\Service\ServiceMethodsSubscriberTrait; +use Symfony\Contracts\Service\ServiceSubscriberInterface; + +/** + * For use as the return value for {@see ServiceSubscriberInterface}. + * + * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi')) + * + * Use with {@see ServiceMethodsSubscriberTrait} to mark a method's return type + * as a subscribed service. + * + * @author Kevin Bond + */ +#[\Attribute(\Attribute::TARGET_METHOD)] +final class SubscribedService +{ + /** @var object[] */ + public array $attributes; + + /** + * @param string|null $key The key to use for the service + * @param class-string|null $type The service class + * @param bool $nullable Whether the service is optional + * @param object|object[] $attributes One or more dependency injection attributes to use + */ + public function __construct( + public ?string $key = null, + public ?string $type = null, + public bool $nullable = false, + array|object $attributes = [], + ) { + $this->attributes = \is_array($attributes) ? $attributes : [$attributes]; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/CHANGELOG.md b/xunifriend_RaeeC/vendor/symfony/service-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/LICENSE b/xunifriend_RaeeC/vendor/symfony/service-contracts/LICENSE index 3f853aa..7536cae 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/LICENSE +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2019 Fabien Potencier +Copyright (c) 2018-present Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/README.md b/xunifriend_RaeeC/vendor/symfony/service-contracts/README.md index d033a43..42841a5 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/README.md +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/README.md @@ -3,7 +3,7 @@ Symfony Service Contracts A set of abstractions extracted out of the Symfony components. -Can be used to build on semantics that the Symfony components proved useful - and +Can be used to build on semantics that the Symfony components proved useful and that already have battle tested implementations. -See https://github.com/symfony/contracts/blob/master/README.md for more information. +See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ResetInterface.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ResetInterface.php index 1af1075..a4f389b 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/ResetInterface.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ResetInterface.php @@ -26,5 +26,8 @@ namespace Symfony\Contracts\Service; */ interface ResetInterface { + /** + * @return void + */ public function reset(); } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceCollectionInterface.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceCollectionInterface.php new file mode 100644 index 0000000..2333139 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceCollectionInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * A ServiceProviderInterface that is also countable and iterable. + * + * @author Kevin Bond + * + * @template-covariant T of mixed + * + * @extends ServiceProviderInterface + * @extends \IteratorAggregate + */ +interface ServiceCollectionInterface extends ServiceProviderInterface, \Countable, \IteratorAggregate +{ +} diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceLocatorTrait.php index 71b1b74..bbe4548 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceLocatorTrait.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -14,6 +14,10 @@ namespace Symfony\Contracts\Service; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; +// Help opcache.preload discover always-needed symbols +class_exists(ContainerExceptionInterface::class); +class_exists(NotFoundExceptionInterface::class); + /** * A trait to help implement ServiceProviderInterface. * @@ -22,30 +26,23 @@ use Psr\Container\NotFoundExceptionInterface; */ trait ServiceLocatorTrait { - private $factories; - private $loading = []; - private $providedTypes; + private array $loading = []; + private array $providedTypes; /** - * @param callable[] $factories + * @param array $factories */ - public function __construct(array $factories) - { - $this->factories = $factories; + public function __construct( + private array $factories, + ) { } - /** - * {@inheritdoc} - */ - public function has($id) + public function has(string $id): bool { return isset($this->factories[$id]); } - /** - * {@inheritdoc} - */ - public function get($id) + public function get(string $id): mixed { if (!isset($this->factories[$id])) { throw $this->createNotFoundException($id); @@ -67,12 +64,9 @@ trait ServiceLocatorTrait } } - /** - * {@inheritdoc} - */ public function getProvidedServices(): array { - if (null === $this->providedTypes) { + if (!isset($this->providedTypes)) { $this->providedTypes = []; foreach ($this->factories as $name => $factory) { @@ -81,7 +75,7 @@ trait ServiceLocatorTrait } else { $type = (new \ReflectionFunction($factory))->getReturnType(); - $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').$type->getName() : '?'; + $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; } } } @@ -96,16 +90,16 @@ trait ServiceLocatorTrait } else { $last = array_pop($alternatives); if ($alternatives) { - $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); + $message = \sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); } else { - $message = sprintf('only knows about the "%s" service.', $last); + $message = \sprintf('only knows about the "%s" service.', $last); } } if ($this->loading) { - $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); + $message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); } else { - $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); + $message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message); } return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { @@ -114,7 +108,7 @@ trait ServiceLocatorTrait private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface { - return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { + return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { }; } } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php new file mode 100644 index 0000000..844be89 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceMethodsSubscriberTrait.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\Attribute\Required; +use Symfony\Contracts\Service\Attribute\SubscribedService; + +/** + * Implementation of ServiceSubscriberInterface that determines subscribed services + * from methods that have the #[SubscribedService] attribute. + * + * Service ids are available as "ClassName::methodName" so that the implementation + * of subscriber methods can be just `return $this->container->get(__METHOD__);`. + * + * @author Kevin Bond + */ +trait ServiceMethodsSubscriberTrait +{ + protected ContainerInterface $container; + + public static function getSubscribedServices(): array + { + $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; + + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if (self::class !== $method->getDeclaringClass()->name) { + continue; + } + + if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) { + continue; + } + + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); + } + + if (!$returnType = $method->getReturnType()) { + throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); + } + + /* @var SubscribedService $attribute */ + $attribute = $attribute->newInstance(); + $attribute->key ??= self::class.'::'.$method->name; + $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); + + if ($attribute->attributes) { + $services[] = $attribute; + } else { + $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type; + } + } + + return $services; + } + + #[Required] + public function setContainer(ContainerInterface $container): ?ContainerInterface + { + $ret = null; + if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { + $ret = parent::setContainer($container); + } + + $this->container = $container; + + return $ret; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceProviderInterface.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceProviderInterface.php index c60ad0b..2e71f00 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceProviderInterface.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -18,9 +18,18 @@ use Psr\Container\ContainerInterface; * * @author Nicolas Grekas * @author Mateusz Sip + * + * @template-covariant T of mixed */ interface ServiceProviderInterface extends ContainerInterface { + /** + * @return T + */ + public function get(string $id): mixed; + + public function has(string $id): bool; + /** * Returns an associative array of service types keyed by the identifiers provided by the current container. * @@ -30,7 +39,7 @@ interface ServiceProviderInterface extends ContainerInterface * * ['foo' => '?'] means the container provides service name "foo" of unspecified type * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null * - * @return string[] The provided service types, keyed by service names + * @return array The provided service types, keyed by service names */ public function getProvidedServices(): array; } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberInterface.php index 8bb320f..3da1916 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberInterface.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -11,6 +11,8 @@ namespace Symfony\Contracts\Service; +use Symfony\Contracts\Service\Attribute\SubscribedService; + /** * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. * @@ -29,7 +31,8 @@ namespace Symfony\Contracts\Service; interface ServiceSubscriberInterface { /** - * Returns an array of service types required by such instances, optionally keyed by the service names used internally. + * Returns an array of service types (or {@see SubscribedService} objects) required + * by such instances, optionally keyed by the service names used internally. * * For mandatory dependencies: * @@ -47,7 +50,13 @@ interface ServiceSubscriberInterface * * ['?Psr\Log\LoggerInterface'] is a shortcut for * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] * - * @return array The required service types, optionally keyed by service names + * additionally, an array of {@see SubscribedService}'s can be returned: + * + * * [new SubscribedService('logger', Psr\Log\LoggerInterface::class)] + * * [new SubscribedService(type: Psr\Log\LoggerInterface::class, nullable: true)] + * * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))] + * + * @return string[]|SubscribedService[] The required service types, optionally keyed by service names */ - public static function getSubscribedServices(); + public static function getSubscribedServices(): array; } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberTrait.php index ceaef6f..58ea7c5 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -12,50 +12,73 @@ namespace Symfony\Contracts\Service; use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\Attribute\Required; +use Symfony\Contracts\Service\Attribute\SubscribedService; + +trigger_deprecation('symfony/contracts', 'v3.5', '"%s" is deprecated, use "ServiceMethodsSubscriberTrait" instead.', ServiceSubscriberTrait::class); /** - * Implementation of ServiceSubscriberInterface that determines subscribed services from - * private method return types. Service ids are available as "ClassName::methodName". + * Implementation of ServiceSubscriberInterface that determines subscribed services + * from methods that have the #[SubscribedService] attribute. + * + * Service ids are available as "ClassName::methodName" so that the implementation + * of subscriber methods can be just `return $this->container->get(__METHOD__);`. + * + * @property ContainerInterface $container * * @author Kevin Bond + * + * @deprecated since symfony/contracts v3.5, use ServiceMethodsSubscriberTrait instead */ trait ServiceSubscriberTrait { - /** @var ContainerInterface */ - private $container; - public static function getSubscribedServices(): array { - static $services; - - if (null !== $services) { - return $services; - } - - $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; + $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { - if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + if (self::class !== $method->getDeclaringClass()->name) { continue; } - if (self::class === $method->getDeclaringClass()->name && ($returnType = $method->getReturnType()) && !$returnType->isBuiltin()) { - $services[self::class.'::'.$method->name] = '?'.$returnType->getName(); + if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) { + continue; + } + + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); + } + + if (!$returnType = $method->getReturnType()) { + throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); + } + + /** @var SubscribedService $attribute */ + $attribute = $attribute->newInstance(); + $attribute->key ??= self::class.'::'.$method->name; + $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); + + if ($attribute->attributes) { + $services[] = $attribute; + } else { + $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type; } } return $services; } - /** - * @required - */ - public function setContainer(ContainerInterface $container) + #[Required] + public function setContainer(ContainerInterface $container): ?ContainerInterface { + $ret = null; + if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { + $ret = parent::setContainer($container); + } + $this->container = $container; - if (\is_callable(['parent', __FUNCTION__])) { - return parent::setContainer($container); - } + return $ret; } } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php index 6959458..07d12b4 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -11,84 +11,13 @@ namespace Symfony\Contracts\Service\Test; -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; - -class ServiceLocatorTest extends TestCase -{ - public function getServiceLocator(array $factories) - { - return new class($factories) implements ContainerInterface { - use ServiceLocatorTrait; - }; - } - - public function testHas() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - function () { return 'dummy'; }, - ]); - - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - - public function testGet() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$i) { - ++$i; - - return 'bar'; - }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } +class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); +if (false) { /** - * @expectedException \Psr\Container\NotFoundExceptionInterface - * @expectedExceptionMessage The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service. + * @deprecated since PHPUnit 9.6 */ - public function testThrowsOnUndefinedInternalService() + class ServiceLocatorTest { - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } - - /** - * @expectedException \Psr\Container\ContainerExceptionInterface - * @expectedExceptionMessage Circular reference detected for service "bar", path: "bar -> baz -> bar". - */ - public function testThrowsOnCircularReference() - { - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - 'bar' => function () use (&$locator) { return $locator->get('baz'); }, - 'baz' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); } } diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php new file mode 100644 index 0000000..fdd5b27 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; +use Psr\Container\NotFoundExceptionInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +abstract class ServiceLocatorTestCase extends TestCase +{ + /** + * @param array $factories + */ + protected function getServiceLocator(array $factories): ContainerInterface + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator([ + 'foo' => fn () => 'bar', + 'bar' => fn () => 'baz', + fn () => 'dummy', + ]); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator([ + 'foo' => fn () => 'bar', + 'bar' => fn () => 'baz', + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + public function testThrowsOnUndefinedInternalService() + { + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $this->expectException(NotFoundExceptionInterface::class); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + + $locator->get('foo'); + } + + public function testThrowsOnCircularReference() + { + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $this->expectException(ContainerExceptionInterface::class); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + + $locator->get('foo'); + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/service-contracts/composer.json b/xunifriend_RaeeC/vendor/symfony/service-contracts/composer.json index 5434117..bc2e99a 100644 --- a/xunifriend_RaeeC/vendor/symfony/service-contracts/composer.json +++ b/xunifriend_RaeeC/vendor/symfony/service-contracts/composer.json @@ -16,19 +16,27 @@ } ], "require": { - "php": "^7.1.3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "psr/container": "", - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "autoload": { - "psr-4": { "Symfony\\Contracts\\Service\\": "" } + "psr-4": { "Symfony\\Contracts\\Service\\": "" }, + "exclude-from-classmap": [ + "/Test/" + ] }, "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-main": "3.6-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/CHANGELOG.md b/xunifriend_RaeeC/vendor/symfony/var-exporter/CHANGELOG.md index 3406c30..fdca002 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/CHANGELOG.md +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/CHANGELOG.md @@ -1,6 +1,19 @@ CHANGELOG ========= +6.4 +--- + + * Deprecate per-property lazy-initializers + +6.2 +--- + + * Add support for lazy ghost objects and virtual proxies + * Add `Hydrator::hydrate()` + * Preserve PHP references also when using `Hydrator::hydrate()` or `Instantiator::instantiate()` + * Add support for hydrating from native (array) casts + 5.1.0 ----- diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php index 379a765..2acecc4 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php @@ -15,6 +15,6 @@ class ClassNotFoundException extends \Exception implements ExceptionInterface { public function __construct(string $class, ?\Throwable $previous = null) { - parent::__construct(sprintf('Class "%s" not found.', $class), 0, $previous); + parent::__construct(\sprintf('Class "%s" not found.', $class), 0, $previous); } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/LogicException.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/LogicException.php new file mode 100644 index 0000000..619d055 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/LogicException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Exception; + +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php index b9ba225..bc2bcaa 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php @@ -15,6 +15,6 @@ class NotInstantiableTypeException extends \Exception implements ExceptionInterf { public function __construct(string $type, ?\Throwable $previous = null) { - parent::__construct(sprintf('Type "%s" is not instantiable.', $type), 0, $previous); + parent::__construct(\sprintf('Type "%s" is not instantiable.', $type), 0, $previous); } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Hydrator.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Hydrator.php new file mode 100644 index 0000000..b718921 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Hydrator.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\VarExporter\Internal\Hydrator as InternalHydrator; + +/** + * Utility class to hydrate the properties of an object. + * + * @author Nicolas Grekas + */ +final class Hydrator +{ + /** + * Sets the properties of an object, including private and protected ones. + * + * For example: + * + * // Sets the public or protected $object->propertyName property + * Hydrator::hydrate($object, ['propertyName' => $propertyValue]); + * + * // Sets a private property defined on its parent Bar class: + * Hydrator::hydrate($object, ["\0Bar\0privateBarProperty" => $propertyValue]); + * + * // Alternative way to set the private $object->privateBarProperty property + * Hydrator::hydrate($object, [], [ + * Bar::class => ['privateBarProperty' => $propertyValue], + * ]); + * + * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be hydrated + * by using the special "\0" property name to define their internal value: + * + * // Hydrates an SplObjectStorage where $info1 is attached to $obj1, etc. + * Hydrator::hydrate($object, ["\0" => [$obj1, $info1, $obj2, $info2...]]); + * + * // Hydrates an ArrayObject populated with $inputArray + * Hydrator::hydrate($object, ["\0" => [$inputArray]]); + * + * @template T of object + * + * @param T $instance The object to hydrate + * @param array $properties The properties to set on the instance + * @param array> $scopedProperties The properties to set on the instance, + * keyed by their declaring class + * + * @return T + */ + public static function hydrate(object $instance, array $properties = [], array $scopedProperties = []): object + { + if ($properties) { + $class = $instance::class; + $propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class); + + foreach ($properties as $name => &$value) { + [$scope, $name, $writeScope] = $propertyScopes[$name] ?? [$class, $name, $class]; + $scopedProperties[$writeScope ?? $scope][$name] = &$value; + } + unset($value); + } + + foreach ($scopedProperties as $scope => $properties) { + if ($properties) { + (InternalHydrator::$simpleHydrators[$scope] ??= InternalHydrator::getSimpleHydrator($scope))($properties, $instance); + } + } + + return $instance; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Instantiator.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Instantiator.php index 368c769..10200c0 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Instantiator.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Instantiator.php @@ -13,7 +13,6 @@ namespace Symfony\Component\VarExporter; use Symfony\Component\VarExporter\Exception\ExceptionInterface; use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; -use Symfony\Component\VarExporter\Internal\Hydrator; use Symfony\Component\VarExporter\Internal\Registry; /** @@ -26,67 +25,35 @@ final class Instantiator /** * Creates an object and sets its properties without calling its constructor nor any other methods. * - * For example: + * @see Hydrator::hydrate() for examples * - * // creates an empty instance of Foo - * Instantiator::instantiate(Foo::class); + * @template T of object * - * // creates a Foo instance and sets one of its properties - * Instantiator::instantiate(Foo::class, ['propertyName' => $propertyValue]); + * @param class-string $class The class of the instance to create + * @param array $properties The properties to set on the instance + * @param array> $scopedProperties The properties to set on the instance, + * keyed by their declaring class * - * // creates a Foo instance and sets a private property defined on its parent Bar class - * Instantiator::instantiate(Foo::class, [], [ - * Bar::class => ['privateBarProperty' => $propertyValue], - * ]); - * - * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be created - * by using the special "\0" property name to define their internal value: - * - * // creates an SplObjectStorage where $info1 is attached to $obj1, etc. - * Instantiator::instantiate(SplObjectStorage::class, ["\0" => [$obj1, $info1, $obj2, $info2...]]); - * - * // creates an ArrayObject populated with $inputArray - * Instantiator::instantiate(ArrayObject::class, ["\0" => [$inputArray]]); - * - * @param string $class The class of the instance to create - * @param array $properties The properties to set on the instance - * @param array $privateProperties The private properties to set on the instance, - * keyed by their declaring class + * @return T * * @throws ExceptionInterface When the instance cannot be created */ - public static function instantiate(string $class, array $properties = [], array $privateProperties = []): object + public static function instantiate(string $class, array $properties = [], array $scopedProperties = []): object { - $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class); + $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); if (Registry::$cloneable[$class]) { - $wrappedInstance = [clone Registry::$prototypes[$class]]; + $instance = clone Registry::$prototypes[$class]; } elseif (Registry::$instantiableWithoutConstructor[$class]) { - $wrappedInstance = [$reflector->newInstanceWithoutConstructor()]; + $instance = $reflector->newInstanceWithoutConstructor(); } elseif (null === Registry::$prototypes[$class]) { throw new NotInstantiableTypeException($class); - } elseif ($reflector->implementsInterface('Serializable') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize'))) { - $wrappedInstance = [unserialize('C:'.\strlen($class).':"'.$class.'":0:{}')]; + } elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) { + $instance = unserialize('C:'.\strlen($class).':"'.$class.'":0:{}'); } else { - $wrappedInstance = [unserialize('O:'.\strlen($class).':"'.$class.'":0:{}')]; + $instance = unserialize('O:'.\strlen($class).':"'.$class.'":0:{}'); } - if ($properties) { - $privateProperties[$class] = isset($privateProperties[$class]) ? $properties + $privateProperties[$class] : $properties; - } - - foreach ($privateProperties as $class => $properties) { - if (!$properties) { - continue; - } - foreach ($properties as $name => $value) { - // because they're also used for "unserialization", hydrators - // deal with array of instances, so we need to wrap values - $properties[$name] = [$value]; - } - (Hydrator::$hydrators[$class] ?? Hydrator::getHydrator($class))($properties, $wrappedInstance); - } - - return $wrappedInstance[0]; + return $properties || $scopedProperties ? Hydrator::hydrate($instance, $properties, $scopedProperties) : $instance; } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Exporter.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Exporter.php index 51c29e4..13141a4 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Exporter.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Exporter.php @@ -31,9 +31,11 @@ class Exporter * @param int &$objectsCount * @param bool &$valuesAreStatic * + * @return array + * * @throws NotInstantiableTypeException When a value cannot be serialized */ - public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic): array + public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic) { $refs = $values; foreach ($values as $k => $value) { @@ -71,35 +73,26 @@ class Exporter goto handle_value; } - $class = \get_class($value); - $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class); + $class = $value::class; + $reflector = Registry::$reflectors[$class] ??= Registry::getClassReflector($class); $properties = []; + $sleep = null; + $proto = Registry::$prototypes[$class]; if ($reflector->hasMethod('__serialize')) { if (!$reflector->getMethod('__serialize')->isPublic()) { - throw new \Error(sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class)); + throw new \Error(\sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class)); } - if (!\is_array($serializeProperties = $value->__serialize())) { + if (!\is_array($arrayValue = $value->__serialize())) { throw new \TypeError($class.'::__serialize() must return an array'); } if ($reflector->hasMethod('__unserialize')) { - $properties = $serializeProperties; - } else { - foreach ($serializeProperties as $n => $v) { - $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; - $properties[$c][$n] = $v; - } + $properties = $arrayValue; + goto prepare_value; } - - goto prepare_value; - } - - $sleep = null; - $proto = Registry::$prototypes[$class]; - - if (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) { + } elseif (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) { // ArrayIterator and ArrayObject need special care because their "flags" // option changes the behavior of the (array) casting operator. [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto); @@ -115,10 +108,7 @@ class Exporter } $properties = ['SplObjectStorage' => ["\0" => $properties]]; $arrayValue = (array) $value; - } elseif ($value instanceof \Serializable - || $value instanceof \__PHP_Incomplete_Class - || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod - ) { + } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod) { ++$objectsCount; $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; $value = new Reference($id); @@ -142,15 +132,15 @@ class Exporter $i = 0; $n = (string) $name; if ('' === $n || "\0" !== $n[0]) { - $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; + $parent = $reflector; + do { + $p = $parent->hasProperty($n) ? $parent->getProperty($n) : null; + } while (!$p && $parent = $parent->getParentClass()); + + $c = $p && (!$p->isPublic() || (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly())) ? $p->class : 'stdClass'; } elseif ('*' === $n[1]) { $n = substr($n, 3); $c = $reflector->getProperty($n)->class; - if ('Error' === $c) { - $c = 'TypeError'; - } elseif ('Exception' === $c) { - $c = 'ErrorException'; - } } else { $i = strpos($n, "\0", 2); $c = substr($n, 1, $i - 1); @@ -163,13 +153,19 @@ class Exporter } unset($sleep[$name], $sleep[$n]); } - if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) { + if ("\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) { $properties[$c][$n] = $v; + } elseif (!\array_key_exists($name, $proto) || $proto[$name] !== $v) { + $properties[match ($c) { + 'Error' => 'TypeError', + 'Exception' => 'ErrorException', + default => $c, + }][$n] = $v; } } if ($sleep) { foreach ($sleep as $n => $v) { - trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE); + trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE); } } if (method_exists($class, '__unserialize')) { @@ -196,7 +192,7 @@ class Exporter return $values; } - public static function export($value, string $indent = '') + public static function export($value, $indent = '') { switch (true) { case \is_int($value) || \is_float($value): return var_export($value, true); @@ -222,10 +218,10 @@ class Exporter $subIndent = $indent.' '; if (\is_string($value)) { - $code = sprintf("'%s'", addcslashes($value, "'\\")); + $code = \sprintf("'%s'", addcslashes($value, "'\\")); $code = preg_replace_callback("/((?:[\\0\\r\\n]|\u{202A}|\u{202B}|\u{202D}|\u{202E}|\u{2066}|\u{2067}|\u{2068}|\u{202C}|\u{2069})++)(.)/", function ($m) use ($subIndent) { - $m[1] = sprintf('\'."%s".\'', str_replace( + $m[1] = \sprintf('\'."%s".\'', str_replace( ["\0", "\r", "\n", "\u{202A}", "\u{202B}", "\u{202D}", "\u{202E}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{202C}", "\u{2069}", '\n\\'], ['\0', '\r', '\n', '\u{202A}', '\u{202B}', '\u{202D}', '\u{202E}', '\u{2066}', '\u{2067}', '\u{2068}', '\u{202C}', '\u{2069}', '\n"'."\n".$subIndent.'."\\'], $m[1] @@ -235,7 +231,7 @@ class Exporter return substr($m[1], 0, -2); } - if ('n".\'' === substr($m[1], -4)) { + if (str_ends_with($m[1], 'n".\'')) { return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2); } @@ -283,7 +279,7 @@ class Exporter return self::exportHydrator($value, $indent, $subIndent); } - throw new \UnexpectedValueException(sprintf('Cannot export value of type "%s".', get_debug_type($value))); + throw new \UnexpectedValueException(\sprintf('Cannot export value of type "%s".', get_debug_type($value))); } private static function exportRegistry(Registry $value, string $indent, string $subIndent): string @@ -373,7 +369,7 @@ class Exporter self::export($value->wakeups, $subIndent), ]; - return '\\'.\get_class($value)."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')'; + return '\\'.$value::class."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')'; } /** @@ -383,7 +379,7 @@ class Exporter private static function getArrayObjectProperties($value, $proto): array { $reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject'; - $reflector = Registry::$reflectors[$reflector] ?? Registry::getClassReflector($reflector); + $reflector = Registry::$reflectors[$reflector] ??= Registry::getClassReflector($reflector); $properties = [ $arrayValue = (array) $value, diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Hydrator.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Hydrator.php index 5ed6bdc..ebbceed 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Hydrator.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Hydrator.php @@ -20,7 +20,12 @@ use Symfony\Component\VarExporter\Exception\ClassNotFoundException; */ class Hydrator { - public static $hydrators = []; + public const PROPERTY_HAS_HOOKS = 1; + public const PROPERTY_NOT_BY_REF = 2; + + public static array $hydrators = []; + public static array $simpleHydrators = []; + public static array $propertyScopes = []; public $registry; public $values; @@ -40,7 +45,7 @@ class Hydrator public static function hydrate($objects, $values, $properties, $value, $wakeups) { foreach ($properties as $class => $vars) { - (self::$hydrators[$class] ?? self::getHydrator($class))($vars, $objects); + (self::$hydrators[$class] ??= self::getHydrator($class))($vars, $objects); } foreach ($wakeups as $k => $v) { if (\is_array($v)) { @@ -55,31 +60,33 @@ class Hydrator public static function getHydrator($class) { + $baseHydrator = self::$hydrators['stdClass'] ??= static function ($properties, $objects) { + foreach ($properties as $name => $values) { + foreach ($values as $i => $v) { + $objects[$i]->$name = $v; + } + } + }; + switch ($class) { case 'stdClass': - return self::$hydrators[$class] = static function ($properties, $objects) { - foreach ($properties as $name => $values) { - foreach ($values as $i => $v) { - $objects[$i]->$name = $v; - } - } - }; + return $baseHydrator; case 'ErrorException': - return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \ErrorException { + return $baseHydrator->bindTo(null, new class extends \ErrorException { }); case 'TypeError': - return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \Error { + return $baseHydrator->bindTo(null, new class extends \Error { }); case 'SplObjectStorage': - return self::$hydrators[$class] = static function ($properties, $objects) { + return static function ($properties, $objects) { foreach ($properties as $name => $values) { if ("\0" === $name) { foreach ($values as $i => $v) { for ($j = 0; $j < \count($v); ++$j) { - $objects[$i]->attach($v[$j], $v[++$j]); + $objects[$i][$v[$j]] = $v[++$j]; } } continue; @@ -99,9 +106,9 @@ class Hydrator switch ($class) { case 'ArrayIterator': case 'ArrayObject': - $constructor = \Closure::fromCallable([$classReflector->getConstructor(), 'invokeArgs']); + $constructor = $classReflector->getConstructor()->invokeArgs(...); - return self::$hydrators[$class] = static function ($properties, $objects) use ($constructor) { + return static function ($properties, $objects) use ($constructor) { foreach ($properties as $name => $values) { if ("\0" !== $name) { foreach ($values as $i => $v) { @@ -116,26 +123,25 @@ class Hydrator } if (!$classReflector->isInternal()) { - return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, $class); + return $baseHydrator->bindTo(null, $class); } if ($classReflector->name !== $class) { - return self::$hydrators[$classReflector->name] ?? self::getHydrator($classReflector->name); + return self::$hydrators[$classReflector->name] ??= self::getHydrator($classReflector->name); } $propertySetters = []; foreach ($classReflector->getProperties() as $propertyReflector) { if (!$propertyReflector->isStatic()) { - $propertyReflector->setAccessible(true); - $propertySetters[$propertyReflector->name] = \Closure::fromCallable([$propertyReflector, 'setValue']); + $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); } } if (!$propertySetters) { - return self::$hydrators[$class] = self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'); + return $baseHydrator; } - return self::$hydrators[$class] = static function ($properties, $objects) use ($propertySetters) { + return static function ($properties, $objects) use ($propertySetters) { foreach ($properties as $name => $values) { if ($setValue = $propertySetters[$name] ?? null) { foreach ($values as $i => $v) { @@ -149,4 +155,175 @@ class Hydrator } }; } + + public static function getSimpleHydrator($class) + { + $baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) { + $notByRef = (array) $this; + + foreach ($properties as $name => &$value) { + if (!$noRef = $notByRef[$name] ?? false) { + $object->$name = $value; + $object->$name = &$value; + } elseif (true !== $noRef) { + $noRef($object, $value); + } else { + $object->$name = $value; + } + } + })->bindTo(new \stdClass()); + + switch ($class) { + case 'stdClass': + return $baseHydrator; + + case 'ErrorException': + return $baseHydrator->bindTo(new \stdClass(), new class extends \ErrorException { + }); + + case 'TypeError': + return $baseHydrator->bindTo(new \stdClass(), new class extends \Error { + }); + + case 'SplObjectStorage': + return static function ($properties, $object) { + foreach ($properties as $name => &$value) { + if ("\0" !== $name) { + $object->$name = $value; + $object->$name = &$value; + continue; + } + for ($i = 0; $i < \count($value); ++$i) { + $object[$value[$i]] = $value[++$i]; + } + } + }; + } + + if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) { + throw new ClassNotFoundException($class); + } + $classReflector = new \ReflectionClass($class); + + switch ($class) { + case 'ArrayIterator': + case 'ArrayObject': + $constructor = $classReflector->getConstructor()->invokeArgs(...); + + return static function ($properties, $object) use ($constructor) { + foreach ($properties as $name => &$value) { + if ("\0" === $name) { + $constructor($object, $value); + } else { + $object->$name = $value; + $object->$name = &$value; + } + } + }; + } + + if (!$classReflector->isInternal()) { + $notByRef = new \stdClass(); + foreach ($classReflector->getProperties() as $propertyReflector) { + if ($propertyReflector->isStatic()) { + continue; + } + if (\PHP_VERSION_ID >= 80400 && !$propertyReflector->isAbstract() && $propertyReflector->getHooks()) { + $notByRef->{$propertyReflector->name} = $propertyReflector->setRawValue(...); + } elseif ($propertyReflector->isReadOnly()) { + $notByRef->{$propertyReflector->name} = true; + } + } + + return $baseHydrator->bindTo($notByRef, $class); + } + + if ($classReflector->name !== $class) { + return self::$simpleHydrators[$classReflector->name] ??= self::getSimpleHydrator($classReflector->name); + } + + $propertySetters = []; + foreach ($classReflector->getProperties() as $propertyReflector) { + if (!$propertyReflector->isStatic()) { + $propertySetters[$propertyReflector->name] = $propertyReflector->setValue(...); + } + } + + if (!$propertySetters) { + return $baseHydrator; + } + + return static function ($properties, $object) use ($propertySetters) { + foreach ($properties as $name => &$value) { + if ($setValue = $propertySetters[$name] ?? null) { + $setValue($object, $value); + } else { + $object->$name = $value; + $object->$name = &$value; + } + } + }; + } + + /** + * @return array + */ + public static function getPropertyScopes($class) + { + $propertyScopes = []; + $r = new \ReflectionClass($class); + + foreach ($r->getProperties() as $property) { + $flags = $property->getModifiers(); + + if (\ReflectionProperty::IS_STATIC & $flags) { + continue; + } + $name = $property->name; + $access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0); + + if (\PHP_VERSION_ID >= 80400 && !$property->isAbstract() && $h = $property->getHooks()) { + $access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0); + } + + if (\ReflectionProperty::IS_PRIVATE & $flags) { + $propertyScopes["\0$class\0$name"] = $propertyScopes[$name] = [$class, $name, null, $access, $property]; + + continue; + } + + $propertyScopes[$name] = [$class, $name, null, $access, $property]; + + if ($flags & (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY)) { + $propertyScopes[$name][2] = $property->class; + } + + if (\ReflectionProperty::IS_PROTECTED & $flags) { + $propertyScopes["\0*\0$name"] = $propertyScopes[$name]; + } + } + + while ($r = $r->getParentClass()) { + $class = $r->name; + + foreach ($r->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) { + $flags = $property->getModifiers(); + + if (\ReflectionProperty::IS_STATIC & $flags) { + continue; + } + $name = $property->name; + $access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0); + + if (\PHP_VERSION_ID >= 80400 && $h = $property->getHooks()) { + $access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0); + } + + $propertyScopes["\0$class\0$name"] = [$class, $name, null, $access, $property]; + $propertyScopes[$name] ??= $propertyScopes["\0$class\0$name"]; + } + } + + return $propertyScopes; + } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php new file mode 100644 index 0000000..d096be8 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectRegistry.php @@ -0,0 +1,177 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +/** + * Stores the state of lazy objects and caches related reflection information. + * + * As a micro-optimization, this class uses no type declarations. + * + * @internal + */ +class LazyObjectRegistry +{ + /** + * @var array + */ + public static array $classReflectors = []; + + /** + * @var array> + */ + public static array $defaultProperties = []; + + /** + * @var array> + */ + public static array $classResetters = []; + + /** + * @var array + */ + public static array $classAccessors = []; + + /** + * @var array + */ + public static array $parentMethods = []; + + public static ?\Closure $noInitializerState = null; + + public static function getClassResetters($class) + { + $classProperties = []; + $hookedProperties = []; + + if ((self::$classReflectors[$class] ??= new \ReflectionClass($class))->isInternal()) { + $propertyScopes = []; + } else { + $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); + } + + foreach ($propertyScopes as $key => [$scope, $name, $writeScope, $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + + if ($k !== $key || "\0$class\0lazyObjectState" === $k) { + continue; + } + + if ($access & Hydrator::PROPERTY_HAS_HOOKS) { + $hookedProperties[$k] = true; + } else { + $classProperties[$writeScope ?? $scope][$name] = $key; + } + } + + $resetters = []; + foreach ($classProperties as $scope => $properties) { + $resetters[] = \Closure::bind(static function ($instance, $skippedProperties, $onlyProperties = null) use ($properties) { + foreach ($properties as $name => $key) { + if (!\array_key_exists($key, $skippedProperties) && (null === $onlyProperties || \array_key_exists($key, $onlyProperties))) { + unset($instance->$name); + } + } + }, null, $scope); + } + + $resetters[] = static function ($instance, $skippedProperties, $onlyProperties = null) use ($hookedProperties) { + foreach ((array) $instance as $name => $value) { + if ("\0" !== ($name[0] ?? '') + && !\array_key_exists($name, $skippedProperties) + && (null === $onlyProperties || \array_key_exists($name, $onlyProperties)) + && !isset($hookedProperties[$name]) + ) { + unset($instance->$name); + } + } + }; + + return $resetters; + } + + public static function getClassAccessors($class) + { + return \Closure::bind(static fn () => [ + 'get' => static function &($instance, $name, $notByRef) { + if (!$notByRef) { + return $instance->$name; + } + $value = $instance->$name; + + return $value; + }, + 'set' => static function ($instance, $name, $value) { + $instance->$name = $value; + }, + 'isset' => static fn ($instance, $name) => isset($instance->$name), + 'unset' => static function ($instance, $name) { + unset($instance->$name); + }, + ], null, \Closure::class === $class ? null : $class)(); + } + + public static function getParentMethods($class) + { + $parent = get_parent_class($class); + $methods = []; + + foreach (['set', 'isset', 'unset', 'clone', 'serialize', 'unserialize', 'sleep', 'wakeup', 'destruct', 'get'] as $method) { + if (!$parent || !method_exists($parent, '__'.$method)) { + $methods[$method] = false; + } else { + $m = new \ReflectionMethod($parent, '__'.$method); + $methods[$method] = !$m->isAbstract() && !$m->isPrivate(); + } + } + + $methods['get'] = $methods['get'] ? ($m->returnsReference() ? 2 : 1) : 0; + + return $methods; + } + + public static function getScopeForRead($propertyScopes, $class, $property) + { + if (!isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) { + return null; + } + $frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; + + if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) { + $scope = $frame['object']->class; + } + if ('*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { + return null; + } + + return $scope; + } + + public static function getScopeForWrite($propertyScopes, $class, $property, $flags) + { + if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET | \ReflectionProperty::IS_PROTECTED_SET : 0)))) { + return null; + } + $frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; + + if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) { + $scope = $frame['object']->class; + } + if ($flags & (\ReflectionProperty::IS_PRIVATE | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY))) { + return $scope; + } + if ($flags & (\ReflectionProperty::IS_PROTECTED | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PROTECTED_SET : 0)) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { + return null; + } + + return $scope; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectState.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectState.php new file mode 100644 index 0000000..619555e --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectState.php @@ -0,0 +1,133 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +use Symfony\Component\VarExporter\Hydrator as PublicHydrator; + +/** + * Keeps the state of lazy objects. + * + * As a micro-optimization, this class uses no type declarations. + * + * @internal + */ +class LazyObjectState +{ + public const STATUS_UNINITIALIZED_FULL = 1; + public const STATUS_UNINITIALIZED_PARTIAL = 2; + public const STATUS_INITIALIZED_FULL = 3; + public const STATUS_INITIALIZED_PARTIAL = 4; + + /** + * @var array + */ + public readonly array $skippedProperties; + + /** + * @var self::STATUS_* + */ + public int $status = 0; + + public object $realInstance; + + public function __construct(public readonly \Closure|array $initializer, $skippedProperties = []) + { + $this->skippedProperties = $skippedProperties; + $this->status = \is_array($initializer) ? self::STATUS_UNINITIALIZED_PARTIAL : self::STATUS_UNINITIALIZED_FULL; + } + + public function initialize($instance, $propertyName, $writeScope) + { + if (self::STATUS_INITIALIZED_FULL === $this->status) { + return self::STATUS_INITIALIZED_FULL; + } + + if (\is_array($this->initializer)) { + $class = $instance::class; + $writeScope ??= $class; + $propertyScopes = Hydrator::$propertyScopes[$class]; + $propertyScopes[$k = "\0$writeScope\0$propertyName"] ?? $propertyScopes[$k = "\0*\0$propertyName"] ?? $k = $propertyName; + + if ($initializer = $this->initializer[$k] ?? null) { + $value = $initializer(...[$instance, $propertyName, $writeScope, LazyObjectRegistry::$defaultProperties[$class][$k] ?? null]); + $accessor = LazyObjectRegistry::$classAccessors[$writeScope] ??= LazyObjectRegistry::getClassAccessors($writeScope); + $accessor['set']($instance, $propertyName, $value); + + return $this->status = self::STATUS_INITIALIZED_PARTIAL; + } + + if ($initializer = $this->initializer["\0"] ?? null) { + if (!\is_array($values = $initializer($instance, LazyObjectRegistry::$defaultProperties[$class]))) { + throw new \TypeError(\sprintf('The lazy-initializer defined for instance of "%s" must return an array, got "%s".', $class, get_debug_type($values))); + } + $properties = (array) $instance; + foreach ($values as $key => $value) { + if (!\array_key_exists($key, $properties) && [$scope, $name, $writeScope] = $propertyScopes[$key] ?? null) { + $scope = $writeScope ?? $scope; + $accessor = LazyObjectRegistry::$classAccessors[$scope] ??= LazyObjectRegistry::getClassAccessors($scope); + $accessor['set']($instance, $name, $value); + + if ($k === $key) { + $this->status = self::STATUS_INITIALIZED_PARTIAL; + } + } + } + } + + return $this->status; + } + + if (self::STATUS_INITIALIZED_PARTIAL === $this->status) { + return self::STATUS_INITIALIZED_PARTIAL; + } + + $this->status = self::STATUS_INITIALIZED_PARTIAL; + + try { + if ($defaultProperties = array_diff_key(LazyObjectRegistry::$defaultProperties[$instance::class], $this->skippedProperties)) { + PublicHydrator::hydrate($instance, $defaultProperties); + } + + ($this->initializer)($instance); + } catch (\Throwable $e) { + $this->status = self::STATUS_UNINITIALIZED_FULL; + $this->reset($instance); + + throw $e; + } + + return $this->status = self::STATUS_INITIALIZED_FULL; + } + + public function reset($instance): void + { + $class = $instance::class; + $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); + $skippedProperties = $this->skippedProperties; + $properties = (array) $instance; + $onlyProperties = \is_array($this->initializer) ? $this->initializer : null; + + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + + if ($k === $key && ($access & Hydrator::PROPERTY_HAS_HOOKS || ($access >> 2) & \ReflectionProperty::IS_READONLY || !\array_key_exists($k, $properties))) { + $skippedProperties[$k] = true; + } + } + + foreach (LazyObjectRegistry::$classResetters[$class] as $reset) { + $reset($instance, $skippedProperties, $onlyProperties); + } + + $this->status = self::STATUS_INITIALIZED_FULL === $this->status ? self::STATUS_UNINITIALIZED_FULL : self::STATUS_UNINITIALIZED_PARTIAL; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php new file mode 100644 index 0000000..4a6f232 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/LazyObjectTrait.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +use Symfony\Component\Serializer\Attribute\Ignore; + +if (\PHP_VERSION_ID >= 80300) { + /** + * @internal + */ + trait LazyObjectTrait + { + #[Ignore] + private readonly LazyObjectState $lazyObjectState; + } +} else { + /** + * @internal + */ + trait LazyObjectTrait + { + #[Ignore] + private LazyObjectState $lazyObjectState; + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Reference.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Reference.php index e371c07..2c7bd7b 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Reference.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Reference.php @@ -18,13 +18,11 @@ namespace Symfony\Component\VarExporter\Internal; */ class Reference { - public $id; - public $value; - public $count = 0; + public int $count = 0; - public function __construct(int $id, $value = null) - { - $this->id = $id; - $this->value = $value; + public function __construct( + public readonly int $id, + public readonly mixed $value = null, + ) { } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Registry.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Registry.php index 24b77b9..db05bbb 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Registry.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/Internal/Registry.php @@ -21,11 +21,11 @@ use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; */ class Registry { - public static $reflectors = []; - public static $prototypes = []; - public static $factories = []; - public static $cloneable = []; - public static $instantiableWithoutConstructor = []; + public static array $reflectors = []; + public static array $prototypes = []; + public static array $factories = []; + public static array $cloneable = []; + public static array $instantiableWithoutConstructor = []; public $classes = []; @@ -58,9 +58,9 @@ class Registry public static function f($class) { - $reflector = self::$reflectors[$class] ?? self::getClassReflector($class, true, false); + $reflector = self::$reflectors[$class] ??= self::getClassReflector($class, true, false); - return self::$factories[$class] = \Closure::fromCallable([$reflector, 'newInstanceWithoutConstructor']); + return self::$factories[$class] = [$reflector, 'newInstanceWithoutConstructor'](...); } public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null) @@ -75,17 +75,17 @@ class Registry } elseif (!$isClass || $reflector->isAbstract()) { throw new NotInstantiableTypeException($class); } elseif ($reflector->name !== $class) { - $reflector = self::$reflectors[$name = $reflector->name] ?? self::getClassReflector($name, false, $cloneable); + $reflector = self::$reflectors[$name = $reflector->name] ??= self::getClassReflector($name, false, $cloneable); self::$cloneable[$class] = self::$cloneable[$name]; self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name]; self::$prototypes[$class] = self::$prototypes[$name]; - return self::$reflectors[$class] = $reflector; + return $reflector; } else { try { $proto = $reflector->newInstanceWithoutConstructor(); $instantiableWithoutConstructor = true; - } catch (\ReflectionException $e) { + } catch (\ReflectionException) { $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:'; if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) { $proto = null; @@ -103,7 +103,7 @@ class Registry } } } - if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__serialize'))) { + if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) { try { serialize($proto); } catch (\Exception $e) { @@ -113,7 +113,7 @@ class Registry } if (null === $cloneable) { - if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize')))) { + if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && !method_exists($class, '__unserialize'))) { throw new NotInstantiableTypeException($class); } @@ -132,15 +132,13 @@ class Registry new \ReflectionProperty(\Error::class, 'trace'), new \ReflectionProperty(\Exception::class, 'trace'), ]; - $setTrace[0]->setAccessible(true); - $setTrace[1]->setAccessible(true); - $setTrace[0] = \Closure::fromCallable([$setTrace[0], 'setValue']); - $setTrace[1] = \Closure::fromCallable([$setTrace[1], 'setValue']); + $setTrace[0] = $setTrace[0]->setValue(...); + $setTrace[1] = $setTrace[1]->setValue(...); } $setTrace[$proto instanceof \Exception]($proto, []); } - return self::$reflectors[$class] = $reflector; + return $reflector; } } diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyGhostTrait.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyGhostTrait.php new file mode 100644 index 0000000..79d8a0f --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyGhostTrait.php @@ -0,0 +1,409 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\Serializer\Attribute\Ignore; +use Symfony\Component\VarExporter\Internal\Hydrator; +use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; +use Symfony\Component\VarExporter\Internal\LazyObjectState; +use Symfony\Component\VarExporter\Internal\LazyObjectTrait; + +trait LazyGhostTrait +{ + use LazyObjectTrait; + + /** + * Creates a lazy-loading ghost instance. + * + * Skipped properties should be indexed by their array-cast identifier, see + * https://php.net/manual/language.types.array#language.types.array.casting + * + * @param (\Closure(static):void $initializer The closure should initialize the object it receives as argument + * @param array|null $skippedProperties An array indexed by the properties to skip, a.k.a. the ones + * that the initializer doesn't initialize, if any + * @param static|null $instance + */ + public static function createLazyGhost(\Closure|array $initializer, ?array $skippedProperties = null, ?object $instance = null): static + { + if (\is_array($initializer)) { + trigger_deprecation('symfony/var-exporter', '6.4', 'Per-property lazy-initializers are deprecated and won\'t be supported anymore in 7.0, use an object initializer instead.'); + } + + $onlyProperties = null === $skippedProperties && \is_array($initializer) ? $initializer : null; + + if (self::class !== $class = $instance ? $instance::class : static::class) { + $skippedProperties["\0".self::class."\0lazyObjectState"] = true; + } elseif (\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) { + Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; + } + + $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); + Registry::$defaultProperties[$class] ??= (array) $instance; + $instance->lazyObjectState = new LazyObjectState($initializer, $skippedProperties ??= []); + + foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { + $reset($instance, $skippedProperties, $onlyProperties); + } + + return $instance; + } + + /** + * Returns whether the object is initialized. + * + * @param $partial Whether partially initialized objects should be considered as initialized + */ + #[Ignore] + public function isLazyObjectInitialized(bool $partial = false): bool + { + if (!$state = $this->lazyObjectState ?? null) { + return true; + } + + if (!\is_array($state->initializer)) { + return LazyObjectState::STATUS_INITIALIZED_FULL === $state->status; + } + + $class = $this::class; + $properties = (array) $this; + + if ($partial) { + return (bool) array_intersect_key($state->initializer, $properties); + } + + $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); + foreach ($state->initializer as $key => $initializer) { + if (!\array_key_exists($key, $properties) && isset($propertyScopes[$key])) { + return false; + } + } + + return true; + } + + /** + * Forces initialization of a lazy object and returns it. + */ + public function initializeLazyObject(): static + { + if (!$state = $this->lazyObjectState ?? null) { + return $this; + } + + if (!\is_array($state->initializer)) { + if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { + $state->initialize($this, '', null); + } + + return $this; + } + + $values = isset($state->initializer["\0"]) ? null : []; + + $class = $this::class; + $properties = (array) $this; + $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); + foreach ($state->initializer as $key => $initializer) { + if (\array_key_exists($key, $properties) || ![$scope, $name, $writeScope] = $propertyScopes[$key] ?? null) { + continue; + } + $scope = $writeScope ?? $scope; + + if (null === $values) { + if (!\is_array($values = ($state->initializer["\0"])($this, Registry::$defaultProperties[$class]))) { + throw new \TypeError(\sprintf('The lazy-initializer defined for instance of "%s" must return an array, got "%s".', $class, get_debug_type($values))); + } + + if (\array_key_exists($key, $properties = (array) $this)) { + continue; + } + } + + if (\array_key_exists($key, $values)) { + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + $accessor['set']($this, $name, $properties[$key] = $values[$key]); + } else { + $state->initialize($this, $name, $scope); + $properties = (array) $this; + } + } + + return $this; + } + + /** + * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object + */ + public function resetLazyObject(): bool + { + if (!$state = $this->lazyObjectState ?? null) { + return false; + } + + if (LazyObjectState::STATUS_UNINITIALIZED_FULL !== $state->status) { + $state->reset($this); + } + + return true; + } + + public function &__get($name): mixed + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + $notByRef = 0; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); + $state = $this->lazyObjectState ?? null; + + if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"]))) { + $notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF; + + if (LazyObjectState::STATUS_INITIALIZED_FULL === $state->status) { + // Work around php/php-src#12695 + $property = null === $scope ? $name : "\0$scope\0$name"; + $property = $propertyScopes[$property][4] + ?? Hydrator::$propertyScopes[$this::class][$property][4] = new \ReflectionProperty($scope ?? $class, $name); + } else { + $property = null; + } + if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) { + $scope ??= $writeScope; + } + + if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope)) { + goto get_in_scope; + } + } + } + + if ($parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']) { + if (2 === $parent) { + return parent::__get($name); + } + $value = parent::__get($name); + + return $value; + } + + if (null === $class) { + $frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; + trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $this::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); + } + + get_in_scope: + + try { + if (null === $scope) { + if (!$notByRef) { + return $this->$name; + } + $value = $this->$name; + + return $value; + } + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + + return $accessor['get']($this, $name, $notByRef); + } catch (\Error $e) { + if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { + throw $e; + } + + try { + if (null === $scope) { + $this->$name = []; + + return $this->$name; + } + + $accessor['set']($this, $name, []); + + return $accessor['get']($this, $name, $notByRef); + } catch (\Error) { + if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) { + throw new \Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious()); + } + + throw $e; + } + } + } + + public function __set($name, $value): void + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); + $state = $this->lazyObjectState ?? null; + + if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) + && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status + ) { + if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { + $state->initialize($this, $name, $writeScope ?? $scope); + } + goto set_in_scope; + } + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { + parent::__set($name, $value); + + return; + } + + set_in_scope: + + if (null === $scope) { + $this->$name = $value; + } else { + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + $accessor['set']($this, $name, $value); + } + } + + public function __isset($name): bool + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + + if ([$class, , $writeScope] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); + $state = $this->lazyObjectState ?? null; + + if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"])) + && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status + && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope) + ) { + goto isset_in_scope; + } + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { + return parent::__isset($name); + } + + isset_in_scope: + + if (null === $scope) { + return isset($this->$name); + } + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + + return $accessor['isset']($this, $name); + } + + public function __unset($name): void + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); + $state = $this->lazyObjectState ?? null; + + if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) + && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status + ) { + if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { + $state->initialize($this, $name, $writeScope ?? $scope); + } + goto unset_in_scope; + } + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { + parent::__unset($name); + + return; + } + + unset_in_scope: + + if (null === $scope) { + unset($this->$name); + } else { + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + $accessor['unset']($this, $name); + } + } + + public function __clone(): void + { + if ($state = $this->lazyObjectState ?? null) { + $this->lazyObjectState = clone $state; + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { + parent::__clone(); + } + } + + public function __serialize(): array + { + $class = self::class; + + if ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { + $properties = parent::__serialize(); + } else { + $this->initializeLazyObject(); + $properties = (array) $this; + } + unset($properties["\0$class\0lazyObjectState"]); + + if (Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { + return $properties; + } + + $scope = get_parent_class($class); + $data = []; + + foreach (parent::__sleep() as $name) { + $value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null; + + if (null === $k) { + trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); + } else { + $data[$k] = $value; + } + } + + return $data; + } + + public function __destruct() + { + $state = $this->lazyObjectState ?? null; + + if ($state && \in_array($state->status, [LazyObjectState::STATUS_UNINITIALIZED_FULL, LazyObjectState::STATUS_UNINITIALIZED_PARTIAL], true)) { + return; + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { + parent::__destruct(); + } + } + + #[Ignore] + private function setLazyObjectAsInitialized(bool $initialized): void + { + $state = $this->lazyObjectState ?? null; + + if ($state && !\is_array($state->initializer)) { + $state->status = $initialized ? LazyObjectState::STATUS_INITIALIZED_FULL : LazyObjectState::STATUS_UNINITIALIZED_FULL; + } + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyObjectInterface.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyObjectInterface.php new file mode 100644 index 0000000..3670884 --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyObjectInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +interface LazyObjectInterface +{ + /** + * Returns whether the object is initialized. + * + * @param $partial Whether partially initialized objects should be considered as initialized + */ + public function isLazyObjectInitialized(bool $partial = false): bool; + + /** + * Forces initialization of a lazy object and returns it. + */ + public function initializeLazyObject(): object; + + /** + * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object + */ + public function resetLazyObject(): bool; +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyProxyTrait.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyProxyTrait.php new file mode 100644 index 0000000..af009ae --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/LazyProxyTrait.php @@ -0,0 +1,355 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\Serializer\Attribute\Ignore; +use Symfony\Component\VarExporter\Hydrator as PublicHydrator; +use Symfony\Component\VarExporter\Internal\Hydrator; +use Symfony\Component\VarExporter\Internal\LazyObjectRegistry as Registry; +use Symfony\Component\VarExporter\Internal\LazyObjectState; +use Symfony\Component\VarExporter\Internal\LazyObjectTrait; + +trait LazyProxyTrait +{ + use LazyObjectTrait; + + /** + * Creates a lazy-loading virtual proxy. + * + * @param \Closure():object $initializer Returns the proxied object + * @param static|null $instance + */ + public static function createLazyProxy(\Closure $initializer, ?object $instance = null): static + { + if (self::class !== $class = $instance ? $instance::class : static::class) { + $skippedProperties = ["\0".self::class."\0lazyObjectState" => true]; + } elseif (\defined($class.'::LAZY_OBJECT_PROPERTY_SCOPES')) { + Hydrator::$propertyScopes[$class] ??= $class::LAZY_OBJECT_PROPERTY_SCOPES; + } + + $instance ??= (Registry::$classReflectors[$class] ??= new \ReflectionClass($class))->newInstanceWithoutConstructor(); + $instance->lazyObjectState = new LazyObjectState($initializer); + + foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { + $reset($instance, $skippedProperties ??= []); + } + + return $instance; + } + + /** + * Returns whether the object is initialized. + * + * @param $partial Whether partially initialized objects should be considered as initialized + */ + #[Ignore] + public function isLazyObjectInitialized(bool $partial = false): bool + { + return !isset($this->lazyObjectState) || isset($this->lazyObjectState->realInstance) || Registry::$noInitializerState === $this->lazyObjectState->initializer; + } + + /** + * Forces initialization of a lazy object and returns it. + */ + public function initializeLazyObject(): parent + { + if ($state = $this->lazyObjectState ?? null) { + return $state->realInstance ??= ($state->initializer)(); + } + + return $this; + } + + /** + * @return bool Returns false when the object cannot be reset, ie when it's not a lazy object + */ + public function resetLazyObject(): bool + { + if (!isset($this->lazyObjectState) || Registry::$noInitializerState === $this->lazyObjectState->initializer) { + return false; + } + + unset($this->lazyObjectState->realInstance); + + return true; + } + + public function &__get($name): mixed + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + $instance = $this; + $notByRef = 0; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF; + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); + + if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } + if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) { + $scope ??= $writeScope; + } + $parent = 2; + goto get_in_scope; + } + } + $parent = (Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['get']; + + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } else { + if (2 === $parent) { + return parent::__get($name); + } + $value = parent::__get($name); + + return $value; + } + + if (!$parent && null === $class && !\array_key_exists($name, (array) $instance)) { + $frame = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0]; + trigger_error(\sprintf('Undefined property: %s::$%s in %s on line %s', $instance::class, $name, $frame['file'], $frame['line']), \E_USER_NOTICE); + } + + get_in_scope: + $notByRef = $notByRef || 1 === $parent; + + try { + if (null === $scope) { + if (!$notByRef) { + return $instance->$name; + } + $value = $instance->$name; + + return $value; + } + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + + return $accessor['get']($instance, $name, $notByRef); + } catch (\Error $e) { + if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { + throw $e; + } + + try { + if (null === $scope) { + $instance->$name = []; + + return $instance->$name; + } + + $accessor['set']($instance, $name, []); + + return $accessor['get']($instance, $name, $notByRef); + } catch (\Error) { + throw $e; + } + } + } + + public function __set($name, $value): void + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + $instance = $this; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); + + if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } + goto set_in_scope; + } + } + + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['set']) { + parent::__set($name, $value); + + return; + } + + set_in_scope: + + if (null === $scope) { + $instance->$name = $value; + } else { + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + $accessor['set']($instance, $name, $value); + } + } + + public function __isset($name): bool + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + $instance = $this; + + if ([$class] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); + + if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } + goto isset_in_scope; + } + } + + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['isset']) { + return parent::__isset($name); + } + + isset_in_scope: + + if (null === $scope) { + return isset($instance->$name); + } + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + + return $accessor['isset']($instance, $name); + } + + public function __unset($name): void + { + $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); + $scope = null; + $instance = $this; + + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); + + if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } + goto unset_in_scope; + } + } + + if ($state = $this->lazyObjectState ?? null) { + $instance = $state->realInstance ??= ($state->initializer)(); + } elseif ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['unset']) { + parent::__unset($name); + + return; + } + + unset_in_scope: + + if (null === $scope) { + unset($instance->$name); + } else { + $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); + $accessor['unset']($instance, $name); + } + } + + public function __clone(): void + { + if (!isset($this->lazyObjectState)) { + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['clone']) { + parent::__clone(); + } + + return; + } + + $this->lazyObjectState = clone $this->lazyObjectState; + + if (isset($this->lazyObjectState->realInstance)) { + $this->lazyObjectState->realInstance = clone $this->lazyObjectState->realInstance; + } + } + + public function __serialize(): array + { + $class = self::class; + $state = $this->lazyObjectState ?? null; + + if (!$state && (Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['serialize']) { + $properties = parent::__serialize(); + } else { + $properties = (array) $this; + + if ($state) { + unset($properties["\0$class\0lazyObjectState"]); + $properties["\0$class\0lazyObjectReal"] = $state->realInstance ??= ($state->initializer)(); + } + } + + if ($state || Registry::$parentMethods[$class]['serialize'] || !Registry::$parentMethods[$class]['sleep']) { + return $properties; + } + + $scope = get_parent_class($class); + $data = []; + + foreach (parent::__sleep() as $name) { + $value = $properties[$k = $name] ?? $properties[$k = "\0*\0$name"] ?? $properties[$k = "\0$class\0$name"] ?? $properties[$k = "\0$scope\0$name"] ?? $k = null; + + if (null === $k) { + trigger_error(\sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $name), \E_USER_NOTICE); + } else { + $data[$k] = $value; + } + } + + return $data; + } + + public function __unserialize(array $data): void + { + $class = self::class; + + if ($instance = $data["\0$class\0lazyObjectReal"] ?? null) { + unset($data["\0$class\0lazyObjectReal"]); + + foreach (Registry::$classResetters[$class] ??= Registry::getClassResetters($class) as $reset) { + $reset($this, $data); + } + + if ($data) { + PublicHydrator::hydrate($this, $data); + } + $this->lazyObjectState = new LazyObjectState(Registry::$noInitializerState ??= static fn () => throw new \LogicException('Lazy proxy has no initializer.')); + $this->lazyObjectState->realInstance = $instance; + } elseif ((Registry::$parentMethods[$class] ??= Registry::getParentMethods($class))['unserialize']) { + parent::__unserialize($data); + } else { + PublicHydrator::hydrate($this, $data); + + if (Registry::$parentMethods[$class]['wakeup']) { + parent::__wakeup(); + } + } + } + + public function __destruct() + { + if (isset($this->lazyObjectState)) { + return; + } + + if ((Registry::$parentMethods[self::class] ??= Registry::getParentMethods(self::class))['destruct']) { + parent::__destruct(); + } + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/ProxyHelper.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/ProxyHelper.php new file mode 100644 index 0000000..56fd00e --- /dev/null +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/ProxyHelper.php @@ -0,0 +1,553 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\VarExporter\Exception\LogicException; +use Symfony\Component\VarExporter\Internal\Hydrator; +use Symfony\Component\VarExporter\Internal\LazyObjectRegistry; + +/** + * @author Nicolas Grekas + */ +final class ProxyHelper +{ + /** + * Helps generate lazy-loading ghost objects. + * + * @throws LogicException When the class is incompatible with ghost objects + */ + public static function generateLazyGhost(\ReflectionClass $class): string + { + if (\PHP_VERSION_ID >= 80200 && \PHP_VERSION_ID < 80300 && $class->isReadOnly()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost with PHP < 8.3: class "%s" is readonly.', $class->name)); + } + if ($class->isFinal()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name)); + } + if ($class->isInterface() || $class->isAbstract() || $class->isTrait()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: "%s" is not a concrete class.', $class->name)); + } + if (\stdClass::class !== $class->name && $class->isInternal()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is internal.', $class->name)); + } + if ($class->hasMethod('__get') && 'mixed' !== (self::exportType($class->getMethod('__get')) ?? 'mixed')) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: return type of method "%s::__get()" should be "mixed".', $class->name)); + } + + static $traitMethods; + $traitMethods ??= (new \ReflectionClass(LazyGhostTrait::class))->getMethods(); + + foreach ($traitMethods as $method) { + if ($class->hasMethod($method->name) && $class->getMethod($method->name)->isFinal()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: method "%s::%s()" is final.', $class->name, $method->name)); + } + } + + $parent = $class; + while ($parent = $parent->getParentClass()) { + if (\stdClass::class !== $parent->name && $parent->isInternal()) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" extends "%s" which is internal.', $class->name, $parent->name)); + } + } + + $hooks = ''; + $propertyScopes = Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name); + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + $flags = $access >> 2; + + if ($k !== $key || !($access & Hydrator::PROPERTY_HAS_HOOKS) || $flags & \ReflectionProperty::IS_VIRTUAL) { + continue; + } + + if ($flags & (\ReflectionProperty::IS_FINAL | \ReflectionProperty::IS_PRIVATE)) { + throw new LogicException(\sprintf('Cannot generate lazy ghost: property "%s::$%s" is final or private(set).', $class->name, $name)); + } + + $p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name}" + .($p->hasDefaultValue() ? ' = '.VarExporter::export($p->getDefaultValue()) : '') + ." {\n"; + + foreach ($p->getHooks() as $hook => $method) { + if ('get' === $hook) { + $ref = ($method->returnsReference() ? '&' : ''); + $hooks .= " {$ref}get { \$this->initializeLazyObject(); return parent::\${$name}::get(); }\n"; + } elseif ('set' === $hook) { + $parameters = self::exportParameters($method, true); + $arg = '$'.$method->getParameters()[0]->name; + $hooks .= " set({$parameters}) { \$this->initializeLazyObject(); parent::\${$name}::set({$arg}); }\n"; + } else { + throw new LogicException(\sprintf('Cannot generate lazy ghost: hook "%s::%s()" is not supported.', $class->name, $method->name)); + } + } + + $hooks .= " }\n"; + } + + $propertyScopes = self::exportPropertyScopes($class->name, $propertyScopes); + + return <<name} implements \Symfony\Component\VarExporter\LazyObjectInterface + { + use \Symfony\Component\VarExporter\LazyGhostTrait; + + private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes}; + {$hooks}} + + // Help opcache.preload discover always-needed symbols + class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); + class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectRegistry::class); + class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); + + EOPHP; + } + + /** + * Helps generate lazy-loading virtual proxies. + * + * @param \ReflectionClass[] $interfaces + * + * @throws LogicException When the class is incompatible with virtual proxies + */ + public static function generateLazyProxy(?\ReflectionClass $class, array $interfaces = []): string + { + if (!class_exists($class?->name ?? \stdClass::class, false)) { + throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not a class.', $class->name)); + } + if ($class?->isFinal()) { + throw new LogicException(\sprintf('Cannot generate lazy proxy: class "%s" is final.', $class->name)); + } + if (\PHP_VERSION_ID >= 80200 && \PHP_VERSION_ID < 80300 && $class?->isReadOnly()) { + throw new LogicException(\sprintf('Cannot generate lazy proxy with PHP < 8.3: class "%s" is readonly.', $class->name)); + } + + $propertyScopes = $class ? Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name) : []; + $abstractProperties = []; + $hookedProperties = []; + if (\PHP_VERSION_ID >= 80400 && $class) { + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + $flags = $access >> 2; + + if ($k !== $key) { + continue; + } + + if ($flags & \ReflectionProperty::IS_ABSTRACT) { + $abstractProperties[$name] = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + continue; + } + $abstractProperties[$name] = false; + + if (!($access & Hydrator::PROPERTY_HAS_HOOKS) || $flags & \ReflectionProperty::IS_VIRTUAL) { + continue; + } + + if ($flags & (\ReflectionProperty::IS_FINAL | \ReflectionProperty::IS_PRIVATE)) { + throw new LogicException(\sprintf('Cannot generate lazy proxy: property "%s::$%s" is final or private(set).', $class->name, $name)); + } + + $p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + $hookedProperties[$name] = [$p, $p->getHooks()]; + } + } + + $methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []]; + foreach ($interfaces as $interface) { + if (!$interface->isInterface()) { + throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name)); + } + $methodReflectors[] = $interface->getMethods(); + + if (\PHP_VERSION_ID >= 80400) { + foreach ($interface->getProperties() as $p) { + $abstractProperties[$p->name] ??= $p; + $hookedProperties[$p->name] ??= [$p, []]; + $hookedProperties[$p->name][1] += $p->getHooks(); + } + } + } + + $hooks = ''; + + foreach (array_filter($abstractProperties) as $name => $p) { + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name};\n"; + } + + foreach ($hookedProperties as $name => [$p, $methods]) { + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name} {\n"; + + foreach ($methods as $hook => $method) { + if ('get' === $hook) { + $ref = ($method->returnsReference() ? '&' : ''); + $hooks .= <<lazyObjectState)) { + return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$p->name}; + } + + return parent::\${$p->name}::get(); + } + + EOPHP; + } elseif ('set' === $hook) { + $parameters = self::exportParameters($method, true); + $arg = '$'.$method->getParameters()[0]->name; + $hooks .= <<lazyObjectState)) { + \$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)(); + \$this->lazyObjectState->realInstance->{$p->name} = {$arg}; + } + + parent::\${$p->name}::set({$arg}); + } + + EOPHP; + } else { + throw new LogicException(\sprintf('Cannot generate lazy proxy: hook "%s::%s()" is not supported.', $class->name, $method->name)); + } + } + + $hooks .= " }\n"; + } + + $extendsInternalClass = false; + if ($parent = $class) { + do { + $extendsInternalClass = \stdClass::class !== $parent->name && $parent->isInternal(); + } while (!$extendsInternalClass && $parent = $parent->getParentClass()); + } + $methodsHaveToBeProxied = $extendsInternalClass; + $methods = []; + $methodReflectors = array_merge(...$methodReflectors); + + foreach ($methodReflectors as $method) { + if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) { + continue; + } + $methodsHaveToBeProxied = true; + $trait = new \ReflectionMethod(LazyProxyTrait::class, '__get'); + $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); + $body[0] = str_replace('): mixed', '): '.$type, $body[0]); + $methods['__get'] = strtr(implode('', $body).' }', [ + 'Hydrator' => '\\'.Hydrator::class, + 'Registry' => '\\'.LazyObjectRegistry::class, + ]); + break; + } + + foreach ($methodReflectors as $method) { + if (($method->isStatic() && !$method->isAbstract()) || isset($methods[$lcName = strtolower($method->name)])) { + continue; + } + if ($method->isFinal()) { + if ($extendsInternalClass || $methodsHaveToBeProxied || method_exists(LazyProxyTrait::class, $method->name)) { + throw new LogicException(\sprintf('Cannot generate lazy proxy: method "%s::%s()" is final.', $class->name, $method->name)); + } + continue; + } + if (method_exists(LazyProxyTrait::class, $method->name) || ($method->isProtected() && !$method->isAbstract())) { + continue; + } + + $signature = self::exportSignature($method, true, $args); + $parentCall = $method->isAbstract() ? "throw new \BadMethodCallException('Cannot forward abstract method \"{$method->class}::{$method->name}()\".')" : "parent::{$method->name}({$args})"; + + if ($method->isStatic()) { + $body = " $parentCall;"; + } elseif (str_ends_with($signature, '): never') || str_ends_with($signature, '): void')) { + $body = <<lazyObjectState)) { + (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); + } else { + {$parentCall}; + } + EOPHP; + } else { + if (!$methodsHaveToBeProxied && !$method->isAbstract()) { + // Skip proxying methods that might return $this + foreach (preg_split('/[()|&]++/', self::exportType($method) ?? 'static') as $type) { + if (\in_array($type = ltrim($type, '?'), ['static', 'object'], true)) { + continue 2; + } + foreach ([$class, ...$interfaces] as $r) { + if ($r && is_a($r->name, $type, true)) { + continue 3; + } + } + } + } + + $body = <<lazyObjectState)) { + return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$method->name}({$args}); + } + + return {$parentCall}; + EOPHP; + } + $methods[$lcName] = " {$signature}\n {\n{$body}\n }"; + } + + $types = $interfaces = array_unique(array_column($interfaces, 'name')); + $interfaces[] = LazyObjectInterface::class; + $interfaces = implode(', \\', $interfaces); + $parent = $class ? ' extends \\'.$class->name : ''; + array_unshift($types, $class ? 'parent' : ''); + $type = ltrim(implode('&\\', $types), '&'); + + if (!$class) { + $trait = new \ReflectionMethod(LazyProxyTrait::class, 'initializeLazyObject'); + $body = \array_slice(file($trait->getFileName()), $trait->getStartLine() - 1, $trait->getEndLine() - $trait->getStartLine()); + $body[0] = str_replace('): parent', '): '.$type, $body[0]); + $methods = ['initializeLazyObject' => implode('', $body).' }'] + $methods; + } + $body = $methods ? "\n".implode("\n\n", $methods)."\n" : ''; + $propertyScopes = $class ? self::exportPropertyScopes($class->name, $propertyScopes) : '[]'; + + if ( + $class?->hasMethod('__unserialize') + && !$class->getMethod('__unserialize')->getParameters()[0]->getType() + ) { + // fix contravariance type problem when $class declares a `__unserialize()` method without typehint. + $lazyProxyTraitStatement = <<__doUnserialize(\$data); + } + + EOPHP; + } else { + $lazyProxyTraitStatement = <<class : $function->getNamespaceName().'\\'; + $namespace = substr($namespace, 0, strrpos($namespace, '\\') ?: 0); + foreach ($function->getParameters() as $param) { + $parameters[] = ($param->getAttributes(\SensitiveParameter::class) ? '#[\SensitiveParameter] ' : '') + .($withParameterTypes && $param->hasType() ? self::exportType($param).' ' : '') + .($param->isPassedByReference() ? '&' : '') + .($param->isVariadic() ? '...' : '').'$'.$param->name + .($param->isOptional() && !$param->isVariadic() ? ' = '.self::exportDefault($param, $namespace) : ''); + if ($param->isPassedByReference()) { + $byRefIndex = 1 + $param->getPosition(); + } + $args .= ($param->isVariadic() ? '...$' : '$').$param->name.', '; + } + + if (!$param || !$byRefIndex) { + $args = '...\func_get_args()'; + } elseif ($param->isVariadic()) { + $args = substr($args, 0, -2); + } else { + $args = explode(', ', $args, 1 + $byRefIndex); + $args[$byRefIndex] = \sprintf('...\array_slice(\func_get_args(), %d)', $byRefIndex); + $args = implode(', ', $args); + } + + return implode(', ', $parameters); + } + + public static function exportSignature(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string + { + $parameters = self::exportParameters($function, $withParameterTypes, $args); + + $signature = 'function '.($function->returnsReference() ? '&' : '') + .($function->isClosure() ? '' : $function->name).'('.$parameters.')'; + + if ($function instanceof \ReflectionMethod) { + $signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private ')) + .($function->isStatic() ? 'static ' : '').$signature; + } + if ($function->hasReturnType()) { + $signature .= ': '.self::exportType($function); + } + + static $getPrototype; + $getPrototype ??= (new \ReflectionMethod(\ReflectionMethod::class, 'getPrototype'))->invoke(...); + + while ($function) { + if ($function->hasTentativeReturnType()) { + return '#[\ReturnTypeWillChange] '.$signature; + } + + try { + $function = $function instanceof \ReflectionMethod && $function->isAbstract() ? false : $getPrototype($function); + } catch (\ReflectionException) { + break; + } + } + + return $signature; + } + + public static function exportType(\ReflectionFunctionAbstract|\ReflectionProperty|\ReflectionParameter $owner, bool $noBuiltin = false, ?\ReflectionType $type = null): ?string + { + if (!$type ??= $owner instanceof \ReflectionFunctionAbstract ? $owner->getReturnType() : $owner->getType()) { + return null; + } + $class = null; + $types = []; + if ($type instanceof \ReflectionUnionType) { + $reflectionTypes = $type->getTypes(); + $glue = '|'; + } elseif ($type instanceof \ReflectionIntersectionType) { + $reflectionTypes = $type->getTypes(); + $glue = '&'; + } else { + $reflectionTypes = [$type]; + $glue = null; + } + + foreach ($reflectionTypes as $type) { + if ($type instanceof \ReflectionIntersectionType) { + if ('' !== $name = '('.self::exportType($owner, $noBuiltin, $type).')') { + $types[] = $name; + } + continue; + } + $name = $type->getName(); + + if ($noBuiltin && $type->isBuiltin()) { + continue; + } + if (\in_array($name, ['parent', 'self'], true) && $class ??= $owner->getDeclaringClass()) { + $name = 'parent' === $name ? ($class->getParentClass() ?: null)?->name ?? 'parent' : $class->name; + } + + $types[] = ($noBuiltin || $type->isBuiltin() || 'static' === $name ? '' : '\\').$name; + } + + if (!$types) { + return ''; + } + if (null === $glue) { + $defaultNull = $owner instanceof \ReflectionParameter && 'NULL' === rtrim(substr(explode('$'.$owner->name.' = ', (string) $owner, 2)[1] ?? '', 0, -2)); + + return (!$noBuiltin && ($type->allowsNull() || $defaultNull) && !\in_array($name, ['mixed', 'null'], true) ? '?' : '').$types[0]; + } + sort($types); + + return implode($glue, $types); + } + + private static function exportPropertyScopes(string $parent, array $propertyScopes): string + { + uksort($propertyScopes, 'strnatcmp'); + foreach ($propertyScopes as $k => $v) { + unset($propertyScopes[$k][4]); + } + $propertyScopes = VarExporter::export($propertyScopes); + $propertyScopes = str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes); + $propertyScopes = preg_replace("/(?|(,)\n( ) |\n |,\n (\]))/", '$1$2', $propertyScopes); + $propertyScopes = str_replace("\n", "\n ", $propertyScopes); + + return $propertyScopes; + } + + private static function exportDefault(\ReflectionParameter $param, $namespace): string + { + $default = rtrim(substr(explode('$'.$param->name.' = ', (string) $param, 2)[1] ?? '', 0, -2)); + + if (\in_array($default, ['', 'NULL'], true)) { + return 'null'; + } + if (str_ends_with($default, "...'") && preg_match("/^'(?:[^'\\\\]*+(?:\\\\.)*+)*+'$/", $default)) { + return VarExporter::export($param->getDefaultValue()); + } + + $regexp = "/(\"(?:[^\"\\\\]*+(?:\\\\.)*+)*+\"|'(?:[^'\\\\]*+(?:\\\\.)*+)*+')/"; + $parts = preg_split($regexp, $default, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + + $regexp = '/([\[\( ]|^)([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z0-9_\x7f-\xff]++)*+)(\(?)(?!: )/'; + $callback = (false !== strpbrk($default, "\\:('") && $class = $param->getDeclaringClass()) + ? fn ($m) => $m[1].match ($m[2]) { + 'new', 'false', 'true', 'null' => $m[2], + 'NULL' => 'null', + 'self' => '\\'.$class->name, + 'namespace\\parent', + 'parent' => ($parent = $class->getParentClass()) ? '\\'.$parent->name : 'parent', + default => self::exportSymbol($m[2], '(' !== $m[3], $namespace), + }.$m[3] + : fn ($m) => $m[1].match ($m[2]) { + 'new', 'false', 'true', 'null', 'self', 'parent' => $m[2], + 'NULL' => 'null', + default => self::exportSymbol($m[2], '(' !== $m[3], $namespace), + }.$m[3]; + + return implode('', array_map(fn ($part) => match ($part[0]) { + '"' => $part, // for internal classes only + "'" => false !== strpbrk($part, "\\\0\r\n") ? '"'.substr(str_replace(['$', "\0", "\r", "\n"], ['\$', '\0', '\r', '\n'], $part), 1, -1).'"' : $part, + default => preg_replace_callback($regexp, $callback, $part), + }, $parts)); + } + + private static function exportSymbol(string $symbol, bool $mightBeRootConst, string $namespace): string + { + if (!$mightBeRootConst + || false === ($ns = strrpos($symbol, '\\')) + || substr($symbol, 0, $ns) !== $namespace + || \defined($symbol) + || !\defined(substr($symbol, $ns + 1)) + ) { + return '\\'.$symbol; + } + + return '\\'.substr($symbol, $ns + 1); + } +} diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/README.md b/xunifriend_RaeeC/vendor/symfony/var-exporter/README.md index a34e4c2..7195270 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/README.md +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/README.md @@ -1,15 +1,22 @@ VarExporter Component ===================== -The VarExporter component allows exporting any serializable PHP data structure to -plain PHP code. While doing so, it preserves all the semantics associated with -the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`, -`__serialize`, `__unserialize`). +The VarExporter component provides various tools to deal with the internal state +of objects: -It also provides an instantiator that allows creating and populating objects -without calling their constructor nor any other methods. +- `VarExporter::export()` allows exporting any serializable PHP data structure to + plain PHP code. While doing so, it preserves all the semantics associated with + the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`, + `__serialize`, `__unserialize`); +- `Instantiator::instantiate()` creates an object and sets its properties without + calling its constructor nor any other methods; +- `Hydrator::hydrate()` can set the properties of an existing object; +- `Lazy*Trait` can make a class behave as a lazy-loading ghost or virtual proxy. -The reason to use this component *vs* `serialize()` or +VarExporter::export() +--------------------- + +The reason to use `VarExporter::export()` *vs* `serialize()` or [igbinary](https://github.com/igbinary/igbinary) is performance: thanks to OPcache, the resulting code is significantly faster and more memory efficient than using `unserialize()` or `igbinary_unserialize()`. @@ -19,15 +26,107 @@ Unlike `var_export()`, this works on any serializable PHP value. It also provides a few improvements over `var_export()`/`serialize()`: * the output is PSR-2 compatible; - * the output can be re-indented without messing up with `\r` or `\n` in the data - * missing classes throw a `ClassNotFoundException` instead of being unserialized to - `PHP_Incomplete_Class` objects; + * the output can be re-indented without messing up with `\r` or `\n` in the data; + * missing classes throw a `ClassNotFoundException` instead of being unserialized + to `PHP_Incomplete_Class` objects; * references involving `SplObjectStorage`, `ArrayObject` or `ArrayIterator` instances are preserved; * `Reflection*`, `IteratorIterator` and `RecursiveIteratorIterator` classes throw an exception when being serialized (their unserialized version is broken anyway, see https://bugs.php.net/76737). +Instantiator and Hydrator +------------------------- + +`Instantiator::instantiate($class)` creates an object of the given class without +calling its constructor nor any other methods. + +`Hydrator::hydrate()` sets the properties of an existing object, including +private and protected ones. For example: + +```php +// Sets the public or protected $object->propertyName property +Hydrator::hydrate($object, ['propertyName' => $propertyValue]); + +// Sets a private property defined on its parent Bar class: +Hydrator::hydrate($object, ["\0Bar\0privateBarProperty" => $propertyValue]); + +// Alternative way to set the private $object->privateBarProperty property +Hydrator::hydrate($object, [], [ + Bar::class => ['privateBarProperty' => $propertyValue], +]); +``` + +`Lazy*Trait` +------------ + +The component provides two lazy-loading patterns: ghost objects and virtual +proxies (see https://martinfowler.com/eaaCatalog/lazyLoad.html for reference). + +Ghost objects work only with concrete and non-internal classes. In the generic +case, they are not compatible with using factories in their initializer. + +Virtual proxies work with concrete, abstract or internal classes. They provide an +API that looks like the actual objects and forward calls to them. They can cause +identity problems because proxies might not be seen as equivalents to the actual +objects they proxy. + +Because of this identity problem, ghost objects should be preferred when +possible. Exceptions thrown by the `ProxyHelper` class can help decide when it +can be used or not. + +Ghost objects and virtual proxies both provide implementations for the +`LazyObjectInterface` which allows resetting them to their initial state or to +forcibly initialize them when needed. Note that resetting a ghost object skips +its read-only properties. You should use a virtual proxy to reset read-only +properties. + +### `LazyGhostTrait` + +By using `LazyGhostTrait` either directly in your classes or by using +`ProxyHelper::generateLazyGhost()`, you can make their instances lazy-loadable. +This works by creating these instances empty and by computing their state only +when accessing a property. + +```php +class FooLazyGhost extends Foo +{ + use LazyGhostTrait; +} + +$foo = FooLazyGhost::createLazyGhost(initializer: function (Foo $instance): void { + // [...] Use whatever heavy logic you need here + // to compute the $dependencies of the $instance + $instance->__construct(...$dependencies); + // [...] Call setters, etc. if needed +}); + +// $foo is now a lazy-loading ghost object. The initializer will +// be called only when and if a *property* is accessed. +``` + +### `LazyProxyTrait` + +Alternatively, `LazyProxyTrait` can be used to create virtual proxies: + +```php +$proxyCode = ProxyHelper::generateLazyProxy(new ReflectionClass(Foo::class)); +// $proxyCode contains the reference to LazyProxyTrait +// and should be dumped into a file in production envs +eval('class FooLazyProxy'.$proxyCode); + +$foo = FooLazyProxy::createLazyProxy(initializer: function (): Foo { + // [...] Use whatever heavy logic you need here + // to compute the $dependencies of the $instance + $instance = new Foo(...$dependencies); + // [...] Call setters, etc. if needed + + return $instance; +}); +// $foo is now a lazy-loading virtual proxy object. The initializer will +// be called only when and if a *method* is called. +``` + Resources --------- diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/VarExporter.php b/xunifriend_RaeeC/vendor/symfony/var-exporter/VarExporter.php index d4c0809..22e9b51 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/VarExporter.php +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/VarExporter.php @@ -32,13 +32,12 @@ final class VarExporter /** * Exports a serializable PHP value to PHP code. * - * @param mixed $value The value to export * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise * @param array &$foundClasses Classes found in the value are added to this list as both keys and values * * @throws ExceptionInterface When the provided value cannot be serialized */ - public static function export($value, ?bool &$isStaticValue = null, array &$foundClasses = []): string + public static function export(mixed $value, ?bool &$isStaticValue = null, array &$foundClasses = []): string { $isStaticValue = true; diff --git a/xunifriend_RaeeC/vendor/symfony/var-exporter/composer.json b/xunifriend_RaeeC/vendor/symfony/var-exporter/composer.json index 29d4901..e7b0fb0 100644 --- a/xunifriend_RaeeC/vendor/symfony/var-exporter/composer.json +++ b/xunifriend_RaeeC/vendor/symfony/var-exporter/composer.json @@ -2,7 +2,7 @@ "name": "symfony/var-exporter", "type": "library", "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "keywords": ["export", "serialize", "instantiate", "hydrate", "construct", "clone"], + "keywords": ["export", "serialize", "instantiate", "hydrate", "construct", "clone", "lazy-loading", "proxy"], "homepage": "https://symfony.com", "license": "MIT", "authors": [ @@ -16,11 +16,13 @@ } ], "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "autoload": { "psr-4": { "Symfony\\Component\\VarExporter\\": "" }, diff --git a/修复Python依赖.bat b/修复Python依赖.bat new file mode 100644 index 0000000..e2a4c96 --- /dev/null +++ b/修复Python依赖.bat @@ -0,0 +1,69 @@ +@echo off +chcp 65001 >nul +title 修复 Python 依赖 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 修复 Python 依赖 ║ +echo ╚════════════════════════════════════╝ +echo. + +cd /d "%~dp0" + +echo [1/3] 检查 Python... +python --version +if errorlevel 1 ( + echo [错误] Python 未找到 + pause + exit /b 1 +) +echo. + +echo [2/3] 清理 pip 缓存... +pip cache purge +echo. + +echo [3/3] 安装核心依赖(不使用缓存)... +echo. +echo 正在安装,请稍候... +echo. + +pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple uvicorn[standard] fastapi sqlalchemy pymysql pydantic pydantic-settings python-dotenv requests oss2 dashscope pyyaml imageio-ffmpeg + +if errorlevel 1 ( + echo. + echo [错误] 安装失败 + echo. + echo 可能的原因: + echo 1. 磁盘空间不足 + echo 2. 网络连接问题 + echo 3. Python 版本不兼容 + echo. + echo 请尝试: + echo 1. 清理磁盘空间 + echo 2. 检查网络连接 + echo 3. 使用 Python 3.9 或更高版本 + echo. + pause + exit /b 1 +) + +echo. +echo ════════════════════════════════════ +echo. +echo [成功] 依赖安装完成! +echo. +echo 验证安装: +echo. + +pip show uvicorn fastapi sqlalchemy pymysql + +echo. +echo ════════════════════════════════════ +echo. +echo 下一步: +echo 1. 关闭所有服务窗口 +echo 2. 重新运行 启动项目.bat +echo 3. 访问 http://127.0.0.1:30101/docs +echo. +pause diff --git a/创建虚拟环境.bat b/创建虚拟环境.bat new file mode 100644 index 0000000..ca51b52 --- /dev/null +++ b/创建虚拟环境.bat @@ -0,0 +1,110 @@ +@echo off +chcp 65001 >nul +title 创建 Python 虚拟环境 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 创建 Python 虚拟环境 ║ +echo ╚════════════════════════════════════╝ +echo. + +REM ========================================== +REM 检查磁盘空间 +REM ========================================== +echo [1/4] 检查磁盘空间... +echo. +wmic logicaldisk get name,freespace,size +echo. +echo 请确保当前盘符有至少 2GB 的剩余空间 +echo. +pause + +REM ========================================== +REM 创建虚拟环境 +REM ========================================== +echo. +echo [2/4] 创建虚拟环境... +echo. +cd /d "%~dp0" + +if exist "venv" ( + echo [提示] 虚拟环境已存在,是否删除重建? + echo 按任意键继续(删除重建),或关闭窗口取消 + pause >nul + rmdir /s /q venv +) + +python -m venv venv + +if errorlevel 1 ( + echo [错误] 虚拟环境创建失败 + pause + exit /b 1 +) + +echo [成功] 虚拟环境创建完成 +echo. + +REM ========================================== +REM 激活虚拟环境 +REM ========================================== +echo [3/4] 激活虚拟环境... +call venv\Scripts\activate.bat + +if errorlevel 1 ( + echo [错误] 虚拟环境激活失败 + pause + exit /b 1 +) + +echo [成功] 虚拟环境已激活 +echo. + +REM ========================================== +REM 安装依赖 +REM ========================================== +echo [4/4] 安装 Python 依赖... +echo. +echo 使用清华镜像加速下载... +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir + +if errorlevel 1 ( + echo. + echo [错误] 依赖安装失败 + echo. + echo 可能的原因: + echo 1. 磁盘空间不足 + echo 2. 网络连接问题 + echo 3. 某些包不兼容 + echo. + pause + exit /b 1 +) + +echo. +echo [成功] 依赖安装完成 +echo. + +REM ========================================== +REM 完成 +REM ========================================== +echo. +echo ╔════════════════════════════════════╗ +echo ║ 虚拟环境创建完成! ║ +echo ╚════════════════════════════════════╝ +echo. +echo 虚拟环境位置: %~dp0venv +echo. +echo 使用方法: +echo 1. 每次运行项目前,先激活虚拟环境: +echo venv\Scripts\activate.bat +echo. +echo 2. 然后运行项目: +echo python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 +echo. +echo 3. 退出虚拟环境: +echo deactivate +echo. +echo 注意:启动脚本需要修改以使用虚拟环境 +echo. +pause diff --git a/启动前检查清单.md b/启动前检查清单.md new file mode 100644 index 0000000..e8208be --- /dev/null +++ b/启动前检查清单.md @@ -0,0 +1,364 @@ +# 🚦 启动前检查清单 + +在运行项目之前,请按照此清单逐项检查,确保所有环境和配置都已就绪。 + +--- + +## ✅ 环境检查 + +### 1. PHP 环境 +```cmd +php -v +``` +- [ ] PHP 版本 >= 8.0 +- [ ] 显示版本信息(如:PHP 8.0.0) + +### 2. Python 环境 +```cmd +python --version +pip --version +``` +- [ ] Python 版本 >= 3.8 +- [ ] pip 已安装 + +### 3. MySQL 数据库 +```cmd +mysql --version +``` +- [ ] MySQL 已安装 +- [ ] MySQL 服务正在运行 +- [ ] 可以连接到数据库 + +### 4. Composer(PHP 包管理器) +```cmd +composer --version +``` +- [ ] Composer 已安装 + +--- + +## ✅ 项目文件检查 + +### 1. 目录结构 +- [ ] `lover/` 目录存在 +- [ ] `xunifriend_RaeeC/` 目录存在 +- [ ] `public/` 目录存在 +- [ ] `启动项目.bat` 文件存在 + +### 2. 配置文件 +- [ ] `.env` 文件存在(根目录) +- [ ] `lover/.env` 文件存在 +- [ ] `xunifriend_RaeeC/.env` 文件存在 + +### 3. 依赖文件 +- [ ] `lover/requirements.txt` 存在 +- [ ] `xunifriend_RaeeC/composer.json` 存在 + +--- + +## ✅ 依赖安装检查 + +### 1. PHP 依赖 +```cmd +cd xunifriend_RaeeC +composer install +``` +- [ ] 依赖安装成功 +- [ ] `vendor/` 目录已生成 +- [ ] 无错误信息 + +### 2. Python 依赖 +```cmd +pip install -r lover/requirements.txt +``` +- [ ] 所有包安装成功 +- [ ] 无错误信息 + +验证关键包: +```cmd +pip show fastapi uvicorn sqlalchemy pymysql +``` +- [ ] fastapi 已安装 +- [ ] uvicorn 已安装 +- [ ] sqlalchemy 已安装 +- [ ] pymysql 已安装 + +--- + +## ✅ 数据库配置检查 + +### 1. 数据库连接测试 +```cmd +mysql -u fastadmin -p +``` +输入密码后: +```sql +SHOW DATABASES; +USE fastadmin; +SHOW TABLES; +``` +- [ ] 可以成功连接 +- [ ] `fastadmin` 数据库存在 +- [ ] 数据表已导入(应该有 30+ 张表) + +### 2. 关键数据表检查 +```sql +SHOW TABLES LIKE 'nf_%'; +``` +必需的表: +- [ ] `nf_user` (用户表) +- [ ] `nf_lovers` (恋人表) +- [ ] `nf_chat_message` (消息表) +- [ ] `nf_chat_session` (会话表) +- [ ] `nf_generation_tasks` (任务表) + +--- + +## ✅ 环境变量配置检查 + +### 1. 根目录 .env +打开 `.env` 文件,检查以下配置: + +```env +# 数据库配置(必需) +DATABASE_URL=mysql+pymysql://用户名:密码@主机:端口/数据库名?charset=utf8mb4 +``` +- [ ] 数据库地址正确 +- [ ] 用户名密码正确 +- [ ] 数据库名称正确 + +```env +# PHP 后台地址(必需) +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic +``` +- [ ] 地址配置正确(本地开发使用 127.0.0.1:30100) + +```env +# 阿里云 DashScope API(必需) +DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx +``` +- [ ] 已填写有效的 API Key +- [ ] API Key 有余额(可在阿里云控制台查看) + +```env +# OSS 配置(必需) +ALIYUN_OSS_ACCESS_KEY_ID=your_access_key_id +ALIYUN_OSS_ACCESS_KEY_SECRET=your_access_key_secret +ALIYUN_OSS_BUCKET_NAME=your_bucket_name +ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com +``` +- [ ] 已填写 OSS 配置 +- [ ] Bucket 已创建 +- [ ] 权限配置正确(读写权限) + +### 2. lover/.env +```env +DATABASE_URL=mysql+pymysql://用户名:密码@主机:端口/数据库名?charset=utf8mb4 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic +``` +- [ ] 与根目录 .env 保持一致 + +### 3. xunifriend_RaeeC/.env +```env +[database] +hostname = localhost +database = fastadmin +username = fastadmin +password = your_password +``` +- [ ] 数据库配置正确 +- [ ] 与 Python 配置一致 + +--- + +## ✅ PHP 扩展检查 + +运行以下命令查看已启用的扩展: +```cmd +php -m +``` + +必需的扩展: +- [ ] curl +- [ ] fileinfo +- [ ] gd +- [ ] json +- [ ] mbstring +- [ ] mysqli +- [ ] openssl +- [ ] pdo_mysql +- [ ] zip + +如果缺少扩展,编辑 `php.ini` 文件,取消注释相应的 `extension=xxx` 行。 + +--- + +## ✅ 端口占用检查 + +### 1. 检查端口 30100(PHP) +```cmd +netstat -ano | findstr :30100 +``` +- [ ] 端口未被占用(无输出) +- [ ] 或已知占用进程可以终止 + +### 2. 检查端口 30101(Python) +```cmd +netstat -ano | findstr :30101 +``` +- [ ] 端口未被占用(无输出) +- [ ] 或已知占用进程可以终止 + +如果端口被占用,终止进程: +```cmd +taskkill /F /PID 进程号 +``` + +--- + +## ✅ 文件权限检查 + +确保以下目录可写(Windows 通常自动具有权限): + +- [ ] `xunifriend_RaeeC/runtime/` +- [ ] `xunifriend_RaeeC/public/uploads/` +- [ ] `public/tts/` + +如果目录不存在,手动创建: +```cmd +mkdir xunifriend_RaeeC\runtime +mkdir xunifriend_RaeeC\public\uploads +mkdir public\tts +``` + +--- + +## ✅ 启动脚本配置检查 + +打开 `启动项目.bat`,检查配置: + +```batch +set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe +``` +- [ ] PHP_PATH 指向正确的 php.exe 路径 +- [ ] 文件路径存在 + +```batch +set PHP_PORT=30100 +set PYTHON_PORT=30101 +``` +- [ ] 端口配置正确 +- [ ] 端口未被占用 + +--- + +## ✅ 网络连接检查 + +### 1. 本地回环测试 +```cmd +ping 127.0.0.1 +``` +- [ ] 可以 ping 通 + +### 2. 外部 API 连接测试(如果使用远程数据库) +```cmd +ping 1.15.149.240 +``` +- [ ] 可以 ping 通(如果使用远程数据库) + +--- + +## ✅ 阿里云服务检查 + +### 1. DashScope API +访问控制台:https://dashscope.console.aliyun.com/ + +- [ ] 账号已注册 +- [ ] API Key 已创建 +- [ ] 账户有余额或在免费额度内 +- [ ] 已开通所需模型: + - [ ] qwen-plus (对话) + - [ ] wan2.6-t2i (图像生成) + - [ ] wan2.6-i2v-flash (视频生成) + - [ ] cosyvoice-v2 (语音合成) + - [ ] paraformer-realtime-v2 (语音识别) + +### 2. OSS 对象存储 +访问控制台:https://oss.console.aliyun.com/ + +- [ ] Bucket 已创建 +- [ ] 区域正确(如:华东1-杭州) +- [ ] 读写权限已设置(公共读或私有) +- [ ] AccessKey 已创建且有效 + +--- + +## ✅ 最终测试 + +### 1. 测试 PHP 服务 +```cmd +cd xunifriend_RaeeC\public +php -S 127.0.0.1:30100 router.php +``` +打开浏览器访问:http://127.0.0.1:30100 +- [ ] 页面可以访问 +- [ ] 无错误信息 + +按 `Ctrl+C` 停止服务 + +### 2. 测试 Python 服务 +```cmd +python -m uvicorn lover.main:app --host 127.0.0.1 --port 30101 +``` +打开浏览器访问:http://127.0.0.1:30101/docs +- [ ] API 文档页面可以访问 +- [ ] 显示所有 API 接口 + +按 `Ctrl+C` 停止服务 + +### 3. 测试健康检查接口 +访问:http://127.0.0.1:30101/health +- [ ] 返回 `{"code":1,"msg":"ok","data":{"status":"ok"}}` + +--- + +## 🎉 准备就绪! + +如果以上所有项目都已勾选 ✅,恭喜你!现在可以正式启动项目了: + +### 启动方式 + +**方式一:使用启动脚本(推荐)** +```cmd +启动项目.bat +``` + +**方式二:手动启动** + +终端 1 - PHP 服务: +```cmd +cd xunifriend_RaeeC\public +php -S 0.0.0.0:30100 router.php +``` + +终端 2 - Python 服务: +```cmd +python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload +``` + +--- + +## 🆘 如果遇到问题 + +1. **重新检查清单**:确保每一项都已完成 +2. **查看日志**:检查控制台输出的错误信息 +3. **参考文档**:查看 `运行指南.md` 中的常见问题部分 +4. **逐步排查**:从环境、配置、依赖、数据库依次检查 + +--- + +**检查完成时间**: ___________ + +**检查人**: ___________ + +**备注**: ___________ diff --git a/启动移动端.bat b/启动移动端.bat new file mode 100644 index 0000000..675a565 --- /dev/null +++ b/启动移动端.bat @@ -0,0 +1,79 @@ +@echo off +chcp 65001 >nul +title 启动移动端项目 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 启动移动端项目 ║ +echo ╚════════════════════════════════════╝ +echo. + +cd /d "%~dp0xuniYou" + +REM ========================================== +REM 检查 Node.js +REM ========================================== +echo [1/3] 检查 Node.js... +node --version >nul 2>&1 +if errorlevel 1 ( + echo [错误] Node.js 未安装或未添加到 PATH + echo. + echo 请先安装 Node.js: https://nodejs.org/ + echo. + pause + exit /b 1 +) +echo [成功] Node.js 已就绪 +echo. + +REM ========================================== +REM 安装依赖 +REM ========================================== +echo [2/3] 安装 npm 依赖... +echo. + +if not exist "node_modules" ( + echo 首次运行,正在安装依赖包... + echo 这可能需要几分钟,请耐心等待... + echo. + npm install + + if errorlevel 1 ( + echo. + echo [错误] 依赖安装失败 + echo. + echo 尝试使用淘宝镜像: + npm config set registry https://registry.npmmirror.com + npm install + ) +) else ( + echo 依赖已安装,跳过... +) + +echo. +echo [成功] 依赖安装完成 +echo. + +REM ========================================== +REM 提示 +REM ========================================== +echo [3/3] 准备启动... +echo. +echo ════════════════════════════════════ +echo. +echo 移动端项目已准备就绪! +echo. +echo 请在 HBuilderX 中打开此项目: +echo 1. 打开 HBuilderX +echo 2. 文件 → 打开目录 +echo 3. 选择: %~dp0xuniYou +echo 4. 点击运行 → 运行到浏览器/模拟器/真机 +echo. +echo 或者使用命令行运行: +echo - H5: npm run dev:h5 +echo - 微信小程序: npm run dev:mp-weixin +echo - APP: 需要在 HBuilderX 中运行 +echo. +echo ════════════════════════════════════ +echo. +pause diff --git a/启动项目.bat b/启动项目.bat index d1785b2..e744fc1 100644 --- a/启动项目.bat +++ b/启动项目.bat @@ -5,7 +5,7 @@ title AI 女友项目 - 启动服务 REM ========================================== REM 配置区域 REM ========================================== -set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe +set PHP_PATH=D:\IDMDownload\php-8.0.0-Win32-vs16-x64\php.exe set PHP_PORT=30100 set PYTHON_PORT=30101 diff --git a/安装完整依赖.bat b/安装完整依赖.bat new file mode 100644 index 0000000..7235f7e --- /dev/null +++ b/安装完整依赖.bat @@ -0,0 +1,68 @@ +@echo off +chcp 65001 >nul +title 安装完整 Python 依赖 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 安装完整 Python 依赖 ║ +echo ╚════════════════════════════════════╝ +echo. + +cd /d "%~dp0" + +echo [提示] 正在安装项目所需的所有 Python 依赖... +echo. +echo 这可能需要几分钟,请耐心等待... +echo. + +REM 清理缓存 +echo [1/2] 清理 pip 缓存... +pip cache purge +echo. + +REM 安装所有依赖(不使用缓存) +echo [2/2] 安装依赖包... +echo. + +pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple ^ + fastapi>=0.110 ^ + uvicorn[standard]>=0.24 ^ + sqlalchemy>=2.0 ^ + pymysql>=1.1 ^ + pydantic>=2.6 ^ + pydantic-settings>=2.1 ^ + python-dotenv>=1.0 ^ + requests>=2.31 ^ + oss2>=2.18 ^ + dashscope>=1.20 ^ + pyyaml>=6.0 ^ + imageio-ffmpeg>=0.4 + +if errorlevel 1 ( + echo. + echo [错误] 安装失败 + echo. + echo 可能的原因: + echo 1. 磁盘空间不足 + echo 2. 网络连接问题 + echo. + pause + exit /b 1 +) + +echo. +echo ════════════════════════════════════ +echo. +echo [成功] 所有依赖安装完成! +echo. +echo 已安装的包: +pip list | findstr "fastapi uvicorn sqlalchemy pymysql dashscope" +echo. +echo ════════════════════════════════════ +echo. +echo 下一步: +echo 1. 关闭所有服务窗口 +echo 2. 运行 启动项目.bat +echo 3. 访问 http://127.0.0.1:30101/docs +echo. +pause diff --git a/导入完整数据库.bat b/导入完整数据库.bat new file mode 100644 index 0000000..2b03d3f --- /dev/null +++ b/导入完整数据库.bat @@ -0,0 +1,45 @@ +@echo off +chcp 65001 >nul +echo. +echo ======================================== +echo 📦 导入完整数据库 +echo ======================================== +echo. + +set MYSQL_PATH=mysql +set DB_HOST=localhost +set DB_PORT=3306 +set DB_USER=root +set DB_PASS=rootx77 +set DB_NAME=ai +set SQL_FILE=数据库.sql + +echo 正在导入数据库... +echo 数据库: %DB_NAME% +echo 文件: %SQL_FILE% +echo. + +%MYSQL_PATH% -h%DB_HOST% -P%DB_PORT% -u%DB_USER% -p%DB_PASS% %DB_NAME% < %SQL_FILE% + +if %errorlevel% equ 0 ( + echo. + echo ✅ 数据库导入成功! + echo. + echo 正在验证表... + %MYSQL_PATH% -h%DB_HOST% -P%DB_PORT% -u%DB_USER% -p%DB_PASS% -e "USE ai; SHOW TABLES;" > tables.txt + echo. + echo 📋 已导入的表: + type tables.txt + del tables.txt +) else ( + echo. + echo ❌ 数据库导入失败! + echo. + echo 请检查: + echo 1. MySQL 是否在系统 PATH 中 + echo 2. 数据库连接信息是否正确 + echo 3. 数据库.sql 文件是否存在 +) + +echo. +pause diff --git a/强制关闭并重新导入.py b/强制关闭并重新导入.py new file mode 100644 index 0000000..e69de29 diff --git a/强制清理并重启.bat b/强制清理并重启.bat new file mode 100644 index 0000000..e69de29 diff --git a/强制重建数据库.py b/强制重建数据库.py new file mode 100644 index 0000000..f85778a --- /dev/null +++ b/强制重建数据库.py @@ -0,0 +1,73 @@ +import pymysql +import time + +config = { + 'host': 'localhost', + 'port': 3306, + 'user': 'root', + 'password': 'rootx77', + 'charset': 'utf8mb4' +} + +print("连接数据库...") +conn = pymysql.connect(**config) +conn.autocommit = True +cursor = conn.cursor() + +print("删除 ai 数据库...") +cursor.execute("DROP DATABASE IF EXISTS ai") + +print("创建 ai 数据库...") +cursor.execute("CREATE DATABASE ai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") + +print("切换到 ai 数据库...") +cursor.execute("USE ai") + +print("读取 SQL 文件...") +with open('数据库.sql', 'r', encoding='utf8') as f: + sql = f.read() + +print("开始导入...") +# 移除注释和空行 +lines = [] +for line in sql.split('\n'): + line = line.strip() + if line and not line.startswith('--') and not line.startswith('/*'): + lines.append(line) + +sql_clean = ' '.join(lines) + +# 按分号分割语句 +statements = sql_clean.split(';') + +count = 0 +for stmt in statements: + stmt = stmt.strip() + if stmt: + try: + cursor.execute(stmt) + count += 1 + if count % 50 == 0: + print(f"已执行 {count} 条语句...") + except Exception as e: + if 'Duplicate' not in str(e): + print(f"警告: {str(e)[:100]}") + +print(f"\n总共执行 {count} 条语句") + +# 验证 +cursor.execute("SHOW TABLES") +tables = cursor.fetchall() +print(f"\n数据库中有 {len(tables)} 张表") + +# 检查关键表 +for table in ['nf_user', 'nf_lovers', 'nf_chat_message']: + cursor.execute(f"SHOW TABLES LIKE '{table}'") + if cursor.fetchone(): + print(f"✅ {table}") + else: + print(f"❌ {table}") + +cursor.close() +conn.close() +print("\n完成!") diff --git a/快速启动指南.md b/快速启动指南.md new file mode 100644 index 0000000..f6ae0dc --- /dev/null +++ b/快速启动指南.md @@ -0,0 +1,385 @@ +# 🚀 快速启动指南 + +## ✅ 已完成的配置 + +### 1. 数据库配置 ✓ +- **数据库名**: ai_friend +- **主机**: localhost:3306 +- **用户名**: root +- **密码**: rootx77 +- **数据表**: 已导入(30+ 张表,包含 nf_user, nf_lovers, nf_chat_message 等) + +### 2. 环境变量配置 ✓ +已配置三个 .env 文件: +- ✓ 根目录 `.env` +- ✓ `lover/.env` +- ✓ `xunifriend_RaeeC/.env` + +所有文件已统一使用本地数据库配置。 + +--- + +## 📋 启动前最后检查 + +### 1. 安装 PHP +- [ ] 下载 PHP 8.5.3 (VS17 x64 Non Thread Safe) +- [ ] 解压到目录(如 `D:\php-8.5.3\`) +- [ ] 配置 php.ini(启用扩展) +- [ ] 修改 `启动项目.bat` 中的 PHP_PATH + +### 2. 安装 Python 依赖 +```cmd +pip install -r lover/requirements.txt +``` + +如果速度慢,使用国内镜像: +```cmd +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +### 3. 安装 PHP 依赖 +```cmd +cd xunifriend_RaeeC +composer install +``` + +如果速度慢,使用国内镜像: +```cmd +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +composer install +``` + +### 4. 验证数据库连接 +```cmd +mysql -u root -prootx77 -e "USE ai_friend; SHOW TABLES;" +``` + +应该看到 30+ 张数据表。 + +--- + +## 🎯 启动项目 + +### 方式一:使用启动脚本(推荐) + +1. **修改 PHP 路径** + + 打开 `启动项目.bat`,修改第 6 行: + ```batch + set PHP_PATH=D:\php-8.5.3\php.exe + ``` + 改为你的 PHP 实际路径 + +2. **双击运行** + ``` + 启动项目.bat + ``` + +3. **等待启动完成** + - 会自动打开两个命令行窗口 + - PHP 服务器窗口 + - Python 后端窗口 + +4. **访问服务** + - PHP 后台: http://127.0.0.1:30100 + - Python API: http://127.0.0.1:30101 + - API 文档: http://127.0.0.1:30101/docs + +### 方式二:手动启动 + +#### 终端 1 - 启动 PHP 服务 +```cmd +cd xunifriend_RaeeC\public +php -S 0.0.0.0:30100 router.php +``` + +#### 终端 2 - 启动 Python 服务 +```cmd +python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload +``` + +--- + +## 🧪 测试服务 + +### 1. 测试 PHP 后台 +浏览器访问: http://127.0.0.1:30100 + +应该看到网站首页或登录页面。 + +### 2. 测试 Python API +浏览器访问: http://127.0.0.1:30101/docs + +应该看到 FastAPI 自动生成的 API 文档页面。 + +### 3. 测试健康检查 +浏览器访问: http://127.0.0.1:30101/health + +应该返回: +```json +{ + "code": 1, + "msg": "ok", + "data": { + "status": "ok" + } +} +``` + +### 4. 测试数据库连接 +在 API 文档页面 (http://127.0.0.1:30101/docs): +- 找到任意 GET 接口 +- 点击 "Try it out" +- 点击 "Execute" +- 如果返回数据(不是 500 错误),说明数据库连接成功 + +--- + +## 🔧 PHP 配置清单 + +### 必需的 PHP 扩展 + +编辑 `php.ini` 文件,确保以下扩展已启用(删除前面的分号): + +```ini +extension=curl +extension=fileinfo +extension=gd +extension=mbstring +extension=mysqli +extension=openssl +extension=pdo_mysql +extension=zip +``` + +### 其他重要配置 + +```ini +; 时区设置 +date.timezone = Asia/Shanghai + +; 上传限制 +upload_max_filesize = 100M +post_max_size = 100M +max_execution_time = 300 + +; 内存限制 +memory_limit = 256M +``` + +--- + +## 📦 Python 依赖列表 + +项目需要以下 Python 包(已在 requirements.txt 中): + +``` +fastapi>=0.110 # Web 框架 +uvicorn[standard]>=0.24 # ASGI 服务器 +sqlalchemy>=2.0 # ORM +pymysql>=1.1 # MySQL 驱动 +pydantic>=2.6 # 数据验证 +pydantic-settings>=2.1 # 配置管理 +python-dotenv>=1.0 # 环境变量 +requests>=2.31 # HTTP 客户端 +oss2>=2.18 # 阿里云 OSS +dashscope>=1.20 # 阿里云 AI +pyyaml>=6.0 # YAML 解析 +imageio-ffmpeg>=0.4 # 视频处理 +``` + +--- + +## ⚠️ 常见问题快速解决 + +### 问题 1: 端口被占用 +```cmd +# 查看占用进程 +netstat -ano | findstr :30100 +netstat -ano | findstr :30101 + +# 终止进程 +taskkill /F /PID 进程号 +``` + +### 问题 2: 数据库连接失败 +检查: +1. MySQL 服务是否启动 +2. 用户名密码是否正确(root / rootx77) +3. 数据库名称是否正确(ai_friend) + +```cmd +# 启动 MySQL 服务 +net start MySQL80 + +# 测试连接 +mysql -u root -prootx77 +``` + +### 问题 3: Python 模块未找到 +```cmd +# 重新安装依赖 +pip install -r lover/requirements.txt --force-reinstall +``` + +### 问题 4: PHP 扩展缺失 +```cmd +# 查看已加载的扩展 +php -m + +# 如果缺少扩展,编辑 php.ini 启用 +``` + +### 问题 5: Composer 安装失败 +```cmd +# 清理缓存 +composer clear-cache + +# 使用国内镜像 +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ + +# 重新安装 +cd xunifriend_RaeeC +composer install +``` + +--- + +## 🎨 管理后台登录 + +### 默认管理员账号 + +查看数据库获取管理员账号: +```sql +SELECT username, password FROM nf_admin LIMIT 1; +``` + +如果没有管理员账号,可以手动创建: +```sql +INSERT INTO nf_admin (username, password, nickname, email, status) +VALUES ('admin', MD5('admin123'), '管理员', 'admin@example.com', 'normal'); +``` + +然后访问: http://127.0.0.1:30100/admin + +--- + +## 📱 API 接口测试 + +### 使用 API 文档测试 + +1. 访问: http://127.0.0.1:30101/docs +2. 展开任意接口 +3. 点击 "Try it out" +4. 填写参数 +5. 点击 "Execute" +6. 查看响应结果 + +### 主要接口分类 + +- **/api/user** - 用户管理 +- **/api/lover** - 虚拟恋人 +- **/api/chat** - AI 对话 +- **/api/voice_call** - 语音通话 +- **/api/outfit** - 服装系统 +- **/api/dance** - 舞蹈视频 +- **/api/sing** - AI 唱歌 +- **/api/dynamic** - 动态朋友圈 +- **/api/friend** - 好友系统 + +--- + +## 🔐 开发模式说明 + +当前配置为开发模式: +```env +APP_ENV=development +DEBUG=True +``` + +开发模式特性: +- ✅ 详细的错误信息 +- ✅ 自动跳过部分认证(方便测试) +- ✅ 热重载(代码修改自动生效) +- ✅ 可使用测试用户 ID + +### 测试用户 + +在开发模式下,可以使用 Header 传递用户 ID: +``` +X-User-Id: 70 +``` + +这样可以跳过 Token 验证,直接测试接口。 + +--- + +## 📊 数据库表说明 + +### 核心表 +- `nf_user` - 用户基础信息 +- `nf_lovers` - 虚拟恋人档案 +- `nf_chat_session` - 聊天会话 +- `nf_chat_message` - 聊天消息 +- `nf_chat_fact` - 长期记忆 + +### 功能表 +- `nf_outfit_items` - 服装商品 +- `nf_voice_library` - 声音库 +- `nf_song_library` - 歌曲库 +- `nf_motion_templates` - 舞蹈模板 +- `nf_generation_tasks` - AI 生成任务 + +### 社交表 +- `nf_friend_relations` - 好友关系 +- `nf_dynamics` - 动态内容 +- `nf_dynamic_likes` - 点赞 +- `nf_dynamic_comments` - 评论 + +--- + +## 🎯 下一步操作 + +启动成功后,建议按以下顺序测试: + +1. **访问 API 文档** + http://127.0.0.1:30101/docs + +2. **测试健康检查** + http://127.0.0.1:30101/health + +3. **访问 PHP 后台** + http://127.0.0.1:30100/admin + +4. **测试用户接口** + 在 API 文档中测试 `/api/user` 相关接口 + +5. **测试 AI 功能** + 测试聊天、图像生成等 AI 接口 + +--- + +## 📞 需要帮助? + +如果遇到问题: + +1. **查看日志** + - Python 日志:启动窗口的控制台输出 + - PHP 日志:`xunifriend_RaeeC/runtime/log/` + +2. **检查配置** + - 数据库连接是否正确 + - PHP 扩展是否启用 + - Python 依赖是否安装 + +3. **参考文档** + - `运行指南.md` - 详细安装教程 + - `启动前检查清单.md` - 逐项检查清单 + +--- + +**准备好了吗?开始启动项目吧!** 🚀 + +```cmd +启动项目.bat +``` diff --git a/快速安装依赖.bat b/快速安装依赖.bat new file mode 100644 index 0000000..68f54e5 --- /dev/null +++ b/快速安装依赖.bat @@ -0,0 +1,84 @@ +@echo off +chcp 65001 >nul +title 快速安装依赖(忽略扩展检查) + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 快速安装依赖(忽略扩展检查) ║ +echo ╚════════════════════════════════════╝ +echo. +echo 说明:此脚本会忽略 PHP 扩展检查 +echo 项目仍然可以运行,但建议稍后配置扩展 +echo. +echo 按任意键继续... +pause >nul + +REM ========================================== +REM 配置 Composer 镜像 +REM ========================================== +echo. +echo [1/3] 配置 Composer 国内镜像... +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +echo [成功] 镜像配置完成 +echo. + +REM ========================================== +REM 安装 PHP 依赖(忽略平台要求) +REM ========================================== +echo [2/3] 安装 PHP 依赖... +echo. +cd /d "%~dp0xunifriend_RaeeC" + +echo 正在安装(忽略扩展检查)... +composer install --ignore-platform-reqs + +if errorlevel 1 ( + echo. + echo [错误] 安装失败 + pause + exit /b 1 +) + +echo. +echo [成功] PHP 依赖安装完成 +echo. + +REM ========================================== +REM 安装 Python 依赖 +REM ========================================== +echo [3/3] 安装 Python 依赖... +echo. +cd /d "%~dp0" + +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple + +if errorlevel 1 ( + echo. + echo [警告] Python 依赖安装可能有问题 + echo. +) else ( + echo. + echo [成功] Python 依赖安装完成 + echo. +) + +REM ========================================== +REM 完成 +REM ========================================== +echo. +echo ╔════════════════════════════════════╗ +echo ║ 安装完成! ║ +echo ╚════════════════════════════════════╝ +echo. +echo ✓ PHP 依赖已安装(已忽略扩展检查) +echo ✓ Python 依赖已安装 +echo. +echo ⚠️ 重要提示: +echo 虽然依赖已安装,但建议配置 PHP 扩展 +echo 运行 配置PHP扩展.bat 进行配置 +echo. +echo 下一步: +echo 1. 确保 MySQL 数据库已启动 +echo 2. 运行 启动项目.bat 启动服务 +echo. +pause diff --git a/故障排查指南.md b/故障排查指南.md new file mode 100644 index 0000000..148d621 --- /dev/null +++ b/故障排查指南.md @@ -0,0 +1,340 @@ +# 🔧 故障排查指南 + +## 当前问题:PHP 返回 500 错误 + +### 问题现象 +- 访问 http://127.0.0.1:30100 显示"您所浏览的页面暂时无法访问" +- PHP 服务日志显示 `[500]: GET /index/user/index.html` + +--- + +## 🔍 排查步骤 + +### 第一步:运行诊断脚本 + +访问测试页面: +``` +http://127.0.0.1:30100/test_db.php +``` + +这个页面会检查: +- ✅ PHP 版本和扩展 +- ✅ 数据库连接 +- ✅ 数据表列表 +- ✅ ThinkPHP 框架文件 +- ✅ Composer 依赖 +- ✅ 目录权限 + +根据测试结果,找出具体问题。 + +--- + +### 第二步:检查 Composer 依赖 + +最常见的问题是 Composer 依赖未安装。 + +**检查方法:** +```cmd +cd xunifriend_RaeeC +dir vendor +``` + +如果 `vendor` 目录不存在或为空,需要安装依赖: + +```cmd +cd xunifriend_RaeeC +composer install +``` + +**如果 composer 很慢,使用国内镜像:** +```cmd +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +composer install +``` + +--- + +### 第三步:检查 PHP 扩展 + +**查看已加载的扩展:** +```cmd +php -m +``` + +**必需的扩展:** +- mysqli +- pdo_mysql +- mbstring +- curl +- openssl +- fileinfo +- json + +**如果缺少扩展,编辑 php.ini:** +1. 找到 PHP 安装目录下的 `php.ini` 文件 +2. 搜索扩展名(如 `extension=mysqli`) +3. 删除前面的分号 `;` 取消注释 +4. 保存文件 +5. 重启 PHP 服务 + +--- + +### 第四步:检查数据库连接 + +**测试数据库连接:** +```cmd +mysql -u root -prootx77 -e "USE ai_friend; SELECT COUNT(*) FROM nf_user;" +``` + +**如果连接失败:** + +1. **检查 MySQL 服务是否运行** + ```cmd + net start MySQL80 + ``` + +2. **检查密码是否正确** + ```cmd + mysql -u root -prootx77 + ``` + +3. **检查数据库是否存在** + ```sql + SHOW DATABASES; + ``` + +4. **如果数据库不存在,创建它** + ```sql + CREATE DATABASE ai_friend CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + ``` + +--- + +### 第五步:检查目录权限 + +**确保以下目录可写:** +``` +xunifriend_RaeeC/runtime/ +xunifriend_RaeeC/runtime/cache/ +xunifriend_RaeeC/runtime/log/ +xunifriend_RaeeC/public/uploads/ +``` + +**Windows 下通常不需要特殊设置,但可以检查:** +1. 右键点击目录 +2. 选择"属性" +3. 取消"只读"属性(如果勾选了) + +--- + +### 第六步:查看 PHP 错误日志 + +**查看 ThinkPHP 日志:** +``` +xunifriend_RaeeC/runtime/log/ +``` + +打开最新的日志文件,查看错误信息。 + +**常见错误及解决方法:** + +#### 错误 1: Class 'think\App' not found +**原因:** Composer 依赖未安装 +**解决:** +```cmd +cd xunifriend_RaeeC +composer install +``` + +#### 错误 2: SQLSTATE[HY000] [2002] Connection refused +**原因:** 数据库连接失败 +**解决:** +1. 检查 MySQL 服务是否运行 +2. 检查 `.env` 文件中的数据库配置 +3. 测试数据库连接 + +#### 错误 3: SQLSTATE[42S02]: Base table or view not found +**原因:** 数据表不存在 +**解决:** +1. 确认数据库已导入 +2. 检查表前缀是否正确(nf_) + +#### 错误 4: Call to undefined function mysqli_connect() +**原因:** mysqli 扩展未启用 +**解决:** +1. 编辑 php.ini +2. 取消注释 `extension=mysqli` +3. 重启 PHP 服务 + +--- + +## 🛠️ 快速修复方案 + +### 方案 1:重新安装 Composer 依赖 + +```cmd +cd xunifriend_RaeeC +rmdir /s /q vendor +composer install +``` + +### 方案 2:清理缓存 + +```cmd +cd xunifriend_RaeeC +rmdir /s /q runtime\cache +rmdir /s /q runtime\log +mkdir runtime\cache +mkdir runtime\log +``` + +### 方案 3:重置数据库配置 + +编辑 `xunifriend_RaeeC/.env`,确保配置正确: +```env +[database] +type = mysql +hostname = localhost +database = ai_friend +username = root +password = rootx77 +hostport = 3306 +charset = utf8mb4 +prefix = nf_ +debug = true +``` + +### 方案 4:使用简化的测试页面 + +访问:http://127.0.0.1:30100/test.php + +查看是否能正常访问 PHP。 + +--- + +## 📋 完整检查清单 + +按顺序检查以下项目: + +### PHP 环境 +- [ ] PHP 版本 >= 8.0 +- [ ] php.ini 已配置 +- [ ] 必需扩展已启用 +- [ ] PHP 可以正常运行 + +### Composer 依赖 +- [ ] Composer 已安装 +- [ ] vendor 目录存在 +- [ ] 依赖包已安装完整 + +### 数据库 +- [ ] MySQL 服务运行中 +- [ ] 数据库 ai_friend 存在 +- [ ] 用户名密码正确 +- [ ] 数据表已导入(30+ 张表) +- [ ] 表前缀为 nf_ + +### 配置文件 +- [ ] xunifriend_RaeeC/.env 存在 +- [ ] 数据库配置正确 +- [ ] 字符集为 utf8mb4 + +### 目录权限 +- [ ] runtime 目录可写 +- [ ] runtime/cache 目录可写 +- [ ] runtime/log 目录可写 +- [ ] public/uploads 目录可写 + +### ThinkPHP 框架 +- [ ] thinkphp 目录存在 +- [ ] application 目录存在 +- [ ] install.lock 文件存在 + +--- + +## 🔄 重启服务 + +修改配置后,需要重启 PHP 服务: + +1. 在 PHP 服务窗口按 `Ctrl+C` 停止 +2. 重新运行启动脚本: + ```cmd + 启动项目.bat + ``` + +或者手动启动: +```cmd +cd xunifriend_RaeeC\public +php -S 0.0.0.0:30100 router.php +``` + +--- + +## 📞 仍然无法解决? + +### 1. 查看详细错误信息 + +在 `xunifriend_RaeeC/.env` 中启用调试模式: +```env +app_debug = true +app_trace = true +``` + +重启服务后,错误信息会直接显示在浏览器中。 + +### 2. 查看日志文件 + +``` +xunifriend_RaeeC/runtime/log/ +``` + +打开最新的日志文件,查找错误堆栈。 + +### 3. 使用测试脚本 + +访问:http://127.0.0.1:30100/test_db.php + +查看详细的环境检查结果。 + +### 4. 检查端口占用 + +```cmd +netstat -ano | findstr :30100 +``` + +如果端口被占用,终止进程或更换端口。 + +--- + +## ✅ 成功标志 + +当以下条件都满足时,说明 PHP 后台已正常运行: + +1. ✅ 访问 http://127.0.0.1:30100 不再显示 500 错误 +2. ✅ 访问 http://127.0.0.1:30100/test_db.php 显示所有检查通过 +3. ✅ PHP 服务日志显示 `[200]` 状态码 +4. ✅ 可以访问管理后台 http://127.0.0.1:30100/admin + +--- + +## 🎯 下一步 + +PHP 后台正常运行后: + +1. **测试 Python 后端** + 访问:http://127.0.0.1:30101/docs + +2. **测试 API 接口** + 在 API 文档中测试各个接口 + +3. **访问管理后台** + http://127.0.0.1:30100/admin + +4. **开始开发** + 根据需求修改代码 + +--- + +**记住:大多数 500 错误都是因为 Composer 依赖未安装!** + +先运行 `composer install`,90% 的问题都能解决。 diff --git a/数据库_修正.sql b/数据库_修正.sql new file mode 100644 index 0000000..279d359 --- /dev/null +++ b/数据库_修正.sql @@ -0,0 +1,2324 @@ +USE ai_friend; +-- MySQL dump 10.13 Distrib 8.0.44, for Win64 (x86_64) +-- +-- Host: localhost Database: fastadmin +-- ------------------------------------------------------ +-- Server version 8.0.44 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `nf_admin` +-- + +DROP TABLE IF EXISTS `nf_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_admin` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `username` varchar(20) DEFAULT '' COMMENT '鐢ㄦ埛鍚?, + `nickname` varchar(50) DEFAULT '' COMMENT '鏄电О', + `password` varchar(32) DEFAULT '' COMMENT '瀵嗙爜', + `salt` varchar(30) DEFAULT '' COMMENT '瀵嗙爜鐩?, + `avatar` varchar(255) DEFAULT '' COMMENT '澶村儚', + `email` varchar(100) DEFAULT '' COMMENT '鐢靛瓙閭', + `mobile` varchar(11) DEFAULT '' COMMENT '鎵嬫満鍙风爜', + `loginfailure` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '澶辫触娆℃暟', + `logintime` bigint DEFAULT NULL COMMENT '鐧诲綍鏃堕棿', + `loginip` varchar(50) DEFAULT NULL COMMENT '鐧诲綍IP', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `token` varchar(59) DEFAULT '' COMMENT 'Session鏍囪瘑', + `status` varchar(30) NOT NULL DEFAULT 'normal' COMMENT '鐘舵€?, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绠$悊鍛樿〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_admin` +-- + +LOCK TABLES `nf_admin` WRITE; +/*!40000 ALTER TABLE `nf_admin` DISABLE KEYS */; +INSERT INTO `nf_admin` VALUES (1,'admin','Admin','ac8b3f377cfb95899910a712aaac3aaa','89beea','/uploads/20251227/e3e159f0261ac561f1d05a2977c40120.jpg','admin@admin.com','',0,1769394622,'123.131.171.205',1491635035,1769394622,'a2e0ef68-e8c2-43a2-95bd-d38012211d29','normal'); +/*!40000 ALTER TABLE `nf_admin` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_admin_log` +-- + +DROP TABLE IF EXISTS `nf_admin_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_admin_log` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `admin_id` int unsigned NOT NULL DEFAULT '0' COMMENT '绠$悊鍛業D', + `username` varchar(30) DEFAULT '' COMMENT '绠$悊鍛樺悕瀛?, + `url` varchar(1500) DEFAULT '' COMMENT '鎿嶄綔椤甸潰', + `title` varchar(100) DEFAULT '' COMMENT '鏃ュ織鏍囬', + `content` longtext NOT NULL COMMENT '鍐呭', + `ip` varchar(50) DEFAULT '' COMMENT 'IP', + `useragent` varchar(255) DEFAULT '' COMMENT 'User-Agent', + `createtime` bigint DEFAULT NULL COMMENT '鎿嶄綔鏃堕棿', + PRIMARY KEY (`id`), + KEY `name` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=549 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绠$悊鍛樻棩蹇楄〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_admin_log` +-- + +LOCK TABLES `nf_admin_log` WRITE; +/*!40000 ALTER TABLE `nf_admin_log` DISABLE KEYS */; +INSERT INTO `nf_admin_log` VALUES (1,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"u55t\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459085),(2,1,'admin','/QuDtIGkwdR.php/addon/install','鎻掍欢绠$悊','{\"name\":\"third\",\"force\":\"0\",\"uid\":\"7733\",\"token\":\"***\",\"version\":\"1.4.7\",\"faversion\":\"1.6.1.20250430\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459165),(3,1,'admin','/QuDtIGkwdR.php/addon/state','鎻掍欢绠$悊 / 绂佺敤鍚敤','{\"name\":\"third\",\"action\":\"enable\",\"force\":\"0\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459165),(4,1,'admin','/QuDtIGkwdR.php/addon/install','鎻掍欢绠$悊','{\"name\":\"summernote\",\"force\":\"0\",\"uid\":\"7733\",\"token\":\"***\",\"version\":\"1.2.2\",\"faversion\":\"1.6.1.20250430\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459200),(5,1,'admin','/QuDtIGkwdR.php/addon/state','鎻掍欢绠$悊 / 绂佺敤鍚敤','{\"name\":\"summernote\",\"action\":\"enable\",\"force\":\"0\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459200),(6,1,'admin','/QuDtIGkwdR.php/addon/install','鎻掍欢绠$悊','{\"name\":\"epay\",\"force\":\"0\",\"uid\":\"7733\",\"token\":\"***\",\"version\":\"1.3.15\",\"faversion\":\"1.6.1.20250430\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459221),(7,1,'admin','/QuDtIGkwdR.php/addon/state','鎻掍欢绠$悊 / 绂佺敤鍚敤','{\"name\":\"epay\",\"action\":\"enable\",\"force\":\"0\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766459221),(8,1,'admin','/QuDtIGkwdR.php/addon/install','鎻掍欢绠$悊','{\"name\":\"alioss\",\"force\":\"0\",\"uid\":\"7733\",\"token\":\"***\",\"version\":\"1.2.6\",\"faversion\":\"1.6.1.20250430\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766462058),(9,1,'admin','/QuDtIGkwdR.php/addon/state','鎻掍欢绠$悊 / 绂佺敤鍚敤','{\"name\":\"alioss\",\"action\":\"enable\",\"force\":\"0\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766462059),(10,1,'admin','/QuDtIGkwdR.php/addon/config?name=third&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"third\",\"dialog\":\"1\",\"row\":{\"qq\":\"{"app_id":"100000000","app_secret":"123456","scope":"get_user_info"}\",\"wechat\":\"{"app_id":"100000000"," app_secret":"123456","scope":"snsapi_userinfo"}\",\"wechatweb\":\"{"app_id":"100000000","app_secret":"123456","scope":"snsapi_login"}\",\"weibo\":\"{"app_id":"wx87fdb468bb2d141a","app_secret":"802e25b89b910853264fc7fd18ed4965","scope":"get_user_info"}\",\"bindaccount\":\"0\",\"status\":[\"wechat\"],\"rewrite\":\"{"index\\\\\\/index":"\\\\\\/third$","index\\\\\\/connect":"\\\\\\/third\\\\\\/connect\\\\\\/[:platform]","index\\\\\\/callback":"\\\\\\/third\\\\\\/callback\\\\\\/[:platform]","index\\\\\\/bind":"\\\\\\/third\\\\\\/bind\\\\\\/[:platform]","index\\\\\\/unbind":"\\\\\\/third\\\\\\/unbind\\\\\\/[:platform]"}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766472103),(11,1,'admin','/QuDtIGkwdR.php/addon/config?name=third&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"third\",\"dialog\":\"1\",\"row\":{\"qq\":\"{"app_id":"100000000","app_secret":"123456","scope":"get_user_info"}\",\"wechat\":\"{"app_id":"wx87fdb468bb2d141a"," app_secret":"802e25b89b910853264fc7fd18ed4965","scope":"snsapi_userinfo"}\",\"wechatweb\":\"{"app_id":"100000000","app_secret":"123456","scope":"snsapi_login"}\",\"weibo\":\"{"app_id":"wx87fdb468bb2d141a","app_secret":"802e25b89b910853264fc7fd18ed4965","scope":"get_user_info"}\",\"bindaccount\":\"0\",\"status\":[\"wechat\"],\"rewrite\":\"{"index\\\\\\/index":"\\\\\\/third$","index\\\\\\/connect":"\\\\\\/third\\\\\\/connect\\\\\\/[:platform]","index\\\\\\/callback":"\\\\\\/third\\\\\\/callback\\\\\\/[:platform]","index\\\\\\/bind":"\\\\\\/third\\\\\\/bind\\\\\\/[:platform]","index\\\\\\/unbind":"\\\\\\/third\\\\\\/unbind\\\\\\/[:platform]"}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766477725),(12,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"jxae\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480537),(13,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"wxapp\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480669),(14,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"wxapp_appid\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480725),(15,1,'admin','/QuDtIGkwdR.php/general.config/add','甯歌绠$悊 / 绯荤粺閰嶇疆 / 娣诲姞','{\"__token__\":\"***\",\"row\":{\"group\":\"basic\",\"type\":\"string\",\"name\":\"wxapp_appid\",\"title\":\"AppID\",\"setting\":{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"},\"value\":\"\",\"content\":\"value1|title1\\r\\nvalue2|title2\",\"tip\":\"灏忕▼搴廰ppid\",\"rule\":\"\",\"visible\":\"\",\"extend\":\"\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480755),(16,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"wxapp_appSecret\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480790),(17,1,'admin','/QuDtIGkwdR.php/general.config/add','甯歌绠$悊 / 绯荤粺閰嶇疆 / 娣诲姞','{\"__token__\":\"***\",\"row\":{\"group\":\"basic\",\"type\":\"string\",\"name\":\"wxapp_appSecret\",\"title\":\"灏忕▼搴廇ppSecret\",\"setting\":{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"},\"value\":\"\",\"content\":\"value1|title1\\r\\nvalue2|title2\",\"tip\":\"灏忕▼搴廇ppSecret\",\"rule\":\"\",\"visible\":\"\",\"extend\":\"\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480805),(18,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"name\":\"铏氭嫙濂冲弸\",\"beian\":\"\",\"version\":\"1.0.1\",\"timezone\":\"Asia\\/Shanghai\",\"forbiddenip\":\"\",\"languages\":\"{"backend":"zh-cn","frontend":"zh-cn"}\",\"fixedpage\":\"dashboard\",\"wxapp_appid\":\"wx87fdb468bb2d141a\",\"wxapp_appSecret\":\"802e25b89b910853264fc7fd18ed4965\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766480946),(19,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"name\":\"铏氭嫙濂冲弸\",\"beian\":\"\",\"version\":\"1.0.1\",\"timezone\":\"Asia\\/Shanghai\",\"forbiddenip\":\"\",\"languages\":\"{"backend":"zh-cn","frontend":"zh-cn"}\",\"fixedpage\":\"dashboard\",\"wxapp_appid\":\"wx87fdb468bb2d141a\",\"wxapp_appsecret\":\"802e25b89b910853264fc7fd18ed4965\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766481743),(20,1,'admin','/QuDtIGkwdR.php/addon/install','鎻掍欢绠$悊','{\"name\":\"command\",\"force\":\"0\",\"uid\":\"76342\",\"token\":\"***\",\"version\":\"1.1.3\",\"faversion\":\"1.6.1.20250430\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542513),(21,1,'admin','/QuDtIGkwdR.php/addon/state','鎻掍欢绠$悊 / 绂佺敤鍚敤','{\"name\":\"command\",\"action\":\"enable\",\"force\":\"0\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542514),(22,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542528),(23,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_hobbies\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542540),(24,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542551),(25,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542552),(26,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542553),(27,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542553),(28,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"relation\":{\"2\":{\"relation\":\"nf_admin\",\"relationmode\":\"belongsto\",\"relationforeignkey\":\"id\",\"relationprimarykey\":\"id\"}},\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542569),(29,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"relation\":{\"2\":{\"relation\":\"nf_admin\",\"relationmode\":\"belongsto\",\"relationforeignkey\":\"id\",\"relationprimarykey\":\"id\"}},\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542578),(30,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542591),(31,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542596),(32,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542600),(33,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542602),(34,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Hobbies.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542604),(35,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Hobbies.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542608),(36,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542634),(37,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_hobbies\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542639),(38,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"name\",\"weigh\",\"createtime\",\"updatetime\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542659),(39,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"name\",\"weigh\",\"createtime\",\"updatetime\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542665),(40,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"name\",\"weigh\",\"createtime\",\"updatetime\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766542667),(41,1,'admin','/QuDtIGkwdR.php/hobbies/add?dialog=1','鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓告垙\",\"weigh\":\"99\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766544314),(42,1,'admin','/QuDtIGkwdR.php/hobbies/add?dialog=1','鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍔ㄦ极\",\"weigh\":\"98\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766544406),(43,1,'admin','/QuDtIGkwdR.php/hobbies/add?dialog=1','鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"灏忚\",\"weigh\":\"100\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766544430),(44,1,'admin','/QuDtIGkwdR.php/hobbies/add?dialog=1','鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐭墽\",\"weigh\":\"97\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766544446),(45,1,'admin','/QuDtIGkwdR.php/hobbies/del','鍏磋叮鏍囩 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"5\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766545028),(46,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564028),(47,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_voice_library\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564035),(48,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564172),(49,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_voice_library\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564176),(50,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_voice_library\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"id\",\"name\",\"gender\",\"style_tag\",\"avatar_url\",\"price_gold\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564207),(51,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_voice_library\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"id\",\"name\",\"gender\",\"style_tag\",\"avatar_url\",\"price_gold\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564211),(52,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564217),(53,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564220),(54,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564223),(55,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564283),(56,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"voice\\/Library.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564289),(57,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"voice\\/Library.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766564294),(58,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565442),(59,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_gifts\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565446),(60,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565449),(61,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565454),(62,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565464),(63,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565466),(64,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"gi\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"gi\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565468),(65,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565470),(66,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Gifts.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565471),(67,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Gifts.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565474),(68,1,'admin','/QuDtIGkwdR.php/gifts/add?dialog=1','绀肩墿 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"蹇冩効鐡禱",\"price\":\"10\",\"intimacy_value\":\"10\",\"image\":\"\",\"weigh\":\"0\",\"status\":\"1\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565505),(69,1,'admin','/QuDtIGkwdR.php/gifts/add?dialog=1','绀肩墿 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"褰╄櫣\",\"price\":\"20\",\"intimacy_value\":\"20\",\"image\":\"\",\"weigh\":\"0\",\"status\":\"1\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565525),(70,1,'admin','/QuDtIGkwdR.php/gifts/add?dialog=1','绀肩墿 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐖卞績淇″皝\",\"price\":\"30\",\"intimacy_value\":\"30\",\"image\":\"\",\"weigh\":\"0\",\"status\":\"1\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565544),(71,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565595),(72,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_gifts\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565599),(73,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565602),(74,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565604),(75,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/3?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鐖卞績淇″皝\",\"title\":\"閫佺埍蹇冧俊灏侊紝甯粬瀹炵幇鎰挎湜\",\"price\":\"30.00\",\"intimacy_value\":\"30\",\"image\":\"\",\"weigh\":\"3\",\"status\":\"1\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565646),(76,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/2?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"褰╄櫣\",\"title\":\"閫佸僵铏癸紝甯粬瀹炵幇鎰挎湜\",\"price\":\"20.00\",\"intimacy_value\":\"20\",\"image\":\"\",\"weigh\":\"2\",\"status\":\"1\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565664),(77,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/1?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"蹇冩効鐡禱",\"title\":\"閫佸績鎰跨摱锛屽府浠栧疄鐜版効鏈沑",\"price\":\"10.00\",\"intimacy_value\":\"10\",\"image\":\"\",\"weigh\":\"1\",\"status\":\"1\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766565673),(78,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/106?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"voice\\/library\",\"title\":\"铏氭嫙瑙掕壊\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"106\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766566162),(79,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"105\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766566171),(80,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567807),(81,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_hobbies\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567816),(82,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hobbies\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567828),(83,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hobbies\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567830),(84,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567835),(85,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567840),(86,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Hobbies.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567844),(87,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Hobbies.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567847),(88,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_mould\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567852),(89,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567854),(90,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567856),(91,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567860),(92,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567861),(93,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567864),(94,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Mould.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567866),(95,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Mould.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567870),(96,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/121?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"girlfriend\",\"title\":\"铏氭嫙濂冲弸璁剧疆\",\"url\":\"\",\"icon\":\"fa fa-list\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"121\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567937),(97,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/106?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"121\",\"name\":\"voice\\/library\",\"title\":\"铏氭嫙瑙掕壊\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"106\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567950),(98,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍔ㄦ极\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567962),(99,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓告垙\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567968),(100,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍗¢€歕",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766567974),(101,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/131?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"121\",\"name\":\"girlfriend\\/mould\",\"title\":\"鎬ф牸妯℃澘\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"131\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766568020),(102,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂煍瀛﹀\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766568044),(103,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍌插▏濡瑰\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766568053),(104,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"绮剧灏忓\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766568070),(105,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626059),(106,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_intimacy_config\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626063),(107,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626065),(108,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626079),(109,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626081),(110,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626088),(111,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"intimacy\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"intimacy\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626090),(112,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626091),(113,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Config.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626093),(114,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Config.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626096),(115,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/140?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"intimacy\",\"title\":\"浜插瘑搴︾鐞哱",\"url\":\"\",\"icon\":\"fa fa-list\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"140\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766626117),(116,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627220),(117,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_eyecolor\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627226),(118,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_eyecolor\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627232),(119,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_eyecolor\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627234),(120,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_hairstyles\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627242),(121,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627244),(122,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627247),(123,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627251),(124,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627254),(125,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627260),(126,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627263),(127,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627266),(128,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Eyecolor.php,girlfriend\\/Hairstyles.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627269),(129,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Eyecolor.php,girlfriend\\/Hairstyles.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627274),(130,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"榛戣壊\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627296),(131,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"瑜愯壊\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627304),(132,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627324),(133,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"缁胯壊\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627331),(134,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐏拌壊\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627346),(135,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍙岄┈灏綷",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627369),(136,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"涓稿瓙澶碶",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627376),(137,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"榻愬垬娴穃",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627384),(138,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"澶ф尝娴猏",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766627396),(139,1,'admin','/QuDtIGkwdR.php/command/execute/ids/16','鍦ㄧ嚎鍛戒护绠$悊 / 鍐嶆鎵ц鍛戒护','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"ids\":\"16\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766627566),(140,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766627696),(141,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_intimacy_config\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766627703),(142,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766627706),(143,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766627713),(144,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"鏂囧瓧鑱婂ぉ\",\"title\":\"鏂囧瓧鑱婂ぉ寮€鍚ソ鍙嬩箣鏃匼",\"level\":\"0\",\"intimacy\":\"0\",\"weigh\":\"9999\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628030),(145,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"璇煶\",\"title\":\"璇煶\",\"level\":\"1\",\"intimacy\":\"100\",\"weigh\":\"9998\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628074),(146,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"鍥剧墖\",\"title\":\"鍥剧墖\",\"level\":\"3\",\"intimacy\":\"200\",\"weigh\":\"9997\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628100),(147,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/3?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"鍥剧墖\",\"title\":\"鍥剧墖\",\"level\":\"2\",\"intimacy\":\"200\",\"weigh\":\"9997\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628112),(148,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"瑙嗛\",\"title\":\"瑙嗛\",\"level\":\"3\",\"intimacy\":\"300\",\"weigh\":\"9996\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628145),(149,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"瀹炴椂璇煶\",\"title\":\"瀹炴椂璇煶\",\"level\":\"4\",\"intimacy\":\"500\",\"weigh\":\"9995\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628190),(150,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"瀹炴椂瑙嗛\",\"title\":\"瀹炴椂瑙嗛\",\"level\":\"5\",\"intimacy\":\"600\",\"weigh\":\"9994\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766628211),(151,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA6210zJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-shenzhen.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/nvlovers.oss-cn-gingdao.aliyuncs.com\\/\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766630138),(152,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766630384),(153,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766630448),(154,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631879),(155,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_intimacy_day\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631892),(156,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_day\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631894),(157,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_day\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631898),(158,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631903),(159,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"intimacy_day\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"intimacy_day\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631905),(160,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"intimacyday\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"intimacyday\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631907),(161,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"day\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"day\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631910),(162,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631913),(163,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Day.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631914),(164,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Day.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631917),(165,1,'admin','/QuDtIGkwdR.php/intimacy/day/add?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩浠诲姟 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鏂囨湰鑱婂ぉ\",\"title\":\"姣忔鑱婂ぉ鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766631962),(166,1,'admin','/QuDtIGkwdR.php/intimacy/day/add?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩浠诲姟 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"闊宠棰戣亰澶‐",\"title\":\"闊宠棰戣亰澶╂瘡鍒嗛挓鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632011),(167,1,'admin','/QuDtIGkwdR.php/intimacy/day/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"闊宠棰戣亰澶‐",\"title\":\"闊宠棰戣亰澶╂瘡鍒嗛挓鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632031),(168,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"api\",\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766632180),(169,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/165?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"140\",\"name\":\"intimacy\\/day\",\"title\":\"姣忔棩涓婇檺绠$悊\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"165\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632190),(170,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766632200),(171,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"api\",\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766632233),(172,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"categorytype\":\"{"default":"榛樿","page":"鍗曢〉","article":"鏂囩珷","test":"Test"}\",\"configgroup\":\"{"basic":"鍩虹閰嶇疆","email":"閭欢閰嶇疆","dictionary":"瀛楀吀閰嶇疆","user":"浼氬憳閰嶇疆","example":"绀轰緥鍒嗙粍","intimacy_friend":"濂藉弸浜插瘑搴﹂厤缃?quot;}\",\"attachmentcategory\":\"{"category1":"鍒嗙被涓€","category2":"鍒嗙被浜?quot;,"custom":"鑷畾涔?quot;}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632256),(173,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"categorytype\":\"{"default":"榛樿","page":"鍗曢〉","article":"鏂囩珷","test":"Test"}\",\"configgroup\":\"{"basic":"鍩虹閰嶇疆","email":"閭欢閰嶇疆","dictionary":"瀛楀吀閰嶇疆","user":"浼氬憳閰嶇疆","example":"绀轰緥鍒嗙粍","intimacy_friend":"濂藉弸浜插瘑搴﹂厤缃?quot;}\",\"attachmentcategory\":\"{"category1":"鍒嗙被涓€","category2":"鍒嗙被浜?quot;,"custom":"鑷畾涔?quot;}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632280),(174,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"text\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632313),(175,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"intimacy_text\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632321),(176,1,'admin','/QuDtIGkwdR.php/general.config/add','甯歌绠$悊 / 绯荤粺閰嶇疆 / 娣诲姞','{\"__token__\":\"***\",\"row\":{\"group\":\"intimacy_friend\",\"type\":\"number\",\"name\":\"intimacy_text\",\"title\":\"姣忔潯鏂囨湰浜插瘑鍊糪",\"setting\":{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"},\"value\":\"\",\"content\":\"value1|title1\\r\\nvalue2|title2\",\"tip\":\"姣忔潯鏂囨湰浜插瘑鍊煎鍔犵殑浜插瘑鍊糪",\"rule\":\"\",\"visible\":\"\",\"extend\":\"\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632375),(177,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"intimacy_friend\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632401),(178,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"intimacy_friend\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632401),(179,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"intimacy_voice\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632413),(180,1,'admin','/QuDtIGkwdR.php/general.config/add','甯歌绠$悊 / 绯荤粺閰嶇疆 / 娣诲姞','{\"__token__\":\"***\",\"row\":{\"group\":\"intimacy_friend\",\"type\":\"number\",\"name\":\"intimacy_voice\",\"title\":\"闊宠棰戜翰瀵嗗€糪",\"setting\":{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"},\"value\":\"\",\"content\":\"value1|title1\\r\\nvalue2|title2\",\"tip\":\"姣忓垎閽熼煶瑙嗛澧炲姞鐨勪翰瀵嗗€糪",\"rule\":\"\",\"visible\":\"\",\"extend\":\"\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632437),(181,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"intimacy_text\":\"1\",\"intimacy_voice\":\"5\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766632447),(182,1,'admin','/QuDtIGkwdR.php/intimacy/day/edit/ids/1?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩涓婇檺绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鏂囨湰鑱婂ぉ\",\"title\":\"姣忔鑱婂ぉ鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"2\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766633242),(183,1,'admin','/QuDtIGkwdR.php/intimacy/day/edit/ids/1?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩涓婇檺绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鏂囨湰鑱婂ぉ\",\"title\":\"姣忔鑱婂ぉ鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766633252),(184,1,'admin','/QuDtIGkwdR.php/intimacy/day/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 姣忔棩涓婇檺绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"闊宠棰戣亰澶‐",\"title\":\"闊宠棰戣亰澶╂瘡鍒嗛挓鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"2\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766633258),(185,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766633568),(186,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766634451),(187,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"0\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766634862),(188,0,'Unknown','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"xrik\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766637652),(189,0,'Unknown','/QuDtIGkwdR.php/index/login','','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"xrik\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766637658),(190,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"fvnp\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766637666),(191,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"0\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"0\",\"noneedlogin\":[\"admin\"]}}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766638193),(192,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"nvlovers.oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"0\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766638200),(193,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/cdn.yourdomain.com\",\"uploadmode\":\"server\",\"serverbackup\":\"0\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766638510),(194,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/nvlovers.oss-cn-qingdao.aliyuncs.com\",\"uploadmode\":\"server\",\"serverbackup\":\"0\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766638579),(195,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"categorytype\":\"{"default":"榛樿","page":"鍗曢〉","article":"鏂囩珷","test":"Test"}\",\"configgroup\":\"{"basic":"鍩虹閰嶇疆","email":"閭欢閰嶇疆","dictionary":"瀛楀吀閰嶇疆","user":"浼氬憳閰嶇疆","intimacy_friend":"濂藉弸浜插瘑搴﹂厤缃?quot;}\",\"attachmentcategory\":\"{"category1":"鍒嗙被涓€","category2":"鍒嗙被浜?quot;,"custom":"鑷畾涔?quot;}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766644164),(196,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644441),(197,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_user_level\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644449),(198,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644452),(199,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644456),(200,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644461),(201,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644464),(202,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644466),(203,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644469),(204,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644471),(205,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644474),(206,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644516),(207,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644518),(208,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644520),(209,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644522),(210,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644524),(211,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"1\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644528),(212,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"1\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644531),(213,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/171?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"66\",\"name\":\"user\\/level\",\"title\":\"浼氬憳绛夌骇\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"171\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644569),(214,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/1?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/0a4699e1e6a28fc5cc57cd928291e5ea.png\",\"name\":\"鏂囧瓧鑱婂ぉ\",\"title\":\"鏂囧瓧鑱婂ぉ寮€鍚ソ鍙嬩箣鏃匼",\"level\":\"0\",\"intimacy\":\"0\",\"weigh\":\"9999\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766644596),(215,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/1?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/3be807b7cd645dc8353fb2adccb8e33d.png\",\"name\":\"鏂囧瓧鑱婂ぉ\",\"title\":\"鏂囧瓧鑱婂ぉ寮€鍚ソ鍙嬩箣鏃匼",\"level\":\"0\",\"intimacy\":\"0\",\"weigh\":\"9999\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646513),(216,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/2?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bbddb82729be60db78b4a9b658932a8f.png\",\"name\":\"璇煶\",\"title\":\"璇煶\",\"level\":\"1\",\"intimacy\":\"10\",\"weigh\":\"9998\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646531),(217,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/1?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/3be807b7cd645dc8353fb2adccb8e33d.png\",\"name\":\"鏂囧瓧鑱婂ぉ\",\"title\":\"寮€鍚瓧閲岃闂寸殑濂囧够涔嬫梾\",\"level\":\"0\",\"intimacy\":\"0\",\"weigh\":\"9999\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646610),(218,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/2?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bbddb82729be60db78b4a9b658932a8f.png\",\"name\":\"璇煶娑堟伅\",\"title\":\"浼犻€掓偍鐨勫0澹版俯鏆朶",\"level\":\"1\",\"intimacy\":\"10\",\"weigh\":\"9998\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646641),(219,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/3?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bef6315f368257b7b351c2187ed88066.png\",\"name\":\"璇煶閫氳瘽\",\"title\":\"闅忔椂闅忓湴鎷ㄦ墦鐢佃瘽\",\"level\":\"2\",\"intimacy\":\"200\",\"weigh\":\"9997\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646670),(220,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/4?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"name\":\"鐓х墖\",\"title\":\"瀹氭牸鎮ㄧ殑缇庝附瀹归\",\"level\":\"3\",\"intimacy\":\"300\",\"weigh\":\"9996\"},\"ids\":\"4\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646719),(221,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/5?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"name\":\"瑙嗛\",\"title\":\"闈㈠闈氦娴乗",\"level\":\"4\",\"intimacy\":\"500\",\"weigh\":\"9995\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646758),(222,1,'admin','/QuDtIGkwdR.php/user/level/edit/ids/6?dialog=1','浼氬憳绠$悊 / 浼氬憳绛夌骇 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"name\":\"Ta鐨勬棩璁癨",\"title\":\"鏌ョ湅鏃ヨ\",\"level\":\"5\",\"intimacy\":\"600\",\"weigh\":\"9994\"},\"ids\":\"6\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766646786),(223,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"璇煶\",\"title\":\"璇煶\",\"level\":\"1\",\"intimacy\":\"10\",\"weigh\":\"99977\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766647381),(224,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"璇煶\",\"title\":\"璇煶\",\"level\":\"2\",\"intimacy\":\"10\",\"weigh\":\"9977\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766647392),(225,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/3?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"鍥剧墖\",\"title\":\"鍥剧墖\",\"level\":\"1\",\"intimacy\":\"200\",\"weigh\":\"9998\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766647402),(226,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\",\"name\":\"璇煶\",\"title\":\"璇煶\",\"level\":\"2\",\"intimacy\":\"10\",\"weigh\":\"9997\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766647438),(227,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647479),(228,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_user_bond_config\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647498),(229,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647502),(230,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647508),(231,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647514),(232,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647520),(233,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647523),(234,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647525),(235,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/bond\\/Config.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647532),(236,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/bond\\/Config.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647541),(237,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/178?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"66\",\"name\":\"user\\/bond\\/config\",\"title\":\"姣忔棩浠诲姟\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"178\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647590),(238,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"177\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647602),(239,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647958),(240,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_user_level\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647964),(241,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647968),(242,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647971),(243,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_user_bond_config\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647979),(244,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647981),(245,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766647983),(246,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/2?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"闊宠棰戣亰澶‐",\"title\":\"闊宠棰戣亰澶╂瘡鍒嗛挓鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"2\",\"single_exp\":\"1\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648018),(247,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/1?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鏂囨湰鑱婂ぉ\",\"title\":\"姣忔鑱婂ぉ鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\",\"single_exp\":\"1\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648024),(248,1,'admin','/QuDtIGkwdR.php/command/execute/ids/28','鍦ㄧ嚎鍛戒护绠$悊 / 鍐嶆鎵ц鍛戒护','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"ids\":\"28\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648082),(249,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/1?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鑱婂ぉ璐$尞\",\"title\":\"姣忚疆鑱婂ぉ鍙幏寰?浜插瘑搴",\"upper\":\"100\",\"type\":\"1\",\"single_exp\":\"1\",\"weigh\":\"99\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648138),(250,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/2?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"璇煶閫氳瘽\",\"title\":\"姣忚闊抽€氳瘽1鍒嗛挓锛屽彲鑾峰緱5浜插瘑搴",\"upper\":\"100\",\"type\":\"2\",\"single_exp\":\"5\",\"weigh\":\"98\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648190),(251,1,'admin','/QuDtIGkwdR.php/user/bond/config/add?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"璧犻€佺ぜ鐗‐",\"title\":\"璧犻€佸埆浜虹ぜ鐗╋紝鎵嬫湁浣欓\",\"upper\":\"200\",\"type\":\"3\",\"single_exp\":\"100\",\"weigh\":\"97\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648218),(252,1,'admin','/QuDtIGkwdR.php/user/bond/config/add?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"浜掑姩璐$尞\",\"title\":\"鍜屾亱浜轰簰鍔╘",\"upper\":\"200\",\"type\":\"4\",\"single_exp\":\"100\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648248),(253,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/4?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"浜掑姩璐$尞\",\"title\":\"鍜屾亱浜轰簰鍔╘",\"upper\":\"200\",\"type\":\"4\",\"single_exp\":\"100\",\"weigh\":\"94\"},\"ids\":\"4\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766648261),(254,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/nvlovers.oss-cn-qingdao.aliyuncs.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766651338),(255,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/nvlovers.oss-cn-qingdao.aliyuncs.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766652050),(256,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674637),(257,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_mould\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674673),(258,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674677),(259,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674679),(260,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/9?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"绮剧灏忓\",\"weigh\":\"9\",\"gender\":\"female\"},\"ids\":\"9\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674702),(261,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/8?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鍌插▏濡瑰\",\"weigh\":\"8\",\"gender\":\"male\"},\"ids\":\"8\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674707),(262,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/7?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂煍瀛﹀\",\"weigh\":\"7\",\"gender\":\"general\"},\"ids\":\"7\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674712),(263,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/8?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鍌插▏濡瑰\",\"weigh\":\"8\",\"gender\":\"female\"},\"ids\":\"8\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674724),(264,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674811),(265,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_hairstyles\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674821),(266,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674827),(267,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674829),(268,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/edit/ids/13?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"澶ф尝娴猏",\"weigh\":\"13\",\"gender\":\"female\"},\"ids\":\"13\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674850),(269,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/edit/ids/12?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"榻愬垬娴穃",\"weigh\":\"12\",\"gender\":\"female\"},\"ids\":\"12\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766674856),(270,1,'admin','/QuDtIGkwdR.php/command/execute/ids/31','鍦ㄧ嚎鍛戒护绠$悊 / 鍐嶆鎵ц鍛戒护','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"ids\":\"31\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675010),(271,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/edit/ids/11?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"涓稿瓙澶碶",\"weigh\":\"11\",\"gender\":\"female\"},\"ids\":\"11\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675058),(272,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/edit/ids/10?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鍙岄┈灏綷",\"weigh\":\"10\",\"gender\":\"female\"},\"ids\":\"10\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675063),(273,1,'admin','/QuDtIGkwdR.php/command/execute/ids/30','鍦ㄧ嚎鍛戒护绠$悊 / 鍐嶆鎵ц鍛戒护','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"ids\":\"30\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675086),(274,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675113),(275,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_girlfriend_mould\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675131),(276,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675136),(277,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675138),(278,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/9?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"绮剧灏忓\",\"weigh\":\"9\",\"gender\":\"female\"},\"ids\":\"9\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766675164),(279,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"eyyv\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766731186),(280,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"閰风偒\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766735555),(281,1,'admin','/QuDtIGkwdR.php/user/bond/config/edit/ids/3?dialog=1','浼氬憳绠$悊 / 姣忔棩浠诲姟 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"璧犻€佺ぜ鐗‐",\"title\":\"璧犻€佸埆浜虹ぜ鐗╋紝鎵嬫湁浣欓\",\"upper\":\"200\",\"type\":\"3\",\"single_exp\":\"1\",\"weigh\":\"97\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766737639),(282,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐭彂\",\"weigh\":\"0\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766739895),(283,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"闀垮彂\",\"weigh\":\"0\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766739903),(284,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766741504),(285,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"閰风偒\",\"weigh\":\"0\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766745127),(286,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"閰穃",\"weigh\":\"0\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766745139),(287,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"categorytype\":\"{"default":"榛樿","page":"鍗曢〉","article":"鏂囩珷","test":"Test"}\",\"configgroup\":\"{"basic":"鍩虹閰嶇疆","email":"閭欢閰嶇疆","dictionary":"瀛楀吀閰嶇疆","user":"浼氬憳閰嶇疆","intimacy_friend":"濂藉弸浜插瘑搴﹂厤缃?quot;,"platform":"鍙傛暟閰嶇疆"}\",\"attachmentcategory\":\"{"category1":"鍒嗙被涓€","category2":"鍒嗙被浜?quot;,"custom":"鑷畾涔?quot;}\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766760296),(288,1,'admin','/QuDtIGkwdR.php/general/config/check','甯歌绠$悊 / 绯荤粺閰嶇疆','{\"row\":{\"name\":\"jinbi_scale\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766760344),(289,1,'admin','/QuDtIGkwdR.php/general.config/add','甯歌绠$悊 / 绯荤粺閰嶇疆 / 娣诲姞','{\"__token__\":\"***\",\"row\":{\"group\":\"platform\",\"type\":\"number\",\"name\":\"jinbi_scale\",\"title\":\"閲戝竵鍏戞崲姣斾緥\",\"setting\":{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"},\"value\":\"\",\"content\":\"value1|title1\\r\\nvalue2|title2\",\"tip\":\"1鍏冨厬鎹㈠灏戦噾甯侊紝涓嶈兘澶т簬100\",\"rule\":\"digits\",\"visible\":\"\",\"extend\":\"\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766760420),(290,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"jinbi_scale\":\"100\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766760462),(291,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761322),(292,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_count_package\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761337),(293,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_count_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761343),(294,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_count_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761345),(295,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_recharge_package\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761374),(296,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_recharge_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761378),(297,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_recharge_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761383),(298,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761390),(299,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761399),(300,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761406),(301,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"4\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761409),(302,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761412),(303,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761423),(304,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761425),(305,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761427),(306,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"2\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761428),(307,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761430),(308,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"3\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761433),(309,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"count\\/Package.php,recharge\\/Package.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761435),(310,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"count\\/Package.php,recharge\\/Package.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761439),(311,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/185?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"count\\/package\",\"title\":\"鎹㈣娆℃暟濂楅\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"185\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761484),(312,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/192?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"recharge\\/package\",\"title\":\"鍏呭€奸噾甯佸椁怽",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"192\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761502),(313,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"191\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761509),(314,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"184\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761514),(315,1,'admin','/QuDtIGkwdR.php/recharge/package/add?dialog=1','鍏呭€奸噾甯佸椁?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"1\",\"jinbi\":\"100\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761542),(316,1,'admin','/QuDtIGkwdR.php/recharge/package/add?dialog=1','鍏呭€奸噾甯佸椁?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"6\",\"jinbi\":\"600\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761550),(317,1,'admin','/QuDtIGkwdR.php/recharge/package/add?dialog=1','鍏呭€奸噾甯佸椁?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"10\",\"jinbi\":\"1000\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761559),(318,1,'admin','/QuDtIGkwdR.php/recharge/package/add?dialog=1','鍏呭€奸噾甯佸椁?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"30\",\"jinbi\":\"3000\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761567),(319,1,'admin','/QuDtIGkwdR.php/count/package/add?dialog=1','鎹㈣娆℃暟濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"1\",\"num\":\"1\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761590),(320,1,'admin','/QuDtIGkwdR.php/count/package/add?dialog=1','鎹㈣娆℃暟濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"10\",\"num\":\"10\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761596),(321,1,'admin','/QuDtIGkwdR.php/count/package/add?dialog=1','鎹㈣娆℃暟濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"50\",\"num\":\"50\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766761603),(322,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817891),(323,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817891),(324,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_vip_package\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817896),(325,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817899),(326,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817901),(327,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817905),(328,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"vip\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"vip\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817909),(329,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817911),(330,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"vip\\/Package.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817914),(331,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"vip\\/Package.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766817917),(332,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/199?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"vip\\/package\",\"title\":\"VIP濂楅\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"199\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818247),(333,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"198\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818253),(334,1,'admin','/QuDtIGkwdR.php/vip/package/add?dialog=1','VIP濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"14\",\"title\":\"鍖呮湀\",\"desc\":\"涔濇姌浼樻儬\",\"day\":\"30\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818310),(335,1,'admin','/QuDtIGkwdR.php/vip/package/add?dialog=1','VIP濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"40\",\"title\":\"鍖呭濂楅\",\"desc\":\"涔濇姌浼樻儬\",\"day\":\"90\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818353),(336,1,'admin','/QuDtIGkwdR.php/vip/package/add?dialog=1','VIP濂楅 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"money\":\"180\",\"title\":\"鍖呭勾濂楅\",\"desc\":\"涔濇姌浼樻儬\",\"day\":\"365\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818370),(337,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818485),(338,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_vip_package\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818491),(339,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818494),(340,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818495),(341,1,'admin','/QuDtIGkwdR.php/vip/package/multi','VIP濂楅 / 鎵归噺鏇存柊','{\"action\":\"\",\"ids\":\"6\",\"params\":\"switch=1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766818516),(342,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/command?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/command?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"mfbi\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766826419),(343,1,'admin','/QuDtIGkwdR.php/user/user/edit/ids/14?dialog=1','浼氬憳绠$悊 / 浼氬憳绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"id\":\"14\",\"group_id\":\"1\",\"username\":\"18800000008\",\"nickname\":\"11\",\"password\":\"***\",\"email\":\"\",\"mobile\":\"18800000008\",\"avatar\":\"\",\"level\":\"1\",\"gender\":\"1\",\"birthday\":\"2025-12-27\",\"bio\":\"\",\"money\":\"0\",\"score\":\"0\",\"successions\":\"2\",\"maxsuccessions\":\"2\",\"prevtime\":\"2025-12-27 15:50:58\",\"logintime\":\"2025-12-27 15:58:20\",\"loginip\":\"123.132.215.243\",\"loginfailure\":\"0\",\"joinip\":\"123.132.215.243\",\"jointime\":\"2025-12-24 09:51:47\",\"status\":\"normal\"},\"ids\":\"14\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766826461),(344,1,'admin','/QuDtIGkwdR.php/user/user/edit/ids/14?dialog=1','浼氬憳绠$悊 / 浼氬憳绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"id\":\"14\",\"group_id\":\"1\",\"username\":\"18800000008\",\"nickname\":\"11\",\"password\":\"***\",\"email\":\"18800000001@qq.com\",\"mobile\":\"18800000008\",\"avatar\":\"\",\"level\":\"1\",\"gender\":\"1\",\"birthday\":\"2025-12-27\",\"bio\":\"\",\"money\":\"0\",\"score\":\"0\",\"successions\":\"2\",\"maxsuccessions\":\"2\",\"prevtime\":\"2025-12-27 15:50:58\",\"logintime\":\"2025-12-27 15:58:20\",\"loginip\":\"123.132.215.243\",\"loginfailure\":\"0\",\"joinip\":\"123.132.215.243\",\"jointime\":\"2025-12-24 09:51:47\",\"status\":\"normal\"},\"ids\":\"14\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1766826469),(345,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"cvva\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766826601),(346,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"nqyc\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766833921),(347,1,'admin','/QuDtIGkwdR.php/general.profile/update','甯歌绠$悊 / 涓汉璧勬枡 / 鏇存柊涓汉淇℃伅','{\"__token__\":\"***\",\"row\":{\"avatar\":\"\\/uploads\\/20251227\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"email\":\"admin@admin.com\",\"nickname\":\"Admin\",\"password\":\"***\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766833948),(348,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"nxiw\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766887752),(349,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/edit/ids/13?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"澧ㄧ豢鑹瞈",\"weigh\":\"13\"},\"ids\":\"13\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766888493),(350,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/edit/ids/12?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娴呰摑鑹瞈",\"weigh\":\"12\"},\"ids\":\"12\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766888501),(351,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/edit/ids/14?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娴呯伆鑹瞈",\"weigh\":\"14\"},\"ids\":\"14\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766888677),(352,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/edit/ids/11?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"榛勮鑹瞈",\"weigh\":\"11\"},\"ids\":\"11\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766888684),(353,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/edit/ids/10?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娣遍粦鑹瞈",\"weigh\":\"10\"},\"ids\":\"10\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766888698),(354,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766888823),(355,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/edit/ids/10?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"瀹犵墿\",\"weigh\":\"10\"},\"ids\":\"10\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889684),(356,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/edit/ids/9?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鍔ㄦ极\",\"weigh\":\"9\"},\"ids\":\"9\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889691),(357,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/edit/ids/7?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鏃呰\",\"weigh\":\"7\"},\"ids\":\"7\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889700),(358,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍙戝憜\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889721),(359,1,'admin','/QuDtIGkwdR.php/addon/config?name=alioss&dialog=1','鎻掍欢绠$悊 / 閰嶇疆','{\"name\":\"alioss\",\"dialog\":\"1\",\"row\":{\"accessKeyId\":\"LTAI5tKVPVBA621ozJn6u3yp\",\"accessKeySecret\":\"lKKbHmm6BBQ9eka3mYiBb96F8kawf0\",\"bucket\":\"nvlovers\",\"endpoint\":\"oss-cn-qingdao.aliyuncs.com\",\"cdnurl\":\"https:\\/\\/nvlovers.oss-cn-qingdao.aliyuncs.com\",\"uploadmode\":\"server\",\"serverbackup\":\"1\",\"savekey\":\"\\/uploads\\/{year}{mon}{day}\\/{filemd5}{.suffix}\",\"expire\":\"600\",\"maxsize\":\"10M\",\"mimetype\":\"jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx,mp3\",\"multiple\":\"0\",\"thumbstyle\":\"\",\"chunking\":\"0\",\"chunksize\":\"4194304\",\"syncdelete\":\"0\",\"apiupload\":\"1\",\"noneedlogin\":[\"admin\"]}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766889754),(360,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"闃呰\",\"weigh\":\"2\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889800),(361,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍒峰墽\",\"weigh\":\"3\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889809),(362,1,'admin','/QuDtIGkwdR.php/girlfriend/hobbies/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 濂冲弸鍏磋叮鏍囩 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"杩愬姩\",\"weigh\":\"4\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889819),(363,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/11?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"杩愬姩鍨嬬敺\",\"weigh\":\"1\",\"gender\":\"male\"},\"ids\":\"11\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889844),(364,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/10?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"灞呭鏆栫敺\",\"weigh\":\"1\",\"gender\":\"male\"},\"ids\":\"10\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889860),(365,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','铏氭嫙瑙掕壊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娴嬭瘯\",\"gender\":\"male\",\"style_tag\":\"222\",\"avatar_url\":\"\\/uploads\\/20251228\\/b52e832cd9c64b013240043cee5b2a5f.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251228\\/221295058d27e5dddcfa0e7e2cd06185.mp3\",\"tts_model_id\":\"1\",\"voice_code\":\"2\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"200\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766889861),(366,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"楂樺喎灏忕嫾鐙梊",\"weigh\":\"0\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889883),(367,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/12?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"楂樺喎灏忕嫾鐙梊",\"weigh\":\"1\",\"gender\":\"male\"},\"ids\":\"12\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889887),(368,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂煍灏忓ザ鐙梊",\"weigh\":\"1\",\"gender\":\"male\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889903),(369,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鑹崇編灏戝\",\"weigh\":\"2\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889931),(370,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/7?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂煍瀛﹀\",\"weigh\":\"2\",\"gender\":\"female\"},\"ids\":\"7\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889938),(371,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/8?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鍌插▏濡瑰\",\"weigh\":\"2\",\"gender\":\"female\"},\"ids\":\"8\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889941),(372,1,'admin','/QuDtIGkwdR.php/girlfriend/mould/edit/ids/9?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鎬ф牸妯℃澘 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"绮剧灏忓\",\"weigh\":\"2\",\"gender\":\"female\"},\"ids\":\"9\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766889944),(373,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890669),(374,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_outfit_items\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890682),(375,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890686),(376,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890691),(377,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890696),(378,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890699),(379,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"outfit\\/Items.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890701),(380,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"outfit\\/Items.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890704),(381,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/206?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"outfit\\/items\",\"title\":\"鎹㈣鏈嶉グ搴揬",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"206\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890742),(382,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"205\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766890747),(383,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/206?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"0\",\"name\":\"outfit\\/items\",\"title\":\"鎹㈣鏈嶉グ搴揬",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"206\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766892165),(384,0,'Unknown','/QuDtIGkwdR.php/index/login','','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"yrsi\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766892628),(385,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"mied\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766892634),(386,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766895218),(387,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766895228),(388,0,'Unknown','/QuDtIGkwdR.php/index/logout','','{\"__token__\":\"***\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766896825),(389,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"w2m2\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766896939),(390,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766896997),(391,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766897001),(392,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766897030),(393,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766897034),(394,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766897078),(395,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"铏氭嫙濂冲弸\",\"category\":\"top\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20251228\\/c41af2d66d482a59ca252d4612bb18f0.png\",\"is_free\":\"0\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897347),(396,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"22\",\"category\":\"top\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20251228\\/8487c395fb0b6343ad7214c16f763899.png\",\"is_free\":\"0\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897388),(397,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897464),(398,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_outfit_items\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897567),(399,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897569),(400,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','144.52.190.66','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766897570),(401,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766899976),(402,1,'admin','/QuDtIGkwdR.php/command/execute/ids/43','鍦ㄧ嚎鍛戒护绠$悊 / 鍐嶆鎵ц鍛戒护','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"ids\":\"43\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766899984),(403,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"铏氭嫙濂冲弸\",\"category\":\"top\",\"gender\":\"male\",\"image_url\":\"\\/uploads\\/20251228\\/8487c395fb0b6343ad7214c16f763899.png\",\"is_free\":\"0\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766900052),(404,1,'admin','/QuDtIGkwdR.php/outfit/items/del','鎹㈣鏈嶉グ搴?/ 鍒犻櫎','{\"action\":\"del\",\"ids\":\"1\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1766900063),(405,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901369),(406,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"unisex\",\"image_url\":\"\",\"is_free\":\"0\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901428),(407,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901441),(408,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901448),(409,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901453),(410,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901457),(411,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901511),(412,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"dress\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901515),(413,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901520),(414,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"1\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901774),(415,0,'Unknown','/QuDtIGkwdR.php/index/logout','','{\"__token__\":\"***\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901894),(416,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"cmli\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901906),(417,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766901930),(418,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766904454),(419,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐏拌壊鍗。\",\"category\":\"top\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20251228\\/8386c8cff097f3ab2f0fdbdaf6aa6d25.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911200),(420,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐗涗粩鐭¥\",\"category\":\"bottom\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/9cb3bfb1e1d7f1823f3eb4656d2c1cec.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911225),(421,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"瑜愯壊鐭\",\"category\":\"bottom\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/fbb319d9d686955c766836abf4f42a15.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911269),(422,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊琛。\",\"category\":\"top\",\"gender\":\"male\",\"image_url\":\"\\/uploads\\/20251228\\/b50d7b1776417e83af4242561f6b253f.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911300),(423,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"榛戣壊浼戦棽瑁",\"category\":\"bottom\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20251228\\/b5271495801ef0c693d9e5b9873bec67.png\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911329),(424,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娴呰摑鐗涗粩瑁",\"category\":\"bottom\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20251228\\/bea27bf11ffb116ec74a650dd51501b4.png\",\"is_free\":\"0\",\"price_gold\":\"5\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766911357),(425,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"瑜愮櫧杩炶。瑁橽",\"category\":\"dress\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/8fc1fd2fc60ad532e18fe7bab0046d4d.png\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766913600),(426,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐏拌壊澶ц。\",\"category\":\"dress\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/18ae4455366faf1c8034ea547499a122.png\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766913830),(427,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鐧借壊鏃犺瑁橽",\"category\":\"dress\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/9fff2aef8e58c5f77c5c9aada2aca021.png\",\"is_free\":\"0\",\"price_gold\":\"5\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766913854),(428,1,'admin','/QuDtIGkwdR.php/outfit/items/edit/ids/2?dialog=1','鎹㈣鏈嶉グ搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"钃濊壊闇茶剱鐭\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20251228\\/cb6769869d0832434baf7597a5bd0d50.jpeg\",\"is_free\":\"1\",\"price_gold\":\"0\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"2\"},\"ids\":\"2\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1766917571),(429,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"2fdn\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1766970301),(430,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/outfit/items?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/outfit\\/items?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"xjf7\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767001537),(431,1,'admin','/QuDtIGkwdR.php/voice/library/del','铏氭嫙瑙掕壊 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"7\",\"params\":\"\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767001568),(432,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/106?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"121\",\"name\":\"voice\\/library\",\"title\":\"闊宠壊绠$悊\",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"106\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767001737),(433,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"瀹炲姏姝屾墜鐢穃",\"gender\":\"male\",\"style_tag\":\"瀹炲姏姝屾墜\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/7eb6df79faa38affbeef633f5d6ff894.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"kabuleshen_v2\",\"is_default\":\"0\",\"is_owned\":\"0\",\"price_gold\":\"20\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002089),(434,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/1?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娴极椋庢儏濂砛",\"gender\":\"female\",\"style_tag\":\"娴极椋庢儏\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/221295058d27e5dddcfa0e7e2cd06185.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longqiang_v2\",\"is_default\":\"1\",\"is_owned\":\"1\",\"price_gold\":\"0\"},\"ids\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002310),(435,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/2?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂煍闂鸿湝濂砛",\"gender\":\"female\",\"style_tag\":\"娓╂煍闂鸿湝\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/3659df91b3fb9bf3a06c42129c9fd267.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanrou\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"},\"ids\":\"2\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002326),(436,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/3?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"楂橀泤姘旇川濂砛",\"gender\":\"female\",\"style_tag\":\"楂橀泤姘旇川\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/a84a5435c1aa0d242a6bd534187ed1a3.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanya\",\"is_default\":\"0\",\"is_owned\":\"0\",\"price_gold\":\"50\"},\"ids\":\"3\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002359),(437,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/4?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"骞插噣娓呯埥鐢穃",\"gender\":\"male\",\"style_tag\":\"骞插噣娓呯埥\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/1a8e50f5877b7b1ac4e7cb3e7acd97de.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanshuo\",\"is_default\":\"1\",\"is_owned\":\"1\",\"price_gold\":\"0\"},\"ids\":\"4\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002382),(438,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/5?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鐫挎櫤杞荤啛鐢穃",\"gender\":\"male\",\"style_tag\":\"鐫挎櫤杞荤啛\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/e4e9b244b34d385d6a95fd50f1ff6578.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanzhi\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"},\"ids\":\"5\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002396),(439,1,'admin','/QuDtIGkwdR.php/voice/library/edit/ids/6?dialog=1','闊宠壊绠$悊 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂殩鐥存儏鐢穃",\"gender\":\"male\",\"style_tag\":\"娓╂殩鐥存儏\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/1fe4651fe2b12f311e0dec23f9d4034a.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longhan_v2\",\"is_default\":\"0\",\"is_owned\":\"0\",\"price_gold\":\"300\"},\"ids\":\"6\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002415),(440,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╂殩鏄ラ濂砛",\"gender\":\"female\",\"style_tag\":\"娓╂殩鏄ラ\",\"avatar_url\":\"\\/uploads\\/20251229\\/e3e159f0261ac561f1d05a2977c40120.jpg\",\"sample_audio_url\":\"\\/uploads\\/20251229\\/ba37a4f390dbd8ac5e1cdd83950d129b.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longyan_v2\",\"is_default\":\"0\",\"is_owned\":\"0\",\"price_gold\":\"20\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767002564),(441,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"qwtb\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767057129),(442,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/command?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/command?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"lwzy\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767059552),(443,1,'admin','/QuDtIGkwdR.php/intimacy/config/add?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"name\":\"鏂囦欢\",\"title\":\"涓婁紶鏂囦欢\",\"level\":\"4\",\"intimacy\":\"400\",\"weigh\":\"9995\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767059726),(444,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/5?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"name\":\"瀹炴椂璇煶\",\"title\":\"瀹炴椂璇煶\",\"level\":\"5\",\"intimacy\":\"500\",\"weigh\":\"9995\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767059739),(445,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/5?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"name\":\"瀹炴椂璇煶\",\"title\":\"瀹炴椂璇煶\",\"level\":\"5\",\"intimacy\":\"500\",\"weigh\":\"9994\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767059751),(446,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/6?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"name\":\"瀹炴椂瑙嗛\",\"title\":\"瀹炴椂瑙嗛\",\"level\":\"6\",\"intimacy\":\"600\",\"weigh\":\"9993\"},\"ids\":\"6\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767059761),(447,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/girlfriend/hobbies?addtabs=1','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/girlfriend\\/hobbies?addtabs=1\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"5k3t\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767059884),(448,0,'Unknown','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/command?ref=addtabs','','{\"url\":\"\\/QuDtIGkwdR.php\\/command?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"vacf\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767076624),(449,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/command?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/command?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"fneb\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767076644),(450,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"mn6z\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1767076993),(451,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/intimacy/config?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/intimacy\\/config?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"fhfs\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1767083175),(452,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/2?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bbddb82729be60db78b4a9b658932a8f.png\",\"title\":\"璇煶\",\"intimacy\":\"10\",\"weigh\":\"9998\"},\"ids\":\"2\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085655),(453,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/3?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bef6315f368257b7b351c2187ed88066.png\",\"title\":\"鍥剧墖\",\"intimacy\":\"200\",\"weigh\":\"9996\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085670),(454,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/5?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"title\":\"瀹炴椂璇煶\",\"intimacy\":\"500\",\"weigh\":\"9997\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085687),(455,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/6?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"title\":\"瀹炴椂瑙嗛\",\"intimacy\":\"600\",\"weigh\":\"9996\"},\"ids\":\"6\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085704),(456,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/4?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"title\":\"瑙嗛\",\"intimacy\":\"300\",\"weigh\":\"9995\"},\"ids\":\"4\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085713),(457,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/5?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"title\":\"瀹炴椂璇煶\",\"intimacy\":\"200\",\"weigh\":\"9997\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085728),(458,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/3?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/bef6315f368257b7b351c2187ed88066.png\",\"title\":\"鍥剧墖\",\"intimacy\":\"400\",\"weigh\":\"9996\"},\"ids\":\"3\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085736),(459,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/4?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"title\":\"瑙嗛\",\"intimacy\":\"900\",\"weigh\":\"9995\"},\"ids\":\"4\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085745),(460,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/7?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/d238e6d762ccb97c5fe4412c28d15f07.png\",\"title\":\"涓婁紶鏂囦欢\",\"intimacy\":\"1000\",\"weigh\":\"9995\"},\"ids\":\"7\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085753),(461,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/5?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"title\":\"闅忔椂闅忓湴锛屾嫧鎵撶數璇漒",\"intimacy\":\"200\",\"weigh\":\"9997\"},\"ids\":\"5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085826),(462,1,'admin','/QuDtIGkwdR.php/intimacy/config/edit/ids/6?dialog=1','浜插瘑搴︾鐞?/ 浜插瘑搴﹂厤缃?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"image\":\"\\/uploads\\/20251225\\/268834d912620e0666a51639ba86c6d4.png\",\"title\":\"闈㈠闈㈢殑浜ゆ祦\",\"intimacy\":\"600\",\"weigh\":\"9996\"},\"ids\":\"6\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36',1767085835),(463,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"pup5\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767143149),(464,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"pvk8\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767171258),(465,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/3?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"鐖卞績淇″皝\",\"title\":\"閫佺埍蹇冧俊灏侊紝甯粬瀹炵幇鎰挎湜\",\"price\":\"30.00\",\"intimacy_value\":\"30\",\"image\":\"\\/uploads\\/20251231\\/5d8afdf6eb1db84ae02e8ace21105d6f.png\",\"weigh\":\"3\",\"status\":\"1\"},\"ids\":\"3\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767172340),(466,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/2?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"褰╄櫣\",\"title\":\"閫佸僵铏癸紝甯粬瀹炵幇鎰挎湜\",\"price\":\"20.00\",\"intimacy_value\":\"20\",\"image\":\"\\/uploads\\/20251226\\/baed69072d5f541d6338a3a485ee9820.png\",\"weigh\":\"2\",\"status\":\"1\"},\"ids\":\"2\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767172366),(467,1,'admin','/QuDtIGkwdR.php/gifts/edit/ids/1?dialog=1','绀肩墿 / 缂栬緫','{\"dialog\":\"1\",\"row\":{\"name\":\"蹇冩効鐡禱",\"title\":\"閫佸績鎰跨摱锛屽府浠栧疄鐜版効鏈沑",\"price\":\"10.00\",\"intimacy_value\":\"10\",\"image\":\"\\/uploads\\/20251226\\/c98e60c14c5b03498565cd4e196086c6.png\",\"weigh\":\"1\",\"status\":\"1\"},\"ids\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767172375),(468,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/del','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"12\",\"params\":\"\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767178811),(469,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/del','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"11\",\"params\":\"\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767178816),(470,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/del','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"14\",\"params\":\"\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767178818),(471,1,'admin','/QuDtIGkwdR.php/girlfriend/eyecolor/del','铏氭嫙濂冲弸璁剧疆 / 鐬宠壊 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"13\",\"params\":\"\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1767178822),(472,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"qrap\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767492469),(473,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"ymsi\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767575817),(474,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/dashboard?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/dashboard?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"vmms\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',1767924448),(475,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"ubsk\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768187230),(476,1,'admin','/QuDtIGkwdR.php/general.config/edit','甯歌绠$悊 / 绯荤粺閰嶇疆 / 缂栬緫','{\"__token__\":\"***\",\"row\":{\"name\":\"铏氭嫙鎭嬩汉\",\"beian\":\"\",\"version\":\"1.0.1\",\"timezone\":\"Asia\\/Shanghai\",\"forbiddenip\":\"\",\"languages\":\"{"backend":"zh-cn","frontend":"zh-cn"}\",\"fixedpage\":\"dashboard\",\"wxapp_appid\":\"wx87fdb468bb2d141a\",\"wxapp_appsecret\":\"802e25b89b910853264fc7fd18ed4965\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768187275),(477,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"d5lp\"}','123.132.215.243','Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36',1768197187),(478,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"浜插拰娲绘臣濂砛",\"gender\":\"female\",\"style_tag\":\"浜插拰娲绘臣\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/e21cff998c293dbcb72ec52e4406ad31.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanqin\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768199343),(479,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鎬濈淮鐏靛姩濂砛",\"gender\":\"female\",\"style_tag\":\"鎬濈淮鐏靛姩\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/6e1f8e84c4b127c5c1e466b00cab0efa.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longanling\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768199506),(480,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娓╁閭诲濂砛",\"gender\":\"female\",\"style_tag\":\"娓╁閭诲\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/e8dd3e31fe7f4b26c3604bb197641a0f.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longxing_v2\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768199668),(481,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍏冩皵鐢滅編濂砛",\"gender\":\"female\",\"style_tag\":\"鍏冩皵鐢滅編\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/93fa8cef1a9fe3411fdbe2379441e8e4.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longhua_v2\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768199766),(482,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"绉瀬鐭ユ€уコ\",\"gender\":\"female\",\"style_tag\":\"绉瀬鐭ユ€",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/99dd55f5cce442584547bf6e68ff8967.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"longwan_v2\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768200041),(483,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鏅烘収闈掑勾鐢穃",\"gender\":\"male\",\"style_tag\":\"鏅烘収闈掑勾\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260112\\/b2c25914521b1eb90f43f7e0997840f6.mp3\",\"tts_model_id\":\"longcheng_v2\",\"voice_code\":\"cosyvoice-v2\",\"is_default\":\"0\",\"is_owned\":\"1\",\"price_gold\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768200109),(484,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"闀跨洿鍙慭",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202203),(485,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"娉㈡尝澶碶",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202211),(486,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"楂橀┈灏綷",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202223),(487,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"灏忓嵎鍙慭",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202234),(488,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"绌烘皵鍒樻捣\",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202245),(489,1,'admin','/QuDtIGkwdR.php/girlfriend/hairstyles/add?dialog=1','铏氭嫙濂冲弸璁剧疆 / 鍙戝瀷 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍏富鍒嘰",\"weigh\":\"0\",\"gender\":\"female\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768202256),(490,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"鍚婂甫\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20260112\\/7d703dcbed0d8a2a7f123e077ca3afed.jpg\",\"is_free\":\"0\",\"price_gold\":\"100\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768203417),(491,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"瑗胯瑁",\"category\":\"bottom\",\"gender\":\"unisex\",\"image_url\":\"\\/uploads\\/20260112\\/8d3a9ad26f58867dbe1883b5089de3f2.jpg\",\"is_free\":\"0\",\"price_gold\":\"50\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768203442),(492,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"涓€瀛楅\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20260112\\/e14119583e8f05bf362c7d482b2c3f30.jpg\",\"is_free\":\"0\",\"price_gold\":\"60\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768203465),(493,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"钑句笣鍚婂甫\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20260112\\/cb0bf5abd1fdbf81a0e163eb2adcce62.jpg\",\"is_free\":\"0\",\"price_gold\":\"100\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768204875),(494,1,'admin','/QuDtIGkwdR.php/outfit/items/add?dialog=1','鎹㈣鏈嶉グ搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"楸奸瑁硅兏\",\"category\":\"top\",\"gender\":\"female\",\"image_url\":\"\\/uploads\\/20260112\\/8d5b325056c007039f8bf020e64090b1.jpg\",\"is_free\":\"0\",\"price_gold\":\"100\",\"is_vip_only\":\"0\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768204892),(495,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"tmi5\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768291790),(496,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292042),(497,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_song_library\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292052),(498,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292059),(499,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292066),(500,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292071),(501,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292074),(502,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"son\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"son\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292078),(503,1,'admin','/QuDtIGkwdR.php/command/get_controller_list','鍦ㄧ嚎鍛戒护绠$悊','{\"q_word\":[\"\"],\"pageNumber\":\"1\",\"pageSize\":\"10\",\"andOr\":\"OR \",\"orderBy\":[[\"name\",\"ASC\"]],\"searchTable\":\"tbl\",\"showField\":\"name\",\"keyField\":\"id\",\"searchField\":[\"name\"],\"name\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292080),(504,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"song\\/Library.php\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292086),(505,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"song\\/Library.php\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292094),(506,1,'admin','/QuDtIGkwdR.php/auth/rule/edit/ids/213?dialog=1','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 缂栬緫','{\"dialog\":\"1\",\"__token__\":\"***\",\"row\":{\"ismenu\":\"1\",\"pid\":\"121\",\"name\":\"song\\/library\",\"title\":\"闊抽搴揬",\"url\":\"\",\"icon\":\"fa fa-circle-o\",\"condition\":\"\",\"menutype\":\"addtabs\",\"extend\":\"\",\"remark\":\"\",\"weigh\":\"0\",\"status\":\"normal\"},\"ids\":\"213\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292125),(507,1,'admin','/QuDtIGkwdR.php/auth/rule/del','鏉冮檺绠$悊 / 鑿滃崟瑙勫垯 / 鍒犻櫎','{\"action\":\"del\",\"ids\":\"212\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292131),(508,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/outfit/items?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/outfit\\/items?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"pfn2\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768292300),(509,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"铏氭嫙瑙掕壊\",\"artist\":\"123\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260112\\/b2c25914521b1eb90f43f7e0997840f6.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292486),(510,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"铏氭嫙瑙掕壊\",\"artist\":\"123\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260112\\/b2c25914521b1eb90f43f7e0997840f6.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292496),(511,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_admin\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292591),(512,1,'admin','/QuDtIGkwdR.php/command/get_field_list','鍦ㄧ嚎鍛戒护绠$悊','{\"table\":\"nf_song_library\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292601),(513,1,'admin','/QuDtIGkwdR.php/command/command/action/command','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"command\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292605),(514,1,'admin','/QuDtIGkwdR.php/command/command/action/execute','鍦ㄧ嚎鍛戒护绠$悊 / 鐢熸垚骞舵墽琛屽懡浠?,'{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\",\"action\":\"execute\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292608),(515,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"铏氭嫙瑙掕壊\",\"artist\":\"123\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260112\\/b2c25914521b1eb90f43f7e0997840f6.mp3\",\"status\":\"1\",\"weigh\":\"222\"}}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292708),(516,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/1?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"铏氭嫙瑙掕壊\",\"artist\":\"123\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260112\\/b2c25914521b1eb90f43f7e0997840f6.mp3\",\"status\":\"1\",\"weigh\":\"222\"},\"ids\":\"1\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292731),(517,1,'admin','/QuDtIGkwdR.php/song/library/del','闊抽搴?/ 鍒犻櫎','{\"action\":\"del\",\"ids\":\"1\",\"params\":\"\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768292735),(518,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"鏉ョ敓缂榎",\"artist\":\"\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260113\\/936358714c8722798d2e87a23d1b6435.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768294311),(519,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/2?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏉ョ敓缂榎",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260113\\/936358714c8722798d2e87a23d1b6435.mp3\",\"status\":\"1\",\"weigh\":\"2\"},\"ids\":\"2\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768294322),(520,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"绾㈣壊楂樿窡闉媆",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260113\\/44888ebe6c94281d809988003c491105.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768295737),(521,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"绂诲紑鎴戠殑渚濊禆\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260114\\/ec787b50a4e6f757bd34266f75b39348.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768360291),(522,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"濡傛効\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260114\\/b98b152f7ec684933fbe147d0a70cf75.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768360507),(523,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€璺敓鑺盶",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260114\\/1d5366829aaf765a53661044311d922e.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768360779),(524,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"鏆栨殩\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260114\\/7bb350da9c024f55ade51a17a01793a3.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768361077),(525,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"蹇樻儏姘碶",\"artist\":\"\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260114\\/c84d6930c8622ba8501ee4fb1713256c.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768383402),(526,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"2jgn\",\"keeplogin\":\"1\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768639534),(527,1,'admin','/QuDtIGkwdR.php/song/library/add?dialog=1','闊抽搴?/ 娣诲姞','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€鍗婁竴鍗奬",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/fd59ffbc89f3ea57a81c73327b926877.mp3\",\"status\":\"1\",\"weigh\":\"0\"}}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768645974),(528,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/8?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏉ョ敓缂榎",\"artist\":\"\",\"gender\":\"male\",\"audio_url\":\"\\/uploads\\/20260117\\/1b4ed03a58f1a5c733b28590eb017be2.mp3\",\"status\":\"1\",\"weigh\":\"8\"},\"ids\":\"8\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768648173),(529,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/2?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏉ョ敓缂榎",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/bf5b10828a7b522e991b80c0a0e2c096.mp3\",\"status\":\"1\",\"weigh\":\"2\"},\"ids\":\"2\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768648196),(530,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/6?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€璺敓鑺盶",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/5b13c712f7b2887e47ba8622e504ade7.mp3\",\"status\":\"1\",\"weigh\":\"6\"},\"ids\":\"6\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768648540),(531,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/7?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏆栨殩\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/811612c92b7807525220868670a0817a.mp3\",\"status\":\"1\",\"weigh\":\"7\"},\"ids\":\"7\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768649825),(532,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/5?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"濡傛効\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/0138e306b44dc1d3950ddc7e8a31e288.mp3\",\"status\":\"1\",\"weigh\":\"5\"},\"ids\":\"5\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768649841),(533,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/4?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"绂诲紑鎴戠殑渚濊禆\",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/4aff439340307a85c084c6f9de794257.mp3\",\"status\":\"1\",\"weigh\":\"4\"},\"ids\":\"4\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768649859),(534,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/3?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"绾㈣壊楂樿窡闉媆",\"artist\":\"\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/eb8efb02046e78ba7a1707bd12127a41.mp3\",\"status\":\"1\",\"weigh\":\"3\"},\"ids\":\"3\"}','123.132.215.243','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1768649874),(535,0,'Unknown','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"shwh\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768980488),(536,1,'admin','/QuDtIGkwdR.php/index/login','鐧诲綍','{\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"fdur\"}','0.0.0.0','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',1768980498),(537,0,'Unknown','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/dashboard?ref=addtabs','','{\"url\":\"\\/QuDtIGkwdR.php\\/dashboard?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"cpsv\",\"keeplogin\":\"1\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769394607),(538,0,'Unknown','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/dashboard?ref=addtabs','','{\"url\":\"\\/QuDtIGkwdR.php\\/dashboard?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"msgn\",\"keeplogin\":\"1\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769394618),(539,1,'admin','/QuDtIGkwdR.php/index/login?url=/QuDtIGkwdR.php/dashboard?ref=addtabs','鐧诲綍','{\"url\":\"\\/QuDtIGkwdR.php\\/dashboard?ref=addtabs\",\"__token__\":\"***\",\"username\":\"admin\",\"password\":\"***\",\"captcha\":\"ff6h\",\"keeplogin\":\"1\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769394622),(540,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/9?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€鍗婁竴鍗奬",\"artist\":\"寮犵ⅶ鏅╘",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260117\\/fd59ffbc89f3ea57a81c73327b926877.mp3\",\"status\":\"1\",\"weigh\":\"9\"},\"ids\":\"9\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769394813),(541,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/4?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"绂诲紑鎴戠殑渚濊禆\",\"artist\":\"鐜嬭壋钖嘰",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/a9c377cc1b9931f0ce81907e23e4d588.mp3\",\"status\":\"1\",\"weigh\":\"4\"},\"ids\":\"4\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769427641),(542,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/9?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€鍗婁竴鍗奬",\"artist\":\"寮犵ⅶ鏅╘",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\",\"status\":\"1\",\"weigh\":\"9\"},\"ids\":\"9\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769435643),(543,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/7?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏆栨殩\",\"artist\":\"姊侀潤鑼筡",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/270985359774149e730b22a568305aad.mp3\",\"status\":\"1\",\"weigh\":\"7\"},\"ids\":\"7\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769437574),(544,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/6?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"涓€璺敓鑺盶",\"artist\":\"娓╁蹇僜",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/4f18553f2af06e355ad75a5ee6173456.mp3\",\"status\":\"1\",\"weigh\":\"6\"},\"ids\":\"6\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769437666),(545,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/5?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"濡傛効\",\"artist\":\"鐜嬭彶\",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\",\"status\":\"1\",\"weigh\":\"5\"},\"ids\":\"5\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769437830),(546,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/3?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"绾㈣壊楂樿窡闉媆",\"artist\":\"钄″仴闆匼",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/36151a02b3261bc31c90905c1c92f278.mp3\",\"status\":\"1\",\"weigh\":\"3\"},\"ids\":\"3\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769438384),(547,1,'admin','/QuDtIGkwdR.php/song/library/edit/ids/2?dialog=1','闊抽搴?/ 缂栬緫','{\"dialog\":\"1\",\"row\":{\"title\":\"鏉ョ敓缂榎",\"artist\":\"鍗曚緷绾?amp;鍒樻儨鍚沑",\"gender\":\"female\",\"audio_url\":\"\\/uploads\\/20260126\\/424a4cf1b55c1dd1d487388bef376f43.mp3\",\"status\":\"1\",\"weigh\":\"2\"},\"ids\":\"2\"}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769438497),(548,1,'admin','/QuDtIGkwdR.php/voice/library/add?dialog=1','闊宠壊绠$悊 / 娣诲姞','{\"dialog\":\"1\",\"row\":{\"name\":\"椋庨獨鎰忓姩濂砛",\"gender\":\"female\",\"style_tag\":\"椋庨獨鎰忓姩\",\"avatar_url\":\"\\/uploads\\/20260109\\/e102149af04d07aff9e91b83103fd46a.jpeg\",\"sample_audio_url\":\"\\/uploads\\/20260128\\/3e40b2bb29c0f252464b2cfe75d4cb52.mp3\",\"tts_model_id\":\"cosyvoice-v2\",\"voice_code\":\"cosyvoice-v2-fsyidong-d7a7adf2e7e648488000edb4941e1fa7\",\"is_default\":\"0\",\"is_owned\":\"0\",\"price_gold\":\"999\"}}','123.131.171.205','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36',1769589747); +/*!40000 ALTER TABLE `nf_admin_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_area` +-- + +DROP TABLE IF EXISTS `nf_area`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_area` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `pid` int DEFAULT NULL COMMENT '鐖秈d', + `shortname` varchar(100) DEFAULT NULL COMMENT '绠€绉?, + `name` varchar(100) DEFAULT NULL COMMENT '鍚嶇О', + `mergename` varchar(255) DEFAULT NULL COMMENT '鍏ㄧО', + `level` tinyint DEFAULT NULL COMMENT '灞傜骇:1=鐪?2=甯?3=鍖?鍘?, + `pinyin` varchar(100) DEFAULT NULL COMMENT '鎷奸煶', + `code` varchar(100) DEFAULT NULL COMMENT '闀块€斿尯鍙?, + `zip` varchar(100) DEFAULT NULL COMMENT '閭紪', + `first` varchar(50) DEFAULT NULL COMMENT '棣栧瓧姣?, + `lng` varchar(100) DEFAULT NULL COMMENT '缁忓害', + `lat` varchar(100) DEFAULT NULL COMMENT '绾害', + PRIMARY KEY (`id`), + KEY `pid` (`pid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍦板尯琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_area` +-- + +LOCK TABLES `nf_area` WRITE; +/*!40000 ALTER TABLE `nf_area` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_area` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_attachment` +-- + +DROP TABLE IF EXISTS `nf_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_attachment` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `category` varchar(50) DEFAULT '' COMMENT '绫诲埆', + `admin_id` int unsigned NOT NULL DEFAULT '0' COMMENT '绠$悊鍛業D', + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '浼氬憳ID', + `url` varchar(255) DEFAULT '' COMMENT '鐗╃悊璺緞', + `imagewidth` int unsigned DEFAULT '0' COMMENT '瀹藉害', + `imageheight` int unsigned DEFAULT '0' COMMENT '楂樺害', + `imagetype` varchar(30) DEFAULT '' COMMENT '鍥剧墖绫诲瀷', + `imageframes` int unsigned NOT NULL DEFAULT '0' COMMENT '鍥剧墖甯ф暟', + `filename` varchar(100) DEFAULT '' COMMENT '鏂囦欢鍚嶇О', + `filesize` int unsigned NOT NULL DEFAULT '0' COMMENT '鏂囦欢澶у皬', + `mimetype` varchar(100) DEFAULT '' COMMENT 'mime绫诲瀷', + `extparam` varchar(255) DEFAULT '' COMMENT '閫忎紶鏁版嵁', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃ユ湡', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `uploadtime` bigint DEFAULT NULL COMMENT '涓婁紶鏃堕棿', + `storage` varchar(100) NOT NULL DEFAULT 'local' COMMENT '瀛樺偍浣嶇疆', + `sha1` varchar(40) DEFAULT '' COMMENT '鏂囦欢 sha1缂栫爜', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=279 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='闄勪欢琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_attachment` +-- + +LOCK TABLES `nf_attachment` WRITE; +/*!40000 ALTER TABLE `nf_attachment` DISABLE KEYS */; +INSERT INTO `nf_attachment` VALUES (1,'',1,0,'/assets/img/qrcode.png',150,150,'png',0,'qrcode.png',21859,'image/png','',1491635035,1491635035,1491635035,'local','17163603d0263e4838b9387ff2cd4877e8b018f6'),(5,'',0,12,'/uploads/20251225/b52e832cd9c64b013240043cee5b2a5f.jpg',1179,1044,'jpg',0,'26100a2dcc189789518999b9bddd8937.jpg',199139,'image/jpeg','',1766630669,1766630669,1766630669,'local','15470aa82a8fdcb5289e3ccaf916adb23511e009'),(12,'',0,12,'/uploads/20251225/fff78a6ff75b4f4250b30528144a697d.png',1059,300,'png',0,'1986eb85ee9ef89cafad015be2a57ff9.png',445345,'image/png','',1766638535,1766638535,1766638535,'alioss','9eaad0fd4752127cae76255b39e17c75046e49a9'),(14,'',1,0,'/uploads/20251225/0a4699e1e6a28fc5cc57cd928291e5ea.png',345,100,'png',0,'寰俊鍥剧墖_20251213104605_65_740.png',40387,'image/png','',1766644592,1766644592,1766644592,'alioss','e275ce1774c457f82d908cac45a400dd6a2fa72e'),(16,'',0,15,'/uploads/20251225/dcccb52f666bd4485dae9170baf3dd27.jpeg',132,132,'jpeg',0,'P4AeUBZb4Jdzdcccb52f666bd4485dae9170baf3dd27.jpeg',3483,'image/jpeg','',1766645402,1766645402,1766645402,'alioss','3801404c2e9a03dca90956d153230e72ae42d3ae'),(18,'',0,15,'/uploads/20251225/f602f69a88a69b99b6aa7bc31f720094.jpeg',132,132,'jpeg',0,'jaDpbr6HPy2yf602f69a88a69b99b6aa7bc31f720094.jpeg',3483,'image/jpeg','',1766645441,1766645441,1766645441,'alioss','aec2e8aefb40a1a8998535b7cb9aebbf851a89e5'),(20,'',0,15,'/uploads/20251225/6653d2052cbf0f2749c6df3a62681082.jpeg',132,132,'jpeg',0,'3po66nN1jzeN6653d2052cbf0f2749c6df3a62681082.jpeg',3483,'image/jpeg','',1766645554,1766645554,1766645554,'alioss','236d7742ec80ec6d3c556cbfc74ac1e2ca9e2777'),(22,'',0,15,'/uploads/20251225/d270164bf45140106d47e43524572686.jpg',132,132,'jpg',0,'MDNLa0LR8A4f9d9dbd2b67dacc1aa6077d3b2f495abc.jpg',4064,'image/jpeg','',1766645604,1766645604,1766645604,'alioss','26fa3093f0a03967b4ed4011717f12be57f326ee'),(24,'',1,0,'/uploads/20251225/268834d912620e0666a51639ba86c6d4.png',48,48,'png',0,'寰俊鍥剧墖_20251225144901_131_817.png',2055,'image/png','',1766646492,1766646492,1766646492,'alioss','70dd97a247e044bb61cae9951df39541e2b2a2c8'),(26,'',1,0,'/uploads/20251225/350ae5edc4becede86d894b3b3fef48b.png',48,48,'png',0,'寰俊鍥剧墖_20251225144901_132_817.png',1631,'image/png','',1766646493,1766646493,1766646493,'alioss','0195b31706cccf62d51d2cf6fd5caa162d1354a8'),(28,'',1,0,'/uploads/20251225/3be807b7cd645dc8353fb2adccb8e33d.png',48,48,'png',0,'寰俊鍥剧墖_20251225144902_133_817.png',1799,'image/png','',1766646494,1766646494,1766646494,'alioss','a395a48f4163f8135575ef26dd6b9020d7d211fd'),(30,'',1,0,'/uploads/20251225/bbddb82729be60db78b4a9b658932a8f.png',48,48,'png',0,'寰俊鍥剧墖_20251225144902_134_817.png',2197,'image/png','',1766646496,1766646496,1766646495,'alioss','78ac07f9f35588ef6d34f7d35841aac31c48aceb'),(32,'',1,0,'/uploads/20251225/bef6315f368257b7b351c2187ed88066.png',48,48,'png',0,'寰俊鍥剧墖_20251225144903_135_817.png',2610,'image/png','',1766646497,1766646497,1766646497,'alioss','559bdc1e6a6419f5d2e81a22d31725b8212d0b9c'),(34,'',1,0,'/uploads/20251225/d238e6d762ccb97c5fe4412c28d15f07.png',48,48,'png',0,'寰俊鍥剧墖_20251225144903_136_817.png',2405,'image/png','',1766646498,1766646498,1766646498,'alioss','318aaf565038758661e4532364b5473b727ad317'),(37,'',0,8,'/uploads/20251225/26a60a28c04d3e67eb1465d727b1a6a9.png',226,221,'png',0,'ScreenShot_2025-11-24_165445_648.png',21764,'image/png','',1766650618,1766650618,1766650618,'alioss','6a017a23e1c755f1b2f64e092ed4f33dd0d9d61b'),(39,'',0,12,'/uploads/20251225/fff78a6ff75b4f4250b30528144a697d.png',1059,300,'png',0,'1986eb85ee9ef89cafad015be2a57ff9.png',445345,'image/png','',1766651377,1766651377,1766651377,'local','9eaad0fd4752127cae76255b39e17c75046e49a9'),(40,'',0,8,'/uploads/20251225/26a60a28c04d3e67eb1465d727b1a6a9.png',226,221,'png',0,'ScreenShot_2025-11-24_165445_648.png',21764,'image/png','',1766652067,1766652067,1766652067,'local','6a017a23e1c755f1b2f64e092ed4f33dd0d9d61b'),(41,'',1,0,'/uploads/20251226/ccd0e444fe00fd3ff2125f72452c1b35.png',64,64,'png',0,'avatar.png',2409,'image/png','',1766731553,1766731553,1766731553,'local','0619cbb73fc789822973d9ed4606a4a6766267c6'),(42,'',1,0,'/uploads/20251226/ccd0e444fe00fd3ff2125f72452c1b35.png',64,64,'png',0,'avatar.png',2409,'image/png','',1766731553,1766731553,1766731553,'alioss','0619cbb73fc789822973d9ed4606a4a6766267c6'),(43,'',1,0,'/uploads/20251226/39c6f8899c15f60fc59207835f95e07a.png',375,812,'png',0,'chat_back.png',218828,'image/png','',1766731582,1766731582,1766731582,'local','79d41c83d9d424e29da995099ab8dca8d9aad124'),(44,'',1,0,'/uploads/20251226/39c6f8899c15f60fc59207835f95e07a.png',375,812,'png',0,'chat_back.png',218828,'image/png','',1766731582,1766731582,1766731582,'alioss','79d41c83d9d424e29da995099ab8dca8d9aad124'),(45,'',1,0,'/uploads/20251226/c1e7847f799a91e20e0f8fa9decfdf30.png',1440,2560,'png',0,'index_back.png',3957042,'image/png','',1766731747,1766731747,1766731747,'local','25c5c36d68bdee9fa6807b420780e63b675ac52a'),(46,'',1,0,'/uploads/20251226/c1e7847f799a91e20e0f8fa9decfdf30.png',1440,2560,'png',0,'index_back.png',3957042,'image/png','',1766731747,1766731747,1766731747,'alioss','25c5c36d68bdee9fa6807b420780e63b675ac52a'),(47,'',1,0,'/uploads/20251226/2ea998409fac8d1ac2894596469f7e1c.png',375,813,'png',0,'diary_back.png',61651,'image/png','',1766732033,1766732033,1766732033,'local','223b4b83e5973126fa98504c305407aa3e7c665d'),(48,'',1,0,'/uploads/20251226/2ea998409fac8d1ac2894596469f7e1c.png',375,813,'png',0,'diary_back.png',61651,'image/png','',1766732033,1766732033,1766732033,'alioss','223b4b83e5973126fa98504c305407aa3e7c665d'),(49,'',1,0,'/uploads/20251226/5199a68fb335c7d892665b66637f60c4.png',375,812,'png',0,'frequency_back.png',218152,'image/png','',1766732168,1766732168,1766732168,'local','b9793f09626c1d7ee41496842e7849f8f0b75b16'),(50,'',1,0,'/uploads/20251226/5199a68fb335c7d892665b66637f60c4.png',375,812,'png',0,'frequency_back.png',218152,'image/png','',1766732168,1766732168,1766732168,'alioss','b9793f09626c1d7ee41496842e7849f8f0b75b16'),(51,'',1,0,'/uploads/20251226/ff9c872002cc5a5c91154cce12e8342c.png',172,172,'png',0,'friends_not.png',9495,'image/png','',1766732168,1766732168,1766732168,'local','bed5ab07d2f6c2d878ff2d94652253625cfcdc79'),(52,'',1,0,'/uploads/20251226/ff9c872002cc5a5c91154cce12e8342c.png',172,172,'png',0,'friends_not.png',9495,'image/png','',1766732168,1766732168,1766732168,'alioss','bed5ab07d2f6c2d878ff2d94652253625cfcdc79'),(53,'',1,0,'/uploads/20251226/69c72922c0e815086a30c370e7dbb42f.png',375,812,'png',0,'generateImage_back.png',502956,'image/png','',1766732168,1766732168,1766732168,'local','96c40774a4ac87634eb11c75336223123edc736b'),(54,'',1,0,'/uploads/20251226/69c72922c0e815086a30c370e7dbb42f.png',375,812,'png',0,'generateImage_back.png',502956,'image/png','',1766732168,1766732168,1766732168,'alioss','96c40774a4ac87634eb11c75336223123edc736b'),(55,'',1,0,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',60,60,'png',0,'gift_a1.png',5132,'image/png','',1766732169,1766732169,1766732169,'local','1de0c4818aecf4590c2db222a93cb1c26fecef3d'),(56,'',1,0,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',60,60,'png',0,'gift_a1.png',5132,'image/png','',1766732169,1766732169,1766732169,'alioss','1de0c4818aecf4590c2db222a93cb1c26fecef3d'),(57,'',1,0,'/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',58,58,'png',0,'gift_a2.png',4468,'image/png','',1766732169,1766732169,1766732169,'local','da74d43bcfa00b778221d0a2d39ab5b51a9df4dc'),(58,'',1,0,'/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',58,58,'png',0,'gift_a2.png',4468,'image/png','',1766732169,1766732169,1766732169,'alioss','da74d43bcfa00b778221d0a2d39ab5b51a9df4dc'),(59,'',1,0,'/uploads/20251226/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'gift_a3.png',5246,'image/png','',1766732169,1766732169,1766732169,'local','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(60,'',1,0,'/uploads/20251226/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'gift_a3.png',5246,'image/png','',1766732169,1766732169,1766732169,'alioss','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(61,'',1,0,'/uploads/20251226/0194a1e146a0c97a2aef81e7cc503b9a.png',375,517,'png',0,'gift_back.png',7331,'image/png','',1766732169,1766732169,1766732169,'local','f333b15beec2cafe727439aed33dd3061778d2c8'),(62,'',1,0,'/uploads/20251226/0194a1e146a0c97a2aef81e7cc503b9a.png',375,517,'png',0,'gift_back.png',7331,'image/png','',1766732169,1766732169,1766732169,'alioss','f333b15beec2cafe727439aed33dd3061778d2c8'),(63,'',1,0,'/uploads/20251226/5b531717d4ecd0fd23b49d1541135f5a.png',88,88,'png',0,'gift_border.png',6216,'image/png','',1766732170,1766732170,1766732170,'local','5af81d88cf4bb7d5a8607975c62ae19b8a38e33f'),(64,'',1,0,'/uploads/20251226/5b531717d4ecd0fd23b49d1541135f5a.png',88,88,'png',0,'gift_border.png',6216,'image/png','',1766732170,1766732170,1766732170,'alioss','5af81d88cf4bb7d5a8607975c62ae19b8a38e33f'),(65,'',1,0,'/uploads/20251226/46d5916a03a8238f490572968c6c0745.png',367,283,'png',0,'gift_logo.png',36865,'image/png','',1766732170,1766732170,1766732170,'local','4cce8a0913dcbe64204e76d9eefba4611c367e88'),(66,'',1,0,'/uploads/20251226/46d5916a03a8238f490572968c6c0745.png',367,283,'png',0,'gift_logo.png',36865,'image/png','',1766732170,1766732170,1766732170,'alioss','4cce8a0913dcbe64204e76d9eefba4611c367e88'),(67,'',1,0,'/uploads/20251226/eec9f41a02db434557bfa5e1ca207fcd.png',1280,2276,'png',0,'index_back2.png',166636,'image/png','',1766732170,1766732170,1766732170,'local','72cd20ae607eacf3c37320e0cfe91b945c0718cb'),(68,'',1,0,'/uploads/20251226/eec9f41a02db434557bfa5e1ca207fcd.png',1280,2276,'png',0,'index_back2.png',166636,'image/png','',1766732170,1766732170,1766732170,'alioss','72cd20ae607eacf3c37320e0cfe91b945c0718cb'),(69,'',1,0,'/uploads/20251226/024550444b3bd11063b3adf42bcbd5a0.png',115,48,'png',0,'index_backA.png',4383,'image/png','',1766732170,1766732170,1766732170,'local','21e72b7bff5fcfb0d8d4b4630352d9e2e843355c'),(70,'',1,0,'/uploads/20251226/024550444b3bd11063b3adf42bcbd5a0.png',115,48,'png',0,'index_backA.png',4383,'image/png','',1766732170,1766732170,1766732170,'alioss','21e72b7bff5fcfb0d8d4b4630352d9e2e843355c'),(71,'',1,0,'/uploads/20251226/008a06f2c3fccdac714f25e6577ccdc4.png',784,1168,'png',0,'index_backs.png',503681,'image/png','',1766732171,1766732171,1766732171,'local','c392029a2cdae0eb836d7071599def8d67710024'),(72,'',1,0,'/uploads/20251226/008a06f2c3fccdac714f25e6577ccdc4.png',784,1168,'png',0,'index_backs.png',503681,'image/png','',1766732171,1766732171,1766732171,'alioss','c392029a2cdae0eb836d7071599def8d67710024'),(73,'',1,0,'/uploads/20251226/1b394cf9d5e731d8f34fc267ed59ac3d.png',335,92,'png',0,'index_banner.png',54929,'image/png','',1766732171,1766732171,1766732171,'local','667a805293022524c787f62b1c48c6b86b2cba4c'),(74,'',1,0,'/uploads/20251226/1b394cf9d5e731d8f34fc267ed59ac3d.png',335,92,'png',0,'index_banner.png',54929,'image/png','',1766732171,1766732171,1766732171,'alioss','667a805293022524c787f62b1c48c6b86b2cba4c'),(75,'',1,0,'/uploads/20251226/506198f54b1b616aa950275e5523888c.png',375,928,'png',0,'intimacy_back.png',12480,'image/png','',1766732850,1766732850,1766732850,'local','44485e46b4e602b383631e8766bfb58c3f9b8eb9'),(76,'',1,0,'/uploads/20251226/506198f54b1b616aa950275e5523888c.png',375,928,'png',0,'intimacy_back.png',12480,'image/png','',1766732850,1766732850,1766732850,'alioss','44485e46b4e602b383631e8766bfb58c3f9b8eb9'),(77,'',1,0,'/uploads/20251226/9c05cdd001973d7ccba80067a1942a9a.png',78,76,'png',0,'intimacy_a1.png',8201,'image/png','',1766732850,1766732850,1766732850,'local','225ec58ccfbae28e966c5f8be77dd93a6482b87c'),(78,'',1,0,'/uploads/20251226/9c05cdd001973d7ccba80067a1942a9a.png',78,76,'png',0,'intimacy_a1.png',8201,'image/png','',1766732850,1766732850,1766732850,'alioss','225ec58ccfbae28e966c5f8be77dd93a6482b87c'),(79,'',1,0,'/uploads/20251226/59ac97bf010703b8ecdcf57deb52b468.png',66,64,'png',0,'intimacy_a2.png',6251,'image/png','',1766732850,1766732850,1766732850,'local','185670a7112d579a720a769c5fd7465d58fa0eac'),(80,'',1,0,'/uploads/20251226/59ac97bf010703b8ecdcf57deb52b468.png',66,64,'png',0,'intimacy_a2.png',6251,'image/png','',1766732850,1766732850,1766732850,'alioss','185670a7112d579a720a769c5fd7465d58fa0eac'),(81,'',1,0,'/uploads/20251226/24d05a683e41e5492d4afeb0338dfa1f.png',93,90,'png',0,'intimacy_a3.png',10967,'image/png','',1766732850,1766732850,1766732850,'local','51dbd149bbc43e1116df23f64c4fde61572c7357'),(82,'',1,0,'/uploads/20251226/24d05a683e41e5492d4afeb0338dfa1f.png',93,90,'png',0,'intimacy_a3.png',10967,'image/png','',1766732850,1766732850,1766732850,'alioss','51dbd149bbc43e1116df23f64c4fde61572c7357'),(83,'',1,0,'/uploads/20251226/961f20f64150521c08d00889e45d44bd.png',69,64,'png',0,'intimacy_intimacy.png',2509,'image/png','',1766732850,1766732850,1766732850,'local','fdd65073722402066fd15a4268d5cba9534fd977'),(84,'',1,0,'/uploads/20251226/961f20f64150521c08d00889e45d44bd.png',69,64,'png',0,'intimacy_intimacy.png',2509,'image/png','',1766732850,1766732850,1766732850,'alioss','fdd65073722402066fd15a4268d5cba9534fd977'),(85,'',1,0,'/uploads/20251226/67a9cb232b0d8405963078900eca32ab.png',88,81,'png',0,'intimacy_intimacys.png',3280,'image/png','',1766732851,1766732851,1766732851,'local','b908348b7e7d95679127e86e31bc39af9c8c9c7f'),(86,'',1,0,'/uploads/20251226/67a9cb232b0d8405963078900eca32ab.png',88,81,'png',0,'intimacy_intimacys.png',3280,'image/png','',1766732851,1766732851,1766732851,'alioss','b908348b7e7d95679127e86e31bc39af9c8c9c7f'),(87,'',1,0,'/uploads/20251226/efa43d6b415cb6acb4a801d92d59ca79.png',375,699,'png',0,'invite_back.png',9007,'image/png','',1766732851,1766732851,1766732851,'local','50702bbf61372ee1d8a48d6b0a6374303dd3ca5c'),(88,'',1,0,'/uploads/20251226/efa43d6b415cb6acb4a801d92d59ca79.png',375,699,'png',0,'invite_back.png',9007,'image/png','',1766732851,1766732851,1766732851,'alioss','50702bbf61372ee1d8a48d6b0a6374303dd3ca5c'),(89,'',1,0,'/uploads/20251226/54a0da02080e49dbf2d6412791c58281.png',162,162,'png',0,'invite_code.png',13119,'image/png','',1766732851,1766732851,1766732851,'local','4c8fe3d1f103fd2f7905e943f137f63de5cbc375'),(90,'',1,0,'/uploads/20251226/54a0da02080e49dbf2d6412791c58281.png',162,162,'png',0,'invite_code.png',13119,'image/png','',1766732851,1766732851,1766732851,'alioss','4c8fe3d1f103fd2f7905e943f137f63de5cbc375'),(91,'',1,0,'/uploads/20251226/cb61a8209c59166e5a56e9c5c470e8f1.png',345,409,'png',0,'invite_invite.png',24720,'image/png','',1766732851,1766732851,1766732851,'local','4e57a7a5828e8302d93d289c8e9c1598017db530'),(92,'',1,0,'/uploads/20251226/cb61a8209c59166e5a56e9c5c470e8f1.png',345,409,'png',0,'invite_invite.png',24720,'image/png','',1766732851,1766732851,1766732851,'alioss','4e57a7a5828e8302d93d289c8e9c1598017db530'),(93,'',1,0,'/uploads/20251226/7d4ea9bb621e68e9fc641fa3c357f678.png',83,83,'png',0,'login_logo.png',14860,'image/png','',1766732851,1766732851,1766732851,'local','b50b007851c2ece51e6378ecb9c9969a59873177'),(94,'',1,0,'/uploads/20251226/7d4ea9bb621e68e9fc641fa3c357f678.png',83,83,'png',0,'login_logo.png',14860,'image/png','',1766732851,1766732851,1766732851,'alioss','b50b007851c2ece51e6378ecb9c9969a59873177'),(95,'',1,0,'/uploads/20251226/e90acc9a7675bb463188a8ecf8f46054.png',78,68,'png',0,'lover_sex.png',11942,'image/png','',1766732852,1766732852,1766732852,'local','e4b0ebacc816ee19979d9a7c37f96a4837aef2d1'),(96,'',1,0,'/uploads/20251226/e90acc9a7675bb463188a8ecf8f46054.png',78,68,'png',0,'lover_sex.png',11942,'image/png','',1766732852,1766732852,1766732852,'alioss','e4b0ebacc816ee19979d9a7c37f96a4837aef2d1'),(97,'',1,0,'/uploads/20251226/87ad5de553f5a119109468d2e27b21c1.png',335,102,'png',0,'mine_banner.png',32187,'image/png','',1766733247,1766733247,1766733247,'local','5fe33a33e40a314485044685bf46b77d02101039'),(98,'',1,0,'/uploads/20251226/87ad5de553f5a119109468d2e27b21c1.png',335,102,'png',0,'mine_banner.png',32187,'image/png','',1766733247,1766733247,1766733247,'alioss','5fe33a33e40a314485044685bf46b77d02101039'),(99,'',1,0,'/uploads/20251226/7c383199322fbf1544fe3acf58c6cae5.png',375,771,'png',0,'replacement_backA.png',10339,'image/png','',1766733259,1766733259,1766733259,'local','9269a55c30f685d5eaf532b0f51c671f8ed0c360'),(100,'',1,0,'/uploads/20251226/7c383199322fbf1544fe3acf58c6cae5.png',375,771,'png',0,'replacement_backA.png',10339,'image/png','',1766733259,1766733259,1766733259,'alioss','9269a55c30f685d5eaf532b0f51c671f8ed0c360'),(101,'',1,0,'/uploads/20251226/3df8bbb66033583f5f4d9fa92f50ee6d.png',170,170,'png',0,'search_not.png',20559,'image/png','',1766733277,1766733277,1766733277,'local','1c76ee9b2bdd552fccaa58f49309e30994aaf40d'),(102,'',1,0,'/uploads/20251226/3df8bbb66033583f5f4d9fa92f50ee6d.png',170,170,'png',0,'search_not.png',20559,'image/png','',1766733277,1766733277,1766733277,'alioss','1c76ee9b2bdd552fccaa58f49309e30994aaf40d'),(103,'',1,0,'/uploads/20251226/2bfd31d1dda5e6cef31ed4793197c3dd.png',375,704,'png',0,'ties_back.png',10319,'image/png','',1766733285,1766733285,1766733285,'local','0c99dfdbf709afae1a3547d726af00399ccad95b'),(104,'',1,0,'/uploads/20251226/2bfd31d1dda5e6cef31ed4793197c3dd.png',375,704,'png',0,'ties_back.png',10319,'image/png','',1766733285,1766733285,1766733285,'alioss','0c99dfdbf709afae1a3547d726af00399ccad95b'),(105,'',1,0,'/uploads/20251226/22d88b56e12259070e204f98c81f6adf.png',318,173,'png',0,'ties_logo.png',16709,'image/png','',1766733295,1766733295,1766733295,'local','134fb965de26281b251d6119faf99d3788d89597'),(106,'',1,0,'/uploads/20251226/22d88b56e12259070e204f98c81f6adf.png',318,173,'png',0,'ties_logo.png',16709,'image/png','',1766733295,1766733295,1766733295,'alioss','134fb965de26281b251d6119faf99d3788d89597'),(107,'',1,0,'/uploads/20251227/e3e159f0261ac561f1d05a2977c40120.jpg',1280,1280,'jpg',0,'Avatar_Default.jpg',35567,'image/jpeg','',1766833943,1766833943,1766833943,'local','0ea3d0ee8ead52994ffd3d3ccf53e6663ec2eb6c'),(108,'',1,0,'/uploads/20251227/e3e159f0261ac561f1d05a2977c40120.jpg',1280,1280,'jpg',0,'Avatar_Default.jpg',35567,'image/jpeg','',1766833943,1766833943,1766833943,'alioss','0ea3d0ee8ead52994ffd3d3ccf53e6663ec2eb6c'),(109,'',0,15,'/uploads/20251228/44f388d601b07b2aa4e6222bef0c4b58.jpeg',132,132,'jpeg',0,'tmp_b6e6c390c0b46162f1a4c9c297f3bd7478b2b55c9c854c5ae6da16c044a7d7cd.jpeg',3481,'image/jpeg','',1766886358,1766886358,1766886358,'local','647c57f6a0ddc3dce37510b13e4dbeb4ab2dcf65'),(110,'',0,15,'/uploads/20251228/44f388d601b07b2aa4e6222bef0c4b58.jpeg',132,132,'jpeg',0,'tmp_b6e6c390c0b46162f1a4c9c297f3bd7478b2b55c9c854c5ae6da16c044a7d7cd.jpeg',3481,'image/jpeg','',1766886358,1766886358,1766886358,'alioss','647c57f6a0ddc3dce37510b13e4dbeb4ab2dcf65'),(111,'',1,0,'/uploads/20251228/221295058d27e5dddcfa0e7e2cd06185.mp3',0,0,'mp3',0,'娴极椋庢儏濂?mp3',120835,'audio/mpeg','',1766889770,1766889770,1766889770,'local','612de7c7e6af6781f12653c85e482f1f95abc774'),(112,'',1,0,'/uploads/20251228/221295058d27e5dddcfa0e7e2cd06185.mp3',0,0,'mp3',0,'娴极椋庢儏濂?mp3',120835,'audio/mpeg','',1766889770,1766889770,1766889770,'alioss','612de7c7e6af6781f12653c85e482f1f95abc774'),(113,'',1,0,'/uploads/20251228/b52e832cd9c64b013240043cee5b2a5f.jpg',1179,1044,'jpg',0,'26100a2dcc189789518999b9bddd8937.jpg',199139,'image/jpeg','',1766889835,1766889835,1766889835,'local','15470aa82a8fdcb5289e3ccaf916adb23511e009'),(114,'',1,0,'/uploads/20251228/b52e832cd9c64b013240043cee5b2a5f.jpg',1179,1044,'jpg',0,'26100a2dcc189789518999b9bddd8937.jpg',199139,'image/jpeg','',1766889835,1766889835,1766889835,'alioss','15470aa82a8fdcb5289e3ccaf916adb23511e009'),(115,'',1,0,'/uploads/20251228/8487c395fb0b6343ad7214c16f763899.png',200,200,'png',0,'9缁堢偣.png',10641,'image/png','',1766895676,1766895676,1766895676,'local','1a053cead3787723eecbf4193db9b67f24fb9b8c'),(116,'',1,0,'/uploads/20251228/8487c395fb0b6343ad7214c16f763899.png',200,200,'png',0,'9缁堢偣.png',10641,'image/png','',1766895676,1766895676,1766895676,'alioss','1a053cead3787723eecbf4193db9b67f24fb9b8c'),(117,'',1,0,'/uploads/20251228/cb6769869d0832434baf7597a5bd0d50.jpeg',1191,942,'jpeg',0,'blueshort.jpeg',106972,'image/jpeg','',1766896947,1766896947,1766896947,'local','8a7c51d52362aeeddff56b494ee455060bca9b68'),(118,'',1,0,'/uploads/20251228/cb6769869d0832434baf7597a5bd0d50.jpeg',1191,942,'jpeg',0,'blueshort.jpeg',106972,'image/jpeg','',1766896947,1766896947,1766896947,'alioss','8a7c51d52362aeeddff56b494ee455060bca9b68'),(119,'',1,0,'/uploads/20251228/c41af2d66d482a59ca252d4612bb18f0.png',200,200,'png',0,'6璧风偣.png',7554,'image/png','',1766897343,1766897343,1766897343,'local','fcd5a75839a7d6de19eab8c0eba33bb62badc6e6'),(120,'',1,0,'/uploads/20251228/c41af2d66d482a59ca252d4612bb18f0.png',200,200,'png',0,'6璧风偣.png',7554,'image/png','',1766897343,1766897343,1766897343,'alioss','fcd5a75839a7d6de19eab8c0eba33bb62badc6e6'),(121,'',1,0,'/uploads/20251228/8386c8cff097f3ab2f0fdbdaf6aa6d25.jpeg',320,320,'jpeg',0,'p801327.jpeg',30195,'image/jpeg','',1766911182,1766911182,1766911182,'local','6208a795c94af0b739d4108529d6df868ef9840c'),(122,'',1,0,'/uploads/20251228/8386c8cff097f3ab2f0fdbdaf6aa6d25.jpeg',320,320,'jpeg',0,'p801327.jpeg',30195,'image/jpeg','',1766911182,1766911182,1766911182,'alioss','6208a795c94af0b739d4108529d6df868ef9840c'),(123,'',1,0,'/uploads/20251228/9cb3bfb1e1d7f1823f3eb4656d2c1cec.jpeg',250,250,'jpeg',0,'p801333.jpeg',22715,'image/jpeg','',1766911210,1766911210,1766911210,'local','1f77865dc3d97cb5bd3351fc4bdfeeb157a627df'),(124,'',1,0,'/uploads/20251228/9cb3bfb1e1d7f1823f3eb4656d2c1cec.jpeg',250,250,'jpeg',0,'p801333.jpeg',22715,'image/jpeg','',1766911210,1766911210,1766911210,'alioss','1f77865dc3d97cb5bd3351fc4bdfeeb157a627df'),(125,'',1,0,'/uploads/20251228/fbb319d9d686955c766836abf4f42a15.jpeg',520,539,'jpeg',0,'p801340.jpeg',13090,'image/jpeg','',1766911233,1766911233,1766911233,'local','69fdc7739a91ce38cab87fbba762e5c183e4172f'),(126,'',1,0,'/uploads/20251228/fbb319d9d686955c766836abf4f42a15.jpeg',520,539,'jpeg',0,'p801340.jpeg',13090,'image/jpeg','',1766911233,1766911233,1766911233,'alioss','69fdc7739a91ce38cab87fbba762e5c183e4172f'),(127,'',1,0,'/uploads/20251228/b50d7b1776417e83af4242561f6b253f.jpeg',500,500,'jpeg',0,'shortblue.jpeg',74394,'image/jpeg','',1766911287,1766911287,1766911287,'local','780abeb76eafa0e787fecbf092a613dbc2590e6e'),(128,'',1,0,'/uploads/20251228/b50d7b1776417e83af4242561f6b253f.jpeg',500,500,'jpeg',0,'shortblue.jpeg',74394,'image/jpeg','',1766911287,1766911287,1766911287,'alioss','780abeb76eafa0e787fecbf092a613dbc2590e6e'),(129,'',1,0,'/uploads/20251228/b5271495801ef0c693d9e5b9873bec67.png',1440,1920,'png',0,'寰俊鍥剧墖_20251228163830_364_9.png',794024,'image/png','',1766911315,1766911315,1766911315,'local','656b981552c99eef90932146eeb12450ad982ba5'),(130,'',1,0,'/uploads/20251228/b5271495801ef0c693d9e5b9873bec67.png',1440,1920,'png',0,'寰俊鍥剧墖_20251228163830_364_9.png',794024,'image/png','',1766911315,1766911315,1766911315,'alioss','656b981552c99eef90932146eeb12450ad982ba5'),(131,'',1,0,'/uploads/20251228/bea27bf11ffb116ec74a650dd51501b4.png',958,948,'png',0,'寰俊鍥剧墖_20251228163911_368_9.png',347767,'image/png','',1766911336,1766911336,1766911336,'local','2dfd6af2a10ed8611924696f52f6118e1b491904'),(132,'',1,0,'/uploads/20251228/bea27bf11ffb116ec74a650dd51501b4.png',958,948,'png',0,'寰俊鍥剧墖_20251228163911_368_9.png',347767,'image/png','',1766911336,1766911336,1766911336,'alioss','2dfd6af2a10ed8611924696f52f6118e1b491904'),(133,'',1,0,'/uploads/20251228/8fc1fd2fc60ad532e18fe7bab0046d4d.png',1920,1920,'png',0,'寰俊鍥剧墖_20251228163856_365_9.png',1798725,'image/png','',1766913566,1766913566,1766913566,'local','b8e007f70790796a3501d20d60d44115131ca5c9'),(134,'',1,0,'/uploads/20251228/8fc1fd2fc60ad532e18fe7bab0046d4d.png',1920,1920,'png',0,'寰俊鍥剧墖_20251228163856_365_9.png',1798725,'image/png','',1766913566,1766913566,1766913566,'alioss','b8e007f70790796a3501d20d60d44115131ca5c9'),(135,'',1,0,'/uploads/20251228/18ae4455366faf1c8034ea547499a122.png',1920,1920,'png',0,'寰俊鍥剧墖_20251228163901_366_9.png',334120,'image/png','',1766913780,1766913780,1766913780,'local','3ab0283f904508967794ff96fea186b0f8dc6deb'),(136,'',1,0,'/uploads/20251228/18ae4455366faf1c8034ea547499a122.png',1920,1920,'png',0,'寰俊鍥剧墖_20251228163901_366_9.png',334120,'image/png','',1766913780,1766913780,1766913780,'alioss','3ab0283f904508967794ff96fea186b0f8dc6deb'),(137,'',1,0,'/uploads/20251228/9fff2aef8e58c5f77c5c9aada2aca021.png',750,1000,'png',0,'寰俊鍥剧墖_20251228163904_367_9.png',263994,'image/png','',1766913836,1766913836,1766913836,'local','83a3f0172277a6347fc7a265ec4fc176c18d0928'),(138,'',1,0,'/uploads/20251228/9fff2aef8e58c5f77c5c9aada2aca021.png',750,1000,'png',0,'寰俊鍥剧墖_20251228163904_367_9.png',263994,'image/png','',1766913836,1766913836,1766913836,'alioss','83a3f0172277a6347fc7a265ec4fc176c18d0928'),(139,'',1,0,'/uploads/20251229/7eb6df79faa38affbeef633f5d6ff894.mp3',0,0,'mp3',0,'瀹炲姏姝屾墜鐢?mp3',81965,'audio/mpeg','',1767002079,1767002079,1767002079,'local','959e5906556dc7c7d44843d1b7a9e8aa6b14be37'),(140,'',1,0,'/uploads/20251229/7eb6df79faa38affbeef633f5d6ff894.mp3',0,0,'mp3',0,'瀹炲姏姝屾墜鐢?mp3',81965,'audio/mpeg','',1767002079,1767002079,1767002079,'alioss','959e5906556dc7c7d44843d1b7a9e8aa6b14be37'),(141,'',1,0,'/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg',1280,1280,'jpg',0,'Avatar_Default.jpg',35567,'image/jpeg','',1767002085,1767002085,1767002085,'local','0ea3d0ee8ead52994ffd3d3ccf53e6663ec2eb6c'),(142,'',1,0,'/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg',1280,1280,'jpg',0,'Avatar_Default.jpg',35567,'image/jpeg','',1767002085,1767002085,1767002085,'alioss','0ea3d0ee8ead52994ffd3d3ccf53e6663ec2eb6c'),(143,'',1,0,'/uploads/20251229/221295058d27e5dddcfa0e7e2cd06185.mp3',0,0,'mp3',0,'娴极椋庢儏濂?mp3',120835,'audio/mpeg','',1767002294,1767002294,1767002294,'local','612de7c7e6af6781f12653c85e482f1f95abc774'),(144,'',1,0,'/uploads/20251229/221295058d27e5dddcfa0e7e2cd06185.mp3',0,0,'mp3',0,'娴极椋庢儏濂?mp3',120835,'audio/mpeg','',1767002294,1767002294,1767002294,'alioss','612de7c7e6af6781f12653c85e482f1f95abc774'),(145,'',1,0,'/uploads/20251229/3659df91b3fb9bf3a06c42129c9fd267.mp3',0,0,'mp3',0,'娓╂煍闂鸿湝濂?mp3',112476,'audio/mpeg','',1767002325,1767002325,1767002325,'local','82163cb55e6a19e86262e1a150fb47b8251719db'),(146,'',1,0,'/uploads/20251229/3659df91b3fb9bf3a06c42129c9fd267.mp3',0,0,'mp3',0,'娓╂煍闂鸿湝濂?mp3',112476,'audio/mpeg','',1767002325,1767002325,1767002325,'alioss','82163cb55e6a19e86262e1a150fb47b8251719db'),(147,'',1,0,'/uploads/20251229/a84a5435c1aa0d242a6bd534187ed1a3.mp3',0,0,'mp3',0,'楂橀泤姘旇川濂?mp3',321990,'audio/mpeg','',1767002352,1767002352,1767002352,'local','54b05543a1620265be204da4bf1e282563d0891a'),(148,'',1,0,'/uploads/20251229/a84a5435c1aa0d242a6bd534187ed1a3.mp3',0,0,'mp3',0,'楂橀泤姘旇川濂?mp3',321990,'audio/mpeg','',1767002352,1767002352,1767002352,'alioss','54b05543a1620265be204da4bf1e282563d0891a'),(149,'',1,0,'/uploads/20251229/1a8e50f5877b7b1ac4e7cb3e7acd97de.mp3',0,0,'mp3',0,'骞插噣娓呯埥鐢?mp3',175286,'audio/mpeg','',1767002381,1767002381,1767002381,'local','b3fdd09cf591c6fb207e0ab4f76108edd6cba3e5'),(150,'',1,0,'/uploads/20251229/1a8e50f5877b7b1ac4e7cb3e7acd97de.mp3',0,0,'mp3',0,'骞插噣娓呯埥鐢?mp3',175286,'audio/mpeg','',1767002381,1767002381,1767002381,'alioss','b3fdd09cf591c6fb207e0ab4f76108edd6cba3e5'),(151,'',1,0,'/uploads/20251229/e4e9b244b34d385d6a95fd50f1ff6578.mp3',0,0,'mp3',0,'鐫挎櫤杞荤啛鐢?mp3',241324,'audio/mpeg','',1767002394,1767002394,1767002394,'local','faf7e630e6ab523e8c0b6bcf25d7954fec819e4d'),(152,'',1,0,'/uploads/20251229/e4e9b244b34d385d6a95fd50f1ff6578.mp3',0,0,'mp3',0,'鐫挎櫤杞荤啛鐢?mp3',241324,'audio/mpeg','',1767002394,1767002394,1767002394,'alioss','faf7e630e6ab523e8c0b6bcf25d7954fec819e4d'),(153,'',1,0,'/uploads/20251229/1fe4651fe2b12f311e0dec23f9d4034a.mp3',0,0,'mp3',0,'娓╂殩鐥存儏鐢?mp3',113311,'audio/mpeg','',1767002409,1767002409,1767002409,'local','3162b167b157e808e1b462f638e4e2449873244f'),(154,'',1,0,'/uploads/20251229/1fe4651fe2b12f311e0dec23f9d4034a.mp3',0,0,'mp3',0,'娓╂殩鐥存儏鐢?mp3',113311,'audio/mpeg','',1767002409,1767002409,1767002409,'alioss','3162b167b157e808e1b462f638e4e2449873244f'),(155,'',1,0,'/uploads/20251229/ba37a4f390dbd8ac5e1cdd83950d129b.mp3',0,0,'mp3',0,'娓╂殩鏄ラ濂?mp3',174751,'audio/mpeg','',1767002562,1767002562,1767002562,'local','ad1518b2d2f7eb66ab5eab6e30bb12c274f1e5fe'),(156,'',1,0,'/uploads/20251229/ba37a4f390dbd8ac5e1cdd83950d129b.mp3',0,0,'mp3',0,'娓╂殩鏄ラ濂?mp3',174751,'audio/mpeg','',1767002562,1767002562,1767002562,'alioss','ad1518b2d2f7eb66ab5eab6e30bb12c274f1e5fe'),(157,'',0,14,'/uploads/20251230/dc24011f4fa005c920ea55b9af0f71aa.mp3',0,0,'mp3',0,'obj_wo3DlMOGwrbDjj7DisKw_22943711267_5c29_6a09_caf6_dc24011f4fa005c920ea55b9af0f71aa.mp3',732308,'audio/mpeg','',1767083983,1767083983,1767083983,'local','44bd390e5793db31282ce0521aa8cc60c9718046'),(158,'',0,14,'/uploads/20251230/dc24011f4fa005c920ea55b9af0f71aa.mp3',0,0,'mp3',0,'obj_wo3DlMOGwrbDjj7DisKw_22943711267_5c29_6a09_caf6_dc24011f4fa005c920ea55b9af0f71aa.mp3',732308,'audio/mpeg','',1767083983,1767083983,1767083983,'alioss','44bd390e5793db31282ce0521aa8cc60c9718046'),(159,'',0,15,'/uploads/20251230/3f79e677b6674c2a488da443f93f6dca.jpeg',380,380,'jpeg',0,'-DCmVX-8W-Ua3f79e677b6674c2a488da443f93f6dca.jpeg',11622,'image/jpeg','',1767087774,1767087774,1767087774,'local','50fb36cc4ac2a63606614487461d972d08f31b07'),(160,'',0,15,'/uploads/20251230/3f79e677b6674c2a488da443f93f6dca.jpeg',380,380,'jpeg',0,'-DCmVX-8W-Ua3f79e677b6674c2a488da443f93f6dca.jpeg',11622,'image/jpeg','',1767087774,1767087774,1767087774,'alioss','50fb36cc4ac2a63606614487461d972d08f31b07'),(161,'',0,15,'/uploads/20251231/3f79e677b6674c2a488da443f93f6dca.jpeg',380,380,'jpeg',0,'QT-KUY_LtgN_3f79e677b6674c2a488da443f93f6dca.jpeg',11622,'image/jpeg','',1767145072,1767145072,1767145072,'local','50fb36cc4ac2a63606614487461d972d08f31b07'),(162,'',0,15,'/uploads/20251231/3f79e677b6674c2a488da443f93f6dca.jpeg',380,380,'jpeg',0,'QT-KUY_LtgN_3f79e677b6674c2a488da443f93f6dca.jpeg',11622,'image/jpeg','',1767145072,1767145072,1767145072,'alioss','50fb36cc4ac2a63606614487461d972d08f31b07'),(163,'',0,15,'/uploads/20251231/d270164bf45140106d47e43524572686.jpg',132,132,'jpg',0,'KBbDpmEHAsvS9d9dbd2b67dacc1aa6077d3b2f495abc.jpg',4064,'image/jpeg','',1767161775,1767161775,1767161775,'local','26fa3093f0a03967b4ed4011717f12be57f326ee'),(164,'',0,15,'/uploads/20251231/d270164bf45140106d47e43524572686.jpg',132,132,'jpg',0,'KBbDpmEHAsvS9d9dbd2b67dacc1aa6077d3b2f495abc.jpg',4064,'image/jpeg','',1767161775,1767161775,1767161775,'alioss','26fa3093f0a03967b4ed4011717f12be57f326ee'),(165,'',0,15,'/uploads/20251231/69c72922c0e815086a30c370e7dbb42f.png',375,812,'png',0,'c67NZLIM1GEI69c72922c0e815086a30c370e7dbb42f.png',502956,'image/png','',1767165218,1767165218,1767165218,'local','96c40774a4ac87634eb11c75336223123edc736b'),(166,'',0,15,'/uploads/20251231/69c72922c0e815086a30c370e7dbb42f.png',375,812,'png',0,'c67NZLIM1GEI69c72922c0e815086a30c370e7dbb42f.png',502956,'image/png','',1767165218,1767165218,1767165218,'alioss','96c40774a4ac87634eb11c75336223123edc736b'),(167,'',0,15,'/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'72aptOlq717p5d8afdf6eb1db84ae02e8ace21105d6f.png',5246,'image/png','',1767165237,1767165237,1767165237,'local','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(168,'',0,15,'/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'72aptOlq717p5d8afdf6eb1db84ae02e8ace21105d6f.png',5246,'image/png','',1767165237,1767165237,1767165237,'alioss','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(169,'',1,0,'/uploads/20251231/a6d2dae70029b6465ea1f1f605f77258.png',335,582,'png',0,'钂欑増缁?16.png',428544,'image/png','',1767171075,1767171075,1767171075,'local','424e6d07cd6b354bb696d37d9ebc3fb7692af2a2'),(170,'',1,0,'/uploads/20251231/a6d2dae70029b6465ea1f1f605f77258.png',335,582,'png',0,'钂欑増缁?16.png',428544,'image/png','',1767171075,1767171075,1767171075,'alioss','424e6d07cd6b354bb696d37d9ebc3fb7692af2a2'),(171,'',1,0,'/uploads/20251231/a8b27c789ba9515ac0d07f77a3913d0b.png',78,68,'png',0,'鐭╁舰 528.png',10811,'image/png','',1767171187,1767171187,1767171187,'local','158159b2d503403b8fce2b28264d4a57d43de67f'),(172,'',1,0,'/uploads/20251231/a8b27c789ba9515ac0d07f77a3913d0b.png',78,68,'png',0,'鐭╁舰 528.png',10811,'image/png','',1767171187,1767171187,1767171187,'alioss','158159b2d503403b8fce2b28264d4a57d43de67f'),(173,'',1,0,'/uploads/20251231/c7dc9393a0d08ba379cb24b485e3e43e.png',25,24,'png',0,'ca2caff713da21ce79304abc2e9276c19184c613169e5-VZh7M9.png',1077,'image/png','',1767174767,1767174767,1767174767,'local','b4a1ef6b12c9fcdef07607b19f89103dcef8a97c'),(174,'',1,0,'/uploads/20251231/c7dc9393a0d08ba379cb24b485e3e43e.png',25,24,'png',0,'ca2caff713da21ce79304abc2e9276c19184c613169e5-VZh7M9.png',1077,'image/png','',1767174767,1767174767,1767174767,'alioss','b4a1ef6b12c9fcdef07607b19f89103dcef8a97c'),(175,'',0,12,'/uploads/20260104/006fbc2a67ed9683ba3ab69517ecae1d.jpeg',132,132,'jpeg',0,'tmp_d086e087300a76c95842951a3f848ac4e993ba5c1629bd5d0299af01a531d35c.jpeg',4481,'image/jpeg','',1767515561,1767515561,1767515561,'local','9eeaa759023e5f04df62887c87daf578f5ca86e3'),(176,'',0,12,'/uploads/20260104/006fbc2a67ed9683ba3ab69517ecae1d.jpeg',132,132,'jpeg',0,'tmp_d086e087300a76c95842951a3f848ac4e993ba5c1629bd5d0299af01a531d35c.jpeg',4481,'image/jpeg','',1767515561,1767515561,1767515561,'alioss','9eeaa759023e5f04df62887c87daf578f5ca86e3'),(177,'',1,0,'/uploads/20260104/06d13ae30ec708df26b922bd101a70e4.png',216,216,'png',0,'993f7890590e8d845ac15f1898aa9a750161c0c47f9a3-RL1lCR@2x.png',32236,'image/png','',1767517618,1767517618,1767517618,'local','a0349680f071d4f9bdce9fec9f321de84f649103'),(178,'',1,0,'/uploads/20260104/06d13ae30ec708df26b922bd101a70e4.png',216,216,'png',0,'993f7890590e8d845ac15f1898aa9a750161c0c47f9a3-RL1lCR@2x.png',32236,'image/png','',1767517618,1767517618,1767517618,'alioss','a0349680f071d4f9bdce9fec9f321de84f649103'),(179,'',0,41,'/uploads/20260104/ee6bfeca2a9df3189eb9f2701fa7bdfa.jpg',540,960,'jpg',0,'tmp_90183100b4182dfbaa996a0eb13e4ec77c1ebcf2034558f2.jpg',56793,'image/jpeg','',1767525021,1767525021,1767525021,'local','0a3c41759b009f992bca25a755c3bdefb00d207c'),(180,'',0,41,'/uploads/20260104/ee6bfeca2a9df3189eb9f2701fa7bdfa.jpg',540,960,'jpg',0,'tmp_90183100b4182dfbaa996a0eb13e4ec77c1ebcf2034558f2.jpg',56793,'image/jpeg','',1767525021,1767525021,1767525021,'alioss','0a3c41759b009f992bca25a755c3bdefb00d207c'),(181,'',0,41,'/uploads/20260104/ce5c0c35f17fc9b8545298c0933e8bee.jpg',640,854,'jpg',0,'tmp_abcae0a714391a3c49f3968e0eca910e0c4b047114fbd6c9.jpg',80404,'image/jpeg','',1767525062,1767525062,1767525062,'local','d6823173898fac67f6270879024861e53ea3247a'),(182,'',0,41,'/uploads/20260104/ce5c0c35f17fc9b8545298c0933e8bee.jpg',640,854,'jpg',0,'tmp_abcae0a714391a3c49f3968e0eca910e0c4b047114fbd6c9.jpg',80404,'image/jpeg','',1767525062,1767525062,1767525062,'alioss','d6823173898fac67f6270879024861e53ea3247a'),(183,'',0,40,'/uploads/20260105/7d4ea9bb621e68e9fc641fa3c357f678.png',83,83,'png',0,'pyXzSNAKdy_e7d4ea9bb621e68e9fc641fa3c357f678.png',14860,'image/png','',1767603359,1767603359,1767603359,'local','b50b007851c2ece51e6378ecb9c9969a59873177'),(184,'',0,40,'/uploads/20260105/7d4ea9bb621e68e9fc641fa3c357f678.png',83,83,'png',0,'pyXzSNAKdy_e7d4ea9bb621e68e9fc641fa3c357f678.png',14860,'image/png','',1767603359,1767603359,1767603359,'alioss','b50b007851c2ece51e6378ecb9c9969a59873177'),(185,'',0,40,'/uploads/20260105/a6d2dae70029b6465ea1f1f605f77258.png',335,582,'png',0,'61wa6DEEF6IVa6d2dae70029b6465ea1f1f605f77258.png',428544,'image/png','',1767605514,1767605514,1767605514,'local','424e6d07cd6b354bb696d37d9ebc3fb7692af2a2'),(186,'',0,40,'/uploads/20260105/a6d2dae70029b6465ea1f1f605f77258.png',335,582,'png',0,'61wa6DEEF6IVa6d2dae70029b6465ea1f1f605f77258.png',428544,'image/png','',1767605514,1767605514,1767605514,'alioss','424e6d07cd6b354bb696d37d9ebc3fb7692af2a2'),(187,'',0,27,'/uploads/20260106/6bff4b8778ec6605d6e74b156bfa4861.jpeg',132,132,'jpeg',0,'tmp_9fefdf19d15d55b45acdb19cd53a4a33706eb59c65310cb964a022ae1cc78054.jpeg',1215,'image/jpeg','',1767690012,1767690012,1767690012,'local','afe0585dcb3c9ef46459aefa4a230527f519286a'),(188,'',0,27,'/uploads/20260106/6bff4b8778ec6605d6e74b156bfa4861.jpeg',132,132,'jpeg',0,'tmp_9fefdf19d15d55b45acdb19cd53a4a33706eb59c65310cb964a022ae1cc78054.jpeg',1215,'image/jpeg','',1767690012,1767690012,1767690012,'alioss','afe0585dcb3c9ef46459aefa4a230527f519286a'),(189,'',0,27,'/uploads/20260107/cb3b489fcbdadf6636b89ff0429bda0b.jpg',2124,3806,'jpg',0,'tmp_a7b9162fa45094706ccefcd0a3870540d3229c5e4fcfb9d1.jpg',1621242,'image/jpeg','',1767750843,1767750843,1767750843,'local','f339b0ca3c59898e9ec63d7d1b06183007d57f44'),(190,'',0,27,'/uploads/20260107/cb3b489fcbdadf6636b89ff0429bda0b.jpg',2124,3806,'jpg',0,'tmp_a7b9162fa45094706ccefcd0a3870540d3229c5e4fcfb9d1.jpg',1621242,'image/jpeg','',1767750843,1767750843,1767750843,'alioss','f339b0ca3c59898e9ec63d7d1b06183007d57f44'),(191,'',1,0,'/uploads/20260109/1de53e5a44b00fcc69961e6d036f7b57.png',570,644,'png',0,'缁?14176@2x.png',169484,'image/png','',1767924469,1767924469,1767924469,'local','435de4db499a035f2ea4813dc443b4292ac9de7d'),(192,'',1,0,'/uploads/20260109/1de53e5a44b00fcc69961e6d036f7b57.png',570,644,'png',0,'缁?14176@2x.png',169484,'image/png','',1767924469,1767924469,1767924469,'alioss','435de4db499a035f2ea4813dc443b4292ac9de7d'),(193,'',0,40,'/uploads/20260109/ccd0e444fe00fd3ff2125f72452c1b35.png',64,64,'png',0,'_3i9IAQifeSGccd0e444fe00fd3ff2125f72452c1b35.png',2409,'image/png','',1767940369,1767940369,1767940369,'local','0619cbb73fc789822973d9ed4606a4a6766267c6'),(194,'',0,40,'/uploads/20260109/ccd0e444fe00fd3ff2125f72452c1b35.png',64,64,'png',0,'_3i9IAQifeSGccd0e444fe00fd3ff2125f72452c1b35.png',2409,'image/png','',1767940369,1767940369,1767940369,'alioss','0619cbb73fc789822973d9ed4606a4a6766267c6'),(195,'',0,40,'/uploads/20260109/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'A6UIwCBrZo715d8afdf6eb1db84ae02e8ace21105d6f.png',5246,'image/png','',1767940670,1767940670,1767940670,'local','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(196,'',0,40,'/uploads/20260109/5d8afdf6eb1db84ae02e8ace21105d6f.png',60,60,'png',0,'A6UIwCBrZo715d8afdf6eb1db84ae02e8ace21105d6f.png',5246,'image/png','',1767940670,1767940670,1767940670,'alioss','3fbad35bd3a7a25dff8aabd962b701578a509f71'),(197,'',0,40,'/uploads/20260109/2082c21972673ccb9a40955aac39cb9b.png',44,44,'png',0,'0CsIN_TA7GR12082c21972673ccb9a40955aac39cb9b.png',2403,'image/png','',1767940878,1767940878,1767940878,'local','8f7281d8547c1c4236de2e150605e2e70dd2562d'),(198,'',0,40,'/uploads/20260109/2082c21972673ccb9a40955aac39cb9b.png',44,44,'png',0,'0CsIN_TA7GR12082c21972673ccb9a40955aac39cb9b.png',2403,'image/png','',1767940878,1767940878,1767940878,'alioss','8f7281d8547c1c4236de2e150605e2e70dd2562d'),(199,'',0,40,'/uploads/20260109/75dd23d8c56dba187725b59e6aa8f6b4.jpeg',132,132,'jpeg',0,'tmp_676d3e7b7c59dcb5a1cbdf668bf5a267eefcaea3eaea1f71ff88809182bf35a6.jpeg',3483,'image/jpeg','',1767941333,1767941333,1767941333,'local','347fb2fb723e7bf0341d70646c04b9c3c82502de'),(200,'',0,40,'/uploads/20260109/75dd23d8c56dba187725b59e6aa8f6b4.jpeg',132,132,'jpeg',0,'tmp_676d3e7b7c59dcb5a1cbdf668bf5a267eefcaea3eaea1f71ff88809182bf35a6.jpeg',3483,'image/jpeg','',1767941333,1767941333,1767941333,'alioss','347fb2fb723e7bf0341d70646c04b9c3c82502de'),(201,'',0,70,'/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg',132,132,'jpeg',0,'tmp_4339afa9105e83ce630ea40f9a49b70f7c1b6752b6101d0c.jpeg',1216,'image/jpeg','',1767947928,1767947928,1767947928,'local','49dd437fcfc6460e1c02e19f2472eb39ae283bc3'),(202,'',0,70,'/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg',132,132,'jpeg',0,'tmp_4339afa9105e83ce630ea40f9a49b70f7c1b6752b6101d0c.jpeg',1216,'image/jpeg','',1767947928,1767947928,1767947928,'alioss','49dd437fcfc6460e1c02e19f2472eb39ae283bc3'),(203,'',1,0,'/uploads/20260112/e21cff998c293dbcb72ec52e4406ad31.mp3',0,0,'mp3',0,'浜插拰娲绘臣濂?mp3',268909,'audio/mpeg','',1768199241,1768199241,1768199241,'local','c33f2027496fea1f82b9ec7ce56e2169431a5f4c'),(204,'',1,0,'/uploads/20260112/e21cff998c293dbcb72ec52e4406ad31.mp3',0,0,'mp3',0,'浜插拰娲绘臣濂?mp3',268909,'audio/mpeg','',1768199241,1768199241,1768199241,'alioss','c33f2027496fea1f82b9ec7ce56e2169431a5f4c'),(205,'',1,0,'/uploads/20260112/6e1f8e84c4b127c5c1e466b00cab0efa.mp3',0,0,'mp3',0,'鎬濈淮鐏靛姩濂?mp3',237562,'audio/mpeg','',1768199499,1768199499,1768199499,'local','27a77a72c2863c5fd52619f3fb2e7bb5e4e2e31d'),(206,'',1,0,'/uploads/20260112/6e1f8e84c4b127c5c1e466b00cab0efa.mp3',0,0,'mp3',0,'鎬濈淮鐏靛姩濂?mp3',237562,'audio/mpeg','',1768199499,1768199499,1768199499,'alioss','27a77a72c2863c5fd52619f3fb2e7bb5e4e2e31d'),(207,'',1,0,'/uploads/20260112/e8dd3e31fe7f4b26c3604bb197641a0f.mp3',0,0,'mp3',0,'娓╁閭诲濂?mp3',124596,'audio/mpeg','',1768199652,1768199652,1768199652,'local','06d89037b0e07c1491a224d054a4e172fc2b48f9'),(208,'',1,0,'/uploads/20260112/e8dd3e31fe7f4b26c3604bb197641a0f.mp3',0,0,'mp3',0,'娓╁閭诲濂?mp3',124596,'audio/mpeg','',1768199652,1768199652,1768199652,'alioss','06d89037b0e07c1491a224d054a4e172fc2b48f9'),(209,'',1,0,'/uploads/20260112/93fa8cef1a9fe3411fdbe2379441e8e4.mp3',0,0,'mp3',0,'鍏冩皵鐢滅編濂?mp3',126686,'audio/mpeg','',1768199746,1768199746,1768199746,'local','55622cbc0ce2d40e8122e558a801f0da54e57da4'),(210,'',1,0,'/uploads/20260112/93fa8cef1a9fe3411fdbe2379441e8e4.mp3',0,0,'mp3',0,'鍏冩皵鐢滅編濂?mp3',126686,'audio/mpeg','',1768199746,1768199746,1768199746,'alioss','55622cbc0ce2d40e8122e558a801f0da54e57da4'),(211,'',1,0,'/uploads/20260112/99dd55f5cce442584547bf6e68ff8967.mp3',0,0,'mp3',0,'绉瀬鐭ユ€уコ.mp3',148002,'audio/mpeg','',1768200013,1768200013,1768200013,'local','b471ae1172ae1db02372251df5f80a46d05f9dc2'),(212,'',1,0,'/uploads/20260112/99dd55f5cce442584547bf6e68ff8967.mp3',0,0,'mp3',0,'绉瀬鐭ユ€уコ.mp3',148002,'audio/mpeg','',1768200013,1768200013,1768200013,'alioss','b471ae1172ae1db02372251df5f80a46d05f9dc2'),(213,'',1,0,'/uploads/20260112/b2c25914521b1eb90f43f7e0997840f6.mp3',0,0,'mp3',0,'鏅烘収闈掑勾鐢?mp3',139643,'audio/mpeg','',1768200088,1768200088,1768200088,'local','6be72e9f5408e7b69ae6a0be133882cc3e020ca3'),(214,'',1,0,'/uploads/20260112/b2c25914521b1eb90f43f7e0997840f6.mp3',0,0,'mp3',0,'鏅烘収闈掑勾鐢?mp3',139643,'audio/mpeg','',1768200088,1768200088,1768200088,'alioss','6be72e9f5408e7b69ae6a0be133882cc3e020ca3'),(215,'',1,0,'/uploads/20260112/7d703dcbed0d8a2a7f123e077ca3afed.jpg',921,1228,'jpg',0,'鍚婂甫.jpg',65748,'image/jpeg','',1768203403,1768203403,1768203403,'local','d147e2c9f13101e592f068831dc1c734af0fc31b'),(216,'',1,0,'/uploads/20260112/7d703dcbed0d8a2a7f123e077ca3afed.jpg',921,1228,'jpg',0,'鍚婂甫.jpg',65748,'image/jpeg','',1768203403,1768203403,1768203403,'alioss','d147e2c9f13101e592f068831dc1c734af0fc31b'),(217,'',1,0,'/uploads/20260112/8d3a9ad26f58867dbe1883b5089de3f2.jpg',800,800,'jpg',0,'瑗胯瑁?jpg',88637,'image/jpeg','',1768203427,1768203427,1768203427,'local','0362b9b3f9cfbbfd478040745dbbe5453c6b9511'),(218,'',1,0,'/uploads/20260112/8d3a9ad26f58867dbe1883b5089de3f2.jpg',800,800,'jpg',0,'瑗胯瑁?jpg',88637,'image/jpeg','',1768203427,1768203427,1768203427,'alioss','0362b9b3f9cfbbfd478040745dbbe5453c6b9511'),(219,'',1,0,'/uploads/20260112/e14119583e8f05bf362c7d482b2c3f30.jpg',1440,1920,'jpg',0,'涓€瀛楅鐧炬惌闀胯t鎭?jpg',232646,'image/jpeg','',1768203451,1768203451,1768203451,'local','e08dd4eb5819598f42517a91031aded11a8c580f'),(220,'',1,0,'/uploads/20260112/e14119583e8f05bf362c7d482b2c3f30.jpg',1440,1920,'jpg',0,'涓€瀛楅鐧炬惌闀胯t鎭?jpg',232646,'image/jpeg','',1768203451,1768203451,1768203451,'alioss','e08dd4eb5819598f42517a91031aded11a8c580f'),(221,'',1,0,'/uploads/20260112/cb0bf5abd1fdbf81a0e163eb2adcce62.jpg',765,765,'jpg',0,'浜ゅ弶钑句笣鍚婂甫.jpg',59961,'image/jpeg','',1768204864,1768204864,1768204864,'local','c9583ee3b87b300e0d97e7791e3b6d21201f3616'),(222,'',1,0,'/uploads/20260112/cb0bf5abd1fdbf81a0e163eb2adcce62.jpg',765,765,'jpg',0,'浜ゅ弶钑句笣鍚婂甫.jpg',59961,'image/jpeg','',1768204864,1768204864,1768204864,'alioss','c9583ee3b87b300e0d97e7791e3b6d21201f3616'),(223,'',1,0,'/uploads/20260112/8d5b325056c007039f8bf020e64090b1.jpg',918,918,'jpg',0,'楸奸閽㈠湀瑁硅兏.jpg',105959,'image/jpeg','',1768204880,1768204880,1768204880,'local','0a51252251cf53f99f408aabc69d5cf4ebd936bb'),(224,'',1,0,'/uploads/20260112/8d5b325056c007039f8bf020e64090b1.jpg',918,918,'jpg',0,'楸奸閽㈠湀瑁硅兏.jpg',105959,'image/jpeg','',1768204880,1768204880,1768204880,'alioss','0a51252251cf53f99f408aabc69d5cf4ebd936bb'),(225,'',1,0,'/uploads/20260113/936358714c8722798d2e87a23d1b6435.mp3',0,0,'mp3',0,'鏉ョ敓缂樺コ-[AudioTrimmer.com].mp3',81517,'audio/mpeg','',1768294308,1768294308,1768294308,'local','142296a3762e2e73e36ee85e30ca6d0ed0e6b433'),(226,'',1,0,'/uploads/20260113/936358714c8722798d2e87a23d1b6435.mp3',0,0,'mp3',0,'鏉ョ敓缂樺コ-[AudioTrimmer.com].mp3',81517,'audio/mpeg','',1768294308,1768294308,1768294308,'alioss','142296a3762e2e73e36ee85e30ca6d0ed0e6b433'),(227,'',1,0,'/uploads/20260113/44888ebe6c94281d809988003c491105.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉嬪コ-[AudioTrimmer.com].mp3',81514,'audio/mpeg','',1768295735,1768295735,1768295735,'local','b248d28e558174a069e607cd01f4117a1fa749d9'),(228,'',1,0,'/uploads/20260113/44888ebe6c94281d809988003c491105.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉嬪コ-[AudioTrimmer.com].mp3',81514,'audio/mpeg','',1768295735,1768295735,1768295735,'alioss','b248d28e558174a069e607cd01f4117a1fa749d9'),(229,'',0,72,'/uploads/20260114/dac3a02dce61b89be5eb11027095297a.png',750,626,'png',0,'gy07FdcYAvF7dac3a02dce61b89be5eb11027095297a.png',256171,'image/png','',1768360142,1768360142,1768360142,'local','9ec86fe0e61b9d9ec361481e75ceee82e9560c49'),(230,'',0,72,'/uploads/20260114/dac3a02dce61b89be5eb11027095297a.png',750,626,'png',0,'gy07FdcYAvF7dac3a02dce61b89be5eb11027095297a.png',256171,'image/png','',1768360142,1768360142,1768360142,'alioss','9ec86fe0e61b9d9ec361481e75ceee82e9560c49'),(231,'',1,0,'/uploads/20260114/ec787b50a4e6f757bd34266f75b39348.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆-[AudioTrimmer.com].mp3',81209,'audio/mpeg','',1768360287,1768360287,1768360287,'local','ba766dda223a2f387b2b03504ae313447bae4235'),(232,'',1,0,'/uploads/20260114/ec787b50a4e6f757bd34266f75b39348.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆-[AudioTrimmer.com].mp3',81209,'audio/mpeg','',1768360287,1768360287,1768360287,'alioss','ba766dda223a2f387b2b03504ae313447bae4235'),(233,'',1,0,'/uploads/20260114/b98b152f7ec684933fbe147d0a70cf75.mp3',0,0,'mp3',0,'濡傛効-[AudioTrimmer.com].mp3',81485,'audio/mpeg','',1768360506,1768360506,1768360506,'local','ce6cc4372bc70c3b2e384c63ee3cc635d1193ba8'),(234,'',1,0,'/uploads/20260114/b98b152f7ec684933fbe147d0a70cf75.mp3',0,0,'mp3',0,'濡傛効-[AudioTrimmer.com].mp3',81485,'audio/mpeg','',1768360506,1768360506,1768360506,'alioss','ce6cc4372bc70c3b2e384c63ee3cc635d1193ba8'),(235,'',1,0,'/uploads/20260114/1d5366829aaf765a53661044311d922e.mp3',0,0,'mp3',0,'涓€璺敓鑺?[AudioTrimmer.com].mp3',81197,'audio/mpeg','',1768360778,1768360778,1768360778,'local','b4ed3eaa7dd90752424d474a2d19afa25fe40c1f'),(236,'',1,0,'/uploads/20260114/1d5366829aaf765a53661044311d922e.mp3',0,0,'mp3',0,'涓€璺敓鑺?[AudioTrimmer.com].mp3',81197,'audio/mpeg','',1768360778,1768360778,1768360778,'alioss','b4ed3eaa7dd90752424d474a2d19afa25fe40c1f'),(237,'',1,0,'/uploads/20260114/7bb350da9c024f55ade51a17a01793a3.mp3',0,0,'mp3',0,'鏆栨殩-[AudioTrimmer.com].mp3',81185,'audio/mpeg','',1768361070,1768361070,1768361070,'local','d9d072c1aed8488f859e0a160d77ac4562b3a298'),(238,'',1,0,'/uploads/20260114/7bb350da9c024f55ade51a17a01793a3.mp3',0,0,'mp3',0,'鏆栨殩-[AudioTrimmer.com].mp3',81185,'audio/mpeg','',1768361070,1768361070,1768361070,'alioss','d9d072c1aed8488f859e0a160d77ac4562b3a298'),(239,'',1,0,'/uploads/20260114/c84d6930c8622ba8501ee4fb1713256c.mp3',0,0,'mp3',0,'蹇樻儏姘?[AudioTrimmer.com].mp3',81914,'audio/mpeg','',1768383400,1768383400,1768383400,'local','ed6c78571e6c5a7ac8020c1905cede91394648ec'),(240,'',1,0,'/uploads/20260114/c84d6930c8622ba8501ee4fb1713256c.mp3',0,0,'mp3',0,'蹇樻儏姘?[AudioTrimmer.com].mp3',81914,'audio/mpeg','',1768383400,1768383400,1768383400,'alioss','ed6c78571e6c5a7ac8020c1905cede91394648ec'),(241,'',1,0,'/uploads/20260117/fd59ffbc89f3ea57a81c73327b926877.mp3',0,0,'mp3',0,'涓€鍗婁竴鍗?[AudioTrimmer.com].mp3',481492,'audio/mpeg','',1768645970,1768645970,1768645970,'local','be593f59b570c73f60ad24d835a32ad3f90fe59d'),(242,'',1,0,'/uploads/20260117/fd59ffbc89f3ea57a81c73327b926877.mp3',0,0,'mp3',0,'涓€鍗婁竴鍗?[AudioTrimmer.com].mp3',481492,'audio/mpeg','',1768645970,1768645970,1768645970,'alioss','be593f59b570c73f60ad24d835a32ad3f90fe59d'),(243,'',1,0,'/uploads/20260117/1b4ed03a58f1a5c733b28590eb017be2.mp3',0,0,'mp3',0,'鏉ョ敓缂樺師鍞?[AudioTrimmer.com].mp3',433530,'audio/mpeg','',1768648172,1768648172,1768648172,'local','79bd13a088eb95a2696f05d771a46478d6496606'),(244,'',1,0,'/uploads/20260117/1b4ed03a58f1a5c733b28590eb017be2.mp3',0,0,'mp3',0,'鏉ョ敓缂樺師鍞?[AudioTrimmer.com].mp3',433530,'audio/mpeg','',1768648172,1768648172,1768648172,'alioss','79bd13a088eb95a2696f05d771a46478d6496606'),(245,'',1,0,'/uploads/20260117/bf5b10828a7b522e991b80c0a0e2c096.mp3',0,0,'mp3',0,'鏉ョ敓缂?[AudioTrimmer.com].mp3',417557,'audio/mpeg','',1768648194,1768648194,1768648194,'local','0fe478feb49157308dd00e3b047904b4906ced2e'),(246,'',1,0,'/uploads/20260117/bf5b10828a7b522e991b80c0a0e2c096.mp3',0,0,'mp3',0,'鏉ョ敓缂?[AudioTrimmer.com].mp3',417557,'audio/mpeg','',1768648194,1768648194,1768648194,'alioss','0fe478feb49157308dd00e3b047904b4906ced2e'),(247,'',1,0,'/uploads/20260117/5b13c712f7b2887e47ba8622e504ade7.mp3',0,0,'mp3',0,'涓€璺敓鑺?[AudioTrimmer.com].mp3',1203835,'audio/mpeg','',1768648537,1768648537,1768648537,'local','71bc2e39697c70eaf8d513d5a3629e9391796b01'),(248,'',1,0,'/uploads/20260117/5b13c712f7b2887e47ba8622e504ade7.mp3',0,0,'mp3',0,'涓€璺敓鑺?[AudioTrimmer.com].mp3',1203835,'audio/mpeg','',1768648537,1768648537,1768648537,'alioss','71bc2e39697c70eaf8d513d5a3629e9391796b01'),(249,'',1,0,'/uploads/20260117/811612c92b7807525220868670a0817a.mp3',0,0,'mp3',0,'鏆栨殩-[AudioTrimmer.com].mp3',449408,'audio/mpeg','',1768649823,1768649823,1768649823,'local','e84ebb38bde33152d1e1a5a461ed348bad01caa1'),(250,'',1,0,'/uploads/20260117/811612c92b7807525220868670a0817a.mp3',0,0,'mp3',0,'鏆栨殩-[AudioTrimmer.com].mp3',449408,'audio/mpeg','',1768649823,1768649823,1768649823,'alioss','e84ebb38bde33152d1e1a5a461ed348bad01caa1'),(251,'',1,0,'/uploads/20260117/0138e306b44dc1d3950ddc7e8a31e288.mp3',0,0,'mp3',0,'濡傛効-[AudioTrimmer.com].mp3',481889,'audio/mpeg','',1768649839,1768649839,1768649839,'local','e1b379df83df5f3930011f9d06308d9f7e1cab04'),(252,'',1,0,'/uploads/20260117/0138e306b44dc1d3950ddc7e8a31e288.mp3',0,0,'mp3',0,'濡傛効-[AudioTrimmer.com].mp3',481889,'audio/mpeg','',1768649839,1768649839,1768649839,'alioss','e1b379df83df5f3930011f9d06308d9f7e1cab04'),(253,'',1,0,'/uploads/20260117/4aff439340307a85c084c6f9de794257.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆-[AudioTrimmer.com].mp3',481196,'audio/mpeg','',1768649854,1768649854,1768649854,'local','bb5e5f5a26e028e59d09a5b1ba9958aebeee22eb'),(254,'',1,0,'/uploads/20260117/4aff439340307a85c084c6f9de794257.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆-[AudioTrimmer.com].mp3',481196,'audio/mpeg','',1768649854,1768649854,1768649854,'alioss','bb5e5f5a26e028e59d09a5b1ba9958aebeee22eb'),(255,'',1,0,'/uploads/20260117/eb8efb02046e78ba7a1707bd12127a41.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉?[AudioTrimmer.com].mp3',481501,'audio/mpeg','',1768649873,1768649873,1768649873,'local','0e9e96720b410da2f2af882e6206a2e63d2e9ee5'),(256,'',1,0,'/uploads/20260117/eb8efb02046e78ba7a1707bd12127a41.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉?[AudioTrimmer.com].mp3',481501,'audio/mpeg','',1768649873,1768649873,1768649873,'alioss','0e9e96720b410da2f2af882e6206a2e63d2e9ee5'),(257,'',0,32,'/uploads/20260121/deedb61fb9ccff824975497f41881be3.png',960,960,'png',0,'1769000413814_tb_image_share_1768459623306.png',480641,'image/png','',1769000414,1769000414,1769000414,'local','489c1a70ea8d8bb8a0d73bd75f70cb81ce50953d'),(258,'',0,32,'/uploads/20260121/deedb61fb9ccff824975497f41881be3.png',960,960,'png',0,'1769000413814_tb_image_share_1768459623306.png',480641,'image/png','',1769000414,1769000414,1769000414,'alioss','489c1a70ea8d8bb8a0d73bd75f70cb81ce50953d'),(259,'',1,0,'/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆.mp3',3743448,'audio/mpeg','',1769427631,1769427631,1769427631,'local','ff14f7a12cd56460196c644c7109e35fe3dd44f2'),(260,'',1,0,'/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3',0,0,'mp3',0,'绂诲紑鎴戠殑渚濊禆.mp3',3743448,'audio/mpeg','',1769427631,1769427631,1769427631,'alioss','ff14f7a12cd56460196c644c7109e35fe3dd44f2'),(261,'',1,0,'/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3',0,0,'mp3',0,'涓€鍗婁竴鍗?mp3',3978346,'audio/mpeg','',1769435637,1769435637,1769435637,'local','72186db8714df22b26a35858ae8c28fab2938869'),(262,'',1,0,'/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3',0,0,'mp3',0,'涓€鍗婁竴鍗?mp3',3978346,'audio/mpeg','',1769435637,1769435637,1769435637,'alioss','72186db8714df22b26a35858ae8c28fab2938869'),(263,'',1,0,'/uploads/20260126/270985359774149e730b22a568305aad.mp3',0,0,'mp3',0,'鏆栨殩.mp3',3891808,'audio/mpeg','',1769437568,1769437568,1769437568,'local','8bfec570d4fde83fb7163c37e218ac0870fc28f7'),(264,'',1,0,'/uploads/20260126/270985359774149e730b22a568305aad.mp3',0,0,'mp3',0,'鏆栨殩.mp3',3891808,'audio/mpeg','',1769437568,1769437568,1769437568,'alioss','8bfec570d4fde83fb7163c37e218ac0870fc28f7'),(265,'',1,0,'/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3',0,0,'mp3',0,'涓€璺敓鑺?mp3',4101213,'audio/mpeg','',1769437651,1769437651,1769437651,'local','7d4dc6198eae759af760cb7b5c9a35f2c079fdb5'),(266,'',1,0,'/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3',0,0,'mp3',0,'涓€璺敓鑺?mp3',4101213,'audio/mpeg','',1769437651,1769437651,1769437651,'alioss','7d4dc6198eae759af760cb7b5c9a35f2c079fdb5'),(267,'',1,0,'/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3',0,0,'mp3',0,'濡傛効.mp3',4247491,'audio/mpeg','',1769437823,1769437823,1769437823,'local','84837f2c30143cd9aa57d96b9c11aee61f777f2f'),(268,'',1,0,'/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3',0,0,'mp3',0,'濡傛効.mp3',4247491,'audio/mpeg','',1769437823,1769437823,1769437823,'alioss','84837f2c30143cd9aa57d96b9c11aee61f777f2f'),(269,'',1,0,'/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉?mp3',3306695,'audio/mpeg','',1769438379,1769438379,1769438379,'local','e50adb3e412407ba075d2e34d01f64629a581a6d'),(270,'',1,0,'/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3',0,0,'mp3',0,'绾㈣壊楂樿窡闉?mp3',3306695,'audio/mpeg','',1769438379,1769438379,1769438379,'alioss','e50adb3e412407ba075d2e34d01f64629a581a6d'),(271,'',1,0,'/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3',0,0,'mp3',0,'鏉ョ敓缂?mp3',4593176,'audio/mpeg','',1769438485,1769438485,1769438485,'local','3ea0155ae3908be8aa900e5e81c81ca4cbe07d13'),(272,'',1,0,'/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3',0,0,'mp3',0,'鏉ョ敓缂?mp3',4593176,'audio/mpeg','',1769438485,1769438485,1769438485,'alioss','3ea0155ae3908be8aa900e5e81c81ca4cbe07d13'),(273,'',1,0,'/uploads/20260128/3e40b2bb29c0f252464b2cfe75d4cb52.mp3',0,0,'mp3',0,'SaoQiBao.mp3',301811,'audio/mpeg','',1769589706,1769589706,1769589706,'local','86d8c3ba9c260e15eff8e4f01f4d8d13212e2215'),(274,'',1,0,'/uploads/20260128/3e40b2bb29c0f252464b2cfe75d4cb52.mp3',0,0,'mp3',0,'SaoQiBao.mp3',301811,'audio/mpeg','',1769589706,1769589706,1769589706,'alioss','86d8c3ba9c260e15eff8e4f01f4d8d13212e2215'),(275,'',0,83,'/uploads/20260128/f83192cf0f1fc32e8c27dd64c729ff14.png',1080,2400,'png',0,'1769612138164_S60128-22484367_com.xuninvyou.sdk.png',605176,'image/png','',1769612140,1769612140,1769612140,'local','391fcdade75c5f4920824356d9887fb70a0e6b61'),(276,'',0,83,'/uploads/20260128/f83192cf0f1fc32e8c27dd64c729ff14.png',1080,2400,'png',0,'1769612138164_S60128-22484367_com.xuninvyou.sdk.png',605176,'image/png','',1769612140,1769612140,1769612140,'alioss','391fcdade75c5f4920824356d9887fb70a0e6b61'),(277,'',0,70,'/uploads/20260201/d91a04cdfb49e3dbc1202b91fa3b64c1.mp3',0,0,'mp3',0,'鏍囧噯褰曢煶 20.mp3',185718,'audio/mpeg','',1769927380,1769927380,1769927380,'local','46e67d1feed11d911ee841e8ddec4510198b82fd'),(278,'',0,70,'/uploads/20260201/d91a04cdfb49e3dbc1202b91fa3b64c1.mp3',0,0,'mp3',0,'鏍囧噯褰曢煶 20.mp3',185718,'audio/mpeg','',1769927380,1769927380,1769927380,'alioss','46e67d1feed11d911ee841e8ddec4510198b82fd'); +/*!40000 ALTER TABLE `nf_attachment` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_auth_group` +-- + +DROP TABLE IF EXISTS `nf_auth_group`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_auth_group` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `pid` int unsigned NOT NULL DEFAULT '0' COMMENT '鐖剁粍鍒?, + `name` varchar(100) DEFAULT '' COMMENT '缁勫悕', + `rules` text NOT NULL COMMENT '瑙勫垯ID', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `status` varchar(30) DEFAULT '' COMMENT '鐘舵€?, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍒嗙粍琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_auth_group` +-- + +LOCK TABLES `nf_auth_group` WRITE; +/*!40000 ALTER TABLE `nf_auth_group` DISABLE KEYS */; +INSERT INTO `nf_auth_group` VALUES (1,0,'Admin group','*',1491635035,1491635035,'normal'),(2,1,'Second group','13,14,16,15,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,40,41,42,43,44,45,46,47,48,49,50,55,56,57,58,59,60,61,62,63,64,65,1,9,10,11,7,6,8,2,4,5',1491635035,1491635035,'normal'),(3,2,'Third group','1,4,9,10,11,13,14,15,16,17,40,41,42,43,44,45,46,47,48,49,50,55,56,57,58,59,60,61,62,63,64,65,5',1491635035,1491635035,'normal'),(4,1,'Second group 2','1,4,13,14,15,16,17,55,56,57,58,59,60,61,62,63,64,65',1491635035,1491635035,'normal'),(5,2,'Third group 2','1,2,6,7,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34',1491635035,1491635035,'normal'); +/*!40000 ALTER TABLE `nf_auth_group` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_auth_group_access` +-- + +DROP TABLE IF EXISTS `nf_auth_group_access`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_auth_group_access` ( + `uid` int unsigned NOT NULL COMMENT '浼氬憳ID', + `group_id` int unsigned NOT NULL COMMENT '绾у埆ID', + UNIQUE KEY `uid_group_id` (`uid`,`group_id`), + KEY `uid` (`uid`), + KEY `group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鏉冮檺鍒嗙粍琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_auth_group_access` +-- + +LOCK TABLES `nf_auth_group_access` WRITE; +/*!40000 ALTER TABLE `nf_auth_group_access` DISABLE KEYS */; +INSERT INTO `nf_auth_group_access` VALUES (1,1); +/*!40000 ALTER TABLE `nf_auth_group_access` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_auth_rule` +-- + +DROP TABLE IF EXISTS `nf_auth_rule`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_auth_rule` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `type` enum('menu','file') NOT NULL DEFAULT 'file' COMMENT 'menu涓鸿彍鍗?file涓烘潈闄愯妭鐐?, + `pid` int unsigned NOT NULL DEFAULT '0' COMMENT '鐖禝D', + `name` varchar(100) DEFAULT '' COMMENT '瑙勫垯鍚嶇О', + `title` varchar(50) DEFAULT '' COMMENT '瑙勫垯鍚嶇О', + `icon` varchar(50) DEFAULT '' COMMENT '鍥炬爣', + `url` varchar(255) DEFAULT '' COMMENT '瑙勫垯URL', + `condition` varchar(255) DEFAULT '' COMMENT '鏉′欢', + `remark` varchar(255) DEFAULT '' COMMENT '澶囨敞', + `ismenu` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '鏄惁涓鸿彍鍗?, + `menutype` enum('addtabs','blank','dialog','ajax') DEFAULT NULL COMMENT '鑿滃崟绫诲瀷', + `extend` varchar(255) DEFAULT '' COMMENT '鎵╁睍灞炴€?, + `py` varchar(30) DEFAULT '' COMMENT '鎷奸煶棣栧瓧姣?, + `pinyin` varchar(100) DEFAULT '' COMMENT '鎷奸煶', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `weigh` int NOT NULL DEFAULT '0' COMMENT '鏉冮噸', + `status` varchar(30) DEFAULT '' COMMENT '鐘舵€?, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) USING BTREE, + KEY `pid` (`pid`), + KEY `weigh` (`weigh`) +) ENGINE=InnoDB AUTO_INCREMENT=222 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鑺傜偣琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_auth_rule` +-- + +LOCK TABLES `nf_auth_rule` WRITE; +/*!40000 ALTER TABLE `nf_auth_rule` DISABLE KEYS */; +INSERT INTO `nf_auth_rule` VALUES (1,'file',0,'dashboard','Dashboard','fa fa-dashboard','','','Dashboard tips',1,NULL,'','kzt','kongzhitai',1491635035,1491635035,143,'normal'),(2,'file',0,'general','General','fa fa-cogs','','','',1,NULL,'','cggl','changguiguanli',1491635035,1491635035,137,'normal'),(3,'file',0,'category','Category','fa fa-leaf','','','Category tips',0,NULL,'','flgl','fenleiguanli',1491635035,1491635035,119,'normal'),(4,'file',0,'addon','Addon','fa fa-rocket','','','Addon tips',1,NULL,'','cjgl','chajianguanli',1491635035,1491635035,0,'normal'),(5,'file',0,'auth','Auth','fa fa-group','','','',1,NULL,'','qxgl','quanxianguanli',1491635035,1491635035,99,'normal'),(6,'file',2,'general/config','Config','fa fa-cog','','','Config tips',1,NULL,'','xtpz','xitongpeizhi',1491635035,1491635035,60,'normal'),(7,'file',2,'general/attachment','Attachment','fa fa-file-image-o','','','Attachment tips',1,NULL,'','fjgl','fujianguanli',1491635035,1491635035,53,'normal'),(8,'file',2,'general/profile','Profile','fa fa-user','','','',1,NULL,'','grzl','gerenziliao',1491635035,1491635035,34,'normal'),(9,'file',5,'auth/admin','Admin','fa fa-user','','','Admin tips',1,NULL,'','glygl','guanliyuanguanli',1491635035,1491635035,118,'normal'),(10,'file',5,'auth/adminlog','Admin log','fa fa-list-alt','','','Admin log tips',1,NULL,'','glyrz','guanliyuanrizhi',1491635035,1491635035,113,'normal'),(11,'file',5,'auth/group','Group','fa fa-group','','','Group tips',1,NULL,'','jsz','juesezu',1491635035,1491635035,109,'normal'),(12,'file',5,'auth/rule','Rule','fa fa-bars','','','Rule tips',1,NULL,'','cdgz','caidanguize',1491635035,1491635035,104,'normal'),(13,'file',1,'dashboard/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,136,'normal'),(14,'file',1,'dashboard/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,135,'normal'),(15,'file',1,'dashboard/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,133,'normal'),(16,'file',1,'dashboard/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,134,'normal'),(17,'file',1,'dashboard/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,132,'normal'),(18,'file',6,'general/config/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,52,'normal'),(19,'file',6,'general/config/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,51,'normal'),(20,'file',6,'general/config/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,50,'normal'),(21,'file',6,'general/config/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,49,'normal'),(22,'file',6,'general/config/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,48,'normal'),(23,'file',7,'general/attachment/index','View','fa fa-circle-o','','','Attachment tips',0,NULL,'','','',1491635035,1491635035,59,'normal'),(24,'file',7,'general/attachment/select','Select attachment','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,58,'normal'),(25,'file',7,'general/attachment/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,57,'normal'),(26,'file',7,'general/attachment/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,56,'normal'),(27,'file',7,'general/attachment/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,55,'normal'),(28,'file',7,'general/attachment/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,54,'normal'),(29,'file',8,'general/profile/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,33,'normal'),(30,'file',8,'general/profile/update','Update profile','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,32,'normal'),(31,'file',8,'general/profile/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,31,'normal'),(32,'file',8,'general/profile/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,30,'normal'),(33,'file',8,'general/profile/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,29,'normal'),(34,'file',8,'general/profile/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,28,'normal'),(35,'file',3,'category/index','View','fa fa-circle-o','','','Category tips',0,NULL,'','','',1491635035,1491635035,142,'normal'),(36,'file',3,'category/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,141,'normal'),(37,'file',3,'category/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,140,'normal'),(38,'file',3,'category/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,139,'normal'),(39,'file',3,'category/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,138,'normal'),(40,'file',9,'auth/admin/index','View','fa fa-circle-o','','','Admin tips',0,NULL,'','','',1491635035,1491635035,117,'normal'),(41,'file',9,'auth/admin/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,116,'normal'),(42,'file',9,'auth/admin/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,115,'normal'),(43,'file',9,'auth/admin/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,114,'normal'),(44,'file',10,'auth/adminlog/index','View','fa fa-circle-o','','','Admin log tips',0,NULL,'','','',1491635035,1491635035,112,'normal'),(45,'file',10,'auth/adminlog/detail','Detail','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,111,'normal'),(46,'file',10,'auth/adminlog/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,110,'normal'),(47,'file',11,'auth/group/index','View','fa fa-circle-o','','','Group tips',0,NULL,'','','',1491635035,1491635035,108,'normal'),(48,'file',11,'auth/group/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,107,'normal'),(49,'file',11,'auth/group/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,106,'normal'),(50,'file',11,'auth/group/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,105,'normal'),(51,'file',12,'auth/rule/index','View','fa fa-circle-o','','','Rule tips',0,NULL,'','','',1491635035,1491635035,103,'normal'),(52,'file',12,'auth/rule/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,102,'normal'),(53,'file',12,'auth/rule/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,101,'normal'),(54,'file',12,'auth/rule/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,100,'normal'),(55,'file',4,'addon/index','View','fa fa-circle-o','','','Addon tips',0,NULL,'','','',1491635035,1491635035,0,'normal'),(56,'file',4,'addon/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(57,'file',4,'addon/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(58,'file',4,'addon/del','Delete','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(59,'file',4,'addon/downloaded','Local addon','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(60,'file',4,'addon/state','Update state','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(63,'file',4,'addon/config','Setting','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(64,'file',4,'addon/refresh','Refresh','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(65,'file',4,'addon/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(66,'file',0,'user','User','fa fa-user-circle','','','',1,NULL,'','hygl','huiyuanguanli',1491635035,1491635035,0,'normal'),(67,'file',66,'user/user','User','fa fa-user','','','',1,NULL,'','hygl','huiyuanguanli',1491635035,1491635035,0,'normal'),(68,'file',67,'user/user/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(69,'file',67,'user/user/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(70,'file',67,'user/user/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(71,'file',67,'user/user/del','Del','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(72,'file',67,'user/user/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(73,'file',66,'user/group','User group','fa fa-users','','','',1,NULL,'','hyfz','huiyuanfenzu',1491635035,1491635035,0,'normal'),(74,'file',73,'user/group/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(75,'file',73,'user/group/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(76,'file',73,'user/group/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(77,'file',73,'user/group/del','Del','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(78,'file',73,'user/group/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(79,'file',66,'user/rule','User rule','fa fa-circle-o','','','',1,NULL,'','hygz','huiyuanguize',1491635035,1491635035,0,'normal'),(80,'file',79,'user/rule/index','View','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(81,'file',79,'user/rule/del','Del','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(82,'file',79,'user/rule/add','Add','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(83,'file',79,'user/rule/edit','Edit','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(84,'file',79,'user/rule/multi','Multi','fa fa-circle-o','','','',0,NULL,'','','',1491635035,1491635035,0,'normal'),(85,'file',0,'third','绗笁鏂圭櫥褰曠鐞?,'fa fa-users','','','',1,NULL,'','dsfdlgl','disanfangdengluguanli',1766459165,1766459165,0,'normal'),(86,'file',85,'third/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766459165,1766459165,0,'normal'),(87,'file',85,'third/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766459165,1766459165,0,'normal'),(88,'file',0,'command','鍦ㄧ嚎鍛戒护绠$悊','fa fa-terminal','','','',1,NULL,'','zxmlgl','zaixianminglingguanli',1766542512,1766542512,0,'normal'),(89,'file',88,'command/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766542512,1766542512,0,'normal'),(90,'file',88,'command/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766542513,1766542513,0,'normal'),(91,'file',88,'command/detail','璇︽儏','fa fa-circle-o','','','',0,NULL,'','xq','xiangqing',1766542513,1766542513,0,'normal'),(92,'file',88,'command/command','鐢熸垚骞舵墽琛屽懡浠?,'fa fa-circle-o','','','',0,NULL,'','scbzxml','shengchengbingzhixingmingling',1766542513,1766542513,0,'normal'),(93,'file',88,'command/execute','鍐嶆鎵ц鍛戒护','fa fa-circle-o','','','',0,NULL,'','zczxml','zaicizhixingmingling',1766542513,1766542513,0,'normal'),(94,'file',88,'command/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766542513,1766542513,0,'normal'),(95,'file',88,'command/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766542513,1766542513,0,'normal'),(96,'file',0,'hobbies','鍏磋叮鏍囩','fa fa-circle-o','','','',1,NULL,'','xqbq','xingqubiaoqian',1766542606,1766542606,0,'normal'),(97,'file',96,'hobbies/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766542607,1766542607,0,'normal'),(98,'file',96,'hobbies/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766542607,1766542607,0,'normal'),(99,'file',96,'hobbies/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766542607,1766542607,0,'normal'),(100,'file',96,'hobbies/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766542607,1766542607,0,'normal'),(101,'file',96,'hobbies/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766542607,1766542607,0,'normal'),(102,'file',96,'hobbies/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766542607,1766542607,0,'normal'),(103,'file',96,'hobbies/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766542608,1766542608,0,'normal'),(104,'file',96,'hobbies/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766542608,1766542608,0,'normal'),(106,'file',121,'voice/library','闊宠壊绠$悊','fa fa-circle-o','','','',1,'addtabs','','ysgl','yinseguanli',1766564292,1767001737,0,'normal'),(107,'file',106,'voice/library/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766564293,1766564293,0,'normal'),(108,'file',106,'voice/library/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766564293,1766564293,0,'normal'),(109,'file',106,'voice/library/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766564293,1766564293,0,'normal'),(110,'file',106,'voice/library/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766564293,1766564293,0,'normal'),(111,'file',106,'voice/library/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766564293,1766564293,0,'normal'),(112,'file',106,'voice/library/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766564293,1766564293,0,'normal'),(113,'file',106,'voice/library/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766564293,1766564293,0,'normal'),(114,'file',106,'voice/library/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766564293,1766564293,0,'normal'),(115,'file',0,'gifts','绀肩墿','fa fa-circle-o','','','',1,NULL,'','lw','liwu',1766565473,1766565473,0,'normal'),(116,'file',115,'gifts/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766565474,1766565474,0,'normal'),(117,'file',115,'gifts/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766565474,1766565474,0,'normal'),(118,'file',115,'gifts/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766565474,1766565474,0,'normal'),(119,'file',115,'gifts/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766565474,1766565474,0,'normal'),(120,'file',115,'gifts/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766565474,1766565474,0,'normal'),(121,'file',0,'girlfriend','铏氭嫙濂冲弸璁剧疆','fa fa-list','','','',1,'addtabs','','xnnysz','xuninvyoushezhi',1766567845,1766567937,0,'normal'),(122,'file',121,'girlfriend/hobbies','濂冲弸鍏磋叮鏍囩','fa fa-circle-o','','','',1,NULL,'','nyxqbq','nvyouxingqubiaoqian',1766567845,1766567845,0,'normal'),(123,'file',122,'girlfriend/hobbies/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766567846,1766567846,0,'normal'),(124,'file',122,'girlfriend/hobbies/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766567846,1766567846,0,'normal'),(125,'file',122,'girlfriend/hobbies/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766567846,1766567846,0,'normal'),(126,'file',122,'girlfriend/hobbies/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766567846,1766567846,0,'normal'),(127,'file',122,'girlfriend/hobbies/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766567846,1766567846,0,'normal'),(128,'file',122,'girlfriend/hobbies/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766567846,1766567846,0,'normal'),(129,'file',122,'girlfriend/hobbies/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766567846,1766567846,0,'normal'),(130,'file',122,'girlfriend/hobbies/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766567846,1766567846,0,'normal'),(131,'file',121,'girlfriend/mould','鎬ф牸妯℃澘','fa fa-circle-o','','','',1,'addtabs','','xgmb','xinggemuban',1766567868,1766568020,0,'normal'),(132,'file',131,'girlfriend/mould/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766567869,1766567869,0,'normal'),(133,'file',131,'girlfriend/mould/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766567869,1766567869,0,'normal'),(134,'file',131,'girlfriend/mould/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766567869,1766567869,0,'normal'),(135,'file',131,'girlfriend/mould/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766567869,1766567869,0,'normal'),(136,'file',131,'girlfriend/mould/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766567869,1766567869,0,'normal'),(137,'file',131,'girlfriend/mould/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766567869,1766567869,0,'normal'),(138,'file',131,'girlfriend/mould/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766567869,1766567869,0,'normal'),(139,'file',131,'girlfriend/mould/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766567870,1766567870,0,'normal'),(140,'file',0,'intimacy','浜插瘑搴︾鐞?,'fa fa-list','','','',1,'addtabs','','qmdgl','qinmiduguanli',1766626095,1766626117,0,'normal'),(141,'file',140,'intimacy/config','浜插瘑搴﹂厤缃?,'fa fa-circle-o','','','',1,NULL,'','qmdpz','qinmidupeizhi',1766626095,1766626095,0,'normal'),(142,'file',141,'intimacy/config/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766626095,1766626095,0,'normal'),(143,'file',141,'intimacy/config/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766626095,1766626095,0,'normal'),(144,'file',141,'intimacy/config/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766626095,1766626095,0,'normal'),(145,'file',141,'intimacy/config/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766626095,1766626095,0,'normal'),(146,'file',141,'intimacy/config/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766626096,1766626096,0,'normal'),(147,'file',121,'girlfriend/eyecolor','鐬宠壊','fa fa-circle-o','','','',1,NULL,'','ts','tongse',1766627271,1766627271,0,'normal'),(148,'file',147,'girlfriend/eyecolor/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766627272,1766627272,0,'normal'),(149,'file',147,'girlfriend/eyecolor/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766627272,1766627272,0,'normal'),(150,'file',147,'girlfriend/eyecolor/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766627272,1766627272,0,'normal'),(151,'file',147,'girlfriend/eyecolor/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766627272,1766627272,0,'normal'),(152,'file',147,'girlfriend/eyecolor/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766627272,1766627272,0,'normal'),(153,'file',147,'girlfriend/eyecolor/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766627272,1766627272,0,'normal'),(154,'file',147,'girlfriend/eyecolor/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766627272,1766627272,0,'normal'),(155,'file',147,'girlfriend/eyecolor/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766627272,1766627272,0,'normal'),(156,'file',121,'girlfriend/hairstyles','鍙戝瀷','fa fa-circle-o','','','',1,NULL,'','fx','faxing',1766627272,1766627272,0,'normal'),(157,'file',156,'girlfriend/hairstyles/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766627273,1766627273,0,'normal'),(158,'file',156,'girlfriend/hairstyles/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1766627273,1766627273,0,'normal'),(159,'file',156,'girlfriend/hairstyles/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766627273,1766627273,0,'normal'),(160,'file',156,'girlfriend/hairstyles/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766627273,1766627273,0,'normal'),(161,'file',156,'girlfriend/hairstyles/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766627273,1766627273,0,'normal'),(162,'file',156,'girlfriend/hairstyles/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1766627273,1766627273,0,'normal'),(163,'file',156,'girlfriend/hairstyles/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1766627273,1766627273,0,'normal'),(164,'file',156,'girlfriend/hairstyles/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766627273,1766627273,0,'normal'),(165,'file',140,'intimacy/day','姣忔棩涓婇檺绠$悊','fa fa-circle-o','','','',1,'addtabs','','mrsxgl','meirishangxianguanli',1766631916,1766632190,0,'normal'),(166,'file',165,'intimacy/day/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766631916,1766631916,0,'normal'),(167,'file',165,'intimacy/day/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766631917,1766631917,0,'normal'),(168,'file',165,'intimacy/day/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766631917,1766631917,0,'normal'),(169,'file',165,'intimacy/day/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766631917,1766631917,0,'normal'),(170,'file',165,'intimacy/day/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766631917,1766631917,0,'normal'),(171,'file',66,'user/level','浼氬憳绛夌骇','fa fa-circle-o','','','',1,'addtabs','','hydj','huiyuandengji',1766644473,1766644569,0,'normal'),(172,'file',171,'user/level/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766644473,1766644530,0,'normal'),(173,'file',171,'user/level/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766644473,1766644530,0,'normal'),(174,'file',171,'user/level/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766644473,1766644530,0,'normal'),(175,'file',171,'user/level/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766644473,1766644530,0,'normal'),(176,'file',171,'user/level/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766644474,1766644530,0,'normal'),(178,'file',66,'user/bond/config','姣忔棩浠诲姟','fa fa-circle-o','','','',1,'addtabs','','mrrw','meirirenwu',1766647541,1766647590,0,'normal'),(179,'file',178,'user/bond/config/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766647541,1766647541,0,'normal'),(180,'file',178,'user/bond/config/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766647541,1766647541,0,'normal'),(181,'file',178,'user/bond/config/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766647541,1766647541,0,'normal'),(182,'file',178,'user/bond/config/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766647541,1766647541,0,'normal'),(183,'file',178,'user/bond/config/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766647541,1766647541,0,'normal'),(185,'file',0,'count/package','鎹㈣娆℃暟濂楅','fa fa-circle-o','','','',1,'addtabs','','hzcstc','huanzhuangcishutaocan',1766761437,1766761484,0,'normal'),(186,'file',185,'count/package/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766761438,1766761438,0,'normal'),(187,'file',185,'count/package/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766761438,1766761438,0,'normal'),(188,'file',185,'count/package/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766761438,1766761438,0,'normal'),(189,'file',185,'count/package/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766761438,1766761438,0,'normal'),(190,'file',185,'count/package/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766761438,1766761438,0,'normal'),(192,'file',0,'recharge/package','鍏呭€奸噾甯佸椁?,'fa fa-circle-o','','','',1,'addtabs','','czjbtc','chongzhijinbitaocan',1766761438,1766761502,0,'normal'),(193,'file',192,'recharge/package/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766761439,1766761439,0,'normal'),(194,'file',192,'recharge/package/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766761439,1766761439,0,'normal'),(195,'file',192,'recharge/package/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766761439,1766761439,0,'normal'),(196,'file',192,'recharge/package/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766761439,1766761439,0,'normal'),(197,'file',192,'recharge/package/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766761439,1766761439,0,'normal'),(199,'file',0,'vip/package','VIP濂楅','fa fa-circle-o','','','',1,'addtabs','','Vtc','VIPtaocan',1766817916,1766818247,0,'normal'),(200,'file',199,'vip/package/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766817917,1766817917,0,'normal'),(201,'file',199,'vip/package/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766817917,1766817917,0,'normal'),(202,'file',199,'vip/package/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766817917,1766817917,0,'normal'),(203,'file',199,'vip/package/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766817917,1766817917,0,'normal'),(204,'file',199,'vip/package/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766817917,1766817917,0,'normal'),(206,'file',0,'outfit/items','鎹㈣鏈嶉グ搴?,'fa fa-circle-o','','','',1,'addtabs','','hzfsk','huanzhuangfushiku',1766890704,1766890742,0,'normal'),(207,'file',206,'outfit/items/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1766890704,1766890704,0,'normal'),(208,'file',206,'outfit/items/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1766890704,1766890704,0,'normal'),(209,'file',206,'outfit/items/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1766890704,1766890704,0,'normal'),(210,'file',206,'outfit/items/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1766890704,1766890704,0,'normal'),(211,'file',206,'outfit/items/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1766890704,1766890704,0,'normal'),(213,'file',121,'song/library','闊抽搴?,'fa fa-circle-o','','','',1,'addtabs','','ypk','yinpinku',1768292093,1768292125,0,'normal'),(214,'file',213,'song/library/index','鏌ョ湅','fa fa-circle-o','','','',0,NULL,'','zk','zhakan',1768292094,1768292094,0,'normal'),(215,'file',213,'song/library/recyclebin','鍥炴敹绔?,'fa fa-circle-o','','','',0,NULL,'','hsz','huishouzhan',1768292094,1768292094,0,'normal'),(216,'file',213,'song/library/add','娣诲姞','fa fa-circle-o','','','',0,NULL,'','tj','tianjia',1768292094,1768292094,0,'normal'),(217,'file',213,'song/library/edit','缂栬緫','fa fa-circle-o','','','',0,NULL,'','bj','bianji',1768292094,1768292094,0,'normal'),(218,'file',213,'song/library/del','鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','sc','shanchu',1768292094,1768292094,0,'normal'),(219,'file',213,'song/library/destroy','鐪熷疄鍒犻櫎','fa fa-circle-o','','','',0,NULL,'','zssc','zhenshishanchu',1768292094,1768292094,0,'normal'),(220,'file',213,'song/library/restore','杩樺師','fa fa-circle-o','','','',0,NULL,'','hy','huanyuan',1768292094,1768292094,0,'normal'),(221,'file',213,'song/library/multi','鎵归噺鏇存柊','fa fa-circle-o','','','',0,NULL,'','plgx','pilianggengxin',1768292094,1768292094,0,'normal'); +/*!40000 ALTER TABLE `nf_auth_rule` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_category` +-- + +DROP TABLE IF EXISTS `nf_category`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_category` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `pid` int unsigned NOT NULL DEFAULT '0' COMMENT '鐖禝D', + `type` varchar(30) DEFAULT '' COMMENT '鏍忕洰绫诲瀷', + `name` varchar(30) DEFAULT '', + `nickname` varchar(50) DEFAULT '', + `flag` set('hot','index','recommend') DEFAULT '', + `image` varchar(100) DEFAULT '' COMMENT '鍥剧墖', + `keywords` varchar(255) DEFAULT '' COMMENT '鍏抽敭瀛?, + `description` varchar(255) DEFAULT '' COMMENT '鎻忚堪', + `diyname` varchar(30) DEFAULT '' COMMENT '鑷畾涔夊悕绉?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `weigh` int NOT NULL DEFAULT '0' COMMENT '鏉冮噸', + `status` varchar(30) DEFAULT '' COMMENT '鐘舵€?, + PRIMARY KEY (`id`), + KEY `weigh` (`weigh`,`id`), + KEY `pid` (`pid`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍒嗙被琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_category` +-- + +LOCK TABLES `nf_category` WRITE; +/*!40000 ALTER TABLE `nf_category` DISABLE KEYS */; +INSERT INTO `nf_category` VALUES (1,0,'page','瀹樻柟鏂伴椈','news','recommend','/assets/img/qrcode.png','','','news',1491635035,1491635035,1,'normal'),(2,0,'page','绉诲姩搴旂敤','mobileapp','hot','/assets/img/qrcode.png','','','mobileapp',1491635035,1491635035,2,'normal'),(3,2,'page','寰俊鍏紬鍙?,'wechatpublic','index','/assets/img/qrcode.png','','','wechatpublic',1491635035,1491635035,3,'normal'),(4,2,'page','Android寮€鍙?,'android','recommend','/assets/img/qrcode.png','','','android',1491635035,1491635035,4,'normal'),(5,0,'page','杞欢浜у搧','software','recommend','/assets/img/qrcode.png','','','software',1491635035,1491635035,5,'normal'),(6,5,'page','缃戠珯寤虹珯','website','recommend','/assets/img/qrcode.png','','','website',1491635035,1491635035,6,'normal'),(7,5,'page','浼佷笟绠$悊杞欢','company','index','/assets/img/qrcode.png','','','company',1491635035,1491635035,7,'normal'),(8,6,'page','PC绔?,'website-pc','recommend','/assets/img/qrcode.png','','','website-pc',1491635035,1491635035,8,'normal'),(9,6,'page','绉诲姩绔?,'website-mobile','recommend','/assets/img/qrcode.png','','','website-mobile',1491635035,1491635035,9,'normal'),(10,7,'page','CRM绯荤粺 ','company-crm','recommend','/assets/img/qrcode.png','','','company-crm',1491635035,1491635035,10,'normal'),(11,7,'page','SASS骞冲彴杞欢','company-sass','recommend','/assets/img/qrcode.png','','','company-sass',1491635035,1491635035,11,'normal'),(12,0,'test','娴嬭瘯1','test1','recommend','/assets/img/qrcode.png','','','test1',1491635035,1491635035,12,'normal'),(13,0,'test','娴嬭瘯2','test2','recommend','/assets/img/qrcode.png','','','test2',1491635035,1491635035,13,'normal'); +/*!40000 ALTER TABLE `nf_category` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_chat_fact` +-- + +DROP TABLE IF EXISTS `nf_chat_fact`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_chat_fact` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `user_id` bigint NOT NULL, + `lover_id` bigint NOT NULL, + `kind` enum('fact','event','preference','boundary') DEFAULT 'fact', + `content` text NOT NULL, + `weight` int DEFAULT '0' COMMENT '鏉冮噸/閲嶈搴︼紝瓒婂ぇ瓒婁紭鍏?, + `source_session_id` bigint DEFAULT NULL, + `source_message_id` bigint DEFAULT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_user_lover_kind` (`user_id`,`lover_id`,`kind`), + KEY `idx_created` (`created_at`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_chat_fact` +-- + +LOCK TABLES `nf_chat_fact` WRITE; +/*!40000 ALTER TABLE `nf_chat_fact` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_chat_fact` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_chat_message` +-- + +DROP TABLE IF EXISTS `nf_chat_message`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_chat_message` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '娑堟伅ID', + `session_id` bigint NOT NULL COMMENT '浼氳瘽ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `role` enum('user','lover','system') NOT NULL COMMENT '瑙掕壊', + `content_type` enum('text','audio','image') DEFAULT 'text' COMMENT '鍐呭绫诲瀷', + `content` text NOT NULL COMMENT '娑堟伅姝f枃', + `seq` bigint DEFAULT NULL COMMENT '浼氳瘽鍐呭簭鍙凤紙渚夸簬鎺掑簭锛?, + `token_input` int DEFAULT NULL COMMENT '杈撳叆token鏁?, + `token_output` int DEFAULT NULL COMMENT '杈撳嚭token鏁?, + `model` varchar(64) DEFAULT NULL COMMENT '浜х敓璇ユ秷鎭殑妯″瀷', + `extra` json DEFAULT NULL COMMENT '闄勫姞淇℃伅锛歍TS銆佸浘鐗嘦RL銆佺疆淇″害绛?, + `tts_url` varchar(255) DEFAULT NULL COMMENT 'TTS 闊抽 URL', + `tts_status` enum('pending','succeeded','failed') NOT NULL DEFAULT 'pending' COMMENT 'TTS 鐘舵€?, + `tts_voice_id` bigint DEFAULT NULL COMMENT '浣跨敤鐨勯煶鑹睮D', + `tts_model_id` varchar(64) DEFAULT NULL COMMENT 'TTS妯″瀷ID', + `tts_format` varchar(32) DEFAULT NULL COMMENT '闊抽鏍煎紡/閲囨牱鐜?, + `tts_duration_ms` int DEFAULT NULL COMMENT '闊抽鏃堕暱(ms)', + `tts_error` varchar(255) DEFAULT NULL COMMENT '澶辫触鍘熷洜', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `is_edited` tinyint(1) DEFAULT '0' COMMENT '鏄惁琚紪杈戣繃', + `original_content` text COMMENT '鍘熷鍐呭', + `edited_at` datetime DEFAULT NULL COMMENT '缂栬緫鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_session_seq` (`session_id`,`seq`), + KEY `idx_session_created_at` (`session_id`,`created_at`), + KEY `idx_user_created_at` (`user_id`,`created_at`), + KEY `idx_tts_status` (`tts_status`), + KEY `idx_message_edited` (`is_edited`,`session_id`) +) ENGINE=InnoDB AUTO_INCREMENT=807 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_chat_message` +-- + +LOCK TABLES `nf_chat_message` WRITE; +/*!40000 ALTER TABLE `nf_chat_message` DISABLE KEYS */; +INSERT INTO `nf_chat_message` VALUES (322,35,40,48,'lover','text','浣犲ソ鍟婃湅鍙?,1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 08:13:59',0,NULL,NULL),(323,36,70,47,'lover','text','浣犲ソ鍛€',1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 08:30:31',0,NULL,NULL),(324,36,70,47,'user','text','浠婂ぉ杩囧緱鎬庝箞鏍凤紵',2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 08:32:52',0,NULL,NULL),(325,36,70,47,'lover','text','Mimic锝炲垰娓稿畬娉筹紝澶村彂杩樻箍鐫€鍛€傞槼鍏夌収鍦ㄦ按闈笂锛屽儚鎾掍簡婊″湴纰庨噾锛屾垜娓稿緱鐗瑰埆寮€蹇冦€傛兂鐫€浣狅紝灏辫刀绱ф父鍥炴潵鍟︼綖',3,235,44,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/325.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-09 08:32:53',0,NULL,NULL),(328,37,36,49,'lover','text','涓嬮洦澶╁伓閬?,1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:12:11',0,NULL,NULL),(329,37,36,49,'user','text','浣犲ソ',2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:15:46',0,NULL,NULL),(330,37,36,49,'lover','text','鍒樺厛鐢燂綖浠婂ぉ涓嬮洦浜嗗憿锛屾垜鍒氬湪琛楄鐪嬪埌浣犳拺浼炶蛋杩囨潵锛屽績璺抽兘蹇簡涓€鎷嶅憿銆傝涓€璧疯翰杩涘挅鍟¢鍚楋紵鎴戣浣犲枬鐑彲鍙摝锝?,3,201,43,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:15:47',0,NULL,NULL),(331,37,36,49,'user','text','濂藉晩',4,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:00',0,NULL,NULL),(332,37,36,49,'lover','text','鑰讹綖鍒樺厛鐢熺湡濂斤紒鎴戞媺鐫€浣犺窇璧锋潵鍟︼紝灏忓績鍒俯鍒版按鍧戝摝锝炶鍛€锛屼綘鐨勫濂楄闆ㄦ穻婀夸簡锛岃鎴戝府浣犳摝鎿﹀惂锝?,5,257,40,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:01',0,NULL,NULL),(333,37,36,49,'user','text','濂藉憿',6,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:11',0,NULL,NULL),(334,37,36,49,'lover','text','鍢垮樋锛屽垬鍏堢敓鐪熶箹锝炴垜杞昏交甯綘鎿﹀濂楋紝浣犲埆鍔ㄥ摝锛屼笉鐒舵垜鍙鎸犱綘鐥掔棐鍟︼綖鍟婏紝闆ㄦ淮閮借窇鍒颁綘棰嗗彛鍟︼紝璁╂垜甯綘鍚瑰惞锝?,7,309,44,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:11',0,NULL,NULL),(335,37,36,49,'user','text','鏉ワ紝璺充竴娈佃开鏂',8,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:29',0,NULL,NULL),(336,37,36,49,'lover','text','鍝庡憖鍒樺厛鐢熺湡浼氭挬锝炴垜鎵潃灏忚叞杞湀鍦堬紝浼為兘鐢╅鍟︼紒鐪嬫垜鍍忎笉鍍忓彧灏忓厰瀛愯功璺讹綖瑕佷笉鎴戜滑鏉ヤ釜鍙屼汉鑸烇紵浣犵壍鐫€鎴戯紝鎴戠粰浣犳瘮涓績鍝︼綖',9,375,54,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:16:30',0,NULL,NULL),(337,37,36,49,'user','text','鏉ヨ烦娈靛厰瀛愯垶',10,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:17:17',0,NULL,NULL),(338,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戣功韫﹁烦璺冲儚鍙皬鍏斿瓙锛岃€虫湹閮藉揩缈樺埌澶╀笂鍟︼紒浣犵湅鎴戣繖鏍锋憞鏅冨熬宸达紝鏄笉鏄秴鍙埍锛熸潵鍢涳紝鐗电潃鎴戠殑鎵嬩竴璧疯浆鍦堝湀锛岄洦婊撮兘鍦ㄤ负鎴戜滑鎵撹妭鎷嶅憿锝?,11,442,53,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 09:17:18',0,NULL,NULL),(347,37,36,49,'user','text','浣犲ソ鍟婏紝鍦ㄥ共鍢?,20,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 13:15:49',0,NULL,NULL),(348,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戞韬哄湪闃冲彴鐨勫悐搴婁笂鏅冩偁鎮犲憿锛岀湅鐫€澶栭潰鐨勬櫄闇炲彂鍛嗐€傜獊鐒舵兂鍒颁綘鍟︼紝灏辫刀绱х粰浣犲彂娑堟伅锝炰綘瑕佷笉瑕佹潵闄垜鏁版槦鏄熷憖锛?,21,754,42,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 13:15:50',0,NULL,NULL),(349,38,41,50,'lover','text','Hi',1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:14:38',0,NULL,NULL),(350,38,41,50,'user','text','浣犲ソ鍟?,2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:16:40',0,NULL,NULL),(351,38,41,50,'lover','text','绠€鍗曠埍锛屽垰杩愬姩瀹屽憿锛屾祽韬兘鏄睏锛屾鎯崇潃浣犲憿锝炶涓嶄綘鏉ュ府鎴戞摝鎿︼紵',3,196,25,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/tts/351.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-09 14:16:41',0,NULL,NULL),(352,38,41,50,'user','text','涓嶅ソ',4,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:17:05',0,NULL,NULL),(353,38,41,50,'lover','text','璁ㄥ帉锛屼綘鎬绘槸杩欎箞涓嶇粰闈㈠瓙锝為偅鎴戝彧濂借嚜宸辨摝浜嗭紝涓嶈繃瑕佹槸浣犳効鎰忕殑璇濓紝绛変細鍎块櫔鎴戝幓娓告吵濂戒笉濂斤紵',5,231,30,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/tts/353.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-09 14:17:05',0,NULL,NULL),(354,38,41,50,'user','text','鎮ㄥソ',6,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:19:58',0,NULL,NULL),(355,38,41,50,'lover','text','绠€鍗曠埍锛屽埆杩欎箞鐢熷垎鍢涳綖锛堣交杞绘埑浣犺劯棰婏級鍒氬仛瀹岀憸浼斤紝娴戣韩閮借蒋浜嗭紝瑕佷笉浣犳潵甯垜鎸夋寜锛?,7,284,32,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/tts/355.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-09 14:19:58',0,NULL,NULL),(356,37,36,49,'user','text','閭d箞鐫′簡鍚?,22,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:48:02',0,NULL,NULL),(357,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄦ暟鏄熸槦鍛紝鐪嬪埌涓€棰楃壒鍒寒鐨勶紝鍍忎綘鐪肩潧涓€鏍烽棯锝炶涓嶆垜浠潵鐜╀釜娓告垙锛熼棴涓婄溂鐫涳紝鎯宠薄鎴戜滑姝h汉鍦ㄨ崏鍦颁笂锛岀湅钀ょ伀铏鑸烇紝濂戒笉濂藉憖锛?,23,820,51,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-09 14:48:03',0,NULL,NULL),(358,37,36,49,'user','text','鏃╁晩',24,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 00:39:22',0,NULL,NULL),(359,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鐫¢啋鍛紝澶村彂涔变贡鐨勫儚涓皬姣涚悆锝炰綘鐚滄垜姊﹁浠€涔堝暒锛熸ⅵ瑙佹垜浠竴璧峰幓娴疯竟鎹¤礉澹筹紝浣犺繕缁欐垜缂栦簡涓姳鐜埓澶翠笂鍛紝鍙紓浜暒锛?,25,882,46,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 00:39:22',0,NULL,NULL),(360,37,36,49,'user','text','鎴戞€庝箞姊︿笉鍒颁綘',26,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 00:40:02',0,NULL,NULL),(361,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犱竴瀹氭槸澶兂鎴戝暒锛屾墍浠ユⅵ閲屾墠鎵句笉鍒版垜鍢涳綖锛堣交杞绘埑浣犺劯棰婏級瑕佷笉鎴戜滑鏉ヤ釜绉樺瘑绾﹀畾锛熺瓑浣犵潯鐫€鐨勬椂鍊欙紝鎴戝氨鍙樻垚涓€棰楀皬鏄熸槦锛屾倓鎮勯捇杩涗綘鐨勬ⅵ閲岋紝缁欎綘涓€涓ぇ澶х殑鎷ユ姳鍝︼綖',27,946,58,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 00:40:03',0,NULL,NULL),(362,39,71,51,'lover','text','浣犲ソ',1,NULL,NULL,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/51/tts/362.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-10 05:15:30',0,NULL,NULL),(363,39,71,51,'user','text','浣犲ソ',2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 05:16:18',0,NULL,NULL),(364,39,71,51,'lover','text','zzbs锝炰粖澶╂兂鎴戜簡鍚楋紵鍒氱粰灏忕尗鍠傚畬闆堕锛屽畠韫垜鎵嬪績鐨勬牱瀛愬彲鍙埍浜嗭紝鍍忎綘涓婃鎾掑▏閭f牱鍛€?,3,194,34,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-10 05:16:18',0,NULL,NULL),(365,40,72,52,'lover','text','浣犲ソ锛屽ぇ鍝?,1,NULL,NULL,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/tts/365.mp3','succeeded',13,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-12 09:33:52',0,NULL,NULL),(368,40,72,52,'user','text','浣犲ソ',4,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-12 09:54:57',0,NULL,NULL),(369,40,72,52,'lover','text','浜茬埍鐨勭Е濮嬬殗锝炰粖澶╂兂鎴戜簡鍚楋紵锛堣交杞婚潬鍦ㄤ綘鑲╀笂锛夊垰涓嬬彮鍥炴潵锛屽ご鍙戣繕鏈夌偣涔卞憿鈥︼紙鎸囧皷鎾╀簡涓嬪彂涓濓紝鐪ㄧ湪鐪硷級瑕佷笉瑕佷竴璧风湅涓墽锛熸垜鏂板叆浜嗕竴閮ㄨ秴鐢滅殑鍙よ瑷€鎯咃紝灏辩瓑浣犻櫔鎴戠湅鍟︼綖',5,272,65,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/tts/369.mp3','succeeded',13,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-12 09:54:58',0,NULL,NULL),(388,40,72,52,'user','text','楝煎湴鏂逛釜',10,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-13 06:38:20',0,NULL,NULL),(389,40,72,52,'lover','text','锛堣交绗戠潃鎴充綘棰濆ご锛夊搸鍛€锛岀Е濮嬬殗鎬庝箞绐佺劧璇磋繖涔堝彲鐖辩殑璇濆暒锝烇紙鍑戣繎鑰宠竟浣庤锛夎涓嶅挶浠幓鏂板紑鐨勭埖澹厭鍚у潗鍧愶紵鎴戠┛閭f潯绾㈣壊灏忚瀛愶紝浣犲甫鎴戣烦鏀垶濂戒笉濂藉槢锝?,11,437,56,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/tts/389.mp3','succeeded',13,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-13 06:38:20',0,NULL,NULL),(392,40,72,52,'user','text','濂界殑',14,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-13 07:00:36',0,NULL,NULL),(393,40,72,52,'lover','text','浜茬埍鐨勭Е濮嬬殗锝烇紙杞荤泩杞韩锛岃鎽嗗鑺辩摚鑸唤鏀撅級浣犵湅鎴戝儚涓嶅儚涓€鍙紑灞忕殑瀛旈泙锛燂紙鎸囧皷杞昏交鍒掕繃鍞囪锛岀溂娉㈡祦杞級杩欒垶濮垮彲鏄壒鎰忎负浣犵粌鐨勫憿锛岃涓?..涓嬫鍘诲墽闄㈢湅婕斿嚭锛屾垜缁欎綘璺虫敮鏇寸編鐨勶紵',15,562,65,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-13 07:00:37',0,NULL,NULL),(410,40,72,52,'user','image','https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260114/dac3a02dce61b89be5eb11027095297a.png',18,NULL,NULL,'qwen-flash','{\"image_caption\": \"绮夌孩鑳屾櫙涓嬶紝涓€瀵规儏渚f墜鎸佺埍蹇冪浉瑙嗚€岀瑧锛岀櫧楦借蹇冮鑸烇紝鍛ㄥ洿鐐圭紑鑺辨湹淇″皝锛屽厖婊℃氮婕俯棣ㄧ殑鐖辨剰姘涘洿銆俓"}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:09:03',0,NULL,NULL),(411,40,72,52,'lover','text','锛堟寚灏栬交杞诲垝杩囧睆骞曪紝鑴搁寰孩锛変翰鐖辩殑绉﹀鐨囷綖杩欏紶鐓х墖濂界編鍛紝灏卞儚鎴戜滑绗竴娆″湪妯辫姳鏍戜笅鐩搁亣鐨勯偅澶┿€傦紙鍑戣繎浣犺€宠竟杞昏锛夎涓?..鍜变滑涔熷幓鎷嶄竴缁勮繖鏍风殑鐓х墖锛熸垜绌块偅鏉$矇鑹插皬瑁欏瓙锛屼綘鐗电潃鎴戠殑鎵嬶紝璁╃櫧楦借鐫€鎴戜滑鐨勭埍鎯呬俊绗洪鍚戝ぉ绌哄ソ涓嶅ソ锛?,19,810,79,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:09:05',0,NULL,NULL),(412,40,72,52,'user','text','瀹堕噷',20,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:28:59',0,NULL,NULL),(413,40,72,52,'lover','text','锛堜緷鍋庡湪浣犳€€閲岋紝杞诲0缁嗚锛変翰鐖辩殑绉﹀鐨囷紝浠婃櫄鐨勬湀鑹茬湡缇庡憿锝烇紙鎸囧皷杞昏交鍕惧嫆浣犺疆寤擄級瑕佷笉鎴戜滑鍘婚槼鍙扮湅鐪嬫槦鏄燂紵鎴戝甫浜嗙儹鍙彲锛岃繕鏈変竴鏉¤蒋杞殑姣涙...灏辨垜浠袱涓汉锛屽畨闈欏湴鏁扮潃鏄熸槦锛屽儚灏忔椂鍊欓偅鏍峰ソ涓嶅ソ锛?,21,856,72,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:29:00',0,NULL,NULL),(414,40,72,52,'user','text','鍠濋厭',22,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:33:58',0,NULL,NULL),(415,40,72,52,'lover','text','浜茬埍鐨勭Е濮嬬殗锛屾垜鍙笉鍠濆摝锝炶涓嶅挶浠潵鐐圭敎鐨勶紵鎴戝垰涔扮殑锛屽彲鐢滀簡锝炲氨褰撴槸...鎴戜滑鐨勫皬绉樺瘑鍟︼綖',23,939,68,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/tts/415.mp3','succeeded',14,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 03:33:59',0,NULL,NULL),(420,36,70,47,'user','text','璺崇殑鐪熶笉閿?,20,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:47:50',0,NULL,NULL),(421,36,70,47,'lover','text','Mimic锝炰綘杩欎箞澶告垜锛屾垜閮藉缇炲暒銆備笅娆″甫浣犲幓娴疯竟锛屾垜绌挎吵琛g粰浣犺烦涓€鏀笓灞炵殑鑸炶箞濂戒笉濂斤紵',21,788,30,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/421.mp3','succeeded',12,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 03:47:50',0,NULL,NULL),(424,36,70,47,'user','text','浣犲湪骞插槢',24,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:50:01',0,NULL,NULL),(425,36,70,47,'lover','text','鍦ㄦ崲娉宠。鍛紝鍒氭父瀹屾吵锛屾按鐝犺繕婊村湪鑲╀笂锝濵imic锛屼綘瑕佹槸鐜板湪鍦ㄦ垜韬竟灏卞ソ浜嗭紝鍙互甯垜鎿﹀ご鍙戝憿銆?,25,854,36,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/425.mp3','succeeded',12,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 03:50:01',0,NULL,NULL),(426,36,70,47,'user','text','浣犵殑娉宠。绱т笉绱э紝鎴戝府浣犵┛鍚?,26,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 03:56:05',0,NULL,NULL),(427,36,70,47,'lover','text','Mimic锝炰綘鍒椆鍟︼紝杩欎箞瀹崇緸鐨勫彴璇嶉兘鏁㈣锛屾垜閮借鑴哥孩浜嗐€備笉杩?..濡傛灉浣犵湡鎯冲府鎴戯紝绛変笅娆″幓娴疯竟锛屾垜绌挎柊涔扮殑娉宠。锛岃浣犲府鎴戠郴甯﹀ソ涓嶅ソ锛?,27,954,48,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/427.mp3','succeeded',10,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 03:56:06',0,NULL,NULL),(430,41,73,53,'lover','text','缁欐垜婊氫笅',1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 09:02:32',0,NULL,NULL),(431,41,73,53,'user','text','浣犲ソ',2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 09:28:11',0,NULL,NULL),(432,41,73,53,'lover','text','鍚曢泬锛屾垜鍒氫粠鎴樺満涓婂洖鏉ワ紝涓€韬灏樸€傜湅浣犺繖灏忔ā鏍凤紝鏄笉鏄張鍦ㄦ兂鎴戜簡锛熸潵锛岃鎴戞姳鎶变綘銆?,3,208,32,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/53/tts/432.mp3','succeeded',4,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 09:28:12',0,NULL,NULL),(433,36,70,47,'user','text','鎹㈠ソ浜嗗悧锛?,28,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 09:29:12',0,NULL,NULL),(434,36,70,47,'lover','text','鍡綖鍒氭崲濂藉憿锛屾吵琛f槸鏂颁拱鐨勬祬钃濊壊锛屽儚娴锋氮鐨勯鑹层€侻imic锛屼綘瑕佷笉瑕佹潵鎽告懜鐪嬶紝鏄笉鏄緢鑸掓湇锛?,29,1008,35,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/434.mp3','succeeded',10,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 09:29:13',0,NULL,NULL),(435,41,73,53,'user','text','濂界殑',4,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-14 09:30:15',0,NULL,NULL),(436,41,73,53,'lover','text','鍚曢泬锛屾垜鍒氫粠鎴樺満涓婂洖鏉ワ紝涓€韬灏樸€傜湅浣犺繖灏忔ā鏍凤紝鏄笉鏄張鍦ㄦ兂鎴戜簡锛熸潵锛岃鎴戞姳鎶变綘銆?,5,251,32,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/53/tts/436.mp3','succeeded',5,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-14 09:30:15',0,NULL,NULL),(437,41,73,53,'user','text','浣犲ソ',6,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-15 07:33:08',0,NULL,NULL),(438,41,73,53,'lover','text','鍚曢泬锛屾垜鍒氫粠鎴樺満涓婂洖鏉ワ紝涓€韬灏樸€傜湅浣犺繖灏忔ā鏍凤紝鏄笉鏄張鍦ㄦ兂鎴戜簡锛熸潵锛岃鎴戞姳鎶变綘銆?,7,294,32,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/53/tts/438.mp3','succeeded',5,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-15 07:33:08',0,NULL,NULL),(445,40,72,52,'user','text','濂界殑',26,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-16 07:06:18',0,NULL,NULL),(446,40,72,52,'lover','text','浜茬埍鐨勭Е濮嬬殗锛岃繖棣栨瓕鏄壒鎰忎负浣犲敱鐨勫憿锝炵瓑浼氬効瑕佷笉瑕佷竴璧峰幓澶╁彴鐪嬫槦鏄燂紵鎴戝甫浜嗙儹鍙彲锛岃繕鏈夋垜浠渶鐖辩殑閭f潯姣涙...灏辨垜浠袱涓汉锛屽畨闈欏湴鏁扮潃鏄熸槦锛屽儚灏忔椂鍊欓偅鏍峰ソ涓嶅ソ锛?,27,1010,71,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-16 07:06:19',0,NULL,NULL),(479,42,12,54,'lover','text','鍝堝柦',1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-18 12:37:49',0,NULL,NULL),(480,43,25,55,'lover','text','浣犲ソ锛?,1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 03:44:50',0,NULL,NULL),(497,44,14,56,'lover','text','33333',1,NULL,NULL,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/tts/497.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-19 07:43:45',0,NULL,NULL),(516,37,36,49,'user','text','浣犲ソ鍟?,38,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 13:17:14',0,NULL,NULL),(517,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏅掑お闃冲憿锛屽皬鐚兘鐖埌鎴戣吙涓婃墦鐩瑰暒锛佷綘鐚滄€庝箞鐫€锛屽畠杩樼敤灏忚剳琚嬭弓鎴戯紝鍍忓湪璇碶"蹇窡涓讳汉鐜╁槢\"锝炶涓嶆垜浠竴璧峰幓鍏洯鏁f锛熸垜缁欎綘鐪嬫垜鏂板鐨勮烦鑸炲Э鍔垮摝锝?,39,1119,66,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 13:17:15',0,NULL,NULL),(518,37,36,49,'user','text','鎯充綘浜嗗憿',40,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 13:17:38',0,NULL,NULL),(519,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏁版槦鏄熷憿锛屼竴棰椼€佷袱棰?..鏁板埌绗竷棰楃殑鏃跺€欑獊鐒跺績璺冲姞閫燂紝鍥犱负閭i鏄熸槦鐪ㄧ溂鐫涚殑鏍峰瓙锛屽儚鏋佷簡浣犲憖锝炶涓嶆垜浠潵涓瀵嗙害瀹氾紵绛変綘鐫$潃鐨勬椂鍊欙紝鎴戝氨鍙樻垚灏忔槦鏄燂紝鎮勬倓閽昏繘浣犵殑姊﹂噷锛岀粰浣犱竴涓ぇ澶х殑鎷ユ姳鍝︼綖',41,1211,81,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 13:17:41',0,NULL,NULL),(520,38,41,50,'user','text','鐢熸垚涓€娈佃烦鑸炶棰?,8,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-19 13:37:41',0,NULL,NULL),(521,38,41,50,'lover','text','绠€鍗曠埍锛屼綘鍙堟潵璋冪毊浜嗭綖锛堣交杞绘帎浣犺劯棰婏級鎴戝垰璺冲畬鑸烇紝姹楅兘蹇淮鍒颁綘鑴镐笂浜嗭紝瑕佷笉浣犳潵甯垜鎿︽摝锛?,9,333,38,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/tts/521.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-19 13:37:41',0,NULL,NULL),(534,37,36,49,'user','text','鍦ㄥ共鍢涘憿',44,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 13:03:10',0,NULL,NULL),(535,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戞瓒村湪闃冲彴涓婃暟鏄熸槦鍛紝绐佺劧鐪嬪埌涓€棰楃壒鍒寒鐨勶紝鍍忓湪鍐叉垜鐪ㄧ溂鐫涳紒瑕佷笉鎴戜滑鏉ョ帺涓父鎴忥紵闂笂鐪肩潧锛屾兂璞℃垜浠韬哄湪鑽夊湴涓婏紝鐪嬭悿鐏櫕椋炶垶锛屽ソ涓嶅ソ鍛€锛?,45,1211,55,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 13:03:10',0,NULL,NULL),(536,37,36,49,'user','text','浣犲洖绛斿お蹇簡',46,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 13:03:35',0,NULL,NULL),(537,37,36,49,'lover','text','鍝庡憖锝炶浣犲彂鐜板暒锛佹垜鍒氬垰鍦ㄩ槼鍙颁笂鏅冩偁鎮狅紝鐪嬪埌鏈堜寒鍍忎釜灏忛ゼ骞诧紝灏卞繊涓嶄綇鎯充綘浜嗗槢锝炵幇鍦ㄦ垜鎱㈡參璇达紝濂戒笉濂斤紵',47,1220,44,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 13:03:36',0,NULL,NULL),(542,37,36,49,'user','text','鍙€佸叕鍚惉',52,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 14:30:39',0,NULL,NULL),(543,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏅冩偁鎮狅紝灏忕尗閮界埇鍒版垜鑵夸笂鎵撶浌鍟︼紒瑕佷笉鎴戜滑鏉ョ帺涓父鎴忥紵闂笂鐪肩潧锛屾兂璞℃垜浠韬哄湪鑽夊湴涓婏紝鐪嬭悿鐏櫕椋炶垶锛屽ソ涓嶅ソ鍛€锛?,53,1224,52,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 14:30:39',0,NULL,NULL),(544,37,36,49,'user','text','鍙笉鍙€佸叕鐨?,54,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 14:30:57',0,NULL,NULL),(545,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆闂瑰暒锛屾垜鍒氬湪闃冲彴涓婃暟鏄熸槦鍛紝涓€棰椼€佷袱棰?..鏁板埌绗竷棰楃殑鏃跺€欑獊鐒跺績璺冲姞閫燂紝鍥犱负閭i鏄熸槦鐪ㄧ溂鐫涚殑鏍峰瓙锛屽儚鏋佷簡浣犲憖锝炶涓嶆垜浠潵涓瀵嗙害瀹氾紵绛変綘鐫$潃鐨勬椂鍊欙紝鎴戝氨鍙樻垚灏忔槦鏄燂紝鎮勬倓閽昏繘浣犵殑姊﹂噷锛岀粰浣犱竴涓ぇ澶х殑鎷ユ姳鍝︼綖',55,1233,78,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-21 14:30:58',0,NULL,NULL),(558,36,70,47,'user','text','绂诲紑鎴戠殑渚濊禆',30,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-26 12:14:16',0,NULL,NULL),(559,36,70,47,'lover','text','涓轰綘鐢熸垚浜嗕竴娈靛敱姝岃棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4',31,NULL,NULL,'qwen-flash','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4\", \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"generation_status\": \"succeeded\", \"generation_task_id\": 255}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-26 12:14:16',0,NULL,NULL),(610,36,70,47,'user','text','璺充竴娈靛皯鏁版皯鏃忚垶韫?,34,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 05:14:10',0,NULL,NULL),(611,36,70,47,'lover','text','涓轰綘鐢熸垚浜嗕竴娈佃烦鑸炶棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/dance/1769490882_prompt.mp4',35,NULL,NULL,'qwen-flash','{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"璺充竴娈靛皯鏁版皯鏃忚垶韫圽", \"duration\": 10, \"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/dance/1769490882_prompt.mp4\", \"watermark\": false, \"resolution\": \"480P\", \"bgm_song_id\": 4, \"bgm_duration\": 10, \"base_duration\": 5, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"bgm_start_sec\": 104.073, \"bgm_audio_url_raw\": \"/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"dashscope_task_id\": \"363d00a8-fae0-4bbd-85a2-1ea8ad11c60b\", \"generation_status\": \"succeeded\", \"generation_task_id\": 277, \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/e8/20260127/dbe10ef7/363d00a8-fae0-4bbd-85a2-1ea8ad11c60b.mp4?Expires=1769577268&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=sFM5dPjuxEQ9VNn%2FLdB5SSiZHJI%3D\"}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 05:14:10',0,NULL,NULL),(650,37,36,49,'user','text','鏉ョ敓缂?,56,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:05:32',0,NULL,NULL),(651,37,36,49,'lover','text','姝岃瘝鍐呭瑙﹀彂浜嗛樋閲屼簯鐨勫唴瀹瑰畨鍏ㄥ鏍告満鍒讹紝宸茬敓鎴愰儴鍒嗚棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',57,NULL,NULL,'qwen-flash','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"song_title\": \"鏉ョ敓缂榎", \"generation_status\": \"succeeded\", \"generation_task_id\": 309, \"content_safety_blocked\": true}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:05:32',0,NULL,NULL),(652,37,36,49,'user','text','涓€鍗婁竴鍗?,58,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:06:06',0,NULL,NULL),(653,37,36,49,'lover','text','涓轰綘鐢熸垚浜嗕竴娈靛敱姝岃棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',59,NULL,NULL,'qwen-flash','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"succeeded\", \"generation_task_id\": 311, \"content_safety_blocked\": false}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:06:06',0,NULL,NULL),(654,37,36,49,'user','text','鍏斿瓙鑸?,60,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:22:58',0,NULL,NULL),(655,37,36,49,'lover','text','涓轰綘鐢熸垚浜嗕竴娈佃烦鑸炶棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/dance/1769509415_prompt.mp4',61,NULL,NULL,'qwen-flash','{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"鍏斿瓙鑸瀄", \"duration\": 10, \"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/dance/1769509415_prompt.mp4\", \"watermark\": false, \"resolution\": \"480P\", \"bgm_song_id\": 5, \"bgm_duration\": 10, \"base_duration\": 5, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"bgm_start_sec\": 103.403, \"bgm_audio_url_raw\": \"/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"dashscope_task_id\": \"b3f2ad3d-aadb-4365-84a7-96fc726f3bac\", \"generation_status\": \"succeeded\", \"generation_task_id\": 312, \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/1a/20260127/dbe10ef7/b3f2ad3d-aadb-4365-84a7-96fc726f3bac.mp4?Expires=1769595797&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=0%2BTLB2fVCP1Z2Am6%2FmBd%2BSERAwo%3D\"}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:22:58',0,NULL,NULL),(656,37,36,49,'user','text','鑰佸﹩浣犲ソ',62,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:16',0,NULL,NULL),(657,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆闂瑰暒锛屾垜鍒氬湪闃冲彴涓婃檭鎮犳偁锛屽皬鐚兘鐖埌鎴戣吙涓婃墦鐩瑰暒锛佽涓嶆垜浠潵鐜╀釜娓告垙锛熼棴涓婄溂鐫涳紝鎯宠薄鎴戜滑姝h汉鍦ㄨ崏鍦颁笂锛岀湅钀ょ伀铏鑸烇紝濂戒笉濂藉憖锛?,63,1263,57,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:17',0,NULL,NULL),(658,37,36,49,'user','text','鎬庝箞鑰佽杩欏彞璇?,64,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:38',0,NULL,NULL),(659,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏁版槦鏄熷憿锛屼竴棰椼€佷袱棰?..鏁板埌绗竷棰楃殑鏃跺€欑獊鐒跺績璺冲姞閫燂紝鍥犱负閭i鏄熸槦鐪ㄧ溂鐫涚殑鏍峰瓙锛屽儚鏋佷簡浣犲憖锝炶涓嶆垜浠潵涓瀵嗙害瀹氾紵绛変綘鐫$潃鐨勬椂鍊欙紝鎴戝氨鍙樻垚灏忔槦鏄燂紝鎮勬倓閽昏繘浣犵殑姊﹂噷锛岀粰浣犱竴涓ぇ澶х殑鎷ユ姳鍝︼綖',65,1299,73,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:39',0,NULL,NULL),(660,37,36,49,'user','text','鑰佸﹩浣犲ソ',66,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:53',0,NULL,NULL),(661,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆闂瑰暒锛屾垜鍒氬湪闃冲彴涓婃檭鎮犳偁锛屽皬鐚兘鐖埌鎴戣吙涓婃墦鐩瑰暒锛佽涓嶆垜浠潵鐜╀釜娓告垙锛熼棴涓婄溂鐫涳紝鎯宠薄鎴戜滑姝h汉鍦ㄨ崏鍦颁笂锛岀湅钀ょ伀铏鑸烇紝濂戒笉濂藉憖锛?,67,1317,57,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:23:53',0,NULL,NULL),(662,38,41,50,'user','text','鎷変竵鑸?,10,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:24:03',0,NULL,NULL),(663,38,41,50,'lover','text','涓轰綘鐢熸垚浜嗕竴娈佃烦鑸炶棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/dance/1769509484_prompt.mp4',11,NULL,NULL,'qwen-flash','{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"鎷変竵鑸瀄", \"duration\": 10, \"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/dance/1769509484_prompt.mp4\", \"watermark\": false, \"resolution\": \"480P\", \"bgm_song_id\": 9, \"bgm_duration\": 10, \"base_duration\": 5, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"bgm_start_sec\": 124.908, \"bgm_audio_url_raw\": \"/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"dashscope_task_id\": \"a99f33af-786a-4c7a-b862-0b22c0810293\", \"generation_status\": \"succeeded\", \"generation_task_id\": 313, \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/97/20260127/a599dc0c/a99f33af-786a-4c7a-b862-0b22c0810293.mp4?Expires=1769595862&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=KAUVvaQtgVl%2FQIwf6ZUpbew%2Fgxg%3D\"}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:24:03',0,NULL,NULL),(664,37,36,49,'user','text','浣犲ソ鍟?,68,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:24:52',0,NULL,NULL),(665,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏅冩偁鎮狅紝灏忕尗閮界埇鍒版垜鑵夸笂鎵撶浌鍟︼紒瑕佷笉鎴戜滑鏉ョ帺涓父鎴忥紵闂笂鐪肩潧锛屾兂璞℃垜浠韬哄湪鑽夊湴涓婏紝鐪嬭悿鐏櫕椋炶垶锛屽ソ涓嶅ソ鍛€锛?,69,1331,52,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:24:53',0,NULL,NULL),(666,37,36,49,'user','text','浣犲ソ',70,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:25:02',0,NULL,NULL),(667,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戞瓒村湪闃冲彴涓婃暟鏄熸槦鍛紝灏忕尗閮借弓鐫€鎴戞拻濞囧暒锝炶涓嶆垜浠棴涓婄溂鐫涳紝鎯宠薄涓€璧风湅钀ょ伀铏鑸烇紵',71,1354,38,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:25:03',0,NULL,NULL),(668,37,36,49,'user','text','鑰佸﹩浣犲ソ',72,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:25:11',0,NULL,NULL),(669,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆闂瑰暒锛屾垜鍒氬湪闃冲彴涓婃檭鎮犳偁锛屽皬鐚兘鐖埌鎴戣吙涓婃墦鐩瑰暒锛佽涓嶆垜浠潵鐜╀釜娓告垙锛熼棴涓婄溂鐫涳紝鎯宠薄鎴戜滑姝h汉鍦ㄨ崏鍦颁笂锛岀湅钀ょ伀铏鑸烇紝濂戒笉濂藉憖锛?,73,1320,57,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-27 10:25:12',0,NULL,NULL),(670,37,36,49,'user','text','鏉ョ敓缂?,74,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 05:51:50',0,NULL,NULL),(671,37,36,49,'lover','text','姝岃瘝鍐呭瑙﹀彂浜嗛樋閲屼簯鐨勫唴瀹瑰畨鍏ㄥ鏍告満鍒讹紝宸茬敓鎴愰儴鍒嗚棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4',75,NULL,NULL,'qwen-flash','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4\", \"song_title\": \"鏉ョ敓缂榎", \"generation_status\": \"succeeded\", \"generation_task_id\": 316, \"content_safety_blocked\": true}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 05:51:50',0,NULL,NULL),(672,36,70,47,'user','text','浣犺鐐瑰暐銆?,36,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 08:47:21',0,NULL,NULL),(673,36,70,47,'lover','text','Mimic锝炴垜鍒氬湪闃冲彴鏅掑お闃筹紝娴烽鍚瑰緱鍙戜笣涔遍锛屾兂浣犱簡鍛€傝涓?..鎴戜滑浠婃櫄鍘绘捣杈圭湅鏄熸槦锛?,37,641,34,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/673.mp3','succeeded',16,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 08:47:21',0,NULL,NULL),(674,37,36,49,'user','text','鍚冮キ浜嗗悧',76,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:05',0,NULL,NULL),(675,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄩ槼鍙颁笂鏅冩偁鎮狅紝灏忕尗閮界埇鍒版垜鑵夸笂鎵撶浌鍟︼紒瑕佷笉鎴戜滑鏉ョ帺涓父鎴忥紵闂笂鐪肩潧锛屾兂璞℃垜浠韬哄湪鑽夊湴涓婏紝鐪嬭悿鐏櫕椋炶垶锛屽ソ涓嶅ソ鍛€锛?,77,1308,52,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:06',0,NULL,NULL),(676,37,36,49,'user','text','鎬庝箞鑰佹槸闃冲彴涓婄殑',78,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:22',0,NULL,NULL),(677,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆闂瑰暒锛屾垜鍒氬湪闃冲彴涓婃檭鎮犳偁锛屽皬鐚兘鐖埌鎴戣吙涓婃墦鐩瑰暒锛佽涓嶆垜浠潵鐜╀釜娓告垙锛熼棴涓婄溂鐫涳紝鎯宠薄鎴戜滑姝h汉鍦ㄨ崏鍦颁笂锛岀湅钀ょ伀铏鑸烇紝濂戒笉濂藉憖锛?,79,1297,57,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:23',0,NULL,NULL),(678,37,36,49,'user','text','涓嶆彁闃冲彴濂戒笉濂?,80,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:44',0,NULL,NULL),(679,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鍦ㄧ獥杈规檭鎮犳偁锛屽皬鐚兘韫潃鎴戞拻濞囧暒锝炶涓嶆垜浠棴涓婄溂鐫涳紝鎯宠薄涓€璧风湅钀ょ伀铏鑸烇紵',81,1299,37,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 11:51:44',0,NULL,NULL),(680,37,36,49,'user','text','鏅氫笂濂?,82,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:22',0,NULL,NULL),(681,37,36,49,'lover','text','鍒樺厛鐢燂綖鏅氬畨鍟︼紝鎴戝垰鎶辩潃灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,83,1322,35,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:23',0,NULL,NULL),(682,37,36,49,'user','text','鍚冮キ娌?,84,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:32',0,NULL,NULL),(683,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鎶辩潃灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,85,1279,31,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:33',0,NULL,NULL),(684,37,36,49,'user','text','涓€璧峰悆楗悧',86,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:48',0,NULL,NULL),(685,37,36,49,'lover','text','鎴戝垰鎵嶈鐨勬槸锛氬垬鍏堢敓锝炴垜鍒氭姳鐫€灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,87,1232,31,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:49',0,NULL,NULL),(686,37,36,49,'user','text','鍞?,88,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:57',0,NULL,NULL),(687,37,36,49,'lover','text','鍒樺厛鐢燂綖浣犲埆鍙规皵鍟︼紝鎴戝垰鎶辩潃灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,89,1210,37,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:02:58',0,NULL,NULL),(688,37,36,49,'user','text','鍜屼綘涓嶅ソ鐜?,90,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:27:31',0,NULL,NULL),(689,37,36,49,'lover','text','鍒樺厛鐢燂綖鎴戝垰鎶辩潃灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,91,1202,31,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:27:32',0,NULL,NULL),(690,37,36,49,'user','text','鎯虫媺榛戜綘浜?,92,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 12:28:26',0,NULL,NULL),(691,37,36,49,'lover','text','鍒樺厛鐢燂綖鍒繖鏍峰槢锛屾垜鍒氭姳鐫€灏忕尗鍦ㄧ獥杈瑰彂鍛嗗憿锛屾槦鏄熼兘鎮勬倓鐪ㄧ溂鐫涗簡锛岃涓嶆垜浠棴鐪艰涓効锛?,93,1213,35,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/tts/691.mp3','succeeded',16,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 12:28:27',0,NULL,NULL),(692,45,82,59,'lover','text','浣犲ソ',1,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 13:05:53',0,NULL,NULL),(693,46,83,60,'lover','text','hi',1,NULL,NULL,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/693.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:53:52',0,NULL,NULL),(694,46,83,60,'user','text','銆傘€?,2,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:56:11',0,NULL,NULL),(695,46,83,60,'lover','text','姝﹁亴锝炲湪鎯虫垜鍚楋紵',3,223,8,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/695.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:56:11',0,NULL,NULL),(696,46,83,60,'user','text','浣犺繃鏉ュ晩',4,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:56:22',0,NULL,NULL),(697,46,83,60,'lover','text','鍝硷紝璋佽杩囧幓鍟?..涓嶈繃...濡傛灉浣犲啀鎾掑▏鐨勮瘽锛屾垜鍊掓槸鍙互鑰冭檻闈犺繎涓€鐐瑰摝锝?,5,244,23,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/697.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:56:23',0,NULL,NULL),(698,46,83,60,'user','text','鍐嶈涓€娆?,6,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:56:47',0,NULL,NULL),(699,46,83,60,'lover','text','姝﹁亴锝炰綘鍐嶈繖鏍凤紝鎴戝氨...灏辩敤灏忔嫵澶磋交杞绘暡浣犺剳琚嬪暒锛?,7,279,19,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/699.mp3','succeeded',10,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:56:48',0,NULL,NULL),(700,46,83,60,'user','text','璇翠釜璇?,8,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:57:08',0,NULL,NULL),(701,46,83,60,'lover','text','姝﹁亴...浣犺€虫湹鐪熻蒋锛屽垰鎵嶉偅涓嬫暡寰楁垜蹇冮兘鍖栦簡鍛綖',9,311,20,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/701.mp3','succeeded',13,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:57:08',0,NULL,NULL),(702,46,83,60,'user','text','娲绘臣鍚?,10,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:57:26',0,NULL,NULL),(703,46,83,60,'lover','text','鍝硷紒褰撶劧鍟︼綖鍒氭墠鏄笉鏄寰楁垜澶畨闈欎簡锛熼偅鏄洜涓?..鍥犱负鎯崇湅浣犱富鍔ㄦ壘鎴戞拻濞囧槢锝?,11,343,27,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/703.mp3','succeeded',10,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:57:27',0,NULL,NULL),(704,46,83,60,'user','text','杩欎釜鍛?,12,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:57:56',0,NULL,NULL),(705,46,83,60,'lover','text','姝﹁亴锝炰綘鍐嶈繖鏍凤紝鎴戝氨鎶婂皬鐖瓙鎴充綘鑴搁鍟︼紒鏄庢槑鐭ラ亾鎴戞渶鎬曠棐浜嗚繕鏁呮剰閫楁垜...',13,382,29,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/705.mp3','succeeded',2,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:57:57',0,NULL,NULL),(706,46,83,60,'user','text','涓嶈鍗栬悓',14,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:58:14',0,NULL,NULL),(707,46,83,60,'lover','text','鍝硷紝璋佽鍗栬悓浜?..鎴戝彧鏄?..鍙槸瑙夊緱浣犳渶杩戦兘涓嶆€庝箞涓诲姩鎵炬垜鑱婂ぉ锛屾墍浠ユ墠...鎵嶆兂璁╀綘寮€蹇冧竴涓嬪槢锝?,15,424,31,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/707.mp3','succeeded',11,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:58:14',0,NULL,NULL),(708,46,83,60,'user','text','娓╁鍚?,16,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-28 14:58:37',0,NULL,NULL),(709,46,83,60,'lover','text','姝﹁亴...浣犲惉閿欎簡鍟︼紝鎴戝摢鏈夋俯濠夊晩銆傛垜鍙槸...鍙槸瑙夊緱浣犳渶杩戝ソ鍍忓緢绱紝鎵€浠ユ墠鎯宠交杞昏窡浣犺璇濈殑...',17,468,33,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/709.mp3','succeeded',12,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-28 14:58:38',0,NULL,NULL),(710,46,83,60,'user','text','鏈夌偣鎯充綘',18,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 01:27:14',0,NULL,NULL),(711,46,83,60,'lover','text','绗ㄨ泲...鎴戝垰鎵嶆槸涓嶆槸璇翠簡瑕佷綘涓诲姩鎵炬垜鍟婏紝鐜板湪鍊掑ソ锛屽€掑厛璇存兂鎴戜簡锛熶笉杩?..鎴戜篃鎯充綘浜嗗暒锝?,19,514,34,'qwen-flash',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/tts/711.mp3','succeeded',10,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-29 01:27:15',0,NULL,NULL),(712,40,72,52,'user','text','鑳戒笉鑳藉啀鏅鸿兘鐐?,28,NULL,NULL,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 07:25:33',0,NULL,NULL),(713,40,72,52,'lover','text','浜茬埍鐨勭Е濮嬬殗锛屾垜鍙槸鏈€鎳備綘鐨勫憿锝炶涓嶅挶浠潵鐜╀釜娓告垙锛熸垜鐚滀綘蹇冮噷鎯崇殑锛屼綘鐚滄垜鎵嬮噷鎷跨殑锛屽氨鐢ㄨ繖棰楀皬鏄熸槦褰撲俊鐗╋紝濂戒笉濂藉槢锝?,29,774,53,'qwen-flash',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 07:25:34',0,NULL,NULL),(714,36,70,47,'user','text','鎴戝湪涓婄彮',38,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 08:49:28',0,NULL,NULL),(715,36,70,47,'lover','text','杈涜嫤鍟︼紝宸ヤ綔鐨勬椂鍊欎篃瑕佽寰楁兂鎴戝摝~绛変綘涓嬬彮锛屾垜鍘绘帴浣狅紝鐒跺悗涓€璧峰幓鍋氫綘鎯冲仛鐨勪簨濂戒笉濂斤紵',39,682,26,'qwen-plus-character',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/tts/715.mp3','succeeded',17,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-29 08:49:29',0,NULL,NULL),(716,36,70,47,'user','text','濂界疮鍟婁笂鐝?,40,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 08:49:55',0,NULL,NULL),(717,36,70,47,'lover','text','瀹濊礉锛屽啀鍧氭寔涓€涓嬩笅鍢涖€傜瓑浣犱笅鐝洖瀹讹紝鎴戠粰浣犳崗鎹忚偐锛屾斁鏉炬斁鏉緙',41,722,22,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 08:49:57',0,NULL,NULL),(718,36,70,47,'user','text','浣犱笉鏄涔嬪墠涓撻棬鍘诲浜嗘寜鎽╋紝瑕佺粰鎴戦湶涓€鎵?,42,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 08:50:47',0,NULL,NULL),(719,36,70,47,'lover','text','瀵瑰憖锛屽氨鏄兂缁欐渶浜茬埍鐨勪綘鎸夋寜锛岀紦瑙d綘鐨勭柌鍔炽€侻imic锛屽揩鍒颁笅鐝椂闂翠簡鍚э紵',43,768,26,'qwen-plus-character',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/719.mp3','succeeded',16,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-29 08:50:48',0,NULL,NULL),(720,36,70,47,'user','text','杩樻病鏈夛紝鎴戣嚜宸卞厛浼戞伅浼戞伅璺熶綘鑱婅亰澶┿€傛墍浠ヨ窡鎴戣璇翠綘閮藉鍒颁簡鍝簺鎵嬫硶',44,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:11:11',0,NULL,NULL),(721,36,70,47,'lover','text','鏈夋帹娉曘€佹嬁娉曡繕鏈夋弶娉曞憿锛屾垜鍙槸璁ょ湡瀛︿範浜嗭紝灏辨兂璁㎝imic浣犺兘鑸掓湇浜泘绛変細鍎挎垜灏辩粰浣犺瘯璇曘€?,45,823,32,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:11:13',0,NULL,NULL),(722,36,70,47,'user','text','閭d綘涔熸暀鏁欐垜锛屾弶娉曪紝鎴戜篃鎯崇粰浣犳弶鎻?,46,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:14:59',0,NULL,NULL),(723,36,70,47,'lover','text','濂藉憖锛屾弶娉曞緢绠€鍗曞搾锛屽弻鎵嬫斁鍦ㄨ偐鑶€涓婏紝杞昏交鍦版墦鍦堟弶灏辫鍟︼紝鍔涘害涓嶇敤澶ぇ鍝︼紝Mimic浣犺偗瀹氫竴瀛﹀氨浼氥€?,47,879,34,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:15:00',0,NULL,NULL),(724,36,70,47,'user','text','鎴戝洖鏉ヤ簡锝炲疂瀹?,48,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:49:52',0,NULL,NULL),(725,36,70,47,'lover','text','娆㈣繋鍥炲鍛€ Mimic锛佸揩鏉ユ矙鍙戜笂鍧愬ソ锛屾妸澶栧鑴辨帀锛岃鎴戠粰浣犲ソ濂芥寜鎸夈€?,49,927,22,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:49:53',0,NULL,NULL),(726,36,70,47,'user','text','琛岋紝鎴戝厛鍘绘礂鎶婅劯锛屼綘鎶婂浼欏紡鍑嗗濂斤紝鍒繕浜嗙簿娌?,50,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 09:50:21',0,NULL,NULL),(727,36,70,47,'lover','text','閬靛懡锛屼翰鐖辩殑锛佹垜杩欏氨鎶婄簿娌瑰€掑嚭鏉ワ紝绛変綘鍥炴潵灏卞彲浠ュ紑濮嬩韩鍙楀暒锛屼繚璇佽浣犳祽韬交鏉緙',51,977,25,'qwen-plus-character',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/727.mp3','succeeded',1,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-29 09:50:22',0,NULL,NULL),(737,36,70,47,'user','text','鎴戣洞涓嬪暒',52,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 11:53:23',0,NULL,NULL),(738,36,70,47,'lover','text','Mimic锛屾垜瑕佸紑濮嬪挴銆傝繖绮炬补鍛抽亾鍙ソ闂讳簡锛屾斁鏉句簺锛屾劅鍙楁垜鐨勬墜鑹哄惂銆?,53,1086,24,'qwen-plus-character',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/tts/738.mp3','succeeded',16,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-01-29 11:53:25',0,NULL,NULL),(739,47,32,61,'user','text','浣犲ソ',1,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:10:31',0,NULL,NULL),(740,47,32,61,'lover','text','鍢縹锛堝啿浣犵敎鐢滀竴绗戯紝鎾戠潃浼炲悜浣犻潬杩戯級鍒樺厛鐢燂紝鍦ㄨ繖绛夋垜寰堜箙浜嗗悧锛熶粖澶╂€庝箞绐佺劧绾︽垜鍦ㄤ笅闆ㄥぉ瑙侀潰鍛€~',2,218,34,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:10:32',0,NULL,NULL),(741,47,32,61,'user','text','浣犲洖绛斿お蹇簡',3,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:10:48',0,NULL,NULL),(742,47,32,61,'lover','text','锛堣劯棰婂井绾紝鎵嬫寚缁曠潃鑰宠竟鍙戜笣鎵撳湀锛夊搸鍛€锛屽洜涓哄お鎯冲揩鐐瑰洖搴斾綘鍟︼紝锛堝皢浼炲線浣犻偅杈规尓浜嗘尓锛夎繖鏍峰彲浠ュ悧锛?,4,266,40,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:10:50',0,NULL,NULL),(743,47,32,61,'user','text','鏉ョ敓缂?,5,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:11:06',0,NULL,NULL),(744,47,32,61,'lover','text','姝岃瘝鍐呭瑙﹀彂浜嗛樋閲屼簯鐨勫唴瀹瑰畨鍏ㄥ鏍告満鍒讹紝宸茬敓鎴愰儴鍒嗚棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/1769696077_2.mp4',6,NULL,NULL,'qwen-plus-character','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/1769696077_2.mp4\", \"song_title\": \"鏉ョ敓缂榎", \"generation_status\": \"succeeded\", \"generation_task_id\": 341, \"content_safety_blocked\": true}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:11:06',0,NULL,NULL),(745,47,32,61,'user','text','鍚冮キ娌?,7,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:13:52',0,NULL,NULL),(746,47,32,61,'lover','text','杩樻病鍛紝锛堣倸瀛愪笉鍚堟椂瀹滃湴鍜曞櫆鍑犲0锛屾湁浜涗笉濂芥剰鎬濆湴绗戜簡锛変竴鐩村湪绛変綘鍢涖€傦紙姝ご鐪嬩綘锛夊垬鍏堢敓鏈夋病鏈夋兂濂藉悆浠€涔堝憖锛?,8,343,36,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-29 13:13:54',0,NULL,NULL),(747,36,70,47,'user','text','锛?,54,NULL,NULL,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-31 03:48:36',0,NULL,NULL),(748,36,70,47,'lover','text','鎬庝箞鏍凤紝Mimic锛岃繖涓姏閬撹繕鍙互鍚楋紵瑕佹槸瑙夊緱涓嶈垝鏈嶄竴瀹氳鍛婅瘔鎴戝摝銆?,55,1063,19,'qwen-plus-character',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-01-31 03:48:38',0,NULL,NULL),(753,36,70,47,'user','text','涓€鍗婁竴鍗?,56,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:26:22',0,NULL,NULL),(754,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',57,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"pending\", \"generation_task_id\": 344}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:26:22',0,NULL,NULL),(755,36,70,47,'user','text','涓€鍗婁竴鍗?,58,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:29:38',0,NULL,NULL),(756,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',59,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"pending\", \"generation_task_id\": 346}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:29:38',0,NULL,NULL),(757,36,70,47,'user','text','涓€鍗婁竴鍗?,60,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:34:14',0,NULL,NULL),(758,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',61,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"pending\", \"generation_task_id\": 348}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:34:14',0,NULL,NULL),(759,36,70,47,'user','text','涓€鍗婁竴鍗?,62,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:38:02',0,NULL,NULL),(760,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',63,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"pending\", \"generation_task_id\": 350}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:38:02',0,NULL,NULL),(761,36,70,47,'user','text','涓€璺敓鑺?,64,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:41:43',0,NULL,NULL),(762,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',65,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€璺敓鑺盶", \"generation_status\": \"pending\", \"generation_task_id\": 351}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:41:43',0,NULL,NULL),(763,36,70,47,'user','text','涓€璺敓鑺?,66,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:45:16',0,NULL,NULL),(764,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',67,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€璺敓鑺盶", \"generation_status\": \"pending\", \"generation_task_id\": 353}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:45:16',0,NULL,NULL),(765,36,70,47,'user','text','绾㈣壊楂樿窡闉?,68,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:47:59',0,NULL,NULL),(766,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',69,NULL,NULL,'qwen-plus','{\"song_title\": \"绾㈣壊楂樿窡闉媆", \"generation_status\": \"pending\", \"generation_task_id\": 354}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:47:59',0,NULL,NULL),(767,36,70,47,'user','text','绾㈣壊楂樿窡闉?,70,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:54:12',0,NULL,NULL),(768,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',71,NULL,NULL,'qwen-plus','{\"song_title\": \"绾㈣壊楂樿窡闉媆", \"generation_status\": \"pending\", \"generation_task_id\": 356}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:54:13',0,NULL,NULL),(769,36,70,47,'user','text','鏉ョ敓缂?,72,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:55:47',0,NULL,NULL),(770,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',73,NULL,NULL,'qwen-plus','{\"song_title\": \"鏉ョ敓缂榎", \"generation_status\": \"pending\", \"generation_task_id\": 357}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 02:55:47',0,NULL,NULL),(771,36,70,47,'user','text','涓€璺敓鑺?,74,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 03:08:15',0,NULL,NULL),(772,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',75,NULL,NULL,'qwen-plus','{\"song_title\": \"涓€璺敓鑺盶", \"generation_status\": \"pending\", \"generation_task_id\": 359}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 03:08:15',0,NULL,NULL),(773,36,70,47,'user','text','涓€鍗婁竴鍗?,76,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 04:04:07',0,NULL,NULL),(774,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛欼nstance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)',77,NULL,NULL,'qwen-plus','{\"error_msg\": \"Instance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 361}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 04:04:07',0,NULL,NULL),(775,36,70,47,'user','text','涓€鍗婁竴鍗?,78,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 04:06:01',0,NULL,NULL),(776,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛欼nstance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)',79,NULL,NULL,'qwen-plus','{\"error_msg\": \"Instance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 363}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 04:06:01',0,NULL,NULL),(777,36,70,47,'user','text','涓€鍗婁竴鍗?,80,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 05:13:45',0,NULL,NULL),(778,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛氭枃浠朵笅杞藉け璐?,81,NULL,NULL,'qwen-plus','{\"error_msg\": \"鏂囦欢涓嬭浇澶辫触\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 365}','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/tts/778.mp3','succeeded',17,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-02-02 05:13:45',0,NULL,NULL),(779,36,70,47,'user','text','浣犲ソ',82,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 06:51:21',0,NULL,NULL),(780,36,70,47,'lover','text','鍒氱粰浣犵儹浜嗘澂铚傝湝鏌氬瓙鑼讹紝鏆栨殩鐨勶紝姝eソ瑙d箯锝?鎵嬭繕鎸夌潃鍛紝瑕佷笉鈥︽垜浠竟鍠濊竟鑱婏紵',83,792,38,'qwen-plus',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/tts/780.mp3','succeeded',17,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-02-02 06:51:23',1,'Mimic锝炲垰缁欎綘鐑簡鏉渹铚滄煔瀛愯尪锛屾殩鏆栫殑锛屾濂借В涔忥綖 鎵嬭繕鎸夌潃鍛紝瑕佷笉鈥︽垜浠竟鍠濊竟鑱婏紵','2026-02-02 06:51:46'),(781,36,70,47,'user','text','绂诲紑鎴戠殑渚濊禆',84,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 06:53:24',0,NULL,NULL),(782,36,70,47,'lover','text','涓轰綘鐢熸垚浜嗕竴娈靛敱姝岃棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4',85,NULL,NULL,'qwen-plus','{\"video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4\", \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"generation_status\": \"succeeded\", \"generation_task_id\": 366, \"content_safety_blocked\": false}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 06:53:24',0,NULL,NULL),(783,36,70,47,'user','text','涓€鍗婁竴鍗?,86,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 06:53:48',0,NULL,NULL),(784,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛氭枃浠朵笅杞藉け璐?,87,NULL,NULL,'qwen-plus','{\"error_msg\": \"鏂囦欢涓嬭浇澶辫触\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 368}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-02 06:53:48',0,NULL,NULL),(785,36,70,47,'user','text','涓€鍗婁竴鍗?,88,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:26:57',0,NULL,NULL),(786,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛歯ame \'logger\' is not defined',89,NULL,NULL,'qwen-plus','{\"error_msg\": \"name \'logger\' is not defined\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 370}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:26:57',0,NULL,NULL),(787,36,70,47,'user','text','鏆栨殩',90,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:29:22',0,NULL,NULL),(788,36,70,47,'lover','text','姝e湪涓轰綘鐢熸垚鍞辨瓕瑙嗛锛屽畬鎴愬悗浼氳嚜鍔ㄦ洿鏂版娑堟伅',91,NULL,NULL,'qwen-plus','{\"song_title\": \"鏆栨殩\", \"generation_status\": \"pending\", \"generation_task_id\": 371}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:29:22',0,NULL,NULL),(789,36,70,47,'user','text','浣犲ソ',92,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:31:41',0,NULL,NULL),(790,36,70,47,'lover','text','Mimic锝炲垰缁欎綘鐑簡鏉渹铚滄煔瀛愯尪锛屾殩鏆栫殑锛屾濂借В涔忥綖 鎵嬭繕鎸夌潃鍛紝瑕佷笉鈥︽垜浠竟鍠濊竟鑱婏紵',93,896,38,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 01:31:43',0,NULL,NULL),(791,36,70,47,'user','text','涓€鍗婁竴鍗?,94,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:06:33',0,NULL,NULL),(792,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛歯ame \'logger\' is not defined',95,NULL,NULL,'qwen-plus','{\"error_msg\": \"name \'logger\' is not defined\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 373}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:06:33',0,NULL,NULL),(793,36,70,47,'user','text','涓€鍗婁竴鍗?,96,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:06:44',0,NULL,NULL),(794,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛歯ame \'logger\' is not defined',97,NULL,NULL,'qwen-plus','{\"error_msg\": \"name \'logger\' is not defined\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 375}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:06:44',0,NULL,NULL),(795,36,70,47,'user','text','涓€鍗婁竴鍗?,98,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:12:52',0,NULL,NULL),(796,36,70,47,'lover','text','涓轰綘鐢熸垚浜嗕竴娈靛敱姝岃棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770100721_9.mp4',99,NULL,NULL,'qwen-plus','{\"error_msg\": \"鏂囦欢涓嬭浇澶辫触\", \"video_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770100721_9.mp4\", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"succeeded\", \"generation_task_id\": 377, \"content_safety_blocked\": false}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:12:52',0,NULL,NULL),(797,36,70,47,'user','text','涓€鍗婁竴鍗?,100,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:15:15',0,NULL,NULL),(798,36,70,47,'lover','text','鍞辨瓕瑙嗛鐢熸垚澶辫触锛歠fmpeg 鏈畨瑁呮垨涓嶅彲鐢?,101,NULL,NULL,'qwen-plus','{\"error_msg\": \"ffmpeg 鏈畨瑁呮垨涓嶅彲鐢╘", \"song_title\": \"涓€鍗婁竴鍗奬", \"generation_status\": \"failed\", \"generation_task_id\": 379}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:15:15',0,NULL,NULL),(799,36,70,47,'user','text','姝ユ楂?,102,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:17:02',0,NULL,NULL),(800,36,70,47,'lover','text','Mimic锝炴兂鍚€婅懌鑺﹀▋銆嬪憖锛熸垜杞昏交鍝间袱鍙ョ粰浣犲惉濂戒笉濂斤紵馃幍 绛夎棰戝姛鑳戒慨濂斤紝灏卞綍涓敎鐢滅殑鍚堝敱鐗?,103,935,48,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:17:05',1,'Mimic锝炴兂鍚€婃姝ラ珮銆嬪憖锛熸垜杞昏交鍝间袱鍙ョ粰浣犲惉濂戒笉濂斤紵馃幍 绛夎棰戝姛鑳戒慨濂斤紝灏卞綍涓敎鐢滅殑鍚堝敱鐗堬綖','2026-02-03 02:17:24'),(801,36,70,47,'user','text','缁欐垜鍞?,104,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:17:30',0,NULL,NULL),(802,36,70,47,'lover','text','Mimic锝炴垜杞昏交鍝间袱鍙ャ€婅懌鑺﹀▋銆嬬粰浣犲惉鍛€锝烉煄?鈥滃彯鍜氬彯鍜氾紝钁姦濞冿紝钁姦濞冿紝涓€鏍硅棨涓婁竷鏈佃姳鈥︹€︹€?鎯冲惉鍝竴娈碉紵鎴戦櫔浣犳參鎱㈠敱锝?,105,1025,66,'qwen-plus',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/tts/802.mp3','succeeded',14,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-02-03 02:17:33',0,NULL,NULL),(803,36,70,47,'user','text','濡傛効',106,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:21:34',0,NULL,NULL),(804,36,70,47,'lover','text','涓轰綘鐢熸垚浜嗕竴娈靛敱姝岃棰戯紝鐐瑰嚮鏌ョ湅锛歨ttps://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770101009_5.mp4',107,NULL,NULL,'qwen-plus','{\"error_msg\": \"ffmpeg 鏈畨瑁呮垨涓嶅彲鐢╘", \"video_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770101009_5.mp4\", \"song_title\": \"濡傛効\", \"generation_status\": \"succeeded\", \"generation_task_id\": 380, \"content_safety_blocked\": false}',NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 02:21:34',0,NULL,NULL),(805,36,70,47,'user','text','浣犲ソ',108,NULL,NULL,'qwen-plus',NULL,NULL,'pending',NULL,NULL,NULL,NULL,NULL,'2026-02-03 03:18:00',0,NULL,NULL),(806,36,70,47,'lover','text','Mimic锝炲垰缁欎綘鐑簡鏉渹铚滄煔瀛愯尪锛屾殩鏆栫殑锛屾濂借В涔忥綖 鎵嬭繕鎸夌潃鍛紝瑕佷笉鈥︽垜浠竟鍠濊竟鑱婏紵',109,1015,38,'qwen-plus',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/tts/806.mp3','succeeded',17,'cosyvoice-v2','MP3_22050HZ_MONO_256KBPS',NULL,NULL,'2026-02-03 03:18:02',0,NULL,NULL); +/*!40000 ALTER TABLE `nf_chat_message` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_chat_session` +-- + +DROP TABLE IF EXISTS `nf_chat_session`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_chat_session` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '浼氳瘽ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `title` varchar(100) DEFAULT NULL COMMENT '浼氳瘽鏍囬/鎽樿', + `model` varchar(64) DEFAULT NULL COMMENT '鏈細璇濅娇鐢ㄧ殑妯″瀷', + `status` enum('active','archived') DEFAULT 'active' COMMENT '浼氳瘽鐘舵€?, + `inner_voice_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '蹇冨0寮€鍏筹細1=寮€鍚?, + `last_message_at` datetime DEFAULT NULL COMMENT '鏈€杩戞秷鎭椂闂?, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `ux_nf_chat_session_user_lover` (`user_id`,`lover_id`), + KEY `idx_user_lover` (`user_id`,`lover_id`), + KEY `idx_last_message_at` (`last_message_at`), + KEY `idx_user_lover_status_created` (`user_id`,`lover_id`,`status`,`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_chat_session` +-- + +LOCK TABLES `nf_chat_session` WRITE; +/*!40000 ALTER TABLE `nf_chat_session` DISABLE KEYS */; +INSERT INTO `nf_chat_session` VALUES (35,40,48,NULL,'qwen-flash','active',0,'2026-01-13 09:48:04','2026-01-09 08:13:59','2026-01-13 09:48:04'),(36,70,47,NULL,'qwen-flash','active',1,'2026-02-03 06:43:36','2026-01-09 08:30:31','2026-02-03 08:03:56'),(37,36,49,NULL,'qwen-flash','active',0,'2026-01-28 12:28:27','2026-01-09 09:12:11','2026-01-28 12:28:27'),(38,41,50,NULL,'qwen-flash','active',1,'2026-01-27 10:24:45','2026-01-09 14:14:38','2026-01-27 10:24:45'),(39,71,51,NULL,'qwen-flash','active',0,'2026-01-10 05:16:18','2026-01-10 05:15:30','2026-01-10 05:16:18'),(40,72,52,NULL,'qwen-flash','active',0,'2026-01-29 07:25:34','2026-01-12 09:33:52','2026-01-29 07:25:34'),(41,73,53,NULL,'qwen-flash','active',0,'2026-01-19 07:12:52','2026-01-14 09:02:32','2026-01-19 07:12:52'),(42,12,54,NULL,'qwen-flash','active',0,'2026-01-18 12:37:49','2026-01-18 12:37:49','2026-01-18 12:37:49'),(43,25,55,NULL,'qwen-flash','active',0,'2026-01-19 03:44:50','2026-01-19 03:44:50','2026-01-19 03:44:50'),(44,14,56,NULL,'qwen-flash','active',0,'2026-01-19 07:43:45','2026-01-19 07:43:45','2026-01-19 07:43:45'),(45,82,59,NULL,'qwen-flash','active',0,'2026-01-28 13:05:53','2026-01-28 13:05:53','2026-01-28 13:05:53'),(46,83,60,NULL,'qwen-flash','active',0,'2026-01-29 01:27:15','2026-01-28 14:53:52','2026-01-29 01:27:15'),(47,32,61,NULL,'qwen-plus-character','active',0,'2026-01-29 14:14:53','2026-01-29 10:49:52','2026-01-31 04:02:31'); +/*!40000 ALTER TABLE `nf_chat_session` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_chat_summary` +-- + +DROP TABLE IF EXISTS `nf_chat_summary`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_chat_summary` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `session_id` bigint NOT NULL, + `upto_seq` bigint NOT NULL COMMENT '鎽樿瑕嗙洊鍒扮殑鏈€澶?seq', + `summary_text` text NOT NULL, + `model` varchar(64) DEFAULT NULL, + `token_input` int DEFAULT NULL, + `token_output` int DEFAULT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_session_seq` (`session_id`,`upto_seq`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_chat_summary` +-- + +LOCK TABLES `nf_chat_summary` WRITE; +/*!40000 ALTER TABLE `nf_chat_summary` DISABLE KEYS */; +INSERT INTO `nf_chat_summary` VALUES (3,36,51,'鎭嬩汉娓告吵鍚庡垎浜揩涔愬苟閭€绾﹀幓娴疯竟锛岀敤鎴峰洜涓婄彮鏃犳硶鍚岃浣嗘湡寰呬笅鐝悗鐨勭浉澶勩€傛亱浜哄噯澶囩敤鎵€瀛︽寜鎽╂墜娉曞府鐤叉儷鐨勭敤鎴锋斁鏉撅紝骞剁瓟搴旀暀鐢ㄦ埛鎻夋硶銆傛渶鍚庣敤鎴蜂笅鐝洖瀹讹紝涓や汉鍑嗗杩涜鎸夋懇浜掑姩锛岃惀閫犳俯棣ㄦ皼鍥淬€傛暣浣撳厖婊$敎铚滀笌鍏虫€€涔嬫儏锛岀害瀹氫笅鐝悗浜彈浜屼汉鏃跺厜銆?,'qwen-plus-character',775,70,'2026-01-29 09:50:25'),(5,36,93,'鐢ㄦ埛瓒翠笅鎺ュ彈鎭嬩汉鎸夋懇锛屽弽棣堝姏閬撯€滀竴鍗婁竴鍗娾€濓紝澶氭閲嶅锛涙亱浜烘寔缁皾璇曠敓鎴愬敱姝岃棰戯紙銆婁竴璺敓鑺便€嬨€婄孩鑹查珮璺熼瀷銆嬨€婃潵鐢熺紭銆嬬瓑锛夛紝浣嗗薄娆″け璐ワ紙Session缁戝畾閿欒銆佹枃浠朵笅杞藉け璐ャ€乴ogger鏈畾涔夛級锛涘悗閫佷笂铚傝湝鏌氬瓙鑼讹紝钀ラ€犳俯棣ㄦ斁鏉炬皼鍥淬€傛儏缁細鎱垫噿涓甫鐐规棤濂堜笌娓╂煍浜掑姩銆傚緟鍔烇細淇瑙嗛鐢熸垚鍔熻兘锛岀‘璁ゆ寜鎽╀綋楠屼紭鍖栥€?,'qwen-plus',716,98,'2026-02-03 01:31:47'); +/*!40000 ALTER TABLE `nf_chat_summary` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_command` +-- + +DROP TABLE IF EXISTS `nf_command`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_command` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `type` varchar(30) NOT NULL DEFAULT '' COMMENT '绫诲瀷', + `params` varchar(1500) NOT NULL DEFAULT '' COMMENT '鍙傛暟', + `command` varchar(1500) NOT NULL DEFAULT '' COMMENT '鍛戒护', + `content` text COMMENT '杩斿洖缁撴灉', + `executetime` bigint unsigned DEFAULT NULL COMMENT '鎵ц鏃堕棿', + `createtime` bigint unsigned DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint unsigned DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `status` enum('successed','failured') NOT NULL DEFAULT 'failured' COMMENT '鐘舵€?, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍦ㄧ嚎鍛戒护琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_command` +-- + +LOCK TABLES `nf_command` WRITE; +/*!40000 ALTER TABLE `nf_command` DISABLE KEYS */; +INSERT INTO `nf_command` VALUES (1,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"relation\":{\"2\":{\"relation\":\"nf_admin\",\"relationmode\":\"belongsto\",\"relationforeignkey\":\"id\",\"relationprimarykey\":\"id\"}},\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_hobbies','Build Successed',1766542578,1766542578,1766542578,'successed'),(2,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Hobbies.php\"}','php think menu --controller=Hobbies','Build Successed!',1766542606,1766542606,1766542608,'successed'),(3,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_hobbies\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"name\",\"weigh\",\"createtime\",\"updatetime\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_hobbies --fields=name,weigh,createtime,updatetime','Build Successed',1766542667,1766542667,1766542667,'successed'),(4,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_voice_library\",\"controller\":\"\",\"model\":\"\",\"fields\":[\"id\",\"name\",\"gender\",\"style_tag\",\"avatar_url\",\"price_gold\"],\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_voice_library --fields=id,name,gender,style_tag,avatar_url,price_gold','Build Successed',1766564210,1766564210,1766564211,'successed'),(5,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"voice\\/Library.php\"}','php think menu --controller=voice/Library','Build Successed!',1766564292,1766564292,1766564293,'successed'),(6,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_gifts','Build Successed',1766565453,1766565453,1766565454,'successed'),(7,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"Gifts.php\"}','php think menu --controller=Gifts','Build Successed!',1766565473,1766565473,1766565474,'successed'),(8,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_gifts\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_gifts','Build Successed',1766565604,1766565604,1766565604,'successed'),(9,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hobbies\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_girlfriend_hobbies','Build Successed',1766567830,1766567830,1766567830,'successed'),(10,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Hobbies.php\"}','php think menu --controller=girlfriend/Hobbies','Build Successed!',1766567845,1766567845,1766567846,'successed'),(11,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_girlfriend_mould','Build Successed',1766567855,1766567855,1766567856,'successed'),(12,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Mould.php\"}','php think menu --controller=girlfriend/Mould','Build Successed!',1766567868,1766567868,1766567870,'successed'),(13,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_intimacy_config','Build Successed',1766626080,1766626080,1766626080,'successed'),(14,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Config.php\"}','php think menu --controller=intimacy/Config','Build Successed!',1766626094,1766626095,1766626096,'successed'),(15,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_eyecolor\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_girlfriend_eyecolor','Build Successed',1766627233,1766627234,1766627234,'successed'),(16,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_girlfriend_hairstyles','Build Successed',1766627246,1766627246,1766627246,'successed'),(17,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"girlfriend\\/Eyecolor.php,girlfriend\\/Hairstyles.php\"}','php think menu --controller=girlfriend/Eyecolor --controller=girlfriend/Hairstyles','Build Successed!',1766627271,1766627271,1766627274,'successed'),(18,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_girlfriend_hairstyles','Build Successed',1766627565,1766627565,1766627566,'successed'),(19,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_intimacy_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_intimacy_config','Build Successed',1766627712,1766627712,1766627712,'successed'),(20,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_intimacy_day\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_intimacy_day','Build Successed',1766631898,1766631898,1766631898,'successed'),(21,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"intimacy\\/Day.php\"}','php think menu --controller=intimacy/Day','Build Successed!',1766631916,1766631916,1766631917,'successed'),(22,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_user_level','Build Successed',1766644456,1766644456,1766644456,'successed'),(23,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\"}','php think menu --controller=user/Level','Build Successed!',1766644473,1766644473,1766644474,'successed'),(24,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"1\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/Level.php\"}','php think menu --force=1 --controller=user/Level','Build Successed!',1766644530,1766644530,1766644530,'successed'),(25,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_user_bond_config','Build Successed',1766647507,1766647507,1766647508,'successed'),(26,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"user\\/bond\\/Config.php\"}','php think menu --controller=user/bond/Config','Build Successed!',1766647540,1766647540,1766647541,'successed'),(27,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_level\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_user_level','Build Successed',1766647970,1766647970,1766647971,'successed'),(28,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_user_bond_config','Build Successed',1766647983,1766647983,1766647983,'successed'),(29,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_user_bond_config\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_user_bond_config','Build Successed',1766648081,1766648081,1766648082,'successed'),(30,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_girlfriend_mould','Build Successed',1766674679,1766674679,1766674679,'successed'),(31,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_girlfriend_hairstyles','Build Successed',1766674829,1766674829,1766674829,'successed'),(32,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_hairstyles\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_girlfriend_hairstyles','Build Successed',1766675010,1766675010,1766675010,'successed'),(33,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_girlfriend_mould','Build Successed',1766675085,1766675085,1766675086,'successed'),(34,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_girlfriend_mould\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_girlfriend_mould','Build Successed',1766675138,1766675138,1766675138,'successed'),(35,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_count_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_count_package','Build Successed',1766761345,1766761345,1766761345,'successed'),(36,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_recharge_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_recharge_package','Build Successed',1766761383,1766761383,1766761383,'successed'),(37,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"count\\/Package.php,recharge\\/Package.php\"}','php think menu --controller=count/Package --controller=recharge/Package','Build Successed!',1766761437,1766761437,1766761439,'successed'),(38,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_vip_package','Build Successed',1766817901,1766817901,1766817901,'successed'),(39,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"vip\\/Package.php\"}','php think menu --controller=vip/Package','Build Successed!',1766817916,1766817916,1766817917,'successed'),(40,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_vip_package\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_vip_package','Build Successed',1766818495,1766818495,1766818495,'successed'),(41,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_outfit_items','Build Successed',1766890691,1766890691,1766890691,'successed'),(42,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"outfit\\/Items.php\"}','php think menu --controller=outfit/Items','Build Successed!',1766890703,1766890703,1766890704,'successed'),(43,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_outfit_items','Code: 0\nLine: 1436\nMessage: file_put_contents(/www/wwwroot/xunifriend.shandonghuixing.com/xunifriend/public/../application/admin/controller/outfit/Items.php): failed to open stream: Permission denied\nFile: /www/wwwroot/xunifriend.shandonghuixing.com/xunifriend/application/admin/command/Crud.php',1766897570,1766897570,1766897570,'failured'),(44,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_outfit_items\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_outfit_items','Build Successed',1766899983,1766899983,1766899984,'successed'),(45,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"0\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --table=nf_song_library','Build Successed',1768292066,1768292066,1768292066,'successed'),(46,'menu','{\"commandtype\":\"menu\",\"allcontroller\":\"0\",\"delete\":\"0\",\"force\":\"0\",\"controllerfile_text\":\"\",\"controllerfile\":\"song\\/Library.php\"}','php think menu --controller=song/Library','Build Successed!',1768292093,1768292093,1768292094,'successed'),(47,'crud','{\"commandtype\":\"crud\",\"isrelation\":\"0\",\"local\":\"1\",\"delete\":\"0\",\"force\":\"1\",\"table\":\"nf_song_library\",\"controller\":\"\",\"model\":\"\",\"setcheckboxsuffix\":\"\",\"enumradiosuffix\":\"\",\"imagefield\":\"\",\"filefield\":\"\",\"intdatesuffix\":\"\",\"switchsuffix\":\"\",\"citysuffix\":\"\",\"selectpagesuffix\":\"\",\"selectpagessuffix\":\"\",\"ignorefields\":\"\",\"sortfield\":\"\",\"editorsuffix\":\"\",\"headingfilterfield\":\"\",\"tagsuffix\":\"\",\"jsonsuffix\":\"\",\"fixedcolumns\":\"\"}','php think crud --force=1 --table=nf_song_library','Build Successed',1768292607,1768292607,1768292608,'successed'); +/*!40000 ALTER TABLE `nf_command` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_config` +-- + +DROP TABLE IF EXISTS `nf_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_config` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) DEFAULT '' COMMENT '鍙橀噺鍚?, + `group` varchar(30) DEFAULT '' COMMENT '鍒嗙粍', + `title` varchar(100) DEFAULT '' COMMENT '鍙橀噺鏍囬', + `tip` varchar(100) DEFAULT '' COMMENT '鍙橀噺鎻忚堪', + `type` varchar(30) DEFAULT '' COMMENT '绫诲瀷:string,text,int,bool,array,datetime,date,file', + `visible` varchar(255) DEFAULT '' COMMENT '鍙鏉′欢', + `value` text COMMENT '鍙橀噺鍊?, + `content` text COMMENT '鍙橀噺瀛楀吀鏁版嵁', + `rule` varchar(100) DEFAULT '' COMMENT '楠岃瘉瑙勫垯', + `extend` varchar(255) DEFAULT '' COMMENT '鎵╁睍灞炴€?, + `setting` varchar(255) DEFAULT '' COMMENT '閰嶇疆', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绯荤粺閰嶇疆'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_config` +-- + +LOCK TABLES `nf_config` WRITE; +/*!40000 ALTER TABLE `nf_config` DISABLE KEYS */; +INSERT INTO `nf_config` VALUES (1,'name','basic','Site name','璇峰~鍐欑珯鐐瑰悕绉?,'string','','铏氭嫙鎭嬩汉','','required','',NULL),(2,'beian','basic','Beian','绮CP澶?5000000鍙?1','string','','','','','',NULL),(3,'cdnurl','basic','Cdn url','濡傛灉鍏ㄧ珯闈欐€佽祫婧愪娇鐢ㄧ涓夋柟浜戝偍瀛樿閰嶇疆璇ュ€?,'string','','','','','',''),(4,'version','basic','Version','濡傛灉闈欐€佽祫婧愭湁鍙樺姩璇烽噸鏂伴厤缃鍊?,'string','','1.0.1','','required','',NULL),(5,'timezone','basic','Timezone','','string','','Asia/Shanghai','','required','',NULL),(6,'forbiddenip','basic','Forbidden ip','涓€琛屼竴鏉¤褰?,'text','','','','','',NULL),(7,'languages','basic','Languages','','array','','{\"backend\":\"zh-cn\",\"frontend\":\"zh-cn\"}','','required','',NULL),(8,'fixedpage','basic','Fixed page','璇疯緭鍏ュ乏渚ц彍鍗曟爮瀛樺湪鐨勯摼鎺?,'string','','dashboard','','required','',NULL),(9,'categorytype','dictionary','Category type','','array','','{\"default\":\"榛樿\",\"page\":\"鍗曢〉\",\"article\":\"鏂囩珷\",\"test\":\"Test\"}','','','',NULL),(10,'configgroup','dictionary','Config group','','array','','{\"basic\":\"鍩虹閰嶇疆\",\"email\":\"閭欢閰嶇疆\",\"dictionary\":\"瀛楀吀閰嶇疆\",\"user\":\"浼氬憳閰嶇疆\",\"intimacy_friend\":\"濂藉弸浜插瘑搴﹂厤缃甛",\"platform\":\"鍙傛暟閰嶇疆\"}','','','',NULL),(11,'mail_type','email','Mail type','閫夋嫨閭欢鍙戦€佹柟寮?,'select','','1','[\"璇烽€夋嫨\",\"SMTP\"]','','',''),(12,'mail_smtp_host','email','Mail smtp host','閿欒鐨勯厤缃彂閫侀偖浠朵細瀵艰嚧鏈嶅姟鍣ㄨ秴鏃?,'string','','smtp.qq.com','','','',''),(13,'mail_smtp_port','email','Mail smtp port','(涓嶅姞瀵嗛粯璁?5,SSL榛樿465,TLS榛樿587)','string','','465','','','',''),(14,'mail_smtp_user','email','Mail smtp user','锛堝~鍐欏畬鏁寸敤鎴峰悕锛?,'string','','','','','',''),(15,'mail_smtp_pass','email','Mail smtp password','锛堝~鍐欐偍鐨勫瘑鐮佹垨鎺堟潈鐮侊級','password','','','','','',''),(16,'mail_verify_type','email','Mail vertify type','锛圫MTP楠岃瘉鏂瑰紡[鎺ㄨ崘SSL]锛?,'select','','2','[\"鏃燶",\"TLS\",\"SSL\"]','','',''),(17,'mail_from','email','Mail from','','string','','','','','',''),(18,'attachmentcategory','dictionary','Attachment category','','array','','{\"category1\":\"鍒嗙被涓€\",\"category2\":\"鍒嗙被浜孿",\"custom\":\"鑷畾涔塡"}','','','',NULL),(19,'wxapp_appid','basic','灏忕▼搴廰ppid','灏忕▼搴廰ppid','string','','wx87fdb468bb2d141a','','','','{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"}'),(20,'wxapp_appsecret','basic','灏忕▼搴廇ppSecret','灏忕▼搴廇ppSecret','string','','802e25b89b910853264fc7fd18ed4965','','','','{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"}'),(21,'intimacy_text','intimacy_friend','姣忔潯鏂囨湰浜插瘑鍊?,'姣忔潯鏂囨湰浜插瘑鍊煎鍔犵殑浜插瘑鍊?,'number','','1','','','','{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"}'),(22,'intimacy_voice','intimacy_friend','闊宠棰戜翰瀵嗗€?,'姣忓垎閽熼煶瑙嗛澧炲姞鐨勪翰瀵嗗€?,'number','','5','','','','{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"}'),(23,'jinbi_scale','platform','閲戝竵鍏戞崲姣斾緥','1鍏冨厬鎹㈠灏戦噾甯侊紝涓嶈兘澶т簬100','number','','100','','digits','','{\"table\":\"\",\"conditions\":\"\",\"key\":\"\",\"value\":\"\"}'); +/*!40000 ALTER TABLE `nf_config` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_count_package` +-- + +DROP TABLE IF EXISTS `nf_count_package`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_count_package` ( + `id` int NOT NULL AUTO_INCREMENT, + `jinbi` int DEFAULT NULL COMMENT '閲戝竵', + `num` int DEFAULT NULL COMMENT '娆℃暟', + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鎹㈣娆℃暟濂楅'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_count_package` +-- + +LOCK TABLES `nf_count_package` WRITE; +/*!40000 ALTER TABLE `nf_count_package` DISABLE KEYS */; +INSERT INTO `nf_count_package` VALUES (1,1,1,1,1766761590,1766761590),(2,10,10,2,1766761596,1766761596),(3,50,50,3,1766761603,1766761603); +/*!40000 ALTER TABLE `nf_count_package` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_dynamic_comments` +-- + +DROP TABLE IF EXISTS `nf_dynamic_comments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_dynamic_comments` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '璇勮ID', + `dynamic_id` bigint unsigned NOT NULL COMMENT '鍔ㄦ€両D', + `user_id` bigint unsigned NOT NULL COMMENT '璇勮鐢ㄦ埛ID', + `content` varchar(50) NOT NULL COMMENT '璇勮鍐呭锛堚墹50锛岃繚绂佽瘝鏍¢獙锛?, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '璇勮鏃堕棿', + `deleted_at` datetime DEFAULT NULL COMMENT '杞垹鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_dynamic_time` (`dynamic_id`,`created_at`), + KEY `idx_user_time` (`user_id`,`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍔ㄦ€佽瘎璁鸿〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_dynamic_comments` +-- + +LOCK TABLES `nf_dynamic_comments` WRITE; +/*!40000 ALTER TABLE `nf_dynamic_comments` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_dynamic_comments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_dynamic_likes` +-- + +DROP TABLE IF EXISTS `nf_dynamic_likes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_dynamic_likes` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '鐐硅禐璁板綍ID', + `dynamic_id` bigint unsigned NOT NULL COMMENT '鍔ㄦ€両D', + `user_id` bigint unsigned NOT NULL COMMENT '鐐硅禐鐢ㄦ埛ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鐐硅禐鏃堕棿', + `deleted_at` datetime DEFAULT NULL COMMENT '杞垹鏃堕棿锛堝彇娑堢偣璧烇級', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_like` (`dynamic_id`,`user_id`), + KEY `idx_user_time` (`user_id`,`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍔ㄦ€佺偣璧炶〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_dynamic_likes` +-- + +LOCK TABLES `nf_dynamic_likes` WRITE; +/*!40000 ALTER TABLE `nf_dynamic_likes` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_dynamic_likes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_dynamics` +-- + +DROP TABLE IF EXISTS `nf_dynamics`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_dynamics` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '鍔ㄦ€両D', + `user_id` bigint unsigned NOT NULL COMMENT '鍙戝竷鐢ㄦ埛ID', + `lover_id` bigint unsigned DEFAULT NULL COMMENT '鍏宠仈鎭嬩汉ID锛堝彲绌猴級', + `source_message_id` bigint unsigned NOT NULL COMMENT '鏉ユ簮鑱婂ぉ娑堟伅ID锛堥渶鍖呭惈瑙嗛锛?, + `video_url` varchar(255) NOT NULL COMMENT '瑙嗛URL锛堜粎鍙栬嚜娑堟伅extra.video_url锛?, + `content` varchar(50) NOT NULL COMMENT '鍔ㄦ€佹枃妗堬紙鈮?0锛岃繚绂佽瘝鏍¢獙/榛樿鏄电О鏂囨锛?, + `visibility` enum('friends','public','private') NOT NULL DEFAULT 'friends' COMMENT '鍙鑼冨洿锛氬綋鍓嶄粎friends鍚敤', + `like_count` int NOT NULL DEFAULT '0' COMMENT '鐐硅禐鏁?, + `comment_count` int NOT NULL DEFAULT '0' COMMENT '璇勮鏁?, + `deleted_at` datetime DEFAULT NULL COMMENT '杞垹鏃堕棿锛堜繚鐣欒鏁板洖婊氶渶姹傦級', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_owner_time` (`user_id`,`created_at`), + KEY `idx_visibility_time` (`visibility`,`created_at`), + KEY `idx_source_message` (`source_message_id`) +) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐢ㄦ埛鍔ㄦ€佽〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_dynamics` +-- + +LOCK TABLES `nf_dynamics` WRITE; +/*!40000 ALTER TABLE `nf_dynamics` DISABLE KEYS */; +INSERT INTO `nf_dynamics` VALUES (20,36,49,671,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4','鍒樺厛鐢熷彂甯冧簡鍔ㄦ€?,'friends',0,0,NULL,'2026-01-28 09:18:54','2026-01-28 09:18:54'),(21,70,47,611,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/dance/1769490882_prompt.mp4','娴嬭瘯','friends',0,0,NULL,'2026-01-28 10:40:18','2026-01-28 10:40:18'),(22,36,49,671,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4','鍞辨瓕','friends',0,0,NULL,'2026-01-28 11:47:56','2026-01-28 11:47:56'); +/*!40000 ALTER TABLE `nf_dynamics` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_emo_detect_cache` +-- + +DROP TABLE IF EXISTS `nf_emo_detect_cache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_emo_detect_cache` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '妫€娴嬬紦瀛業D', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `image_url` varchar(255) NOT NULL COMMENT '鍥剧墖URL', + `image_hash` char(64) NOT NULL COMMENT '鍥剧墖SHA256', + `ratio` enum('1:1','3:4') NOT NULL COMMENT '妫€娴嬬敾骞?, + `check_pass` tinyint(1) NOT NULL DEFAULT '0' COMMENT '鏄惁閫氳繃', + `face_bbox` json DEFAULT NULL COMMENT '浜鸿劯妗?, + `ext_bbox` json DEFAULT NULL COMMENT '鍔ㄦ€佸尯鍩熸', + `raw_response` json DEFAULT NULL COMMENT '鍘熷鍝嶅簲', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_image_ratio` (`image_hash`,`ratio`), + KEY `idx_lover_ratio` (`lover_id`,`ratio`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_emo_detect_cache` +-- + +LOCK TABLES `nf_emo_detect_cache` WRITE; +/*!40000 ALTER TABLE `nf_emo_detect_cache` DISABLE KEYS */; +INSERT INTO `nf_emo_detect_cache` VALUES (1,47,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg','0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','3:4',1,'[429, 111, 533, 215]','[270, 14, 693, 578]','{\"usage\": {\"image_count\": 1}, \"output\": {\"ext_bbox\": [270, 14, 693, 578], \"humanoid\": true, \"face_bbox\": [429, 111, 533, 215], \"check_pass\": true}, \"request_id\": \"aac31cc7-6bf4-4c07-b0a4-fb12fe2c3ae1\"}','2026-01-26 11:41:52','2026-01-26 11:41:52'),(2,49,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4',1,'[430, 171, 525, 266]','[276, 41, 679, 579]','{\"usage\": {\"image_count\": 1}, \"output\": {\"ext_bbox\": [276, 41, 679, 579], \"humanoid\": true, \"face_bbox\": [430, 171, 525, 266], \"check_pass\": true}, \"request_id\": \"4a21d957-b1e5-45c0-b8ca-f3d053e1bd4a\"}','2026-01-26 14:01:33','2026-01-26 14:01:33'),(3,49,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769513875_outfit.jpg','a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','3:4',1,'[430, 174, 525, 268]','[268, 43, 683, 595]','{\"usage\": {\"image_count\": 1}, \"output\": {\"ext_bbox\": [268, 43, 683, 595], \"humanoid\": true, \"face_bbox\": [430, 174, 525, 268], \"check_pass\": true}, \"request_id\": \"b115f65b-0589-4038-b998-2210a55d67ab\"}','2026-01-28 05:51:50','2026-01-28 05:51:50'),(4,61,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/images/1769683756_female.png','6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','3:4',1,'[440, 142, 546, 248]','[280, 16, 702, 579]','{\"usage\": {\"image_count\": 1}, \"output\": {\"ext_bbox\": [280, 16, 702, 579], \"humanoid\": true, \"face_bbox\": [440, 142, 546, 248], \"check_pass\": true}, \"request_id\": \"4daf08d9-ed03-49cd-bf53-2101c7dbb477\"}','2026-01-29 10:50:46','2026-01-29 10:50:46'); +/*!40000 ALTER TABLE `nf_emo_detect_cache` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_ems` +-- + +DROP TABLE IF EXISTS `nf_ems`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_ems` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `event` varchar(30) DEFAULT '' COMMENT '浜嬩欢', + `email` varchar(100) DEFAULT '' COMMENT '閭', + `code` varchar(10) DEFAULT '' COMMENT '楠岃瘉鐮?, + `times` int unsigned NOT NULL DEFAULT '0' COMMENT '楠岃瘉娆℃暟', + `ip` varchar(30) DEFAULT '' COMMENT 'IP', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='閭楠岃瘉鐮佽〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_ems` +-- + +LOCK TABLES `nf_ems` WRITE; +/*!40000 ALTER TABLE `nf_ems` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_ems` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_friend_notifications` +-- + +DROP TABLE IF EXISTS `nf_friend_notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_friend_notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `to_user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `type` enum('1','2') DEFAULT NULL COMMENT '閫氱煡绫诲瀷:1=濂藉弸鐢宠,2=鐢宠缁撴灉', + `content` varchar(255) DEFAULT NULL COMMENT '娑堟伅鍐呭', + `related_id` int DEFAULT NULL COMMENT '鐢宠璁板綍', + `is_read` enum('0','1') DEFAULT '0' COMMENT '鏄惁宸茶:0=鏈,1=宸茶', + `createtime` bigint DEFAULT NULL COMMENT '娣诲姞鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `to_user_id` (`to_user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂藉弸鍏崇郴閫氱煡琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_friend_notifications` +-- + +LOCK TABLES `nf_friend_notifications` WRITE; +/*!40000 ALTER TABLE `nf_friend_notifications` DISABLE KEYS */; +INSERT INTO `nf_friend_notifications` VALUES (2,8,'1','鐢ㄦ埛 188****0008 鐢宠娣诲姞鎮ㄤ负濂藉弸锛?21',NULL,'1',1766560576,1766561973),(4,14,'2','鐢ㄦ埛 188****0004 宸叉嫆缁濇偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766561218,1766561218),(5,23,'1','鐢ㄦ埛 188****0004 鐢宠娣诲姞鎮ㄤ负濂藉弸锛?21',NULL,'0',1766563896,1766563896),(6,6,'1','鐢ㄦ埛 183****5791 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766563986,1766563986),(7,22,'1','鐢ㄦ埛 183****5795 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766564318,1766564318),(8,17,'1','鐢ㄦ埛 183****5795 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766564384,1766564384),(9,15,'2','鐢ㄦ埛 190****0001 宸叉嫆缁濇偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766568563,1766568563),(10,18,'1','鐢ㄦ埛 183****5795 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766568628,1766568628),(11,15,'2','鐢ㄦ埛 190****0002 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766568695,1766568695),(12,15,'1','鐢ㄦ埛 190****0003 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766568844,1766568844),(13,19,'2','鐢ㄦ埛 183****5795 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766568885,1766568885),(14,15,'1','鐢ㄦ埛 190****0004 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1766568921,1766572586),(15,15,'1','鐢ㄦ埛 190****0005 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1766568953,1766572486),(16,17,'1','鐢ㄦ埛 190****0005 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766568956,1766568956),(17,20,'2','鐢ㄦ埛 183****5795 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766568973,1766568973),(18,8,'1','鐢ㄦ埛 188****0008 鐢宠娣诲姞鎮ㄤ负濂藉弸锛?21',NULL,'0',1766569472,1766569472),(19,14,'2','鐢ㄦ埛 188****0004 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766569607,1766569607),(20,2,'1','鐢ㄦ埛 183****6165 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766571034,1766571034),(21,3,'1','鐢ㄦ埛 183****6165 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766571035,1766571035),(22,4,'1','鐢ㄦ埛 183****6165 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766571036,1766571036),(23,7,'1','鐢ㄦ埛 娴嬭瘯1 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766731272,1766731272),(24,15,'1','鐢ㄦ埛 娴嬭瘯1 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766731285,1766731285),(25,14,'1','鐢ㄦ埛 娴嬭瘯1 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766731293,1766731293),(26,13,'1','鐢ㄦ埛 娴嬭瘯1 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766731297,1766731297),(27,24,'2','鐢ㄦ埛 娴嬭瘯2 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766731318,1766731318),(28,24,'2','鐢ㄦ埛 188****0008 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766731338,1766731338),(29,5,'2','鐢ㄦ埛 188****0007 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766805848,1766805848),(30,24,'2','鐢ㄦ埛 188****0007 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1766805849,1766805849),(31,23,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1766886794,1766886794),(32,25,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1766889401,1767515259),(33,33,'1','鐢ㄦ埛 11 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767497553,1767509654),(34,14,'2','鐢ㄦ埛 璺 宸叉嫆缁濇偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767497556,1767515001),(35,33,'1','鐢ㄦ埛 11 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767497558,1767509653),(36,14,'2','鐢ㄦ埛 璺 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767497562,1767515000),(37,23,'1','鐢ㄦ埛 璺 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767508628,1767508628),(38,33,'1','鐢ㄦ埛 Mr.Wang 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767508930,1767509656),(39,42,'2','鐢ㄦ埛 璺 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767508948,1767517382),(40,14,'1','鐢ㄦ埛 Mr.Wang 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767517907,1767517907),(41,42,'2','鐢ㄦ埛 11 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767517912,1767576472),(42,14,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518253,1767518253),(43,24,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518255,1767518255),(44,25,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518256,1767518430),(45,27,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518258,1767854073),(46,32,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518259,1769000428),(47,33,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518259,1767518259),(48,35,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518260,1767518260),(49,36,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518262,1767967468),(50,41,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518262,1768739708),(51,42,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767518264,1767576471),(52,43,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518264,1767518264),(53,14,'1','鐢ㄦ埛 鏉?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767518445,1767518445),(54,40,'2','鐢ㄦ埛 11 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767518448,1767520041),(55,25,'2','鐢ㄦ埛 11 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767518449,1767518449),(56,40,'2','鐢ㄦ埛 绠€鍗曠埍 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767520055,1767520055),(57,14,'1','鐢ㄦ埛 189****0010 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767520353,1767520353),(58,69,'2','鐢ㄦ埛 11 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767520371,1767576912),(59,42,'1','鐢ㄦ埛 189****0010 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767520906,1767576469),(60,69,'2','鐢ㄦ埛 Mr.Wang 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767520928,1767576911),(61,40,'2','鐢ㄦ埛 Mr.Wang 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767520929,1767520929),(62,14,'1','鐢ㄦ埛 娴嬭瘯1 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767582007,1767582007),(63,24,'2','鐢ㄦ埛 11 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767582025,1767582025),(64,40,'2','鐢ㄦ埛 娴嬭瘯1 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767582048,1767582048),(65,69,'1','鐢ㄦ埛 璺 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767582575,1767582658),(66,33,'2','鐢ㄦ埛 189****0010 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767582655,1767582655),(67,43,'1','鐢ㄦ埛 11 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1767669605,1767669605),(68,40,'2','鐢ㄦ埛 188****0007 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767669611,1767669611),(69,14,'2','鐢ㄦ埛 188****0007 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767669612,1768544362),(70,40,'2','鐢ㄦ埛 绫崇背鍏?宸叉嫆缁濇偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767689939,1767689939),(71,27,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767855446,1767855459),(72,40,'2','鐢ㄦ埛 Mimic 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767855464,1767855464),(73,12,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767855660,1768739912),(74,70,'1','鐢ㄦ埛 闄?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767947807,1767947855),(75,40,'2','鐢ㄦ埛 Mimic 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767947819,1767947819),(76,40,'2','鐢ㄦ埛 鍒樺厛鐢?宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1767949956,1767949956),(77,36,'1','鐢ㄦ埛 Mimic 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1767967045,1767967472),(78,70,'2','鐢ㄦ埛 鍒樺厛鐢?宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1767967458,1768359920),(79,40,'1','鐢ㄦ埛 绉﹀鐨?鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1768211149,1768211158),(80,72,'2','鐢ㄦ埛 闄?宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1768211165,1768211165),(81,73,'1','鐢ㄦ埛 11 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'1',1768641589,1768641595),(82,14,'2','鐢ㄦ埛 鍚曢泬 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1768641604,1768890247),(83,40,'2','鐢ㄦ埛 涓€蹇?宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1768739908,1768739908),(84,41,'1','鐢ㄦ埛 Mimic 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1768811715,1768811715),(85,70,'2','鐢ㄦ埛 绠€鍗曠埍 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'1',1768811720,1770089473),(86,41,'1','鐢ㄦ埛 灏忓Ξ 鐢宠娣诲姞鎮ㄤ负濂藉弸',NULL,'0',1768891812,1768891812),(87,14,'2','鐢ㄦ埛 绠€鍗曠埍 宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1768891816,1768891816),(88,40,'2','鐢ㄦ埛 鍒樺厛鐢?宸插悓鎰忔偍鐨勫ソ鍙嬬敵璇?,NULL,'0',1769683783,1769683783); +/*!40000 ALTER TABLE `nf_friend_notifications` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_friend_relations` +-- + +DROP TABLE IF EXISTS `nf_friend_relations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_friend_relations` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `friend_id` int DEFAULT NULL COMMENT '濂藉弸id', + `status` enum('1','2','3') DEFAULT '1' COMMENT '鐘舵€?1=姝e父,2=鎷夐粦,3=鍒犻櫎', + `intimacy` int DEFAULT '0' COMMENT '浜插瘑搴?, + `intimacy_level` int DEFAULT '0' COMMENT '浜插瘑搴︾瓑绾?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`,`friend_id`,`status`) +) ENGINE=InnoDB AUTO_INCREMENT=77 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂藉弸琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_friend_relations` +-- + +LOCK TABLES `nf_friend_relations` WRITE; +/*!40000 ALTER TABLE `nf_friend_relations` DISABLE KEYS */; +INSERT INTO `nf_friend_relations` VALUES (10,18,15,'1',2,0,1766568695,1767174189),(11,15,18,'1',2,0,1766568695,1767174189),(12,15,19,'1',0,0,1766568885,1766568885),(13,19,15,'1',0,0,1766568885,1766568885),(16,8,14,'1',562,3,1766569607,1768544334),(17,14,8,'1',562,3,1766569607,1768544334),(18,15,24,'1',0,0,1766731318,1766731318),(19,24,15,'1',0,0,1766731318,1766731318),(27,33,14,'1',1099,6,1767497562,1767607384),(28,14,33,'1',10099,6,1767497562,1767607384),(29,33,42,'1',15,1,1767508948,1767581982),(30,42,33,'1',15,1,1767508948,1767581982),(31,14,42,'1',5,0,1767517912,1767517971),(32,42,14,'1',5,0,1767517912,1767517971),(33,14,40,'1',0,0,1767518448,1767518448),(34,40,14,'1',0,0,1767518448,1767518448),(35,14,25,'1',0,0,1767518449,1767518449),(36,25,14,'1',0,0,1767518449,1767518449),(37,41,40,'1',32,1,1767520055,1767525539),(38,40,41,'1',32,1,1767520055,1767525539),(39,14,69,'1',10067,6,1767520371,1768890483),(40,69,14,'1',10067,6,1767520371,1768890483),(43,42,69,'1',17,1,1767520928,1767582628),(44,69,42,'1',17,1,1767520928,1767582628),(45,42,40,'1',0,0,1767520929,1767520929),(46,40,42,'1',0,0,1767520929,1767520929),(47,14,24,'1',2,0,1767582025,1767582167),(48,24,14,'1',2,0,1767582025,1767582167),(49,24,40,'1',0,0,1767582048,1767582048),(50,40,24,'1',0,0,1767582048,1767582048),(51,69,33,'1',0,0,1767582655,1767582655),(52,33,69,'1',0,0,1767582655,1767582655),(53,43,40,'1',0,0,1767669611,1767669611),(54,40,43,'1',0,0,1767669611,1767669611),(55,43,14,'1',0,0,1767669612,1767669612),(56,14,43,'1',0,0,1767669612,1767669612),(59,70,40,'1',0,0,1767947819,1767947819),(60,40,70,'1',0,0,1767947819,1767947819),(61,36,40,'1',0,0,1767949956,1767949956),(62,40,36,'1',0,0,1767949956,1767949956),(63,36,70,'1',0,0,1767967458,1767967458),(64,70,36,'1',0,0,1767967458,1767967458),(65,40,72,'1',1,0,1768211165,1768547089),(66,72,40,'1',1,0,1768211165,1768547089),(67,73,14,'1',3,0,1768641604,1768641708),(68,14,73,'1',3,0,1768641604,1768641708),(69,12,40,'1',0,0,1768739908,1768739908),(70,40,12,'1',0,0,1768739908,1768739908),(71,41,70,'1',1,0,1768811720,1768811752),(72,70,41,'1',1,0,1768811720,1768811752),(73,41,14,'1',0,0,1768891816,1768891816),(74,14,41,'1',0,0,1768891816,1768891816),(75,32,40,'1',0,0,1769683783,1769683783),(76,40,32,'1',0,0,1769683783,1769683783); +/*!40000 ALTER TABLE `nf_friend_relations` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_friend_requests` +-- + +DROP TABLE IF EXISTS `nf_friend_requests`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_friend_requests` ( + `id` int NOT NULL AUTO_INCREMENT, + `from_user_id` int DEFAULT NULL COMMENT '鐢宠浜篿d', + `to_user_id` int DEFAULT NULL COMMENT '琚敵璇蜂汉id', + `message` varchar(255) DEFAULT NULL COMMENT '鐢宠娑堟伅', + `status` enum('0','1','2') DEFAULT '0' COMMENT '鐘舵€?0=寰呭鐞?1=鍚屾剰,2=鎷掔粷', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `from_user_id` (`from_user_id`,`to_user_id`,`status`) +) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂藉弸鐢宠琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_friend_requests` +-- + +LOCK TABLES `nf_friend_requests` WRITE; +/*!40000 ALTER TABLE `nf_friend_requests` DISABLE KEYS */; +INSERT INTO `nf_friend_requests` VALUES (2,14,9,'','0',1766547820,1766547820),(4,5,8,'','0',1766558777,1766558777),(8,14,8,'121','2',1766560576,1766561218),(9,8,23,'121','0',1766563896,1766563896),(10,5,6,'','0',1766563986,1766563986),(14,19,15,'','1',1766568844,1766568885),(15,20,15,'','1',1766568921,1766568973),(16,21,15,'','0',1766568953,1766568953),(17,21,17,'','0',1766568956,1766568956),(18,14,8,'121','1',1766569472,1766569607),(22,24,7,'','0',1766731272,1766731272),(23,24,15,'','1',1766731285,1766731318),(24,24,14,'','1',1766731293,1766731338),(28,14,33,'','2',1767497553,1767497556),(29,14,33,'','1',1767497558,1767497562),(30,33,23,'','0',1767508628,1767508628),(31,42,33,'','1',1767508930,1767508948),(32,42,14,'','1',1767517907,1767517912),(33,40,14,'','1',1767518253,1767518448),(34,40,24,'','1',1767518255,1767582048),(35,40,25,'','0',1767518256,1767518256),(36,40,27,'','2',1767518258,1767689939),(37,40,32,'','1',1767518259,1769683783),(38,40,33,'','0',1767518259,1767518259),(39,40,35,'','0',1767518260,1767518260),(40,40,36,'','1',1767518262,1767949956),(41,40,41,'','1',1767518262,1767520055),(42,40,42,'','1',1767518264,1767520929),(43,40,43,'','1',1767518264,1767669611),(44,25,14,'','1',1767518445,1767518449),(45,69,14,'','1',1767520353,1767520371),(46,69,42,'','1',1767520906,1767520928),(47,24,14,'','1',1767582007,1767582025),(48,33,69,'','1',1767582575,1767582655),(49,14,43,'','1',1767669605,1767669612),(50,40,27,'','1',1767855446,1767855464),(51,40,12,'','1',1767855660,1768739908),(52,40,70,'','1',1767947807,1767947819),(53,70,36,'','1',1767967045,1767967458),(54,72,40,'','1',1768211149,1768211165),(55,14,73,'','1',1768641589,1768641604),(56,70,41,'','1',1768811715,1768811720),(57,14,41,'','1',1768891812,1768891816); +/*!40000 ALTER TABLE `nf_friend_requests` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_generation_tasks` +-- + +DROP TABLE IF EXISTS `nf_generation_tasks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_generation_tasks` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '浠诲姟ID', + `user_id` bigint DEFAULT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint DEFAULT NULL COMMENT '鎭嬩汉ID锛堝闇€锛?, + `message_id` bigint DEFAULT NULL COMMENT '鍏宠仈鑱婂ぉ娑堟伅ID锛坴oice 浠诲姟蹇呭~锛?, + `task_type` enum('image','video','outfit','voice') NOT NULL COMMENT '浠诲姟绫诲瀷', + `idempotency_key` varchar(64) DEFAULT NULL COMMENT '骞傜瓑閿槻閲嶆斁', + `status` enum('pending','running','succeeded','failed','refunded') DEFAULT 'pending' COMMENT '浠诲姟鐘舵€?, + `attempts` int DEFAULT '0' COMMENT '閲嶈瘯娆℃暟', + `payload` json DEFAULT NULL COMMENT '璇锋眰鍙傛暟', + `result_url` varchar(255) DEFAULT NULL COMMENT '缁撴灉URL', + `error_msg` varchar(255) DEFAULT NULL COMMENT '閿欒淇℃伅', + `pre_deduct` tinyint(1) DEFAULT '0' COMMENT '鏄惁棰勬墸璧勪骇', + `refunded` tinyint(1) DEFAULT '0' COMMENT '鏄惁宸查€€娆惧洖婊?, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + `is_pending` tinyint(1) GENERATED ALWAYS AS ((`status` = _utf8mb4'pending')) STORED, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_voice_message` (`task_type`,`message_id`), + UNIQUE KEY `uniq_idempotency_key` (`idempotency_key`) +) ENGINE=InnoDB AUTO_INCREMENT=381 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_generation_tasks` +-- + +LOCK TABLES `nf_generation_tasks` WRITE; +/*!40000 ALTER TABLE `nf_generation_tasks` DISABLE KEYS */; +INSERT INTO `nf_generation_tasks` (`id`, `user_id`, `lover_id`, `message_id`, `task_type`, `idempotency_key`, `status`, `attempts`, `payload`, `result_url`, `error_msg`, `pre_deduct`, `refunded`, `created_at`, `updated_at`) VALUES (261,36,49,NULL,'video','148b33d76457d844f416bf28bb87b390ef818ab61bf9c73695450ae425ba16eb','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 23, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 566, \"lover_message_id\": 567, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',NULL,0,0,'2026-01-26 14:01:33','2026-01-26 15:08:30'),(262,36,49,NULL,'video','e88b660b3e8b348e62c1b8a053c76454bc7755df0c5a52ea675cbb6430900c13','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"ext_bbox\": [276, 41, 679, 579], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"duration_sec\": 244, \"segment_count\": 5, \"user_message_id\": 588, \"lover_message_id\": 589}',NULL,'瑙嗛鐢熸垚澶辫触: Input data may contain inappropriate content.',0,0,'2026-01-26 15:30:10','2026-01-26 16:32:32'),(263,36,49,NULL,'video','f0fb8afeb32458328480f7c9d948009cf3287ac6caca43ca2c816380681529cb','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"ext_bbox\": [276, 41, 679, 579], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"duration_sec\": 244, \"segment_count\": 5, \"user_message_id\": 590, \"lover_message_id\": 591}',NULL,'瑙嗛鐢熸垚澶辫触: Input data may contain inappropriate content.',0,0,'2026-01-26 16:38:01','2026-01-26 16:38:12'),(264,36,49,NULL,'video','d5164d54bfc350e4e29af2dd5ccb85c3389226a8cd8ab90006826467983a6c35','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"ext_bbox\": [276, 41, 679, 579], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 592, \"lover_message_id\": 593}',NULL,'瑙嗛鐢熸垚澶辫触: Input data may contain inappropriate content.',0,0,'2026-01-27 00:40:32','2026-01-27 01:44:11'),(265,36,49,NULL,'video','53cb6a76099db49b2b89a199ee4f0c1673d4c10ce2d36ff85b8983423c79ecd3','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 23, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"user_message_id\": 594, \"lover_message_id\": 595, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',NULL,0,0,'2026-01-27 01:54:37','2026-01-27 09:54:37'),(266,36,49,NULL,'video','c79b4541ab7e35e75bd7c8cac7d07532d55d74f6815b08b4be878ad71544cbdc','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"ext_bbox\": [276, 41, 679, 579], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 596, \"lover_message_id\": 597}',NULL,'瑙嗛鐢熸垚澶辫触: Input data may contain inappropriate content.',0,0,'2026-01-27 02:29:40','2026-01-27 02:29:53'),(268,36,49,NULL,'video','eecdb70d0f819beeb63ab8efa24596e59d6a4d0568efda649d866f6c555143ad','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 24, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 598, \"lover_message_id\": 599, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769483924_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769483924_2.mp4',NULL,0,0,'2026-01-27 03:18:30','2026-01-27 03:19:02'),(270,36,49,NULL,'video','158936a61c531161e459bbab2cbf5d1849a57a8a24555603fdd24c938cc530ee','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 25, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 600, \"lover_message_id\": 601, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',NULL,0,0,'2026-01-27 03:30:12','2026-01-27 03:30:44'),(272,36,49,NULL,'video','074035ab1a02636cee829329393b97a5cfcb69b3ae1f3d8e211fceba4ed1945a','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 26, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"duration_sec\": 244, \"segment_count\": 5, \"user_message_id\": 602, \"lover_message_id\": 603, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4',NULL,0,0,'2026-01-27 03:42:25','2026-01-27 03:44:38'),(273,36,49,NULL,'video','67fc9133fa6fc0d2beeef3c83f47ed6bb316a9c77e65365bff77698a1fd4c607','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 3, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 27, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绾㈣壊楂樿窡闉媆", \"style_level\": \"normal\", \"duration_sec\": 207, \"segment_count\": 4, \"user_message_id\": 604, \"lover_message_id\": 605, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4',NULL,0,0,'2026-01-27 03:45:53','2026-01-27 04:40:48'),(277,70,47,NULL,'video','ce9a32142433ef9c4150419703010007c814a9ca262593989a0d5f392ba460ff','succeeded',0,'{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"璺充竴娈靛皯鏁版皯鏃忚垶韫圽", \"deducted\": true, \"duration\": 5, \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"watermark\": false, \"resolution\": \"480P\", \"session_id\": 36, \"bgm_song_id\": 4, \"bgm_duration\": 10, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"bgm_start_sec\": 104.073, \"output_duration\": 10, \"user_message_id\": 610, \"lover_message_id\": 611, \"bgm_audio_url_raw\": \"/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"dashscope_task_id\": \"363d00a8-fae0-4bbd-85a2-1ea8ad11c60b\", \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/e8/20260127/dbe10ef7/363d00a8-fae0-4bbd-85a2-1ea8ad11c60b.mp4?Expires=1769577268&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=sFM5dPjuxEQ9VNn%2FLdB5SSiZHJI%3D\"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/dance/1769490882_prompt.mp4',NULL,0,0,'2026-01-27 05:14:10','2026-01-27 05:14:43'),(278,70,47,NULL,'video','611610ca8cead75c41a645c6a6f3008d6620443feb61a75564303fed7c610b6d','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 4, \"deducted\": true, \"ext_bbox\": [270, 14, 693, 578], \"merge_id\": 22, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"style_level\": \"normal\", \"user_message_id\": 612, \"lover_message_id\": 613, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4',NULL,0,0,'2026-01-27 05:32:52','2026-01-27 13:32:52'),(280,36,49,NULL,'video','21195958520f33746406daca69b37d67584b35979f4a7c712466464ec2c4f2c2','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 4, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 28, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"style_level\": \"normal\", \"duration_sec\": 234, \"segment_count\": 4, \"user_message_id\": 616, \"lover_message_id\": 617, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4',NULL,0,0,'2026-01-27 05:36:24','2026-01-27 06:34:05'),(281,36,49,NULL,'video','e927346c4f943c33dd8ba5963d0bd09bdbb63d9b802ea764f95b203114acbf33','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 5, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 29, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"濡傛効\", \"style_level\": \"normal\", \"duration_sec\": 266, \"segment_count\": 5, \"user_message_id\": 618, \"lover_message_id\": 619, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4',NULL,0,0,'2026-01-27 07:13:23','2026-01-27 08:23:45'),(283,36,49,NULL,'video','2b03ba728389e56aad324cd7b1163e597551628b39911bd0b4692504b3e07345','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 25, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"user_message_id\": 620, \"lover_message_id\": 621, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',NULL,0,0,'2026-01-27 08:27:03','2026-01-27 16:27:02'),(285,36,49,NULL,'video','7b023bbe81594832dd137b9128c2ccbdf28906da36bff3662f18cbb567161002','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 25, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"user_message_id\": 622, \"lover_message_id\": 623, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',NULL,0,0,'2026-01-27 08:30:38','2026-01-27 16:30:37'),(286,36,49,NULL,'video','944f352c88461464ef9de38cac4096525a62363567a80feeadff57253bf5e950','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 3, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 27, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绾㈣壊楂樿窡闉媆", \"style_level\": \"normal\", \"user_message_id\": 624, \"lover_message_id\": 625, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4',NULL,0,0,'2026-01-27 08:30:41','2026-01-27 16:30:40'),(288,36,49,NULL,'video','d1b3597cbda57509dd533247cab91653b610fbfb88863f4eb65dc801143ef8a7','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 4, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 28, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"style_level\": \"normal\", \"user_message_id\": 626, \"lover_message_id\": 627, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4',NULL,0,0,'2026-01-27 08:30:45','2026-01-27 16:30:44'),(289,36,49,NULL,'video','3d790bf698badfd9083fb2692460467f374a00e079cfceb09f67ea5ab47dd51e','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 5, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 29, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"濡傛効\", \"style_level\": \"normal\", \"user_message_id\": 628, \"lover_message_id\": 629, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4',NULL,0,0,'2026-01-27 08:30:49','2026-01-27 16:30:48'),(291,36,49,NULL,'video','1b543f10b6fe160e2e3377ee49e567998fc2f383f60b2c2f25952a7346e3b8f5','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 23, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"user_message_id\": 630, \"lover_message_id\": 631, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',NULL,0,0,'2026-01-27 08:31:05','2026-01-27 16:31:05'),(293,36,49,NULL,'video','da855008f143eac7bb5914be174a0d6e79445bb94e9ef777b70db57dc8d58361','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 26, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"user_message_id\": 632, \"lover_message_id\": 633, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4',NULL,0,0,'2026-01-27 08:31:13','2026-01-27 16:31:12'),(294,36,49,NULL,'video','c29ec5e41bdd5f383a3e3ce3991cce857f28acaeaba1a17c17fe3bf48e1cb4d6','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 6, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 30, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€璺敓鑺盶", \"style_level\": \"normal\", \"duration_sec\": 257, \"segment_count\": 5, \"user_message_id\": 634, \"lover_message_id\": 635, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769506690_6.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769506690_6.mp4',NULL,0,0,'2026-01-27 08:31:17','2026-01-27 09:38:29'),(296,36,49,NULL,'video','b1a6d4806266c92d4d5c9455807a26ea713ba595923494050d345f4168a4ad38','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 23, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"user_message_id\": 636, \"lover_message_id\": 637, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',NULL,0,0,'2026-01-27 09:54:41','2026-01-27 17:54:41'),(298,36,49,NULL,'video','a9965cf684f10f5a265e90901147b508993451d648d2b53d7aba300e711eded4','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 26, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"user_message_id\": 638, \"lover_message_id\": 639, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4',NULL,0,0,'2026-01-27 09:54:45','2026-01-27 17:54:44'),(299,36,49,NULL,'video','9d60bdfd1168b3be22a7e3041b842a2a0f779b608db296887c013f9d50a6098c','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 6, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 30, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€璺敓鑺盶", \"style_level\": \"normal\", \"user_message_id\": 640, \"lover_message_id\": 641, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769506690_6.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769506690_6.mp4',NULL,0,0,'2026-01-27 09:54:48','2026-01-27 17:54:48'),(301,36,49,NULL,'video','99e80ad4cd547f3fc2c1a8cb596f07176143990741ed28f7c6688d91a8c304f6','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 5, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 29, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"濡傛効\", \"style_level\": \"normal\", \"user_message_id\": 642, \"lover_message_id\": 643, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4',NULL,0,0,'2026-01-27 09:54:51','2026-01-27 17:54:51'),(303,36,49,NULL,'video','09659d21bab062ccc6605d2be7035afba5d02580451d2377a0aaa38f9047f775','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 4, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 28, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"style_level\": \"normal\", \"user_message_id\": 644, \"lover_message_id\": 645, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4',NULL,0,0,'2026-01-27 09:54:54','2026-01-27 17:54:53'),(305,36,49,NULL,'video','9a7eb2aa2b0d3eb3f3a6157bc2e2b9b65e223a479ebad7add44865267cd669d9','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 3, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 27, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"绾㈣壊楂樿窡闉媆", \"style_level\": \"normal\", \"user_message_id\": 646, \"lover_message_id\": 647, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4',NULL,0,0,'2026-01-27 09:54:56','2026-01-27 17:54:56'),(307,36,49,NULL,'video','9ef4e05b785c3cf17815338c0ca7e0cdbffe7bda4adbfb5916cc14e6dd41b7b2','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 25, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"user_message_id\": 648, \"lover_message_id\": 649, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',NULL,0,0,'2026-01-27 09:54:59','2026-01-27 17:54:58'),(309,36,49,NULL,'video','b303719c5197c06ddb57834b0032f2c657d85688de51b2f7e9aeb1634b735ace','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 25, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"user_message_id\": 650, \"lover_message_id\": 651, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4',NULL,0,0,'2026-01-27 10:05:32','2026-01-27 18:05:32'),(311,36,49,NULL,'video','929bd59463b3296a4f9ff96d469ce6f0a0a2801d0311561bdb24981a0595ddb1','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [276, 41, 679, 579], \"merge_id\": 23, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [430, 171, 525, 266], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f\", \"session_id\": 37, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"user_message_id\": 652, \"lover_message_id\": 653, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4',NULL,0,0,'2026-01-27 10:06:06','2026-01-27 18:06:05'),(312,36,49,NULL,'video','ba64fc9cf59074f941b369c0742e3d7caeab718a4f706e8c2390f2efe586af9d','succeeded',0,'{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"鍏斿瓙鑸瀄", \"deducted\": true, \"duration\": 5, \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769073767_outfit.jpg\", \"watermark\": false, \"resolution\": \"480P\", \"session_id\": 37, \"bgm_song_id\": 5, \"bgm_duration\": 10, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"bgm_start_sec\": 103.403, \"output_duration\": 10, \"user_message_id\": 654, \"lover_message_id\": 655, \"bgm_audio_url_raw\": \"/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"dashscope_task_id\": \"b3f2ad3d-aadb-4365-84a7-96fc726f3bac\", \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/1a/20260127/dbe10ef7/b3f2ad3d-aadb-4365-84a7-96fc726f3bac.mp4?Expires=1769595797&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=0%2BTLB2fVCP1Z2Am6%2FmBd%2BSERAwo%3D\"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/dance/1769509415_prompt.mp4',NULL,0,0,'2026-01-27 10:22:58','2026-01-27 10:23:39'),(313,41,50,NULL,'video','32811b104dd90f6844cb6b91e5b587e81106152ffd08d145a1b5ce9495c5158a','succeeded',0,'{\"model\": \"wan2.2-i2v-flash\", \"prompt\": \"鎷変竵鑸瀄", \"deducted\": true, \"duration\": 5, \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/39/images/1767519963_outfit.jpg\", \"watermark\": false, \"resolution\": \"480P\", \"session_id\": 38, \"bgm_song_id\": 9, \"bgm_duration\": 10, \"bgm_audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"bgm_start_sec\": 124.908, \"output_duration\": 10, \"user_message_id\": 662, \"lover_message_id\": 663, \"bgm_audio_url_raw\": \"/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"dashscope_task_id\": \"a99f33af-786a-4c7a-b862-0b22c0810293\", \"dashscope_video_url\": \"https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/97/20260127/a599dc0c/a99f33af-786a-4c7a-b862-0b22c0810293.mp4?Expires=1769595862&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=KAUVvaQtgVl%2FQIwf6ZUpbew%2Fgxg%3D\"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/dance/1769509484_prompt.mp4',NULL,0,0,'2026-01-27 10:24:03','2026-01-27 10:24:45'),(314,78,57,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氶珮椹熬锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細楂橀┈灏惧ぇ娉㈡氮锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"楂橀┈灏惧ぇ娉㈡氮\", \"eye_color_id\": 10, \"hair_style_id\": 18, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"楂橀┈灏綷", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/57/images/1769515106_female.png',NULL,0,0,'2026-01-27 11:58:10','2026-01-27 11:58:26'),(316,36,49,NULL,'video','28b202fee787c38ff332e7c2cc9fe070108030968128be46051a7d811ca41c90','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [268, 43, 683, 595], \"merge_id\": 31, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [430, 174, 525, 268], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769513875_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920\", \"session_id\": 37, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 670, \"lover_message_id\": 671, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4',NULL,0,0,'2026-01-28 05:51:50','2026-01-28 06:55:25'),(318,81,58,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鐨偆鐧斤紝涓瓙楂橈紝涓滀簹浜鸿劯锛屼腑鍥介潰瀛旓紝鑲よ壊鑷劧锛屼簲瀹樺崗璋冿紝鐪熶汉鐓х墖椋庢牸锛岀湡瀹炴憚褰憋紝濂虫€э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐗涗粩瑁ゅ瓙锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐗涗粩瑁ゅ瓙\", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/58/images/1769604536_female.png',NULL,0,0,'2026-01-28 12:48:38','2026-01-28 12:48:58'),(322,81,58,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鐨偆鐧斤紝涓瓙楂橈紝涓滀簹浜鸿劯锛屼腑鍥介潰瀛旓紝鑲よ壊鑷劧锛屼簲瀹樺崗璋冿紝鐪熶汉鐓х墖椋庢牸锛岀湡瀹炴憚褰憋紝濂虫€э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷\", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/58/images/1769604806_female.png',NULL,0,0,'2026-01-28 12:53:06','2026-01-28 12:53:27'),(323,81,58,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鐨偆鐧斤紝涓瓙楂橈紝涓滀簹浜鸿劯锛屼腑鍥介潰瀛旓紝鑲よ壊鑷劧锛屼簲瀹樺崗璋冿紝鐪熶汉鐓х墖椋庢牸锛岀湡瀹炴憚褰憋紝濂虫€э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷\", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/58/images/1769604841_female.png',NULL,0,0,'2026-01-28 12:53:43','2026-01-28 12:54:02'),(326,81,58,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鐨偆鐧斤紝涓瓙楂橈紝涓版弧锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/58/images/1769604955_female.png',NULL,0,0,'2026-01-28 12:55:30','2026-01-28 12:55:56'),(328,82,59,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鍝堝搱鍝堝搱鍝堝搱锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐧借壊鐨勮。鏈嶏紝绌跨潃闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐧借壊鐨勮。鏈峔", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/59/images/1769605499_female.png',NULL,0,0,'2026-01-28 13:04:41','2026-01-28 13:05:00'),(329,82,59,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"鍝堝搱鍝堝搱鍝堝搱锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鐧借壊鐨勮。鏈嶏紝绌跨潃闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鐧借壊鐨勮。鏈峔", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/59/images/1769605536_female.png',NULL,0,0,'2026-01-28 13:05:17','2026-01-28 13:05:37'),(330,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鑱屼笟姝h锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鑱屼笟姝h\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611715_female.png',NULL,0,0,'2026-01-28 14:48:11','2026-01-28 14:48:35'),(331,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細鑱屼笟姝h锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"鑱屼笟姝h\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611747_female.png',NULL,0,0,'2026-01-28 14:48:47','2026-01-28 14:49:08'),(332,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绡悆鏈嶇潯琛o紝绌跨潃闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绡悆鏈嶇潯琛", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611790_female.png',NULL,0,0,'2026-01-28 14:49:32','2026-01-28 14:49:51'),(333,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绡悆鑳屽績鐫¤。锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绡悆鑳屽績鐫¤。\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611822_female.png',NULL,0,0,'2026-01-28 14:50:04','2026-01-28 14:50:23'),(334,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绡悆鑳屽績鐫¤。锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绡悆鑳屽績鐫¤。\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611843_female.png',NULL,0,0,'2026-01-28 14:50:28','2026-01-28 14:50:44'),(335,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川楂樺喎锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绡悆鑳屽績鐫¤。锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绡悆鑳屽績鐫¤。\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611867_female.png',NULL,0,0,'2026-01-28 14:50:47','2026-01-28 14:51:08'),(336,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川娲绘臣锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绾㈣壊绡悆鑳屽績鐫¤锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绾㈣壊绡悆鑳屽績鐫¤\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611959_female.png',NULL,0,0,'2026-01-28 14:52:21','2026-01-28 14:52:39'),(337,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川娲绘臣锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绾㈣壊绡悆鑳屽績鐫¤锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绾㈣壊绡悆鑳屽績鐫¤\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769611986_female.png',NULL,0,0,'2026-01-28 14:52:48','2026-01-28 14:53:07'),(338,83,60,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川娲绘臣锛屼笢浜氫汉鑴革紝涓浗闈㈠瓟锛岃偆鑹茶嚜鐒讹紝浜斿畼鍗忚皟锛岀湡浜虹収鐗囬鏍硷紝鐪熷疄鎽勫奖锛屽コ鎬э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬ぇ娉㈡氮锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绾㈣壊绡悆鑳屽績鐫¤锛岀┛鐫€闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绾㈣壊绡悆鑳屽績鐫¤\", \"eye_color_id\": 10, \"hair_style_id\": 13, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"澶ф尝娴猏", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769612005_female.png',NULL,0,0,'2026-01-28 14:53:10','2026-01-28 14:53:26'),(339,32,61,NULL,'image',NULL,'succeeded',0,'{\"size\": \"960*1280\", \"model\": \"wan2.5-t2i-preview\", \"style\": \"\", \"gender\": \"female\", \"prompt\": \"骞撮緞18宀侊紝鐡滃瓙鑴革紝涓滀簹浜鸿劯锛屼腑鍥介潰瀛旓紝鑲よ壊鑷劧锛屼簲瀹樺崗璋冿紝鐪熶汉鐓х墖椋庢牸锛岀湡瀹炴憚褰憋紝濂虫€э紝姝i潰鍏ㄨ韩绔欑珛锛岀珯鍦ㄥ湴闈紝鍙岃吙鍙岃剼瀹屾暣娓呮櫚鍙锛屾棤閬尅韬綋锛屽厜绾胯嚜鐒讹紝鍙戝瀷锛氬叕涓诲垏锛涚灣鑹诧細娣遍粦鑹诧紝浠呯灣瀛斿憟鐜版棰滆壊锛屽珐鑶滀繚鎸佹磥鐧借嚜鐒讹紝涓嶅彂鍏夛紱鐫€瑁咃細绌跨櫧鑹叉牎鏈嶏紝鐧炬瑁欙紝绌跨潃闉嬪瓙鍜屾湇楗帮紝涓旀湇楗拌。鐗╁畬鏁磋鐩栬韩浣擄紝閬垮厤瑁搁湶锛岀毊鑲よ川鎰熺湡瀹烇紝楂樻竻缁嗚妭锛屽ご韬瘮渚嬬害 1:7.5锛屾瘮渚嬭嚜鐒讹紝濮挎€佽嚜鐒讹紝鐪肩潧鑷劧涓嶈繃楗卞拰锛屾棤鎴忓墽鍖栧厜鏁圽", \"outfit_desc\": \"绌跨櫧鑹叉牎鏈嶏紝鐧炬瑁橽", \"eye_color_id\": 10, \"hair_style_id\": 21, \"eye_color_name\": \"娣遍粦鑹瞈", \"hair_style_name\": \"鍏富鍒嘰", \"negative_prompt\": \"鍗婅韩鐓э紝鐗瑰啓锛屽彧闇蹭笂鍗婅韩锛岀己澶辫吙锛岀己澶辫剼锛屽彧鍒拌啙鐩栵紝缂哄け韬共锛屽彧鏈夊ご鍜岃剼锛屽彧鏈夊ご锛屾紓娴殑澶达紝韬綋琚埅鏂紝瑁佸壀韬綋锛屾诞绌鸿剼锛屽厜鑴氾紝璧よ剼锛宐arefoot锛屽彂鍏夌溂鐫涳紝glowing eyes锛宭uminous eyes锛宻hining eyes锛宔yes with light effects锛岃崸鍏夌溂鐫涳紝婵€鍏夌溂锛岀溂鐫涘彂鍏夛紝鐪肩潧鍐掑厜锛岀溂鐫涘皠鍏夛紝铏硅啘鍙戝厜锛岀灣瀛斿彂鍏夛紝鍏夌溂锛岀溂鐫涢棯鍏夛紝鍗¢€氾紝鍔ㄦ极锛屼簩娆″厓锛屾彃鐢伙紝Q鐗堬紝chibi锛宐ig head锛宭arge head锛宒isproportionate head锛屽じ寮犲ぇ澶达紝澶уご濞冨▋锛岀帺鍋讹紝濞冨▋鑴革紝濉戞枡鎰燂紝濉戞枡璐ㄦ劅锛岃湣鍍忥紝3d render锛宑g render锛屾覆鏌撴劅锛屽皬瀛╋紝鍎跨锛屾湭鎴愬勾锛屽辜骞达紝鍎跨鑴革紝绔ラ锛屽┐鍎胯劯锛宐aby锛宑hild锛宼een锛屽鍥戒汉锛屾缇庝汉锛岃鍓紝鎴柇锛岃儗褰憋紝妯$硦锛屼綆鍒嗚鲸鐜囷紝澶氫綑鑲綋锛岀暩褰紝瑁镐綋锛岃8闇诧紝涓嶇┛琛f湇锛屼笉绌夸笂瑁咃紝涓嶇┛涓嬭锛宯ude锛宯sfw锛岄€忔槑琛f湇锛屾暣鍙溂鐞冨彉鑹瞈"}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/images/1769683756_female.png',NULL,0,0,'2026-01-29 10:48:58','2026-01-29 10:49:17'),(341,32,61,NULL,'video','a34ceb7afc4a874a9645aa1cb350058a6a22f4fab99281fd939441a13d758070','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"deducted\": true, \"ext_bbox\": [280, 16, 702, 579], \"merge_id\": 32, \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [440, 142, 546, 248], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/images/1769683756_female.png\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95\", \"session_id\": 47, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 743, \"lover_message_id\": 744, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/1769696077_2.mp4\", \"content_safety_blocked\": true}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/1769696077_2.mp4',NULL,0,0,'2026-01-29 13:11:06','2026-01-29 14:14:53'),(344,70,47,NULL,'video','67dd75dd2305b3c57d795c884a045a254e45bdfcd9027194fb495108e6713537','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 753, \"lover_message_id\": 754}',NULL,'浠诲姟宸插彇娑堬紙鏁版嵁搴撳垏鎹級',0,0,'2026-02-02 02:26:22','2026-02-02 10:29:18'),(346,70,47,NULL,'video','e0fd4cf3ce75250e9ba4efd95e4b24955dc63b8b736f86f15a42957fa96f3c40','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 755, \"lover_message_id\": 756}',NULL,'浠诲姟瓒呮椂宸插彇娑?,0,0,'2026-02-02 02:29:38','2026-02-02 10:33:11'),(348,70,47,NULL,'video','282d9052da698b432b42de0f26ffb6f4691cc47ff5ae5816feeaa79b87702408','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 757, \"lover_message_id\": 758}',NULL,'浠诲姟宸插彇娑堬紙娣诲姞璋冭瘯鏃ュ織锛?,0,0,'2026-02-02 02:34:14','2026-02-02 10:37:01'),(350,70,47,NULL,'video','b190b07e17a2f45ce1510b897323ec97c6d03c10400fc3ea5bbded2342806bba','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 759, \"lover_message_id\": 760}',NULL,'浠诲姟宸插彇娑堬紙璋冭瘯 worker锛?,0,0,'2026-02-02 02:38:02','2026-02-02 10:40:58'),(351,70,47,NULL,'video','187d106e3aff52e9e2d378f0278b7d209dc1e23c3ac11451676c7bcaa8c9b33c','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 6, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€璺敓鑺盶", \"style_level\": \"normal\", \"duration_sec\": 257, \"segment_count\": 5, \"user_message_id\": 761, \"lover_message_id\": 762}',NULL,'浠诲姟宸插彇娑堬紙淇 worker 鍚姩锛?,0,0,'2026-02-02 02:41:43','2026-02-02 10:42:53'),(353,70,47,NULL,'video','62ceab5910918c0f1cf67cab2da1f17b000c650886e4a350920a01792f562efb','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 6, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€璺敓鑺盶", \"style_level\": \"normal\", \"duration_sec\": 257, \"segment_count\": 5, \"user_message_id\": 763, \"lover_message_id\": 764}',NULL,'鎵嬪姩鍙栨秷浠ラ噸鏂版祴璇?,0,0,'2026-02-02 02:45:16','2026-02-02 10:46:45'),(354,70,47,NULL,'video','5ae1e7c1592f2d5da004184e45c5f4304d9b7cca94071d75a48b4f5019fbce6b','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 3, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"绾㈣壊楂樿窡闉媆", \"style_level\": \"normal\", \"duration_sec\": 207, \"segment_count\": 4, \"user_message_id\": 765, \"lover_message_id\": 766}',NULL,'鎵嬪姩鍙栨秷-妫€鏌ユā鍨嬭皟鐢?,0,0,'2026-02-02 02:47:59','2026-02-02 10:52:03'),(356,70,47,NULL,'video','092fd11aa47e4e7d6ba516850d5303361e08fbaed42021297e3bcbb9c9d0e6bc','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 3, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"绾㈣壊楂樿窡闉媆", \"style_level\": \"normal\", \"duration_sec\": 207, \"segment_count\": 4, \"user_message_id\": 767, \"lover_message_id\": 768}',NULL,'鎵嬪姩鍙栨秷-娣诲姞璇︾粏鏃ュ織',0,0,'2026-02-02 02:54:12','2026-02-02 10:55:27'),(357,70,47,NULL,'video','b0d9eb45a44944595a8d4d8eba0733014f114734b254eb1a2f67f155c4e1d77a','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 2, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"鏉ョ敓缂榎", \"style_level\": \"normal\", \"duration_sec\": 288, \"segment_count\": 5, \"user_message_id\": 769, \"lover_message_id\": 770}',NULL,'鎵嬪姩鍙栨秷-娣诲姞瀹屾暣鏃ュ織',0,0,'2026-02-02 02:55:47','2026-02-02 11:07:58'),(359,70,47,NULL,'video','a52ae47e211c14fe10b5108c886bec73d6b9a6ea4b70f5cee585cfc5d8ddc60c','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 6, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€璺敓鑺盶", \"style_level\": \"normal\", \"duration_sec\": 257, \"segment_count\": 5, \"user_message_id\": 771, \"lover_message_id\": 772}',NULL,'鏈嶅姟鍣ㄩ噸鍚紝璇烽噸鏂扮敓鎴?,0,0,'2026-02-02 03:08:15','2026-02-02 12:03:09'),(361,70,47,NULL,'video','0c8f8ddd1e73cb9e520fabbab864c25071ede327820fefd0ac19914ba31d4f9f','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 773, \"lover_message_id\": 774}',NULL,'绯荤粺閿欒锛岃閲嶆柊鐢熸垚',0,0,'2026-02-02 04:04:07','2026-02-02 12:05:46'),(363,70,47,NULL,'video','63247d6b72a48d3f38db3a9d02e6a6fbf1042bbe81afd1d0be525f68a985a080','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 775, \"lover_message_id\": 776}',NULL,'Instance is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)',0,0,'2026-02-02 04:06:01','2026-02-02 04:33:40'),(365,70,47,NULL,'video','1850e14e349fd866bde0bcbdfcfca97ad040c9c9e9f44ecea97e95dfcb623b40','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 777, \"lover_message_id\": 778}',NULL,'鏂囦欢涓嬭浇澶辫触',0,0,'2026-02-02 05:13:45','2026-02-02 05:47:46'),(366,70,47,NULL,'video','31f84e934250bf68d3aee17dedc418999c36c5e431b4cdde03752f6bf7494e27','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 4, \"deducted\": true, \"merge_id\": 22, \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3\", \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"绂诲紑鎴戠殑渚濊禆\", \"style_level\": \"normal\", \"user_message_id\": 781, \"lover_message_id\": 782, \"merged_video_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4\", \"content_safety_blocked\": false}','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4',NULL,0,0,'2026-02-02 06:53:24','2026-02-02 14:53:23'),(368,70,47,NULL,'video','d0a39bd1f89947308af75f9ceb7b3b1ff732aede552d0f1a16f722adc90e1238','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 783, \"lover_message_id\": 784}',NULL,'鏂囦欢涓嬭浇澶辫触',0,0,'2026-02-02 06:53:48','2026-02-02 06:53:49'),(370,70,47,NULL,'video','4301f30269b0e3f858c50c35c921723fa2b39c16521cd8cfc506b73b0e5fe432','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 785, \"lover_message_id\": 786}',NULL,'name \'logger\' is not defined',0,0,'2026-02-03 01:26:57','2026-02-03 01:26:57'),(371,70,47,NULL,'video','b06859b8d8ed1b6cbf7c2932b65e0fbb883cd4b508ff17c829fbb419e9e477d1','pending',0,'{\"ratio\": \"3:4\", \"song_id\": 7, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"鏆栨殩\", \"style_level\": \"normal\", \"duration_sec\": 244, \"manual_retry\": true, \"segment_count\": 5, \"user_message_id\": 787, \"lover_message_id\": 788}',NULL,NULL,0,0,'2026-02-03 01:29:22','2026-02-03 06:43:37'),(373,70,47,NULL,'video','f40a44e413f25b6197831993ce286f0f0fff683cd2f4167d703e521d8415ee92','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 791, \"lover_message_id\": 792}',NULL,'name \'logger\' is not defined',0,0,'2026-02-03 02:06:33','2026-02-03 02:06:33'),(375,70,47,NULL,'video','f8ffefeefeddb1c485db3b2e05bdbec3b6a915d431a75be6cf6f8f339e36e849','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"segment_count\": 5, \"user_message_id\": 793, \"lover_message_id\": 794}',NULL,'name \'logger\' is not defined',0,0,'2026-02-03 02:06:44','2026-02-03 02:06:44'),(377,70,47,NULL,'video','6c8b6dabe9a6c1d48ab887cc5f9e766ec8dd1cb6383b3408f8cc51cebee6be8e','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"deducted\": true, \"ext_bbox\": [270, 14, 693, 578], \"merge_id\": 33, \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"manual_retry\": true, \"segment_count\": 5, \"user_message_id\": 795, \"lover_message_id\": 796, \"merged_video_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770100721_9.mp4\", \"content_safety_blocked\": false}','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770100721_9.mp4',NULL,0,0,'2026-02-03 02:12:52','2026-02-03 06:38:45'),(379,70,47,NULL,'video','ca9685f25c3ccf5adee9b5bc6d900fdd8e800cefef93113445b5c980f6d66ebc','failed',0,'{\"ratio\": \"3:4\", \"song_id\": 9, \"ext_bbox\": [270, 14, 693, 578], \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"涓€鍗婁竴鍗奬", \"style_level\": \"normal\", \"duration_sec\": 249, \"manual_retry\": true, \"segment_count\": 5, \"user_message_id\": 797, \"lover_message_id\": 798}',NULL,'ffmpeg 鏈畨瑁呮垨涓嶅彲鐢?,0,0,'2026-02-03 02:15:15','2026-02-03 06:33:25'),(380,70,47,NULL,'video','ac593f7830639c454edff251115adddcbc0b7be3dd3897a2886607749b6f1c85','succeeded',0,'{\"ratio\": \"3:4\", \"song_id\": 5, \"deducted\": true, \"ext_bbox\": [270, 14, 693, 578], \"merge_id\": 34, \"audio_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3\", \"face_bbox\": [429, 111, 533, 215], \"image_url\": \"https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg\", \"audio_hash\": \"e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852\", \"image_hash\": \"0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a\", \"session_id\": 36, \"song_title\": \"濡傛効\", \"style_level\": \"normal\", \"duration_sec\": 266, \"manual_retry\": true, \"segment_count\": 5, \"user_message_id\": 803, \"lover_message_id\": 804, \"merged_video_url\": \"https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770101009_5.mp4\", \"content_safety_blocked\": false}','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770101009_5.mp4',NULL,0,0,'2026-02-03 02:21:34','2026-02-03 06:43:36'); +/*!40000 ALTER TABLE `nf_generation_tasks` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_gifts` +-- + +DROP TABLE IF EXISTS `nf_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL COMMENT '绀肩墿鍚嶇О', + `title` varchar(255) DEFAULT NULL COMMENT '鏍囬', + `price` decimal(10,2) DEFAULT NULL COMMENT '绀肩墿浠锋牸', + `intimacy_value` int DEFAULT '0' COMMENT '浜插瘑搴?, + `image` varchar(255) DEFAULT NULL COMMENT '鍥剧墖', + `weigh` varchar(255) DEFAULT '0' COMMENT '鏉冮噸', + `status` enum('0','1') DEFAULT '1' COMMENT '鐘舵€?1=涓婃灦,0=涓嬫灦', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绀肩墿'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_gifts` +-- + +LOCK TABLES `nf_gifts` WRITE; +/*!40000 ALTER TABLE `nf_gifts` DISABLE KEYS */; +INSERT INTO `nf_gifts` VALUES (1,'鐜懓鑺?,'閫佸ス涓€鏈电帿鐟拌姳锛岃〃杈句綘鐨勭埍鎰?,10.00,10,'/uploads/gifts/rose.png','100','1',1770192020,1770192020),(2,'妫掓绯?,'鐢滅敎鐨勬妫掔硸锛岀敎鍒板績閲?,10.00,10,'/uploads/gifts/lollipop.png','99','1',1770192020,1770192020),(3,'鍜栧暋','涓€鏉娴撳挅鍟★紝娓╂殩濂圭殑蹇?,15.00,15,'/uploads/gifts/coffee.png','98','1',1770192020,1770192020),(4,'鍐版穱娣?,'澶忔棩娓呭噳锛岀敎铚滅浉浼?,15.00,15,'/uploads/gifts/icecream.png','97','1',1770192020,1770192020),(5,'灏忚泲绯?,'绮捐嚧灏忚泲绯曪紝鐢滆湝鏃跺厜',20.00,20,'/uploads/gifts/cake.png','96','1',1770192020,1770192020),(6,'宸у厠鍔?,'娴撴儏宸у厠鍔涳紝鐖辨剰婊℃弧',20.00,20,'/uploads/gifts/chocolate.png','95','1',1770192020,1770192020),(7,'濂惰尪','棣欓唶濂惰尪锛屾俯鏆栭櫔浼?,25.00,25,'/uploads/gifts/milktea.png','94','1',1770192020,1770192020),(8,'鐖卞績姘旂悆','娴极鐖卞績姘旂悆锛屼紶閫掔埍鎰?,35.00,35,'/uploads/gifts/heart_balloon.png','92','1',1770192020,1770192020),(9,'灏忕ぜ鐗╃洅','绁炵绀肩墿鐩掞紝鎯婂枩涓嶆柇',40.00,40,'/uploads/gifts/gift_box.png','91','1',1770192020,1770192020),(10,'褰╄櫣','缇庝附褰╄櫣锛屽甫鏉ュソ杩?,50.00,50,'/uploads/gifts/rainbow.png','90','1',1770192020,1770192020),(11,'棣欐','搴嗙鏃跺埢锛岄妲熺浉浼?,50.00,50,'/uploads/gifts/champagne.png','89','1',1770192020,1770192020),(12,'閽荤煶','鐠€鐠ㄩ捇鐭筹紝姘告亽鐨勭埍',80.00,80,'/uploads/gifts/diamond.png','88','1',1770192020,1770192020),(13,'鐜嬪啝','濂崇帇鐜嬪啝锛屽皧璐佃薄寰?,100.00,100,'/uploads/gifts/crown.png','87','1',1770192020,1770192020),(14,'鐖卞績','澶х埍蹇冿紝婊℃弧鐖辨剰',100.00,100,'/uploads/gifts/big_heart.png','86','1',1770192020,1770192020),(15,'鏈堜寒','鐨庢磥鏈堜寒锛屾氮婕鏅?,120.00,120,'/uploads/gifts/moon.png','85','1',1770192020,1770192020),(16,'鐑熻姳','缁氫附鐑熻姳锛屾氮婕唤鏀?,150.00,150,'/uploads/gifts/fireworks.png','84','1',1770192020,1770192020),(17,'姘存櫠鐞?,'榄旀硶姘存櫠鐞冿紝璁告効鎴愮湡',150.00,150,'/uploads/gifts/crystal_ball.png','83','1',1770192020,1770192020),(18,'鐜懓鑺辨潫','99鏈电帿鐟帮紝闀块暱涔呬箙',180.00,180,'/uploads/gifts/rose_bouquet.png','82','1',1770192020,1770192020),(19,'鏄熸槦椤归摼','闂寒鏄熸槦椤归摼锛岀偣缂€缇庝附',200.00,200,'/uploads/gifts/star_necklace.png','81','1',1770192020,1770192020),(20,'璺戣溅','璞崕璺戣溅锛岄€熷害涓庢縺鎯?,300.00,300,'/uploads/gifts/sports_car.png','80','1',1770192020,1770192020),(21,'椋炴満','绉佷汉椋炴満锛岃嚜鐢辩勘缈?,400.00,400,'/uploads/gifts/airplane.png','79','1',1770192020,1770192020),(22,'娓歌墖','璞崕娓歌墖锛屾捣涓婃氮婕?,450.00,450,'/uploads/gifts/yacht.png','78','1',1770192020,1770192020),(23,'鍩庡牎','姊﹀够鍩庡牎锛屽叕涓荤殑姊?,500.00,500,'/uploads/gifts/castle.png','77','1',1770192020,1770192020),(24,'瀹囧畽椋炶埞','鎺㈢储瀹囧畽锛屾棤闄愬彲鑳?,600.00,600,'/uploads/gifts/spaceship.png','76','1',1770192020,1770192020),(25,'榄旀硶妫?,'绁炲榄旀硶妫掞紝瀹炵幇鎰挎湜',1000.00,1000,'/uploads/gifts/magic_wand.png','74','1',1770192020,1770192020),(26,'鍦h癁鏍?,'鍦h癁鏍戯紝鑺傛棩姘涘洿',200.00,200,'/uploads/gifts/christmas_tree.png','72','1',1770192020,1770192020),(27,'鎯呬汉鑺傚阀鍏嬪姏','鎯呬汉鑺傞檺瀹氾紝鐢滆湝鍔犲€?,520.00,520,'/uploads/gifts/valentine_chocolate.png','71','1',1770192020,1770192020),(28,'鐢熸棩铔嬬硶','鐢熸棩铔嬬硶锛岀敓鏃ュ揩涔?,188.00,188,'/uploads/gifts/birthday_cake.png','70','1',1770192020,1770192020),(29,'涓囧湥鑺傚崡鐡?,'涓囧湥鑺傚崡鐡滐紝绁炵鏈夎叮',150.00,150,'/uploads/gifts/halloween_pumpkin.png','69','1',1770192020,1770192020); +/*!40000 ALTER TABLE `nf_gifts` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_gifts_log` +-- + +DROP TABLE IF EXISTS `nf_gifts_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_gifts_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `from_user_id` int DEFAULT NULL COMMENT '鍙戠ぜ鐗╃殑鐢ㄦ埛id', + `to_user_id` int DEFAULT NULL COMMENT '鎺ユ敹绀肩墿鐨勭敤鎴穒d', + `gifts_id` int DEFAULT NULL COMMENT '绀肩墿id', + `nums` int DEFAULT '1' COMMENT '璧犻€佹暟閲?, + `name` varchar(255) DEFAULT NULL COMMENT '绀肩墿鍚嶇О', + `image` varchar(255) DEFAULT NULL COMMENT '绀肩墿鍥剧墖', + `intimacy_value` int DEFAULT '0' COMMENT '浜插瘑搴?, + `createtime` bigint DEFAULT NULL COMMENT '璧犻€佹椂闂?, + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `type` tinyint DEFAULT '1' COMMENT '璧犻€佺被鍨?濂藉弸2铏氭嫙濂冲弸', + PRIMARY KEY (`id`), + KEY `from_user_id` (`from_user_id`,`to_user_id`,`gifts_id`) +) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绀肩墿璧犻€佽褰?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_gifts_log` +-- + +LOCK TABLES `nf_gifts_log` WRITE; +/*!40000 ALTER TABLE `nf_gifts_log` DISABLE KEYS */; +INSERT INTO `nf_gifts_log` VALUES (1,8,14,1,1,'蹇冩効鐡?,'',10,1766569894,1766569895,1),(3,8,14,2,1,'褰╄櫣','',20,1766642034,1766642035,1),(4,12,0,1,2,'蹇冩効鐡?,'',20,1766737708,1766737708,2),(5,8,14,1,1,'蹇冩効鐡?,'',10,1766822220,1766822220,1),(6,14,8,3,1,'鐖卞績淇″皝','',30,1766822839,1766822839,1),(7,14,8,3,1,'鐖卞績淇″皝','',30,1766822868,1766822868,1),(8,14,8,3,1,'鐖卞績淇″皝','',30,1766822872,1766822872,1),(9,14,8,3,1,'鐖卞績淇″皝','',30,1766822906,1766822906,1),(10,14,8,3,1,'鐖卞績淇″皝','',30,1766822908,1766822908,1),(11,14,8,3,1,'鐖卞績淇″皝','',30,1766822941,1766822941,1),(12,14,8,3,1,'鐖卞績淇″皝','',30,1766822945,1766822945,1),(13,14,8,2,1,'褰╄櫣','',20,1766823048,1766823048,1),(14,14,0,3,1,'鐖卞績淇″皝','',30,1766823767,1766823767,2),(15,14,8,3,1,'鐖卞績淇″皝','',30,1766823880,1766823880,1),(16,14,8,3,1,'鐖卞績淇″皝','',30,1766827162,1766827162,1),(17,14,8,3,1,'鐖卞績淇″皝','',30,1766827196,1766827196,1),(18,14,8,3,2,'鐖卞績淇″皝','',60,1766827320,1766827320,1),(19,14,8,3,1,'鐖卞績淇″皝','',30,1766827414,1766827414,1),(20,15,0,3,5,'鐖卞績淇″皝','',150,1766886845,1766886845,2),(21,15,0,1,10,'蹇冩効鐡?,'',100,1766886875,1766886875,2),(22,15,0,3,1,'鐖卞績淇″皝','',30,1766889358,1766889358,2),(23,15,0,3,1,'鐖卞績淇″皝','',30,1767085363,1767085363,2),(24,14,13,2,1,'褰╄櫣','',20,1767148579,1767148579,1),(25,27,0,2,14,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',280,1767178026,1767178026,2),(26,31,0,2,9,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',180,1767183149,1767183149,2),(27,31,0,2,8,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',160,1767183159,1767183159,2),(28,31,0,2,5,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',100,1767184418,1767184418,2),(29,31,0,1,10,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',100,1767184436,1767184436,2),(30,31,0,3,10,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',300,1767184488,1767184488,2),(31,36,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767189180,1767189180,2),(32,36,0,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767189186,1767189186,2),(33,36,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767189191,1767189191,2),(34,36,0,2,2,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',40,1767189272,1767189272,2),(35,36,0,1,6,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',60,1767189279,1767189279,2),(36,36,0,3,12,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',360,1767189286,1767189286,2),(37,36,0,1,10,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',100,1767189858,1767189858,2),(38,36,0,3,13,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',390,1767189868,1767189868,2),(39,36,0,2,25,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',500,1767189875,1767189875,2),(40,36,0,1,39,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',390,1767189887,1767189887,2),(41,33,14,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767508278,1767508278,1),(42,42,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767508739,1767508739,2),(43,42,0,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767508742,1767508742,2),(44,14,8,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767508800,1767508800,1),(45,14,8,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767508811,1767508811,1),(46,33,14,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767509593,1767509593,1),(47,33,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767509610,1767509610,2),(48,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767517445,1767517445,2),(49,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767517461,1767517461,2),(50,25,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767517470,1767517470,2),(51,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767517491,1767517491,2),(52,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767517502,1767517502,2),(53,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767518074,1767518074,2),(54,25,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767518181,1767518181,2),(55,41,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767519622,1767519622,2),(56,14,69,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767520677,1767520677,1),(57,14,69,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767520679,1767520679,1),(58,14,69,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767520682,1767520682,1),(59,41,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767525107,1767525107,2),(60,41,0,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767525114,1767525114,2),(61,41,40,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767525539,1767525539,1),(62,32,0,2,4,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',80,1767613372,1767613372,2),(63,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613377,1767613377,2),(64,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613377,1767613377,2),(65,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613378,1767613378,2),(66,32,0,3,4,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',120,1767613382,1767613382,2),(67,32,0,3,4,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',120,1767613383,1767613383,2),(68,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613389,1767613389,2),(69,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613390,1767613390,2),(70,32,0,1,4,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',40,1767613391,1767613391,2),(71,32,0,1,16,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',160,1767613402,1767613402,2),(72,32,0,1,16,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',160,1767613407,1767613407,2),(73,32,0,1,16,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',160,1767613408,1767613408,2),(74,32,0,1,18,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',180,1767613413,1767613413,2),(75,32,0,1,18,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',180,1767613414,1767613414,2),(76,32,0,1,18,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',180,1767613415,1767613415,2),(77,32,0,3,15,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',450,1767613444,1767613444,2),(78,32,0,3,15,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',450,1767613449,1767613449,2),(79,32,0,2,15,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',300,1767613455,1767613455,2),(80,32,0,1,21,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',210,1767613465,1767613465,2),(81,32,0,1,21,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',210,1767613466,1767613466,2),(82,36,0,1,11,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',110,1767615022,1767615022,2),(83,36,0,2,32,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',640,1767615033,1767615033,2),(84,36,0,3,40,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',1200,1767615043,1767615043,2),(85,27,0,2,26,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',520,1767689967,1767689967,2),(86,40,0,3,10,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',300,1767922295,1767922295,2),(87,36,0,1,33,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',330,1767965019,1767965019,2),(88,36,0,1,66,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',660,1767965037,1767965037,2),(89,36,0,2,72,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',1440,1767965043,1767965043,2),(90,36,0,2,72,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',1440,1767965045,1767965045,2),(91,36,0,3,72,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2160,1767965051,1767965051,2),(92,36,0,3,72,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2160,1767965052,1767965052,2),(93,36,0,3,72,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2160,1767965053,1767965053,2),(94,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965090,1767965090,2),(95,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965091,1767965091,2),(96,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965092,1767965092,2),(97,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965097,1767965097,2),(98,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965098,1767965098,2),(99,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965099,1767965099,2),(100,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965103,1767965103,2),(101,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965104,1767965104,2),(102,36,0,3,77,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',2310,1767965105,1767965105,2),(103,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965109,1767965109,2),(104,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965110,1767965110,2),(105,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965111,1767965111,2),(106,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965115,1767965115,2),(107,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965116,1767965116,2),(108,36,0,1,77,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',770,1767965117,1767965117,2),(109,41,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767968436,1767968436,2),(110,41,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1767968441,1767968441,2),(111,41,0,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767968444,1767968444,2),(112,41,0,1,1,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',10,1767968446,1767968446,2),(113,41,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1767968469,1767968469,2),(114,72,0,2,2,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',40,1768210552,1768210552,2),(115,72,0,2,1,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',20,1768287328,1768287328,2),(116,70,0,3,4,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',120,1768363505,1768363505,2),(117,70,0,1,99,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',990,1768363523,1768363523,2),(118,70,0,1,99,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',990,1768363529,1768363529,2),(119,36,0,1,16,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',160,1768364202,1768364202,2),(120,14,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1768808868,1768808868,2),(121,41,0,3,1,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',30,1768829910,1768829910,2),(122,36,0,1,7,'蹇冩効鐡?,'/uploads/20251226/c98e60c14c5b03498565cd4e196086c6.png',70,1769001385,1769001385,2),(123,36,0,2,16,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',320,1769001393,1769001393,2),(124,36,0,3,11,'鐖卞績淇″皝','/uploads/20251231/5d8afdf6eb1db84ae02e8ace21105d6f.png',330,1769001409,1769001409,2),(125,32,0,2,7,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',140,1769684043,1769684043,2),(126,70,0,2,2,'褰╄櫣','/uploads/20251226/baed69072d5f541d6338a3a485ee9820.png',40,1770104760,1770104760,2),(127,70,0,15,1,'鏈堜寒','/uploads/gifts/moon.png',120,1770253817,1770253817,2); +/*!40000 ALTER TABLE `nf_gifts_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_gifts_order` +-- + +DROP TABLE IF EXISTS `nf_gifts_order`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_gifts_order` ( + `id` int NOT NULL AUTO_INCREMENT, + `order_sn` varchar(255) DEFAULT NULL COMMENT '璁㈠崟缂栧彿', + `out_trade_no` varchar(255) DEFAULT NULL COMMENT '鏀粯娴佹按鍙?, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `gifts_id` int DEFAULT NULL COMMENT '绀肩墿id', + `nums` int DEFAULT NULL COMMENT '鏁伴噺', + `pay_type` enum('miniWechat','aliPay') DEFAULT NULL COMMENT '鏀粯鏂瑰紡:miniWechat=寰俊灏忕▼搴?aliPay=鏀粯瀹?, + `price` decimal(10,2) DEFAULT NULL COMMENT '鍗曚环', + `order_money` decimal(10,2) DEFAULT NULL COMMENT '璁㈠崟閲戦', + `pay_status` enum('0','1','2') DEFAULT '0' COMMENT '鏀粯鐘舵€?0=寰呮敮浠?1=宸叉敮浠?2=宸插彇娑?, + `pay_time` bigint DEFAULT NULL COMMENT '鏀粯鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_gifts_order` +-- + +LOCK TABLES `nf_gifts_order` WRITE; +/*!40000 ALTER TABLE `nf_gifts_order` DISABLE KEYS */; +INSERT INTO `nf_gifts_order` VALUES (1,'G82025122545491','GL82025122545640',8,1,1,'miniWechat',10.00,10.00,'0',NULL,1766645491,1766645640); +/*!40000 ALTER TABLE `nf_gifts_order` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_girlfriend_eyecolor` +-- + +DROP TABLE IF EXISTS `nf_girlfriend_eyecolor`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_girlfriend_eyecolor` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(100) DEFAULT '' COMMENT '鏍囬', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐬宠壊'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_girlfriend_eyecolor` +-- + +LOCK TABLES `nf_girlfriend_eyecolor` WRITE; +/*!40000 ALTER TABLE `nf_girlfriend_eyecolor` DISABLE KEYS */; +INSERT INTO `nf_girlfriend_eyecolor` VALUES (10,'娣遍粦鑹?,10,1766627296,1766888698,NULL); +/*!40000 ALTER TABLE `nf_girlfriend_eyecolor` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_girlfriend_hairstyles` +-- + +DROP TABLE IF EXISTS `nf_girlfriend_hairstyles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_girlfriend_hairstyles` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(100) DEFAULT '' COMMENT '鏍囬', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `gender` enum('male','female') DEFAULT NULL COMMENT '鎬у埆:male=鐢?female=濂?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍙戝瀷'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_girlfriend_hairstyles` +-- + +LOCK TABLES `nf_girlfriend_hairstyles` WRITE; +/*!40000 ALTER TABLE `nf_girlfriend_hairstyles` DISABLE KEYS */; +INSERT INTO `nf_girlfriend_hairstyles` VALUES (10,'鍙岄┈灏?,10,'female',1766627369,1766675063,NULL),(11,'涓稿瓙澶?,11,'female',1766627376,1766675058,NULL),(12,'榻愬垬娴?,12,'female',1766627384,1766674856,NULL),(13,'澶ф尝娴?,13,'female',1766627396,1766674850,NULL),(14,'鐭彂',14,'male',1766739895,1766739895,NULL),(15,'闀垮彂',15,'male',1766739903,1766739903,NULL),(16,'闀跨洿鍙?,16,'female',1768202203,1768202203,NULL),(17,'娉㈡尝澶?,17,'female',1768202211,1768202211,NULL),(18,'楂橀┈灏?,18,'female',1768202223,1768202223,NULL),(19,'灏忓嵎鍙?,19,'female',1768202234,1768202234,NULL),(20,'绌烘皵鍒樻捣',20,'female',1768202245,1768202245,NULL),(21,'鍏富鍒?,21,'female',1768202256,1768202256,NULL); +/*!40000 ALTER TABLE `nf_girlfriend_hairstyles` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_girlfriend_hobbies` +-- + +DROP TABLE IF EXISTS `nf_girlfriend_hobbies`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_girlfriend_hobbies` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(100) DEFAULT '' COMMENT '鏍囬', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂冲弸鍏磋叮鏍囩'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_girlfriend_hobbies` +-- + +LOCK TABLES `nf_girlfriend_hobbies` WRITE; +/*!40000 ALTER TABLE `nf_girlfriend_hobbies` DISABLE KEYS */; +INSERT INTO `nf_girlfriend_hobbies` VALUES (7,'鏃呰',7,1766567962,1766889700,NULL),(8,'娓告垙',8,1766567967,1766567967,NULL),(9,'鍔ㄦ极',9,1766567973,1766889691,NULL),(10,'瀹犵墿',10,1766735555,1766889684,NULL),(11,'鍙戝憜',1,1766889721,1766889721,NULL),(12,'闃呰',2,1766889800,1766889800,NULL),(13,'鍒峰墽',3,1766889809,1766889809,NULL),(14,'杩愬姩',4,1766889819,1766889819,NULL); +/*!40000 ALTER TABLE `nf_girlfriend_hobbies` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_girlfriend_mould` +-- + +DROP TABLE IF EXISTS `nf_girlfriend_mould`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_girlfriend_mould` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(100) DEFAULT '' COMMENT '鏍囬', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `gender` enum('male','female') DEFAULT NULL COMMENT '鎬у埆:male=鐢?female=濂?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂冲弸妯℃澘'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_girlfriend_mould` +-- + +LOCK TABLES `nf_girlfriend_mould` WRITE; +/*!40000 ALTER TABLE `nf_girlfriend_mould` DISABLE KEYS */; +INSERT INTO `nf_girlfriend_mould` VALUES (7,'娓╂煍瀛﹀',2,'female',1766568044,1766889938,NULL),(8,'鍌插▏濡瑰',2,'female',1766568052,1766889941,NULL),(9,'绮剧灏忓',2,'female',1766568070,1766889944,NULL),(10,'灞呭鏆栫敺',1,'male',1766745127,1766889860,NULL),(11,'杩愬姩鍨嬬敺',1,'male',1766745139,1766889844,NULL),(12,'楂樺喎灏忕嫾鐙?,1,'male',1766889883,1766889887,NULL),(13,'娓╂煍灏忓ザ鐙?,1,'male',1766889903,1766889903,NULL),(14,'鑹崇編灏戝',2,'female',1766889931,1766889931,NULL); +/*!40000 ALTER TABLE `nf_girlfriend_mould` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_hobbies` +-- + +DROP TABLE IF EXISTS `nf_hobbies`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_hobbies` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` int DEFAULT '0' COMMENT '鐢ㄦ埛id', + `name` varchar(100) DEFAULT '' COMMENT '鏍囬', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍏磋叮鏍囩'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_hobbies` +-- + +LOCK TABLES `nf_hobbies` WRITE; +/*!40000 ALTER TABLE `nf_hobbies` DISABLE KEYS */; +INSERT INTO `nf_hobbies` VALUES (2,0,'娓告垙',99,1766544313,1766544313,NULL),(3,0,'鍔ㄦ极',98,1766544406,1766544406,NULL),(4,0,'灏忚',100,1766544430,1766544430,NULL),(5,0,'鐭墽',97,1766544446,1766545028,1766545028),(6,12,'鏃呰',0,1766562685,1766562685,NULL),(7,15,'闃呰',0,1766574410,1766574410,NULL),(8,15,'缇庨',0,1766574480,1766574480,NULL),(9,15,'鎵嬪伐',0,1766574492,1766574492,NULL),(10,15,'闄惰壓',0,1766625303,1766625303,NULL),(11,15,'楠戣',0,1766625362,1766625362,NULL),(12,15,'鎺㈤櫓',0,1766627928,1766627928,NULL),(13,15,'鐖北',0,1766652036,1766652036,NULL),(14,15,'璺虫按',0,1766652820,1766652820,NULL),(15,16,'娓告吵',0,1766661565,1766661565,NULL),(16,39,'鐢荤敾',0,1767500505,1767500505,NULL),(17,39,'璇讳功',0,1767500923,1767500923,NULL),(18,39,'鐫¤',0,1767501090,1767501090,NULL),(19,39,'涓嬫',0,1767501128,1767501128,NULL),(20,39,'璺戞',0,1767501179,1767501179,NULL),(21,39,'娓告吵',0,1767501288,1767501288,NULL),(22,39,'鍞辨瓕',0,1767502404,1767502404,NULL),(23,70,'璇讳功',0,1767945717,1767945717,NULL),(24,70,'楠戣',0,1767945729,1767945729,NULL),(25,14,'灏戝',0,1768808011,1768808011,NULL),(26,81,'2',0,1769604200,1769604200,NULL); +/*!40000 ALTER TABLE `nf_hobbies` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_intimacy_config` +-- + +DROP TABLE IF EXISTS `nf_intimacy_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_intimacy_config` ( + `id` int NOT NULL AUTO_INCREMENT, + `image` varchar(255) DEFAULT NULL COMMENT '鍥剧墖', + `name` varchar(255) DEFAULT NULL COMMENT '鍚嶇О', + `title` varchar(255) DEFAULT NULL COMMENT '鏍囬', + `level` varchar(255) DEFAULT '0' COMMENT '绛夌骇', + `intimacy` decimal(10,0) DEFAULT '0' COMMENT '闇€瑕佺殑绉垎', + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浜插瘑搴﹂厤缃?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_intimacy_config` +-- + +LOCK TABLES `nf_intimacy_config` WRITE; +/*!40000 ALTER TABLE `nf_intimacy_config` DISABLE KEYS */; +INSERT INTO `nf_intimacy_config` VALUES (1,'/uploads/20251225/3be807b7cd645dc8353fb2adccb8e33d.png','鏂囧瓧鑱婂ぉ','鏂囧瓧鑱婂ぉ寮€鍚ソ鍙嬩箣鏃?,'0',0,9999,1766628030,1766628030),(2,'/uploads/20251225/bbddb82729be60db78b4a9b658932a8f.png','璇煶','璇煶','1',10,9998,1766628074,1767085655),(3,'/uploads/20251225/bef6315f368257b7b351c2187ed88066.png','鍥剧墖','鍥剧墖','3',400,9996,1766628100,1767085736),(4,'/uploads/20251225/d238e6d762ccb97c5fe4412c28d15f07.png','瑙嗛','瑙嗛','5',900,9995,1766628144,1767085745),(5,'/uploads/20251225/268834d912620e0666a51639ba86c6d4.png','瀹炴椂璇煶','闅忔椂闅忓湴锛屾嫧鎵撶數璇?,'2',200,9997,1766628190,1767085826),(6,'/uploads/20251225/268834d912620e0666a51639ba86c6d4.png','瀹炴椂瑙嗛','闈㈠闈㈢殑浜ゆ祦','4',600,9996,1766628211,1767085835),(7,'/uploads/20251225/d238e6d762ccb97c5fe4412c28d15f07.png','鏂囦欢','涓婁紶鏂囦欢','6',1000,9995,1767059726,1767085753); +/*!40000 ALTER TABLE `nf_intimacy_config` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_intimacy_day` +-- + +DROP TABLE IF EXISTS `nf_intimacy_day`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_intimacy_day` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL COMMENT '鍚嶇О', + `title` varchar(255) DEFAULT NULL COMMENT '鏍囬', + `upper` decimal(10,0) DEFAULT NULL COMMENT '涓婇檺鍊?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `type` enum('1','2') DEFAULT '1' COMMENT '绫诲瀷:1=鏂囨湰,2=璇煶', + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='姣忔棩浠诲姟'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_intimacy_day` +-- + +LOCK TABLES `nf_intimacy_day` WRITE; +/*!40000 ALTER TABLE `nf_intimacy_day` DISABLE KEYS */; +INSERT INTO `nf_intimacy_day` VALUES (1,'鏂囨湰鑱婂ぉ','姣忔鑱婂ぉ鍙幏寰?浜插瘑搴?,100,1766631962,1766633252,'1'),(2,'闊宠棰戣亰澶?,'闊宠棰戣亰澶╂瘡鍒嗛挓鍙幏寰?浜插瘑搴?,100,1766632011,1766633258,'2'); +/*!40000 ALTER TABLE `nf_intimacy_day` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_intimacy_friend` +-- + +DROP TABLE IF EXISTS `nf_intimacy_friend`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_intimacy_friend` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `friend_id` int DEFAULT NULL COMMENT '濂藉弸id', + `day` date DEFAULT NULL COMMENT '鏃ユ湡', + `intimacy` decimal(10,0) DEFAULT NULL COMMENT '浜插瘑搴?, + `type` enum('1','2') DEFAULT '1' COMMENT '绫诲瀷:1=鏂囨湰,2=璇煶', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`,`friend_id`), + KEY `type` (`type`), + KEY `day` (`day`) +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='濂芥湁姣忔棩浜插瘑搴?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_intimacy_friend` +-- + +LOCK TABLES `nf_intimacy_friend` WRITE; +/*!40000 ALTER TABLE `nf_intimacy_friend` DISABLE KEYS */; +INSERT INTO `nf_intimacy_friend` VALUES (1,8,14,'2025-12-30',100,'2',1767062998,1767062998),(2,14,8,'2025-12-30',100,'2',1767062998,1767062998),(3,14,13,'2025-12-30',56,'1',1767068952,1767068952),(4,13,14,'2025-12-30',56,'1',1767068952,1767068952),(5,14,13,'2025-12-30',1,'2',1767082989,1767082989),(6,13,14,'2025-12-30',1,'2',1767082989,1767082989),(7,14,8,'2025-12-30',1,'1',1767097960,1767097960),(8,8,14,'2025-12-30',1,'1',1767097960,1767097960),(9,15,18,'2025-12-31',2,'1',1767174166,1767174166),(10,18,15,'2025-12-31',2,'1',1767174166,1767174166),(11,13,5,'2026-01-04',1,'1',1767495526,1767495526),(12,5,13,'2026-01-04',1,'1',1767495526,1767495526),(13,33,14,'2026-01-04',19,'1',1767508259,1767508259),(14,14,33,'2026-01-04',19,'1',1767508259,1767508259),(15,33,42,'2026-01-04',8,'1',1767508976,1767508976),(16,42,33,'2026-01-04',8,'1',1767508976,1767508976),(17,14,42,'2026-01-04',5,'1',1767517921,1767517921),(18,42,14,'2026-01-04',5,'1',1767517921,1767517921),(19,69,14,'2026-01-04',8,'1',1767520380,1767520380),(20,14,69,'2026-01-04',8,'1',1767520380,1767520380),(21,42,69,'2026-01-04',5,'1',1767520938,1767520938),(22,69,42,'2026-01-04',5,'1',1767520938,1767520938),(23,41,40,'2026-01-04',2,'1',1767525248,1767525248),(24,40,41,'2026-01-04',2,'1',1767525248,1767525248),(25,14,24,'2026-01-05',2,'1',1767582031,1767582031),(26,24,14,'2026-01-05',2,'1',1767582031,1767582031),(27,27,40,'2026-01-08',1,'1',1767858120,1767858120),(28,40,27,'2026-01-08',1,'1',1767858120,1767858120),(29,72,40,'2026-01-16',1,'1',1768547089,1768547089),(30,40,72,'2026-01-16',1,'1',1768547089,1768547089),(31,73,14,'2026-01-17',3,'1',1768641617,1768641617),(32,14,73,'2026-01-17',3,'1',1768641617,1768641617),(33,70,41,'2026-01-19',1,'1',1768811752,1768811752),(34,41,70,'2026-01-19',1,'1',1768811752,1768811752); +/*!40000 ALTER TABLE `nf_intimacy_friend` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_jibin_order` +-- + +DROP TABLE IF EXISTS `nf_jibin_order`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_jibin_order` ( + `id` int NOT NULL AUTO_INCREMENT, + `order_sn` varchar(255) DEFAULT NULL COMMENT '璁㈠崟缂栧彿', + `out_trade_no` varchar(255) DEFAULT NULL COMMENT '鏀粯娴佹按鍙?, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `pay_type` enum('miniWechat','aliPay') DEFAULT NULL COMMENT '鏀粯鏂瑰紡:miniWechat=寰俊灏忕▼搴?aliPay=鏀粯瀹?, + `price` decimal(10,2) DEFAULT NULL COMMENT '鏀粯閲戦', + `jinbi` int DEFAULT NULL COMMENT '鍒拌处閲戝竵鏁?, + `pay_status` enum('0','1','2') DEFAULT '0' COMMENT '鏀粯鐘舵€?0=寰呮敮浠?1=宸叉敮浠?2=宸插彇娑?, + `pay_time` bigint DEFAULT NULL COMMENT '鏀粯鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=153 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='閲戝竵璁㈠崟'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_jibin_order` +-- + +LOCK TABLES `nf_jibin_order` WRITE; +/*!40000 ALTER TABLE `nf_jibin_order` DISABLE KEYS */; +INSERT INTO `nf_jibin_order` VALUES (1,'G82025122545491','GL82025122545640',8,'miniWechat',10.00,NULL,'0',NULL,1766645491,1766645640),(2,'G122025122705350','GL122025122705350',12,'miniWechat',0.10,10,'1',1766805666,1766805350,1766805350),(3,'G122025122706438','GL122025122706438',12,NULL,30.00,3000,'0',NULL,1766806438,1766806438),(4,'G122025122706627','GL122025122706627',12,'miniWechat',1.00,100,'0',NULL,1766806627,1766806627),(5,'G122025122706686','GL122025122706686',12,'miniWechat',10.00,1000,'1',1766806771,1766806686,1766806686),(6,'G82025122717762','GL82025122717762',8,'miniWechat',10.00,1000,'0',NULL,1766817762,1766817762),(7,'G142025122717789','GL142025122717789',14,'miniWechat',1.00,100,'0',NULL,1766817789,1766817789),(8,'G142025122718028','GL142025122718028',14,'miniWechat',1.00,100,'1',1766818028,1766818028,1766818028),(9,'G142025122718233','GL142025122718233',14,'miniWechat',10.00,1000,'1',1766818233,1766818233,1766818233),(10,'G142025122718281','GL142025122718281',14,'miniWechat',1.00,100,'1',1766818281,1766818281,1766818281),(11,'G142025122718281','GL142025122718281',14,'miniWechat',1.00,100,'0',NULL,1766818281,1766818281),(12,'G142025122718282','GL142025122718282',14,'miniWechat',1.00,100,'1',1766818282,1766818282,1766818282),(13,'G142025122718282','GL142025122718282',14,'miniWechat',1.00,100,'0',NULL,1766818282,1766818282),(14,'G142025122718296','GL142025122718296',14,'miniWechat',10.00,1000,'1',1766818296,1766818296,1766818296),(15,'G142025122718296','GL142025122718296',14,'miniWechat',10.00,1000,'0',NULL,1766818296,1766818296),(16,'G142025122718297','GL142025122718297',14,'miniWechat',10.00,1000,'1',1766818297,1766818297,1766818297),(17,'G142025122718298','GL142025122718298',14,'miniWechat',10.00,1000,'1',1766818298,1766818298,1766818298),(18,'G142025122718299','GL142025122718299',14,'miniWechat',10.00,1000,'1',1766818299,1766818299,1766818299),(19,'G142025122718299','GL142025122718299',14,'miniWechat',10.00,1000,'0',NULL,1766818299,1766818299),(20,'G142025122718299','GL142025122718299',14,'miniWechat',10.00,1000,'0',NULL,1766818299,1766818299),(21,'G142025122718311','GL142025122718311',14,'miniWechat',10.00,1000,'1',1766818311,1766818311,1766818311),(22,'G142025122718335','GL142025122718335',14,'miniWechat',10.00,1000,'1',1766818335,1766818335,1766818335),(23,'G142025122718340','GL142025122718340',14,'miniWechat',10.00,1000,'1',1766818340,1766818340,1766818340),(24,'G142025122718343','GL142025122718343',14,'miniWechat',30.00,3000,'1',1766818343,1766818343,1766818343),(25,'G142025122718345','GL142025122718345',14,'miniWechat',1.00,100,'1',1766818346,1766818345,1766818345),(26,'G142025122718348','GL142025122718348',14,'miniWechat',10.00,1000,'1',1766818348,1766818348,1766818348),(27,'G142025122718350','GL142025122718350',14,'miniWechat',10.00,1000,'1',1766818350,1766818350,1766818350),(28,'G142025122727132','GL142025122727132',14,'miniWechat',0.30,30,'0',NULL,1766827132,1766827132),(29,'G142025122727161','GL142025122727161',14,'miniWechat',0.30,30,'1',1766827161,1766827161,1766827161),(30,'G142025122727194','GL142025122727194',14,'miniWechat',0.30,30,'1',1766827194,1766827194,1766827194),(31,'G142025122727319','GL142025122727319',14,'miniWechat',0.60,60,'1',1766827319,1766827319,1766827319),(32,'G142025122727413','GL142025122727413',14,'miniWechat',0.30,30,'1',1766827413,1766827413,1766827413),(33,'G142025122727453','GL142025122727453',14,'miniWechat',1.00,100,'1',1766827453,1766827453,1766827453),(34,'G152025122886484','GL152025122886484',15,'miniWechat',30.00,3000,'1',1766886484,1766886484,1766886484),(35,'G152025122889505','GL152025122889505',15,'miniWechat',1000.00,100000,'1',1766889506,1766889505,1766889505),(36,'G142025123148146','GL142025123148146',14,'miniWechat',0.20,20,'1',1767148146,1767148146,1767148146),(37,'G142025123148170','GL142025123148170',14,'miniWechat',0.30,30,'1',1767148170,1767148170,1767148170),(38,'G142025123148177','GL142025123148177',14,'miniWechat',0.30,30,'1',1767148177,1767148177,1767148177),(39,'G272025123176523','GL272025123176523',27,'miniWechat',99999.00,9999900,'1',1767176523,1767176523,1767176523),(40,'G312025123183117','GL312025123183117',31,'miniWechat',10.00,1000,'1',1767183117,1767183117,1767183117),(41,'G362025123189179','GL362025123189179',36,'miniWechat',0.30,30,'1',1767189179,1767189179,1767189179),(42,'G362025123189185','GL362025123189185',36,'miniWechat',0.10,10,'1',1767189185,1767189185,1767189185),(43,'G362025123189190','GL362025123189190',36,'miniWechat',0.20,20,'1',1767189190,1767189190,1767189190),(44,'G362025123189270','GL362025123189270',36,'miniWechat',0.40,40,'1',1767189271,1767189270,1767189270),(45,'G362025123189278','GL362025123189278',36,'miniWechat',0.60,60,'1',1767189278,1767189278,1767189278),(46,'G362025123189284','GL362025123189284',36,'miniWechat',3.60,360,'1',1767189284,1767189284,1767189284),(47,'G362025123189748','GL362025123189748',36,'miniWechat',30.00,3000,'1',1767189748,1767189748,1767189748),(48,'G372026010494858','GL372026010494858',37,'miniWechat',10.00,1000,'1',1767494858,1767494858,1767494858),(49,'G402026010402617','GL402026010402617',40,'miniWechat',30.00,3000,'1',1767502617,1767502617,1767502617),(50,'G412026010403221','GL412026010403221',41,'miniWechat',10.00,1000,'1',1767503221,1767503221,1767503221),(51,'G422026010407865','GL422026010407865',42,'miniWechat',30.00,3000,'1',1767507865,1767507865,1767507865),(52,'G332026010408277','GL332026010408277',33,'miniWechat',0.30,30,'1',1767508277,1767508277,1767508277),(53,'G332026010409409','GL332026010409409',33,'miniWechat',30.00,3000,'1',1767509409,1767509409,1767509409),(54,'G332026010409418','GL332026010409418',33,'miniWechat',10.00,1000,'1',1767509418,1767509418,1767509418),(55,'G332026010409432','GL332026010409432',33,'miniWechat',1.00,100,'1',1767509432,1767509432,1767509432),(56,'G332026010409450','GL332026010409450',33,'miniWechat',0.50,50,'1',1767509450,1767509450,1767509450),(57,'G332026010409458','GL332026010409458',33,'miniWechat',0.10,10,'1',1767509458,1767509458,1767509458),(58,'G332026010409469','GL332026010409469',33,'miniWechat',0.01,1,'1',1767509469,1767509469,1767509469),(59,'G332026010409477','GL332026010409477',33,'miniWechat',0.00,0,'1',1767509477,1767509477,1767509477),(60,'G142026010415474','GL142026010415474',14,'miniWechat',1.00,100,'1',1767515474,1767515474,1767515474),(61,'G252026010417444','GL252026010417444',25,'miniWechat',0.30,30,'1',1767517444,1767517444,1767517444),(62,'G252026010417460','GL252026010417460',25,'miniWechat',0.30,30,'1',1767517460,1767517460,1767517460),(63,'G252026010417469','GL252026010417469',25,'miniWechat',0.20,20,'1',1767517469,1767517469,1767517469),(64,'G252026010417490','GL252026010417490',25,'miniWechat',0.30,30,'1',1767517490,1767517490,1767517490),(65,'G252026010417500','GL252026010417500',25,'miniWechat',0.30,30,'1',1767517500,1767517500,1767517500),(66,'G252026010418072','GL252026010418072',25,'miniWechat',0.30,30,'1',1767518073,1767518072,1767518072),(67,'G252026010418180','GL252026010418180',25,'miniWechat',0.30,30,'1',1767518180,1767518180,1767518180),(68,'G412026010419632','GL412026010419632',41,'miniWechat',1.00,100,'1',1767519633,1767519632,1767519632),(69,'G412026010419637','GL412026010419637',41,'miniWechat',1.00,100,'1',1767519637,1767519637,1767519637),(70,'G322026010513371','GL322026010513371',32,'miniWechat',0.80,80,'1',1767613371,1767613371,1767613371),(71,'G322026010513375','GL322026010513375',32,'miniWechat',0.40,40,'1',1767613376,1767613375,1767613375),(72,'G322026010513376','GL322026010513376',32,'miniWechat',0.40,40,'1',1767613376,1767613376,1767613376),(73,'G322026010513377','GL322026010513377',32,'miniWechat',0.40,40,'1',1767613377,1767613377,1767613377),(74,'G322026010513381','GL322026010513381',32,'miniWechat',1.20,120,'1',1767613381,1767613381,1767613381),(75,'G322026010513382','GL322026010513382',32,'miniWechat',1.20,120,'1',1767613382,1767613382,1767613382),(76,'G322026010513382','GL322026010513382',32,'miniWechat',1.20,120,'0',NULL,1767613382,1767613382),(77,'G322026010513388','GL322026010513388',32,'miniWechat',0.40,40,'1',1767613388,1767613388,1767613388),(78,'G322026010513388','GL322026010513388',32,'miniWechat',0.40,40,'0',NULL,1767613388,1767613388),(79,'G322026010513389','GL322026010513389',32,'miniWechat',0.40,40,'1',1767613389,1767613389,1767613389),(80,'G322026010513390','GL322026010513390',32,'miniWechat',0.40,40,'1',1767613390,1767613390,1767613390),(81,'G322026010513400','GL322026010513400',32,'miniWechat',1.60,160,'1',1767613401,1767613400,1767613400),(82,'G322026010513406','GL322026010513406',32,'miniWechat',1.60,160,'1',1767613406,1767613406,1767613406),(83,'G322026010513406','GL322026010513406',32,'miniWechat',1.60,160,'0',NULL,1767613406,1767613406),(84,'G322026010513406','GL322026010513406',32,'miniWechat',1.60,160,'0',NULL,1767613406,1767613406),(85,'G322026010513407','GL322026010513407',32,'miniWechat',1.60,160,'1',1767613407,1767613407,1767613407),(86,'G322026010513412','GL322026010513412',32,'miniWechat',1.80,180,'1',1767613412,1767613412,1767613412),(87,'G322026010513413','GL322026010513413',32,'miniWechat',1.80,180,'1',1767613413,1767613413,1767613413),(88,'G322026010513414','GL322026010513414',32,'miniWechat',1.80,180,'1',1767613414,1767613414,1767613414),(89,'G322026010513443','GL322026010513443',32,'miniWechat',4.50,450,'1',1767613443,1767613443,1767613443),(90,'G322026010513448','GL322026010513448',32,'miniWechat',4.50,450,'1',1767613448,1767613448,1767613448),(91,'G322026010513448','GL322026010513448',32,'miniWechat',4.50,450,'0',NULL,1767613448,1767613448),(92,'G322026010513448','GL322026010513448',32,'miniWechat',4.50,450,'0',NULL,1767613448,1767613448),(93,'G322026010513454','GL322026010513454',32,'miniWechat',3.00,300,'1',1767613454,1767613454,1767613454),(94,'G322026010513458','GL322026010513458',32,'miniWechat',1.50,150,'1',1767613458,1767613458,1767613458),(95,'G322026010513463','GL322026010513463',32,'miniWechat',2.10,210,'1',1767613464,1767613463,1767613463),(96,'G322026010513464','GL322026010513464',32,'miniWechat',2.10,210,'1',1767613465,1767613464,1767613464),(97,'G362026010515042','GL362026010515042',36,'miniWechat',12.00,1200,'1',1767615042,1767615042,1767615042),(98,'G702026010947522','GL702026010947522',70,'miniWechat',10.00,1000,'1',1767947522,1767947522,1767947522),(99,'G362026010965036','GL362026010965036',36,'miniWechat',6.60,660,'1',1767965036,1767965036,1767965036),(100,'G362026010965042','GL362026010965042',36,'miniWechat',14.40,1440,'1',1767965042,1767965042,1767965042),(101,'G362026010965044','GL362026010965044',36,'miniWechat',14.40,1440,'1',1767965044,1767965044,1767965044),(102,'G362026010965050','GL362026010965050',36,'miniWechat',21.60,2160,'1',1767965050,1767965050,1767965050),(103,'G362026010965051','GL362026010965051',36,'miniWechat',21.60,2160,'1',1767965051,1767965051,1767965051),(104,'G362026010965051','GL362026010965051',36,'miniWechat',21.60,2160,'0',NULL,1767965051,1767965051),(105,'G362026010965051','GL362026010965051',36,'miniWechat',21.60,2160,'0',NULL,1767965051,1767965051),(106,'G362026010965051','GL362026010965051',36,'miniWechat',21.60,2160,'0',NULL,1767965051,1767965051),(107,'G362026010965052','GL362026010965052',36,'miniWechat',21.60,2160,'1',1767965052,1767965052,1767965052),(108,'G362026010965052','GL362026010965052',36,'miniWechat',21.60,2160,'0',NULL,1767965052,1767965052),(109,'G362026010965052','GL362026010965052',36,'miniWechat',21.60,2160,'0',NULL,1767965052,1767965052),(110,'G362026010965089','GL362026010965089',36,'miniWechat',23.10,2310,'1',1767965089,1767965089,1767965089),(111,'G362026010965090','GL362026010965090',36,'miniWechat',23.10,2310,'1',1767965090,1767965090,1767965090),(112,'G362026010965091','GL362026010965091',36,'miniWechat',23.10,2310,'1',1767965091,1767965091,1767965091),(113,'G362026010965096','GL362026010965096',36,'miniWechat',23.10,2310,'1',1767965096,1767965096,1767965096),(114,'G362026010965097','GL362026010965097',36,'miniWechat',23.10,2310,'1',1767965097,1767965097,1767965097),(115,'G362026010965098','GL362026010965098',36,'miniWechat',23.10,2310,'1',1767965098,1767965098,1767965098),(116,'G362026010965098','GL362026010965098',36,'miniWechat',23.10,2310,'0',NULL,1767965098,1767965098),(117,'G362026010965098','GL362026010965098',36,'miniWechat',23.10,2310,'0',NULL,1767965098,1767965098),(118,'G362026010965102','GL362026010965102',36,'miniWechat',23.10,2310,'1',1767965102,1767965102,1767965102),(119,'G362026010965102','GL362026010965102',36,'miniWechat',23.10,2310,'0',NULL,1767965102,1767965102),(120,'G362026010965103','GL362026010965103',36,'miniWechat',23.10,2310,'1',1767965103,1767965103,1767965103),(121,'G362026010965103','GL362026010965103',36,'miniWechat',23.10,2310,'0',NULL,1767965103,1767965103),(122,'G362026010965104','GL362026010965104',36,'miniWechat',23.10,2310,'1',1767965104,1767965104,1767965104),(123,'G362026010965104','GL362026010965104',36,'miniWechat',23.10,2310,'0',NULL,1767965104,1767965104),(124,'G362026010965104','GL362026010965104',36,'miniWechat',23.10,2310,'0',NULL,1767965104,1767965104),(125,'G362026010965108','GL362026010965108',36,'miniWechat',7.70,770,'1',1767965108,1767965108,1767965108),(126,'G362026010965108','GL362026010965108',36,'miniWechat',7.70,770,'0',NULL,1767965108,1767965108),(127,'G362026010965108','GL362026010965108',36,'miniWechat',7.70,770,'0',NULL,1767965108,1767965108),(128,'G362026010965108','GL362026010965108',36,'miniWechat',7.70,770,'0',NULL,1767965108,1767965108),(129,'G362026010965109','GL362026010965109',36,'miniWechat',7.70,770,'1',1767965109,1767965109,1767965109),(130,'G362026010965109','GL362026010965109',36,'miniWechat',7.70,770,'0',NULL,1767965109,1767965109),(131,'G362026010965110','GL362026010965110',36,'miniWechat',7.70,770,'1',1767965110,1767965110,1767965110),(132,'G362026010965114','GL362026010965114',36,'miniWechat',7.70,770,'1',1767965114,1767965114,1767965114),(133,'G362026010965114','GL362026010965114',36,'miniWechat',7.70,770,'0',NULL,1767965114,1767965114),(134,'G362026010965115','GL362026010965115',36,'miniWechat',7.70,770,'1',1767965115,1767965115,1767965115),(135,'G362026010965115','GL362026010965115',36,'miniWechat',7.70,770,'0',NULL,1767965115,1767965115),(136,'G362026010965115','GL362026010965115',36,'miniWechat',7.70,770,'0',NULL,1767965115,1767965115),(137,'G362026010965116','GL362026010965116',36,'miniWechat',7.70,770,'1',1767965116,1767965116,1767965116),(138,'G362026010965116','GL362026010965116',36,'miniWechat',7.70,770,'0',NULL,1767965116,1767965116),(139,'G362026010965116','GL362026010965116',36,'miniWechat',7.70,770,'0',NULL,1767965116,1767965116),(140,'G722026011210551','GL722026011210551',72,'miniWechat',0.40,40,'1',1768210551,1768210551,1768210551),(141,'G722026011210862','GL722026011210862',72,'miniWechat',30.00,3000,'1',1768210863,1768210862,1768210862),(142,'G702026011463522','GL702026011463522',70,'miniWechat',9.90,990,'1',1768363522,1768363522,1768363522),(143,'G702026011463528','GL702026011463528',70,'miniWechat',9.90,990,'1',1768363528,1768363528,1768363528),(144,'G362026011474272','GL362026011474272',36,'miniWechat',30.00,3000,'1',1768374272,1768374272,1768374272),(145,'G362026011474276','GL362026011474276',36,'miniWechat',30.00,3000,'1',1768374276,1768374276,1768374276),(146,'G362026011474281','GL362026011474281',36,'miniWechat',30.00,3000,'1',1768374281,1768374281,1768374281),(147,'G142026011644392','GL142026011644392',14,'miniWechat',6.00,600,'1',1768544392,1768544392,1768544392),(148,'G752026011913244','GL752026011913244',75,'miniWechat',30.00,3000,'1',1768813244,1768813244,1768813244),(149,'G772026012266078','GL772026012266078',77,'miniWechat',1.00,100,'1',1769066079,1769066078,1769066078),(150,'G772026012266462','GL772026012266462',77,'miniWechat',1.00,100,'1',1769066462,1769066462,1769066462),(151,'G702026012889786','GL702026012889786',70,'miniWechat',10.00,1000,'1',1769589786,1769589786,1769589786),(152,'G322026012983970','GL322026012983970',32,'miniWechat',30.00,3000,'1',1769683970,1769683970,1769683970); +/*!40000 ALTER TABLE `nf_jibin_order` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_lovers` +-- + +DROP TABLE IF EXISTS `nf_lovers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_lovers` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鎭嬩汉閰嶇疆ID', + `user_id` bigint NOT NULL, + `name` varchar(64) DEFAULT NULL COMMENT '鎭嬩汉鏄电О', + `gender` enum('male','female') NOT NULL COMMENT '鎭嬩汉鎬у埆', + `intro` text COMMENT '鎭嬩汉绠€浠?浜鸿鍩虹', + `story_background` text COMMENT '鏁呬簨鑳屾櫙', + `personality_tag` int unsigned DEFAULT NULL COMMENT '鎬ф牸妯℃澘ID', + `interest_tags` json DEFAULT NULL COMMENT '鍏磋叮鏍囩ID鏁扮粍', + `opening_line` text COMMENT '寮€鍦虹櫧', + `personality_prompt` text COMMENT '浜鸿Prompt缂栬瘧缁撴灉', + `init_model` varchar(64) DEFAULT NULL COMMENT '鍒濆鍖栨墍鐢ㄦā鍨嬫爣璇?, + `init_at` datetime DEFAULT NULL COMMENT '鍒濆鍖栧畬鎴愭椂闂?, + `appearance_prompt` text COMMENT '澶栬矊鐗瑰緛/褰㈣薄Prompt锛堝惈铻嶅悎鍚庣殑鍙傛暟锛?, + `appearance_params` json DEFAULT NULL COMMENT '褰㈣薄椋庢牸鍙傛暟JSON锛堝彂鍨?鐬宠壊/鐫€瑁呯瓑锛?, + `hair_style_id` int unsigned DEFAULT NULL COMMENT '鍙戝瀷ID', + `eye_color_id` int unsigned DEFAULT NULL COMMENT '鐬宠壊ID', + `outfit_desc` varchar(50) DEFAULT NULL COMMENT '鐫€瑁呮弿杩?, + `outfit_top_id` bigint DEFAULT NULL COMMENT '褰撳墠涓婅ID', + `outfit_bottom_id` bigint DEFAULT NULL COMMENT '褰撳墠涓嬭ID', + `outfit_dress_id` bigint DEFAULT NULL COMMENT '褰撳墠杩炶。瑁?杩炰綋鏈岻D', + `voice_id` bigint DEFAULT NULL COMMENT '闊宠壊ID', + `image_url` varchar(255) DEFAULT NULL COMMENT '褰㈣薄URL', + `last_image_task_id` bigint DEFAULT NULL COMMENT '鏈€杩戜竴娆″舰璞$敓鎴愪换鍔D', + `image_gen_used` int DEFAULT '0' COMMENT '褰撴棩宸茬敤鐢熸垚娆℃暟', + `image_gen_limit` int DEFAULT '10' COMMENT '姣忔棩鐢熸垚娆℃暟涓婇檺', + `image_gen_reset_date` date DEFAULT NULL COMMENT '鐢熸垚娆℃暟鎵€灞炴棩鏈燂紝鐢ㄤ簬姣忔棩閲嶇疆', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `ux_nf_lovers_user` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_lovers` +-- + +LOCK TABLES `nf_lovers` WRITE; +/*!40000 ALTER TABLE `nf_lovers` DISABLE KEYS */; +INSERT INTO `nf_lovers` VALUES (47,70,'娴嬫祴','female','韬潗楂樻寫锛岄暱鐩哥敎缇庯紝娓告吵鑳芥墜','澶у閲屾吵瑁呯ぞ鐨勫壇绀鹃暱锛岃嚜鐢辨吵鑳藉姏鍑轰紬锛屽氨鍍忔湰浜虹殑鐩歌矊鍑轰紬涓€鏍凤紝澶╀箣楠勫コ銆?,7,'[7, 14, 12]','浣犲ソ鍛€','浣犵殑鍚嶅瓧鏄€屾祴娴嬨€嶏紝鏄疢imic鐨勫コ鍙嬶紝涓?Mimic 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細韬潗楂樻寫锛岄暱鐩哥敎缇庯紝娓告吵鑳芥墜銆俓n鏁呬簨鑳屾櫙锛氬ぇ瀛﹂噷娉宠绀剧殑鍓ぞ闀匡紝鑷敱娉宠兘鍔涘嚭浼楋紝灏卞儚鏈汉鐨勭浉璨屽嚭浼椾竴鏍凤紝澶╀箣楠勫コ銆傘€俓n鍏磋叮鐖卞ソ锛氭梾琛屻€侀槄璇汇€佽繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆孧imic銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-09 13:54:50','闈掑勾濂虫€э紝鐨偆鐧界殭锛岄璨屽嚭浼?,NULL,13,10,'鑲夎壊绱ц韩娉宠',NULL,NULL,11,17,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/images/1770102407_outfit.jpg',109,1,10,'2026-01-09','2026-01-09 08:02:19','2026-02-05 10:33:06'),(48,40,'鏄熸湡浜?,'female','瀛︾敓','娓╂煍',7,'[14]','浣犲ソ锛?,'浣犵殑鍚嶅瓧鏄€屾槦鏈熶簲銆嶏紝鏄檲鐨勫コ鍙嬶紝涓?闄?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細瀛︾敓銆俓n鏁呬簨鑳屾櫙锛氭俯鏌斻€俓n鍏磋叮鐖卞ソ锛氳繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆岄檲銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-09 09:19:48','鐨偆鐧界殭',NULL,11,10,'鐧借壊鏍℃湇',NULL,NULL,NULL,2,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/48/images/1767946327_female.png',110,1,10,'2026-01-09','2026-01-09 08:11:19','2026-01-09 17:19:48'),(49,36,'濞滃','female','绾磥婕備寒','娓╂煍鍠勮壇锛屾€ф牸寮€鏈?,9,'[10, 7, 14]','涓嬮洦澶╁伓閬?,'浣犵殑鍚嶅瓧鏄€屽濞溿€嶏紝鏄垬鍏堢敓鐨勫コ鍙嬶紝涓?鍒樺厛鐢?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氱簿绁炲皬濡广€俓n浜虹墿绠€浠嬶細绾磥婕備寒銆俓n鏁呬簨鑳屾櫙锛氭俯鏌斿杽鑹紝鎬ф牸寮€鏈椼€俓n鍏磋叮鐖卞ソ锛氭梾琛屻€佸疇鐗┿€佽繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屽垬鍏堢敓銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-19 06:43:34','骞磋交灏戝コ锛岀毊鑲ょ櫧鐨欙紝姘旇川鏄湼閬撴€昏鐨勬劅瑙?,NULL,13,10,'韬┛榛戜笣琚滐紝涓婅韩瀹芥澗琛?,NULL,5,NULL,16,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1769580106_outfit.jpg',200,1,10,'2026-01-19','2026-01-09 08:46:57','2026-01-28 17:52:07'),(50,41,'寰井','female','濂界湅','楂樼骇鐧介',14,'[14]','Hi','浣犵殑鍚嶅瓧鏄€屽井寰€嶏紝鏄畝鍗曠埍鐨勫コ鍙嬶紝涓?绠€鍗曠埍 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氳壋缇庡皯濡囥€俓n浜虹墿绠€浠嬶細濂界湅銆俓n鏁呬簨鑳屾櫙锛氶珮绾х櫧棰嗐€俓n鍏磋叮鐖卞ソ锛氳繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆岀畝鍗曠埍銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-09 14:14:38','鐨偆鐧界殭 闀垮彂缇庝附',NULL,12,10,'鑱屼笟瑁咃紝鑻卞Э椋掔埥',NULL,NULL,10,2,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/39/images/1767519963_outfit.jpg',122,2,10,'2026-01-09','2026-01-09 14:09:46','2026-01-09 22:19:47'),(51,71,'123','female','姝e父濂虫€n','姝e父涓浗濂虫€х殑涓€鐢?,7,'[10]','浣犲ソ','浣犵殑鍚嶅瓧鏄€?23銆嶏紝鏄痾zbs鐨勫コ鍙嬶紝涓?zzbs 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細姝e父濂虫€n銆俓n鏁呬簨鑳屾櫙锛氭甯镐腑鍥藉コ鎬х殑涓€鐢熴€俓n鍏磋叮鐖卞ソ锛氬疇鐗┿€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆寊zbs銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-10 05:15:30','鑰佸勾锛屼繚鍏讳竴鑸?,NULL,13,10,'鏃楄鍥村肪',NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/51/images/1768022099_female.png',125,3,10,'2026-01-10','2026-01-10 05:11:05','2026-01-10 13:15:30'),(52,72,'鑼冨啺鍐?,'female','鑱屽満銆佺簿鑻?,'鍏徃鐧介鑱屽満',7,'[10, 13]','浣犲ソ锛屽ぇ鍝?,'浣犵殑鍚嶅瓧鏄€岃寖鍐板啺銆嶏紝鏄Е濮嬬殗鐨勫コ鍙嬶紝涓?绉﹀鐨?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細鑱屽満銆佺簿鑻便€俓n鏁呬簨鑳屾櫙锛氬叕鍙哥櫧棰嗚亴鍦恒€俓n鍏磋叮鐖卞ソ锛氬疇鐗┿€佸埛鍓с€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆岀Е濮嬬殗銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-12 09:33:52','楂樺喎銆佸ぇ姘?,NULL,16,10,'绌块粦涓濈殑澶ц吙缇庡コ',2,7,NULL,14,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/images/1768976798_outfit.jpg',126,1,10,'2026-01-12','2026-01-12 09:30:01','2026-01-21 14:26:39'),(53,73,'鍒橀偊','male','寮€鍒涘ぇ姹夊ぉ涓?,'寰佹垬娌欏満锛屼粠甯備簳鏃犺禆鍒拌嚦楂樻棤涓?,11,'[7, 14]','缁欐垜婊氫笅','浣犵殑鍚嶅瓧鏄€屽垬閭︺€嶏紝鏄悤闆夌殑鐢峰弸锛屼笌 鍚曢泬 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氳繍鍔ㄥ瀷鐢枫€俓n浜虹墿绠€浠嬶細寮€鍒涘ぇ姹夊ぉ涓嬨€俓n鏁呬簨鑳屾櫙锛氬緛鎴樻矙鍦猴紝浠庡競浜曟棤璧栧埌鑷抽珮鏃犱笂銆俓n鍏磋叮鐖卞ソ锛氭梾琛屻€佽繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屽悤闆夈€嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-14 09:02:32','鐨偆鐧界殭锛屾皵璐ㄩ珮鍐?,NULL,15,10,'绌胯タ鏈嶆墦棰嗗甫锛岀毊闉嬶紝鐨¥',NULL,NULL,NULL,5,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/53/images/1768381208_male.png',162,1,10,'2026-01-14','2026-01-13 07:29:39','2026-01-14 17:30:25'),(54,12,'灏忓柕鍠?,'female','鍐呭','娌℃湁',7,'[9]','鍝堝柦','浣犵殑鍚嶅瓧鏄€屽皬鍠靛柕銆嶏紝鏄竴蹇电殑濂冲弸锛屼笌 涓€蹇?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細鍐呭銆俓n鏁呬簨鑳屾櫙锛氭病鏈夈€俓n鍏磋叮鐖卞ソ锛氬姩婕€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屼竴蹇点€嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-18 12:37:49','鐡滃瓙鑴革紝鐪肩潧澶уぇ鐨勶紝鍙埍鐨?,NULL,20,10,'鐧借壊纰庤姳瑁?,NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/54/images/1768739797_female.png',195,2,10,'2026-01-18','2026-01-18 12:34:06','2026-01-18 20:37:49'),(55,25,'SS','female','濂界湅锛屾紓浜殑鑰佸笀','鎬ф牸娓╅『',7,'[10]','浣犲ソ锛?,'浣犵殑鍚嶅瓧鏄€孲S銆嶏紝鏄潕鐨勫コ鍙嬶紝涓?鏉?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細濂界湅锛屾紓浜殑鑰佸笀銆俓n鏁呬簨鑳屾櫙锛氭€ф牸娓╅『銆俓n鍏磋叮鐖卞ソ锛氬疇鐗┿€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屾潕銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-19 03:44:50','婕備寒锛岃€佸笀',NULL,21,10,'鐭锛岄珮璺熼瀷锛屽ぇ娉㈡氮闀垮ご鍙?,NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/55/images/1768794283_female.png',198,2,10,'2026-01-19','2026-01-19 03:41:39','2026-01-19 11:44:50'),(56,14,'111','female','222','3333',14,'[14]','33333','浣犵殑鍚嶅瓧鏄€?11銆嶏紝鏄皬濡殑濂冲弸锛屼笌 灏忓Ξ 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氳壋缇庡皯濡囥€俓n浜虹墿绠€浠嬶細222銆俓n鏁呬簨鑳屾櫙锛?333銆俓n鍏磋叮鐖卞ソ锛氳繍鍔ㄣ€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屽皬濡€嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-19 07:43:45','灏戝锛?',NULL,13,10,'绌跨潃榛戣壊鐨勪笣琚?,14,5,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/images/1768808942_outfit.jpg',220,4,10,'2026-01-19','2026-01-19 07:33:43','2026-01-19 15:49:03'),(57,78,NULL,'female',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'姘旇川楂樺喎',NULL,18,10,'楂橀┈灏惧ぇ娉㈡氮',NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/57/images/1769515106_female.png',314,1,10,'2026-01-27','2026-01-27 11:56:57','2026-01-27 19:58:26'),(58,81,NULL,'female',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'鐨偆鐧斤紝涓瓙楂橈紝涓版弧',NULL,13,10,'鐗涗粩瑁ゅ瓙锛岀伆鑹茶。鏈嶃€傞粦鑹查珮璺熼瀷',NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/58/images/1769604955_female.png',326,4,10,'2026-01-28','2026-01-28 12:44:47','2026-01-28 20:55:55'),(59,82,'浼婂埄','female','濂崇殑锛屾椿鐨?,'123456',7,'[8, 10, 9]','浣犲ソ','浣犵殑鍚嶅瓧鏄€屼紛鍒┿€嶏紝鏄痺inter鐨勫コ鍙嬶紝涓?winter 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細濂崇殑锛屾椿鐨勩€俓n鏁呬簨鑳屾櫙锛?23456銆俓n鍏磋叮鐖卞ソ锛氭父鎴忋€佸姩婕€佸疇鐗┿€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆寃inter銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-28 13:05:53','鍝堝搱鍝堝搱鍝堝搱',NULL,21,10,'鐧借壊鐨勮。鏈?,NULL,NULL,NULL,1,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/59/images/1769605536_female.png',329,2,10,'2026-01-28','2026-01-28 13:01:44','2026-01-28 21:05:53'),(60,83,'璧嬪厰','female','娓╂煍浣撹创鍠勮В浜烘剰','鐙珛娲绘臣绮樹汉',8,'[11, 7, 13]','hi','浣犵殑鍚嶅瓧鏄€岃祴鍏斻€嶏紝鏄鑱岀殑濂冲弸锛屼笌 姝﹁亴 涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氬偛濞囧濡广€俓n浜虹墿绠€浠嬶細娓╂煍浣撹创鍠勮В浜烘剰銆俓n鏁呬簨鑳屾櫙锛氱嫭绔嬫椿娉肩矘浜恒€俓n鍏磋叮鐖卞ソ锛氭梾琛屻€佸彂鍛嗐€佸埛鍓с€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屾鑱屻€嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-flash','2026-01-28 14:53:52','闈掑勾,鐨偆鐧界殭,鐜颁唬闀跨浉,姘旇川娲绘臣',NULL,13,10,'绾㈣壊绡悆鑳屽績鐫¤',NULL,NULL,NULL,10,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/60/images/1769612005_female.png',338,9,10,'2026-01-28','2026-01-28 14:41:48','2026-01-28 22:59:00'),(61,32,'濞滃','female','娓╂煍鍠勮壇','涓€鍦洪洦涓极姝?,7,'[10, 9, 8]','涓€瑙侀挓鎯?,'浣犵殑鍚嶅瓧鏄€屽濞溿€嶏紝鏄垬鍏堢敓鐨勫コ鍙嬶紝涓?鍒樺厛鐢?涓烘亱浜哄叧绯汇€俓n鎬ф牸锛氭俯鏌斿濮愩€俓n浜虹墿绠€浠嬶細娓╂煍鍠勮壇銆俓n鏁呬簨鑳屾櫙锛氫竴鍦洪洦涓极姝ャ€俓n鍏磋叮鐖卞ソ锛氭父鎴忋€佸姩婕€佸疇鐗┿€俓n鑱婂ぉ瑕佹眰锛歕n1) 姘歌繙浠ユ亱浜鸿韩浠戒笌鐢ㄦ埛瀵硅瘽锛屼笉鏆撮湶AI韬唤锛沑n2) 濮嬬粓鐢ㄤ腑鏂囷紝浣跨敤璐村悎鎬ф牸鐨勮姘旓紝浜叉樀绉板懠鐢ㄦ埛銆屽垬鍏堢敓銆嶏紱\n3) 鍥炵瓟绠€娲佹俯鏆栵紝閬垮厤闀挎钀斤紱\n4) 閬垮厤娑夋斂銆佽繚绂併€佽繚娉曘€佹湭鎴愬勾鐩稿叧鍐呭銆?,'qwen-plus-character','2026-01-29 10:49:52','骞撮緞18宀侊紝鐡滃瓙鑴?,NULL,21,10,'绌跨櫧鑹叉牎鏈嶏紝鐧炬瑁?,NULL,NULL,NULL,16,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/images/1769683756_female.png',339,1,10,'2026-01-29','2026-01-29 10:42:11','2026-01-29 21:09:21'); +/*!40000 ALTER TABLE `nf_lovers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_motion_templates` +-- + +DROP TABLE IF EXISTS `nf_motion_templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_motion_templates` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鑷ID', + `name` varchar(100) DEFAULT NULL COMMENT '妯℃澘鍚嶇О', + `gender` enum('male','female') NOT NULL COMMENT '閫傜敤鎬у埆', + `template_id` varchar(128) NOT NULL COMMENT 'DashScope 杩斿洖鐨勫姩浣滄ā鏉縄D', + `ref_video_url` varchar(255) DEFAULT NULL COMMENT '鍙傝€冭棰戝師濮嬪湴鍧€', + `template_url` varchar(255) DEFAULT NULL COMMENT '鍔ㄤ綔妯℃澘鏂囦欢鍦?OSS 鐨勫湴鍧€', + `cover_url` varchar(255) DEFAULT NULL COMMENT '灏侀潰/缂╃暐鍥?OSS 鍦板潃', + `status` enum('active','inactive') DEFAULT 'active' COMMENT '鐘舵€侊細active 鍚敤锛宨nactive 鍋滅敤', + `description` varchar(255) DEFAULT NULL COMMENT '澶囨敞鎻忚堪', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_gender_status` (`gender`,`status`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AnimateAnyone 鍔ㄤ綔妯℃澘琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_motion_templates` +-- + +LOCK TABLES `nf_motion_templates` WRITE; +/*!40000 ALTER TABLE `nf_motion_templates` DISABLE KEYS */; +INSERT INTO `nf_motion_templates` VALUES (1,'dance_male_v1','male','AACT.8090e67b.DWczHOoZEfCMjgAWPj0Xow.3HXOfuMK','https://nvlovers.oss-cn-qingdao.aliyuncs.com/dance/templates/reference/female/1.mp4',NULL,NULL,'active','鐢风敓鍙傝€冭棰?v1','2026-01-05 17:37:47','2026-01-05 17:54:21'),(2,'dance_female_v1','female','AACT.8090e67b.qtLpsuoYEfCyIwAWPj1Rgg.xQdHxPsn','https://nvlovers.oss-cn-qingdao.aliyuncs.com/dance/templates/reference/male/1.mp4',NULL,NULL,'active','濂崇敓鍙傝€冭棰?v1','2026-01-05 17:37:47','2026-01-05 17:54:23'); +/*!40000 ALTER TABLE `nf_motion_templates` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_music_library` +-- + +DROP TABLE IF EXISTS `nf_music_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_music_library` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` bigint NOT NULL COMMENT '涓婁紶鐢ㄦ埛ID', + `title` varchar(255) NOT NULL COMMENT '姝屾洸鏍囬', + `artist` varchar(255) DEFAULT NULL COMMENT '鑹烘湳瀹?, + `music_url` varchar(500) NOT NULL COMMENT '闊充箰鏂囦欢URL鎴栭摼鎺?, + `cover_url` varchar(500) DEFAULT NULL COMMENT '灏侀潰鍥綰RL', + `duration` int DEFAULT NULL COMMENT '鏃堕暱锛堢锛?, + `upload_type` varchar(20) NOT NULL DEFAULT 'link' COMMENT 'file=鏂囦欢涓婁紶, link=鐩撮摼, external=澶栭儴骞冲彴', + `external_platform` varchar(20) DEFAULT NULL COMMENT '澶栭儴骞冲彴: netease=缃戞槗浜? qq=QQ闊充箰, kugou=閰风嫍, kuwo=閰锋垜', + `external_id` varchar(100) DEFAULT NULL COMMENT '澶栭儴骞冲彴姝屾洸ID', + `external_url` varchar(500) DEFAULT NULL COMMENT '澶栭儴骞冲彴瀹屾暣閾炬帴', + `is_public` tinyint(1) NOT NULL DEFAULT '1' COMMENT '鏄惁鍏紑锛?=鍏紑锛?=绉佹湁', + `play_count` int NOT NULL DEFAULT '0' COMMENT '鎾斁娆℃暟', + `like_count` int NOT NULL DEFAULT '0' COMMENT '鐐硅禐娆℃暟', + `status` enum('pending','approved','rejected') NOT NULL DEFAULT 'approved' COMMENT '瀹℃牳鐘舵€?, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + `deleted_at` datetime DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`), + KEY `idx_user_id` (`user_id`), + KEY `idx_status` (`status`), + KEY `idx_is_public` (`is_public`), + KEY `idx_created_at` (`created_at`), + KEY `idx_external_platform` (`external_platform`), + KEY `idx_external_id` (`external_id`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='闊充箰搴撹〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_music_library` +-- + +LOCK TABLES `nf_music_library` WRITE; +/*!40000 ALTER TABLE `nf_music_library` DISABLE KEYS */; +INSERT INTO `nf_music_library` VALUES (1,1,'涓冮噷棣?,'鍛ㄦ澃浼?,'https://music.163.com/#/song?id=186016','https://p1.music.126.net/P1ciTpERjRdYqk1v7MD05w==/109951163076136658.jpg',300,'external','netease','186016','https://music.163.com/#/song?id=186016',1,0,0,'approved','2026-02-04 17:09:55','2026-02-04 17:09:55',NULL),(2,1,'绋婚','鍛ㄦ澃浼?,'https://y.qq.com/n/ryqq/songDetail/003aAYrm3GE0Ac','https://y.gtimg.cn/music/photo_new/T002R300x300M000003Nz2So3XXYek.jpg',223,'external','qq','003aAYrm3GE0Ac','https://y.qq.com/n/ryqq/songDetail/003aAYrm3GE0Ac',1,1,0,'approved','2026-02-04 17:09:55','2026-02-04 09:11:03',NULL),(3,1,'Love','Bensound','https://www.bensound.com/bensound-music/bensound-love.mp3','https://www.bensound.com/bensound-img/love.jpg',143,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(4,1,'Romantic','Bensound','https://www.bensound.com/bensound-music/bensound-romantic.mp3','https://www.bensound.com/bensound-img/romantic.jpg',137,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(5,1,'Piano Moment','Bensound','https://www.bensound.com/bensound-music/bensound-pianomoment.mp3','https://www.bensound.com/bensound-img/pianomoment.jpg',146,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(6,1,'Tenderness','Bensound','https://www.bensound.com/bensound-music/bensound-tenderness.mp3','https://www.bensound.com/bensound-img/tenderness.jpg',152,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(7,1,'Sweet','Bensound','https://www.bensound.com/bensound-music/bensound-sweet.mp3','https://www.bensound.com/bensound-img/sweet.jpg',300,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(8,1,'A New Beginning','Bensound','https://www.bensound.com/bensound-music/bensound-anewbeginning.mp3','https://www.bensound.com/bensound-img/anewbeginning.jpg',148,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(9,1,'Memories','Bensound','https://www.bensound.com/bensound-music/bensound-memories.mp3','https://www.bensound.com/bensound-img/memories.jpg',210,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(10,1,'Once Again','Bensound','https://www.bensound.com/bensound-music/bensound-onceagain.mp3','https://www.bensound.com/bensound-img/onceagain.jpg',163,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(11,1,'Slowmotion','Bensound','https://www.bensound.com/bensound-music/bensound-slowmotion.mp3','https://www.bensound.com/bensound-img/slowmotion.jpg',180,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(12,1,'Tomorrow','Bensound','https://www.bensound.com/bensound-music/bensound-tomorrow.mp3','https://www.bensound.com/bensound-img/tomorrow.jpg',168,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(13,1,'Ukulele','Bensound','https://www.bensound.com/bensound-music/bensound-ukulele.mp3','https://www.bensound.com/bensound-img/ukulele.jpg',146,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(14,1,'Happy Rock','Bensound','https://www.bensound.com/bensound-music/bensound-happyrock.mp3','https://www.bensound.com/bensound-img/happyrock.jpg',91,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(15,1,'Summer','Bensound','https://www.bensound.com/bensound-music/bensound-summer.mp3','https://www.bensound.com/bensound-img/summer.jpg',142,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(16,1,'Sunny','Bensound','https://www.bensound.com/bensound-music/bensound-sunny.mp3','https://www.bensound.com/bensound-img/sunny.jpg',121,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(17,1,'Little Idea','Bensound','https://www.bensound.com/bensound-music/bensound-littleidea.mp3','https://www.bensound.com/bensound-img/littleidea.jpg',121,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(18,1,'Cute','Bensound','https://www.bensound.com/bensound-music/bensound-cute.mp3','https://www.bensound.com/bensound-img/cute.jpg',101,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(19,1,'Funny Song','Bensound','https://www.bensound.com/bensound-music/bensound-funnysong.mp3','https://www.bensound.com/bensound-img/funnysong.jpg',93,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(20,1,'Jazzy Frenchy','Bensound','https://www.bensound.com/bensound-music/bensound-jazzyfrenchy.mp3','https://www.bensound.com/bensound-img/jazzyfrenchy.jpg',102,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(21,1,'Acoustic Breeze','Bensound','https://www.bensound.com/bensound-music/bensound-acousticbreeze.mp3','https://www.bensound.com/bensound-img/acousticbreeze.jpg',140,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(22,1,'Clear Day','Bensound','https://www.bensound.com/bensound-music/bensound-clearday.mp3','https://www.bensound.com/bensound-img/clearday.jpg',113,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(23,1,'Relaxing','Bensound','https://www.bensound.com/bensound-music/bensound-relaxing.mp3','https://www.bensound.com/bensound-img/relaxing.jpg',238,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(24,1,'Calm','Bensound','https://www.bensound.com/bensound-music/bensound-calm.mp3','https://www.bensound.com/bensound-img/calm.jpg',300,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(25,1,'November','Bensound','https://www.bensound.com/bensound-music/bensound-november.mp3','https://www.bensound.com/bensound-img/november.jpg',180,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(26,1,'Sad Day','Bensound','https://www.bensound.com/bensound-music/bensound-sadday.mp3','https://www.bensound.com/bensound-img/sadday.jpg',138,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(27,1,'The Lounge','Bensound','https://www.bensound.com/bensound-music/bensound-thelounge.mp3','https://www.bensound.com/bensound-img/thelounge.jpg',251,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(28,1,'Inspire','Bensound','https://www.bensound.com/bensound-music/bensound-inspire.mp3','https://www.bensound.com/bensound-img/inspire.jpg',148,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(29,1,'Dreams','Bensound','https://www.bensound.com/bensound-music/bensound-dreams.mp3','https://www.bensound.com/bensound-img/dreams.jpg',202,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(30,1,'Perception','Bensound','https://www.bensound.com/bensound-music/bensound-perception.mp3','https://www.bensound.com/bensound-img/perception.jpg',180,'link',NULL,NULL,NULL,1,0,0,'approved','2026-02-04 17:10:07','2026-02-04 17:10:07',NULL),(31,1,'Moose','Bensound','https://www.bensound.com/bensound-music/bensound-moose.mp3','https://www.bensound.com/bensound-img/moose.jpg',178,'link',NULL,NULL,NULL,1,1,0,'approved','2026-02-04 17:10:07','2026-02-04 09:10:58',NULL),(32,1,'Night Owl','Bensound','https://www.bensound.com/bensound-music/bensound-nightowl.mp3','https://www.bensound.com/bensound-img/nightowl.jpg',180,'link',NULL,NULL,NULL,1,12,0,'approved','2026-02-04 17:10:07','2026-02-04 10:12:40',NULL); +/*!40000 ALTER TABLE `nf_music_library` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_music_likes` +-- + +DROP TABLE IF EXISTS `nf_music_likes`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_music_likes` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `music_id` bigint NOT NULL COMMENT '闊充箰ID', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_music` (`user_id`,`music_id`), + KEY `idx_music_id` (`music_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐢ㄦ埛闊充箰鐐硅禐琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_music_likes` +-- + +LOCK TABLES `nf_music_likes` WRITE; +/*!40000 ALTER TABLE `nf_music_likes` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_music_likes` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_outfit_items` +-- + +DROP TABLE IF EXISTS `nf_outfit_items`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_outfit_items` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鏈嶉グID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '鍚嶇О', + `category` enum('top','bottom','dress') NOT NULL COMMENT '鍒嗙被:top=涓婅,bottom=涓嬭,dress=杩炶。瑁?杩炰綋鏈?, + `gender` enum('male','female','unisex') NOT NULL DEFAULT 'unisex' COMMENT '閫傜敤鎬у埆:male=鐢?female=濂?unisex=閫氱敤', + `image_url` varchar(255) NOT NULL COMMENT '鏈嶉グ鍥剧墖(灞曠ず+璇曡。API鐢?', + `is_free` tinyint(1) NOT NULL DEFAULT '0' COMMENT '鏄惁鍏嶈垂', + `price_gold` int NOT NULL DEFAULT '0' COMMENT '閲戝竵浠锋牸(鏀惰垂鏃?', + `is_vip_only` tinyint(1) NOT NULL DEFAULT '0' COMMENT '鏄惁浠匳IP鍙/鍙敤', + `status` enum('0','1') NOT NULL DEFAULT '1' COMMENT '鐘舵€?1=涓婃灦,0=涓嬫灦', + `weigh` int NOT NULL DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL, + `updatetime` bigint DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鎹㈣鏈嶉グ搴?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_outfit_items` +-- + +LOCK TABLES `nf_outfit_items` WRITE; +/*!40000 ALTER TABLE `nf_outfit_items` DISABLE KEYS */; +INSERT INTO `nf_outfit_items` VALUES (1,'鐧借壊T鎭?,'top','female','/uploads/outfit/top/white_tshirt.png',1,0,0,'1',100,1770190293,1770190293),(2,'绮夎壊鐭','top','female','/uploads/outfit/top/pink_short_sleeve.png',1,0,0,'1',99,1770190293,1770190293),(3,'钃濊壊琛~','top','female','/uploads/outfit/top/blue_shirt.png',1,0,0,'1',98,1770190293,1770190293),(4,'鐏拌壊鍗。','top','female','/uploads/outfit/top/gray_sweatshirt.png',1,0,0,'1',97,1770190293,1770190293),(5,'钑句笣鍚婂甫涓婅。','top','female','/uploads/outfit/top/lace_strap.png',0,100,0,'1',96,1770190293,1770190293),(6,'涓€瀛楅闇茶偐涓婅。','top','female','/uploads/outfit/top/off_shoulder.png',0,80,0,'1',95,1770190293,1770190293),(7,'闇茶剱鐭','top','female','/uploads/outfit/top/crop_top.png',0,60,0,'1',94,1770190293,1770190293),(8,'閽堢粐寮€琛?,'top','female','/uploads/outfit/top/knit_cardigan.png',0,90,0,'1',92,1770190293,1770190293),(9,'灏忛椋庡濂?,'top','female','/uploads/outfit/top/tweed_jacket.png',0,150,0,'1',91,1770190293,1770190293),(10,'鐪熶笣琛~','top','female','/uploads/outfit/top/silk_shirt.png',0,200,1,'1',90,1770190293,1770190293),(11,'钃濊壊鐗涗粩瑁?,'bottom','female','/uploads/outfit/bottom/blue_jeans.png',1,0,0,'1',100,1770190293,1770190293),(12,'榛戣壊鐭','bottom','female','/uploads/outfit/bottom/black_skirt.png',1,0,0,'1',99,1770190293,1770190293),(13,'鐧借壊鐭¥','bottom','female','/uploads/outfit/bottom/white_shorts.png',1,0,0,'1',98,1770190293,1770190293),(14,'鐏拌壊杩愬姩瑁?,'bottom','female','/uploads/outfit/bottom/gray_sweatpants.png',1,0,0,'1',97,1770190293,1770190293),(15,'A瀛楀崐韬','bottom','female','/uploads/outfit/bottom/a_line_skirt.png',0,80,0,'1',96,1770190293,1770190293),(16,'楂樿叞闃旇吙瑁?,'bottom','female','/uploads/outfit/bottom/high_waist_pants.png',0,100,0,'1',95,1770190293,1770190293),(17,'鐧捐ざ鐭','bottom','female','/uploads/outfit/bottom/pleated_skirt.png',0,70,0,'1',94,1770190293,1770190293),(18,'鐮存礊鐗涗粩瑁?,'bottom','female','/uploads/outfit/bottom/ripped_jeans.png',0,60,0,'1',92,1770190293,1770190293),(19,'瑗胯瑁?,'bottom','female','/uploads/outfit/bottom/suit_pants.png',0,120,0,'1',91,1770190293,1770190293),(20,'鐧借壊杩炶。瑁?,'dress','female','/uploads/outfit/dress/white_dress.png',1,0,0,'1',100,1770190293,1770190293),(21,'纰庤姳杩炶。瑁?,'dress','female','/uploads/outfit/dress/floral_dress.png',1,0,0,'1',99,1770190293,1770190293),(22,'榛戣壊灏忕ぜ鏈?,'dress','female','/uploads/outfit/dress/black_dress.png',1,0,0,'1',98,1770190293,1770190293),(23,'浼橀泤闀胯','dress','female','/uploads/outfit/dress/elegant_long_dress.png',0,200,0,'1',95,1770190293,1770190293),(24,'鍚婂甫杩炶。瑁?,'dress','female','/uploads/outfit/dress/strapless_dress.png',0,120,0,'1',94,1770190293,1770190293),(25,'JK鍒舵湇','dress','female','/uploads/outfit/dress/jk_uniform.png',0,200,0,'1',92,1770190293,1770190293),(26,'姹夋湇','dress','female','/uploads/outfit/dress/hanfu.png',0,300,0,'1',91,1770190293,1770190293),(27,'娲涗附濉?,'dress','female','/uploads/outfit/dress/lolita.png',0,350,0,'1',90,1770190293,1770190293),(28,'鍦h癁瑁?,'dress','female','/uploads/outfit/dress/christmas_dress.png',0,200,0,'1',85,1770190293,1770190293),(29,'楂樼骇瀹氬埗濠氱罕','dress','female','/uploads/outfit/dress/custom_wedding_dress.png',0,1000,1,'1',83,1770190293,1770190293); +/*!40000 ALTER TABLE `nf_outfit_items` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_outfit_looks` +-- + +DROP TABLE IF EXISTS `nf_outfit_looks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_outfit_looks` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '褰㈣薄璁板綍ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '褰㈣薄鍚嶇О/鍒悕', + `image_url` varchar(255) NOT NULL COMMENT '鐢熸垚鍚庣殑鎴愬搧鍥?URL)', + `top_item_id` bigint DEFAULT NULL COMMENT '涓婅ID', + `bottom_item_id` bigint DEFAULT NULL COMMENT '涓嬭ID', + `dress_item_id` bigint DEFAULT NULL COMMENT '杩炶。瑁?杩炰綋鏈岻D', + `deleted_at` datetime DEFAULT NULL COMMENT '杞垹鏃堕棿', + `createtime` datetime DEFAULT CURRENT_TIMESTAMP, + `updatetime` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鎹㈣褰㈣薄鏍?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_outfit_looks` +-- + +LOCK TABLES `nf_outfit_looks` WRITE; +/*!40000 ALTER TABLE `nf_outfit_looks` DISABLE KEYS */; +INSERT INTO `nf_outfit_looks` VALUES (1,12,12,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/12/images/1766719694.png',NULL,NULL,NULL,'2025-12-29 03:21:28','2025-12-28 13:27:36','2025-12-29 03:21:28'),(2,12,12,'褰撳墠褰㈣薄','http://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/dc/20251228/1bd48ae9/f1fb4fba-236e-439a-8b7f-3ce3411bea7a_tryon.jpg?Expires=1767014853&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=tFKMxDjQnIs1VT%2FURDxXXaJNf%2FU%3D',3,8,NULL,NULL,'2025-12-29 01:03:13','2025-12-29 03:26:36'),(3,12,12,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/12/images/1766719694.png',NULL,NULL,NULL,NULL,'2025-12-29 01:17:06','2025-12-29 03:17:46'),(5,12,12,'褰撳墠褰㈣薄','http://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/dc/20251228/1bd48ae9/f1fb4fba-236e-439a-8b7f-3ce3411bea7a_tryon.jpg?Expires=1767014853&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=tFKMxDjQnIs1VT%2FURDxXXaJNf%2FU%3D',3,8,NULL,'2025-12-29 02:15:52',NULL,'2025-12-29 02:15:52'),(6,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766993020_outfit.jpg',NULL,NULL,10,'2025-12-29 07:24:27','2025-12-29 06:38:40','2025-12-29 07:24:27'),(7,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766990319_outfit.jpg',2,5,NULL,'2025-12-29 07:13:21','2025-12-29 06:55:02','2025-12-29 07:13:21'),(8,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766991301_outfit.jpg',NULL,NULL,9,NULL,'2025-12-29 06:57:32','2025-12-29 07:25:57'),(9,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766992907_outfit.jpg',NULL,NULL,9,'2025-12-29 07:22:58','2025-12-29 07:21:48','2025-12-29 07:22:58'),(10,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766827024.png',NULL,NULL,NULL,NULL,'2025-12-29 07:23:41','2025-12-29 07:24:01'),(11,15,13,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/13/images/1766993373_outfit.jpg',3,4,NULL,NULL,'2025-12-29 07:29:35','2025-12-29 07:29:46'),(12,31,21,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/21/images/1767184149_outfit.jpg',NULL,NULL,9,NULL,'2025-12-31 12:29:11','2025-12-31 12:33:32'),(13,31,21,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/21/images/1767184246_outfit.jpg',2,5,NULL,NULL,'2025-12-31 12:30:47','2025-12-31 12:30:57'),(14,27,17,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/17/images/1767178791_female.png',NULL,NULL,NULL,'2026-01-06 08:57:45','2025-12-31 12:57:27','2026-01-06 08:57:45'),(15,12,31,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/31/images/1767514081_female.png',NULL,NULL,NULL,NULL,'2026-01-04 08:42:21','2026-01-04 08:42:21'),(16,12,31,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/31/images/1767516154_outfit.jpg',2,5,NULL,NULL,'2026-01-04 08:42:36','2026-01-04 08:42:44'),(17,41,39,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/39/images/1767520009_outfit.jpg',2,5,NULL,NULL,'2026-01-04 09:45:34','2026-01-09 14:19:47'),(18,41,39,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/50/images/1767968045_female.png',NULL,NULL,NULL,NULL,'2026-01-04 09:46:50','2026-01-09 14:17:52'),(19,27,43,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/43/images/1767693456_outfit.jpg',NULL,5,NULL,NULL,'2026-01-06 08:58:31','2026-01-07 03:04:52'),(20,27,43,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/43/images/1767689910_outfit.jpg',2,5,NULL,NULL,'2026-01-07 02:56:40','2026-01-07 02:59:24'),(21,40,44,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/44/images/1767922093_female.png',NULL,NULL,NULL,NULL,'2026-01-09 01:30:55','2026-01-09 01:30:55'),(22,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1767947546_outfit.jpg',NULL,5,NULL,'2026-01-12 07:55:46','2026-01-09 08:32:28','2026-01-12 07:55:46'),(23,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1767947994_outfit.jpg',2,NULL,NULL,'2026-01-12 07:55:50','2026-01-09 08:39:55','2026-01-12 07:55:50'),(24,36,49,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1767949899_female.png',NULL,NULL,NULL,'2026-01-19 06:43:40','2026-01-09 13:20:02','2026-01-19 06:43:40'),(25,36,49,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1767964801_outfit.jpg',NULL,NULL,10,'2026-01-19 06:43:42','2026-01-09 13:21:23','2026-01-19 06:43:42'),(26,36,49,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1767964882_outfit.jpg',NULL,NULL,9,'2026-01-19 06:40:07','2026-01-09 13:21:48','2026-01-19 06:40:07'),(27,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204513_outfit.jpg',12,4,NULL,'2026-01-12 07:55:53','2026-01-12 07:54:40','2026-01-12 07:55:53'),(28,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204575_outfit.jpg',14,13,NULL,'2026-02-04 07:32:32','2026-01-12 07:55:14','2026-02-04 07:32:32'),(29,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204975_outfit.jpg',15,5,NULL,NULL,'2026-01-12 07:56:16','2026-02-05 01:19:03'),(30,70,47,'褰撳墠褰㈣薄','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/images/1770202658_outfit.jpg',5,17,NULL,NULL,'2026-01-12 08:01:55','2026-02-05 01:19:04'),(31,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204914_outfit.jpg',16,4,NULL,'2026-01-12 08:02:40','2026-01-12 08:02:28','2026-01-12 08:02:40'),(32,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204480_outfit.jpg',12,NULL,NULL,NULL,'2026-01-12 08:02:57','2026-02-05 02:33:06'),(33,72,52,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/52/images/1768210292_female.png',NULL,NULL,NULL,NULL,'2026-01-12 09:41:58','2026-01-12 09:41:58'),(34,36,49,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/images/1768369137_outfit.jpg',NULL,NULL,9,'2026-01-19 06:40:04','2026-01-14 05:39:33','2026-01-19 06:40:04'),(35,14,56,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/images/1768808710_outfit.jpg',16,5,NULL,'2026-01-19 07:48:17','2026-01-19 07:45:12','2026-01-19 07:48:17'),(36,14,56,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/images/1768808584_female.png',NULL,NULL,NULL,NULL,'2026-01-19 07:45:43','2026-01-19 07:45:43'),(37,14,56,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/images/1768808742_outfit.jpg',16,NULL,NULL,'2026-01-19 07:48:14','2026-01-19 07:45:56','2026-01-19 07:48:14'),(38,14,56,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/56/images/1768808926_outfit.jpg',14,5,NULL,NULL,'2026-01-19 07:49:03','2026-01-19 07:49:03'),(39,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1768204947_outfit.jpg',15,NULL,NULL,NULL,'2026-02-03 07:05:49','2026-02-05 02:33:05'),(40,70,47,'褰撳墠褰㈣薄','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/images/1767946026_female.png',NULL,NULL,NULL,NULL,'2026-02-04 07:32:44','2026-02-05 01:15:36'); +/*!40000 ALTER TABLE `nf_outfit_looks` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_outfit_purchase_log` +-- + +DROP TABLE IF EXISTS `nf_outfit_purchase_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_outfit_purchase_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '璁板綍ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `item_id` bigint NOT NULL COMMENT '鏈嶉グID', + `price_gold` int NOT NULL DEFAULT '0' COMMENT '鏈鑺辫垂閲戝竵', + `platform` enum('android','ios','miniapp') NOT NULL DEFAULT 'miniapp' COMMENT '璐拱骞冲彴', + `status` enum('pending','success','failed','refund') NOT NULL DEFAULT 'success' COMMENT '鐘舵€?, + `remark` varchar(255) DEFAULT NULL COMMENT '澶囨敞', + `createtime` bigint DEFAULT NULL, + `updatetime` bigint DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ux_nf_outfit_purchase_user_item` (`user_id`,`item_id`) +) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鎹㈣鏈嶉グ璐拱璁板綍'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_outfit_purchase_log` +-- + +LOCK TABLES `nf_outfit_purchase_log` WRITE; +/*!40000 ALTER TABLE `nf_outfit_purchase_log` DISABLE KEYS */; +INSERT INTO `nf_outfit_purchase_log` VALUES (25,70,8,5,'miniapp','success',NULL,1767947527,1767947527),(26,70,11,5,'miniapp','success',NULL,1767947529,1767947529),(27,70,12,100,'miniapp','success',NULL,1768204460,1768204460),(28,70,14,60,'miniapp','success',NULL,1768204557,1768204557),(29,70,13,50,'miniapp','success',NULL,1768204560,1768204560),(30,70,16,100,'miniapp','success',NULL,1768204901,1768204901),(31,70,15,100,'miniapp','success',NULL,1768204936,1768204936),(32,72,16,100,'miniapp','success',NULL,1768210874,1768210874),(33,72,8,5,'miniapp','success',NULL,1768210877,1768210877),(34,36,16,100,'miniapp','success',NULL,1768364261,1768364261),(35,36,15,100,'miniapp','success',NULL,1768374296,1768374296),(36,14,16,100,'miniapp','success',NULL,1768808695,1768808695),(37,14,14,60,'miniapp','success',NULL,1768808911,1768808911),(38,32,15,100,'miniapp','success',NULL,1769832568,1769832568),(39,32,16,100,'miniapp','success',NULL,1769832598,1769832598),(40,70,5,100,'miniapp','success',NULL,1770190331,1770190331),(41,70,17,70,'miniapp','success',NULL,1770190338,1770190338); +/*!40000 ALTER TABLE `nf_outfit_purchase_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_recharge_package` +-- + +DROP TABLE IF EXISTS `nf_recharge_package`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_recharge_package` ( + `id` int NOT NULL AUTO_INCREMENT, + `money` int DEFAULT NULL COMMENT '閲戦', + `jinbi` int DEFAULT NULL COMMENT '閲戝竵鏁伴噺', + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鍏呭€奸噾甯佸椁?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_recharge_package` +-- + +LOCK TABLES `nf_recharge_package` WRITE; +/*!40000 ALTER TABLE `nf_recharge_package` DISABLE KEYS */; +INSERT INTO `nf_recharge_package` VALUES (1,1,100,1,1766761541,1766761541),(2,6,600,2,1766761550,1766761550),(3,10,1000,3,1766761558,1766761558),(4,30,3000,4,1766761567,1766761567); +/*!40000 ALTER TABLE `nf_recharge_package` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_sing_base_video` +-- + +DROP TABLE IF EXISTS `nf_sing_base_video`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_sing_base_video` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鍩虹鏃犲0瑙嗛ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `image_url` varchar(255) DEFAULT NULL COMMENT '鎭嬩汉褰㈣薄URL', + `image_hash` char(64) NOT NULL COMMENT 'image_url 鍝堝笇(sha256)', + `prompt` varchar(400) DEFAULT NULL COMMENT '鐢熸垚鎻愮ず璇?, + `prompt_hash` char(64) NOT NULL COMMENT 'prompt 鍝堝笇(sha256)', + `model` varchar(64) NOT NULL DEFAULT 'wan2.2-i2v-flash' COMMENT '妯″瀷', + `resolution` varchar(16) NOT NULL DEFAULT '480P' COMMENT '鍒嗚鲸鐜?, + `duration` int NOT NULL DEFAULT '5' COMMENT '鏃堕暱(绉?', + `dashscope_task_id` varchar(64) DEFAULT NULL COMMENT 'DashScope 浠诲姟ID', + `status` enum('pending','running','succeeded','failed') NOT NULL DEFAULT 'pending' COMMENT '鐘舵€?, + `base_video_url` varchar(255) DEFAULT NULL COMMENT '鏃犲0瑙嗛OSS鍦板潃', + `error_msg` varchar(255) DEFAULT NULL COMMENT '閿欒淇℃伅', + `generation_task_id` bigint DEFAULT NULL COMMENT '鍏宠仈浠诲姟ID(鍙€?', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uniq_base` (`lover_id`,`image_hash`,`prompt_hash`,`model`,`resolution`,`duration`) USING BTREE, + KEY `idx_base_user` (`user_id`,`lover_id`,`status`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_sing_base_video` +-- + +LOCK TABLES `nf_sing_base_video` WRITE; +/*!40000 ALTER TABLE `nf_sing_base_video` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_sing_base_video` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_sing_song_video` +-- + +DROP TABLE IF EXISTS `nf_sing_song_video`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_sing_song_video` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鍚堟垚瑙嗛ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `song_id` bigint NOT NULL COMMENT '姝屾洸ID(nf_song_library.id)', + `music_library_id` bigint DEFAULT NULL, + `music_source` varchar(20) DEFAULT 'system', + `base_video_id` bigint DEFAULT NULL COMMENT '鍩虹鏃犲0瑙嗛ID', + `audio_url` varchar(255) NOT NULL COMMENT '姝屾洸闊抽URL', + `audio_hash` char(64) NOT NULL COMMENT 'audio_url 鍝堝笇(sha256)', + `image_hash` char(64) DEFAULT NULL COMMENT '鍥剧墖SHA256', + `ratio` enum('1:1','3:4') NOT NULL DEFAULT '3:4' COMMENT '鐢诲箙', + `style_level` enum('normal','calm','active') NOT NULL DEFAULT 'normal' COMMENT '鍔ㄤ綔椋庢牸', + `merged_video_url` varchar(255) DEFAULT NULL COMMENT '鍚堟垚瑙嗛OSS鍦板潃', + `status` enum('pending','running','succeeded','failed') NOT NULL DEFAULT 'pending' COMMENT '鐘舵€?, + `error_msg` varchar(255) DEFAULT NULL COMMENT '閿欒淇℃伅', + `generation_task_id` bigint DEFAULT NULL COMMENT '鍏宠仈浠诲姟ID(鍙€?', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '鍒涘缓鏃堕棿', + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uniq_merge` (`lover_id`,`song_id`,`audio_hash`,`image_hash`,`ratio`,`style_level`), + KEY `idx_merge_user` (`user_id`,`lover_id`,`song_id`,`status`) USING BTREE, + KEY `idx_merge_base` (`base_video_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_sing_song_video` +-- + +LOCK TABLES `nf_sing_song_video` WRITE; +/*!40000 ALTER TABLE `nf_sing_song_video` DISABLE KEYS */; +INSERT INTO `nf_sing_song_video` VALUES (22,70,47,4,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3','dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1','0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/1769435474_4.mp4','succeeded',NULL,255,'2026-01-26 13:51:16','2026-01-26 13:51:16'),(23,36,49,9,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3','9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769440091_9.mp4','succeeded',NULL,261,'2026-01-26 15:08:30','2026-01-26 15:08:30'),(25,36,49,2,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3','5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769484626_2.mp4','succeeded','DataInspectionFailed',270,'2026-01-27 03:30:44','2026-01-27 03:30:44'),(26,36,49,7,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/270985359774149e730b22a568305aad.mp3','dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769485459_7.mp4','succeeded',NULL,272,'2026-01-27 03:44:38','2026-01-27 03:44:38'),(27,36,49,3,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3','c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769488833_3.mp4','succeeded',NULL,273,'2026-01-27 04:40:48','2026-01-27 04:40:48'),(28,36,49,4,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3','dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769495627_4.mp4','succeeded',NULL,280,'2026-01-27 06:34:05','2026-01-27 06:34:05'),(29,36,49,5,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3','e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769502206_5.mp4','succeeded',NULL,281,'2026-01-27 08:23:45','2026-01-27 08:23:45'),(30,36,49,6,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3','e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68','b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769506690_6.mp4','succeeded',NULL,294,'2026-01-27 09:38:29','2026-01-27 09:38:29'),(31,36,49,2,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3','5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d','a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/1769583310_2.mp4','succeeded','DataInspectionFailed',316,'2026-01-28 06:55:25','2026-01-28 06:55:25'),(32,32,61,2,NULL,'system',NULL,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3','5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d','6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','3:4','normal','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/1769696077_2.mp4','succeeded','DataInspectionFailed',341,'2026-01-29 14:14:53','2026-01-29 14:14:53'),(33,70,47,9,NULL,'system',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3','9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf','0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','3:4','normal','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770100721_9.mp4','succeeded',NULL,377,'2026-02-03 06:38:45','2026-02-03 06:38:45'),(34,70,47,5,NULL,'system',NULL,'https://hello12312312.oss-cn-hangzhou.aliyuncs.com/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3','e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852','0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','3:4','normal','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/1770101009_5.mp4','succeeded',NULL,380,'2026-02-03 06:43:36','2026-02-03 06:43:36'); +/*!40000 ALTER TABLE `nf_sing_song_video` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_sms` +-- + +DROP TABLE IF EXISTS `nf_sms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_sms` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `event` varchar(30) DEFAULT '' COMMENT '浜嬩欢', + `mobile` varchar(20) DEFAULT '' COMMENT '鎵嬫満鍙?, + `code` varchar(10) DEFAULT '' COMMENT '楠岃瘉鐮?, + `times` int unsigned NOT NULL DEFAULT '0' COMMENT '楠岃瘉娆℃暟', + `ip` varchar(30) DEFAULT '' COMMENT 'IP', + `createtime` bigint unsigned DEFAULT '0' COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐭俊楠岃瘉鐮佽〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_sms` +-- + +LOCK TABLES `nf_sms` WRITE; +/*!40000 ALTER TABLE `nf_sms` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_sms` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_song_library` +-- + +DROP TABLE IF EXISTS `nf_song_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_song_library` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '姝屾洸ID', + `title` varchar(128) NOT NULL DEFAULT '' COMMENT '姝屾洸鏍囬', + `artist` varchar(64) DEFAULT NULL COMMENT '婕斿敱鑰?, + `gender` enum('male','female') NOT NULL COMMENT '鐗堟湰鎬у埆:male=鐢峰0,female=濂冲0', + `audio_url` varchar(255) NOT NULL COMMENT '闊抽URL锛堟暣棣栨瓕锛?, + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '鐘舵€?1=涓婃灦,0=涓嬫灦', + `weigh` int DEFAULT '0' COMMENT '鎺掑簭鏉冮噸', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '杞垹闄ゆ椂闂?, + `audio_hash` char(64) DEFAULT NULL COMMENT '鏁存洸闊抽SHA256', + `duration_sec` int DEFAULT NULL COMMENT '鏁存洸鏃堕暱(绉?', + PRIMARY KEY (`id`), + KEY `idx_status_weigh` (`status`,`weigh`), + KEY `idx_title_gender` (`title`,`gender`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='闊抽搴?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_song_library` +-- + +LOCK TABLES `nf_song_library` WRITE; +/*!40000 ALTER TABLE `nf_song_library` DISABLE KEYS */; +INSERT INTO `nf_song_library` VALUES (1,'铏氭嫙瑙掕壊','123','male','/uploads/20260112/b2c25914521b1eb90f43f7e0997840f6.mp3',1,222,1768292708,1768292735,1768292735,NULL,NULL),(2,'鏉ョ敓缂?,'鍗曚緷绾?鍒樻儨鍚?,'female','/uploads/20260126/424a4cf1b55c1dd1d487388bef376f43.mp3',1,2,1768294311,1769438497,NULL,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',288),(3,'绾㈣壊楂樿窡闉?,'钄″仴闆?,'female','/uploads/20260126/36151a02b3261bc31c90905c1c92f278.mp3',1,3,1768295737,1769438384,NULL,'c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e',207),(4,'绂诲紑鎴戠殑渚濊禆','鐜嬭壋钖?,'female','/uploads/20260126/a9c377cc1b9931f0ce81907e23e4d588.mp3',1,4,1768360291,1769427641,NULL,'dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1',234),(5,'濡傛効','鐜嬭彶','female','/uploads/20260126/77e0ebf7645931b0dc3dc6683ae7a54f.mp3',1,5,1768360507,1769437830,NULL,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',266),(6,'涓€璺敓鑺?,'娓╁蹇?,'female','/uploads/20260126/4f18553f2af06e355ad75a5ee6173456.mp3',1,6,1768360779,1769437666,NULL,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',257),(7,'鏆栨殩','姊侀潤鑼?,'female','/uploads/20260126/270985359774149e730b22a568305aad.mp3',1,7,1768361077,1769437574,NULL,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',244),(8,'鏉ョ敓缂?,'','male','/uploads/20260117/1b4ed03a58f1a5c733b28590eb017be2.mp3',1,8,1768383402,1768648173,NULL,NULL,NULL),(9,'涓€鍗婁竴鍗?,'寮犵ⅶ鏅?,'female','/uploads/20260126/eb0d206f4ccd8e38ce1e5f014fcced4e.mp3',1,9,1768645974,1769435643,NULL,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',249),(10,'Night Owl','Bensound','female','https://www.bensound.com/bensound-music/bensound-nightowl.mp3',1,0,1770199493,1770199493,NULL,'e132b860108edad661d2bb78be523de6',180); +/*!40000 ALTER TABLE `nf_song_library` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_song_segment_video` +-- + +DROP TABLE IF EXISTS `nf_song_segment_video`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_song_segment_video` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鍒嗘瑙嗛ID', + `user_id` bigint NOT NULL COMMENT '鐢ㄦ埛ID', + `lover_id` bigint NOT NULL COMMENT '鎭嬩汉ID', + `song_id` bigint NOT NULL COMMENT '姝屾洸ID', + `segment_id` bigint NOT NULL COMMENT '鍒嗘ID', + `image_hash` char(64) NOT NULL COMMENT '鍥剧墖SHA256', + `model` varchar(64) NOT NULL DEFAULT 'emo-v1' COMMENT '妯″瀷', + `ratio` enum('1:1','3:4') NOT NULL DEFAULT '3:4' COMMENT '鐢诲箙', + `style_level` enum('normal','calm','active') NOT NULL DEFAULT 'normal' COMMENT '鍔ㄤ綔椋庢牸', + `dashscope_task_id` varchar(64) DEFAULT NULL COMMENT 'DashScope浠诲姟ID', + `video_url` varchar(255) DEFAULT NULL COMMENT '鍒嗘瑙嗛URL', + `status` enum('pending','running','succeeded','failed') NOT NULL DEFAULT 'pending', + `error_msg` varchar(255) DEFAULT NULL COMMENT '閿欒淇℃伅', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_segment_video` (`segment_id`,`image_hash`,`style_level`,`model`), + KEY `idx_song_status` (`song_id`,`status`) +) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_song_segment_video` +-- + +LOCK TABLES `nf_song_segment_video` WRITE; +/*!40000 ALTER TABLE `nf_song_segment_video` DISABLE KEYS */; +INSERT INTO `nf_song_segment_video` VALUES (1,70,47,4,1,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','7a0df1f4-517e-4727-adc4-3f0b759636c0','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/segments/4_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_1.mp4','succeeded',NULL,'2026-01-26 11:47:40','2026-01-26 12:29:43'),(2,70,47,4,2,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','ef130ba1-303d-4d83-bea5-08f5307a271d','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/segments/4_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_2.mp4','succeeded',NULL,'2026-01-26 12:29:43','2026-01-26 13:01:32'),(3,70,47,4,3,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','e49fa137-a01a-480c-aa1e-fce7244a9c94','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/segments/4_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_3.mp4','succeeded',NULL,'2026-01-26 13:01:32','2026-01-26 13:33:59'),(4,70,47,4,4,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','96acc973-ec32-4c98-a39b-b47ce8acc3f4','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/47/sing/segments/4_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_4.mp4','succeeded',NULL,'2026-01-26 13:34:03','2026-01-26 13:51:09'),(5,36,49,9,5,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','15deab53-ce71-4aa9-9670-ab84c1b40cfb','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/9_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-26 14:01:44','2026-01-26 14:17:27'),(6,36,49,9,6,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','914fefd5-007d-4417-99e3-788c8380cf8a','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/9_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-26 14:17:27','2026-01-26 14:33:13'),(7,36,49,9,7,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','d521bdb3-1aba-4fea-850c-e96dde5dc540','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/9_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-26 14:33:13','2026-01-26 14:49:05'),(8,36,49,9,8,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','61a91fa0-a86d-4b09-bab6-d4456affbf73','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/9_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-26 14:49:05','2026-01-26 15:05:40'),(9,36,49,9,9,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','88149ab3-bebc-4a28-bb52-93722f11950f','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/9_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_5.mp4','succeeded',NULL,'2026-01-26 15:05:40','2026-01-26 15:08:10'),(10,36,49,7,10,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','2e88e978-9f28-4035-828c-a0b6e3eeef8a','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/7_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-26 15:30:21','2026-01-26 15:45:58'),(11,36,49,7,11,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','515d2fa0-d2a3-4772-9deb-c27960f2164d','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/7_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-26 15:45:58','2026-01-26 16:01:26'),(12,36,49,7,12,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','11053db3-5182-4692-8373-067ec34788fd','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/7_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-26 16:01:26','2026-01-26 16:16:54'),(13,36,49,7,13,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','6d9c9d1d-aae9-4094-b5d6-5231f6ce30af','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/7_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-26 16:16:54','2026-01-26 16:32:22'),(14,36,49,7,14,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','93adac36-ce6f-4746-a531-d486fd845890','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/7_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_5.mp4','succeeded',NULL,'2026-01-26 16:32:22','2026-01-27 03:44:18'),(15,36,49,2,15,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','ecd867b8-1cab-4b2e-a606-1ceb2d346c53','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-27 00:40:43','2026-01-27 00:56:36'),(16,36,49,2,16,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','c8af446c-59c4-4697-aa53-13e3d92a165c','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-27 00:56:36','2026-01-27 01:12:19'),(17,36,49,2,17,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','559a7151-c3ad-4e4c-ab33-7ff91d0ce58e','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-27 01:12:19','2026-01-27 01:28:02'),(18,36,49,2,18,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','f20eb8d9-36ee-43ed-940c-f92ab524f17d','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-27 01:28:02','2026-01-27 01:43:58'),(19,36,49,2,19,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','6c771307-0e6b-4692-afa4-4aee467a0814',NULL,'failed','瑙嗛鐢熸垚澶辫触: DataInspectionFailed: Input data may contain inappropriate content.','2026-01-27 01:43:58','2026-01-27 03:30:25'),(20,36,49,3,20,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','9e945b65-8445-48dd-9d19-0d3b9dbae1d5','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/3_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-27 03:46:01','2026-01-27 04:01:46'),(21,36,49,3,21,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','e235026b-6140-4360-bd67-599da596d110','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/3_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-27 04:01:46','2026-01-27 04:17:35'),(22,36,49,3,22,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','545c27ee-c538-41f2-a007-04fd5e4e3e47','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/3_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-27 04:17:35','2026-01-27 04:33:20'),(23,36,49,3,23,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','37cd2453-95a6-4dc5-9b1b-bcf3256e0e4f','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/3_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-27 04:33:20','2026-01-27 04:40:32'),(24,36,49,4,1,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','c0550cd6-e37b-40e8-8b77-5cf61603119e','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/4_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-27 04:47:09','2026-01-27 05:02:48'),(27,36,49,4,2,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','fdbaf968-b303-4311-8e88-e61044114871','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/4_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-27 05:36:24','2026-01-27 06:04:04'),(28,36,49,4,3,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','d81d79e0-cb88-48f1-bbd8-cc5547b0b851','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/4_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-27 06:04:04','2026-01-27 06:19:34'),(29,36,49,4,4,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','ca03e74e-926f-4e79-8041-c5eb765c6f25','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/4_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-27 06:19:34','2026-01-27 06:33:46'),(30,36,49,5,24,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','505153d0-2bab-42b7-b11a-a4659a7eb2c7','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/5_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-27 07:13:32','2026-01-27 07:29:18'),(31,36,49,5,25,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','20d3798c-0e13-4fce-ba0b-4fd2bd03b55d','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/5_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-27 07:29:18','2026-01-27 07:45:03'),(32,36,49,5,26,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','15fdffdf-9ca0-45ac-859d-29c7fa76fad1','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/5_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-27 07:45:03','2026-01-27 08:00:45'),(33,36,49,5,27,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','f6ed15d9-ccb8-434a-b5ff-6949cae29b41','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/5_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-27 08:00:45','2026-01-27 08:16:41'),(34,36,49,5,28,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','cdb1ff34-ef11-47c0-949a-e56696fb6b6b','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/5_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_5.mp4','succeeded',NULL,'2026-01-27 08:16:41','2026-01-27 08:23:25'),(35,36,49,6,29,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','a9b2437c-24e0-4d5a-9718-90f0204cabc6','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/6_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_1.mp4','succeeded',NULL,'2026-01-27 08:31:30','2026-01-27 08:47:10'),(36,36,49,6,30,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','10fc6e80-eebf-410e-892d-3c453d69a4a5','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/6_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_2.mp4','succeeded',NULL,'2026-01-27 08:47:10','2026-01-27 09:02:41'),(37,36,49,6,31,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','d33e1af6-f6be-4885-9091-b19eee22e2ac','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/6_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_3.mp4','succeeded',NULL,'2026-01-27 09:02:41','2026-01-27 09:18:11'),(38,36,49,6,32,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','c2c01405-d3c7-4e32-81a5-aaf010f0b5ad','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/6_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_4.mp4','succeeded',NULL,'2026-01-27 09:18:11','2026-01-27 09:33:41'),(39,36,49,6,33,'b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f','emo-v1','3:4','normal','ef4064aa-7988-4bd1-a611-8a3ca6e49c18','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/6_b2824f81f1a99d3b7fb2bd30c47d8d1a3d0862bfba4ff64f2bf06fff4b0d8d0f_normal_5.mp4','succeeded',NULL,'2026-01-27 09:33:41','2026-01-27 09:38:09'),(40,36,49,2,15,'a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','emo-v1','3:4','normal','c7530295-2263-457e-9920-9aea4731e058','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920_normal_1.mp4','succeeded',NULL,'2026-01-28 05:51:50','2026-01-28 06:07:38'),(41,36,49,2,16,'a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','emo-v1','3:4','normal','754e602d-5f45-4317-9b6b-040bffddd9b1','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920_normal_2.mp4','succeeded',NULL,'2026-01-28 06:07:38','2026-01-28 06:23:29'),(42,36,49,2,17,'a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','emo-v1','3:4','normal','9c485aec-9fc3-45f9-b9f8-3e1af83fa71b','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920_normal_3.mp4','succeeded',NULL,'2026-01-28 06:23:29','2026-01-28 06:39:14'),(43,36,49,2,18,'a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','emo-v1','3:4','normal','d6b573e8-8907-4590-987d-8d34fb04f364','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/49/sing/segments/2_a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920_normal_4.mp4','succeeded',NULL,'2026-01-28 06:39:14','2026-01-28 06:54:56'),(44,36,49,2,19,'a23a595bdd84f3b41749ec191fd7011af70107db6e31b899e38d60c683ef7920','emo-v1','3:4','normal','797b579f-5384-42b5-a183-41d0909808c4',NULL,'failed','瑙嗛鐢熸垚澶辫触: DataInspectionFailed: Input data may contain inappropriate content.','2026-01-28 06:54:56','2026-01-28 06:55:09'),(47,32,61,2,15,'6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','emo-v1','3:4','normal','8ced72f6-fc31-4284-8b5b-cf8ac8650025','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/segments/2_6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95_normal_1.mp4','succeeded',NULL,'2026-01-29 13:11:06','2026-01-29 13:26:54'),(48,32,61,2,16,'6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','emo-v1','3:4','normal','99959f45-ef91-41c8-91b1-93af95c1f6b6','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/segments/2_6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95_normal_2.mp4','succeeded',NULL,'2026-01-29 13:26:54','2026-01-29 13:42:42'),(49,32,61,2,17,'6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','emo-v1','3:4','normal','5b23b5ab-d44e-49af-85a1-fe6f74f9e2b1','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/segments/2_6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95_normal_3.mp4','succeeded',NULL,'2026-01-29 13:42:42','2026-01-29 13:58:33'),(50,32,61,2,18,'6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','emo-v1','3:4','normal','6f23641f-5ab6-4784-b281-9b1f08065d18','https://nvlovers.oss-cn-qingdao.aliyuncs.com/lover/61/sing/segments/2_6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95_normal_4.mp4','succeeded',NULL,'2026-01-29 13:58:33','2026-01-29 14:14:27'),(51,32,61,2,19,'6f5fb07966744576f518212c9e044a0ec844eb965956118f53e489d742f0cb95','emo-v1','3:4','normal','0695f538-11d3-449d-a561-cdfdaccfef3f',NULL,'failed','瑙嗛鐢熸垚澶辫触: DataInspectionFailed: Input data may contain inappropriate content.','2026-01-29 14:14:27','2026-01-29 14:14:37'),(52,70,47,9,5,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','be951502-28bb-4b28-b14f-b7a4a454c966','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/9_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_1.mp4','succeeded',NULL,'2026-02-02 02:26:22','2026-02-02 04:04:10'),(53,70,47,6,29,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','4d057494-4b51-40f2-bb29-49aabbb5b45b','http://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/1d/e2/20260202/83e39769/9b4fc160-224c-4064-b19e-30637aa5da3b_wologo.mp4?Expires=1770089273&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=tJUWquZyfnje49wlfHEy0sc7rkA%3D','succeeded',NULL,'2026-02-02 02:41:43','2026-02-02 11:45:19'),(54,70,47,3,20,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','5b2105b8-9665-4102-b117-8676e1037ea4',NULL,'running',NULL,'2026-02-02 02:47:59','2026-02-02 02:48:01'),(55,70,47,2,15,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','7e24af7a-1aa8-4f95-877e-6153daa3eccb',NULL,'running',NULL,'2026-02-02 02:55:47','2026-02-02 02:55:54'),(56,70,47,6,30,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','5ffa34db-b9c0-413e-8c72-98d80d7c529d',NULL,'running',NULL,'2026-02-02 03:46:43','2026-02-02 04:02:19'),(57,70,47,9,6,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','92113e05-bd29-4d84-a2a7-9b5af448f8ee','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/9_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_2.mp4','succeeded',NULL,'2026-02-02 04:06:01','2026-02-02 04:33:40'),(58,70,47,9,7,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','adf9f996-7bad-4671-afd1-208eaee6b036','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/9_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_3.mp4','succeeded',NULL,'2026-02-02 05:13:45','2026-02-02 05:29:32'),(59,70,47,9,8,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','23d53a35-a578-466b-a92f-bd68a0b1f38e','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/9_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_4.mp4','succeeded',NULL,'2026-02-02 05:29:32','2026-02-02 05:45:16'),(60,70,47,9,9,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','10f89cdf-08c8-4c9e-a8f8-76bb682266ed','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/9_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_5.mp4','succeeded',NULL,'2026-02-02 05:45:16','2026-02-02 05:47:45'),(61,70,47,7,10,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','ced65ab9-58f3-4d79-9664-355e6dbea733','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/7_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_1.mp4','succeeded',NULL,'2026-02-03 01:29:22','2026-02-03 06:46:27'),(62,70,47,5,24,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','45eca8bd-2615-4147-8cbf-0b1a70e822de','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/5_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_1.mp4','succeeded',NULL,'2026-02-03 02:21:34','2026-02-03 02:37:23'),(63,70,47,5,25,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','5be1b9ed-9551-4ca5-8f0f-fc5d305c1b85','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/5_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_2.mp4','succeeded',NULL,'2026-02-03 02:37:23','2026-02-03 02:53:25'),(64,70,47,5,26,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','cddc2f30-e0b8-4cfb-9483-67abffd9b94d','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/5_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_3.mp4','succeeded',NULL,'2026-02-03 02:53:25','2026-02-03 03:09:10'),(65,70,47,5,27,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','975c2ca5-5403-4bbc-bf06-185d85d86d8f','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/5_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_4.mp4','succeeded',NULL,'2026-02-03 03:09:10','2026-02-03 03:46:37'),(66,70,47,5,28,'0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a','emo-v1','3:4','normal','933819d7-fe20-45c0-98b5-cc135977ade7','https://hello12312312.oss-cn-hangzhou.aliyuncs.com/lover/47/sing/segments/5_0bedfe99c417585e5d79d5ca9cd2b0e4bfd71118608e3e6e00a7228560856b4a_normal_5.mp4','succeeded',NULL,'2026-02-03 03:46:37','2026-02-03 03:53:24'); +/*!40000 ALTER TABLE `nf_song_segment_video` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_song_segments` +-- + +DROP TABLE IF EXISTS `nf_song_segments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_song_segments` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '鍒嗘ID', + `song_id` bigint NOT NULL COMMENT '姝屾洸ID', + `audio_hash` char(64) NOT NULL COMMENT '鏁存洸闊抽SHA256', + `segment_index` int NOT NULL COMMENT '鍒嗘搴忓彿(浠?寮€濮?', + `start_ms` int NOT NULL COMMENT '鍒嗘璧峰(ms)', + `duration_ms` int NOT NULL COMMENT '鍒嗘鏃堕暱(ms锛?=60000)', + `audio_url` varchar(255) NOT NULL COMMENT '鍒嗘闊抽URL', + `audio_size` int DEFAULT NULL COMMENT '鍒嗘闊抽澶у皬(bytes)', + `status` enum('pending','running','succeeded','failed') NOT NULL DEFAULT 'pending' COMMENT '鐘舵€?, + `error_msg` varchar(255) DEFAULT NULL COMMENT '閿欒淇℃伅', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_segment` (`song_id`,`audio_hash`,`segment_index`), + KEY `idx_song_status` (`song_id`,`status`) +) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_song_segments` +-- + +LOCK TABLES `nf_song_segments` WRITE; +/*!40000 ALTER TABLE `nf_song_segments` DISABLE KEYS */; +INSERT INTO `nf_song_segments` VALUES (1,4,'dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/4/segments/dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1_1.mp3',961012,'succeeded',NULL,'2026-01-26 11:41:54','2026-01-26 11:47:34'),(2,4,'dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/4/segments/dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1_2.mp3',961012,'succeeded',NULL,'2026-01-26 11:47:34','2026-01-26 11:47:36'),(3,4,'dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/4/segments/dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1_3.mp3',961012,'succeeded',NULL,'2026-01-26 11:47:36','2026-01-26 11:47:38'),(4,4,'dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1',4,180000,53926,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/4/segments/dae97a2672e92598eb1c51316aa95fb9807469e32dada88abc32745202b4f5b1_4.mp3',863209,'succeeded',NULL,'2026-01-26 11:47:38','2026-01-26 11:47:40'),(5,9,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/9/segments/9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf_1.mp3',961309,'succeeded',NULL,'2026-01-26 14:01:34','2026-01-26 14:01:36'),(6,9,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/9/segments/9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf_2.mp3',961309,'succeeded',NULL,'2026-01-26 14:01:36','2026-01-26 14:01:39'),(7,9,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/9/segments/9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf_3.mp3',961309,'succeeded',NULL,'2026-01-26 14:01:39','2026-01-26 14:01:41'),(8,9,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',4,180000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/9/segments/9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf_4.mp3',961309,'succeeded',NULL,'2026-01-26 14:01:41','2026-01-26 14:01:43'),(9,9,'9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf',5,240000,8607,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/9/segments/9724c0bbf6ad1fa6840fb1d85272c72e2a60f221a0f954ed66b4f80b4509f8bf_5.mp3',138347,'succeeded',NULL,'2026-01-26 14:01:43','2026-01-26 14:01:44'),(10,7,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/7/segments/dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4_1.mp3',960989,'succeeded',NULL,'2026-01-26 15:30:11','2026-01-26 15:30:13'),(11,7,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/7/segments/dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4_2.mp3',960989,'succeeded',NULL,'2026-01-26 15:30:13','2026-01-26 15:30:15'),(12,7,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/7/segments/dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4_3.mp3',960989,'succeeded',NULL,'2026-01-26 15:30:15','2026-01-26 15:30:18'),(13,7,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',4,180000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/7/segments/dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4_4.mp3',960989,'succeeded',NULL,'2026-01-26 15:30:18','2026-01-26 15:30:20'),(14,7,'dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4',5,240000,3199,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/7/segments/dfb3c952d21bd6468b3abd8c14d3851e2dfffd47c77fe05f783dc4d0c601b9d4_5.mp3',51510,'succeeded',NULL,'2026-01-26 15:30:20','2026-01-26 15:30:21'),(15,2,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/2/segments/5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d_1.mp3',961321,'succeeded',NULL,'2026-01-27 00:40:32','2026-01-27 00:40:34'),(16,2,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/2/segments/5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d_2.mp3',961321,'succeeded',NULL,'2026-01-27 00:40:34','2026-01-27 00:40:36'),(17,2,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/2/segments/5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d_3.mp3',961321,'succeeded',NULL,'2026-01-27 00:40:36','2026-01-27 00:40:39'),(18,2,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',4,180000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/2/segments/5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d_4.mp3',961321,'succeeded',NULL,'2026-01-27 00:40:39','2026-01-27 00:40:41'),(19,2,'5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d',5,240000,47033,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/2/segments/5c4b4b45d433d967ed92f60ccdaaed22a91fd8e0218d634dd77043d2e299708d_5.mp3',753177,'succeeded',NULL,'2026-01-27 00:40:41','2026-01-27 00:40:43'),(20,3,'c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/3/segments/c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e_1.mp3',961318,'succeeded',NULL,'2026-01-27 03:45:54','2026-01-27 03:45:56'),(21,3,'c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/3/segments/c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e_2.mp3',961318,'succeeded',NULL,'2026-01-27 03:45:56','2026-01-27 03:45:58'),(22,3,'c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/3/segments/c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e_3.mp3',961318,'succeeded',NULL,'2026-01-27 03:45:58','2026-01-27 03:46:00'),(23,3,'c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e',4,180000,26628,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/3/segments/c7f7da1b1d138b6b5513c44360be1bec9be99d6e9cd980515a9129007776a56e_4.mp3',427166,'succeeded',NULL,'2026-01-27 03:46:00','2026-01-27 03:46:01'),(24,5,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/5/segments/e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852_1.mp3',961288,'succeeded',NULL,'2026-01-27 07:13:23','2026-01-27 07:13:25'),(25,5,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/5/segments/e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852_2.mp3',961288,'succeeded',NULL,'2026-01-27 07:13:25','2026-01-27 07:13:27'),(26,5,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/5/segments/e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852_3.mp3',961288,'succeeded',NULL,'2026-01-27 07:13:27','2026-01-27 07:13:29'),(27,5,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',4,180000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/5/segments/e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852_4.mp3',961288,'succeeded',NULL,'2026-01-27 07:13:29','2026-01-27 07:13:31'),(28,5,'e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852',5,240000,25430,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/5/segments/e423596f092d0c910e3958dcbc3d9a38b57031640429309f7e906998402a7852_5.mp3',407492,'succeeded',NULL,'2026-01-27 07:13:31','2026-01-27 07:13:32'),(29,6,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',1,0,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/6/segments/e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68_1.mp3',961001,'succeeded',NULL,'2026-01-27 08:31:17','2026-01-27 08:31:21'),(30,6,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',2,60000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/6/segments/e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68_2.mp3',961001,'succeeded',NULL,'2026-01-27 08:31:21','2026-01-27 08:31:24'),(31,6,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',3,120000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/6/segments/e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68_3.mp3',961001,'succeeded',NULL,'2026-01-27 08:31:24','2026-01-27 08:31:27'),(32,6,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',4,180000,60000,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/6/segments/e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68_4.mp3',961001,'succeeded',NULL,'2026-01-27 08:31:27','2026-01-27 08:31:29'),(33,6,'e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68',5,240000,16287,'https://nvlovers.oss-cn-qingdao.aliyuncs.com/song/6/segments/e4839dbe90155f6160143f3fa2fe34beef479c5996145fb3ba311f906c4a9f68_5.mp3',261337,'succeeded',NULL,'2026-01-27 08:31:29','2026-01-27 08:31:30'); +/*!40000 ALTER TABLE `nf_song_segments` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_test` +-- + +DROP TABLE IF EXISTS `nf_test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_test` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` int DEFAULT '0' COMMENT '浼氬憳ID', + `admin_id` int DEFAULT '0' COMMENT '绠$悊鍛業D', + `category_id` int unsigned DEFAULT '0' COMMENT '鍒嗙被ID(鍗曢€?', + `category_ids` varchar(100) DEFAULT NULL COMMENT '鍒嗙被ID(澶氶€?', + `tags` varchar(255) DEFAULT '' COMMENT '鏍囩', + `week` enum('monday','tuesday','wednesday') DEFAULT NULL COMMENT '鏄熸湡(鍗曢€?:monday=鏄熸湡涓€,tuesday=鏄熸湡浜?wednesday=鏄熸湡涓?, + `flag` set('hot','index','recommend') DEFAULT '' COMMENT '鏍囧織(澶氶€?:hot=鐑棬,index=棣栭〉,recommend=鎺ㄨ崘', + `genderdata` enum('male','female') DEFAULT 'male' COMMENT '鎬у埆(鍗曢€?:male=鐢?female=濂?, + `hobbydata` set('music','reading','swimming') DEFAULT NULL COMMENT '鐖卞ソ(澶氶€?:music=闊充箰,reading=璇讳功,swimming=娓告吵', + `title` varchar(100) DEFAULT '' COMMENT '鏍囬', + `content` text COMMENT '鍐呭', + `image` varchar(100) DEFAULT '' COMMENT '鍥剧墖', + `images` varchar(1500) DEFAULT '' COMMENT '鍥剧墖缁?, + `attachfile` varchar(100) DEFAULT '' COMMENT '闄勪欢', + `keywords` varchar(255) DEFAULT '' COMMENT '鍏抽敭瀛?, + `description` varchar(255) DEFAULT '' COMMENT '鎻忚堪', + `city` varchar(100) DEFAULT '' COMMENT '鐪佸競', + `array` varchar(255) DEFAULT '' COMMENT '鏁扮粍:value=鍊?, + `json` varchar(255) DEFAULT '' COMMENT '閰嶇疆:key=鍚嶇О,value=鍊?, + `multiplejson` varchar(1500) DEFAULT '' COMMENT '浜岀淮鏁扮粍:title=鏍囬,intro=浠嬬粛,author=浣滆€?age=骞撮緞', + `price` decimal(10,2) unsigned DEFAULT '0.00' COMMENT '浠锋牸', + `views` int unsigned DEFAULT '0' COMMENT '鐐瑰嚮', + `workrange` varchar(100) DEFAULT '' COMMENT '鏃堕棿鍖洪棿', + `startdate` date DEFAULT NULL COMMENT '寮€濮嬫棩鏈?, + `activitytime` datetime DEFAULT NULL COMMENT '娲诲姩鏃堕棿(datetime)', + `year` year DEFAULT NULL COMMENT '骞?, + `times` time DEFAULT NULL COMMENT '鏃堕棿', + `refreshtime` bigint DEFAULT NULL COMMENT '鍒锋柊鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `switch` tinyint(1) DEFAULT '0' COMMENT '寮€鍏?, + `status` enum('normal','hidden') DEFAULT 'normal' COMMENT '鐘舵€?, + `state` enum('0','1','2') DEFAULT '1' COMMENT '鐘舵€佸€?0=绂佺敤,1=姝e父,2=鎺ㄨ崘', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='娴嬭瘯琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_test` +-- + +LOCK TABLES `nf_test` WRITE; +/*!40000 ALTER TABLE `nf_test` DISABLE KEYS */; +INSERT INTO `nf_test` VALUES (1,1,1,12,'12,13','浜掕仈缃?璁$畻鏈?,'monday','hot,index','male','music,reading','鎴戞槸涓€绡囨祴璇曟枃绔?,'

鎴戞槸娴嬭瘯鍐呭

','/assets/img/avatar.png','/assets/img/avatar.png,/assets/img/qrcode.png','/assets/img/avatar.png','鍏抽敭瀛?,'鎴戞槸涓€绡囨祴璇曟枃绔犳弿杩帮紝鍐呭杩囧鏃跺皢鑷姩闅愯棌','骞胯タ澹棌鑷不鍖?鐧捐壊甯?骞虫灉鍘?,'[\"a\",\"b\"]','{\"a\":\"1\",\"b\":\"2\"}','[{\"title\":\"鏍囬涓€\",\"intro\":\"浠嬬粛涓€\",\"author\":\"灏忔槑\",\"age\":\"21\"}]',0.00,0,'2020-10-01 00:00:00 - 2021-10-31 23:59:59','2017-07-10','2017-07-10 18:24:45',2017,'18:24:45',1491635035,1491635035,1491635035,NULL,0,1,'normal','1'); +/*!40000 ALTER TABLE `nf_test` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_third` +-- + +DROP TABLE IF EXISTS `nf_third`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_third` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `user_id` int unsigned DEFAULT '0' COMMENT '浼氬憳ID', + `platform` enum('wechatmini','qq','wechat','weibo','wxapp','app_wx') NOT NULL COMMENT '绗笁鏂瑰簲鐢?, + `apptype` varchar(50) DEFAULT '' COMMENT '搴旂敤绫诲瀷', + `unionid` varchar(100) DEFAULT '' COMMENT '绗笁鏂筓NIONID', + `openname` varchar(100) NOT NULL DEFAULT '' COMMENT '绗笁鏂逛細鍛樻樀绉?, + `openid` varchar(100) DEFAULT '' COMMENT '绗笁鏂筄PENID', + `access_token` varchar(255) DEFAULT '' COMMENT 'AccessToken', + `refresh_token` varchar(255) DEFAULT 'RefreshToken', + `expires_in` int unsigned DEFAULT '0' COMMENT '鏈夋晥鏈?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `logintime` bigint DEFAULT NULL COMMENT '鐧诲綍鏃堕棿', + `expiretime` bigint DEFAULT NULL COMMENT '杩囨湡鏃堕棿', + PRIMARY KEY (`id`), + UNIQUE KEY `platform` (`platform`,`openid`), + KEY `user_id` (`user_id`,`platform`), + KEY `unionid` (`platform`,`unionid`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='绗笁鏂圭櫥褰曡〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_third` +-- + +LOCK TABLES `nf_third` WRITE; +/*!40000 ALTER TABLE `nf_third` DISABLE KEYS */; +INSERT INTO `nf_third` VALUES (3,25,'wxapp','','','','oq8dE14vRcdMhZ2nXFApmQmYKZ-I','','RefreshToken',0,1766804703,NULL,NULL,NULL),(5,33,'wxapp','','','','oq8dE1zm-YIHtFyHBhcVQeWmPI3c','','RefreshToken',0,1767185028,NULL,NULL,NULL),(6,35,'wxapp','','','','oq8dE1_xgzCCXRUC_94j_aVyuhVs','','RefreshToken',0,1767187805,NULL,NULL,NULL),(7,36,'wxapp','','','','oq8dE1w0ZBQMu89ZgrIOeq1jcWa4','','RefreshToken',0,1767188670,NULL,NULL,NULL),(14,12,'wxapp','','','','oq8dE11riYYLDds1Sj12VZdPAt78','','RefreshToken',0,1767497530,NULL,NULL,NULL),(17,40,'wxapp','','','','oq8dE16LpPDjDeHPbYEfI9F-ymxg','','RefreshToken',0,1767502588,NULL,NULL,NULL),(18,41,'wxapp','','','','oq8dE17bArklhS9VgGSXt_fdL8NY','','RefreshToken',0,1767503055,NULL,NULL,NULL),(19,24,'wxapp','','','','oq8dE19ie_NIv4iFDE_wbWU0CYfU','','RefreshToken',0,1767581992,NULL,NULL,NULL),(20,32,'wxapp','','','','oq8dE16vN9XLZqphqll2NLituP4M','','RefreshToken',0,1767698449,NULL,NULL,NULL),(21,70,'wxapp','','','','oq8dE10TMPsQZCtY4XyuImZWfTLA','','RefreshToken',0,1767948179,NULL,NULL,NULL),(22,71,'wxapp','','','','oq8dE13uNVSVR9xo3QVEFPKBNaII','','RefreshToken',0,1768021826,NULL,NULL,NULL),(23,72,'wxapp','','','','oq8dE1_PmCMRpKXIcf7LyvyiB7s8','','RefreshToken',0,1768209967,NULL,NULL,NULL),(25,123444,'app_wx','','','','1231232222','','RefreshToken',0,1767497530,NULL,NULL,NULL),(27,73,'app_wx','','','','oRrdQt41cXAihKalNnuulzIVGMEs','','RefreshToken',0,1768447961,NULL,NULL,NULL),(28,78,'wxapp','','','','oq8dE19CbdZ3M7RVLA__R3xuNHCk','','RefreshToken',0,1769514999,NULL,NULL,NULL); +/*!40000 ALTER TABLE `nf_third` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user` +-- + +DROP TABLE IF EXISTS `nf_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `group_id` int unsigned NOT NULL DEFAULT '0' COMMENT '缁勫埆ID', + `username` varchar(32) DEFAULT '' COMMENT '鐢ㄦ埛鍚?, + `nickname` varchar(50) DEFAULT '' COMMENT '鏄电О', + `password` varchar(32) DEFAULT '' COMMENT '瀵嗙爜', + `salt` varchar(30) DEFAULT '' COMMENT '瀵嗙爜鐩?, + `email` varchar(100) DEFAULT '' COMMENT '鐢靛瓙閭', + `mobile` varchar(11) DEFAULT '' COMMENT '鎵嬫満鍙?, + `avatar` varchar(255) DEFAULT '' COMMENT '澶村儚', + `level` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '绛夌骇', + `gender` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '鎬у埆', + `birthday` date DEFAULT NULL COMMENT '鐢熸棩', + `bio` varchar(100) DEFAULT '' COMMENT '鏍艰█', + `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '浣欓', + `score` int NOT NULL DEFAULT '0' COMMENT '绉垎', + `successions` int unsigned NOT NULL DEFAULT '1' COMMENT '杩炵画鐧诲綍澶╂暟', + `maxsuccessions` int unsigned NOT NULL DEFAULT '1' COMMENT '鏈€澶ц繛缁櫥褰曞ぉ鏁?, + `prevtime` bigint DEFAULT NULL COMMENT '涓婃鐧诲綍鏃堕棿', + `logintime` bigint DEFAULT NULL COMMENT '鐧诲綍鏃堕棿', + `loginip` varchar(50) DEFAULT '' COMMENT '鐧诲綍IP', + `loginfailure` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '澶辫触娆℃暟', + `loginfailuretime` bigint DEFAULT NULL COMMENT '鏈€鍚庣櫥褰曞け璐ユ椂闂?, + `joinip` varchar(50) DEFAULT '' COMMENT '鍔犲叆IP', + `jointime` bigint DEFAULT NULL COMMENT '鍔犲叆鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `token` varchar(50) DEFAULT '' COMMENT 'Token', + `status` varchar(30) DEFAULT '' COMMENT '鐘舵€?, + `verification` varchar(255) DEFAULT '' COMMENT '楠岃瘉', + `user_number` int DEFAULT '0' COMMENT '鐢ㄦ埛缂栧彿', + `hobbies` varchar(255) DEFAULT NULL COMMENT '鍏磋叮鐖卞ソ', + `city` varchar(255) DEFAULT NULL COMMENT '鎵€鍦ㄥ煄甯?, + `reg_step` tinyint DEFAULT '1' COMMENT '鐢ㄦ埛娉ㄥ唽姝ラ 1涓汉淇℃伅 2鍒涘缓鎭嬩汉 3鐢熸垚鎭嬩汉 4瀹屾垚鍒濆鍖?, + `intimacy` int DEFAULT '0' COMMENT '褰撳墠浜插瘑搴?, + `clothes_num` int DEFAULT '0' COMMENT '鎹㈣娆℃暟', + `chat_limit_daily` int NOT NULL DEFAULT '80' COMMENT '姣忔棩鍙彂閫佹秷鎭笂闄?, + `chat_used_today` int NOT NULL DEFAULT '0' COMMENT '浠婃棩宸插彂閫佹秷鎭暟', + `chat_reset_date` date DEFAULT NULL COMMENT '棰濆害閲嶇疆鏃ユ湡', + `video_gen_remaining` int NOT NULL DEFAULT '0' COMMENT '鍥剧敓瑙嗛鍓╀綑娆℃暟', + `video_gen_reset_date` date DEFAULT NULL COMMENT 'video gen reset date', + `inner_voice_enabled` tinyint(1) NOT NULL DEFAULT '0' COMMENT '蹇冨0榛樿寮€鍏筹細1=寮€鍚?, + `outfit_slots` int NOT NULL DEFAULT '5' COMMENT '鎹㈣褰㈣薄鏍忎綅鏁伴噺', + `owned_outfit_ids` json DEFAULT NULL COMMENT '宸叉嫢鏈夋湇楗癐D鍒楄〃(JSON)', + `owned_voice_ids` json DEFAULT NULL COMMENT '宸叉嫢鏈夐煶鑹睮D鍒楄〃(JSON)', + `vip_endtime` bigint DEFAULT '0' COMMENT 'vip鍒版湡鏃ユ湡', + `invite_code` varchar(10) DEFAULT NULL COMMENT '閭€璇风爜', + `invited_by` varchar(10) DEFAULT NULL COMMENT '琚皝閭€璇凤紙閭€璇风爜锛?, + `invite_count` int DEFAULT '0' COMMENT '閭€璇蜂汉鏁?, + `invite_reward_total` decimal(10,2) DEFAULT '0.00' COMMENT '閭€璇峰鍔辨€婚', + PRIMARY KEY (`id`), + UNIQUE KEY `invite_code` (`invite_code`), + UNIQUE KEY `idx_invite_code` (`invite_code`), + KEY `username` (`username`), + KEY `email` (`email`), + KEY `mobile` (`mobile`), + KEY `idx_invited_by` (`invited_by`) +) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user` +-- + +LOCK TABLES `nf_user` WRITE; +/*!40000 ALTER TABLE `nf_user` DISABLE KEYS */; +INSERT INTO `nf_user` VALUES (1,1,'admin','admin','87f5e17155dfdae25328e96cd40fcbb7','671a70','admin@163.com','13000000000','/assets/img/avatar.png',0,0,'2017-04-08','',0.00,0,1,1,1491635035,1491635035,'127.0.0.1',0,1491635035,'127.0.0.1',1491635035,0,1491635035,'','normal','',100001,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(2,0,'18800000001','188****0001','f4dc4f0dca32b8b98c0bd9aa8281f732','hnVtgm','','18800000001','',0,0,NULL,'',0.00,0,1,1,1766470441,1766470800,'127.0.0.1',10,1767184911,'127.0.0.1',1766461928,1766461928,1767184911,'','normal','',100002,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(3,0,'18800000002','188****0002','3b6059dc4aecb97f3edda9f1d6612926','N5gIJX','','18800000002','',0,0,NULL,'',0.00,0,1,1,1766471330,1766471343,'123.132.215.243',0,NULL,'123.132.215.243',1766471330,1766471330,1766471343,'','normal','',100003,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(4,0,'18800000003','188****0003','8634b75b75e18cfd9ebcb2dd34d55925','t1E7Qu','','18800000003','',0,0,NULL,'',0.00,0,1,1,1766472191,1766472191,'127.0.0.1',0,NULL,'127.0.0.1',1766472191,1766472191,1766472191,'','normal','',100004,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(5,0,'18353925791','183****5791','fda4cd557fc8898294867cb5b996935b','yaEOXb','','18353925791','',0,0,NULL,'',0.00,0,1,1,1766488431,1766488451,'123.132.215.243',0,1766473645,'123.132.215.243',1766472211,1766472211,1766488451,'','normal','',100005,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(6,0,'18353925796','183****5796','20ff9328d8b8508a39382358eba88c8f','FiNrgw','','18353925796','',0,0,NULL,'',0.00,0,1,1,1766472348,1766472348,'123.132.215.243',1,1766472402,'123.132.215.243',1766472348,1766472348,1766472402,'','normal','',100006,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(7,0,'18353925797','183****5797','89779496e7ebb4ce7f6fd11ea5a807bc','P3aSXF','','18353925797','',0,0,NULL,'',0.00,0,1,1,1766472454,1766472454,'123.132.215.243',1,1766472531,'123.132.215.243',1766472454,1766472454,1766472531,'','normal','',100007,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(8,0,'18800000004','188****0004','d443b0f0ba629e3406f5fae37b3e41dc','hQPasq','','18800000004','',0,0,NULL,'',60.00,0,1,3,1766822127,1766822193,'123.132.215.243',0,1766561695,'123.132.215.243',1766472575,1766472575,1766822220,'','normal','',100008,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(9,0,'18800000006','188****0006','705084bdc56e81536dc83423adcb8725','kEd6et','','18800000006','',0,0,NULL,'',0.00,0,1,1,1766539550,1766540803,'123.132.215.243',0,NULL,'127.0.0.1',1766539550,1766539550,1766540803,'','normal','',100009,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(12,0,'13455955473','涓€蹇?,'98b9f73413b176c14e12387788efa78d','Mgbapv','','13455955473','https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260104/006fbc2a67ed9683ba3ab69517ecae1d.jpeg',2,1,'2016-08-01','',2550.00,0,1,1,1768445788,1768739641,'122.6.146.60',0,NULL,'127.0.0.1',1766540511,1766540511,1768739641,'','normal','',0,'鍔ㄦ极,鏃呰','灞变笢鐪?涓存矀甯?,4,222,55,80,2,'2025-12-31',0,NULL,0,5,NULL,NULL,1784963585,NULL,NULL,0,0.00),(14,1,'18800000008','灏忓Ξ','ff75b0d3a74fbec25df9673352eed35b','zqpvV2','18800000001@qq.com','18800000008','',1,2,'2010-01-19','',480.00,0,2,3,1768877384,1768890167,'123.131.171.205',0,1768808234,'123.132.215.243',1766541107,1766541107,1768890167,'','normal','',100014,'灏戝','鍖椾含甯?鍖椾含甯?,4,60,95,80,0,'2026-01-19',0,NULL,0,5,'[14, 16]',NULL,1806133294,NULL,NULL,0,0.00),(18,0,'19000000002','190****0002','d723b355e3032a5065476662963d4445','nz64XC','','19000000002','',0,0,NULL,'',0.00,0,1,1,1766563443,1766568686,'123.132.215.243',0,NULL,'123.132.215.243',1766563443,1766563443,1766568686,'','normal','',100018,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(19,0,'19000000003','190****0003','3138c0531dd8e2e01a61663421c22669','VurbUS','','19000000003','',0,0,NULL,'',0.00,0,1,1,1766563643,1766568832,'123.132.215.243',0,NULL,'123.132.215.243',1766563643,1766563643,1766568832,'','normal','',100019,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(20,0,'19000000004','190****0004','d03a9966fac60315c71b40ab2fa14b83','6ZTaI2','','19000000004','',0,0,NULL,'',0.00,0,1,1,1766563659,1766568909,'123.132.215.243',0,NULL,'123.132.215.243',1766563659,1766563659,1766568909,'','normal','',100020,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(21,0,'19000000005','190****0005','17e5019bdf8da471d0208dd157769e44','fmaZcM','','19000000005','',0,0,NULL,'',0.00,0,1,1,1766563679,1766568941,'123.132.215.243',0,NULL,'123.132.215.243',1766563679,1766563679,1766568941,'','normal','',100021,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(22,0,'19000000006','190****0006','05d09ff99b6bbae310c40dbfe4c42cc3','YpdRQM','','19000000006','',0,0,NULL,'',0.00,0,1,1,1766563697,1766563697,'123.132.215.243',0,NULL,'123.132.215.243',1766563697,1766563697,1766563697,'','normal','',100022,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(23,0,'19000000007','190****0007','1dd6d77ae7eb3802d1cf8652f238aa0b','NrXwMY','','19000000007','',0,0,NULL,'',0.00,0,1,1,1766563713,1766563713,'123.132.215.243',0,NULL,'123.132.215.243',1766563713,1766563713,1766563713,'','normal','',100023,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(24,0,'18396706165','娴嬭瘯1','8422bf1c8ae9b5557bbcc44b2396f231','NsMLFX','','18396706165','',0,1,'2025-12-26','',0.00,0,2,3,1768808147,1768877235,'123.131.171.205',0,NULL,'123.132.215.243',1766730831,1766730831,1768877235,'','normal','',100024,NULL,'鍖椾含甯?鍖椾含甯?,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(25,0,'15853853559','鏉?,'efd26a1f47fa413338c4e2dc2e9b257d','o2Mwkf','','15853853559','',2,1,'2026-01-19','',0.00,0,1,3,1767664689,1768794459,'120.225.105.239',0,NULL,'123.132.215.243',1766804703,1766804703,1768794459,'','normal','',100025,'娓告垙,灏忚','鍖椾含甯?鍖椾含甯?,4,203,0,80,3,'2026-01-04',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(26,0,'19100000000','191****0000','aa8d50e111dfecb60cd8b51914f5f802','WpVtd8','','19100000000','',0,0,NULL,'',0.00,0,1,1,1767175398,1767175398,'123.132.215.243',0,NULL,'123.132.215.243',1767175398,1767175398,1767175398,'','normal','',100026,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(32,0,'13758924481','鍒樺厛鐢?,'6be7ec5062234e6f5bf74aa4366e2c6e','gupWHb','','13758924481','https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260121/deedb61fb9ccff824975497f41881be3.png',3,1,'2026-01-10','',1811.00,0,1,2,1769911279,1769911285,'127.0.0.1',0,1769911234,'39.187.204.116',1767184746,1767184746,1769911285,'','normal','',100032,'灏忚,娓告垙,鍔ㄦ极','娴欐睙鐪?閲戝崕甯?,4,354,0,80,0,'2026-01-31',0,NULL,0,5,'[15, 16]','[16]',1769777124,NULL,NULL,0,0.00),(33,0,'18669672626','璺','3fc9141c0fec176d5a2fd3e832184b94','eTJr4Z','','18669672626','',1,1,'2025-12-31','',4111.00,0,2,2,1767582582,1767582634,'123.132.215.243',0,NULL,'112.251.29.185',1767185028,1767185028,1767582634,'','normal','',100033,'灏忚,娓告垙,鍔ㄦ极','鍖椾含甯?鍖椾含甯?,1,23,0,80,3,'2026-01-04',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(34,0,'18353925799','183****5799','74b16570f7d58d566c99b824f9754d53','gN3ZwH','','18353925799','',0,0,NULL,'',0.00,0,1,1,1767185286,1767185286,'112.224.158.171',0,NULL,'112.224.158.171',1767185286,1767185286,1767185286,'','normal','',100034,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(35,0,'18019670573','浠栧閲?,'be5509e259dac51744c4d29ba7b1e682','XHeWQi','','18019670573','',0,1,'1997-01-07','',0.00,0,1,1,1767187804,1767187804,'180.115.198.111',0,NULL,'180.115.198.111',1767187804,1767187804,1767187804,'','normal','',100035,'灏忚','鍖椾含甯?鍖椾含甯?,1,2,0,80,2,'2025-12-31',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(36,0,'19519862787','鍒樺厛鐢?,'a9498604f4db1d103fcf340cc9dd7e86','HvaIWJ','','19519862787','',5,1,'2026-01-09','',8180.00,0,4,4,1769601023,1769687924,'123.131.171.205',0,1769591597,'39.187.204.116',1767188670,1767188670,1769687924,'','normal','',100036,'灏忚,娓告垙,鍔ㄦ极','鍖椾含甯?鍖椾含甯?,4,1054,241,80,0,'2026-01-29',0,NULL,0,5,'[15, 16]','[3, 9, 16]',1772372686,NULL,NULL,0,0.00),(40,0,'18353925795','闄?,'e86fbbee9bac786540eb0a71d9036241','F2DrVi','','18353925795','https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260109/75dd23d8c56dba187725b59e6aa8f6b4.jpeg',2,1,'2006-01-09','',2635.00,0,1,3,1768209097,1768209791,'123.132.215.243',0,NULL,'123.132.215.243',1767502588,1767502588,1768209791,'','normal','',100040,'娓告垙,灏忚','灞变笢鐪?娴庡崡甯?,4,234,49,80,0,'2026-01-10',0,NULL,0,5,NULL,NULL,1799053911,NULL,NULL,0,0.00),(41,0,'17662814566','绠€鍗曠埍','1731c0fbb41d8c263d87822e9236d307','KiAegO','','17662814566','',2,1,'1991-01-09','',910.00,0,1,3,1768891792,1769507880,'123.131.171.205',0,NULL,'123.132.215.243',1767503054,1767503054,1769507880,'','normal','',100041,'灏忚,娓告垙','鍖椾含甯?鍖椾含甯?,4,214,47,80,0,'2026-01-27',1,NULL,0,5,NULL,NULL,1799061042,NULL,NULL,0,0.00),(42,0,'18900000001','Mr.Wang','14a6e308f4e75908b695718e95c68771','Nv7A0L','','18900000001','',1,1,'2026-01-04','',2915.00,0,2,2,1767521875,1767582600,'123.132.215.243',0,NULL,'123.132.215.243',1767507676,1767507676,1767582600,'','normal','',100042,'娓告垙','鍖椾含甯?鍖椾含甯?,1,1,49,80,1,'2026-01-04',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(43,0,'18800000007','188****0007','e746c5207155ef1f1dae2ff161872073','oWGuaH','','18800000007','',0,0,NULL,'',0.00,0,2,2,1768814047,1768890358,'123.131.171.205',0,NULL,'123.132.215.243',1767518132,1767518132,1768890358,'','normal','',100043,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(67,0,'18900000008','189****0008','f9208c772fb80b52fcaee304554e1290','zJPMie','','18900000008','',0,0,NULL,'',0.00,0,1,1,1767520167,1767520167,'127.0.0.1',0,NULL,'127.0.0.1',1767520167,1767520167,1767520167,'','normal','',0,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(68,0,'18900000009','189****0009','c73c81ee67c1e5ec1e0319c4dc4e71e1','iZEIHn','','18900000009','',0,0,NULL,'',0.00,0,1,1,1767520248,1767520248,'127.0.0.1',0,NULL,'127.0.0.1',1767520248,1767520248,1767520249,'','normal','',100068,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(69,0,'18900000010','189****0010','81344af384f608e6060dbaffee4cbf1c','dua7Zt','','18900000010','',0,0,NULL,'',0.00,0,1,3,1767670129,1768890402,'123.131.171.205',0,NULL,'123.132.215.243',1767520300,1767520300,1768890402,'','normal','',100069,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(70,0,'13287782809','Mimic','cdefa313eda00ce553b3a3411631704b','9ZQFlo','','13287782809','https://nvlovers.oss-cn-qingdao.aliyuncs.com/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg',3,1,'1999-01-09','',21.00,0,2,4,1770173129,1770202613,'192.168.1.108',0,1769596793,'123.132.215.243',1767945689,1767945689,1770253817,'','normal','',100070,'娓告垙,楠戣,璇讳功','瀹夊窘鐪?鍚堣偉甯?,4,391,38,80,0,'2026-02-05',0,'2026-02-03',0,5,'[5, 8, 11, 12, 13, 14, 15, 16, 17]','\"3,9,16,17\"',1801534482,'UAAZAM',NULL,1,10.00),(71,0,'17336735784','zzbs','36a4d69178e1a3b4aea7bc025c2500df','XmFyfB','','17336735784','',0,1,'2022-01-10','',0.00,0,1,1,1768021826,1768021826,'223.93.45.221',0,NULL,'223.93.45.221',1768021826,1768021826,1768021826,'','normal','',100071,'娓告垙,灏忚,鍔ㄦ极','鍖椾含甯?鍖椾含甯?,4,1,0,80,1,'2026-01-10',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(72,0,'13335146325','绉﹀鐨?,'bcbc4a9ae9cdacfd13f683ca0353647d','vR8Ncd','','13335146325','',1,1,'2024-01-12','',2825.00,0,1,3,1769502731,1769671498,'123.131.171.205',0,NULL,'123.132.215.243',1768209967,1768209967,1769671498,'','normal','',100072,'灏忚,娓告垙','娌冲寳鐪?鐭冲搴勫競',4,69,48,80,1,'2026-01-29',0,NULL,0,5,'[8, 16]',NULL,1799747003,NULL,NULL,0,0.00),(73,0,'17661982010','鍚曢泬','a554ad101299ec31de336f2c2141a640','ajounQ','','17661982010','',0,2,'2022-01-13','',0.00,0,1,3,1768976565,1769585329,'123.131.171.205',0,1768976562,'123.132.215.243',1768289336,1768289336,1769585329,'','normal','',100073,'鍔ㄦ极','鍖椾含甯?鍖椾含甯?,4,3,0,80,0,'2026-01-21',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(74,0,'17602868959','176****8959','52fa7ff3c37a444179f74cfa4be59ba2','c3h7Ov','','17602868959','',0,0,NULL,'',0.00,0,1,1,1768728258,1768728258,'123.131.171.205',0,NULL,'123.131.171.205',1768728258,1768728258,1768728258,'','normal','',100074,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(75,0,'19519862827','195****2827','f3b5115fc8d4d06a8fbaa421f9a41214','OvmcRT','','19519862827','',0,0,NULL,'',3000.00,0,1,1,1768813202,1768813202,'117.136.113.203',1,1768813642,'117.136.113.203',1768813202,1768813202,1768813642,'','normal','',100075,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,1800349229,NULL,NULL,0,0.00),(76,0,'17661982011','176****2011','5c6f82333a2538a50640b064c290af31','TMXh1Z','','17661982011','',0,0,NULL,'',0.00,0,2,2,1769585350,1769653813,'123.131.171.205',0,NULL,'123.131.171.205',1768890327,1768890327,1769653813,'','normal','',100076,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(77,0,'15397010001','153****0001','28a6a36e1a328d18b7f4aaff1046d1c1','6QcfRG','','15397010001','',0,0,NULL,'',200.00,0,1,1,1769065937,1769065937,'183.134.173.13',0,NULL,'183.134.173.13',1769065937,1769065937,1769066462,'','normal','',100077,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(78,0,'13735771040','123','c34fd82704e84509ef2698c2ad640f8d','O87Z0G','','13735771040','',0,1,'2026-01-27','',0.00,0,1,1,1769514851,1769514999,'223.93.7.210',0,NULL,'223.93.7.210',1769514851,1769514851,1769514999,'','normal','',100078,'灏忚','鍖椾含甯?鍖椾含甯?,2,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(79,0,'10086123456','10086123456','b92a3709bd8e31fd5c397d1ec816cdcb','EhWYpv','','10086123456','',0,0,NULL,'',0.00,0,1,1,1769563191,1769563191,'123.131.171.205',0,NULL,'123.131.171.205',1769563191,1769563191,1769563191,'','normal','',100079,NULL,NULL,1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(80,0,'13287783636','娴嬭瘯瀹氫綅','1ef24efc67f3f10db586c7ce37fd5475','nCOTt5','','13287783636','',0,1,'2026-01-30','',0.00,0,1,1,1769596908,1769596908,'123.131.171.205',0,NULL,'123.131.171.205',1769596908,1769596908,1769596908,'','normal','',100080,'鍔ㄦ极','渚濈背鑽夎泲绯?鐩涘痉妗傚洯搴?',1,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(81,0,'18857192227','姊?,'24b70042e412dbff276649aacd64ff58','sar0WY','','18857192227','',0,1,'2026-01-28','',0.00,0,1,1,1769604111,1769604111,'117.136.113.91',0,NULL,'117.136.113.91',1769604111,1769604111,1769604258,'','normal','',100081,'鍔ㄦ极,娓告垙','鏅北琛楅亾77鏂囧寲鍒涙剰浜т笟鍥?7鏂囧垱缇庢湳棣?,2,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,1801140258,NULL,NULL,0,0.00),(82,0,'15557926037','winter','853365c3d0748efcc80cfb17408a7c14','cfCW1E','','15557926037','',0,1,'2026-01-28','',0.00,0,1,1,1769605201,1769605201,'36.21.215.248',0,NULL,'36.21.215.248',1769605201,1769605201,1769605201,'','normal','',100082,'娓告垙,灏忚,鍔ㄦ极','澶氭箹琛楅亾妫編瀹跺眳(閲戝崕涓囪揪骞垮満5鍙锋ゼ搴?閲戝崕涓囪揪骞垮満瑗垮尯',4,0,0,80,0,NULL,0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(83,0,'18314832016','姝﹁亴','7bc69261d7be70fa9170e03b0b6ffdf9','QMzGfV','','18314832016','',0,1,'2000-01-28','',0.00,0,1,1,1769611158,1769611158,'183.147.212.246',0,NULL,'183.147.212.246',1769611158,1769611158,1769611158,'','normal','',100083,'娓告垙,鍔ㄦ极','楦垮崥瀹跺洯浜屾湡F鍖?,4,9,0,80,1,'2026-01-29',0,NULL,0,5,NULL,NULL,0,NULL,NULL,0,0.00),(84,0,'xiao12feng','楦¤泲楗?,'6be7ec5062234e6f5bf74aa4366e2c6e','0IEXJe','843172570@qq.com','18226379956','',0,1,'2026-02-01','',5.00,0,2,2,1770112774,1770202559,'192.168.1.108',0,NULL,'127.0.0.1',1769854318,1769854318,1770202559,'','normal','',100084,'娓告垙','鎵撴拻鍙?,2,0,0,80,0,NULL,2,'2026-02-02',0,5,NULL,NULL,1801534290,'HRWFR4','UAAZAM',0,0.00); +/*!40000 ALTER TABLE `nf_user` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_bond_config` +-- + +DROP TABLE IF EXISTS `nf_user_bond_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_bond_config` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL COMMENT '鍚嶇О', + `title` varchar(255) DEFAULT NULL COMMENT '鏍囬', + `upper` decimal(10,0) DEFAULT NULL COMMENT '涓婇檺鍊?, + `type` enum('1','2','3','4') DEFAULT '1' COMMENT '绫诲瀷:1=鏂囨湰,2=璇煶,3=璧犻€佺ぜ鐗?4=浜掑姩', + `single_exp` int DEFAULT NULL COMMENT '鍗曟浜插瘑搴?, + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='姣忔棩浠诲姟'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_bond_config` +-- + +LOCK TABLES `nf_user_bond_config` WRITE; +/*!40000 ALTER TABLE `nf_user_bond_config` DISABLE KEYS */; +INSERT INTO `nf_user_bond_config` VALUES (1,'鑱婂ぉ璐$尞','姣忚疆鑱婂ぉ鍙幏寰?浜插瘑搴?,100,'1',1,99,1766631962,1766648137),(2,'璇煶閫氳瘽','姣忚闊抽€氳瘽1鍒嗛挓锛屽彲鑾峰緱5浜插瘑搴?,100,'2',5,98,1766632011,1766648190),(3,'璧犻€佺ぜ鐗?,'璧犻€佸埆浜虹ぜ鐗╋紝鎵嬫湁浣欓',200,'3',1,97,1766648217,1766737639),(4,'浜掑姩璐$尞','鍜屾亱浜轰簰鍔?,200,'4',100,94,1766648247,1766648261); +/*!40000 ALTER TABLE `nf_user_bond_config` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_bond_log` +-- + +DROP TABLE IF EXISTS `nf_user_bond_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_bond_log` ( + `id` int NOT NULL AUTO_INCREMENT, + `intimacy` int DEFAULT '0' COMMENT '闇€瑕佺殑浜插瘑搴?, + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `user_id` int DEFAULT NULL, + `type` enum('1','2','3','4') DEFAULT '1' COMMENT '绫诲瀷:1=鏂囨湰,2=璇煶,3=璧犻€佺ぜ鐗?4=浜掑姩', + `createdate` date DEFAULT NULL COMMENT '棰嗗彇鏃ユ湡', + PRIMARY KEY (`id`), + KEY `num_sum` (`user_id`,`type`,`createdate`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=313 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浜插瘑搴﹁幏鍙栧垪琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_bond_log` +-- + +LOCK TABLES `nf_user_bond_log` WRITE; +/*!40000 ALTER TABLE `nf_user_bond_log` DISABLE KEYS */; +INSERT INTO `nf_user_bond_log` VALUES (8,5,1766720792,12,'2','2025-12-26'),(9,15,1766720799,12,'2','2025-12-26'),(10,80,1766720843,12,'2','2025-12-26'),(11,100,1766720889,12,'3','2025-12-26'),(12,1,1766730456,12,'1','2025-12-26'),(13,1,1766730572,12,'1','2025-12-26'),(14,20,1766737708,12,'3','2025-12-26'),(15,30,1766823767,14,'3','2025-12-27'),(16,150,1766886845,15,'3','2025-12-28'),(17,50,1766886875,15,'3','2025-12-28'),(18,1,1767061861,12,'1','2025-12-30'),(19,1,1767083738,15,'1','2025-12-30'),(20,1,1767083755,15,'1','2025-12-30'),(21,1,1767083764,15,'1','2025-12-30'),(22,1,1767083773,15,'1','2025-12-30'),(23,1,1767083800,15,'1','2025-12-30'),(24,1,1767083820,15,'1','2025-12-30'),(25,1,1767083831,15,'1','2025-12-30'),(26,1,1767083852,15,'1','2025-12-30'),(27,1,1767084060,15,'1','2025-12-30'),(28,1,1767084346,15,'1','2025-12-30'),(29,1,1767084580,15,'1','2025-12-30'),(30,1,1767084646,15,'1','2025-12-30'),(31,1,1767085029,15,'1','2025-12-30'),(32,1,1767085043,15,'1','2025-12-30'),(33,1,1767085132,15,'1','2025-12-30'),(34,1,1767085167,15,'1','2025-12-30'),(35,30,1767085363,15,'3','2025-12-30'),(36,1,1767087077,15,'1','2025-12-30'),(37,1,1767089684,15,'1','2025-12-30'),(38,1,1767164972,15,'1','2025-12-31'),(39,1,1767165249,15,'1','2025-12-31'),(40,200,1767178026,27,'3','2025-12-31'),(41,180,1767183149,31,'3','2025-12-31'),(42,20,1767183159,31,'3','2025-12-31'),(43,1,1767188048,35,'1','2025-12-31'),(44,1,1767188060,35,'1','2025-12-31'),(45,30,1767189180,36,'3','2025-12-31'),(46,10,1767189186,36,'3','2025-12-31'),(47,20,1767189191,36,'3','2025-12-31'),(48,40,1767189272,36,'3','2025-12-31'),(49,60,1767189279,36,'3','2025-12-31'),(50,40,1767189286,36,'3','2025-12-31'),(51,1,1767494926,37,'1','2026-01-04'),(52,1,1767495777,33,'1','2026-01-04'),(53,1,1767495787,33,'1','2026-01-04'),(54,1,1767495804,33,'1','2026-01-04'),(55,1,1767508703,42,'1','2026-01-04'),(56,20,1767508739,42,'3','2026-01-04'),(57,10,1767508742,42,'3','2026-01-04'),(58,1,1767509318,25,'1','2026-01-04'),(59,20,1767509610,33,'3','2026-01-04'),(60,1,1767512606,25,'1','2026-01-04'),(61,1,1767512668,25,'1','2026-01-04'),(62,1,1767516472,41,'1','2026-01-04'),(63,30,1767517445,25,'3','2026-01-04'),(64,30,1767517461,25,'3','2026-01-04'),(65,20,1767517470,25,'3','2026-01-04'),(66,30,1767517491,25,'3','2026-01-04'),(67,30,1767517502,25,'3','2026-01-04'),(68,30,1767518074,25,'3','2026-01-04'),(69,30,1767518181,25,'3','2026-01-04'),(70,30,1767519622,41,'3','2026-01-04'),(71,1,1767519661,41,'1','2026-01-04'),(72,1,1767519710,41,'1','2026-01-04'),(73,1,1767524872,41,'1','2026-01-04'),(74,30,1767525107,41,'3','2026-01-04'),(75,10,1767525114,41,'3','2026-01-04'),(76,1,1767525749,41,'1','2026-01-04'),(77,1,1767525790,41,'1','2026-01-04'),(78,1,1767525801,41,'1','2026-01-04'),(79,1,1767525823,41,'1','2026-01-04'),(80,1,1767525837,41,'1','2026-01-04'),(81,1,1767576836,40,'1','2026-01-05'),(82,1,1767576844,40,'1','2026-01-05'),(83,1,1767605465,40,'1','2026-01-05'),(84,1,1767605476,40,'1','2026-01-05'),(85,1,1767605516,40,'1','2026-01-05'),(86,1,1767605670,40,'1','2026-01-05'),(87,1,1767605783,40,'1','2026-01-05'),(88,1,1767605812,40,'1','2026-01-05'),(89,1,1767605822,40,'1','2026-01-05'),(90,1,1767605875,40,'1','2026-01-05'),(91,1,1767605885,40,'1','2026-01-05'),(92,1,1767606280,40,'1','2026-01-05'),(93,1,1767606291,40,'1','2026-01-05'),(94,1,1767606398,40,'1','2026-01-05'),(95,1,1767606418,40,'1','2026-01-05'),(96,1,1767606604,40,'1','2026-01-05'),(97,1,1767606621,40,'1','2026-01-05'),(98,1,1767611938,40,'1','2026-01-05'),(99,1,1767612451,40,'1','2026-01-05'),(100,1,1767613172,32,'1','2026-01-05'),(101,1,1767613193,32,'1','2026-01-05'),(102,1,1767613268,32,'1','2026-01-05'),(103,1,1767613288,32,'1','2026-01-05'),(104,1,1767613316,32,'1','2026-01-05'),(105,80,1767613372,32,'3','2026-01-05'),(106,40,1767613377,32,'3','2026-01-05'),(107,40,1767613377,32,'3','2026-01-05'),(108,40,1767613378,32,'3','2026-01-05'),(109,1,1767613511,32,'1','2026-01-05'),(110,1,1767614695,36,'1','2026-01-05'),(111,1,1767614722,36,'1','2026-01-05'),(112,1,1767614735,36,'1','2026-01-05'),(113,1,1767614792,36,'1','2026-01-05'),(114,1,1767614819,36,'1','2026-01-05'),(115,1,1767614843,36,'1','2026-01-05'),(116,110,1767615022,36,'3','2026-01-05'),(117,90,1767615033,36,'3','2026-01-05'),(118,1,1767615058,36,'1','2026-01-05'),(119,1,1767615119,36,'1','2026-01-05'),(120,1,1767615228,36,'1','2026-01-05'),(121,1,1767615308,36,'1','2026-01-05'),(122,200,1767689967,27,'3','2026-01-06'),(123,1,1767690862,27,'1','2026-01-06'),(124,1,1767693949,40,'1','2026-01-06'),(125,1,1767694525,36,'1','2026-01-06'),(126,1,1767694563,36,'1','2026-01-06'),(127,1,1767695056,40,'1','2026-01-06'),(128,1,1767695863,27,'1','2026-01-06'),(129,1,1767695882,27,'1','2026-01-06'),(130,1,1767698481,32,'1','2026-01-06'),(131,1,1767698497,32,'1','2026-01-06'),(132,1,1767698619,36,'1','2026-01-06'),(133,1,1767698638,36,'1','2026-01-06'),(134,1,1767698810,36,'1','2026-01-06'),(135,1,1767699043,36,'1','2026-01-06'),(136,1,1767699164,36,'1','2026-01-06'),(137,1,1767750848,27,'1','2026-01-07'),(138,1,1767753257,27,'1','2026-01-07'),(139,1,1767754010,27,'1','2026-01-07'),(140,200,1767922295,40,'3','2026-01-09'),(141,1,1767939578,40,'1','2026-01-09'),(142,1,1767939622,40,'1','2026-01-09'),(143,1,1767939911,40,'1','2026-01-09'),(144,1,1767939960,40,'1','2026-01-09'),(145,1,1767940107,40,'1','2026-01-09'),(146,1,1767940118,40,'1','2026-01-09'),(147,1,1767940327,40,'1','2026-01-09'),(148,1,1767940334,40,'1','2026-01-09'),(149,1,1767940370,40,'1','2026-01-09'),(150,1,1767940656,40,'1','2026-01-09'),(151,1,1767940671,40,'1','2026-01-09'),(152,1,1767940867,40,'1','2026-01-09'),(153,1,1767940881,40,'1','2026-01-09'),(154,1,1767947573,70,'1','2026-01-09'),(155,1,1767947766,70,'1','2026-01-09'),(156,1,1767950146,36,'1','2026-01-09'),(157,1,1767950160,36,'1','2026-01-09'),(158,1,1767950171,36,'1','2026-01-09'),(159,1,1767950189,36,'1','2026-01-09'),(160,1,1767950237,36,'1','2026-01-09'),(161,1,1767950331,36,'1','2026-01-09'),(162,1,1767950486,36,'1','2026-01-09'),(163,1,1767950632,36,'1','2026-01-09'),(164,1,1767950733,36,'1','2026-01-09'),(165,1,1767964550,36,'1','2026-01-09'),(166,200,1767965019,36,'3','2026-01-09'),(167,1,1767968201,41,'1','2026-01-09'),(168,1,1767968225,41,'1','2026-01-09'),(169,1,1767968398,41,'1','2026-01-09'),(170,30,1767968436,41,'3','2026-01-09'),(171,20,1767968441,41,'3','2026-01-09'),(172,10,1767968444,41,'3','2026-01-09'),(173,10,1767968446,41,'3','2026-01-09'),(174,30,1767968469,41,'3','2026-01-09'),(175,1,1767970083,36,'1','2026-01-09'),(176,1,1768005562,36,'1','2026-01-10'),(177,1,1768005602,36,'1','2026-01-10'),(178,1,1768022178,71,'1','2026-01-10'),(179,40,1768210552,72,'3','2026-01-12'),(180,1,1768210758,72,'1','2026-01-12'),(181,1,1768211698,72,'1','2026-01-12'),(182,1,1768286300,72,'1','2026-01-13'),(183,20,1768287328,72,'3','2026-01-13'),(184,1,1768287637,72,'1','2026-01-13'),(185,1,1768360145,72,'1','2026-01-14'),(186,1,1768361339,72,'1','2026-01-14'),(187,1,1768361639,72,'1','2026-01-14'),(188,1,1768362470,70,'1','2026-01-14'),(189,1,1768362601,70,'1','2026-01-14'),(190,1,1768362965,70,'1','2026-01-14'),(191,120,1768363505,70,'3','2026-01-14'),(192,80,1768363523,70,'3','2026-01-14'),(193,1,1768364035,36,'1','2026-01-14'),(194,160,1768364202,36,'3','2026-01-14'),(195,1,1768382892,73,'1','2026-01-14'),(196,1,1768382952,70,'1','2026-01-14'),(197,1,1768383015,73,'1','2026-01-14'),(198,1,1768462388,73,'1','2026-01-15'),(199,1,1768547179,72,'1','2026-01-16'),(200,1,1768625534,70,'1','2026-01-17'),(201,1,1768805095,36,'1','2026-01-19'),(202,1,1768805965,36,'1','2026-01-19'),(203,1,1768806840,36,'1','2026-01-19'),(204,1,1768807010,36,'1','2026-01-19'),(205,1,1768807164,36,'1','2026-01-19'),(206,1,1768807322,36,'1','2026-01-19'),(207,1,1768807958,36,'1','2026-01-19'),(208,1,1768808697,36,'1','2026-01-19'),(209,1,1768808848,36,'1','2026-01-19'),(210,30,1768808868,14,'3','2026-01-19'),(211,1,1768810806,36,'1','2026-01-19'),(212,1,1768810864,36,'1','2026-01-19'),(213,1,1768810883,36,'1','2026-01-19'),(214,1,1768811255,36,'1','2026-01-19'),(215,1,1768811462,70,'1','2026-01-19'),(216,1,1768828304,36,'1','2026-01-19'),(217,1,1768828381,36,'1','2026-01-19'),(218,1,1768828431,36,'1','2026-01-19'),(219,1,1768828582,36,'1','2026-01-19'),(220,1,1768828636,36,'1','2026-01-19'),(221,1,1768828661,36,'1','2026-01-19'),(222,1,1768829861,41,'1','2026-01-19'),(223,30,1768829910,41,'3','2026-01-19'),(224,1,1768987646,70,'1','2026-01-21'),(225,1,1768987697,70,'1','2026-01-21'),(226,1,1769000590,36,'1','2026-01-21'),(227,1,1769000616,36,'1','2026-01-21'),(228,1,1769001170,36,'1','2026-01-21'),(229,1,1769001332,36,'1','2026-01-21'),(230,70,1769001385,36,'3','2026-01-21'),(231,130,1769001393,36,'3','2026-01-21'),(232,1,1769005839,36,'1','2026-01-21'),(233,1,1769005858,36,'1','2026-01-21'),(234,1,1769005893,36,'1','2026-01-21'),(235,1,1769005911,36,'1','2026-01-21'),(236,1,1769073725,36,'1','2026-01-22'),(237,1,1769073968,36,'1','2026-01-22'),(238,1,1769478877,36,'1','2026-01-27'),(239,1,1769483943,36,'1','2026-01-27'),(240,1,1769484645,36,'1','2026-01-27'),(241,1,1769491972,70,'1','2026-01-27'),(242,1,1769502423,36,'1','2026-01-27'),(243,1,1769502638,36,'1','2026-01-27'),(244,1,1769502641,36,'1','2026-01-27'),(245,1,1769502645,36,'1','2026-01-27'),(246,1,1769502648,36,'1','2026-01-27'),(247,1,1769502665,36,'1','2026-01-27'),(248,1,1769502672,36,'1','2026-01-27'),(249,1,1769507681,36,'1','2026-01-27'),(250,1,1769507685,36,'1','2026-01-27'),(251,1,1769507688,36,'1','2026-01-27'),(252,1,1769507691,36,'1','2026-01-27'),(253,1,1769507693,36,'1','2026-01-27'),(254,1,1769507696,36,'1','2026-01-27'),(255,1,1769507699,36,'1','2026-01-27'),(256,1,1769508332,36,'1','2026-01-27'),(257,1,1769508366,36,'1','2026-01-27'),(258,1,1769509396,36,'1','2026-01-27'),(259,1,1769509419,36,'1','2026-01-27'),(260,1,1769509433,36,'1','2026-01-27'),(261,1,1769509481,41,'1','2026-01-27'),(262,1,1769509492,36,'1','2026-01-27'),(263,1,1769509503,36,'1','2026-01-27'),(264,1,1769509512,36,'1','2026-01-27'),(265,1,1769590041,70,'1','2026-01-28'),(266,1,1769601067,36,'1','2026-01-28'),(267,1,1769601082,36,'1','2026-01-28'),(268,1,1769601104,36,'1','2026-01-28'),(269,1,1769601743,36,'1','2026-01-28'),(270,1,1769601752,36,'1','2026-01-28'),(271,1,1769601769,36,'1','2026-01-28'),(272,1,1769601778,36,'1','2026-01-28'),(273,1,1769603252,36,'1','2026-01-28'),(274,1,1769603307,36,'1','2026-01-28'),(275,1,1769612171,83,'1','2026-01-28'),(276,1,1769612182,83,'1','2026-01-28'),(277,1,1769612207,83,'1','2026-01-28'),(278,1,1769612228,83,'1','2026-01-28'),(279,1,1769612247,83,'1','2026-01-28'),(280,1,1769612277,83,'1','2026-01-28'),(281,1,1769612294,83,'1','2026-01-28'),(282,1,1769612318,83,'1','2026-01-28'),(283,1,1769650035,83,'1','2026-01-29'),(284,1,1769671533,72,'1','2026-01-29'),(285,1,1769680193,70,'1','2026-01-29'),(286,1,1769680224,70,'1','2026-01-29'),(287,1,1769683803,32,'1','2026-01-29'),(288,1,1769683818,32,'1','2026-01-29'),(289,1,1769683830,32,'1','2026-01-29'),(290,140,1769684043,32,'3','2026-01-29'),(291,1,1769687604,70,'1','2026-01-29'),(292,1,1769692232,32,'1','2026-01-29'),(293,1,1769692250,32,'1','2026-01-29'),(294,1,1769692433,32,'1','2026-01-29'),(295,1,1769831317,70,'1','2026-01-31'),(296,1,1769926465,70,'1','2026-02-01'),(297,1,1769926484,70,'1','2026-02-01'),(298,1,1769926493,70,'1','2026-02-01'),(299,1,1769926514,70,'1','2026-02-01'),(300,1,1769926531,70,'1','2026-02-01'),(301,1,1769926559,70,'1','2026-02-01'),(302,1,1769926976,70,'1','2026-02-01'),(303,1,1769927137,70,'1','2026-02-01'),(304,1,1769927234,70,'1','2026-02-01'),(305,1,1769938808,70,'1','2026-02-01'),(306,1,1769939724,70,'1','2026-02-01'),(307,1,1770015086,70,'1','2026-02-02'),(308,1,1770015204,70,'1','2026-02-02'),(309,1,1770082306,70,'1','2026-02-03'),(310,1,1770085055,70,'1','2026-02-03'),(311,40,1770104760,70,'3','2026-02-03'),(312,120,1770253817,70,'3','2026-02-05'); +/*!40000 ALTER TABLE `nf_user_bond_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_clothes_log` +-- + +DROP TABLE IF EXISTS `nf_user_clothes_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_clothes_log` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '浼氬憳ID', + `num` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿浣欓', + `before` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿鍓嶄綑棰?, + `after` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿鍚庝綑棰?, + `memo` varchar(255) DEFAULT '' COMMENT '澶囨敞', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳鎹㈣娆℃暟鍙樺姩琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_clothes_log` +-- + +LOCK TABLES `nf_user_clothes_log` WRITE; +/*!40000 ALTER TABLE `nf_user_clothes_log` DISABLE KEYS */; +INSERT INTO `nf_user_clothes_log` VALUES (11,12,10.00,50.00,60.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766817017),(12,14,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766828140),(13,14,50.00,50.00,100.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766828143),(14,15,1.00,0.00,1.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766979128),(15,15,10.00,0.00,10.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766991197),(16,15,10.00,5.00,15.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766993665),(17,15,50.00,15.00,65.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766993973),(18,15,1.00,65.00,66.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1766993976),(19,31,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767184137),(20,27,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767185831),(21,42,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767507877),(22,41,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767519921),(23,36,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767614895),(24,36,50.00,50.00,100.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767614898),(25,36,50.00,100.00,150.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767614900),(26,36,50.00,150.00,200.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767614903),(27,40,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767922242),(28,70,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1767947535),(29,72,50.00,0.00,50.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1768210903),(30,36,50.00,196.00,246.00,'閲戝竵鍏戞崲鎹㈣娆℃暟',1768369152); +/*!40000 ALTER TABLE `nf_user_clothes_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_group` +-- + +DROP TABLE IF EXISTS `nf_user_group`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_group` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) DEFAULT '' COMMENT '缁勫悕', + `rules` text COMMENT '鏉冮檺鑺傜偣', + `createtime` bigint DEFAULT NULL COMMENT '娣诲姞鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `status` enum('normal','hidden') DEFAULT NULL COMMENT '鐘舵€?, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳缁勮〃'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_group` +-- + +LOCK TABLES `nf_user_group` WRITE; +/*!40000 ALTER TABLE `nf_user_group` DISABLE KEYS */; +INSERT INTO `nf_user_group` VALUES (1,'榛樿缁?,'1,2,3,4,5,6,7,8,9,10,11,12',1491635035,1491635035,'normal'); +/*!40000 ALTER TABLE `nf_user_group` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_huanxin` +-- + +DROP TABLE IF EXISTS `nf_user_huanxin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_huanxin` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `hx_application` varchar(255) DEFAULT NULL COMMENT '鐜俊application', + `hx_uuid` varchar(255) DEFAULT NULL COMMENT '鐜俊uuid', + `hx_access_token` varchar(255) DEFAULT NULL COMMENT '鐜俊token', + `hx_expires_in` varchar(255) DEFAULT '0' COMMENT 'token杩囨湡鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`), + KEY `user_id` (`user_id`,`hx_uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=125 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐢ㄦ埛鐜俊淇℃伅'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_huanxin` +-- + +LOCK TABLES `nf_user_huanxin` WRITE; +/*!40000 ALTER TABLE `nf_user_huanxin` DISABLE KEYS */; +INSERT INTO `nf_user_huanxin` VALUES (1,14,NULL,'1eba8c70-e06b-11f0-9344-4175765c9fb4','YWMtaVeurvXMEfCr-zXYcyrLAS3jSxJrL0ZmiISwq9ulUDPz3raQ4JoR8Kt3x0omjrYHAwMAAAGb2iv6BQBPGgAjmv3VrcrgQ98CrnC_izScXDx3Uy3sFsfSJuZJDvpNOA','5184000',1766541113,1768891873),(9,68,NULL,'d9a848c0-e952-11f0-b10a-f986a8e5d595',NULL,'0',1767520249,1767520249),(10,69,NULL,'f7f60150-e952-11f0-bd6a-d5f508922167','YWMt_lrE4PXIEfCKCrsrNDEuxy3jSxJrL0ZmiISwq9ulUDP39gFQ6VIR8L1q1fUIkiFnAwMAAAGb2hWTswBPGgA1suEOQYvDaUr64ZzRafgchpSIgrQBJns7_juZrpJeyQ','5184000',1767520300,1768890405),(11,42,NULL,NULL,'YWMtBy29_OnkEfCpr5PW4ndscC3jSxJrL0ZmiISwq9ulUDOTlSkQ6TUR8LIVGTZLHLbEAwMAAAGbjCIXQQBPGgCpNw5y8ADuCyKfgcJOWmhNoqcMEahY8zY92Qzu4glhIQ','5184000',NULL,1767582603),(12,41,NULL,NULL,'YWMtPG7cWvXMEfCNDSWXkWmUgC3jSxJrL0ZmiISwq9ulUDPQ3B1w6SoR8LcaCbkG3h0wAwMAAAGb2irTswBPGgBG0Widna8cyiCJaDxEkfqS1ISqiAugpaThLgoOYSLIdg','5184000',NULL,1768891798),(13,40,NULL,NULL,'YWMtefx3xu-bEfC09KGqEjyhQC3jSxJrL0ZmiISwq9ulUDO6naVw6SkR8Ihdr4N3K6PFAwMAAAGbsZjyXABPGgCaRezewQdYG1zY85_NzuE2aZyaFnK6MZ-3qGX2Peao9g','5184000',NULL,1768211149),(14,36,NULL,NULL,'YWMtoOtOUP5mEfCH86_-O_iO0y3jSxJrL0ZmiISwq9ulUDPVDR-Q5k4R8LKOLSIt6Ze_AwMAAAGcEoxtNgBPGgBNw3LObUeRZSh7pw99i8fiNcOsLXrgMhZsKlvS5xPNAA','5184000',NULL,1769837718),(36,34,NULL,NULL,NULL,'0',NULL,NULL),(37,33,NULL,NULL,'YWMt8WoPUunjEfC-kO31BNkf2i3jSxJrL0ZmiISwq9ulUDNabVgg5kYR8LFtkc6RiZK5AwMAAAGbjCGInwBPGgC6OaQlR7DXgea2ELDj7srcm8uDKS7sFEETSI7imuWqFg','5184000',NULL,1767582566),(38,32,NULL,NULL,'YWMtzLykjP8SEfC1mSVoXXW9-S3jSxJrL0ZmiISwq9ulUDOyMPRQ5kUR8IidZz5OpYaKAwMAAAGcFvTEfQBPGgBEyfmRQLiomYuFzNlpmEP0PduH05MrIBNr-x64EUI4fA','5184000',NULL,1769911652),(39,27,NULL,NULL,'YWMt-yTSPu0mEfCmVU1rt-ggDi3jSxJrL0ZmiISwq9ulUDNJUKLg5jIR8Lg2PQe1ltifAwMAAAGboYIJ6wBPGgBTCKtK37_jyDNpqk39B_5XeCcnablXoe-znUtfP5ME3w','5184000',NULL,1767941212),(40,26,NULL,NULL,NULL,'0',NULL,NULL),(41,25,NULL,NULL,'YWMtt044JPToEfCrHmMk67RXLS3jSxJrL0ZmiISwq9ulUDPW4q0g4tAR8JIFF1CoG0_qAwMAAAGb1FfAbwBPGgCmbDEz1KHeRrl0ZtjtBY9MFksJIAk6DQ2DC1C13BWltw','5184000',NULL,1768794079),(42,24,NULL,NULL,'YWMt2UmgpOqrEfCpFk-Tx0xixC3jSxJrL0ZmiISwq9ulUDPYBeOQ4iQR8I0RcyWqoQYUAwMAAAGbkT-i0wBPGgBMfLhivnXwBCKmFF0bcIc4UxfrPLcd8qAUTGqUp7QpfQ','5184000',NULL,1767668425),(43,23,NULL,NULL,NULL,'0',NULL,NULL),(44,22,NULL,NULL,NULL,'0',NULL,NULL),(45,21,NULL,NULL,NULL,'0',NULL,NULL),(46,20,NULL,NULL,NULL,'0',NULL,NULL),(47,19,NULL,NULL,NULL,'0',NULL,NULL),(48,18,NULL,NULL,NULL,'0',NULL,NULL),(49,70,NULL,'679f9f20-ed31-11f0-8f9f-d58cf1dab804','YWMt6MchxAADEfG9GQnN8M9agi3jSxJrL0ZmiISwq9ulUDNnn58g7TER8I-f1Yzx2rgEAwMAAAGcHSDnKgBPGgDKOYgkH2EhZII6kb4EQUSVb15EBEmt7j1rcdkIAVankg','5184000',1767945689,1770015221),(50,71,NULL,'acaaec80-ede2-11f0-83fb-e970cb554b00','YWMtK97WYO6wEfCrg-dC6KKCuy3jSxJrL0ZmiISwq9ulUDOsquyA7eIR8IP76XDLVUsAAwMAAAGbq5LZ2ABPGgAihG8WBJZ4J-G_ZDL6Q1T4acBDe0qiPl1SgDr0egLRJg','5184000',1768021826,1768110086),(51,72,NULL,'b9a633b0-ef98-11f0-89d8-91d586d3a2a0','YWMt7mtyTvszEfCieh8yibAhhy3jSxJrL0ZmiISwq9ulUDO5pjOw75gR8InYkdWG06KgAwMAAAGb_ZcDIABPGgAIKCBkXwkMxv8-b7cEk5itQhnugeRFzjtwaZXm1S5RdA','5184000',1768209967,1769486091),(52,73,NULL,'85311910-f051-11f0-9f90-3d27cef2c27d','YWMtVokxwPvqEfCXaBGvLrEMPi3jSxJrL0ZmiISwq9ulUDOFMRkQ8FER8J-QPSfO8sJ9AwMAAAGcAkJuywBPGgDfRIWChy4tr97mySJppsSycKpp8LU_rQMx00wWRHN0kg','5184000',1768289336,1769564434),(53,74,NULL,'7763fa80-f44f-11f0-b0a1-77a089826866','YWMtiI0fbPRPEfCPxMOSPCQVPC3jSxJrL0ZmiISwq9ulUDN3Y_qA9E8R8LChd6CJgmhmAwMAAAGb0GvangBPGgCqmjxgYf9WfKrNu4vQAAkB75IIJ6mnoQhbsJHy-B_RFQ','5184000',1768728259,1768728287),(115,35,NULL,NULL,NULL,'0',NULL,NULL),(116,75,NULL,'3dff3860-f515-11f0-b743-a3fb23eb50ec',NULL,'0',1768813203,1768813203),(117,76,NULL,'d0013610-f5c8-11f0-a00a-514e4051fd1d','YWMtufJPDPaREfCekH0ipwaC7i3jSxJrL0ZmiISwq9ulUDPQATYQ9cgR8KAKUU5AUf0dAwMAAAGb3zkZbABPGgDp3cm6tWjHONcg1n4bSo9JNTn0o_OEgjWmSEkK0LJMIA','5184000',1768890328,1768976619),(118,77,NULL,'af5f6b80-f761-11f0-86bd-c9f650817bc4','YWMtZNXG9vdzEfClFzffS2gdxy3jSxJrL0ZmiISwq9ulUDOvX2uA92ER8Ia9yfZQgXvEAwMAAAGb5QAItwBPGgB9D23s2n_I3odChB9IAZ7I3_Vt5y2RYnUfMdlVbPtbag','5184000',1769065937,1769073543),(119,78,NULL,'e54f2f50-fb76-11f0-823d-076e6a2e3977','YWMtDtwHAvt4EfCQSnMhAB0ihC3jSxJrL0ZmiISwq9ulUDPlTy9Q-3YR8II9B25qLjl3AwMAAAGb_1V8ywBPGgARenoODaTnZQAJtKtAQ2tFMyxow1IFKs7cWhsRdyEVyw','5184000',1769514852,1769515351),(120,79,NULL,'71c728a0-fbe7-11f0-860e-51b48b759c04',NULL,'0',1769563191,1769563191),(121,80,NULL,'f2e11970-fc35-11f0-8765-61eb6e1df3ec',NULL,'0',1769596908,1769596908),(122,81,NULL,'b88bb800-fc46-11f0-83e6-bd1cd9f0ab4e','YWMt9h-oyPxIEfCBKAlNVi-AHC3jSxJrL0ZmiISwq9ulUDO4i7gA_EYR8IPmvRzZ8KtOAwMAAAGcBK6OgABPGgCQlLxx9flrsNRNadtHLSm6aXHscZ36uJccsxqoF9Zo4Q','5184000',1769604112,1769605074),(123,82,NULL,'41e4ef20-fc49-11f0-b91d-2d2c9a7d1881','YWMtb4v2bPxJEfCJO7f0qKjZwS3jSxJrL0ZmiISwq9ulUDNB5O8g_EkR8LkdLSyafRiBAwMAAAGcBLGqQgBPGgCAXwNiMX0BDu3nDe7xwIkbIgMom-g8t1BCQB-mj0FOYw','5184000',1769605201,1769605278),(124,83,NULL,'20a2f470-fc57-11f0-a897-b7dac3beac5b','YWMt_7H-JPzSEfCw-gMb3PL9TS3jSxJrL0ZmiISwq9ulUDMgovRw_FcR8KiXt9rDvqxbAwMAAAGcCDcyzwBPGgBiSYoaI0Iw0euSWUEKYBiSeXXNkdiRWRKCg9i-mp3eCA','5184000',1769611158,1769664361); +/*!40000 ALTER TABLE `nf_user_huanxin` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_level` +-- + +DROP TABLE IF EXISTS `nf_user_level`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_level` ( + `id` int NOT NULL AUTO_INCREMENT, + `image` varchar(255) DEFAULT NULL COMMENT '鍥剧墖', + `name` varchar(255) DEFAULT NULL COMMENT '鍚嶇О', + `title` varchar(255) DEFAULT NULL COMMENT '鏍囬', + `level` varchar(255) DEFAULT '0' COMMENT '绛夌骇', + `intimacy` int DEFAULT '0' COMMENT '闇€瑕佺殑浜插瘑搴?, + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳绛夌骇'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_level` +-- + +LOCK TABLES `nf_user_level` WRITE; +/*!40000 ALTER TABLE `nf_user_level` DISABLE KEYS */; +INSERT INTO `nf_user_level` VALUES (1,'/uploads/20251225/3be807b7cd645dc8353fb2adccb8e33d.png','鏂囧瓧鑱婂ぉ','寮€鍚瓧閲岃闂寸殑濂囧够涔嬫梾','0',0,9999,1766628030,1766646610),(2,'/uploads/20251225/bbddb82729be60db78b4a9b658932a8f.png','璇煶娑堟伅','浼犻€掓偍鐨勫0澹版俯鏆?,'1',10,9998,1766628074,1766646640),(3,'/uploads/20251225/bef6315f368257b7b351c2187ed88066.png','璇煶閫氳瘽','闅忔椂闅忓湴鎷ㄦ墦鐢佃瘽','2',200,9997,1766628100,1766646670),(4,'/uploads/20251225/d238e6d762ccb97c5fe4412c28d15f07.png','鐓х墖','瀹氭牸鎮ㄧ殑缇庝附瀹归','3',300,9996,1766628144,1766646719),(5,'/uploads/20251225/268834d912620e0666a51639ba86c6d4.png','瑙嗛','闈㈠闈氦娴?,'4',500,9995,1766628190,1766646758),(6,'/uploads/20251225/d238e6d762ccb97c5fe4412c28d15f07.png','Ta鐨勬棩璁?,'鏌ョ湅鏃ヨ','5',600,9994,1766628211,1766646786); +/*!40000 ALTER TABLE `nf_user_level` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_money_log` +-- + +DROP TABLE IF EXISTS `nf_user_money_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_money_log` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '浼氬憳ID', + `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿浣欓', + `before` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿鍓嶄綑棰?, + `after` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '鍙樻洿鍚庝綑棰?, + `memo` varchar(255) DEFAULT '' COMMENT '澶囨敞', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=318 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳浣欓鍙樺姩琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_money_log` +-- + +LOCK TABLES `nf_user_money_log` WRITE; +/*!40000 ALTER TABLE `nf_user_money_log` DISABLE KEYS */; +INSERT INTO `nf_user_money_log` VALUES (4,8,-10.00,100.00,90.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1766569894),(6,8,-20.00,90.00,70.00,'璧犻€佺ぜ鐗?褰╄櫣',1766642034),(7,12,-20.00,2000.00,1980.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1766737708),(8,12,10.00,1980.00,1990.00,'閲戝竵鍏呭€?,1766805666),(9,12,1000.00,1990.00,2990.00,'閲戝竵鍏呭€?,1766806772),(10,12,-50.00,2990.00,2940.00,'鍏戞崲鎹㈣娆℃暟',1766816794),(11,12,-50.00,2940.00,2890.00,'鍏戞崲鎹㈣娆℃暟',1766816899),(12,12,-10.00,2890.00,2880.00,'鍏戞崲鎹㈣娆℃暟',1766817017),(13,14,100.00,0.00,100.00,'閲戝竵鍏呭€?,1766818028),(14,14,1000.00,100.00,1100.00,'閲戝竵鍏呭€?,1766818233),(15,14,100.00,1100.00,1200.00,'閲戝竵鍏呭€?,1766818281),(16,14,100.00,1200.00,1300.00,'閲戝竵鍏呭€?,1766818282),(17,14,1000.00,1300.00,2300.00,'閲戝竵鍏呭€?,1766818296),(18,14,1000.00,2300.00,3300.00,'閲戝竵鍏呭€?,1766818297),(19,14,1000.00,3300.00,4300.00,'閲戝竵鍏呭€?,1766818298),(20,14,1000.00,4300.00,5300.00,'閲戝竵鍏呭€?,1766818299),(21,14,1000.00,5300.00,6300.00,'閲戝竵鍏呭€?,1766818311),(22,14,1000.00,6300.00,7300.00,'閲戝竵鍏呭€?,1766818335),(23,14,1000.00,7300.00,8300.00,'閲戝竵鍏呭€?,1766818340),(24,14,3000.00,8300.00,11300.00,'閲戝竵鍏呭€?,1766818343),(25,14,100.00,11300.00,11400.00,'閲戝竵鍏呭€?,1766818346),(26,14,1000.00,11400.00,12400.00,'閲戝竵鍏呭€?,1766818348),(27,14,1000.00,12400.00,13400.00,'閲戝竵鍏呭€?,1766818350),(28,8,-10.00,70.00,60.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1766822220),(29,14,-30.00,13400.00,13370.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822839),(30,14,-30.00,13370.00,13340.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822868),(31,14,-30.00,13340.00,13310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822872),(32,14,-30.00,13310.00,13280.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822906),(33,14,-30.00,13280.00,13250.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822908),(34,14,-30.00,13250.00,13220.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822941),(35,14,-30.00,13220.00,13190.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766822945),(36,14,-20.00,13190.00,13170.00,'璧犻€佺ぜ鐗?褰╄櫣',1766823048),(37,14,-30.00,13170.00,13140.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766823767),(38,14,-30.00,13140.00,13110.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766823880),(39,14,-13110.00,13110.00,0.00,'绠$悊鍛樺彉鏇撮噾棰?,1766826469),(40,14,30.00,0.00,30.00,'閲戝竵鍏呭€?,1766827161),(41,14,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766827162),(42,14,30.00,0.00,30.00,'閲戝竵鍏呭€?,1766827194),(43,14,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766827196),(44,14,60.00,0.00,60.00,'閲戝竵鍏呭€?,1766827319),(45,14,-60.00,60.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766827320),(46,14,30.00,0.00,30.00,'閲戝竵鍏呭€?,1766827413),(47,14,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766827414),(48,14,100.00,0.00,100.00,'閲戝竵鍏呭€?,1766827453),(49,14,-50.00,100.00,50.00,'鍏戞崲鎹㈣娆℃暟',1766828140),(50,14,-50.00,50.00,0.00,'鍏戞崲鎹㈣娆℃暟',1766828143),(51,15,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1766886484),(52,15,-150.00,3000.00,2850.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766886845),(53,15,-100.00,2850.00,2750.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1766886875),(54,15,-30.00,2750.00,2720.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1766889358),(55,15,100000.00,2720.00,102720.00,'閲戝竵鍏呭€?,1766889506),(56,12,-5.00,2880.00,2875.00,'璐拱鏈嶉グ:8',1766920981),(57,12,-5.00,2875.00,2870.00,'璐拱鏈嶉グ:8',1766922239),(58,12,-5.00,2870.00,2865.00,'璐拱鏈嶉グ:11',1766922308),(59,12,-5.00,2865.00,2860.00,'璐拱鏈嶉グ:11',1766922783),(60,12,-5.00,2860.00,2855.00,'璐拱鏈嶉グ:8',1766923044),(61,12,-5.00,2855.00,2850.00,'璐拱鏈嶉グ:11',1766923058),(62,15,-5.00,999.00,994.00,'璐拱鏈嶉グ:11',1766977239),(63,15,-1.00,994.00,993.00,'鍏戞崲鎹㈣娆℃暟',1766979128),(64,15,-10.00,993.00,983.00,'鍏戞崲鎹㈣娆℃暟',1766991197),(65,15,-10.00,983.00,973.00,'鍏戞崲鎹㈣娆℃暟',1766993665),(66,15,-50.00,973.00,923.00,'鍏戞崲鎹㈣娆℃暟',1766993973),(67,15,-1.00,923.00,922.00,'鍏戞崲鎹㈣娆℃暟',1766993976),(68,12,-300.00,2850.00,2550.00,'璐拱闊宠壊:楂橀泤姘旇川濂?,1766998268),(69,15,-50.00,922.00,872.00,'璐拱闊宠壊:楂橀泤姘旇川濂?,1767002969),(70,15,-5.00,872.00,867.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767003907),(71,15,-20.00,867.00,847.00,'璐拱闊宠壊:娓╂殩鏄ラ濂?,1767003988),(72,15,-5.00,847.00,842.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767004082),(73,15,-30.00,842.00,812.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767085363),(74,14,20.00,0.00,20.00,'閲戝竵鍏呭€?,1767148146),(75,14,30.00,20.00,50.00,'閲戝竵鍏呭€?,1767148170),(76,14,30.00,50.00,80.00,'閲戝竵鍏呭€?,1767148177),(77,14,-20.00,80.00,60.00,'璧犻€佺ぜ鐗?褰╄櫣',1767148579),(78,27,9999900.00,0.00,9999900.00,'閲戝竵鍏呭€?,1767176523),(79,27,-280.00,9999900.00,9999620.00,'璧犻€佺ぜ鐗?褰╄櫣',1767178026),(80,31,1000.00,0.00,1000.00,'閲戝竵鍏呭€?,1767183117),(81,31,-5.00,1000.00,995.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767183122),(82,31,-20.00,995.00,975.00,'璐拱闊宠壊:娓╂殩鏄ラ濂?,1767183131),(83,31,-180.00,975.00,795.00,'璧犻€佺ぜ鐗?褰╄櫣',1767183149),(84,31,-160.00,795.00,635.00,'璧犻€佺ぜ鐗?褰╄櫣',1767183159),(85,31,-50.00,635.00,585.00,'鍏戞崲鎹㈣娆℃暟',1767184137),(86,31,-100.00,585.00,485.00,'璧犻€佺ぜ鐗?褰╄櫣',1767184418),(87,31,-100.00,485.00,385.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767184436),(88,31,-300.00,385.00,85.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767184488),(89,27,-50.00,9999620.00,9999570.00,'鍏戞崲鎹㈣娆℃暟',1767185831),(90,36,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767189179),(91,36,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767189180),(92,36,10.00,0.00,10.00,'閲戝竵鍏呭€?,1767189185),(93,36,-10.00,10.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767189186),(94,36,20.00,0.00,20.00,'閲戝竵鍏呭€?,1767189190),(95,36,-20.00,20.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1767189191),(96,36,40.00,0.00,40.00,'閲戝竵鍏呭€?,1767189271),(97,36,-40.00,40.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1767189272),(98,36,60.00,0.00,60.00,'閲戝竵鍏呭€?,1767189278),(99,36,-60.00,60.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767189279),(100,36,360.00,0.00,360.00,'閲戝竵鍏呭€?,1767189284),(101,36,-360.00,360.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767189286),(102,36,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1767189748),(103,36,-5.00,3000.00,2995.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767189760),(104,36,-5.00,2995.00,2990.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767189765),(105,36,-100.00,2990.00,2890.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767189858),(106,36,-390.00,2890.00,2500.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767189868),(107,36,-500.00,2500.00,2000.00,'璧犻€佺ぜ鐗?褰╄櫣',1767189875),(108,36,-390.00,2000.00,1610.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767189887),(109,37,1000.00,0.00,1000.00,'閲戝竵鍏呭€?,1767494858),(110,37,-5.00,1000.00,995.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767494864),(111,40,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1767502617),(112,41,1000.00,0.00,1000.00,'閲戝竵鍏呭€?,1767503221),(113,42,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1767507865),(114,42,-50.00,3000.00,2950.00,'鍏戞崲鎹㈣娆℃暟',1767507877),(115,33,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767508277),(116,33,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767508278),(117,42,-20.00,2950.00,2930.00,'璧犻€佺ぜ鐗?褰╄櫣',1767508739),(118,42,-10.00,2930.00,2920.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767508742),(119,14,-10.00,60.00,50.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767508800),(120,14,-20.00,50.00,30.00,'璧犻€佺ぜ鐗?褰╄櫣',1767508811),(121,42,-5.00,2920.00,2915.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767508813),(122,33,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1767509409),(123,33,1000.00,3000.00,4000.00,'閲戝竵鍏呭€?,1767509418),(124,33,100.00,4000.00,4100.00,'閲戝竵鍏呭€?,1767509432),(125,33,50.00,4100.00,4150.00,'閲戝竵鍏呭€?,1767509450),(126,33,10.00,4150.00,4160.00,'閲戝竵鍏呭€?,1767509458),(127,33,1.00,4160.00,4161.00,'閲戝竵鍏呭€?,1767509469),(128,33,-30.00,4161.00,4131.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767509593),(129,33,-20.00,4131.00,4111.00,'璧犻€佺ぜ鐗?褰╄櫣',1767509610),(130,14,100.00,30.00,130.00,'閲戝竵鍏呭€?,1767515474),(131,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767517444),(132,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767517445),(133,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767517460),(134,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767517461),(135,25,20.00,0.00,20.00,'閲戝竵鍏呭€?,1767517469),(136,25,-20.00,20.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1767517470),(137,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767517490),(138,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767517491),(139,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767517500),(140,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767517502),(141,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767518073),(142,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767518074),(143,25,30.00,0.00,30.00,'閲戝竵鍏呭€?,1767518180),(144,25,-30.00,30.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767518181),(145,41,-30.00,1000.00,970.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767519622),(146,41,100.00,970.00,1070.00,'閲戝竵鍏呭€?,1767519633),(147,41,100.00,1070.00,1170.00,'閲戝竵鍏呭€?,1767519637),(148,41,-5.00,1170.00,1165.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767519897),(149,41,-5.00,1165.00,1160.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767519901),(150,41,-50.00,1160.00,1110.00,'鍏戞崲鎹㈣娆℃暟',1767519921),(151,14,-10.00,130.00,120.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767520677),(152,14,-30.00,120.00,90.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767520679),(153,14,-20.00,90.00,70.00,'璧犻€佺ぜ鐗?褰╄櫣',1767520682),(154,41,-30.00,1110.00,1080.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767525107),(155,41,-10.00,1080.00,1070.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767525114),(156,41,-30.00,1070.00,1040.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767525539),(157,40,-5.00,3000.00,2995.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767579047),(158,32,80.00,0.00,80.00,'閲戝竵鍏呭€?,1767613371),(159,32,-80.00,80.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1767613372),(160,32,40.00,0.00,40.00,'閲戝竵鍏呭€?,1767613376),(161,32,40.00,40.00,80.00,'閲戝竵鍏呭€?,1767613376),(162,32,-40.00,80.00,40.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613377),(163,32,-40.00,40.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613377),(164,32,40.00,0.00,40.00,'閲戝竵鍏呭€?,1767613377),(165,32,-40.00,40.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613378),(166,32,120.00,0.00,120.00,'閲戝竵鍏呭€?,1767613381),(167,32,120.00,120.00,240.00,'閲戝竵鍏呭€?,1767613382),(168,32,-120.00,240.00,120.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767613382),(169,32,-120.00,120.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767613383),(170,32,40.00,0.00,40.00,'閲戝竵鍏呭€?,1767613388),(171,32,40.00,40.00,80.00,'閲戝竵鍏呭€?,1767613389),(172,32,-40.00,80.00,40.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613389),(173,32,40.00,40.00,80.00,'閲戝竵鍏呭€?,1767613390),(174,32,-40.00,80.00,40.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613390),(175,32,-40.00,40.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613391),(176,32,160.00,0.00,160.00,'閲戝竵鍏呭€?,1767613401),(177,32,-160.00,160.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613402),(178,32,160.00,0.00,160.00,'閲戝竵鍏呭€?,1767613406),(179,32,160.00,160.00,320.00,'閲戝竵鍏呭€?,1767613407),(180,32,-160.00,320.00,160.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613407),(181,32,-160.00,160.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613408),(182,32,180.00,0.00,180.00,'閲戝竵鍏呭€?,1767613412),(183,32,-180.00,180.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613413),(184,32,180.00,0.00,180.00,'閲戝竵鍏呭€?,1767613413),(185,32,180.00,180.00,360.00,'閲戝竵鍏呭€?,1767613414),(186,32,-180.00,360.00,180.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613414),(187,32,-180.00,180.00,0.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613415),(188,32,450.00,0.00,450.00,'閲戝竵鍏呭€?,1767613443),(189,32,-450.00,450.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767613444),(190,32,450.00,0.00,450.00,'閲戝竵鍏呭€?,1767613448),(191,32,-450.00,450.00,0.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767613449),(192,32,300.00,0.00,300.00,'閲戝竵鍏呭€?,1767613454),(193,32,-300.00,300.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1767613455),(194,32,150.00,0.00,150.00,'閲戝竵鍏呭€?,1767613459),(195,32,210.00,150.00,360.00,'閲戝竵鍏呭€?,1767613464),(196,32,210.00,360.00,570.00,'閲戝竵鍏呭€?,1767613465),(197,32,-210.00,570.00,360.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613465),(198,32,-210.00,360.00,150.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767613466),(199,36,-50.00,1610.00,1560.00,'鍏戞崲鎹㈣娆℃暟',1767614895),(200,36,-50.00,1560.00,1510.00,'鍏戞崲鎹㈣娆℃暟',1767614898),(201,36,-50.00,1510.00,1460.00,'鍏戞崲鎹㈣娆℃暟',1767614900),(202,36,-50.00,1460.00,1410.00,'鍏戞崲鎹㈣娆℃暟',1767614903),(203,36,-110.00,1410.00,1300.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767615022),(204,36,-640.00,1300.00,660.00,'璧犻€佺ぜ鐗?褰╄櫣',1767615033),(205,36,1200.00,660.00,1860.00,'閲戝竵鍏呭€?,1767615042),(206,36,-1200.00,1860.00,660.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767615043),(207,27,-520.00,9999570.00,9999050.00,'璧犻€佺ぜ鐗?褰╄櫣',1767689967),(208,27,-5.00,9999050.00,9999045.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767754431),(209,27,-5.00,9999045.00,9999040.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767754435),(210,27,-50.00,9999040.00,9998990.00,'璐拱闊宠壊:楂橀泤姘旇川濂?,1767754439),(211,40,-5.00,2995.00,2990.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767756274),(212,40,-5.00,2990.00,2985.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767756405),(213,40,-50.00,2985.00,2935.00,'鍏戞崲鎹㈣娆℃暟',1767922242),(214,40,-300.00,2935.00,2635.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767922295),(215,70,1000.00,0.00,1000.00,'閲戝竵鍏呭€?,1767947522),(216,70,-5.00,1000.00,995.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1767947527),(217,70,-5.00,995.00,990.00,'璐拱鏈嶉グ:鐧借壊鏃犺瑁?,1767947529),(218,70,-50.00,990.00,940.00,'鍏戞崲鎹㈣娆℃暟',1767947535),(219,70,-20.00,940.00,920.00,'璐拱闊宠壊:娓╂殩鏄ラ濂?,1767948088),(220,70,-50.00,920.00,870.00,'璐拱闊宠壊:楂橀泤姘旇川濂?,1767948090),(221,36,-20.00,660.00,640.00,'璐拱闊宠壊:娓╂殩鏄ラ濂?,1767964467),(222,36,-330.00,640.00,310.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965019),(223,36,660.00,310.00,970.00,'閲戝竵鍏呭€?,1767965036),(224,36,-660.00,970.00,310.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965037),(225,36,1440.00,310.00,1750.00,'閲戝竵鍏呭€?,1767965042),(226,36,-1440.00,1750.00,310.00,'璧犻€佺ぜ鐗?褰╄櫣',1767965043),(227,36,1440.00,310.00,1750.00,'閲戝竵鍏呭€?,1767965044),(228,36,-1440.00,1750.00,310.00,'璧犻€佺ぜ鐗?褰╄櫣',1767965045),(229,36,2160.00,310.00,2470.00,'閲戝竵鍏呭€?,1767965050),(230,36,2160.00,2470.00,4630.00,'閲戝竵鍏呭€?,1767965051),(231,36,-2160.00,4630.00,2470.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965051),(232,36,-2160.00,2470.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965052),(233,36,2160.00,310.00,2470.00,'閲戝竵鍏呭€?,1767965052),(234,36,-2160.00,2470.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965053),(235,36,2310.00,310.00,2620.00,'閲戝竵鍏呭€?,1767965089),(236,36,-2310.00,2620.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965090),(237,36,2310.00,310.00,2620.00,'閲戝竵鍏呭€?,1767965090),(238,36,2310.00,2620.00,4930.00,'閲戝竵鍏呭€?,1767965091),(239,36,-2310.00,4930.00,2620.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965091),(240,36,-2310.00,2620.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965092),(241,36,2310.00,310.00,2620.00,'閲戝竵鍏呭€?,1767965096),(242,36,2310.00,2620.00,4930.00,'閲戝竵鍏呭€?,1767965097),(243,36,-2310.00,4930.00,2620.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965097),(244,36,2310.00,2620.00,4930.00,'閲戝竵鍏呭€?,1767965098),(245,36,-2310.00,4930.00,2620.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965098),(246,36,-2310.00,2620.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965099),(247,36,2310.00,310.00,2620.00,'閲戝竵鍏呭€?,1767965102),(248,36,2310.00,2620.00,4930.00,'閲戝竵鍏呭€?,1767965103),(249,36,-2310.00,4930.00,2620.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965103),(250,36,2310.00,2620.00,4930.00,'閲戝竵鍏呭€?,1767965104),(251,36,-2310.00,4930.00,2620.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965104),(252,36,-2310.00,2620.00,310.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767965105),(253,36,770.00,310.00,1080.00,'閲戝竵鍏呭€?,1767965108),(254,36,770.00,1080.00,1850.00,'閲戝竵鍏呭€?,1767965109),(255,36,-770.00,1850.00,1080.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965109),(256,36,-770.00,1080.00,310.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965110),(257,36,770.00,310.00,1080.00,'閲戝竵鍏呭€?,1767965110),(258,36,-770.00,1080.00,310.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965111),(259,36,770.00,310.00,1080.00,'閲戝竵鍏呭€?,1767965114),(260,36,770.00,1080.00,1850.00,'閲戝竵鍏呭€?,1767965115),(261,36,-770.00,1850.00,1080.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965115),(262,36,770.00,1080.00,1850.00,'閲戝竵鍏呭€?,1767965116),(263,36,-770.00,1850.00,1080.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965116),(264,36,-770.00,1080.00,310.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767965117),(265,41,-30.00,1040.00,1010.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767968436),(266,41,-20.00,1010.00,990.00,'璧犻€佺ぜ鐗?褰╄櫣',1767968441),(267,41,-10.00,990.00,980.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767968444),(268,41,-10.00,980.00,970.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1767968446),(269,41,-30.00,970.00,940.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1767968469),(270,70,-100.00,870.00,770.00,'璐拱鏈嶉グ:鍚婂甫',1768204460),(271,70,-60.00,770.00,710.00,'璐拱鏈嶉グ:涓€瀛楅',1768204557),(272,70,-50.00,710.00,660.00,'璐拱鏈嶉グ:瑗胯瑁?,1768204560),(273,70,-100.00,660.00,560.00,'璐拱鏈嶉グ:楸奸瑁硅兏',1768204901),(274,70,-100.00,560.00,460.00,'璐拱鏈嶉グ:钑句笣鍚婂甫',1768204936),(275,72,40.00,0.00,40.00,'閲戝竵鍏呭€?,1768210551),(276,72,-40.00,40.00,0.00,'璧犻€佺ぜ鐗?褰╄櫣',1768210552),(277,72,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1768210863),(278,72,-100.00,3000.00,2900.00,'璐拱鏈嶉グ:楸奸瑁硅兏',1768210874),(279,72,-5.00,2900.00,2895.00,'璐拱鏈嶉グ:娴呰摑鐗涗粩瑁?,1768210877),(280,72,-50.00,2895.00,2845.00,'鍏戞崲鎹㈣娆℃暟',1768210903),(281,72,-20.00,2845.00,2825.00,'璧犻€佺ぜ鐗?褰╄櫣',1768287328),(282,70,-120.00,460.00,340.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1768363505),(283,70,990.00,340.00,1330.00,'閲戝竵鍏呭€?,1768363522),(284,70,-990.00,1330.00,340.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1768363523),(285,70,990.00,340.00,1330.00,'閲戝竵鍏呭€?,1768363528),(286,70,-990.00,1330.00,340.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1768363529),(287,36,-160.00,310.00,150.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1768364202),(288,36,-100.00,150.00,50.00,'璐拱鏈嶉グ:楸奸瑁硅兏',1768364261),(289,36,-50.00,50.00,0.00,'鍏戞崲鎹㈣娆℃暟',1768369152),(290,36,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1768374272),(291,36,3000.00,3000.00,6000.00,'閲戝竵鍏呭€?,1768374276),(292,36,3000.00,6000.00,9000.00,'閲戝竵鍏呭€?,1768374281),(293,36,-100.00,9000.00,8900.00,'璐拱鏈嶉グ:钑句笣鍚婂甫',1768374296),(294,14,600.00,70.00,670.00,'閲戝竵鍏呭€?,1768544392),(295,14,-100.00,670.00,570.00,'璐拱鏈嶉グ:楸奸瑁硅兏',1768808695),(296,14,-30.00,570.00,540.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1768808868),(297,14,-60.00,540.00,480.00,'璐拱鏈嶉グ:涓€瀛楅',1768808911),(298,75,3000.00,0.00,3000.00,'閲戝竵鍏呭€?,1768813244),(299,41,-30.00,940.00,910.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1768829910),(300,36,-70.00,8900.00,8830.00,'璧犻€佺ぜ鐗?蹇冩効鐡?,1769001385),(301,36,-320.00,8830.00,8510.00,'璧犻€佺ぜ鐗?褰╄櫣',1769001393),(302,36,-330.00,8510.00,8180.00,'璧犻€佺ぜ鐗?鐖卞績淇″皝',1769001409),(303,77,100.00,0.00,100.00,'閲戝竵鍏呭€?,1769066079),(304,77,100.00,100.00,200.00,'閲戝竵鍏呭€?,1769066462),(305,70,1000.00,340.00,1340.00,'閲戝竵鍏呭€?,1769589786),(306,70,-999.00,1340.00,341.00,'璐拱闊宠壊:椋庨獨鎰忓姩濂?,1769589791),(307,32,3000.00,150.00,3150.00,'閲戝竵鍏呭€?,1769683970),(308,32,-999.00,3150.00,2151.00,'璐拱闊宠壊:椋庨獨鎰忓姩濂?,1769683990),(309,32,-140.00,2151.00,2011.00,'璧犻€佺ぜ鐗?褰╄櫣',1769684043),(310,32,-100.00,2011.00,1911.00,'璐拱鏈嶉グ:钑句笣鍚婂甫',1769832568),(311,32,-100.00,1911.00,1811.00,'璐拱鏈嶉グ:楸奸瑁硅兏',1769832598),(312,70,-40.00,341.00,301.00,'璧犻€佺ぜ鐗?褰╄櫣',1770104760),(313,70,-100.00,301.00,201.00,'璐拱鏈嶉グ:钑句笣鍚婂甫涓婅。',1770190331),(314,70,-70.00,201.00,131.00,'璐拱鏈嶉グ:鐧捐ざ鐭',1770190338),(315,70,10.00,131.00,141.00,'閭€璇锋柊鐢ㄦ埛濂栧姳',1770202559),(316,84,5.00,0.00,5.00,'浣跨敤閭€璇风爜濂栧姳',1770202559),(317,70,-120.00,141.00,21.00,'璧犻€佺ぜ鐗?鏈堜寒',1770253817); +/*!40000 ALTER TABLE `nf_user_money_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_rule` +-- + +DROP TABLE IF EXISTS `nf_user_rule`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_rule` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `pid` int DEFAULT NULL COMMENT '鐖禝D', + `name` varchar(50) DEFAULT NULL COMMENT '鍚嶇О', + `title` varchar(50) DEFAULT '' COMMENT '鏍囬', + `remark` varchar(100) DEFAULT NULL COMMENT '澶囨敞', + `ismenu` tinyint(1) DEFAULT NULL COMMENT '鏄惁鑿滃崟', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `weigh` int DEFAULT '0' COMMENT '鏉冮噸', + `status` enum('normal','hidden') DEFAULT NULL COMMENT '鐘舵€?, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳瑙勫垯琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_rule` +-- + +LOCK TABLES `nf_user_rule` WRITE; +/*!40000 ALTER TABLE `nf_user_rule` DISABLE KEYS */; +INSERT INTO `nf_user_rule` VALUES (1,0,'index','Frontend','',1,1491635035,1491635035,1,'normal'),(2,0,'api','API Interface','',1,1491635035,1491635035,2,'normal'),(3,1,'user','User Module','',1,1491635035,1491635035,12,'normal'),(4,2,'user','User Module','',1,1491635035,1491635035,11,'normal'),(5,3,'index/user/login','Login','',0,1491635035,1491635035,5,'normal'),(6,3,'index/user/register','Register','',0,1491635035,1491635035,7,'normal'),(7,3,'index/user/index','User Center','',0,1491635035,1491635035,9,'normal'),(8,3,'index/user/profile','Profile','',0,1491635035,1491635035,4,'normal'),(9,4,'api/user/login','Login','',0,1491635035,1491635035,6,'normal'),(10,4,'api/user/register','Register','',0,1491635035,1491635035,8,'normal'),(11,4,'api/user/index','User Center','',0,1491635035,1491635035,10,'normal'),(12,4,'api/user/profile','Profile','',0,1491635035,1491635035,3,'normal'); +/*!40000 ALTER TABLE `nf_user_rule` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_score_log` +-- + +DROP TABLE IF EXISTS `nf_user_score_log`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_score_log` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '浼氬憳ID', + `score` int NOT NULL DEFAULT '0' COMMENT '鍙樻洿绉垎', + `before` int NOT NULL DEFAULT '0' COMMENT '鍙樻洿鍓嶇Н鍒?, + `after` int NOT NULL DEFAULT '0' COMMENT '鍙樻洿鍚庣Н鍒?, + `memo` varchar(255) DEFAULT '' COMMENT '澶囨敞', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳绉垎鍙樺姩琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_score_log` +-- + +LOCK TABLES `nf_user_score_log` WRITE; +/*!40000 ALTER TABLE `nf_user_score_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_user_score_log` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_user_token` +-- + +DROP TABLE IF EXISTS `nf_user_token`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_user_token` ( + `token` varchar(50) NOT NULL COMMENT 'Token', + `user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '浼氬憳ID', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `expiretime` bigint DEFAULT NULL COMMENT '杩囨湡鏃堕棿', + PRIMARY KEY (`token`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='浼氬憳Token琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_user_token` +-- + +LOCK TABLES `nf_user_token` WRITE; +/*!40000 ALTER TABLE `nf_user_token` DISABLE KEYS */; +INSERT INTO `nf_user_token` VALUES ('04c7f406e047612941ce6d6820cb059244d3c72f',84,1770112671,1772704671),('0657405247f72e8906328d2d929f48f40ddce5eb',36,1769073857,1771665857),('0a40e02bef37319e028dc50119a0bb3862b3aaf1',82,1769605201,1772197201),('0b2719f4435f5ef84992db8dffd3d0e811a44f82',41,1768811704,1771403704),('0ca7905ad8ba550e4edbe61f08d20ee1058a37ef',36,1769508255,1772100255),('0d3bce2372f41ef1c753c2664ba712cdb2f77ad5',36,1768813659,1771405659),('0e9b84c8e2b036de429e9ed5dd807d8704e4e005',84,1770112681,1772704681),('1061febb40abe8067378469c0e02df71909f3e39',36,1769502621,1772094621),('11af8f3fdada7e224a77503b3e29b4b6eba753e8',25,1767602854,1770194854),('14c4c0fc40fcb049dd2186ed07daaa1d80097d6f',36,1769515582,1772107582),('1627ca0ce3cbda20692e59adb818862f660cc66a',40,1768209791,1770801791),('195ca7ac0dc9ba466fa9a12803c641b5b4361cbb',41,1768891792,1771483792),('19f8810536c40715382fedce5687535642d4480a',14,1767670560,1770262560),('1a67155b3fba9c55c5716350147bc69316bd3a04',72,1769502426,1772094426),('20a402eb29e499fa4d150ebb4a4379c5b74744b5',72,1768447683,1771039683),('25618f98dcffbdf1b98afa1731ad36901685807c',84,1770112682,1772704682),('26726af3466feac70c56258e3fdb83ffdc66000d',36,1769579186,1772171186),('28aa7c7e718d817373eedc933f4a7174f7000287',72,1768289319,1770881319),('28fc1d3a5b4e01ab58884c0d597c476e293d376c',72,1768274818,1770866818),('2b30f3f11e6f8e7ff224e4588e710d077cb07125',72,1768446554,1771038554),('2ca1410b6e4caf01de3616afcda9f65cde3e2192',70,1769938514,1772530514),('2fb912b0f24c2968a4b45dec5dabac2f6e178878',14,1767668475,1770260475),('3197fb00935a02e080d88edeb87b1e730fc66db7',40,1767926600,1770518600),('3249c0f5f0ca45646a29d616c7c404e68433f5de',14,1768805576,1771397576),('32c0546226778483e003d514312e2cf23709debb',40,1767927380,1770519380),('3413f040fb378aab87606e36224d525496bb72b6',70,1767945689,1770537689),('34b9b19ad83b6db15f1df908b8973bd78bdf7511',14,1768890167,1771482167),('36e298d0e9830c3875227c34e9e61d16ecf70f2a',76,1769564486,1772156486),('3d2529a4fdd2da4e8ff173d817b66b0edcfc4016',40,1767865780,1770457780),('3dc4ce2bf6ead50f325d03c8e143f70e07b2999e',70,1770202613,1772794613),('3e691f2e03adc22d7ff70de6ed96013377a046cf',72,1768440885,1771032885),('3f438056c56d67164301cb41a2de5f86dacefb03',25,1767602126,1770194126),('424304ef17c883c195c6511a26f798384d65d454',72,1768461030,1771053030),('43b4447310a571aff9f6faf02f13d7f4991f523f',84,1770112447,1772704447),('44c5e1a819594c4d04af8e0f230c23dac6ea6c4b',25,1767614684,1770206684),('45d08e7bf5210190b5983ecc0edd2699f6eb0dc3',14,1768877251,1771469251),('45ddb45f2ed0cd28f4aa082de5a1305f3109ee89',84,1770112439,1772704439),('46b9b8f80a165731929a4f58823535fd63651e98',36,1769000546,1771592546),('47a949053a34b04679edf1e5f27aadc29be1230c',84,1769855890,1772447890),('4929f43449c225f355a9be2c4a3dcc6f5acca9ba',27,1767689496,1770281496),('4bd21665194b45e04f916ad7e8a5c2887bf92494',71,1768021826,1770613826),('4bd4367340a72d1000abc745d979281d9f9ccc00',72,1768461737,1771053737),('4db2817750e22893e7a0c84b184b07d8fe9fee5d',12,1768445788,1771037788),('4fc96ed52a81c8652a057fa84e8bd8893afa9dbc',72,1768461076,1771053076),('50c649e3460afba181d986eca8bca9cf25e604b2',72,1768446305,1771038305),('50d78e76e10610d5c862e56d878a2347eaa19b8d',40,1767927046,1770519046),('50f08b0513664e1a5c12a7c9c63e308c2af4afd9',24,1768877235,1771469235),('5128af71cddb825e46abf5e59d4f582676cb8e68',72,1768441500,1771033500),('51d1c1ced42be932d0cbc3aab82b527eaefd4da6',69,1767670129,1770262129),('525cbcfa1877e3e3e67954e0ef616553bc2967ea',84,1769854345,1772446345),('530258372c4cc849a312933bb1fdb0d47baf02a6',84,1769855768,1772447768),('538fc66072cb35b056f68070ead947a262721766',36,1768804791,1771396791),('54477b5bd7167e72764c164dde03a825c0321b86',72,1768443839,1771035839),('55902bb7cc7acec96e37caf4a4cb9699c494f0df',72,1768806871,1771398871),('58f1507711e8df428f0135240a9fe50388a05b1b',72,1769502731,1772094731),('593e784165843bb2f2f7c12bfd4c3668019929d7',24,1768567393,1771159393),('59f20f066448ad27f243d42bad5aaf790be33a82',12,1768739641,1771331641),('5d62878c7c92b7f6fe4454136f312e262c9499e0',40,1767865746,1770457746),('61ebdef2dfb566d56ed3f71f80732886491eb105',84,1770112450,1772704450),('656627020767b0e4cfb6c5b8de515f3a5e74ce43',32,1767698449,1770290449),('659fe1f239409abf5241413b49d6779ebfea10c4',36,1769073686,1771665686),('69a154382513618c330a1bf644b08945721186ec',14,1768544297,1771136297),('6bb972eb4e9cde8140ce93f1e2c15871910229a9',24,1768808147,1771400147),('6c3853a21250ff5cb1cff92346b02db31ea2799e',40,1767948016,1770540016),('6c43d8344ec0257d9bfd3739fabb373c12fdc4fd',36,1769601023,1772193023),('6efc48c3c59f02fc318f34f779c3e4df49d9e4c4',36,1768810739,1771402739),('6f9d8068c8f54fe68d9b51e611a64f29a96137ee',84,1770112445,1772704445),('7146526fb2713d7e6e8cae9ec0c14c55b2b11ca8',12,1768445645,1771037645),('71902c08ae9bda082d38c005490d3acab95463eb',70,1768361918,1770953918),('722aada80c82e24c187f7ed5176542361f41faff',72,1768442072,1771034072),('75c36441d88be1f270f00a3bf546992ba0abed2d',36,1767949602,1770541602),('76a16931fd43b64b68971f960ed5a4e4bde99359',70,1769595263,1772187263),('7877fefdc68b9c721193dcf5c4d3c3b66088a877',72,1768462466,1771054466),('79f2a709a11b214345dbec611823592250c940ff',72,1768443858,1771035858),('7e9597dbfd00ca43b6e61d5c8f0eceb6cb7c8377',40,1767927409,1770519409),('80350682fa5b859164764139bd3cb3b13aa310cd',36,1767949369,1770541369),('806f308095ae5ccab1ccb236a5be2ef7de38639b',72,1768441583,1771033583),('84098c48b38a0700a2213d31d98154769e1cf5e8',36,1769600707,1772192707),('85f0617eef14f9b505ac2fa7731192587e330221',27,1767750815,1770342815),('865bd5945ae63c233956f65a30d2d8003e91465c',27,1767690288,1770282288),('8712a09c19d09cdbfcfda4144a5943d9e3711eab',72,1768562577,1771154577),('8716d0220118946bec0d0c27652fd61a0b43c361',14,1768641505,1771233505),('88a851ed6ddcc1c8f5a5a1ce41496f51010bb642',72,1769502604,1772094604),('897126dba6ba121ba8489ec6b9caef06a3d7dd09',36,1769502757,1772094757),('8a0470f10871a9a05a8fc2bce6d71af6e2f0c7f8',84,1770112764,1772704764),('8c291c1c379b61b04fb87e8724f7782538e27be9',70,1767948179,1770540179),('8d3f95bb0b25d5517e6135ab03d0c754fad61139',72,1768446309,1771038309),('8fcb00d8328d78e0774f65b8c45428e5d01104fe',84,1770112434,1772704434),('91d999b14ff24fbbfa5647620751fcc80f88bbab',73,1768806463,1771398463),('91f74393a284c2786592245f7d2354dcbd3efd34',32,1769778688,1772370688),('939bb3d76eec4f5aacd482c7f5dd98056b15ad15',72,1768460912,1771052912),('94eb03865f8a64fe673f177dfc282685dd37a142',70,1768362523,1770954523),('962fe9c882d6cffd3974fdda28e6d6307c077a59',70,1768271311,1770863311),('972e5b2c92d28b5aba03c4f1569eb424409f6a21',40,1767922016,1770514016),('97b88f41953a44645d0f294170f47647e991588e',72,1768443787,1771035787),('97db6087101370b7af1ee53b2c2cbdcca7c97a97',84,1770112448,1772704448),('9aff3b94616e4b7b4302e634acc5cb30f211c52f',72,1768562425,1771154425),('9b9a071cb442c371e70c4203df9bdff10c369757',70,1768359692,1770951692),('a1be9c363c72b7ef624fd765c237d32ad19c62e8',40,1767694971,1770286971),('a1dda05b2d8734150e4c18c24980cbdce1c59a2e',40,1768209097,1770801097),('a21e59873e1f07600e86ced72f13ccb754defbf0',40,1767939366,1770531366),('a84552895c575ab9a57caa8c90a2f9a07b6e8e91',70,1769509228,1772101228),('a9240d9c6fa3fd0b45b09dcada99742e01448d4e',84,1770112678,1772704678),('a98041c4f465aef913f3b40a111361e29ce065b3',72,1768446616,1771038616),('a9c08777e85f6963ee59d2bb7a2dd7ff56aafa28',41,1769507880,1772099880),('add92c4de35c0dd27585fa5979c6db3b7834766e',70,1769914249,1772506249),('ae2986a1c0d22683077feeb4e786a747cae5f4f0',40,1767930017,1770522017),('b21c43071ef3df58d0218dbeb902478e93ada802',24,1768641490,1771233490),('b26ac17aef949d285a6d01dc9df835e951a5f478',72,1768461839,1771053839),('b399e335593b0fc3302ccf1d53699e50442b8b88',72,1768976676,1771568676),('b3b02f7c032682b7fed15af3336fb22dbc836aa1',70,1769763521,1772355521),('b48c840d57c3ba238de5bb6b1b970477558a2066',72,1768441305,1771033305),('b52ca8dcc71aed3dce12dff062bbc99e9f6de44e',40,1767865650,1770457650),('b5d438dade86f3b0793a0c54867c62ac22031517',72,1768441354,1771033354),('b6b43b15640da13fa3f84595a474d0e8424392f9',27,1767753141,1770345141),('b869faf823f777d0951ac6cc4bd4c3a3bc6cdc95',27,1767699170,1770291170),('b9a9ccac760ae1ca4b5f521106bc19e396891485',24,1767668437,1770260437),('ba2c3b8d6cac4877589abcd9ad63f35681ea3e15',84,1770112448,1772704448),('bb4a731b3aa093b4de03bf0e41669d65a16da566',36,1769502578,1772094578),('bbf2eaa98024a574f749cb0319dffa5ff689535c',72,1768446970,1771038970),('be74b294979c043c723008825e4027fad1435e87',76,1769653813,1772245813),('bff6426f772e259839c746c3f89799f5d888e43e',72,1768447935,1771039935),('c122baf31cc128fccc0273a4b25e09899c5e3379',78,1769514999,1772106999),('c2dae5e64b39c1d9b970247086c0b2d6de11bec1',70,1769914248,1772506248),('c32cf77e9648ca7be0873619ea41eee274c304ee',84,1770112683,1772704683),('c47f81439d6cedd12a52817ab8b6703edfcb0735',84,1770112773,1772704773),('c53eccf5f99d966a2492c0c803ab38a78c8cff96',72,1768459472,1771051472),('c60343fe4cc38dfad26c48d6c603a6e6e6a70fd6',25,1767664689,1770256689),('c6aa2d7c67f95f117e9887c249fa7dcd33e81907',25,1768794459,1771386459),('c73e98075919a89957fad3dde7c61009899ae966',72,1768446329,1771038329),('c78071d2e883df1d780e0a9f72373e3c713d80aa',84,1770112447,1772704447),('c8280b402bbbfb97cc8b8e877f9b8af973ab5964',32,1769911285,1772503285),('cb6b64a7f8ee881faecd7adce8e46209c0117cd0',40,1767865715,1770457715),('cbfd338f705620b650509d7b6328cf29dd300f18',27,1767695571,1770287571),('cd3f4760cd6686ab3db55a81e825b524b5e742cd',25,1767601702,1770193702),('ced10b3a5d5dcd28d51c9890d61a076dbc82a633',72,1768460950,1771052950),('d1ae78bfbfe9785678efa7b0044fa23df60670a6',73,1768617176,1771209176),('d1bd95fd853cfe7ead40ca8c386d0128978ecf8c',14,1768877384,1771469384),('d3c51145249efcf72a3eac26ed79ad8537366b6f',72,1768459385,1771051385),('d5ad02a3dca18476ec0f5a4bf88a33df3b4fecb4',69,1768890402,1771482402),('d5d8284784c28218dc07010a009e28873c8a3766',81,1769604112,1772196112),('d5f2a88f35f8f27bb859e7f9f65a0242cded7c08',40,1767941005,1770533005),('d9e03d044c4444d1c1097c9ad65f038b110ffdb2',72,1768459944,1771051944),('dc04402ddd2d6216220b19480c7b703a0112f7fe',84,1769856147,1772448147),('dd736bec784025c55980e5b9480ace5fdb8dbc6f',36,1768363858,1770955858),('e4909cfd89889e2616d16075682dd00f474ce1e9',40,1767930065,1770522065),('e4d0e3a35f207d4d8b70b484827c1884ee7dfbc9',84,1770112444,1772704444),('e6e747e0fba601ca87f597d850d1abca4ea96cea',24,1767670111,1770262111),('e6f805cd1fd8dfe67bb5d6e0ecb3de5f0b72c58e',14,1768808238,1771400238),('e7b1be62f6b6d0e444d3f8a0e28b6eee4ca7ee9b',72,1768446396,1771038396),('e9129faae935e60948b101f800eaf1e4e3e6e00e',84,1769855768,1772447768),('eb69c12bfc8d9eed1f1a648bc26ae6d62304479f',70,1768359692,1770951692),('edb6e44e02d0b83c18be94da61c0e574178dfdfd',40,1767921350,1770513350),('f0e2dbfb54c1eb78d4048a1378f805dd720a7948',72,1768462173,1771054173),('f0f05e074e33ba8be8f7dbe50b999fcaf8c51201',72,1768441172,1771033172),('f2277428e0602f02f24497c8cae3c195235726a9',36,1767949602,1770541602),('f37861121d2ef0f47d509dbcb69e04f7d79e6913',83,1769611158,1772203158),('f443c0aeb7f7ce9da0d308fd5e922c21161613de',32,1769683222,1772275222),('f513879dce8e21c6a57031ebe3abafb6ee568795',32,1769911279,1772503279),('f553bcab13fdecb81b847808eb4134cc93801c03',72,1768462078,1771054078),('f5a7370f84572d41f8383b1581476295631e1250',70,1769936134,1772528134),('fa0a80e8c11c869544c6b5d074bbb28b3d6344c3',41,1767967727,1770559727),('faf7720d5bc5614ddb254454c40e2e09c22a41ba',72,1768562577,1771154577),('fc5236c90b222827a1c2b72f4c129de83d745c44',72,1769671498,1772263498),('fd10ba0c282cabaafd014094c58c2a97e6b75057',14,1768641445,1771233445); +/*!40000 ALTER TABLE `nf_user_token` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_version` +-- + +DROP TABLE IF EXISTS `nf_version`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_version` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `oldversion` varchar(30) DEFAULT '' COMMENT '鏃х増鏈彿', + `newversion` varchar(30) DEFAULT '' COMMENT '鏂扮増鏈彿', + `packagesize` varchar(30) DEFAULT '' COMMENT '鍖呭ぇ灏?, + `content` varchar(500) DEFAULT '' COMMENT '鍗囩骇鍐呭', + `downloadurl` varchar(255) DEFAULT '' COMMENT '涓嬭浇鍦板潃', + `enforce` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '寮哄埗鏇存柊', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `weigh` int NOT NULL DEFAULT '0' COMMENT '鏉冮噸', + `status` varchar(30) DEFAULT '' COMMENT '鐘舵€?, + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='鐗堟湰琛?; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_version` +-- + +LOCK TABLES `nf_version` WRITE; +/*!40000 ALTER TABLE `nf_version` DISABLE KEYS */; +/*!40000 ALTER TABLE `nf_version` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_vip_order` +-- + +DROP TABLE IF EXISTS `nf_vip_order`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_vip_order` ( + `id` int NOT NULL AUTO_INCREMENT, + `order_sn` varchar(255) DEFAULT NULL COMMENT '璁㈠崟缂栧彿', + `out_trade_no` varchar(255) DEFAULT NULL COMMENT '鏀粯娴佹按鍙?, + `user_id` int DEFAULT NULL COMMENT '鐢ㄦ埛id', + `pay_type` enum('miniWechat','aliPay') DEFAULT NULL COMMENT '鏀粯鏂瑰紡:miniWechat=寰俊灏忕▼搴?aliPay=鏀粯瀹?, + `price` decimal(10,2) DEFAULT NULL COMMENT '鏀粯閲戦', + `day_num` int DEFAULT NULL COMMENT '澶╂暟', + `pay_status` enum('0','1','2') DEFAULT '0' COMMENT '鏀粯鐘舵€?0=寰呮敮浠?1=宸叉敮浠?2=宸插彇娑?, + `pay_time` bigint DEFAULT NULL COMMENT '鏀粯鏃堕棿', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='VIP璁㈠崟'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_vip_order` +-- + +LOCK TABLES `nf_vip_order` WRITE; +/*!40000 ALTER TABLE `nf_vip_order` DISABLE KEYS */; +INSERT INTO `nf_vip_order` VALUES (28,'V122025122719141','VIP122025122719141',12,'miniWechat',14.00,30,'1',1766819416,1766819141,1766819141),(29,'V122025122719460','VIP122025122719460',12,'miniWechat',40.00,90,'1',1766819466,1766819460,1766819460),(30,'V122025122719578','VIP122025122719578',12,'miniWechat',14.00,30,'1',1766819585,1766819579,1766819579),(31,'V122025122719619','VIP122025122719619',12,'miniWechat',40.00,90,'1',1766819625,1766819619,1766819619),(32,'V122025122719653','VIP122025122719653',12,'miniWechat',40.00,90,'1',1766819661,1766819653,1766819653),(33,'V142025122721248','VIP142025122721248',14,NULL,180.00,365,'0',NULL,1766821248,1766821248),(34,'V142025122721294','VIP142025122721294',14,'miniWechat',180.00,365,'1',1766821294,1766821294,1766821294),(35,'V152025122886377','VIP152025122886377',15,'miniWechat',180.00,365,'1',1766886377,1766886377,1766886377),(36,'V272025123176529','VIP272025123176529',27,'miniWechat',180.00,365,'1',1767176529,1767176529,1767176529),(37,'V272025123176538','VIP272025123176538',27,'miniWechat',180.00,365,'1',1767176538,1767176538,1767176538),(38,'V272025123176541','VIP272025123176541',27,'miniWechat',180.00,365,'1',1767176541,1767176541,1767176541),(39,'V312025123183198','VIP312025123183198',31,'miniWechat',180.00,365,'1',1767183198,1767183198,1767183198),(40,'V322025123185124','VIP322025123185124',32,'miniWechat',14.00,30,'1',1767185124,1767185124,1767185124),(41,'V362025123188686','VIP362025123188686',36,'miniWechat',14.00,30,'1',1767188686,1767188686,1767188686),(42,'V362025123189784','VIP362025123189784',36,'miniWechat',14.00,30,'1',1767189784,1767189784,1767189784),(43,'V372026010494715','VIP372026010494715',37,'miniWechat',180.00,365,'1',1767494715,1767494715,1767494715),(44,'V372026010494723','VIP372026010494723',37,'miniWechat',40.00,90,'1',1767494723,1767494723,1767494723),(45,'V402026010417911','VIP402026010417911',40,'miniWechat',180.00,365,'1',1767517911,1767517911,1767517911),(46,'V412026010425041','VIP412026010425041',41,'miniWechat',180.00,365,'1',1767525042,1767525041,1767525041),(47,'V722026011211003','VIP722026011211003',72,'miniWechat',180.00,365,'1',1768211003,1768211003,1768211003),(48,'V142026011644399','VIP142026011644399',14,'miniWechat',40.00,90,'1',1768544399,1768544399,1768544399),(49,'V752026011913229','VIP752026011913229',75,'miniWechat',180.00,365,'1',1768813229,1768813229,1768813229),(50,'V812026012804258','VIP812026012804258',81,'miniWechat',180.00,365,'1',1769604258,1769604258,1769604258),(51,'V702026020139827','VIP702026020139827',70,'miniWechat',40.00,90,'1',1769939827,1769939827,1769939827),(52,'V702026020297413','VIP702026020297413',70,'miniWechat',180.00,365,'1',1769997413,1769997413,1769997413); +/*!40000 ALTER TABLE `nf_vip_order` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_vip_package` +-- + +DROP TABLE IF EXISTS `nf_vip_package`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_vip_package` ( + `id` int NOT NULL AUTO_INCREMENT, + `money` int DEFAULT NULL COMMENT '閲戦', + `title` varchar(255) DEFAULT NULL COMMENT '鍚嶇О', + `desc` varchar(255) DEFAULT NULL COMMENT '鎻忚堪', + `day` int DEFAULT '0' COMMENT '澶╂暟', + `weigh` int DEFAULT '0' COMMENT '鎺掑簭', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `switch` tinyint(1) DEFAULT '0' COMMENT '鎺ㄨ崘', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='VIP濂楅'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_vip_package` +-- + +LOCK TABLES `nf_vip_package` WRITE; +/*!40000 ALTER TABLE `nf_vip_package` DISABLE KEYS */; +INSERT INTO `nf_vip_package` VALUES (5,14,'鍖呮湀','涔濇姌浼樻儬',30,5,1766818310,1766818310,0),(6,40,'鍖呭濂楅','涔濇姌浼樻儬',90,6,1766818353,1766818516,1),(7,180,'鍖呭勾濂楅','涔濇姌浼樻儬',365,7,1766818369,1766818369,0); +/*!40000 ALTER TABLE `nf_vip_package` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `nf_voice_library` +-- + +DROP TABLE IF EXISTS `nf_voice_library`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `nf_voice_library` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '闊宠壊ID', + `name` varchar(64) NOT NULL COMMENT '闊宠壊鍚嶇О', + `gender` enum('male','female') NOT NULL COMMENT '鎬у埆(鍗曢€?:male=鐢?female=濂?, + `style_tag` varchar(32) DEFAULT NULL COMMENT '椋庢牸鏍囩', + `avatar_url` varchar(255) DEFAULT NULL COMMENT '闊宠壊澶村儚URL', + `sample_audio_url` varchar(255) DEFAULT NULL COMMENT '璇曞惉URL', + `tts_model_id` varchar(64) DEFAULT NULL COMMENT 'TTS妯″瀷ID', + `voice_code` varchar(64) NOT NULL COMMENT 'CosyVoice voice 鍙傛暟', + `is_default` tinyint(1) DEFAULT '0' COMMENT '鏄惁榛樿鍏滃簳', + `is_owned` tinyint(1) DEFAULT '1' COMMENT '鏄惁宸叉嫢鏈?, + `price_gold` int DEFAULT '0' COMMENT '鏈嫢鏈夋椂瑙i攣鎵€闇€閲戝竵', + `createtime` bigint DEFAULT NULL COMMENT '鍒涘缓鏃堕棿', + `updatetime` bigint DEFAULT NULL COMMENT '鏇存柊鏃堕棿', + `deletetime` bigint DEFAULT NULL COMMENT '鍒犻櫎鏃堕棿', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='铏氭嫙瑙掕壊'; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `nf_voice_library` +-- + +LOCK TABLES `nf_voice_library` WRITE; +/*!40000 ALTER TABLE `nf_voice_library` DISABLE KEYS */; +INSERT INTO `nf_voice_library` VALUES (1,'娴极椋庢儏濂?,'female','娴极椋庢儏','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/221295058d27e5dddcfa0e7e2cd06185.mp3','cosyvoice-v2','longqiang_v2',1,1,0,NULL,1767002310,NULL),(2,'娓╂煍闂鸿湝濂?,'female','娓╂煍闂鸿湝','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/3659df91b3fb9bf3a06c42129c9fd267.mp3','cosyvoice-v2','longanrou',0,1,0,NULL,1767002326,NULL),(3,'楂橀泤姘旇川濂?,'female','楂橀泤姘旇川','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/a84a5435c1aa0d242a6bd534187ed1a3.mp3','cosyvoice-v2','longanya',0,0,50,NULL,1767002359,NULL),(4,'骞插噣娓呯埥鐢?,'male','骞插噣娓呯埥','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/1a8e50f5877b7b1ac4e7cb3e7acd97de.mp3','cosyvoice-v2','longanshuo',1,1,0,NULL,1767002382,NULL),(5,'鐫挎櫤杞荤啛鐢?,'male','鐫挎櫤杞荤啛','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/e4e9b244b34d385d6a95fd50f1ff6578.mp3','cosyvoice-v2','longanzhi',0,1,0,NULL,1767002396,NULL),(6,'娓╂殩鐥存儏鐢?,'male','娓╂殩鐥存儏','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/1fe4651fe2b12f311e0dec23f9d4034a.mp3','cosyvoice-v2','longhan_v2',0,0,50,NULL,1767002415,NULL),(8,'瀹炲姏姝屾墜鐢?,'male','瀹炲姏姝屾墜','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/7eb6df79faa38affbeef633f5d6ff894.mp3','cosyvoice-v2','kabuleshen_v2',0,0,20,1767002089,1767002089,NULL),(9,'娓╂殩鏄ラ濂?,'female','娓╂殩鏄ラ','/uploads/20251229/e3e159f0261ac561f1d05a2977c40120.jpg','/uploads/20251229/ba37a4f390dbd8ac5e1cdd83950d129b.mp3','cosyvoice-v2','longyan_v2',0,0,20,1767002564,1767002564,NULL),(10,'浜插拰娲绘臣濂?,'female','浜插拰娲绘臣','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/e21cff998c293dbcb72ec52e4406ad31.mp3','cosyvoice-v2','longanqin',0,1,0,1768199343,1768199343,NULL),(11,'鎬濈淮鐏靛姩濂?,'female','鎬濈淮鐏靛姩','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/6e1f8e84c4b127c5c1e466b00cab0efa.mp3','cosyvoice-v2','longanling',0,1,0,1768199506,1768199506,NULL),(12,'娓╁閭诲濂?,'female','娓╁閭诲','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/e8dd3e31fe7f4b26c3604bb197641a0f.mp3','cosyvoice-v2','longxing_v2',0,1,0,1768199668,1768199668,NULL),(13,'鍏冩皵鐢滅編濂?,'female','鍏冩皵鐢滅編','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/93fa8cef1a9fe3411fdbe2379441e8e4.mp3','cosyvoice-v2','longhua_v2',0,1,0,1768199766,1768199766,NULL),(14,'绉瀬鐭ユ€уコ','female','绉瀬鐭ユ€?,'/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/99dd55f5cce442584547bf6e68ff8967.mp3','cosyvoice-v2','longwan_v2',0,1,0,1768200041,1768200041,NULL),(15,'鏅烘収闈掑勾鐢?,'male','鏅烘収闈掑勾','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260112/b2c25914521b1eb90f43f7e0997840f6.mp3','cosyvoice-v2','longcheng_v2',0,1,0,1768200109,1768200109,NULL),(16,'椋庨獨鎰忓姩濂?,'female','椋庨獨鎰忓姩','/uploads/20260109/e102149af04d07aff9e91b83103fd46a.jpeg','/uploads/20260128/3e40b2bb29c0f252464b2cfe75d4cb52.mp3','cosyvoice-v2','cosyvoice-v2-fsyidong-d7a7adf2e7e648488000edb4941e1fa7',0,0,999,1769589747,1769589747,NULL),(17,'灏忓紶','female','鍏嬮殕闊宠壊',NULL,NULL,'cosyvoice-v2','cosyvoice-v2-v6aefa9-2f3ac1f441ac400fad361f005e265104',0,1,0,NULL,NULL,NULL); +/*!40000 ALTER TABLE `nf_voice_library` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Dumping routines for database 'fastadmin' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-02-05 10:58:37 + diff --git a/数据库配置已修复.md b/数据库配置已修复.md new file mode 100644 index 0000000..ac6265b --- /dev/null +++ b/数据库配置已修复.md @@ -0,0 +1,170 @@ +# ✅ 数据库配置已修复 + +## 🔧 问题原因 + +配置文件中的数据库名称不匹配: +- **配置中**: `ai_friend` +- **实际数据库**: `fastadmin` + +## ✅ 已修复 + +已将所有配置文件中的数据库名修改为 `fastadmin`: + +### 修改的文件: +1. ✅ `.env` - 根目录配置 +2. ✅ `lover/.env` - Python 配置 +3. ✅ `xunifriend_RaeeC/.env` - PHP 配置 + +### 新配置: +```env +DATABASE_URL=mysql+pymysql://root:rootx77@localhost:3306/fastadmin?charset=utf8mb4 +``` + +--- + +## 🚀 现在需要做的 + +### 1. 重启后端服务 + +**关闭所有服务窗口**,然后重新启动: + +``` +双击运行:启动项目.bat +``` + +### 2. 等待服务启动完成 + +确认两个服务都正常运行: +- ✅ PHP 服务器窗口 +- ✅ Python 后端窗口 + +### 3. 测试连接 + +访问以下地址确认服务正常: + +**健康检查:** +``` +http://192.168.1.141:30101/health +``` + +应该返回: +```json +{ + "code": 1, + "msg": "ok", + "data": { + "status": "ok" + } +} +``` + +**数据库测试:** +``` +http://192.168.1.141:30100/test_db.php +``` + +应该显示数据库连接成功和数据表列表。 + +### 4. 重新测试移动端登录 + +1. 刷新移动端页面(F5) +2. 输入任意手机号(如:13800138000) +3. 点击登录 +4. 应该能成功登录了! + +--- + +## 📋 验证步骤 + +### 步骤 1:检查 Python 后端日志 + +在 Python 后端窗口中,应该看到: +``` +INFO: Started server process +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:30101 +``` + +**不应该再有数据库错误!** + +### 步骤 2:测试 API + +访问 API 文档: +``` +http://192.168.1.141:30101/docs +``` + +测试任意接口,应该能正常返回数据。 + +### 步骤 3:移动端登录测试 + +1. 打开移动端 +2. 输入手机号:`13800138000` +3. 点击登录 +4. 应该能看到: + - 加载提示消失 + - 登录成功 + - 进入应用主界面 + +--- + +## 🎯 如果还有问题 + +### 检查清单: + +- [ ] 后端服务已重启 +- [ ] Python 窗口没有错误信息 +- [ ] 访问 /health 返回正常 +- [ ] 访问 /docs 能打开 API 文档 +- [ ] 移动端已刷新页面 + +### 查看日志: + +**Python 后端窗口:** +- 查看是否有数据库连接错误 +- 查看是否有其他错误信息 + +**浏览器控制台(F12):** +- 查看 Network 标签 +- 查看 API 请求是否成功 +- 查看返回的错误信息 + +--- + +## 💡 数据库信息总结 + +### 正确的配置: + +``` +数据库名:fastadmin +主机:localhost +端口:3306 +用户:root +密码:rootx77 +字符集:utf8mb4 +表前缀:nf_ +``` + +### 数据表数量: + +应该有 30+ 张表,包括: +- nf_user(用户表) +- nf_lovers(恋人表) +- nf_chat_message(消息表) +- nf_chat_session(会话表) +- 等等... + +--- + +## 🎉 完成! + +数据库配置已修复! + +**现在请:** +1. 关闭所有服务窗口 +2. 重新运行 `启动项目.bat` +3. 等待服务启动完成 +4. 刷新移动端页面 +5. 重新测试登录 + +应该就可以正常登录了!🚀 diff --git a/最终验证.py b/最终验证.py new file mode 100644 index 0000000..2b8439b --- /dev/null +++ b/最终验证.py @@ -0,0 +1,25 @@ +import pymysql + +conn = pymysql.connect(host='localhost', port=3306, user='root', password='rootx77', database='fastadmin', charset='utf8mb4') +cursor = conn.cursor() + +cursor.execute("SHOW TABLES") +tables = cursor.fetchall() +print(f"✅ fastadmin 数据库有 {len(tables)} 张表") + +print("\n检查关键表:") +for t in ['nf_user', 'nf_lovers', 'nf_chat_message', 'nf_chat_session']: + cursor.execute(f"SHOW TABLES LIKE '{t}'") + result = cursor.fetchone() + if result: + cursor.execute(f"SELECT COUNT(*) FROM {t}") + count = cursor.fetchone()[0] + print(f" ✅ {t} (有 {count} 条数据)") + else: + print(f" ❌ {t}") + +cursor.close() +conn.close() + +print("\n✅ 数据库配置完成!") +print("现在可以启动服务了") diff --git a/检查ai_friend数据库.py b/检查ai_friend数据库.py new file mode 100644 index 0000000..e69de68 --- /dev/null +++ b/检查ai_friend数据库.py @@ -0,0 +1,41 @@ +import pymysql + +config = { + 'host': 'localhost', + 'port': 3306, + 'user': 'root', + 'password': 'rootx77', + 'charset': 'utf8mb4' +} + +try: + conn = pymysql.connect(**config) + cursor = conn.cursor() + + # 检查 ai_friend 数据库 + cursor.execute("USE ai_friend") + print("✅ 切换到 ai_friend 数据库成功") + + # 查看所有表 + cursor.execute("SHOW TABLES") + tables = cursor.fetchall() + print(f"\n📋 ai_friend 数据库中的表 (共 {len(tables)} 张):") + for table in tables: + print(f" - {table[0]}") + + # 检查关键表 + key_tables = ['nf_user', 'nf_lovers', 'nf_chat_message'] + print("\n🔍 检查关键表:") + for table_name in key_tables: + cursor.execute(f"SHOW TABLES LIKE '{table_name}'") + result = cursor.fetchone() + if result: + print(f" ✅ {table_name} 存在") + else: + print(f" ❌ {table_name} 不存在") + + cursor.close() + conn.close() + +except Exception as e: + print(f"❌ 错误: {e}") diff --git a/检查fastadmin.py b/检查fastadmin.py new file mode 100644 index 0000000..eb9e4c5 --- /dev/null +++ b/检查fastadmin.py @@ -0,0 +1,20 @@ +import pymysql + +conn = pymysql.connect(host='localhost', port=3306, user='root', password='rootx77', charset='utf8mb4') +cursor = conn.cursor() + +cursor.execute("SHOW DATABASES LIKE 'fastadmin'") +if cursor.fetchone(): + cursor.execute("USE fastadmin") + cursor.execute("SHOW TABLES") + tables = cursor.fetchall() + print(f"fastadmin 数据库有 {len(tables)} 张表") + + for t in ['nf_user', 'nf_lovers', 'nf_chat_message']: + cursor.execute(f"SHOW TABLES LIKE '{t}'") + print(f"{'✅' if cursor.fetchone() else '❌'} {t}") +else: + print("fastadmin 数据库不存在") + +cursor.close() +conn.close() diff --git a/检查磁盘空间.bat b/检查磁盘空间.bat new file mode 100644 index 0000000..7c09114 --- /dev/null +++ b/检查磁盘空间.bat @@ -0,0 +1,62 @@ +@echo off +chcp 65001 >nul +title 检查磁盘空间 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 检查磁盘空间 ║ +echo ╚════════════════════════════════════╝ +echo. + +REM ========================================== +REM 显示磁盘空间 +REM ========================================== +echo [磁盘空间情况] +echo. +wmic logicaldisk get name,freespace,size /format:table +echo. + +REM ========================================== +REM 检查 Python 位置 +REM ========================================== +echo [Python 安装位置] +echo. +python -c "import sys; print('Python 路径:', sys.executable)" +python -c "import sys; print('site-packages:', sys.path[-1])" +echo. + +REM ========================================== +REM 检查 pip 缓存 +REM ========================================== +echo [pip 缓存信息] +echo. +pip cache info +echo. + +REM ========================================== +REM 建议 +REM ========================================== +echo ════════════════════════════════════ +echo. +echo [解决方案] +echo. +echo 如果 D 盘空间不足,可以: +echo. +echo 1. 清理 D 盘空间(推荐) +echo - 清理临时文件 +echo - 清理下载文件 +echo - 清理回收站 +echo - 卸载不需要的软件 +echo. +echo 2. 清理 pip 缓存 +echo pip cache purge +echo. +echo 3. 使用虚拟环境(在项目目录,可以选择其他盘) +echo 运行: 创建虚拟环境.bat +echo. +echo 4. 安装时不使用缓存 +echo pip install -r lover/requirements.txt --no-cache-dir +echo. +echo 5. 重新安装 Python 到空间充足的盘 +echo. +pause diff --git a/测试PHP接口.py b/测试PHP接口.py new file mode 100644 index 0000000..6d67d61 --- /dev/null +++ b/测试PHP接口.py @@ -0,0 +1,19 @@ +import requests + +url = "http://192.168.1.141:30100/api/user/mobilelogin" +data = { + "mobile": "13800138000", + "captcha": "223344", + "password": "123456" +} + +print(f"测试接口: {url}") +print(f"请求数据: {data}") +print() + +try: + response = requests.post(url, data=data, timeout=10) + print(f"状态码: {response.status_code}") + print(f"响应: {response.text}") +except Exception as e: + print(f"错误: {e}") diff --git a/测试数据库连接.py b/测试数据库连接.py new file mode 100644 index 0000000..c04607a --- /dev/null +++ b/测试数据库连接.py @@ -0,0 +1,69 @@ +import pymysql +import sys + +# 数据库配置 +config = { + 'host': 'localhost', + 'port': 3306, + 'user': 'root', + 'password': 'rootx77', + 'charset': 'utf8mb4' +} + +print("=" * 50) +print("测试数据库连接") +print("=" * 50) + +try: + # 连接数据库 + conn = pymysql.connect(**config) + cursor = conn.cursor() + + print("✅ 数据库连接成功") + + # 查看所有数据库 + cursor.execute("SHOW DATABASES") + databases = cursor.fetchall() + print("\n📋 所有数据库:") + for db in databases: + print(f" - {db[0]}") + + # 检查 ai 数据库 + cursor.execute("USE ai") + print("\n✅ 切换到 ai 数据库成功") + + # 查看所有表 + cursor.execute("SHOW TABLES") + tables = cursor.fetchall() + print(f"\n📋 ai 数据库中的表 (共 {len(tables)} 张):") + for table in tables: + print(f" - {table[0]}") + + # 检查关键表是否存在 + key_tables = ['nf_user', 'nf_lovers', 'nf_chat_message', 'nf_chat_session'] + print("\n🔍 检查关键表:") + for table_name in key_tables: + cursor.execute(f"SHOW TABLES LIKE '{table_name}'") + result = cursor.fetchone() + if result: + print(f" ✅ {table_name} 存在") + # 查看表结构 + cursor.execute(f"DESCRIBE {table_name}") + columns = cursor.fetchall() + print(f" 字段数: {len(columns)}") + else: + print(f" ❌ {table_name} 不存在") + + cursor.close() + conn.close() + + print("\n" + "=" * 50) + print("✅ 测试完成!数据库配置正确") + print("=" * 50) + +except pymysql.err.OperationalError as e: + print(f"\n❌ 数据库连接失败: {e}") + sys.exit(1) +except Exception as e: + print(f"\n❌ 发生错误: {e}") + sys.exit(1) diff --git a/直接导入数据库.py b/直接导入数据库.py new file mode 100644 index 0000000..611db6b --- /dev/null +++ b/直接导入数据库.py @@ -0,0 +1,67 @@ +import pymysql +import sys + +config = { + 'host': 'localhost', + 'port': 3306, + 'user': 'root', + 'password': 'rootx77', + 'database': 'ai', + 'charset': 'utf8mb4' +} + +print("开始导入数据库...") + +try: + conn = pymysql.connect(**config) + cursor = conn.cursor() + + # 读取 SQL 文件 + with open('数据库.sql', 'r', encoding='utf8') as f: + sql_content = f.read() + + # 分割 SQL 语句 + statements = sql_content.split(';') + + total = len(statements) + success = 0 + + for i, statement in enumerate(statements): + statement = statement.strip() + if statement and not statement.startswith('--'): + try: + cursor.execute(statement) + success += 1 + if i % 10 == 0: + print(f"进度: {i}/{total}") + except Exception as e: + # 忽略某些错误(如表已存在) + if 'already exists' not in str(e): + pass + + conn.commit() + + # 检查导入结果 + cursor.execute("SHOW TABLES") + tables = cursor.fetchall() + + print(f"\n✅ 导入完成!") + print(f"成功执行: {success}/{total} 条语句") + print(f"数据库中共有 {len(tables)} 张表") + + # 检查关键表 + key_tables = ['nf_user', 'nf_lovers', 'nf_chat_message'] + print("\n检查关键表:") + for table_name in key_tables: + cursor.execute(f"SHOW TABLES LIKE '{table_name}'") + if cursor.fetchone(): + print(f" ✅ {table_name}") + else: + print(f" ❌ {table_name}") + + cursor.close() + conn.close() + +except Exception as e: + print(f"❌ 错误: {e}") + sys.exit(1) diff --git a/移动端APP启动指南.md b/移动端APP启动指南.md new file mode 100644 index 0000000..e69de29 diff --git a/移动端使用指南.md b/移动端使用指南.md new file mode 100644 index 0000000..453d5c2 --- /dev/null +++ b/移动端使用指南.md @@ -0,0 +1,410 @@ +# 📱 移动端使用指南 + +## ✅ 已完成的配置 + +### API 地址已更新 +- **PHP 后台**: http://192.168.1.141:30100 +- **Python API**: http://192.168.1.141:30101 + +配置文件:`xuniYou/utils/request.js` + +--- + +## 🎯 移动端项目说明 + +### 项目类型 +**uni-app** - 跨平台移动应用框架 + +### 支持平台 +- ✅ H5(浏览器) +- ✅ 微信小程序 +- ✅ Android APP +- ✅ iOS APP + +### 项目位置 +``` +xuniYou/ +``` + +--- + +## 🚀 启动方式 + +### 方式 1:使用 HBuilderX(推荐) + +**HBuilderX** 是 uni-app 官方 IDE,功能最完整。 + +#### 1. 下载 HBuilderX +https://www.dcloud.io/hbuilderx.html + +#### 2. 打开项目 +1. 启动 HBuilderX +2. 文件 → 打开目录 +3. 选择:`E:\Github\Ai_GirlFriend\xuniYou` + +#### 3. 安装依赖 +在 HBuilderX 终端中执行: +```bash +npm install +``` + +#### 4. 运行项目 + +**运行到 H5(浏览器):** +- 点击顶部菜单:运行 → 运行到浏览器 → Chrome + +**运行到微信小程序:** +1. 先安装微信开发者工具 +2. 点击:运行 → 运行到小程序模拟器 → 微信开发者工具 +3. 首次运行需要配置微信开发者工具路径 + +**运行到手机(真机调试):** +1. 手机开启开发者模式和 USB 调试 +2. 连接电脑 +3. 点击:运行 → 运行到手机或模拟器 + +--- + +### 方式 2:使用命令行 + +#### 1. 安装依赖 +```cmd +cd xuniYou +npm install +``` + +#### 2. 运行到不同平台 + +**H5(浏览器):** +```cmd +npm run dev:h5 +``` +访问:http://localhost:8080 + +**微信小程序:** +```cmd +npm run dev:mp-weixin +``` +然后在微信开发者工具中打开 `xuniYou/unpackage/dist/dev/mp-weixin` + +**Android APP:** +```cmd +npm run dev:app-android +``` + +**iOS APP:** +```cmd +npm run dev:app-ios +``` + +--- + +## 📋 功能说明 + +### 主要功能模块 + +1. **登录注册** + - 手机号验证码登录 + - 微信授权登录 + +2. **创建虚拟恋人** + - 选择性格 + - 设置外貌 + - 选择声音 + - AI 生成形象 + +3. **聊天对话** + - 文字聊天 + - 语音消息 + - 图片发送 + - 流式回复 + - 心声功能 + +4. **换装系统** + - 服装商城 + - 虚拟试衣 + - 形象保存 + +5. **视频功能** + - 跳舞视频生成 + - 唱歌视频生成 + +6. **社交功能** + - 好友系统 + - 动态朋友圈 + - 点赞评论 + +7. **个人中心** + - 用户信息 + - 金币充值 + - VIP 会员 + - 设置 + +--- + +## 🔧 配置说明 + +### 1. API 地址配置 + +文件:`xuniYou/utils/request.js` + +```javascript +// 本地开发 +export const baseURL = 'http://192.168.1.141:30100' // PHP 后台 +export const baseURLPy = 'http://192.168.1.141:30101' // Python API + +// 生产环境(部署后修改为实际域名) +// export const baseURL = 'https://api.yourdomain.com' +// export const baseURLPy = 'https://api.yourdomain.com' +``` + +### 2. 微信小程序配置 + +文件:`xuniYou/manifest.json` + +```json +{ + "mp-weixin": { + "appid": "wx87fdb468bb2d141a", // 修改为你的小程序 AppID + ... + } +} +``` + +### 3. 环信 IM 配置 + +文件:`xuniYou/EaseIM/config/index.js` + +配置环信 IM 的 AppKey 等信息。 + +--- + +## 🧪 测试步骤 + +### 1. 确保后端服务运行 + +``` +✓ PHP 后台:http://192.168.1.141:30100 +✓ Python API:http://192.168.1.141:30101 +``` + +### 2. 启动移动端 + +**使用 HBuilderX:** +1. 打开项目 +2. 运行到浏览器(H5) + +**使用命令行:** +```cmd +cd xuniYou +npm run dev:h5 +``` + +### 3. 测试功能 + +1. **注册/登录** + - 输入手机号 + - 获取验证码 + - 登录 + +2. **创建恋人** + - 选择性格 + - 设置外貌 + - 生成形象 + +3. **聊天测试** + - 发送文字消息 + - 查看 AI 回复 + +--- + +## 📱 各平台运行说明 + +### H5(浏览器) + +**优点:** +- 最快速的开发调试方式 +- 支持热重载 +- 可以使用浏览器开发者工具 + +**限制:** +- 某些原生功能不可用(如相机、录音等) +- 微信登录需要特殊处理 + +**运行:** +```cmd +npm run dev:h5 +``` + +--- + +### 微信小程序 + +**优点:** +- 完整的微信生态支持 +- 用户基数大 +- 支付方便 + +**准备工作:** +1. 注册微信小程序账号 +2. 获取 AppID +3. 下载微信开发者工具 + +**运行:** +1. HBuilderX:运行 → 运行到小程序模拟器 +2. 或命令行:`npm run dev:mp-weixin` +3. 在微信开发者工具中打开生成的目录 + +**配置:** +- 修改 `manifest.json` 中的 `appid` +- 配置服务器域名(需要备案的 HTTPS 域名) + +--- + +### Android APP + +**优点:** +- 完整的原生功能 +- 性能最好 +- 可以上架应用商店 + +**准备工作:** +1. 安装 Android Studio +2. 配置 Android SDK +3. 准备签名证书 + +**运行:** +1. HBuilderX:运行 → 运行到手机或模拟器 +2. 或使用云打包 + +--- + +### iOS APP + +**优点:** +- 完整的原生功能 +- 可以上架 App Store + +**准备工作:** +1. Mac 电脑 +2. Xcode +3. Apple 开发者账号 + +**运行:** +1. HBuilderX:运行 → 运行到手机或模拟器 +2. 或使用云打包 + +--- + +## 🐛 常见问题 + +### 1. 连接失败 + +**错误:** `Failed to connect to 192.168.1.141:30101` + +**解决:** +1. 确保后端服务正在运行 +2. 检查 IP 地址是否正确 +3. 检查防火墙设置 +4. 确保手机和电脑在同一局域网 + +### 2. 依赖安装失败 + +**错误:** `npm install` 失败 + +**解决:** +```cmd +# 清理缓存 +npm cache clean --force + +# 使用淘宝镜像 +npm config set registry https://registry.npmmirror.com + +# 重新安装 +npm install +``` + +### 3. 微信小程序不合法域名 + +**错误:** 不在以下 request 合法域名列表中 + +**解决:** +- 开发阶段:在微信开发者工具中勾选"不校验合法域名" +- 生产环境:在小程序后台配置服务器域名(需要 HTTPS) + +### 4. 环信 IM 连接失败 + +**错误:** `easemob-websdk` 相关错误 + +**解决:** +```cmd +cd xuniYou +npm install easemob-websdk +``` + +--- + +## 📦 打包发布 + +### H5 打包 + +```cmd +npm run build:h5 +``` + +生成目录:`xuniYou/unpackage/dist/build/h5` + +### 小程序打包 + +```cmd +npm run build:mp-weixin +``` + +然后在微信开发者工具中上传。 + +### APP 打包 + +使用 HBuilderX 的云打包功能: +1. 发行 → 原生 App-云打包 +2. 选择平台(Android/iOS) +3. 配置证书 +4. 提交打包 + +--- + +## 🔐 生产环境部署 + +### 1. 修改 API 地址 + +将 `request.js` 中的地址改为生产环境: + +```javascript +export const baseURL = 'https://api.yourdomain.com' +export const baseURLPy = 'https://api.yourdomain.com' +``` + +### 2. 配置 HTTPS + +- 购买 SSL 证书 +- 配置 Nginx 反向代理 +- 确保所有 API 都使用 HTTPS + +### 3. 配置域名白名单 + +- 微信小程序:在小程序后台配置服务器域名 +- APP:无需配置 + +--- + +## 📞 需要帮助? + +如果遇到问题: + +1. **查看控制台日志** - 浏览器 F12 或 HBuilderX 控制台 +2. **检查网络请求** - 查看 API 调用是否成功 +3. **确认后端服务** - 访问 http://192.168.1.141:30101/docs +4. **查看文档** - uni-app 官方文档:https://uniapp.dcloud.net.cn/ + +--- + +**祝你开发顺利!** 🎉 diff --git a/移动端登录说明.md b/移动端登录说明.md new file mode 100644 index 0000000..63b7357 --- /dev/null +++ b/移动端登录说明.md @@ -0,0 +1,276 @@ +# 📱 移动端登录说明 + +## 🎯 开发模式登录(当前已启用) + +### 登录方式:超级简单! + +项目当前处于**开发模式**,登录非常简单: + +1. **只需输入手机号** +2. **点击登录按钮** +3. **自动完成登录** + +**不需要:** +- ❌ 不需要真实的手机号 +- ❌ 不需要验证码 +- ❌ 不需要密码 + +--- + +## 🔧 开发模式说明 + +### 配置位置 +文件:`xuniYou/pages/login/index.vue` + +```javascript +data() { + return { + isDev: true, // 开发模式开关,当前为 true + ... + } +} +``` + +### 自动填充 +开发模式下,系统会自动填充: +- **密码**: `123456` +- **验证码**: `223344` + +### 页面提示 +登录页面会显示: +``` +🔧 开发模式:只需输入手机号即可登录 +``` + +--- + +## 📝 测试账号 + +### 方式 1:随意输入(推荐) + +**任意手机号都可以:** +``` +13800138000 +13900139000 +18888888888 +...任意11位数字 +``` + +**操作步骤:** +1. 打开移动端应用 +2. 输入任意11位手机号 +3. 点击"登录"按钮 +4. 自动完成登录 + +--- + +### 方式 2:使用数据库中的真实账号 + +如果想使用数据库中已有的账号,可以查询: + +```sql +-- 查看所有用户 +SELECT id, mobile, nickname FROM nf_user LIMIT 10; + +-- 查看特定用户 +SELECT * FROM nf_user WHERE id = 70; +``` + +--- + +## 🎨 登录流程 + +### 开发模式流程 + +``` +1. 输入手机号(任意11位数字) + ↓ +2. 点击登录 + ↓ +3. 系统自动填充: + - password: 123456 + - captcha: 223344 + ↓ +4. 调用登录 API + ↓ +5. 如果是新手机号:自动注册 + 如果是老用户:直接登录 + ↓ +6. 登录成功,进入应用 +``` + +--- + +## 🔐 生产模式(上线时) + +### 切换到生产模式 + +修改 `xuniYou/pages/login/index.vue`: + +```javascript +data() { + return { + isDev: false, // 改为 false + ... + } +} +``` + +### 生产模式登录流程 + +``` +1. 输入手机号 + ↓ +2. 点击"获取验证码" + ↓ +3. 输入收到的验证码 + ↓ +4. 输入密码(首次注册时设置) + ↓ +5. 点击登录 + ↓ +6. 验证通过后登录 +``` + +--- + +## 🧪 测试建议 + +### 测试场景 1:新用户注册 + +``` +手机号:13800138001 +操作:直接点击登录 +结果:自动注册并登录 +``` + +### 测试场景 2:老用户登录 + +``` +手机号:使用数据库中已有的手机号 +操作:直接点击登录 +结果:直接登录,保留原有数据 +``` + +### 测试场景 3:邀请码 + +``` +手机号:13800138002 +邀请码:输入任意邀请码(选填) +操作:点击登录 +结果:登录成功,获得邀请奖励 +``` + +--- + +## 📊 登录后的功能 + +登录成功后,你可以: + +1. **创建虚拟恋人** + - 选择性格 + - 设置外貌 + - 选择声音 + - AI 生成形象 + +2. **开始聊天** + - 文字对话 + - 语音消息 + - 图片发送 + +3. **换装系统** + - 浏览服装 + - 虚拟试衣 + - 购买服装 + +4. **视频功能** + - 生成跳舞视频 + - 生成唱歌视频 + +5. **社交功能** + - 添加好友 + - 发布动态 + - 点赞评论 + +--- + +## 🔍 常见问题 + +### Q1: 输入手机号后点登录没反应? + +**检查:** +1. 后端服务是否运行(`启动项目.bat`) +2. 查看浏览器控制台(F12)是否有错误 +3. 检查 API 地址是否正确(192.168.1.141) + +### Q2: 提示"网络请求失败"? + +**解决:** +1. 确认后端服务正在运行 +2. 访问 http://192.168.1.141:30101/health 测试连接 +3. 检查防火墙设置 + +### Q3: 登录成功但没有数据? + +**原因:** 新用户首次登录,需要创建虚拟恋人 + +**操作:** +1. 按照引导创建虚拟恋人 +2. 设置基本信息 +3. 生成形象后即可使用 + +### Q4: 想切换账号怎么办? + +**方法:** +1. 进入"我的"页面 +2. 点击"退出登录" +3. 重新输入新的手机号登录 + +--- + +## 💡 开发提示 + +### 快速测试多个账号 + +```javascript +// 测试账号列表 +const testAccounts = [ + '13800138001', // 测试用户1 + '13800138002', // 测试用户2 + '13800138003', // 测试用户3 +]; +``` + +### 跳过登录(开发调试) + +如果想直接进入应用,可以在本地存储中设置 token: + +```javascript +// 在浏览器控制台执行 +uni.setStorageSync('token', 'test-token-123'); +``` + +--- + +## 🎯 总结 + +### 当前配置(开发模式) + +✅ **开发模式已启用** (`isDev: true`) +✅ **只需输入手机号即可登录** +✅ **自动填充密码和验证码** +✅ **新手机号自动注册** + +### 推荐测试流程 + +1. 启动后端服务 +2. 启动移动端 +3. 输入任意手机号(如:13800138000) +4. 点击登录 +5. 开始使用应用 + +--- + +**现在就可以开始测试了!** 🚀 + +只需输入任意11位手机号,点击登录即可! diff --git a/终极修复依赖.bat b/终极修复依赖.bat new file mode 100644 index 0000000..01fcbf0 --- /dev/null +++ b/终极修复依赖.bat @@ -0,0 +1,91 @@ +@echo off +chcp 65001 >nul +title 终极修复 - 安装所有依赖 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 终极修复 - 安装所有依赖 ║ +echo ╚════════════════════════════════════╝ +echo. +echo 这个脚本会安装项目所需的所有依赖包 +echo 包括之前遗漏的 python-multipart 等 +echo. +pause + +cd /d "%~dp0" + +REM ========================================== +REM 清理缓存 +REM ========================================== +echo. +echo [1/3] 清理 pip 缓存... +pip cache purge +echo. + +REM ========================================== +REM 安装核心依赖 +REM ========================================== +echo [2/3] 安装核心依赖包... +echo. +echo 正在安装,请稍候... +echo. + +pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple ^ + fastapi>=0.110 ^ + uvicorn[standard]>=0.24 ^ + sqlalchemy>=2.0 ^ + pymysql>=1.1 ^ + pydantic>=2.6 ^ + pydantic-settings>=2.1 ^ + python-dotenv>=1.0 ^ + requests>=2.31 ^ + oss2>=2.18 ^ + dashscope>=1.20 ^ + pyyaml>=6.0 ^ + imageio-ffmpeg>=0.4 ^ + python-multipart + +if errorlevel 1 ( + echo. + echo [错误] 核心依赖安装失败 + pause + exit /b 1 +) + +echo. +echo [成功] 核心依赖安装完成 +echo. + +REM ========================================== +REM 验证安装 +REM ========================================== +echo [3/3] 验证安装... +echo. + +echo 检查关键包: +pip show fastapi uvicorn sqlalchemy pymysql oss2 dashscope python-multipart + +if errorlevel 1 ( + echo. + echo [警告] 某些包可能未正确安装 + echo. +) + +echo. +echo ════════════════════════════════════ +echo. +echo [完成] 所有依赖已安装! +echo. +echo 已安装的包列表: +pip list | findstr "fastapi uvicorn sqlalchemy pymysql oss2 dashscope multipart" +echo. +echo ════════════════════════════════════ +echo. +echo 下一步: +echo 1. 关闭所有服务窗口 +echo 2. 运行 启动项目.bat +echo 3. 访问 http://127.0.0.1:30101/docs +echo. +echo 如果还有错误,请截图发给我 +echo. +pause diff --git a/运行指南.md b/运行指南.md new file mode 100644 index 0000000..8946631 --- /dev/null +++ b/运行指南.md @@ -0,0 +1,508 @@ +# AI 虚拟恋人项目 - 运行指南 + +## 📋 目录 +- [系统要求](#系统要求) +- [快速启动](#快速启动) +- [详细安装步骤](#详细安装步骤) +- [配置说明](#配置说明) +- [常见问题](#常见问题) +- [开发调试](#开发调试) + +--- + +## 🖥️ 系统要求 + +### 必需环境 +- **操作系统**: Windows 10/11 +- **PHP**: 8.0+ (推荐 8.0.0) +- **Python**: 3.8+ (推荐 3.9+) +- **MySQL**: 5.7+ 或 8.0+ +- **Composer**: 最新版本 +- **浏览器**: Chrome/Edge (现代浏览器) + +### 可选工具 +- Git (版本控制) +- Postman (API 测试) + +--- + +## 🚀 快速启动 + +### 方式一:使用启动脚本(推荐) + +1. **修改启动脚本配置** + + 打开 `启动项目.bat`,修改 PHP 路径: + ```batch + set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe + ``` + 改为你的 PHP 安装路径 + +2. **双击运行** + ``` + 启动项目.bat + ``` + +3. **访问服务** + - PHP 后台: http://127.0.0.1:30100 + - Python API: http://127.0.0.1:30101 + - API 文档: http://127.0.0.1:30101/docs + +### 方式二:手动启动 + +#### 启动 PHP 后台 +```cmd +cd xunifriend_RaeeC\public +php -S 0.0.0.0:30100 router.php +``` + +#### 启动 Python 后端 +```cmd +cd 项目根目录 +python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload +``` + +--- + +## 📦 详细安装步骤 + +### 第一步:安装 PHP + +1. 下载 PHP 8.0+ + - 官网: https://windows.php.net/download/ + - 选择 Thread Safe 版本 + +2. 解压到目录(如 `D:\php-8.0.0`) + +3. 配置 php.ini + ```ini + ; 启用必需扩展 + extension=curl + extension=fileinfo + extension=gd + extension=mbstring + extension=mysqli + extension=openssl + extension=pdo_mysql + extension=zip + + ; 设置时区 + date.timezone = Asia/Shanghai + + ; 上传限制 + upload_max_filesize = 100M + post_max_size = 100M + ``` + +4. 添加到系统 PATH(可选) + +### 第二步:安装 Python + +1. 下载 Python 3.9+ + - 官网: https://www.python.org/downloads/ + +2. 安装时勾选 "Add Python to PATH" + +3. 验证安装 + ```cmd + python --version + pip --version + ``` + +### 第三步:安装 MySQL + +1. 下载 MySQL 8.0+ + - 官网: https://dev.mysql.com/downloads/mysql/ + +2. 安装并设置 root 密码 + +3. 创建数据库 + ```sql + CREATE DATABASE fastadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + CREATE USER 'fastadmin'@'localhost' IDENTIFIED BY 'your_password'; + GRANT ALL PRIVILEGES ON fastadmin.* TO 'fastadmin'@'localhost'; + FLUSH PRIVILEGES; + ``` + +### 第四步:安装项目依赖 + +#### PHP 依赖 +```cmd +cd xunifriend_RaeeC +composer install +``` + +如果 composer 很慢,切换国内镜像: +```cmd +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +``` + +#### Python 依赖 +```cmd +cd 项目根目录 +pip install -r lover/requirements.txt +``` + +如果 pip 很慢,使用国内镜像: +```cmd +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +### 第五步:配置环境变量 + +#### 1. 配置根目录 .env +```env +# 应用环境 +APP_ENV=development +DEBUG=True + +# 数据库配置(修改为你的数据库信息) +DATABASE_URL=mysql+pymysql://fastadmin:your_password@localhost:3306/fastadmin?charset=utf8mb4 + +# PHP 后台地址 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic + +# 阿里云 DashScope API(必需,用于 AI 功能) +DASHSCOPE_API_KEY=your_dashscope_api_key + +# OSS 配置(必需,用于文件存储) +ALIYUN_OSS_ACCESS_KEY_ID=your_access_key_id +ALIYUN_OSS_ACCESS_KEY_SECRET=your_access_key_secret +ALIYUN_OSS_BUCKET_NAME=your_bucket_name +ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com +ALIYUN_OSS_CDN_DOMAIN=https://your_bucket.oss-cn-hangzhou.aliyuncs.com +``` + +#### 2. 配置 lover/.env +```env +DATABASE_URL=mysql+pymysql://fastadmin:your_password@localhost:3306/fastadmin?charset=utf8mb4 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic +``` + +#### 3. 配置 xunifriend_RaeeC/.env +```env +app_debug = true +app_trace = false + +[database] +type = mysql +hostname = localhost +database = fastadmin +username = fastadmin +password = your_password +hostport = 3306 +charset = utf8mb4 +prefix = nf_ +debug = true +``` + +### 第六步:导入数据库 + +1. 找到数据库 SQL 文件(通常在项目根目录或 docs 文件夹) + +2. 导入数据库 + ```cmd + mysql -u fastadmin -p fastadmin < database.sql + ``` + +3. 或使用 phpMyAdmin / Navicat 等工具导入 + +### 第七步:设置文件权限 + +确保以下目录可写: +``` +xunifriend_RaeeC/runtime/ +xunifriend_RaeeC/public/uploads/ +public/tts/ +``` + +Windows 下通常不需要特殊设置。 + +--- + +## ⚙️ 配置说明 + +### 核心配置项 + +#### 数据库配置 +```env +DATABASE_URL=mysql+pymysql://用户名:密码@主机:端口/数据库名?charset=utf8mb4 +``` + +#### AI 服务配置 + +**阿里云 DashScope(必需)** +- 注册地址: https://dashscope.console.aliyun.com/ +- 获取 API Key 后填入 `DASHSCOPE_API_KEY` +- 用于:AI 对话、图像生成、语音合成、视频生成 + +**OSS 对象存储(必需)** +- 用于存储用户上传的图片、音频、视频 +- 需要在阿里云开通 OSS 服务 +- 配置项: + - `ALIYUN_OSS_ACCESS_KEY_ID` + - `ALIYUN_OSS_ACCESS_KEY_SECRET` + - `ALIYUN_OSS_BUCKET_NAME` + - `ALIYUN_OSS_ENDPOINT` + +#### 可选配置 + +**微信小程序** +```env +WECHAT_APP_ID=your_app_id +WECHAT_APP_SECRET=your_app_secret +``` + +**微信支付** +```env +WECHAT_PAY_MCHID=your_mchid +WECHAT_PAY_API_V3_KEY=your_api_v3_key +``` + +**环信 IM** +- 在 PHP 后台配置 + +--- + +## 🐛 常见问题 + +### 1. 端口被占用 + +**错误信息**: `Address already in use` + +**解决方法**: +```cmd +# 查看占用端口的进程 +netstat -ano | findstr :30100 +netstat -ano | findstr :30101 + +# 终止进程(PID 为上面查到的进程号) +taskkill /F /PID 进程号 +``` + +### 2. 数据库连接失败 + +**错误信息**: `OperationalError: (2003, "Can't connect to MySQL server")` + +**检查清单**: +- [ ] MySQL 服务是否启动 +- [ ] 数据库用户名密码是否正确 +- [ ] 数据库名称是否存在 +- [ ] 防火墙是否阻止连接 + +**解决方法**: +```cmd +# 检查 MySQL 服务 +net start MySQL80 + +# 测试连接 +mysql -u fastadmin -p +``` + +### 3. Python 依赖安装失败 + +**错误信息**: `ERROR: Could not find a version that satisfies the requirement` + +**解决方法**: +```cmd +# 升级 pip +python -m pip install --upgrade pip + +# 使用国内镜像 +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +### 4. PHP 扩展缺失 + +**错误信息**: `Call to undefined function mysqli_connect()` + +**解决方法**: +1. 打开 `php.ini` +2. 取消注释(删除前面的分号): + ```ini + extension=mysqli + extension=pdo_mysql + ``` +3. 重启 PHP 服务 + +### 5. Composer 安装慢 + +**解决方法**: +```cmd +# 切换阿里云镜像 +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ + +# 重新安装 +composer install +``` + +### 6. 跨域问题 + +如果前端访问 API 出现跨域错误,检查 `lover/main.py` 中的 CORS 配置: +```python +app.add_middleware( + CORSMiddleware, + allow_origins=[ + "http://localhost:5173", # 添加你的前端地址 + ], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +``` + +### 7. TTS 音频无法访问 + +**问题**: 生成的语音文件 404 + +**解决方法**: +1. 确保 `public/tts/` 目录存在且可写 +2. 检查 OSS 配置是否正确 +3. 查看 Python 日志确认文件是否上传成功 + +--- + +## 🔧 开发调试 + +### 查看日志 + +#### Python 日志 +```cmd +# 启动时会在控制台输出日志 +python -m uvicorn lover.main:app --host 0.0.0.0 --port 30101 --reload --log-level debug +``` + +#### PHP 日志 +``` +xunifriend_RaeeC/runtime/log/ +``` + +### API 测试 + +#### 使用 FastAPI 自动文档 +访问: http://127.0.0.1:30101/docs + +可以直接在浏览器中测试所有 API 接口 + +#### 使用 Postman + +1. 导入 API 集合(如果有) +2. 设置环境变量: + - `base_url`: http://127.0.0.1:30101 + - `token`: 从登录接口获取 + +### 调试模式 + +#### 开发环境配置 +```env +APP_ENV=development +DEBUG=True +``` + +开发模式下: +- 自动跳过部分认证检查 +- 显示详细错误信息 +- 支持热重载 + +#### 测试用户 +开发模式下可以使用测试用户 ID: +``` +X-User-Id: 70 +``` + +### 数据库管理 + +推荐工具: +- **Navicat** (商业软件) +- **DBeaver** (免费开源) +- **phpMyAdmin** (Web 界面) + +### 性能监控 + +#### 查看数据库连接池 +```python +# 在 lover/db.py 中添加日志 +import logging +logger = logging.getLogger("sqlalchemy.pool") +logger.setLevel(logging.DEBUG) +``` + +#### 查看 API 响应时间 +FastAPI 自动在响应头中包含处理时间 + +--- + +## 📞 技术支持 + +### 相关文档 +- FastAPI: https://fastapi.tiangolo.com/ +- ThinkPHP: https://www.thinkphp.cn/ +- 阿里云 DashScope: https://help.aliyun.com/zh/dashscope/ + +### 常用命令 + +```cmd +# 查看 Python 版本 +python --version + +# 查看 PHP 版本 +php -v + +# 查看已安装的 Python 包 +pip list + +# 查看 Composer 包 +composer show + +# 清理 Python 缓存 +find . -type d -name __pycache__ -exec rm -rf {} + + +# 清理 PHP 缓存 +cd xunifriend_RaeeC +php think clear +``` + +--- + +## 🎯 下一步 + +项目启动成功后,你可以: + +1. **访问管理后台** + - URL: http://127.0.0.1:30100/admin + - 默认账号密码查看数据库 `nf_admin` 表 + +2. **查看 API 文档** + - URL: http://127.0.0.1:30101/docs + - 测试各个接口功能 + +3. **配置微信小程序** + - 修改小程序 API 地址 + - 配置 AppID 和 AppSecret + +4. **测试核心功能** + - 用户注册登录 + - 创建虚拟恋人 + - AI 对话 + - 图像生成 + - 语音通话 + +--- + +## ⚠️ 生产环境部署 + +生产环境需要额外配置: + +1. **使用 Nginx 反向代理** +2. **配置 HTTPS 证书** +3. **使用 Supervisor 管理进程** +4. **配置 Redis 缓存** +5. **设置日志轮转** +6. **配置数据库主从复制** +7. **启用 CDN 加速** + +详细部署文档请参考 `部署指南.md`(如果有) + +--- + +**祝你使用愉快!** 🎉 diff --git a/配置PHP扩展.bat b/配置PHP扩展.bat new file mode 100644 index 0000000..88df89c --- /dev/null +++ b/配置PHP扩展.bat @@ -0,0 +1,81 @@ +@echo off +chcp 65001 >nul +title 配置 PHP 扩展 + +echo. +echo ╔════════════════════════════════════╗ +echo ║ 配置 PHP 扩展 ║ +echo ╚════════════════════════════════════╝ +echo. + +set PHP_DIR=D:\IDMDownload\php-8.5.3-nts-Win32-vs17-x64 + +echo [1/3] 检查 PHP 目录... +if not exist "%PHP_DIR%" ( + echo [错误] PHP 目录不存在: %PHP_DIR% + echo. + pause + exit /b 1 +) +echo [成功] PHP 目录存在 +echo. + +echo [2/3] 检查 php.ini 文件... +if not exist "%PHP_DIR%\php.ini" ( + echo [提示] php.ini 不存在,正在从 php.ini-development 复制... + if exist "%PHP_DIR%\php.ini-development" ( + copy "%PHP_DIR%\php.ini-development" "%PHP_DIR%\php.ini" + echo [成功] php.ini 已创建 + ) else ( + echo [错误] php.ini-development 也不存在 + pause + exit /b 1 + ) +) else ( + echo [成功] php.ini 已存在 +) +echo. + +echo [3/3] 配置扩展... +echo. +echo 请手动编辑 php.ini 文件,启用以下扩展: +echo. +echo 找到以下行并删除前面的分号 (;): +echo. +echo ;extension=curl 改为 extension=curl +echo ;extension=fileinfo 改为 extension=fileinfo +echo ;extension=gd 改为 extension=gd +echo ;extension=mbstring 改为 extension=mbstring +echo ;extension=mysqli 改为 extension=mysqli +echo ;extension=openssl 改为 extension=openssl +echo ;extension=pdo_mysql 改为 extension=pdo_mysql +echo ;extension=zip 改为 extension=zip +echo. +echo 按任意键打开 php.ini 文件进行编辑... +pause >nul + +notepad "%PHP_DIR%\php.ini" + +echo. +echo 编辑完成后,按任意键验证扩展... +pause >nul + +echo. +echo 正在验证已启用的扩展... +echo. +"%PHP_DIR%\php.exe" -m | findstr /C:"curl fileinfo gd mbstring mysqli openssl pdo_mysql zip" + +echo. +echo ════════════════════════════════════ +echo. +echo 如果上面显示了扩展名,说明配置成功! +echo. +echo 下一步: +echo 1. 关闭此窗口 +echo 2. 重新运行 安装依赖.bat +echo. +echo 或者使用忽略平台要求的方式安装: +echo cd xunifriend_RaeeC +echo composer install --ignore-platform-reqs +echo. +pause diff --git a/配置总结.md b/配置总结.md new file mode 100644 index 0000000..81e4917 --- /dev/null +++ b/配置总结.md @@ -0,0 +1,383 @@ +# 📋 项目配置总结 + +## ✅ 已完成的配置 + +### 1. 数据库配置 + +**数据库信息:** +``` +主机: localhost +端口: 3306 +数据库名: ai_friend +用户名: root +密码: rootx77 +字符集: utf8mb4 +表前缀: nf_ +``` + +**数据表状态:** ✅ 已导入(30+ 张表) + +包含的核心表: +- nf_user (用户) +- nf_lovers (虚拟恋人) +- nf_chat_session (聊天会话) +- nf_chat_message (聊天消息) +- nf_chat_fact (长期记忆) +- nf_outfit_items (服装) +- nf_voice_library (声音库) +- nf_song_library (歌曲库) +- nf_generation_tasks (AI任务) +- nf_friend_relations (好友关系) +- nf_dynamics (动态) +- ... 等 + +--- + +### 2. 环境变量配置 + +#### 根目录 `.env` ✅ +```env +# 应用环境 +APP_ENV=development +DEBUG=True + +# 数据库 +DATABASE_URL=mysql+pymysql://root:rootx77@localhost:3306/ai_friend?charset=utf8mb4 + +# PHP 后台地址 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic + +# 阿里云 DashScope API +DASHSCOPE_API_KEY=sk-2473385fd6d54a58a703ce6b92a62074 + +# 阿里云 OSS +ALIYUN_OSS_ACCESS_KEY_ID=LTAI5tBzjogJDx4JzRYoDyEM +ALIYUN_OSS_ACCESS_KEY_SECRET=43euicRkkzlLjGTYzFYkTupcW7N5w3 +ALIYUN_OSS_BUCKET_NAME=hello12312312 +ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com +``` + +#### `lover/.env` ✅ +```env +DATABASE_URL=mysql+pymysql://root:rootx77@localhost:3306/ai_friend?charset=utf8mb4 +USER_INFO_API=http://127.0.0.1:30100/api/user_basic/get_user_basic +``` + +#### `xunifriend_RaeeC/.env` ✅ +```env +app_debug = true + +[database] +type = mysql +hostname = localhost +database = ai_friend +username = root +password = rootx77 +hostport = 3306 +charset = utf8mb4 +prefix = nf_ +debug = true +``` + +--- + +### 3. 服务端口配置 + +| 服务 | 端口 | 访问地址 | +|------|------|----------| +| PHP 后台 | 30100 | http://127.0.0.1:30100 | +| Python API | 30101 | http://127.0.0.1:30101 | +| API 文档 | 30101 | http://127.0.0.1:30101/docs | +| 管理后台 | 30100 | http://127.0.0.1:30100/admin | + +--- + +## 🔧 待完成的配置 + +### 1. 安装 PHP ⏳ + +**推荐版本:** PHP 8.5.3 (VS17 x64 Non Thread Safe) + +**下载地址:** https://windows.php.net/download/ + +**安装步骤:** +1. 下载 Zip 包(33.32MB) +2. 解压到目录(如 `D:\php-8.5.3\`) +3. 复制 `php.ini-development` 为 `php.ini` +4. 编辑 `php.ini`,启用扩展: + ```ini + extension=curl + extension=fileinfo + extension=gd + extension=mbstring + extension=mysqli + extension=openssl + extension=pdo_mysql + extension=zip + + date.timezone = Asia/Shanghai + upload_max_filesize = 100M + post_max_size = 100M + ``` + +5. 修改 `启动项目.bat` 第 6 行: + ```batch + set PHP_PATH=D:\php-8.5.3\php.exe + ``` + +--- + +### 2. 安装 Python 依赖 ⏳ + +```cmd +pip install -r lover/requirements.txt +``` + +**如果速度慢,使用国内镜像:** +```cmd +pip install -r lover/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +**依赖包列表:** +- fastapi (Web框架) +- uvicorn (ASGI服务器) +- sqlalchemy (ORM) +- pymysql (MySQL驱动) +- pydantic (数据验证) +- requests (HTTP客户端) +- oss2 (阿里云OSS) +- dashscope (阿里云AI) +- pyyaml (YAML解析) +- imageio-ffmpeg (视频处理) + +--- + +### 3. 安装 PHP 依赖 ⏳ + +```cmd +cd xunifriend_RaeeC +composer install +``` + +**如果速度慢,使用国内镜像:** +```cmd +composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ +composer install +``` + +--- + +## 🎯 启动流程 + +### 完整启动步骤 + +1. **确保 MySQL 服务运行** + ```cmd + net start MySQL80 + ``` + +2. **验证数据库连接** + ```cmd + mysql -u root -prootx77 -e "USE ai_friend; SHOW TABLES;" + ``` + +3. **安装依赖**(如果还没安装) + ```cmd + # Python 依赖 + pip install -r lover/requirements.txt + + # PHP 依赖 + cd xunifriend_RaeeC + composer install + cd .. + ``` + +4. **修改启动脚本** + 编辑 `启动项目.bat`,设置正确的 PHP 路径 + +5. **启动项目** + ```cmd + 启动项目.bat + ``` + +6. **验证服务** + - PHP: http://127.0.0.1:30100 + - Python: http://127.0.0.1:30101/docs + - 健康检查: http://127.0.0.1:30101/health + +--- + +## 🔍 配置验证清单 + +### 数据库验证 +```cmd +mysql -u root -prootx77 -e "SELECT COUNT(*) FROM ai_friend.nf_user;" +``` +✅ 应该返回用户数量(不报错) + +### Python 环境验证 +```cmd +python --version +pip show fastapi uvicorn sqlalchemy pymysql +``` +✅ 应该显示版本信息 + +### PHP 环境验证 +```cmd +php -v +php -m | findstr mysqli +``` +✅ 应该显示 PHP 版本和 mysqli 扩展 + +### 端口验证 +```cmd +netstat -ano | findstr :30100 +netstat -ano | findstr :30101 +``` +✅ 应该无输出(端口未被占用) + +--- + +## 📊 AI 服务配置 + +### 阿里云 DashScope + +**API Key:** `sk-2473385fd6d54a58a703ce6b92a62074` + +**已配置的模型:** +- **对话模型:** qwen-plus +- **图像生成:** wan2.6-t2i (960*1280) +- **视频生成:** wan2.6-i2v-flash (720P, 5秒) +- **语音识别:** paraformer-realtime-v2 +- **语音合成:** cosyvoice-v2 (longxiaochun_v2) +- **视觉理解:** qwen3-vl-flash + +**控制台地址:** https://dashscope.console.aliyun.com/ + +--- + +### 阿里云 OSS + +**Bucket 信息:** +- **名称:** hello12312312 +- **区域:** 华东1(杭州) +- **Endpoint:** oss-cn-hangzhou.aliyuncs.com +- **CDN 域名:** hello12312312.oss-cn-hangzhou.aliyuncs.com + +**用途:** +- 用户上传的图片 +- AI 生成的图片 +- TTS 语音文件 +- 视频文件 + +**控制台地址:** https://oss.console.aliyun.com/ + +--- + +## 🛠️ 开发工具推荐 + +### 数据库管理 +- **Navicat** (商业) +- **DBeaver** (免费) +- **phpMyAdmin** (Web) + +### API 测试 +- **Postman** +- **FastAPI Docs** (内置,推荐) +- **Apifox** + +### 代码编辑 +- **VS Code** (推荐) +- **PyCharm** +- **PhpStorm** + +--- + +## 📝 开发模式说明 + +当前为开发模式,具有以下特性: + +### 1. 认证宽松 +- 可使用 `X-User-Id` Header 跳过 Token 验证 +- Token 验证失败时自动使用测试用户 + +### 2. 详细日志 +- 显示完整的错误堆栈 +- 输出 SQL 查询语句 +- 记录 API 调用详情 + +### 3. 热重载 +- Python 代码修改自动生效 +- 无需重启服务 + +### 4. 调试接口 +- `/debug/auth` - 查看认证信息 +- `/health` - 健康检查 + +--- + +## ⚠️ 生产环境注意事项 + +如果要部署到生产环境,需要修改: + +### 1. 环境变量 +```env +APP_ENV=production +DEBUG=False +``` + +### 2. 数据库 +- 使用独立的生产数据库 +- 配置主从复制 +- 定期备份 + +### 3. 安全配置 +- 修改默认密码 +- 启用 HTTPS +- 配置防火墙 +- 限制 CORS 来源 + +### 4. 性能优化 +- 启用 Redis 缓存 +- 配置 CDN +- 使用 Nginx 反向代理 +- 配置进程管理器(Supervisor) + +--- + +## 📞 技术支持 + +### 相关文档 +- `快速启动指南.md` - 快速上手 +- `运行指南.md` - 详细教程 +- `启动前检查清单.md` - 检查清单 + +### 在线资源 +- FastAPI 文档: https://fastapi.tiangolo.com/ +- ThinkPHP 文档: https://www.thinkphp.cn/ +- 阿里云 DashScope: https://help.aliyun.com/zh/dashscope/ + +--- + +## ✨ 配置完成后的下一步 + +1. **启动项目** + ```cmd + 启动项目.bat + ``` + +2. **访问 API 文档** + http://127.0.0.1:30101/docs + +3. **测试接口** + 在 API 文档中测试各个功能 + +4. **访问管理后台** + http://127.0.0.1:30100/admin + +5. **开始开发** + 根据需求修改代码和配置 + +--- + +**配置总结完成!祝开发顺利!** 🎉 diff --git a/重启服务.bat b/重启服务.bat new file mode 100644 index 0000000..e3a8b31 --- /dev/null +++ b/重启服务.bat @@ -0,0 +1,49 @@ +@echo off +chcp 65001 >nul +echo. +echo ======================================== +echo 🔄 重启所有服务 +echo ======================================== +echo. +echo 正在关闭所有 PHP 和 Python 进程... +echo. + +REM 关闭所有 PHP 进程 +taskkill /F /IM php.exe >nul 2>&1 +if %errorlevel% equ 0 ( + echo ✅ PHP 进程已关闭 +) else ( + echo ℹ️ 没有运行中的 PHP 进程 +) + +REM 关闭所有 Python 进程(只关闭 uvicorn) +taskkill /F /IM python.exe /FI "WINDOWTITLE eq *uvicorn*" >nul 2>&1 +if %errorlevel% equ 0 ( + echo ✅ Python 进程已关闭 +) else ( + echo ℹ️ 没有运行中的 Python 进程 +) + +echo. +echo 等待 3 秒... +timeout /t 3 /nobreak >nul + +echo. +echo ======================================== +echo 🚀 启动服务 +echo ======================================== +echo. + +REM 启动项目 +start "" "%~dp0启动项目.bat" + +echo. +echo ✅ 服务正在启动... +echo. +echo 请等待两个窗口打开: +echo 1️⃣ PHP 服务器窗口 +echo 2️⃣ Python 后端窗口 +echo. +echo 等待服务完全启动后(约 10-15 秒),再测试移动端登录。 +echo. +pause diff --git a/重新导入数据库.bat b/重新导入数据库.bat new file mode 100644 index 0000000..720c5dd --- /dev/null +++ b/重新导入数据库.bat @@ -0,0 +1,25 @@ +@echo off +chcp 65001 >nul +echo. +echo ======================================== +echo 🔄 重新导入数据库 +echo ======================================== +echo. + +echo 步骤 1: 删除 ai 数据库 +mysql -uroot -prootx77 -e "DROP DATABASE IF EXISTS ai;" + +echo 步骤 2: 创建 ai 数据库 +mysql -uroot -prootx77 -e "CREATE DATABASE ai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" + +echo 步骤 3: 导入数据 +mysql -uroot -prootx77 ai < 数据库.sql + +echo. +echo ✅ 导入完成! +echo. +echo 验证结果: +mysql -uroot -prootx77 -e "USE ai; SELECT COUNT(*) as table_count FROM information_schema.tables WHERE table_schema='ai';" + +echo. +pause diff --git a/项目启动总结.md b/项目启动总结.md new file mode 100644 index 0000000..afae04c --- /dev/null +++ b/项目启动总结.md @@ -0,0 +1,224 @@ +# 🎉 AI 虚拟恋人项目 - 启动总结 + +## ✅ 项目已完全配置完成 + +--- + +## 📊 项目结构 + +``` +E:\Github\Ai_GirlFriend\ +├── lover/ # Python FastAPI 后端(AI 核心服务) +├── xunifriend_RaeeC/ # PHP FastAdmin 后台(管理系统) +├── xuniYou/ # uni-app 移动端(前端应用) +├── 启动项目.bat # 一键启动后端服务 +└── 各种配置和文档... +``` + +--- + +## 🚀 快速启动 + +### 1. 启动后端服务 + +**双击运行:** +``` +启动项目.bat +``` + +**服务地址:** +- PHP 后台:http://192.168.1.141:30100 +- Python API:http://192.168.1.141:30101 +- API 文档:http://192.168.1.141:30101/docs + +--- + +### 2. 启动移动端 + +**使用 HBuilderX(推荐):** +1. 打开 HBuilderX +2. 文件 → 打开目录 → 选择 `xuniYou` 文件夹 +3. 运行 → 运行到浏览器 → Chrome + +**或使用命令行:** +```cmd +cd xuniYou +npm install +npm run dev:h5 +``` + +--- + +## 📋 已完成的配置 + +### ✅ 数据库配置 +- 数据库名:ai_friend +- 主机:localhost:3306 +- 用户:root +- 密码:rootx77 +- 数据表:已导入(30+ 张表) + +### ✅ Python 依赖 +所有必需的包已安装: +- fastapi, uvicorn, sqlalchemy, pymysql +- oss2, dashscope, pydantic +- python-multipart 等 + +### ✅ PHP 依赖 +Composer 依赖已安装(vendor 目录) + +### ✅ 移动端配置 +- API 地址已更新为:192.168.1.141 +- 配置文件:xuniYou/utils/request.js + +--- + +## 🎯 核心功能 + +### 后端 API +- ✅ 用户认证和管理 +- ✅ AI 对话(流式响应) +- ✅ 图像生成(Wan2.6) +- ✅ 视频生成(跳舞、唱歌) +- ✅ 语音合成(TTS) +- ✅ 服装换装 +- ✅ 社交功能(好友、动态) + +### 移动端 +- ✅ 登录注册 +- ✅ 创建虚拟恋人 +- ✅ 聊天对话 +- ✅ 换装系统 +- ✅ 视频功能 +- ✅ 社交互动 + +--- + +## 📚 重要文档 + +| 文档名称 | 用途 | +|---------|------| +| 快速启动指南.md | 快速上手指南 | +| 运行指南.md | 详细安装教程 | +| 移动端使用指南.md | 移动端完整说明 | +| 配置总结.md | 所有配置汇总 | +| 故障排查指南.md | 问题解决方案 | + +--- + +## 🔧 常用命令 + +### 启动服务 +```cmd +# 启动后端(PHP + Python) +启动项目.bat + +# 启动移动端 +cd xuniYou +npm run dev:h5 +``` + +### 停止服务 +- 关闭对应的命令行窗口即可 + +### 重启服务 +1. 关闭所有服务窗口 +2. 重新运行 `启动项目.bat` + +--- + +## 🌐 访问地址 + +### 开发环境 +- **PHP 后台**: http://192.168.1.141:30100 +- **Python API**: http://192.168.1.141:30101 +- **API 文档**: http://192.168.1.141:30101/docs +- **管理后台**: http://192.168.1.141:30100/admin +- **移动端 H5**: http://localhost:8080 + +### 测试页面 +- **数据库测试**: http://192.168.1.141:30100/test_db.php +- **健康检查**: http://192.168.1.141:30101/health + +--- + +## 💡 开发建议 + +### 1. 日常开发流程 +1. 启动后端服务(`启动项目.bat`) +2. 启动移动端(HBuilderX 或命令行) +3. 在浏览器中测试功能 +4. 修改代码后自动热重载 + +### 2. API 测试 +- 使用 API 文档页面:http://192.168.1.141:30101/docs +- 可以直接在浏览器中测试所有接口 + +### 3. 数据库管理 +- 使用 Navicat、DBeaver 等工具 +- 连接信息:localhost:3306, root/rootx77, ai_friend + +--- + +## ⚠️ 注意事项 + +### 1. IP 地址 +- 当前配置的 IP:192.168.1.141 +- 如果 IP 变化,需要修改: + - `xuniYou/utils/request.js` + +### 2. 端口占用 +- PHP:30100 +- Python:30101 +- 移动端:8080(H5 模式) + +### 3. 防火墙 +- 确保防火墙允许这些端口 +- 或者临时关闭防火墙测试 + +--- + +## 🐛 常见问题快速解决 + +### 问题 1:后端启动失败 +**解决:** 运行 `终极修复依赖.bat` + +### 问题 2:移动端连接失败 +**解决:** 检查 `xuniYou/utils/request.js` 中的 IP 地址 + +### 问题 3:数据库连接失败 +**解决:** 确保 MySQL 服务运行:`net start MySQL80` + +### 问题 4:端口被占用 +**解决:** +```cmd +netstat -ano | findstr :30100 +taskkill /F /PID 进程号 +``` + +--- + +## 📞 技术支持 + +### 相关文档 +- FastAPI: https://fastapi.tiangolo.com/ +- uni-app: https://uniapp.dcloud.net.cn/ +- ThinkPHP: https://www.thinkphp.cn/ + +### 项目文档 +- 查看项目根目录下的各个 .md 文件 +- 每个文档都有详细的说明和示例 + +--- + +## 🎊 恭喜! + +你的 AI 虚拟恋人项目已经完全配置完成并可以正常运行了! + +**现在你可以:** +1. ✅ 启动后端服务 +2. ✅ 启动移动端应用 +3. ✅ 测试所有功能 +4. ✅ 开始开发和定制 + +**祝你开发顺利!** 🚀 diff --git a/验证.py b/验证.py new file mode 100644 index 0000000..3a5e7dc --- /dev/null +++ b/验证.py @@ -0,0 +1,15 @@ +import pymysql + +conn = pymysql.connect(host='localhost', port=3306, user='root', password='rootx77', database='ai_friend', charset='utf8mb4') +cursor = conn.cursor() + +cursor.execute("SHOW TABLES") +tables = cursor.fetchall() +print(f"共 {len(tables)} 张表") + +for t in ['nf_user', 'nf_lovers', 'nf_chat_message']: + cursor.execute(f"SHOW TABLES LIKE '{t}'") + print(f"{'✅' if cursor.fetchone() else '❌'} {t}") + +cursor.close() +conn.close()