From 5a6363d3ecff1b0a488f915d1ffb68b355a5321b Mon Sep 17 00:00:00 2001 From: toogee Date: Wed, 20 May 2020 11:33:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=8F=92=E4=BB=B6=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=89=E8=A3=85=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 86 +++--- addons/README.md | 274 ------------------ app/admin/controller/.gitignore | 3 +- app/install/controller/Index.php | 2 + composer.json | 6 +- composer.lock | 116 ++++---- config/.gitignore | 2 - config/app.php | 8 +- config/captcha.php | 2 +- config/database.php | 2 + config/log.php | 32 -- config/view.php | 8 +- public/index.php | 4 +- .../9406cc4b8f3e8271a28ac9db953937f5.jpg | Bin 33341 -> 0 bytes route/app.php | 14 - vendor/autoload.php | 2 +- vendor/composer/autoload_real.php | 14 +- vendor/composer/autoload_static.php | 8 +- vendor/composer/installed.json | 136 ++++----- vendor/league/flysystem/composer.json | 6 + vendor/league/flysystem/src/Adapter/Ftp.php | 6 +- vendor/league/flysystem/src/Filesystem.php | 2 +- .../flysystem/src/FilesystemInterface.php | 2 +- vendor/league/flysystem/src/MountManager.php | 2 + vendor/league/flysystem/src/Util/MimeType.php | 4 + vendor/phpmailer/phpmailer/README.md | 6 +- vendor/phpmailer/phpmailer/VERSION | 2 +- .../phpmailer/language/phpmailer.lang-da.php | 32 +- vendor/phpmailer/phpmailer/src/PHPMailer.php | 128 +++++--- vendor/phpmailer/phpmailer/src/POP3.php | 4 +- vendor/phpmailer/phpmailer/src/SMTP.php | 3 +- vendor/psr/log/.gitignore | 1 - vendor/psr/log/Psr/Log/LoggerInterface.php | 38 +-- .../log/Psr/Log/Test/LoggerInterfaceTest.php | 8 - vendor/services.php | 2 +- vendor/symfony/polyfill-mbstring/Mbstring.php | 9 +- vendor/symfony/polyfill-mbstring/README.md | 2 +- .../symfony/polyfill-mbstring/bootstrap.php | 93 +++++- .../symfony/polyfill-mbstring/composer.json | 2 +- vendor/symfony/polyfill-php72/Php72.php | 5 +- vendor/symfony/polyfill-php72/README.md | 5 +- vendor/symfony/polyfill-php72/bootstrap.php | 65 +++-- vendor/symfony/polyfill-php72/composer.json | 2 +- vendor/symfony/var-dumper/.gitattributes | 3 - .../symfony/var-dumper/Caster/DateCaster.php | 6 +- vendor/symfony/var-dumper/Cloner/Data.php | 4 +- vendor/symfony/var-dumper/Cloner/Stub.php | 2 +- .../symfony/var-dumper/Cloner/VarCloner.php | 2 +- .../var-dumper/Resources/functions/dump.php | 2 +- .../symfony/var-dumper/Server/DumpServer.php | 2 +- vendor/topthink/think-captcha/composer.json | 3 +- .../think-captcha/src/CaptchaService.php | 8 +- vendor/topthink/think-captcha/src/helper.php | 6 +- .../topthink/think-helper/src/Collection.php | 20 +- .../topthink/think-multi-app/src/MultiApp.php | 16 +- .../topthink/think-multi-app/src/Service.php | 7 +- .../think-multi-app/src/command/Build.php | 2 +- vendor/topthink/think-orm/src/Model.php | 61 +++- vendor/topthink/think-orm/src/db/Builder.php | 5 +- .../topthink/think-orm/src/db/Connection.php | 12 +- .../think-orm/src/db/PDOConnection.php | 6 +- .../src/db/concern/ModelRelationQuery.php | 16 +- .../src/db/concern/ResultOperation.php | 11 +- .../topthink/think-orm/src/model/Relation.php | 2 +- .../src/model/concern/RelationShip.php | 2 +- .../src/model/concern/SoftDelete.php | 4 +- .../src/model/relation/BelongsToMany.php | 2 +- .../think-orm/src/model/relation/HasMany.php | 2 +- .../src/model/relation/HasManyThrough.php | 2 +- .../think-orm/src/model/relation/MorphTo.php | 1 - vendor/topthink/think-trace/src/Console.php | 4 +- vendor/topthink/think-trace/src/Html.php | 2 +- view/README.md | 1 + 74 files changed, 621 insertions(+), 744 deletions(-) delete mode 100644 addons/README.md delete mode 100644 config/.gitignore delete mode 100644 public/storage/head_pic/20191217/9406cc4b8f3e8271a28ac9db953937f5.jpg delete mode 100644 route/app.php delete mode 100644 vendor/psr/log/.gitignore delete mode 100644 vendor/symfony/var-dumper/.gitattributes create mode 100644 view/README.md diff --git a/.gitignore b/.gitignore index 8e098ed..d465120 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /.idea /.vscode +/vendor *.log .env \ No newline at end of file diff --git a/README.md b/README.md index 465029e..7661c30 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,52 @@ -# TaoLer +ThinkPHP 6.0 +=============== - 版本:TaoLer 1.2.3 - 日期:2020.5.1 - 官网:http://www.aieok.com - 测试:http://adm.aieok.com 账号test 密码test123 +> 运行环境要求PHP7.1+。 -#### 项目地址 +## 主要新特性 -1. gitee https://www.gitee.com/toogee/Taoler -2. github https://www.github.com/taoser/TaoLer +* 采用`PHP7`强类型(严格模式) +* 支持更多的`PSR`规范 +* 原生多应用支持 +* 更强大和易用的查询 +* 全新的事件系统 +* 模型事件和数据库事件统一纳入事件系统 +* 模板引擎分离出核心 +* 内部功能中间件化 +* SESSION/Cookie机制改进 +* 对Swoole以及协程支持改进 +* 对IDE更加友好 +* 统一和精简大量用法 -#### 介绍 +## 安装 -1. 采用动态密码加密,相同密码在入库时具有唯一性,即使管理员也无法破解,用户信息安全牢固。 -2. 系统采用最新版TinkPHP6框架开发,底层安全可靠,数据查询更快,运行效率更高,网站速度更快。 -3. 自适应前端,桌面和移动端访问界面友好简洁,模块清晰。 -4. 完善的后台系统,管理便捷,动态菜单和权限角色分配系统。支持3级菜单和无限极分类。 -5. 双升级系统,可支持自动和手动升级。可在线检测并升级系统,保持网站的更新和安全。 -6. 代码开源,不设暗门操作,更安全。 -7. 项目会长期维护,优化更新。 +~~~ +composer create-project topthink/think tp 6.0.* +~~~ +如果需要更新框架使用 +~~~ +composer update topthink/framework +~~~ -#### 软件架构 +## 文档 - thinkphp6+layui+fly - ThinkPHP6核心框架 - 快速、简单的面向对象的轻量级PHP开发框架,出色的性能和至简代码的,更注重易用性。代码维护方便。 - layui前端 - 极简、丰盈,简单高效,模块化UI框架,体积轻盈,组件丰盈。 - Fly模板: - 一款至简的社区模板,适合政府机构、教育机构、事业单位、商业企业、个人站长等众多行业领域。 +[完全开发手册](https://www.kancloud.cn/manual/thinkphp6_0/content) -#### 安装教程 +## 参与开发 -1. git下载:https://gitee.com/toogee/TaoLer -2. 官网下载:https://www.aieok.com -3. 解压后,项目绑定域名为public目录对外访问,首次安装,访问域名http://www.youdomain.com可自动跳转到/install/index进行引导安装,重新安装需删除根目录下install.lock。 -4. 安装前需要先创建mysql数据库(准备:数据库连接地址,数据库用户名,数据库密码,数据库端口,建好在数据库名) -5. 请牢记安装设置的管理员用户名和密码,默认admin/123456。前后台的管理员密码一致。前后端管理员账户是独立的,前端主要对文章内容的审查管理等操作。 +请参阅 [ThinkPHP 核心框架包](https://github.com/top-think/framework)。 -#### 使用说明 +## 版权信息 -1. 安装后本系统已配置默认演示数据,可以删除原数据或者进行数据的修改 -2. 后台可设置分类cate,一定要设置英文别名 -3. 首页有置顶模块,列表文章模块,右侧包含广告模块,回复展示模块 - -#### 文档 - -参考官网分享文章 - - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - -#### 版权信息 - -非商业可免费使用,没有功能限制,但不能更改版本信息,如需更改可购买授权。 +ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 本项目包含的第三方源码和二进制文件之版权信息另行标注。 -版权所有Copyright © 2020 by aieok.com (https://www.aieok.com) +版权所有Copyright © 2006-2020 by ThinkPHP (http://thinkphp.cn) All rights reserved。 + +ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 + +更多细节参阅 [LICENSE.txt](LICENSE.txt) diff --git a/addons/README.md b/addons/README.md deleted file mode 100644 index 457acb8..0000000 --- a/addons/README.md +++ /dev/null @@ -1,274 +0,0 @@ -# think-addons -The ThinkPHP 6 Addons Package - -## 安装 -> composer require zzstudio/think-addons - -## 配置 - -### 生成配置 - -系统安装后会自动在 config 目录中生成 addons.php 的配置文件, -如果系统未生成可在命令行执行 - -```php -php think addons:config -``` - -快速生成配置文件 - -### 公共配置 -```php -'addons' => [ - // 是否自动读取取插件钩子配置信息(默认是开启) - 'autoload' => true, - // 当关闭自动获取配置时需要手动配置hooks信息 - 'hooks' => [ - // 可以定义多个钩子 - 'testhook'=>'test' // 键为钩子名称,用于在业务中自定义钩子处理,值为实现该钩子的插件, - // 多个插件可以用数组也可以用逗号分割 - ], - 'route' => [], - 'service' => [], -]; -``` -或者在\config目录中新建`addons.php`,内容为: -```php - false, - // 当关闭自动获取配置时需要手动配置hooks信息 - 'hooks' => [ - // 可以定义多个钩子 - 'testhook'=>'test' // 键为钩子名称,用于在业务中自定义钩子处理,值为实现该钩子的插件, - // 多个插件可以用数组也可以用逗号分割 - ], - 'route' => [], - 'service' => [], -]; -``` - -## 创建插件 -> 创建的插件可以在view视图中使用,也可以在php业务中使用 - -安装完成后访问系统时会在项目根目录生成名为`addons`的目录,在该目录中创建需要的插件。 - -下面写一个例子: - -### 创建test插件 -> 在addons目录中创建test目录 - -### 创建钩子实现类 -> 在test目录中创建 Plugin.php 类文件。注意:类文件首字母需大写 - -```php - 'test', // 插件标识 - 'title' => '插件测试', // 插件名称 - 'description' => 'thinkph6插件测试', // 插件简介 - 'status' => 0, // 状态 - 'author' => 'byron sampson', - 'version' => '0.1' - ]; - - /** - * 插件安装方法 - * @return bool - */ - public function install() - { - return true; - } - - /** - * 插件卸载方法 - * @return bool - */ - public function uninstall() - { - return true; - } - - /** - * 实现的testhook钩子方法 - * @return mixed - */ - public function testhook($param) - { - // 调用钩子时候的参数信息 - print_r($param); - // 当前插件的配置信息,配置信息存在当前目录的config.php文件中,见下方 - print_r($this->getConfig()); - // 可以返回模板,模板文件默认读取的为插件目录中的文件。模板名不能为空! - return $this->fetch('info'); - } - -} -``` - -### 创建插件配置文件 -> 在test目录中创建config.php类文件,插件配置文件可以省略。 - -```php - [ - 'title' => '是否显示:', - 'type' => 'radio', - 'options' => [ - '1' => '显示', - '0' => '不显示' - ], - 'value' => '1' - ] -]; -``` - -### 创建钩子模板文件 -> 在test->view目录中创建info.html模板文件,钩子在使用fetch方法时对应的模板文件。 - -```html -

hello tpl

- -如果插件中需要有链接或提交数据的业务,可以在插件中创建controller业务文件, -要访问插件中的controller时使用addon_url生成url链接。 -如下: -link test -或 -link test -格式为: -test为插件名,Action为controller中的类名[多级控制器可以用.分割],link为controller中的方法 -``` - -### 创建插件的controller文件 -> 在test目录中创建controller目录,在controller目录中创建Index.php文件 -> controller类的用法与tp6中的controller一致 - -```php - 创建好插件后就可以在正常业务中使用该插件中的钩子了 -> 使用钩子的时候第二个参数可以省略 - -### 模板中使用钩子 - -```html -
{:hook('testhook', ['id'=>1])}
-``` - -### php业务中使用 -> 只要是thinkphp6正常流程中的任意位置均可以使用 - -```php -hook('testhook', ['id'=>1]) -``` - -### 插件公共方法 -```php -/** - * 处理插件钩子 - * @param string $event 钩子名称 - * @param array|null $params 传入参数 - * @param bool $once 是否只返回一个结果 - * @return mixed - */ -function hook($event, $params = null, bool $once = false); - -/** - * 读取插件的基础信息 - * @param string $name 插件名 - * @return array - */ -function get_addons_info($name); - -/** - * 获取插件Plugin的单例 - * @param string $name 插件名 - * @return mixed|null - */ -function get_addons_instance($name); - -/** - * 插件显示内容里生成访问插件的url - * @param $url 在插件控制器中可忽略插件名,在非插件中生成时需指定插件名。例:插件名://控制器/方法 - * @param array $param - * @param bool|string $suffix 生成的URL后缀 - * @param bool|string $domain 域名 - * @return bool|string - */ -function addons_url($url = '', $param = [], $suffix = true, $domain = false); - -``` - -## 插件目录结构 -### 最终生成的目录结构为 - -```html -www WEB部署目录(或者子目录) -├─addons 插件目录 -├─app 应用目录 -│ ├─controller 控制器目录 -│ ├─model 模型目录 -│ ├─ ... 更多类库目录 -│ │ -│ ├─common.php 公共函数文件 -│ └─event.php 事件定义文件 -│ -├─config 配置目录 -│ ├─app.php 应用配置 -│ ├─cache.php 缓存配置 -│ ├─console.php 控制台配置 -│ ├─cookie.php Cookie配置 -│ ├─database.php 数据库配置 -│ ├─filesystem.php 文件磁盘配置 -│ ├─lang.php 多语言配置 -│ ├─log.php 日志配置 -│ ├─middleware.php 中间件配置 -│ ├─route.php URL和路由配置 -│ ├─session.php Session配置 -│ ├─trace.php Trace配置 -│ └─view.php 视图配置 -│ -├─view 视图目录 -├─route 路由定义目录 -│ ├─route.php 路由定义文件 -│ └─ ... -│ -├─public WEB目录(对外访问目录) -│ ├─index.php 入口文件 -│ ├─router.php 快速测试文件 -│ └─.htaccess 用于apache的重写 -│ -├─extend 扩展类库目录 -├─runtime 应用的运行时目录(可写,可定制) -├─vendor Composer类库目录 -├─.example.env 环境变量示例文件 -├─composer.json composer 定义文件 -├─LICENSE.txt 授权说明文件 -├─README.md README 文件 -├─think 命令行入口文件 -``` diff --git a/app/admin/controller/.gitignore b/app/admin/controller/.gitignore index f167407..3680472 100644 --- a/app/admin/controller/.gitignore +++ b/app/admin/controller/.gitignore @@ -1,2 +1,3 @@ KeyAuth.php -Version.php \ No newline at end of file +Version.php +TimeLine.php \ No newline at end of file diff --git a/app/install/controller/Index.php b/app/install/controller/Index.php index b099a65..949b4d7 100644 --- a/app/install/controller/Index.php +++ b/app/install/controller/Index.php @@ -143,6 +143,8 @@ class Index extends BaseController $db_str = << 'mysql', // 自定义时间查询规则 'time_query_rule' => [], // 自动写入时间戳字段 diff --git a/composer.json b/composer.json index 4013e10..44caf90 100644 --- a/composer.json +++ b/composer.json @@ -23,11 +23,11 @@ "php": ">=7.1.0", "topthink/framework": "^6.0.0", "topthink/think-orm": "^2.0", - "phpmailer/phpmailer": "^6.1", - "taoser/think-auth": "^1.0", "topthink/think-multi-app": "^1.0", - "topthink/think-captcha": "^3.0", + "taoser/think-auth": "^1.0", "topthink/think-view": "^1.0", + "topthink/think-captcha": "^3.0", + "phpmailer/phpmailer": "^6.1", "zzstudio/think-addons": "^2.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 9b842d0..abaf9f1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6228bf65a800388ad9f6b06b8ac6ba72", + "content-hash": "670826f4ed6fc63b8b224456dd1826d9", "packages": [ { "name": "league/flysystem", - "version": "1.0.64", + "version": "1.0.69", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "d13c43dbd4b791f815215959105a008515d1a2e0" + "reference": "7106f78428a344bc4f643c233a94e48795f10967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d13c43dbd4b791f815215959105a008515d1a2e0", - "reference": "d13c43dbd4b791f815215959105a008515d1a2e0", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", + "reference": "7106f78428a344bc4f643c233a94e48795f10967", "shasum": "", "mirrors": [ { @@ -94,7 +94,7 @@ "sftp", "storage" ], - "time": "2020-02-05T18:14:17+00:00" + "time": "2020-05-18T15:13:39+00:00" }, { "name": "league/flysystem-cached-adapter", @@ -218,16 +218,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.1.4", + "version": "v6.1.5", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "c5e61d0729507049cec9673aa1a679f9adefd683" + "reference": "a8bf068f64a580302026e484ee29511f661b2ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/c5e61d0729507049cec9673aa1a679f9adefd683", - "reference": "c5e61d0729507049cec9673aa1a679f9adefd683", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a8bf068f64a580302026e484ee29511f661b2ad3", + "reference": "a8bf068f64a580302026e484ee29511f661b2ad3", "shasum": "", "mirrors": [ { @@ -282,7 +282,7 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2019-12-10T11:17:38+00:00" + "time": "2020-03-14T14:23:48+00:00" }, { "name": "psr/cache", @@ -393,16 +393,16 @@ }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "", "mirrors": [ { @@ -442,7 +442,7 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { "name": "psr/simple-cache", @@ -623,16 +623,16 @@ }, { "name": "topthink/think-captcha", - "version": "v3.0.2", + "version": "v3.0.3", "source": { "type": "git", "url": "https://github.com/top-think/think-captcha.git", - "reference": "0b4305da19e118cefd934007875a8112f9352f01" + "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-captcha/zipball/0b4305da19e118cefd934007875a8112f9352f01", - "reference": "0b4305da19e118cefd934007875a8112f9352f01", + "url": "https://api.github.com/repos/top-think/think-captcha/zipball/1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", + "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", "shasum": "", "mirrors": [ { @@ -674,20 +674,20 @@ } ], "description": "captcha package for thinkphp", - "time": "2019-10-03T07:45:11+00:00" + "time": "2020-05-19T10:55:45+00:00" }, { "name": "topthink/think-helper", - "version": "v3.1.3", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/top-think/think-helper.git", - "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4" + "reference": "c28d37743bda4a0455286ca85b17b5791d626e10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-helper/zipball/4d85dfd3778623bbb1de3648f1dcd0c82f4439f4", - "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4", + "url": "https://api.github.com/repos/top-think/think-helper/zipball/c28d37743bda4a0455286ca85b17b5791d626e10", + "reference": "c28d37743bda4a0455286ca85b17b5791d626e10", "shasum": "", "mirrors": [ { @@ -719,20 +719,20 @@ } ], "description": "The ThinkPHP6 Helper Package", - "time": "2019-09-30T02:36:48+00:00" + "time": "2019-11-08T08:01:10+00:00" }, { "name": "topthink/think-multi-app", - "version": "v1.0.11", + "version": "v1.0.12", "source": { "type": "git", "url": "https://github.com/top-think/think-multi-app.git", - "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9" + "reference": "3c1914d2adc08c8753c7f67228885ca47fb9b3bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/215f4a6bb88e53ad41b448c61957336eb55ce6f9", - "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9", + "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/3c1914d2adc08c8753c7f67228885ca47fb9b3bf", + "reference": "3c1914d2adc08c8753c7f67228885ca47fb9b3bf", "shasum": "", "mirrors": [ { @@ -769,20 +769,20 @@ } ], "description": "thinkphp6 multi app support", - "time": "2019-10-29T06:34:59+00:00" + "time": "2020-03-01T13:29:35+00:00" }, { "name": "topthink/think-orm", - "version": "v2.0.31", + "version": "v2.0.32", "source": { "type": "git", "url": "https://github.com/top-think/think-orm.git", - "reference": "d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4" + "reference": "03aaaa4d8c4475115b3acaa5aa2498bf5792e017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4", - "reference": "d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/03aaaa4d8c4475115b3acaa5aa2498bf5792e017", + "reference": "03aaaa4d8c4475115b3acaa5aa2498bf5792e017", "shasum": "", "mirrors": [ { @@ -820,7 +820,7 @@ "database", "orm" ], - "time": "2020-01-07T10:05:10+00:00" + "time": "2020-04-26T13:54:48+00:00" }, { "name": "topthink/think-template", @@ -970,16 +970,16 @@ "packages-dev": [ { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", "shasum": "", "mirrors": [ { @@ -997,7 +997,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } }, "autoload": { @@ -1031,20 +1031,20 @@ "portable", "shim" ], - "time": "2019-11-27T14:18:11+00:00" + "time": "2020-05-12T16:47:27+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "f048e612a3905f34931127360bdd2def19a5e582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", + "reference": "f048e612a3905f34931127360bdd2def19a5e582", "shasum": "", "mirrors": [ { @@ -1059,7 +1059,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } }, "autoload": { @@ -1092,20 +1092,20 @@ "portable", "shim" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-05-12T16:47:27+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.4", + "version": "v4.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6" + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c587e04ce5d1aa62d534a038f574d9a709e814cf", + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf", "shasum": "", "mirrors": [ { @@ -1174,20 +1174,20 @@ "debug", "dump" ], - "time": "2020-01-25T12:44:29+00:00" + "time": "2020-04-12T16:14:02+00:00" }, { "name": "topthink/think-trace", - "version": "v1.2", + "version": "v1.3", "source": { "type": "git", "url": "https://github.com/top-think/think-trace.git", - "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc" + "reference": "d8da2e39df268ab8775013de699f0c3012e51318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-trace/zipball/4589d06a07945d57478cc2236f4b23d51ff919cc", - "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc", + "url": "https://api.github.com/repos/top-think/think-trace/zipball/d8da2e39df268ab8775013de699f0c3012e51318", + "reference": "d8da2e39df268ab8775013de699f0c3012e51318", "shasum": "", "mirrors": [ { @@ -1227,7 +1227,7 @@ } ], "description": "thinkphp debug trace", - "time": "2019-10-17T02:14:09+00:00" + "time": "2020-03-18T07:59:53+00:00" } ], "aliases": [], diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 8617f70..0000000 --- a/config/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -database.php -app.php \ No newline at end of file diff --git a/config/app.php b/config/app.php index 27ebafd..1cfaf5c 100644 --- a/config/app.php +++ b/config/app.php @@ -20,9 +20,7 @@ return [ // 应用映射(自动多应用模式有效) 'app_map' => [], // 域名绑定(自动多应用模式有效) - 'domain_bind' => [ - //'www' => 'index' - ], + 'domain_bind' => [], // 禁止URL访问的应用列表(自动多应用模式有效) 'deny_app_list' => [], @@ -33,8 +31,4 @@ return [ 'error_message' => '页面错误!请稍后再试~', // 显示错误信息 'show_error_msg' => false, - //404 - 'http_exception_template' => [ - 404 => \think\facade\App::getAppPath() .'view/404.html' - ] ]; diff --git a/config/captcha.php b/config/captcha.php index 64537a1..5041a89 100644 --- a/config/captcha.php +++ b/config/captcha.php @@ -17,7 +17,7 @@ return [ // 是否使用背景图 'useImgBg' => false, //验证码字符大小 - 'fontSize' => 14, + 'fontSize' => 25, // 是否使用混淆曲线 'useCurve' => true, //是否添加杂点 diff --git a/config/database.php b/config/database.php index 3192ab9..e415fd6 100644 --- a/config/database.php +++ b/config/database.php @@ -1,5 +1,7 @@ 'mysql', // 自定义时间查询规则 'time_query_rule' => [], // 自动写入时间戳字段 diff --git a/config/log.php b/config/log.php index ef8af09..ea24ff9 100644 --- a/config/log.php +++ b/config/log.php @@ -40,38 +40,6 @@ return [ 'realtime_write' => false, ], // 其它日志通道配置 - 'login' => [ - // 日志记录方式 - 'type' => 'File', - // 日志保存目录 - 'path' => '../runtime/log/login/', - // 单文件日志写入 - 'single' => false, - // 最大日志文件数量 - 'max_files' => 0, - // 日志处理 - 'processor' => null, - // 日志输出格式化 - 'format' => '[%s][%s] %s', - // 是否实时写入 - 'realtime_write' => true, - ], - 'browse' => [ - // 日志记录方式 - 'type' => 'File', - // 日志保存目录 - 'path' => '../runtime/log/browse/', - // 单文件日志写入 - 'single' => false, - // 最大日志文件数量 - 'max_files' => 0, - // 日志处理 - 'processor' => null, - // 日志输出格式化 - 'format' => '[%s][%s] %s', - // 是否实时写入 - 'realtime_write' => true, - ], ], ]; diff --git a/config/view.php b/config/view.php index 190f4c0..f1bdd81 100644 --- a/config/view.php +++ b/config/view.php @@ -3,8 +3,12 @@ // | 模板设置 // +---------------------------------------------------------------------- use think\facade\Db; - -$template = Db::name('system')->where('id',1)->value('template'); + //如果网站安装从数据库查询选择的模板 + if(file_exists('../install.lock')){ + $template = Db::name('system')->where('id',1)->value('template'); + } else { + $template = ''; + } return [ // 模板引擎类型使用Think diff --git a/public/index.php b/public/index.php index e22ec15..e3c0fe9 100644 --- a/public/index.php +++ b/public/index.php @@ -12,8 +12,6 @@ // [ 应用入口文件 ] namespace think; -use think\facade\Request; - require __DIR__ . '/../vendor/autoload.php'; // 执行HTTP应用并响应 @@ -23,4 +21,4 @@ $response = $http->run(); $response->send(); -$http->end($response); \ No newline at end of file +$http->end($response); diff --git a/public/storage/head_pic/20191217/9406cc4b8f3e8271a28ac9db953937f5.jpg b/public/storage/head_pic/20191217/9406cc4b8f3e8271a28ac9db953937f5.jpg deleted file mode 100644 index 393a8c50a8777cf3597afa4748d6c2a3f1dd94ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33341 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 -// +---------------------------------------------------------------------- -use think\facade\Route; - -Route::get('captcha/[:config]','\\think\\captcha\\CaptchaController@index'); - diff --git a/vendor/autoload.php b/vendor/autoload.php index 452ad18..4e43471 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921::getLoader(); +return ComposerAutoloaderInit1b32198725235c8d6500c87262ef30c2::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index d9cdcd9..3dd3f27 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921 +class ComposerAutoloaderInit1b32198725235c8d6500c87262ef30c2 { private static $loader; @@ -19,15 +19,15 @@ class ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit1b32198725235c8d6500c87262ef30c2', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit1b32198725235c8d6500c87262ef30c2', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit9b80d9a7bd440d07cac42880e0942921::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit1b32198725235c8d6500c87262ef30c2::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { @@ -48,19 +48,19 @@ class ComposerAutoloaderInit9b80d9a7bd440d07cac42880e0942921 $loader->register(true); if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInit9b80d9a7bd440d07cac42880e0942921::$files; + $includeFiles = Composer\Autoload\ComposerStaticInit1b32198725235c8d6500c87262ef30c2::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { - composerRequire9b80d9a7bd440d07cac42880e0942921($fileIdentifier, $file); + composerRequire1b32198725235c8d6500c87262ef30c2($fileIdentifier, $file); } return $loader; } } -function composerRequire9b80d9a7bd440d07cac42880e0942921($fileIdentifier, $file) +function composerRequire1b32198725235c8d6500c87262ef30c2($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { require $file; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 9c5dcad..3cc00c9 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit9b80d9a7bd440d07cac42880e0942921 +class ComposerStaticInit1b32198725235c8d6500c87262ef30c2 { public static $files = array ( '9b552a3cc426e3287cc811caefa3cf53' => __DIR__ . '/..' . '/topthink/think-helper/src/helper.php', @@ -141,9 +141,9 @@ class ComposerStaticInit9b80d9a7bd440d07cac42880e0942921 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit9b80d9a7bd440d07cac42880e0942921::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit9b80d9a7bd440d07cac42880e0942921::$prefixDirsPsr4; - $loader->fallbackDirsPsr0 = ComposerStaticInit9b80d9a7bd440d07cac42880e0942921::$fallbackDirsPsr0; + $loader->prefixLengthsPsr4 = ComposerStaticInit1b32198725235c8d6500c87262ef30c2::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit1b32198725235c8d6500c87262ef30c2::$prefixDirsPsr4; + $loader->fallbackDirsPsr0 = ComposerStaticInit1b32198725235c8d6500c87262ef30c2::$fallbackDirsPsr0; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 0622ade..d4a5c39 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,17 +1,17 @@ [ { "name": "league/flysystem", - "version": "1.0.64", - "version_normalized": "1.0.64.0", + "version": "1.0.69", + "version_normalized": "1.0.69.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "d13c43dbd4b791f815215959105a008515d1a2e0" + "reference": "7106f78428a344bc4f643c233a94e48795f10967" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d13c43dbd4b791f815215959105a008515d1a2e0", - "reference": "d13c43dbd4b791f815215959105a008515d1a2e0", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7106f78428a344bc4f643c233a94e48795f10967", + "reference": "7106f78428a344bc4f643c233a94e48795f10967", "shasum": "", "mirrors": [ { @@ -47,7 +47,7 @@ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" }, - "time": "2020-02-05T18:14:17+00:00", + "time": "2020-05-18T15:13:39+00:00", "type": "library", "extra": { "branch-alias": { @@ -217,17 +217,17 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.1.4", - "version_normalized": "6.1.4.0", + "version": "v6.1.5", + "version_normalized": "6.1.5.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "c5e61d0729507049cec9673aa1a679f9adefd683" + "reference": "a8bf068f64a580302026e484ee29511f661b2ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/c5e61d0729507049cec9673aa1a679f9adefd683", - "reference": "c5e61d0729507049cec9673aa1a679f9adefd683", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a8bf068f64a580302026e484ee29511f661b2ad3", + "reference": "a8bf068f64a580302026e484ee29511f661b2ad3", "shasum": "", "mirrors": [ { @@ -254,7 +254,7 @@ "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" }, - "time": "2019-12-10T11:17:38+00:00", + "time": "2020-03-14T14:23:48+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -398,17 +398,17 @@ }, { "name": "psr/log", - "version": "1.1.2", - "version_normalized": "1.1.2.0", + "version": "1.1.3", + "version_normalized": "1.1.3.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "", "mirrors": [ { @@ -420,7 +420,7 @@ "require": { "php": ">=5.3.0" }, - "time": "2019-11-01T11:05:21+00:00", + "time": "2020-03-23T09:12:05+00:00", "type": "library", "extra": { "branch-alias": { @@ -509,17 +509,17 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fa79b11539418b02fc5e1897267673ba2c19419c", + "reference": "fa79b11539418b02fc5e1897267673ba2c19419c", "shasum": "", "mirrors": [ { @@ -534,11 +534,11 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2019-11-27T14:18:11+00:00", + "time": "2020-05-12T16:47:27+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } }, "installation-source": "dist", @@ -576,17 +576,17 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", + "version": "v1.17.0", + "version_normalized": "1.17.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + "reference": "f048e612a3905f34931127360bdd2def19a5e582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", - "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/f048e612a3905f34931127360bdd2def19a5e582", + "reference": "f048e612a3905f34931127360bdd2def19a5e582", "shasum": "", "mirrors": [ { @@ -598,11 +598,11 @@ "require": { "php": ">=5.3.3" }, - "time": "2019-11-27T13:56:44+00:00", + "time": "2020-05-12T16:47:27+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } }, "installation-source": "dist", @@ -639,17 +639,17 @@ }, { "name": "symfony/var-dumper", - "version": "v4.4.4", - "version_normalized": "4.4.4.0", + "version": "v4.4.8", + "version_normalized": "4.4.8.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6" + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6", - "reference": "46b53fd714568af343953c039ff47b67ce8af8d6", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c587e04ce5d1aa62d534a038f574d9a709e814cf", + "reference": "c587e04ce5d1aa62d534a038f574d9a709e814cf", "shasum": "", "mirrors": [ { @@ -678,7 +678,7 @@ "ext-intl": "To show region name in time zone dump", "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "time": "2020-01-25T12:44:29+00:00", + "time": "2020-04-12T16:14:02+00:00", "bin": [ "Resources/bin/var-dump-server" ], @@ -850,17 +850,17 @@ }, { "name": "topthink/think-captcha", - "version": "v3.0.2", - "version_normalized": "3.0.2.0", + "version": "v3.0.3", + "version_normalized": "3.0.3.0", "source": { "type": "git", "url": "https://github.com/top-think/think-captcha.git", - "reference": "0b4305da19e118cefd934007875a8112f9352f01" + "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-captcha/zipball/0b4305da19e118cefd934007875a8112f9352f01", - "reference": "0b4305da19e118cefd934007875a8112f9352f01", + "url": "https://api.github.com/repos/top-think/think-captcha/zipball/1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", + "reference": "1eef3717c1bcf4f5bbe2d1a1c704011d330a8b55", "shasum": "", "mirrors": [ { @@ -872,7 +872,7 @@ "require": { "topthink/framework": "^6.0.0" }, - "time": "2019-10-03T07:45:11+00:00", + "time": "2020-05-19T10:55:45+00:00", "type": "library", "extra": { "think": { @@ -907,17 +907,17 @@ }, { "name": "topthink/think-helper", - "version": "v3.1.3", - "version_normalized": "3.1.3.0", + "version": "v3.1.4", + "version_normalized": "3.1.4.0", "source": { "type": "git", "url": "https://github.com/top-think/think-helper.git", - "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4" + "reference": "c28d37743bda4a0455286ca85b17b5791d626e10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-helper/zipball/4d85dfd3778623bbb1de3648f1dcd0c82f4439f4", - "reference": "4d85dfd3778623bbb1de3648f1dcd0c82f4439f4", + "url": "https://api.github.com/repos/top-think/think-helper/zipball/c28d37743bda4a0455286ca85b17b5791d626e10", + "reference": "c28d37743bda4a0455286ca85b17b5791d626e10", "shasum": "", "mirrors": [ { @@ -929,7 +929,7 @@ "require": { "php": ">=7.1.0" }, - "time": "2019-09-30T02:36:48+00:00", + "time": "2019-11-08T08:01:10+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -954,17 +954,17 @@ }, { "name": "topthink/think-multi-app", - "version": "v1.0.11", - "version_normalized": "1.0.11.0", + "version": "v1.0.12", + "version_normalized": "1.0.12.0", "source": { "type": "git", "url": "https://github.com/top-think/think-multi-app.git", - "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9" + "reference": "3c1914d2adc08c8753c7f67228885ca47fb9b3bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/215f4a6bb88e53ad41b448c61957336eb55ce6f9", - "reference": "215f4a6bb88e53ad41b448c61957336eb55ce6f9", + "url": "https://api.github.com/repos/top-think/think-multi-app/zipball/3c1914d2adc08c8753c7f67228885ca47fb9b3bf", + "reference": "3c1914d2adc08c8753c7f67228885ca47fb9b3bf", "shasum": "", "mirrors": [ { @@ -977,7 +977,7 @@ "php": ">=7.1.0", "topthink/framework": "^6.0.0" }, - "time": "2019-10-29T06:34:59+00:00", + "time": "2020-03-01T13:29:35+00:00", "type": "library", "extra": { "think": { @@ -1006,17 +1006,17 @@ }, { "name": "topthink/think-orm", - "version": "v2.0.31", - "version_normalized": "2.0.31.0", + "version": "v2.0.32", + "version_normalized": "2.0.32.0", "source": { "type": "git", "url": "https://github.com/top-think/think-orm.git", - "reference": "d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4" + "reference": "03aaaa4d8c4475115b3acaa5aa2498bf5792e017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4", - "reference": "d6965dfae21f150e29cc899ab6f9b1bd2c0f2ee4", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/03aaaa4d8c4475115b3acaa5aa2498bf5792e017", + "reference": "03aaaa4d8c4475115b3acaa5aa2498bf5792e017", "shasum": "", "mirrors": [ { @@ -1032,7 +1032,7 @@ "psr/simple-cache": "^1.0", "topthink/think-helper": "^3.1" }, - "time": "2020-01-07T10:05:10+00:00", + "time": "2020-04-26T13:54:48+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1104,17 +1104,17 @@ }, { "name": "topthink/think-trace", - "version": "v1.2", - "version_normalized": "1.2.0.0", + "version": "v1.3", + "version_normalized": "1.3.0.0", "source": { "type": "git", "url": "https://github.com/top-think/think-trace.git", - "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc" + "reference": "d8da2e39df268ab8775013de699f0c3012e51318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-trace/zipball/4589d06a07945d57478cc2236f4b23d51ff919cc", - "reference": "4589d06a07945d57478cc2236f4b23d51ff919cc", + "url": "https://api.github.com/repos/top-think/think-trace/zipball/d8da2e39df268ab8775013de699f0c3012e51318", + "reference": "d8da2e39df268ab8775013de699f0c3012e51318", "shasum": "", "mirrors": [ { @@ -1127,7 +1127,7 @@ "php": ">=7.1.0", "topthink/framework": "^6.0.0" }, - "time": "2019-10-17T02:14:09+00:00", + "time": "2020-03-18T07:59:53+00:00", "type": "library", "extra": { "think": { diff --git a/vendor/league/flysystem/composer.json b/vendor/league/flysystem/composer.json index 72b0787..51169de 100644 --- a/vendor/league/flysystem/composer.json +++ b/vendor/league/flysystem/composer.json @@ -7,6 +7,12 @@ "abstraction", "s3", "ftp", "sftp", "remote", "webdav", "file systems", "cloud", "cloud files", "rackspace", "copy.com" ], + "funding": [ + { + "type": "other", + "url": "https://offset.earth/frankdejonge" + } + ], "license": "MIT", "authors": [ { diff --git a/vendor/league/flysystem/src/Adapter/Ftp.php b/vendor/league/flysystem/src/Adapter/Ftp.php index 7dfcc2b..dc89e43 100644 --- a/vendor/league/flysystem/src/Adapter/Ftp.php +++ b/vendor/league/flysystem/src/Adapter/Ftp.php @@ -131,9 +131,9 @@ class Ftp extends AbstractFtpAdapter public function connect() { if ($this->ssl) { - $this->connection = ftp_ssl_connect($this->getHost(), $this->getPort(), $this->getTimeout()); + $this->connection = @ftp_ssl_connect($this->getHost(), $this->getPort(), $this->getTimeout()); } else { - $this->connection = ftp_connect($this->getHost(), $this->getPort(), $this->getTimeout()); + $this->connection = @ftp_connect($this->getHost(), $this->getPort(), $this->getTimeout()); } if ( ! $this->connection) { @@ -230,7 +230,7 @@ class Ftp extends AbstractFtpAdapter public function disconnect() { if (is_resource($this->connection)) { - ftp_close($this->connection); + @ftp_close($this->connection); } $this->connection = null; diff --git a/vendor/league/flysystem/src/Filesystem.php b/vendor/league/flysystem/src/Filesystem.php index 4509526..0ce2484 100644 --- a/vendor/league/flysystem/src/Filesystem.php +++ b/vendor/league/flysystem/src/Filesystem.php @@ -301,7 +301,7 @@ class Filesystem implements FilesystemInterface return false; } - return $object['timestamp']; + return (int) $object['timestamp']; } /** diff --git a/vendor/league/flysystem/src/FilesystemInterface.php b/vendor/league/flysystem/src/FilesystemInterface.php index 09b811b..a6b99ba 100644 --- a/vendor/league/flysystem/src/FilesystemInterface.php +++ b/vendor/league/flysystem/src/FilesystemInterface.php @@ -87,7 +87,7 @@ interface FilesystemInterface * * @throws FileNotFoundException * - * @return string|false The timestamp or false on failure. + * @return int|false The timestamp or false on failure. */ public function getTimestamp($path); diff --git a/vendor/league/flysystem/src/MountManager.php b/vendor/league/flysystem/src/MountManager.php index 620f540..150aee3 100644 --- a/vendor/league/flysystem/src/MountManager.php +++ b/vendor/league/flysystem/src/MountManager.php @@ -20,6 +20,8 @@ use League\Flysystem\Plugin\PluginNotFoundException; * @method void assertPresent($path) * @method void assertAbsent($path) * @method Filesystem addPlugin(PluginInterface $plugin) + * + * @deprecated This functionality will be removed in 2.0 */ class MountManager implements FilesystemInterface { diff --git a/vendor/league/flysystem/src/Util/MimeType.php b/vendor/league/flysystem/src/Util/MimeType.php index 02f67ac..1f1949c 100644 --- a/vendor/league/flysystem/src/Util/MimeType.php +++ b/vendor/league/flysystem/src/Util/MimeType.php @@ -102,6 +102,8 @@ class MimeType 'txt' => 'text/plain', 'text' => 'text/plain', 'log' => 'text/plain', + 'markdown' => 'text/markdown', + 'md' => 'text/markdown', 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'xml' => 'application/xml', @@ -185,6 +187,8 @@ class MimeType 'odm' => 'application/vnd.oasis.opendocument.text-master', 'odb' => 'application/vnd.oasis.opendocument.database', 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'webp' => 'image/webp', + 'ico' => 'image/x-icon', ]; /** diff --git a/vendor/phpmailer/phpmailer/README.md b/vendor/phpmailer/phpmailer/README.md index d8a0f4e..c287e30 100644 --- a/vendor/phpmailer/phpmailer/README.md +++ b/vendor/phpmailer/phpmailer/README.md @@ -102,8 +102,8 @@ try { $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'user@example.com'; // SMTP username $mail->Password = 'secret'; // SMTP password - $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted - $mail->Port = 587; // TCP port to connect to + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged + $mail->Port = 587; // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above //Recipients $mail->setFrom('from@example.com', 'Mailer'); @@ -155,7 +155,7 @@ Note that in order to reduce PHPMailer's deployed code footprint, the examples a Complete generated API documentation is [available online](http://phpmailer.github.io/PHPMailer/). -You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/phpmailerTest.php) a good source of how to do various operations such as encryption. +You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good source of how to do various operations such as encryption. If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting). diff --git a/vendor/phpmailer/phpmailer/VERSION b/vendor/phpmailer/phpmailer/VERSION index 1879c1b..f8c5c2c 100644 --- a/vendor/phpmailer/phpmailer/VERSION +++ b/vendor/phpmailer/phpmailer/VERSION @@ -1 +1 @@ -6.1.4 \ No newline at end of file +6.1.5 \ No newline at end of file diff --git a/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php b/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php index e725f4b..5febb51 100644 --- a/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php +++ b/vendor/phpmailer/phpmailer/language/phpmailer.lang-da.php @@ -2,25 +2,27 @@ /** * Danish PHPMailer language file: refer to English translation for definitive list * @package PHPMailer - * @author Mikael Stokkebro + * @author John Sebastian + * Rewrite and extension of the work by Mikael Stokkebro + * */ -$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Kunne ikke logge på.'; -$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.'; -$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data kunne ikke accepteres.'; -//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Login mislykkedes.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Forbindelse til SMTP serveren kunne ikke oprettes.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret.'; +$PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold'; $PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; -$PHPMAILER_LANG['execute'] = 'Kunne ikke køre: '; -$PHPMAILER_LANG['file_access'] = 'Ingen adgang til fil: '; +$PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: '; +$PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgå filen: '; $PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; $PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; -$PHPMAILER_LANG['instantiate'] = 'Kunne ikke initialisere email funktionen.'; -//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.'; +$PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: '; $PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; -$PHPMAILER_LANG['provide_address'] = 'Du skal indtaste mindst en modtagers emailadresse.'; +$PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.'; $PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere er forkerte: '; -//$PHPMAILER_LANG['signing'] = 'Signing Error: '; -//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; -//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; -//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; -//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfejl: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: '; +$PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: '; +$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; diff --git a/vendor/phpmailer/phpmailer/src/PHPMailer.php b/vendor/phpmailer/phpmailer/src/PHPMailer.php index 127f2b7..fddad40 100644 --- a/vendor/phpmailer/phpmailer/src/PHPMailer.php +++ b/vendor/phpmailer/phpmailer/src/PHPMailer.php @@ -64,7 +64,7 @@ class PHPMailer * Options: null (default), 1 = High, 3 = Normal, 5 = low. * When null, the header is not set at all. * - * @var int + * @var int|null */ public $Priority; @@ -745,7 +745,7 @@ class PHPMailer * * @var string */ - const VERSION = '6.1.4'; + const VERSION = '6.1.5'; /** * Error severity: message only, continue processing. @@ -769,11 +769,22 @@ class PHPMailer const STOP_CRITICAL = 2; /** - * SMTP RFC standard line ending. + * The SMTP standard CRLF line break. + * If you want to change line break format, change static::$LE, not this. + */ + const CRLF = "\r\n"; + + /** + * "Folding White Space" a white space string used for line folding. + */ + const FWS = ' '; + + /** + * SMTP RFC standard line ending; Carriage Return, Line Feed. * * @var string */ - protected static $LE = "\r\n"; + protected static $LE = self::CRLF; /** * The maximum line length supported by mail(). @@ -1446,7 +1457,7 @@ class PHPMailer ) { //SMTP mandates RFC-compliant line endings //and it's also used with mail() on Windows - static::setLE("\r\n"); + static::setLE(self::CRLF); } else { //Maintain backward compatibility with legacy Linux command line mailers static::setLE(PHP_EOL); @@ -1553,7 +1564,7 @@ class PHPMailer $this->encodeHeader($this->secureHeader($this->Subject)), $this->MIMEBody ); - $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . static::$LE . + $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . static::normalizeBreaks($header_dkim) . static::$LE; } @@ -1620,7 +1631,7 @@ class PHPMailer */ protected function sendmailSend($header, $body) { - $header = rtrim($header, "\r\n ") . static::$LE . static::$LE; + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. if (!empty($this->Sender) && self::isShellSafe($this->Sender)) { @@ -1750,7 +1761,7 @@ class PHPMailer */ protected function mailSend($header, $body) { - $header = rtrim($header, "\r\n ") . static::$LE . static::$LE; + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $toArr = []; foreach ($this->to as $toaddr) { @@ -1839,7 +1850,7 @@ class PHPMailer */ protected function smtpSend($header, $body) { - $header = rtrim($header, "\r\n ") . static::$LE . static::$LE; + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; $bad_rcpt = []; if (!$this->smtpConnect($this->SMTPOptions)) { throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); @@ -2511,7 +2522,8 @@ class PHPMailer */ public function getSentMIMEMessage() { - return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . static::$LE . static::$LE . $this->MIMEBody; + return static::stripTrailingWSP($this->MIMEHeader . $this->mailHeader) . + static::$LE . static::$LE . $this->MIMEBody; } /** @@ -2594,7 +2606,7 @@ class PHPMailer $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } //Use this as a preamble in all multipart message types - $mimepre = 'This is a multi-part message in MIME format.' . static::$LE; + $mimepre = 'This is a multi-part message in MIME format.' . static::$LE . static::$LE; switch ($this->message_type) { case 'inline': $body .= $mimepre; @@ -2949,7 +2961,7 @@ class PHPMailer $disposition = 'attachment' ) { try { - if (!static::isPermittedPath($path) || !@is_file($path)) { + if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) { throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); } @@ -3134,7 +3146,7 @@ class PHPMailer protected function encodeFile($path, $encoding = self::ENCODING_BASE64) { try { - if (!static::isPermittedPath($path) || !file_exists($path)) { + if (!static::isPermittedPath($path) || !file_exists($path) || !is_readable($path)) { throw new Exception($this->lang('file_open') . $path, self::STOP_CONTINUE); } $file_buffer = file_get_contents($path); @@ -3146,7 +3158,10 @@ class PHPMailer return $file_buffer; } catch (Exception $exc) { $this->setError($exc->getMessage()); - + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } return ''; } } @@ -3516,7 +3531,7 @@ class PHPMailer $disposition = 'inline' ) { try { - if (!static::isPermittedPath($path) || !@is_file($path)) { + if (!static::isPermittedPath($path) || !@is_file($path) || !is_readable($path)) { throw new Exception($this->lang('file_access') . $path, self::STOP_CONTINUE); } @@ -3935,15 +3950,28 @@ class PHPMailer * * @param string $name Custom header name * @param string|null $value Header value + * + * @throws Exception */ public function addCustomHeader($name, $value = null) { - if (null === $value) { + if (null === $value && strpos($name, ':') !== false) { // Value passed in as name:value - $this->CustomHeader[] = explode(':', $name, 2); - } else { - $this->CustomHeader[] = [$name, $value]; + list($name, $value) = explode(':', $name, 2); } + $name = trim($name); + $value = trim($value); + //Ensure name is not empty, and that neither name nor value contain line breaks + if (empty($name) || strpbrk($name . $value, "\r\n") !== false) { + if ($this->exceptions) { + throw new Exception('Invalid header name or value'); + } + + return false; + } + $this->CustomHeader[] = [$name, $value]; + + return true; } /** @@ -3987,6 +4015,7 @@ class PHPMailer foreach ($images[2] as $imgindex => $url) { // Convert data URIs into embedded images //e.g. "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" + $match = []; if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) { if (count($match) === 4 && static::ENCODING_BASE64 === $match[2]) { $data = base64_decode($match[3]); @@ -4355,7 +4384,7 @@ class PHPMailer $breaktype = static::$LE; } // Normalise to \n - $text = str_replace(["\r\n", "\r"], "\n", $text); + $text = str_replace([self::CRLF, "\r"], "\n", $text); // Now convert LE as needed if ("\n" !== $breaktype) { $text = str_replace("\n", $breaktype, $text); @@ -4364,6 +4393,18 @@ class PHPMailer return $text; } + /** + * Remove trailing breaks from a string. + * + * @param string $text + * + * @return string The text to remove breaks from + */ + public static function stripTrailingWSP($text) + { + return rtrim($text, " \r\n\t"); + } + /** * Return the current line break format string. * @@ -4472,13 +4513,15 @@ class PHPMailer */ public function DKIM_HeaderC($signHeader) { + //Normalize breaks to CRLF (regardless of the mailer) + $signHeader = static::normalizeBreaks($signHeader, self::CRLF); + //Unfold header lines //Note PCRE \s is too broad a definition of whitespace; RFC5322 defines it as `[ \t]` //@see https://tools.ietf.org/html/rfc5322#section-2.2 //That means this may break if you do something daft like put vertical tabs in your headers. - //Unfold header lines $signHeader = preg_replace('/\r\n[ \t]+/', ' ', $signHeader); //Break headers out into an array - $lines = explode("\r\n", $signHeader); + $lines = explode(self::CRLF, $signHeader); foreach ($lines as $key => $line) { //If the header is missing a :, skip it as it's invalid //This is likely to happen because the explode() above will also split @@ -4498,7 +4541,7 @@ class PHPMailer $lines[$key] = trim($heading, " \t") . ':' . trim($value, " \t"); } - return implode("\r\n", $lines); + return implode(self::CRLF, $lines); } /** @@ -4515,13 +4558,13 @@ class PHPMailer public function DKIM_BodyC($body) { if (empty($body)) { - return "\r\n"; + return self::CRLF; } // Normalize line endings to CRLF - $body = static::normalizeBreaks($body, "\r\n"); + $body = static::normalizeBreaks($body, self::CRLF); //Reduce multiple trailing line breaks to a single one - return rtrim($body, "\r\n") . "\r\n"; + return static::stripTrailingWSP($body) . self::CRLF; } /** @@ -4542,17 +4585,18 @@ class PHPMailer $DKIMquery = 'dns/txt'; // Query method $DKIMtime = time(); //Always sign these headers without being asked + //Recommended list from https://tools.ietf.org/html/rfc6376#section-5.4.1 $autoSignHeaders = [ - 'From', - 'To', - 'CC', - 'Date', - 'Subject', - 'Reply-To', - 'Message-ID', - 'Content-Type', - 'Mime-Version', - 'X-Mailer', + 'from', + 'to', + 'cc', + 'date', + 'subject', + 'reply-to', + 'message-id', + 'content-type', + 'mime-version', + 'x-mailer', ]; if (stripos($headers_line, 'Subject') === false) { $headers_line .= 'Subject: ' . $subject . static::$LE; @@ -4587,7 +4631,7 @@ class PHPMailer $headersToSign = []; foreach ($parsedHeaders as $header) { //Is this header one that must be included in the DKIM signature? - if (in_array($header['label'], $autoSignHeaders, true)) { + if (in_array(strtolower($header['label']), $autoSignHeaders, true)) { $headersToSignKeys[] = $header['label']; $headersToSign[] = $header['label'] . ': ' . $header['value']; if ($this->DKIM_copyHeaderFields) { @@ -4625,9 +4669,9 @@ class PHPMailer //Fold long values if (strlen($copiedHeader) > self::STD_LINE_LENGTH - 3) { $copiedHeaderFields .= substr( - chunk_split($copiedHeader, self::STD_LINE_LENGTH - 3, static::$LE . ' '), + chunk_split($copiedHeader, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS), 0, - -strlen(static::$LE . ' ') + -strlen(static::$LE . self::FWS) ); } else { $copiedHeaderFields .= $copiedHeader; @@ -4639,7 +4683,6 @@ class PHPMailer $headerKeys = ' h=' . implode(':', $headersToSignKeys) . ';' . static::$LE; $headerValues = implode(static::$LE, $headersToSign); $body = $this->DKIM_BodyC($body); - $DKIMlen = strlen($body); // Length of body $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body $ident = ''; if ('' !== $this->DKIM_identity) { @@ -4653,7 +4696,6 @@ class PHPMailer ' s=' . $this->DKIM_selector . ';' . static::$LE . ' a=' . $DKIMsignatureType . ';' . ' q=' . $DKIMquery . ';' . - ' l=' . $DKIMlen . ';' . ' t=' . $DKIMtime . ';' . ' c=' . $DKIMcanonicalization . ';' . static::$LE . $headerKeys . @@ -4666,9 +4708,9 @@ class PHPMailer $headerValues . static::$LE . $dkimSignatureHeader ); $signature = $this->DKIM_Sign($canonicalizedHeaders); - $signature = trim(chunk_split($signature, self::STD_LINE_LENGTH - 3, static::$LE . ' ')); + $signature = trim(chunk_split($signature, self::STD_LINE_LENGTH - 3, static::$LE . self::FWS)); - return static::normalizeBreaks($dkimSignatureHeader . $signature) . static::$LE; + return static::normalizeBreaks($dkimSignatureHeader . $signature); } /** diff --git a/vendor/phpmailer/phpmailer/src/POP3.php b/vendor/phpmailer/phpmailer/src/POP3.php index 50d5f0c..cd6fc2f 100644 --- a/vendor/phpmailer/phpmailer/src/POP3.php +++ b/vendor/phpmailer/phpmailer/src/POP3.php @@ -45,7 +45,7 @@ class POP3 * * @var string */ - const VERSION = '6.1.4'; + const VERSION = '6.1.5'; /** * Default POP3 port number. @@ -230,6 +230,8 @@ class POP3 } // connect to the POP3 server + $errno = 0; + $errstr = ''; $this->pop_conn = fsockopen( $host, // POP3 Host $port, // Port # diff --git a/vendor/phpmailer/phpmailer/src/SMTP.php b/vendor/phpmailer/phpmailer/src/SMTP.php index c693f4d..1e38ba7 100644 --- a/vendor/phpmailer/phpmailer/src/SMTP.php +++ b/vendor/phpmailer/phpmailer/src/SMTP.php @@ -34,7 +34,7 @@ class SMTP * * @var string */ - const VERSION = '6.1.4'; + const VERSION = '6.1.5'; /** * SMTP line break constant. @@ -1344,6 +1344,7 @@ class SMTP } else { $this->last_smtp_transaction_id = false; foreach ($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) { + $matches = []; if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) { $this->last_smtp_transaction_id = trim($matches[1]); break; diff --git a/vendor/psr/log/.gitignore b/vendor/psr/log/.gitignore deleted file mode 100644 index 22d0d82..0000000 --- a/vendor/psr/log/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php index e695046..2206cfd 100644 --- a/vendor/psr/log/Psr/Log/LoggerInterface.php +++ b/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -22,8 +22,8 @@ interface LoggerInterface /** * System is unusable. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -35,8 +35,8 @@ interface LoggerInterface * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -47,8 +47,8 @@ interface LoggerInterface * * Example: Application component unavailable, unexpected exception. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -58,8 +58,8 @@ interface LoggerInterface * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -71,8 +71,8 @@ interface LoggerInterface * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -81,8 +81,8 @@ interface LoggerInterface /** * Normal but significant events. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -93,8 +93,8 @@ interface LoggerInterface * * Example: User logs in, SQL logs. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -103,8 +103,8 @@ interface LoggerInterface /** * Detailed debug information. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -113,9 +113,9 @@ interface LoggerInterface /** * Logs with an arbitrary level. * - * @param mixed $level - * @param string $message - * @param array $context + * @param mixed $level + * @param string $message + * @param mixed[] $context * * @return void * diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php index 9ecb6c4..e1e5354 100644 --- a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +++ b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php @@ -136,11 +136,3 @@ abstract class LoggerInterfaceTest extends TestCase $this->assertEquals($expected, $this->getLogs()); } } - -class DummyTest -{ - public function __toString() - { - return 'DummyTest'; - } -} diff --git a/vendor/services.php b/vendor/services.php index 5b99449..af0699c 100644 --- a/vendor/services.php +++ b/vendor/services.php @@ -1,5 +1,5 @@ 'think\\captcha\\CaptchaService', diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php index bf882ba..15503bc 100644 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -545,7 +545,14 @@ final class Mbstring } if ('UTF-8' === $encoding = self::getEncoding($encoding)) { - return preg_split("/(.{{$split_length}})/u", $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); } $result = array(); diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md index 342e828..4efb599 100644 --- a/vendor/symfony/polyfill-mbstring/README.md +++ b/vendor/symfony/polyfill-mbstring/README.md @@ -2,7 +2,7 @@ Symfony Polyfill / Mbstring =========================== This component provides a partial, native PHP implementation for the -[Mbstring](http://php.net/mbstring) extension. +[Mbstring](https://php.net/mbstring) extension. More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php index 204a41b..b36a092 100644 --- a/vendor/symfony/polyfill-mbstring/bootstrap.php +++ b/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -11,52 +11,131 @@ use Symfony\Polyfill\Mbstring as p; -if (!function_exists('mb_strlen')) { - define('MB_CASE_UPPER', 0); - define('MB_CASE_LOWER', 1); - define('MB_CASE_TITLE', 2); - +if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); } +} +if (!function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); } +} +if (!function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); } +} +if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); } +} +if (!function_exists('mb_convert_case')) { function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); } +} +if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); } +} +if (!function_exists('mb_language')) { function mb_language($lang = null) { return p\Mbstring::mb_language($lang); } +} +if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); } +} +if (!function_exists('mb_detect_order')) { function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); } +} +if (!function_exists('mb_parse_str')) { function mb_parse_str($s, &$result = array()) { parse_str($s, $result); } +} +if (!function_exists('mb_strlen')) { function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); } +} +if (!function_exists('mb_strpos')) { function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strtolower')) { function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); } +} +if (!function_exists('mb_strtoupper')) { function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); } +} +if (!function_exists('mb_substitute_character')) { function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); } +} +if (!function_exists('mb_substr')) { function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); } +} +if (!function_exists('mb_stripos')) { function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_stristr')) { function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strrchr')) { function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strrichr')) { function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_strripos')) { function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strrpos')) { function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); } +} +if (!function_exists('mb_strstr')) { function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); } +} +if (!function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); } +} +if (!function_exists('mb_strwidth')) { function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); } +} +if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); } +} +if (!function_exists('mb_output_handler')) { function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); } +} +if (!function_exists('mb_http_input')) { function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } +} +if (!function_exists('mb_convert_variables')) { function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } } -if (!function_exists('mb_chr')) { +if (!function_exists('mb_ord')) { function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); } +} +if (!function_exists('mb_chr')) { function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); } +} +if (!function_exists('mb_scrub')) { function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } } - if (!function_exists('mb_str_split')) { function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); } } + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json index c968074..d3dcc24 100644 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } } } diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php index d531e84..9b3edc7 100644 --- a/vendor/symfony/polyfill-php72/Php72.php +++ b/vendor/symfony/polyfill-php72/Php72.php @@ -95,7 +95,8 @@ final class Php72 return; } - return self::$hashMask ^ hexdec(substr($hash, 16 - \PHP_INT_SIZE, \PHP_INT_SIZE)); + // On 32-bit systems, PHP_INT_SIZE is 4, + return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); } public static function sapi_windows_vt100_support($stream, $enable = null) @@ -166,7 +167,7 @@ final class Php72 self::$hashMask = (int) substr(ob_get_clean(), 17); } - self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - \PHP_INT_SIZE, \PHP_INT_SIZE)); + self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); } public static function mb_chr($code, $encoding = null) diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md index 82c45f7..59dec8a 100644 --- a/vendor/symfony/polyfill-php72/README.md +++ b/vendor/symfony/polyfill-php72/README.md @@ -15,8 +15,9 @@ Moved to core since 7.2 (was in the optional XML extension earlier): - [`utf8_encode`](https://php.net/utf8_encode) - [`utf8_decode`](https://php.net/utf8_decode) -Also, it provides a constant added to PHP 7.2: -- [`PHP_OS_FAMILY`](http://php.net/manual/en/reserved.constants.php#constant.php-os-family) +Also, it provides constants added to PHP 7.2: +- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) +- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php index 519056d..a27a900 100644 --- a/vendor/symfony/polyfill-php72/bootstrap.php +++ b/vendor/symfony/polyfill-php72/bootstrap.php @@ -11,26 +11,47 @@ use Symfony\Polyfill\Php72 as p; -if (PHP_VERSION_ID < 70200) { - if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { - function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } - } - if (!function_exists('stream_isatty')) { - function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } - } - if (!function_exists('utf8_encode')) { - function utf8_encode($s) { return p\Php72::utf8_encode($s); } - function utf8_decode($s) { return p\Php72::utf8_decode($s); } - } - if (!function_exists('spl_object_id')) { - function spl_object_id($s) { return p\Php72::spl_object_id($s); } - } - if (!defined('PHP_OS_FAMILY')) { - define('PHP_OS_FAMILY', p\Php72::php_os_family()); - } - if (!function_exists('mb_chr')) { - function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } - function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } - function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } - } +if (PHP_VERSION_ID >= 70200) { + return; +} + +if (!defined('PHP_FLOAT_DIG')) { + define('PHP_FLOAT_DIG', 15); +} +if (!defined('PHP_FLOAT_EPSILON')) { + define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); +} +if (!defined('PHP_FLOAT_MIN')) { + define('PHP_FLOAT_MIN', 2.2250738585072E-308); +} +if (!defined('PHP_FLOAT_MAX')) { + define('PHP_FLOAT_MAX', 1.7976931348623157E+308); +} +if (!defined('PHP_OS_FAMILY')) { + define('PHP_OS_FAMILY', p\Php72::php_os_family()); +} + +if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { + function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } +} +if (!function_exists('stream_isatty')) { + function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } +} +if (!function_exists('utf8_encode')) { + function utf8_encode($s) { return p\Php72::utf8_encode($s); } +} +if (!function_exists('utf8_decode')) { + function utf8_decode($s) { return p\Php72::utf8_decode($s); } +} +if (!function_exists('spl_object_id')) { + function spl_object_id($s) { return p\Php72::spl_object_id($s); } +} +if (!function_exists('mb_ord')) { + function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } +} +if (!function_exists('mb_chr')) { + function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } } diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json index 0d37167..314d713 100644 --- a/vendor/symfony/polyfill-php72/composer.json +++ b/vendor/symfony/polyfill-php72/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.17-dev" } } } diff --git a/vendor/symfony/var-dumper/.gitattributes b/vendor/symfony/var-dumper/.gitattributes deleted file mode 100644 index ebb9287..0000000 --- a/vendor/symfony/var-dumper/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -/Tests export-ignore -/phpunit.xml.dist export-ignore -/.gitignore export-ignore diff --git a/vendor/symfony/var-dumper/Caster/DateCaster.php b/vendor/symfony/var-dumper/Caster/DateCaster.php index 2692517..6b264c7 100644 --- a/vendor/symfony/var-dumper/Caster/DateCaster.php +++ b/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -35,7 +35,11 @@ class DateCaster .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '') ; - $a = []; + unset( + $a[Caster::PREFIX_DYNAMIC.'date'], + $a[Caster::PREFIX_DYNAMIC.'timezone'], + $a[Caster::PREFIX_DYNAMIC.'timezone_type'] + ); $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title); $stub->class .= $d->format(' @U'); diff --git a/vendor/symfony/var-dumper/Cloner/Data.php b/vendor/symfony/var-dumper/Cloner/Data.php index 7e148bf..8461de9 100644 --- a/vendor/symfony/var-dumper/Cloner/Data.php +++ b/vendor/symfony/var-dumper/Cloner/Data.php @@ -122,7 +122,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate public function getIterator() { if (!\is_array($value = $this->getValue())) { - throw new \LogicException(sprintf('%s object holds non-iterable type "%s".', self::class, \gettype($value))); + throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, \gettype($value))); } yield from $value; @@ -396,7 +396,7 @@ class Data implements \ArrayAccess, \Countable, \IteratorAggregate break; default: - throw new \RuntimeException(sprintf('Unexpected Stub type: %s', $item->type)); + throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type)); } } elseif ('array' === $type) { $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false); diff --git a/vendor/symfony/var-dumper/Cloner/Stub.php b/vendor/symfony/var-dumper/Cloner/Stub.php index 7e9eb6d..7f6d05d 100644 --- a/vendor/symfony/var-dumper/Cloner/Stub.php +++ b/vendor/symfony/var-dumper/Cloner/Stub.php @@ -48,7 +48,7 @@ class Stub { $properties = []; - if (!isset(self::$defaultProperties[$c = \get_class($this)])) { + if (!isset(self::$defaultProperties[$c = static::class])) { self::$defaultProperties[$c] = get_class_vars($c); foreach ((new \ReflectionClass($c))->getStaticProperties() as $k => $v) { diff --git a/vendor/symfony/var-dumper/Cloner/VarCloner.php b/vendor/symfony/var-dumper/Cloner/VarCloner.php index f640338..75829d7 100644 --- a/vendor/symfony/var-dumper/Cloner/VarCloner.php +++ b/vendor/symfony/var-dumper/Cloner/VarCloner.php @@ -46,7 +46,7 @@ class VarCloner extends AbstractCloner // or null if the original value is used directly if (!$gid = self::$gid) { - $gid = self::$gid = uniqid(mt_rand(), true); // Unique string used to detect the special $GLOBALS variable + $gid = self::$gid = md5(random_bytes(6)); // Unique string used to detect the special $GLOBALS variable } $arrayStub = new Stub(); $arrayStub->type = Stub::TYPE_ARRAY; diff --git a/vendor/symfony/var-dumper/Resources/functions/dump.php b/vendor/symfony/var-dumper/Resources/functions/dump.php index e1543a8..a485d57 100644 --- a/vendor/symfony/var-dumper/Resources/functions/dump.php +++ b/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -38,6 +38,6 @@ if (!function_exists('dd')) { VarDumper::dump($v); } - die(1); + exit(1); } } diff --git a/vendor/symfony/var-dumper/Server/DumpServer.php b/vendor/symfony/var-dumper/Server/DumpServer.php index ad920bd..46546d1 100644 --- a/vendor/symfony/var-dumper/Server/DumpServer.php +++ b/vendor/symfony/var-dumper/Server/DumpServer.php @@ -41,7 +41,7 @@ class DumpServer public function start(): void { if (!$this->socket = stream_socket_server($this->host, $errno, $errstr)) { - throw new \RuntimeException(sprintf('Server start failed on "%s": %s %s.', $this->host, $errstr, $errno)); + throw new \RuntimeException(sprintf('Server start failed on "%s": '.$errstr.' '.$errno, $this->host)); } } diff --git a/vendor/topthink/think-captcha/composer.json b/vendor/topthink/think-captcha/composer.json index 5688305..e598819 100644 --- a/vendor/topthink/think-captcha/composer.json +++ b/vendor/topthink/think-captcha/composer.json @@ -28,6 +28,5 @@ "captcha": "src/config.php" } } - }, - "minimum-stability": "dev" + } } diff --git a/vendor/topthink/think-captcha/src/CaptchaService.php b/vendor/topthink/think-captcha/src/CaptchaService.php index 27f0ff0..1848858 100644 --- a/vendor/topthink/think-captcha/src/CaptchaService.php +++ b/vendor/topthink/think-captcha/src/CaptchaService.php @@ -8,14 +8,16 @@ use think\Validate; class CaptchaService extends Service { - public function boot(Route $route) + public function boot() { - $route->get('captcha/[:config]', "\\think\\captcha\\CaptchaController@index"); - Validate::maker(function ($validate) { $validate->extend('captcha', function ($value) { return captcha_check($value); }, ':attribute错误!'); }); + + $this->registerRoutes(function (Route $route) { + $route->get('captcha/[:config]', "\\think\\captcha\\CaptchaController@index"); + }); } } diff --git a/vendor/topthink/think-captcha/src/helper.php b/vendor/topthink/think-captcha/src/helper.php index 8dea4b2..7196606 100644 --- a/vendor/topthink/think-captcha/src/helper.php +++ b/vendor/topthink/think-captcha/src/helper.php @@ -35,11 +35,13 @@ function captcha_src($config = null): string * @param $id * @return string */ -function captcha_img($id = ''): string +function captcha_img($id = '', $domid = ''): string { $src = captcha_src($id); + + $domid = empty($domid) ? $domid : "id='" . $domid . "'"; - return "captcha"; + return "captcha"; } /** diff --git a/vendor/topthink/think-helper/src/Collection.php b/vendor/topthink/think-helper/src/Collection.php index f3d0a83..905f3f8 100644 --- a/vendor/topthink/think-helper/src/Collection.php +++ b/vendor/topthink/think-helper/src/Collection.php @@ -353,7 +353,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria return $this->filter(function ($data) use ($field, $operator, $value) { if (strpos($field, '.')) { - list($field, $relation) = explode('.', $field); + [$field, $relation] = explode('.', $field); $result = $data[$field][$relation] ?? null; } else { @@ -385,10 +385,10 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria case 'not in': return is_scalar($result) && !in_array($result, $value, true); case 'between': - list($min, $max) = is_string($value) ? explode(',', $value) : $value; + [$min, $max] = is_string($value) ? explode(',', $value) : $value; return is_scalar($result) && $result >= $min && $result <= $max; case 'not between': - list($min, $max) = is_string($value) ? explode(',', $value) : $value; + [$min, $max] = is_string($value) ? explode(',', $value) : $value; return is_scalar($result) && $result > $max || $result < $min; case '==': case '=': @@ -473,11 +473,11 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria /** * 返回数据中指定的一列 * @access public - * @param string $columnKey 键名 - * @param string $indexKey 作为索引值的列 + * @param string|null $columnKey 键名 + * @param string|null $indexKey 作为索引值的列 * @return array */ - public function column(string $columnKey, string $indexKey = null) + public function column(?string $columnKey, string $indexKey = null) { return array_column($this->items, $columnKey, $indexKey); } @@ -509,13 +509,13 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria * @param string $order 排序 * @return $this */ - public function order(string $field, string $order = null) + public function order(string $field, string $order = 'asc') { return $this->sort(function ($a, $b) use ($field, $order) { $fieldA = $a[$field] ?? null; $fieldB = $b[$field] ?? null; - return 'desc' == strtolower($order) ? strcmp($fieldB, $fieldA) : strcmp($fieldA, $fieldB); + return 'desc' == strtolower($order) ? $fieldB > $fieldA : $fieldA > $fieldB; }); } @@ -535,7 +535,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria } /** - * 获取最后一个单元数据 + * 获取最第一个单元数据 * * @access public * @param callable|null $callback @@ -548,7 +548,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria } /** - * 获取第一个单元数据 + * 获取最后一个单元数据 * * @access public * @param callable|null $callback diff --git a/vendor/topthink/think-multi-app/src/MultiApp.php b/vendor/topthink/think-multi-app/src/MultiApp.php index f069aeb..b0ac260 100644 --- a/vendor/topthink/think-multi-app/src/MultiApp.php +++ b/vendor/topthink/think-multi-app/src/MultiApp.php @@ -79,11 +79,7 @@ class MultiApp */ protected function getRoutePath(): string { - if (is_dir($this->app->getAppPath() . 'route')) { - return $this->app->getAppPath() . 'route' . DIRECTORY_SEPARATOR; - } - - return $this->app->getRootPath() . 'route' . DIRECTORY_SEPARATOR . $this->appName . DIRECTORY_SEPARATOR; + return $this->app->getAppPath() . 'route' . DIRECTORY_SEPARATOR; } /** @@ -203,7 +199,7 @@ class MultiApp $this->app->setNamespace($this->app->config->get('app.app_namespace') ?: 'app\\' . $appName); if (is_dir($appPath)) { - $this->app->setRuntimePath($this->app->getRootPath() . 'runtime' . DIRECTORY_SEPARATOR . $appName . DIRECTORY_SEPARATOR); + $this->app->setRuntimePath($this->app->getRuntimePath() . $appName . DIRECTORY_SEPARATOR); $this->app->http->setRoutePath($this->getRoutePath()); //加载应用 @@ -222,15 +218,9 @@ class MultiApp include_once $appPath . 'common.php'; } - $configPath = $this->app->getConfigPath(); - $files = []; - if (is_dir($appPath . 'config')) { - $files = array_merge($files, glob($appPath . 'config' . DIRECTORY_SEPARATOR . '*' . $this->app->getConfigExt())); - } elseif (is_dir($configPath . $appName)) { - $files = array_merge($files, glob($configPath . $appName . DIRECTORY_SEPARATOR . '*' . $this->app->getConfigExt())); - } + $files = array_merge($files, glob($appPath . 'config' . DIRECTORY_SEPARATOR . '*' . $this->app->getConfigExt())); foreach ($files as $file) { $this->app->config->load($file, pathinfo($file, PATHINFO_FILENAME)); diff --git a/vendor/topthink/think-multi-app/src/Service.php b/vendor/topthink/think-multi-app/src/Service.php index ad576c3..cdc90b4 100644 --- a/vendor/topthink/think-multi-app/src/Service.php +++ b/vendor/topthink/think-multi-app/src/Service.php @@ -14,12 +14,15 @@ use think\Service as BaseService; class Service extends BaseService { - public function register() + public function boot() { - $this->app->middleware->unshift(MultiApp::class); + $this->app->event->listen('HttpRun', function () { + $this->app->middleware->add(MultiApp::class); + }); $this->commands([ 'build' => command\Build::class, + 'clear' => command\Clear::class, ]); $this->app->bind([ diff --git a/vendor/topthink/think-multi-app/src/command/Build.php b/vendor/topthink/think-multi-app/src/command/Build.php index e192167..65b2f87 100644 --- a/vendor/topthink/think-multi-app/src/command/Build.php +++ b/vendor/topthink/think-multi-app/src/command/Build.php @@ -158,7 +158,7 @@ class Build extends Command file_put_contents($appPath . 'common.php', "getSuffix(); + foreach ($dataSet as $key => $data) { if ($this->exists || (!empty($auto) && isset($data[$pk]))) { - $result[$key] = self::update($data); + $result[$key] = static::update($data, [], [], $suffix); } else { - $result[$key] = self::create($data, $this->field, $this->replace); + $result[$key] = static::create($data, $this->field, $this->replace, $suffix); } } @@ -819,12 +842,13 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab /** * 写入数据 * @access public - * @param array $data 数据数组 - * @param array $allowField 允许字段 - * @param bool $replace 使用Replace + * @param array $data 数据数组 + * @param array $allowField 允许字段 + * @param bool $replace 使用Replace + * @param string $suffix 数据表后缀 * @return static */ - public static function create(array $data, array $allowField = [], bool $replace = false): Model + public static function create(array $data, array $allowField = [], bool $replace = false, string $suffix = ''): Model { $model = new static(); @@ -832,6 +856,10 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab $model->allowField($allowField); } + if (!empty($suffix)) { + $model->setSuffix($suffix); + } + $model->replace($replace)->save($data); return $model; @@ -840,12 +868,13 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab /** * 更新数据 * @access public - * @param array $data 数据数组 - * @param mixed $where 更新条件 - * @param array $allowField 允许字段 + * @param array $data 数据数组 + * @param mixed $where 更新条件 + * @param array $allowField 允许字段 + * @param string $suffix 数据表后缀 * @return static */ - public static function update(array $data, $where = [], array $allowField = []) + public static function update(array $data, $where = [], array $allowField = [], string $suffix = '') { $model = new static(); @@ -857,6 +886,10 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab $model->setUpdateWhere($where); } + if (!empty($suffix)) { + $model->setSuffix($suffix); + } + $model->exists(true)->save($data); return $model; @@ -1013,6 +1046,10 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab public function __call($method, $args) { + if (isset(static::$macro[static::class][$method])) { + return call_user_func_array(static::$macro[static::class][$method]->bindTo($this, static::class), $args); + } + if ('withattr' == strtolower($method)) { return call_user_func_array([$this, 'withAttribute'], $args); } @@ -1022,6 +1059,10 @@ abstract class Model implements JsonSerializable, ArrayAccess, Arrayable, Jsonab public static function __callStatic($method, $args) { + if (isset(static::$macro[static::class][$method])) { + return call_user_func_array(static::$macro[static::class][$method]->bindTo(null, static::class), $args); + } + $model = new static(); return call_user_func_array([$model->db(), $method], $args); diff --git a/vendor/topthink/think-orm/src/db/Builder.php b/vendor/topthink/think-orm/src/db/Builder.php index 1b01c98..67cf3b3 100644 --- a/vendor/topthink/think-orm/src/db/Builder.php +++ b/vendor/topthink/think-orm/src/db/Builder.php @@ -368,7 +368,10 @@ abstract class Builder if ($value instanceof Closure) { // 使用闭包查询 - $where[] = $this->parseClosureWhere($query, $value, $logic); + $whereClosureStr = $this->parseClosureWhere($query, $value, $logic); + if ($whereClosureStr) { + $where[] = $whereClosureStr; + } } elseif (is_array($field)) { $where[] = $this->parseMultiWhereField($query, $value, $field, $logic, $binds); } elseif ($field instanceof Raw) { diff --git a/vendor/topthink/think-orm/src/db/Connection.php b/vendor/topthink/think-orm/src/db/Connection.php index fb9f74b..c0ee745 100644 --- a/vendor/topthink/think-orm/src/db/Connection.php +++ b/vendor/topthink/think-orm/src/db/Connection.php @@ -214,11 +214,12 @@ abstract class Connection * 分析缓存Key * @access protected * @param BaseQuery $query 查询对象 + * @param string $method查询方法 * @return string */ - protected function getCacheKey(BaseQuery $query): string + protected function getCacheKey(BaseQuery $query, string $method = ''): string { - if (!empty($query->getOptions('key'))) { + if (!empty($query->getOptions('key')) && empty($method)) { $key = 'think:' . $this->getConfig('database') . '.' . $query->getTable() . '|' . $query->getOptions('key'); } else { $key = $query->getQueryGuid(); @@ -231,10 +232,11 @@ abstract class Connection * 分析缓存 * @access protected * @param BaseQuery $query 查询对象 - * @param array $cache 缓存信息 + * @param array $cache 缓存信息 + * @param string $method查询方法 * @return CacheItem */ - protected function parseCache(BaseQuery $query, array $cache): CacheItem + protected function parseCache(BaseQuery $query, array $cache, string $method = ''): CacheItem { [$key, $expire, $tag] = $cache; @@ -242,7 +244,7 @@ abstract class Connection $cacheItem = $key; } else { if (true === $key) { - $key = $this->getCacheKey($query); + $key = $this->getCacheKey($query, $method); } $cacheItem = new CacheItem($key); diff --git a/vendor/topthink/think-orm/src/db/PDOConnection.php b/vendor/topthink/think-orm/src/db/PDOConnection.php index 0d23b83..5f1fa7d 100644 --- a/vendor/topthink/think-orm/src/db/PDOConnection.php +++ b/vendor/topthink/think-orm/src/db/PDOConnection.php @@ -1033,7 +1033,7 @@ abstract class PDOConnection extends Connection implements ConnectionInterface $query->setOption('field', (array) $field); if (!empty($options['cache'])) { - $cacheItem = $this->parseCache($query, $options['cache']); + $cacheItem = $this->parseCache($query, $options['cache'], 'value'); $key = $cacheItem->getKey(); if ($this->cache->has($key)) { @@ -1118,7 +1118,7 @@ abstract class PDOConnection extends Connection implements ConnectionInterface if (!empty($options['cache'])) { // 判断查询缓存 - $cacheItem = $this->parseCache($query, $options['cache']); + $cacheItem = $this->parseCache($query, $options['cache'], 'column'); $name = $cacheItem->getKey(); if ($this->cache->has($name)) { @@ -1151,6 +1151,8 @@ abstract class PDOConnection extends Connection implements ConnectionInterface if (strpos($column, ',')) { $column = null; + } elseif (strpos($column, ' ')) { + $column = substr(strrchr(trim($column), ' '), 1); } elseif (strpos($column, '.')) { [$alias, $column] = explode('.', $column); } diff --git a/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php b/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php index 92e4417..ffb72de 100644 --- a/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php +++ b/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php @@ -140,13 +140,19 @@ trait ModelRelationQuery /** * 使用搜索器条件搜索字段 * @access public - * @param array $fields 搜索字段 - * @param array $data 搜索数据 - * @param string $prefix 字段前缀标识 + * @param string|array $fields 搜索字段 + * @param mixed $data 搜索数据 + * @param string $prefix 字段前缀标识 * @return $this */ - public function withSearch(array $fields, array $data = [], string $prefix = '') + public function withSearch($fields, $data = [], string $prefix = '') { + if (is_string($fields)) { + $fields = explode(',', $fields); + } + + $likeFields = $this->getConfig('match_like_fields') ?: []; + foreach ($fields as $key => $field) { if ($field instanceof Closure) { $field($this, $data[$key] ?? null, $data, $prefix); @@ -157,6 +163,8 @@ trait ModelRelationQuery if (method_exists($this->model, $method)) { $this->model->$method($this, $data[$field] ?? null, $data, $prefix); + } elseif (isset($data[$field])) { + $this->where($fieldName, in_array($fieldName, $likeFields) ? 'like' : '=', in_array($fieldName, $likeFields) ? '%' . $data[$field] . '%' : $data[$field]); } } } diff --git a/vendor/topthink/think-orm/src/db/concern/ResultOperation.php b/vendor/topthink/think-orm/src/db/concern/ResultOperation.php index f761d1e..d93c409 100644 --- a/vendor/topthink/think-orm/src/db/concern/ResultOperation.php +++ b/vendor/topthink/think-orm/src/db/concern/ResultOperation.php @@ -12,10 +12,14 @@ declare (strict_types = 1); namespace think\db\concern; +use Closure; use think\Collection; use think\db\exception\DataNotFoundException; +use think\db\exception\DbException; use think\db\exception\ModelNotFoundException; +use think\db\Query; use think\helper\Str; +use think\Model; /** * 查询数据处理 @@ -103,6 +107,7 @@ trait ResultOperation */ protected function filterResult(&$result): void { + $array = []; if (!empty($this->options['visible'])) { foreach ($this->options['visible'] as $key) { $array[] = $key; @@ -222,9 +227,6 @@ trait ResultOperation * @access public * @param array|string|Query|Closure $data 数据 * @return array|Model - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException */ public function selectOrFail($data = null) { @@ -236,9 +238,6 @@ trait ResultOperation * @access public * @param array|string|Query|Closure $data 数据 * @return array|Model - * @throws DbException - * @throws ModelNotFoundException - * @throws DataNotFoundException */ public function findOrFail($data = null) { diff --git a/vendor/topthink/think-orm/src/model/Relation.php b/vendor/topthink/think-orm/src/model/Relation.php index 12ab8a8..d9d02e3 100644 --- a/vendor/topthink/think-orm/src/model/Relation.php +++ b/vendor/topthink/think-orm/src/model/Relation.php @@ -228,7 +228,7 @@ abstract class Relation if (!empty($params)) { $type = $params[0]->getType(); - return Relation::class == $type || is_null($type) ? $this : $this->query; + return is_null($type) || Relation::class == $type->getName() ? $this : $this->query; } return $this; diff --git a/vendor/topthink/think-orm/src/model/concern/RelationShip.php b/vendor/topthink/think-orm/src/model/concern/RelationShip.php index 4839228..f3da1c4 100644 --- a/vendor/topthink/think-orm/src/model/concern/RelationShip.php +++ b/vendor/topthink/think-orm/src/model/concern/RelationShip.php @@ -720,7 +720,7 @@ trait RelationShip { $relation = Str::camel($attr); - if (method_exists($this, $relation) && !method_exists('think\Model', $relation)) { + if ((method_exists($this, $relation) && !method_exists('think\Model', $relation)) || isset(static::$macro[static::class][$relation])) { return $relation; } diff --git a/vendor/topthink/think-orm/src/model/concern/SoftDelete.php b/vendor/topthink/think-orm/src/model/concern/SoftDelete.php index 7357bc5..ce5d392 100644 --- a/vendor/topthink/think-orm/src/model/concern/SoftDelete.php +++ b/vendor/topthink/think-orm/src/model/concern/SoftDelete.php @@ -13,9 +13,11 @@ declare (strict_types = 1); namespace think\model\concern; use think\db\BaseQuery as Query; +use think\Model; /** * 数据软删除 + * @mixin Model */ trait SoftDelete { @@ -149,7 +151,7 @@ trait SoftDelete public static function destroy($data, bool $force = false): bool { // 包含软删除数据 - $query = (new static())->db(false); + $query = (new static())->withTrashedData(true)->db(false); if (is_array($data) && key($data) !== 0) { $query->where($data); diff --git a/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php b/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php index 69888c9..98d4aff 100644 --- a/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php +++ b/vendor/topthink/think-orm/src/model/relation/BelongsToMany.php @@ -222,7 +222,7 @@ class BelongsToMany extends Relation */ public function find($data = null) { - $result = $this->buildQuery()->find($data); + $result = $this->buildQuery()->findOrEmpty($data); if (!$result->isEmpty()) { $this->hydratePivot([$result]); diff --git a/vendor/topthink/think-orm/src/model/relation/HasMany.php b/vendor/topthink/think-orm/src/model/relation/HasMany.php index aa46a88..a67d41b 100644 --- a/vendor/topthink/think-orm/src/model/relation/HasMany.php +++ b/vendor/topthink/think-orm/src/model/relation/HasMany.php @@ -340,7 +340,7 @@ class HasMany extends Relation return $query->group($model . '.' . $this->localKey) ->field($fields) - ->join([$table => $relation], $model . '.' . $this->localKey . '=' . $relation . '.' . $this->foreignKey) + ->join([$table => $relation], $model . '.' . $this->localKey . '=' . $relation . '.' . $this->foreignKey, $joinType) ->when($softDelete, function ($query) use ($softDelete, $relation) { $query->where($relation . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); }) diff --git a/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php b/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php index 23367f3..30d5ca4 100644 --- a/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php +++ b/vendor/topthink/think-orm/src/model/relation/HasManyThrough.php @@ -154,7 +154,7 @@ class HasManyThrough extends Relation $query = $query ?: $this->parent->db()->alias($model); return $query->join($throughTable, $throughTable . '.' . $this->foreignKey . '=' . $model . '.' . $this->localKey) - ->join($modelTable, $modelTable . '.' . $throughKey . '=' . $throughTable . '.' . $this->throughPk) + ->join($modelTable, $modelTable . '.' . $throughKey . '=' . $throughTable . '.' . $this->throughPk, $joinType) ->when($softDelete, function ($query) use ($softDelete, $modelTable) { $query->where($modelTable . strstr($softDelete[0], '.'), '=' == $softDelete[1][0] ? $softDelete[1][1] : null); }) diff --git a/vendor/topthink/think-orm/src/model/relation/MorphTo.php b/vendor/topthink/think-orm/src/model/relation/MorphTo.php index c939c1d..986380e 100644 --- a/vendor/topthink/think-orm/src/model/relation/MorphTo.php +++ b/vendor/topthink/think-orm/src/model/relation/MorphTo.php @@ -223,7 +223,6 @@ class MorphTo extends Relation // 关联模型 if (!isset($data[$result->$morphKey])) { $relationModel = null; - throw new Exception('relation data not exists :' . $this->model); } else { $relationModel = $data[$result->$morphKey]; $relationModel->setParent(clone $result); diff --git a/vendor/topthink/think-trace/src/Console.php b/vendor/topthink/think-trace/src/Console.php index bfe583d..e96793c 100644 --- a/vendor/topthink/think-trace/src/Console.php +++ b/vendor/topthink/think-trace/src/Console.php @@ -47,7 +47,7 @@ class Console return false; } // 获取基本信息 - $runtime = number_format(microtime(true) - $app->getBeginTime(), 10); + $runtime = number_format(microtime(true) - $app->getBeginTime(), 10, '.', ''); $reqs = $runtime > 0 ? number_format(1 / $runtime, 2) : '∞'; $mem = number_format((memory_get_usage() - $app->getBeginMem()) / 1024, 2); @@ -59,7 +59,7 @@ class Console // 页面Trace信息 $base = [ - '请求信息' => date('Y-m-d H:i:s', $request->time()) . ' ' . $uri, + '请求信息' => date('Y-m-d H:i:s', $request->time() ?: time()) . ' ' . $uri, '运行时间' => number_format((float) $runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), '查询信息' => $app->db->getQueryTimes() . ' queries', '缓存信息' => $app->cache->getReadTimes() . ' reads,' . $app->cache->getWriteTimes() . ' writes', diff --git a/vendor/topthink/think-trace/src/Html.php b/vendor/topthink/think-trace/src/Html.php index 2c760af..f399ed9 100644 --- a/vendor/topthink/think-trace/src/Html.php +++ b/vendor/topthink/think-trace/src/Html.php @@ -63,7 +63,7 @@ class Html } $base = [ - '请求信息' => date('Y-m-d H:i:s', $request->time()) . ' ' . $uri, + '请求信息' => date('Y-m-d H:i:s', $request->time() ?: time()) . ' ' . $uri, '运行时间' => number_format((float) $runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), '查询信息' => $app->db->getQueryTimes() . ' queries', '缓存信息' => $app->cache->getReadTimes() . ' reads,' . $app->cache->getWriteTimes() . ' writes', diff --git a/view/README.md b/view/README.md new file mode 100644 index 0000000..360eb24 --- /dev/null +++ b/view/README.md @@ -0,0 +1 @@ +如果不使用模板,可以删除该目录 \ No newline at end of file