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 393a8c5..0000000
Binary files a/public/storage/head_pic/20191217/9406cc4b8f3e8271a28ac9db953937f5.jpg and /dev/null differ
diff --git a/route/app.php b/route/app.php
deleted file mode 100644
index 2a4fd01..0000000
--- a/route/app.php
+++ /dev/null
@@ -1,14 +0,0 @@
-
-// +----------------------------------------------------------------------
-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 "";
+ return "";
}
/**
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