diff --git a/CHANGELOG.md b/CHANGELOG.md index 5717c3f3..fd732a2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,18 @@ 所有重要的更改都将在此文件中记录。 -## [20221210] - 常规更新 +## [20221222] - 常规更新 -- 增强面板安全性 -- 修复网站管理个别小Bug +- 优化计划任务日志格式 +- 网站管理支持分页 +- 文件管理的初步实现 +- 样式微调 +- 部分代码优化 +- 框架版本更新 + +## [20221212] - 常规更新 + +- 修复创建网站可能重复添加listen端口的Bug ## [20221210] - 安全更新 diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index f01f7bc5..13eab30f 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -25,7 +25,7 @@ class Kernel extends ConsoleKernel // 检查文件是否存在,及所有者是否为root if (!file_exists($file) || fileowner($file) != 0) { file_put_contents('/www/server/cron/logs/'.$cron->id.'.log', - '耗子Linux面板:检测到脚本文件异常,为确保安全已终止运行,如果你不知道发生了什么,这通常意味着服务器已被入侵。', + PHP_EOL.'耗子Linux面板:检测到脚本文件异常,为确保安全已终止运行,如果你不知道发生了什么,这通常意味着服务器已被入侵。'.PHP_EOL, FILE_APPEND); continue; } @@ -37,10 +37,10 @@ class Kernel extends ConsoleKernel $cron->save(); })->onSuccess(function () use ($cron) { file_put_contents('/www/server/cron/logs/'.$cron->id.'.log', - Carbon::now()->toDateTimeString().' 任务执行成功', FILE_APPEND); + PHP_EOL.Carbon::now()->toDateTimeString().' 任务执行成功'.PHP_EOL, FILE_APPEND); })->onFailure(function () use ($cron) { file_put_contents('/www/server/cron/logs/'.$cron->id.'.log', - Carbon::now()->toDateTimeString().' 任务执行失败', FILE_APPEND); + PHP_EOL.Carbon::now()->toDateTimeString().' 任务执行失败'.PHP_EOL, FILE_APPEND); }); } } diff --git a/app/Http/Controllers/Api/FilesController.php b/app/Http/Controllers/Api/FilesController.php index 2e583768..22b699da 100644 --- a/app/Http/Controllers/Api/FilesController.php +++ b/app/Http/Controllers/Api/FilesController.php @@ -11,21 +11,494 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\Validation\ValidationException; +use Symfony\Component\HttpFoundation\BinaryFileResponse; class FilesController extends Controller { /** - * 获取某个目录的文件列表 + * 获取某个目录下的文件(夹)列表 + * @param Request $request + * @return JsonResponse */ - public function getDirList(Request $request): JsonResponse + public function getList(Request $request): JsonResponse { - $limit = $request->input('limit', 10); + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'limit' => 'required|integer', + 'page' => 'required|integer', + ]); + $path = $credentials['path']; + $limit = $credentials['limit']; + $page = $credentials['page']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + if (!is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '目录不存在']); + } + $files = scandir($path); + $fileData = []; + foreach ($files as $k => $v) { + if ($v == '.' || $v == '..') { + continue; + } + $fileData[$k]['name'] = $v; + $fileData[$k]['path'] = $path.'/'.$v; + $fileData[$k]['type'] = filetype($path.'/'.$v); + $fileData[$k]['size'] = filesize($path.'/'.$v); + $fileData[$k]['mtime'] = Carbon::createFromTimestamp(filemtime($path.'/'.$v))->toDateTimeString(); + } + + // 分页 + + $total = count($fileData); + $filesArr = array_slice($fileData, ($page - 1) * $limit, $limit); $data['code'] = 0; $data['msg'] = 'success'; - $data['count'] = ''; - $data['data'] = ''; + $data['count'] = $total; + $data['data'] = $filesArr; return response()->json($data); } + + /** + * 获取文件内容 + * @param Request $request + * @return JsonResponse + */ + public function getFileContent(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'file' => ['required', 'regex:/^\/.*$/'], + ]); + $file = $credentials['file']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($file)) { + return response()->json(['code' => 1, 'msg' => '文件不存在']); + } + + $content = @file_get_contents($file); + $data['code'] = 0; + $data['msg'] = 'success'; + $data['data'] = $content; + return response()->json($data); + } + + /** + * 保存文件内容 + * @param Request $request + * @return JsonResponse + */ + public function saveFileContent(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'file' => ['required', 'regex:/^\/.*$/'], + 'content' => 'required', + ]); + $file = $credentials['file']; + $content = $credentials['content']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($file)) { + return response()->json(['code' => 1, 'msg' => '文件不存在']); + } + + $res = @file_put_contents($file, $content); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '保存失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 创建目录 + * @param Request $request + * @return JsonResponse + */ + public function createDir(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'name' => 'required', + ]); + $path = $credentials['path']; + $name = $credentials['name']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '目录不存在']); + } + + $res = @mkdir($path.'/'.$name); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '创建失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 重命名文件或目录 + * @param Request $request + * @return JsonResponse + */ + public function rename(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'name' => 'required', + ]); + $path = $credentials['path']; + $name = $credentials['name']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $res = @rename($path, dirname($path).'/'.$name); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '重命名失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 上传文件 + * @param Request $request + * @return JsonResponse + */ + public function uploadFile(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'file' => 'required|file', + ]); + $path = $credentials['path']; + $file = $credentials['file']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '目录不存在']); + } + + $res = @move_uploaded_file($file->getRealPath(), $path.'/'.$file->getClientOriginalName()); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '上传失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 下载文件 + * @param Request $request + * @return JsonResponse|BinaryFileResponse + */ + public function downloadFile(Request $request): BinaryFileResponse|JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path)) { + return response()->json(['code' => 1, 'msg' => '文件不存在']); + } + + return response()->download($path); + } + + /** + * 创建文件 + */ + public function createFile(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'name' => 'required', + ]); + $path = $credentials['path']; + $name = $credentials['name']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '目录不存在']); + } + + $res = @file_put_contents($path.'/'.$name, ''); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '创建失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 设置权限 + * @param Request $request + * @return JsonResponse + */ + public function chmod(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'mode' => 'required', + ]); + $path = $credentials['path']; + $mode = $credentials['mode']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $res = @chmod($path, $mode); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '设置失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 设置所有者 + */ + public function chown(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'user' => 'required', + ]); + $path = $credentials['path']; + $user = $credentials['user']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $res = @chown($path, $user); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '设置失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 设置所有者组 + * @param Request $request + * @return JsonResponse + */ + public function chgrp(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'group' => 'required', + ]); + $path = $credentials['path']; + $group = $credentials['group']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $res = @chgrp($path, $group); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '设置失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 复制文件/目录 + * @param Request $request + * @return JsonResponse + */ + public function copy(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'dest' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + $dest = $credentials['dest']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + if (!is_dir($dest)) { + return response()->json(['code' => 1, 'msg' => '目标目录不存在']); + } + + $res = @copy($path, $dest.'/'.basename($path)); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '复制失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 移动文件/目录 + * @param Request $request + * @return JsonResponse + */ + public function move(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + 'dest' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + $dest = $credentials['dest']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + if (!is_dir($dest)) { + return response()->json(['code' => 1, 'msg' => '目标目录不存在']); + } + + $res = @rename($path, $dest.'/'.basename($path)); + if ($res === false) { + return response()->json(['code' => 1, 'msg' => '移动失败']); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 删除文件/目录 + * @param Request $request + * @return JsonResponse + */ + public function delete(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $res = @shell_exec('rm -rf '.escapeshellarg($path).' 2>&1'); + if (!empty($res)) { + return response()->json(['code' => 1, 'msg' => '删除失败:'.$res]); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 压缩文件/目录 + * @param Request $request + * @return JsonResponse + */ + public function zip(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path) && !is_dir($path)) { + return response()->json(['code' => 1, 'msg' => '文件或目录不存在']); + } + + $zipPath = dirname($path).'/'.basename($path).'.zip'; + $res = @shell_exec('zip -r '.escapeshellarg($zipPath).' '.escapeshellarg($path).' 2>&1'); + if (!empty($res)) { + return response()->json(['code' => 1, 'msg' => '压缩失败:'.$res]); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } + + /** + * 解压文件/目录 + * @param Request $request + * @return JsonResponse + */ + public function unzip(Request $request): JsonResponse + { + try { + $credentials = $this->validate($request, [ + 'path' => ['required', 'regex:/^\/.*$/'], + ]); + $path = $credentials['path']; + } catch (ValidationException $e) { + return response()->json(['code' => 1, 'msg' => $e->getMessage()]); + } + + if (!is_file($path)) { + return response()->json(['code' => 1, 'msg' => '文件不存在']); + } + + $res = @shell_exec('unzip -o '.escapeshellarg($path).' -d '.escapeshellarg(dirname($path)).' 2>&1'); + if (!empty($res)) { + return response()->json(['code' => 1, 'msg' => '解压失败:'.$res]); + } + + return response()->json(['code' => 0, 'msg' => 'success']); + } } diff --git a/app/Http/Controllers/Api/WebsitesController.php b/app/Http/Controllers/Api/WebsitesController.php index 0131387c..dfa621af 100644 --- a/app/Http/Controllers/Api/WebsitesController.php +++ b/app/Http/Controllers/Api/WebsitesController.php @@ -20,11 +20,14 @@ class WebsitesController extends Controller { /** * 获取面板网站 + * @param Request $request * @return JsonResponse */ - public function getList(): JsonResponse + public function getList(Request $request): JsonResponse { - $websiteList = Website::query()->get(); + $limit = $request->input('limit', 10); + + $websiteList = Website::query()->orderBy('id')->paginate($limit); // 判空 if ($websiteList->isEmpty()) { return response()->json([ @@ -42,7 +45,8 @@ class WebsitesController extends Controller return response()->json([ 'code' => 0, 'msg' => '获取成功', - 'data' => $websiteList + 'count' => $websiteList->total(), + 'data' => $websiteList->items() ]); } diff --git a/app/Http/Middleware/AddAccessToken.php b/app/Http/Middleware/AddAccessToken.php index 18f86f99..8ddc3da8 100644 --- a/app/Http/Middleware/AddAccessToken.php +++ b/app/Http/Middleware/AddAccessToken.php @@ -14,7 +14,7 @@ class AddAccessToken // 获取请求头中的token $token = $request->header('access_token') ?? $request->input('access_token'); // 将token放入请求中 - $request->headers->set('Authorization', 'Bearer ' . $token); + $request->headers->set('Authorization', 'Bearer '.$token); return $next($request); } diff --git a/composer.lock b/composer.lock index 4b52f804..72fa13bb 100644 --- a/composer.lock +++ b/composer.lock @@ -977,16 +977,16 @@ }, { "name": "laravel/framework", - "version": "v9.38.0", + "version": "v9.45.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "abf198e443e06696af3f356b44de67c0fa516107" + "reference": "faeb20d3fc61b69790068161ab42bcf2d5faccbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/abf198e443e06696af3f356b44de67c0fa516107", - "reference": "abf198e443e06696af3f356b44de67c0fa516107", + "url": "https://api.github.com/repos/laravel/framework/zipball/faeb20d3fc61b69790068161ab42bcf2d5faccbc", + "reference": "faeb20d3fc61b69790068161ab42bcf2d5faccbc", "shasum": "" }, "require": { @@ -997,7 +997,7 @@ "ext-openssl": "*", "fruitcake/php-cors": "^1.2", "laravel/serializable-closure": "^1.2.2", - "league/commonmark": "^2.2", + "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", "monolog/monolog": "^2.0", "nesbot/carbon": "^2.62.1", @@ -1006,7 +1006,7 @@ "psr/container": "^1.1.1|^2.0.1", "psr/log": "^1.0|^2.0|^3.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "ramsey/uuid": "^4.2.2", + "ramsey/uuid": "^4.7", "symfony/console": "^6.0.9", "symfony/error-handler": "^6.0", "symfony/finder": "^6.0", @@ -1067,7 +1067,7 @@ "ably/ably-php": "^1.0", "aws/aws-sdk-php": "^3.235.5", "doctrine/dbal": "^2.13.3|^3.1.4", - "fakerphp/faker": "^1.9.2", + "fakerphp/faker": "^1.21", "guzzlehttp/guzzle": "^7.5", "league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-ftp": "^3.0", @@ -1075,7 +1075,7 @@ "league/flysystem-read-only": "^3.3", "league/flysystem-sftp-v3": "^3.0", "mockery/mockery": "^1.5.1", - "orchestra/testbench-core": "^7.11", + "orchestra/testbench-core": "^7.16", "pda/pheanstalk": "^4.0", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^9.5.8", @@ -1159,7 +1159,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-11-01T14:05:55+00:00" + "time": "2022-12-21T19:37:46+00:00" }, { "name": "laravel/sanctum", @@ -1288,16 +1288,16 @@ }, { "name": "laravel/tinker", - "version": "v2.7.2", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "dff39b661e827dae6e092412f976658df82dbac5" + "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", - "reference": "dff39b661e827dae6e092412f976658df82dbac5", + "url": "https://api.github.com/repos/laravel/tinker/zipball/5062061b4924af3392225dd482ca7b4d85d8b8ef", + "reference": "5062061b4924af3392225dd482ca7b4d85d8b8ef", "shasum": "" }, "require": { @@ -1350,22 +1350,22 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.2" + "source": "https://github.com/laravel/tinker/tree/v2.7.3" }, - "time": "2022-03-23T12:38:24+00:00" + "time": "2022-11-09T15:11:38+00:00" }, { "name": "league/commonmark", - "version": "2.3.6", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "857afc47ce113454bd629037213378ba3219dd40" + "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/857afc47ce113454bd629037213378ba3219dd40", - "reference": "857afc47ce113454bd629037213378ba3219dd40", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/c493585c130544c4e91d2e0e131e6d35cb0cbc47", + "reference": "c493585c130544c4e91d2e0e131e6d35cb0cbc47", "shasum": "" }, "require": { @@ -1393,7 +1393,7 @@ "symfony/finder": "^5.3 | ^6.0", "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", "unleashedtech/php-coding-standard": "^3.1.1", - "vimeo/psalm": "^4.24.0" + "vimeo/psalm": "^4.24.0 || ^5.0.0" }, "suggest": { "symfony/yaml": "v2.3+ required if using the Front Matter extension" @@ -1458,20 +1458,20 @@ "type": "tidelift" } ], - "time": "2022-10-30T16:45:38+00:00" + "time": "2022-12-10T16:02:17+00:00" }, { "name": "league/config", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/thephpleague/config.git", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", - "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", "shasum": "" }, "require": { @@ -1480,7 +1480,7 @@ "php": "^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.90", + "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.5", "scrutinizer/ocular": "^1.8.1", "unleashedtech/php-coding-standard": "^3.1", @@ -1540,20 +1540,20 @@ "type": "github" } ], - "time": "2021-08-14T12:15:32+00:00" + "time": "2022-12-11T20:36:23+00:00" }, { "name": "league/flysystem", - "version": "3.10.2", + "version": "3.12.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "b9bd194b016114d6ff6765c09d40c7d427e4e3f6" + "reference": "2aef65a47e44f2d6f9938f720f6dd697e7ba7b76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b9bd194b016114d6ff6765c09d40c7d427e4e3f6", - "reference": "b9bd194b016114d6ff6765c09d40c7d427e4e3f6", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2aef65a47e44f2d6f9938f720f6dd697e7ba7b76", + "reference": "2aef65a47e44f2d6f9938f720f6dd697e7ba7b76", "shasum": "" }, "require": { @@ -1615,7 +1615,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.10.2" + "source": "https://github.com/thephpleague/flysystem/tree/3.12.0" }, "funding": [ { @@ -1631,7 +1631,7 @@ "type": "tidelift" } ], - "time": "2022-10-25T07:01:47+00:00" + "time": "2022-12-20T20:21:10+00:00" }, { "name": "league/mime-type-detection", @@ -1793,16 +1793,16 @@ }, { "name": "nesbot/carbon", - "version": "2.62.1", + "version": "2.64.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a" + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", - "reference": "01bc4cdefe98ef58d1f9cb31bdbbddddf2a88f7a", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", "shasum": "" }, "require": { @@ -1813,7 +1813,7 @@ "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", @@ -1891,29 +1891,29 @@ "type": "tidelift" } ], - "time": "2022-09-02T07:48:13+00:00" + "time": "2022-11-26T17:36:00+00:00" }, { "name": "nette/schema", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", - "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.2" + "php": ">=7.1 <8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", - "phpstan/phpstan-nette": "^0.12", + "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.7" }, "type": "library", @@ -1951,9 +1951,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.2" + "source": "https://github.com/nette/schema/tree/v1.2.3" }, - "time": "2021-10-15T11:40:02+00:00" + "time": "2022-10-13T01:24:26+00:00" }, { "name": "nette/utils", @@ -2042,16 +2042,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.1", + "version": "v4.15.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", - "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", + "reference": "f59bbe44bf7d96f24f3e2b4ddc21cd52c1d2adbc", "shasum": "" }, "require": { @@ -2092,22 +2092,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.2" }, - "time": "2022-09-04T07:30:47+00:00" + "time": "2022-11-12T15:38:23+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.14.2", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "9a8218511eb1a0965629ff820dda25985440aefc" + "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/9a8218511eb1a0965629ff820dda25985440aefc", - "reference": "9a8218511eb1a0965629ff820dda25985440aefc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/594ab862396c16ead000de0c3c38f4a5cbe1938d", + "reference": "594ab862396c16ead000de0c3c38f4a5cbe1938d", "shasum": "" }, "require": { @@ -2164,7 +2164,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.14.2" + "source": "https://github.com/nunomaduro/termwind/tree/v1.15.0" }, "funding": [ { @@ -2180,7 +2180,7 @@ "type": "github" } ], - "time": "2022-10-28T22:51:32+00:00" + "time": "2022-12-20T19:00:15+00:00" }, { "name": "overtrue/laravel-lang", @@ -2689,16 +2689,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.8", + "version": "v0.11.9", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e" + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/f455acf3645262ae389b10e9beba0c358aa6994e", - "reference": "f455acf3645262ae389b10e9beba0c358aa6994e", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/1acec99d6684a54ff92f8b548a4e41b566963778", + "reference": "1acec99d6684a54ff92f8b548a4e41b566963778", "shasum": "" }, "require": { @@ -2759,9 +2759,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.8" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.9" }, - "time": "2022-07-28T14:25:11+00:00" + "time": "2022-11-06T15:29:46+00:00" }, { "name": "ralouphie/getallheaders", @@ -2888,24 +2888,23 @@ }, { "name": "ramsey/uuid", - "version": "4.5.1", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d" + "reference": "5ed9ad582647bbc3864ef78db34bdc1afdcf9b49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/a161a26d917604dc6d3aa25100fddf2556e9f35d", - "reference": "a161a26d917604dc6d3aa25100fddf2556e9f35d", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5ed9ad582647bbc3864ef78db34bdc1afdcf9b49", + "reference": "5ed9ad582647bbc3864ef78db34bdc1afdcf9b49", "shasum": "" }, "require": { "brick/math": "^0.8.8 || ^0.9 || ^0.10", - "ext-ctype": "*", "ext-json": "*", "php": "^8.0", - "ramsey/collection": "^1.0" + "ramsey/collection": "^1.2" }, "replace": { "rhumsaa/uuid": "self.version" @@ -2934,7 +2933,6 @@ }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", - "ext-ctype": "Enables faster processing of character classification using ctype functions.", "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", @@ -2966,7 +2964,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.5.1" + "source": "https://github.com/ramsey/uuid/tree/4.7.0" }, "funding": [ { @@ -2978,7 +2976,7 @@ "type": "tidelift" } ], - "time": "2022-09-16T03:22:46+00:00" + "time": "2022-12-19T22:30:49+00:00" }, { "name": "skoerfgen/acmecert", @@ -3026,16 +3024,16 @@ }, { "name": "symfony/console", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815" + "reference": "5a9bd5c543f00157c55face973c149957467db31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a1282bd0c096e0bdb8800b104177e2ce404d8815", - "reference": "a1282bd0c096e0bdb8800b104177e2ce404d8815", + "url": "https://api.github.com/repos/symfony/console/zipball/5a9bd5c543f00157c55face973c149957467db31", + "reference": "5a9bd5c543f00157c55face973c149957467db31", "shasum": "" }, "require": { @@ -3102,7 +3100,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.1.7" + "source": "https://github.com/symfony/console/tree/v6.2.2" }, "funding": [ { @@ -3118,20 +3116,20 @@ "type": "tidelift" } ], - "time": "2022-10-26T21:42:49+00:00" + "time": "2022-12-16T15:08:36+00:00" }, { "name": "symfony/css-selector", - "version": "v6.1.3", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443" + "reference": "91c342ffc99283c43653ed8eb47bc2a94db7f398" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/0dd5e36b80e1de97f8f74ed7023ac2b837a36443", - "reference": "0dd5e36b80e1de97f8f74ed7023ac2b837a36443", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/91c342ffc99283c43653ed8eb47bc2a94db7f398", + "reference": "91c342ffc99283c43653ed8eb47bc2a94db7f398", "shasum": "" }, "require": { @@ -3167,7 +3165,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.1.3" + "source": "https://github.com/symfony/css-selector/tree/v6.2.0" }, "funding": [ { @@ -3183,20 +3181,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-08-26T05:51:22+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", - "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/1ee04c65529dea5d8744774d474e7cbd2f1206d3", + "reference": "1ee04c65529dea5d8744774d474e7cbd2f1206d3", "shasum": "" }, "require": { @@ -3205,7 +3203,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -3234,7 +3232,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.0" }, "funding": [ { @@ -3250,20 +3248,20 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/error-handler", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "699a26ce5ec656c198bf6e26398b0f0818c7e504" + "reference": "12a25d01cc5273b2445e125d62b61d34db42297e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/699a26ce5ec656c198bf6e26398b0f0818c7e504", - "reference": "699a26ce5ec656c198bf6e26398b0f0818c7e504", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/12a25d01cc5273b2445e125d62b61d34db42297e", + "reference": "12a25d01cc5273b2445e125d62b61d34db42297e", "shasum": "" }, "require": { @@ -3305,7 +3303,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.1.7" + "source": "https://github.com/symfony/error-handler/tree/v6.2.2" }, "funding": [ { @@ -3321,20 +3319,20 @@ "type": "tidelift" } ], - "time": "2022-10-28T16:23:08+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.1.0", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347" + "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a0449a7ad7daa0f7c0acd508259f80544ab5a347", - "reference": "a0449a7ad7daa0f7c0acd508259f80544ab5a347", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3ffeb31139b49bf6ef0bc09d1db95eac053388d1", + "reference": "3ffeb31139b49bf6ef0bc09d1db95eac053388d1", "shasum": "" }, "require": { @@ -3388,7 +3386,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.1.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.2.2" }, "funding": [ { @@ -3404,20 +3402,20 @@ "type": "tidelift" } ], - "time": "2022-05-05T16:51:07+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448" + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/02ff5eea2f453731cfbc6bc215e456b781480448", - "reference": "02ff5eea2f453731cfbc6bc215e456b781480448", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0782b0b52a737a05b4383d0df35a474303cabdae", + "reference": "0782b0b52a737a05b4383d0df35a474303cabdae", "shasum": "" }, "require": { @@ -3430,7 +3428,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -3467,7 +3465,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.2.0" }, "funding": [ { @@ -3483,20 +3481,20 @@ "type": "tidelift" } ], - "time": "2022-02-25T11:15:52+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/finder", - "version": "v6.1.3", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709" + "reference": "eb2355f69519e4ef33f1835bca4c935f5d42e570" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/39696bff2c2970b3779a5cac7bf9f0b88fc2b709", - "reference": "39696bff2c2970b3779a5cac7bf9f0b88fc2b709", + "url": "https://api.github.com/repos/symfony/finder/zipball/eb2355f69519e4ef33f1835bca4c935f5d42e570", + "reference": "eb2355f69519e4ef33f1835bca4c935f5d42e570", "shasum": "" }, "require": { @@ -3531,7 +3529,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.1.3" + "source": "https://github.com/symfony/finder/tree/v6.2.0" }, "funding": [ { @@ -3547,20 +3545,20 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:42:06+00:00" + "time": "2022-10-09T08:55:40+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "792a1856d2b95273f0e1c3435785f1d01a60ecc6" + "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/792a1856d2b95273f0e1c3435785f1d01a60ecc6", - "reference": "792a1856d2b95273f0e1c3435785f1d01a60ecc6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ddf4dd35de1623e7c02013523e6c2137b67b636f", + "reference": "ddf4dd35de1623e7c02013523e6c2137b67b636f", "shasum": "" }, "require": { @@ -3568,6 +3566,9 @@ "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1" }, + "conflict": { + "symfony/cache": "<6.2" + }, "require-dev": { "predis/predis": "~1.0", "symfony/cache": "^5.4|^6.0", @@ -3606,7 +3607,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.1.7" + "source": "https://github.com/symfony/http-foundation/tree/v6.2.2" }, "funding": [ { @@ -3622,25 +3623,26 @@ "type": "tidelift" } ], - "time": "2022-10-12T09:44:59+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "8fc1ffe753948c47a103a809cdd6a4a8458b3254" + "reference": "860a0189969b755cd571709bd32313aa8599867a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8fc1ffe753948c47a103a809cdd6a4a8458b3254", - "reference": "8fc1ffe753948c47a103a809cdd6a4a8458b3254", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/860a0189969b755cd571709bd32313aa8599867a", + "reference": "860a0189969b755cd571709bd32313aa8599867a", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/error-handler": "^6.1", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", @@ -3651,7 +3653,7 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.1", + "symfony/dependency-injection": "<6.2", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -3671,7 +3673,7 @@ "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.1", + "symfony/dependency-injection": "^6.2", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", @@ -3716,7 +3718,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.1.7" + "source": "https://github.com/symfony/http-kernel/tree/v6.2.2" }, "funding": [ { @@ -3732,20 +3734,20 @@ "type": "tidelift" } ], - "time": "2022-10-28T18:06:36+00:00" + "time": "2022-12-16T19:38:34+00:00" }, { "name": "symfony/mailer", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "7e19813c0b43387c55665780c4caea505cc48391" + "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/7e19813c0b43387c55665780c4caea505cc48391", - "reference": "7e19813c0b43387c55665780c4caea505cc48391", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", + "reference": "b355ad81f1d2987c47dcd3b04d5dce669e1e62e6", "shasum": "" }, "require": { @@ -3754,15 +3756,20 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/mime": "^5.4|^6.0", + "symfony/mime": "^6.2", "symfony/service-contracts": "^1.1|^2|^3" }, "conflict": { - "symfony/http-kernel": "<5.4" + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" }, "require-dev": { + "symfony/console": "^5.4|^6.0", "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/messenger": "^5.4|^6.0" + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" }, "type": "library", "autoload": { @@ -3790,7 +3797,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.1.7" + "source": "https://github.com/symfony/mailer/tree/v6.2.2" }, "funding": [ { @@ -3806,20 +3813,20 @@ "type": "tidelift" } ], - "time": "2022-10-28T16:23:08+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/mime", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "f440f066d57691088d998d6e437ce98771144618" + "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/f440f066d57691088d998d6e437ce98771144618", - "reference": "f440f066d57691088d998d6e437ce98771144618", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c98bf40406e791043890a163f6f6599b9cfa1ed", + "reference": "8c98bf40406e791043890a163f6f6599b9cfa1ed", "shasum": "" }, "require": { @@ -3831,15 +3838,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4" + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", + "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", - "symfony/serializer": "^5.2|^6.0" + "symfony/serializer": "^6.2" }, "type": "library", "autoload": { @@ -3871,7 +3880,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.1.7" + "source": "https://github.com/symfony/mime/tree/v6.2.2" }, "funding": [ { @@ -3887,20 +3896,20 @@ "type": "tidelift" } ], - "time": "2022-10-19T08:10:53+00:00" + "time": "2022-12-14T16:38:10+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", - "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { @@ -3915,7 +3924,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3953,7 +3962,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { @@ -3969,20 +3978,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "433d05519ce6990bf3530fba6957499d327395c2" + "reference": "511a08c03c1960e08a883f4cffcacd219b758354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", - "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", "shasum": "" }, "require": { @@ -3994,7 +4003,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4034,7 +4043,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" }, "funding": [ { @@ -4050,20 +4059,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" + "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { @@ -4077,7 +4086,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4121,7 +4130,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { @@ -4137,20 +4146,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", - "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { @@ -4162,7 +4171,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4205,7 +4214,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { @@ -4221,20 +4230,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { @@ -4249,7 +4258,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4288,7 +4297,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { @@ -4304,20 +4313,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { @@ -4326,7 +4335,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4364,7 +4373,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { @@ -4380,20 +4389,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", - "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { @@ -4402,7 +4411,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4447,7 +4456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { @@ -4463,20 +4472,20 @@ "type": "tidelift" } ], - "time": "2022-05-10T07:21:04+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", - "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", + "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", "shasum": "" }, "require": { @@ -4485,7 +4494,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4526,7 +4535,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" }, "funding": [ { @@ -4542,20 +4551,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.26.0", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23" + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/a41886c1c81dc075a09c71fe6db5b9d68c79de23", - "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", "shasum": "" }, "require": { @@ -4570,7 +4579,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.26-dev" + "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4608,7 +4617,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.26.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" }, "funding": [ { @@ -4624,20 +4633,20 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:49:31+00:00" + "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", - "version": "v6.1.3", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292" + "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/a6506e99cfad7059b1ab5cab395854a0a0c21292", - "reference": "a6506e99cfad7059b1ab5cab395854a0a0c21292", + "url": "https://api.github.com/repos/symfony/process/zipball/ba6e55359f8f755fe996c58a81e00eaa67a35877", + "reference": "ba6e55359f8f755fe996c58a81e00eaa67a35877", "shasum": "" }, "require": { @@ -4669,7 +4678,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.1.3" + "source": "https://github.com/symfony/process/tree/v6.2.0" }, "funding": [ { @@ -4685,20 +4694,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-11-02T09:08:04+00:00" }, { "name": "symfony/routing", - "version": "v6.1.7", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "95effeb9d6e2cec861cee06bf5bbf82d09aea7f5" + "reference": "857ac6f4df371470fbdefa2f5967a2618dbf1852" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/95effeb9d6e2cec861cee06bf5bbf82d09aea7f5", - "reference": "95effeb9d6e2cec861cee06bf5bbf82d09aea7f5", + "url": "https://api.github.com/repos/symfony/routing/zipball/857ac6f4df371470fbdefa2f5967a2618dbf1852", + "reference": "857ac6f4df371470fbdefa2f5967a2618dbf1852", "shasum": "" }, "require": { @@ -4706,14 +4715,14 @@ }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.4", + "symfony/config": "<6.2", "symfony/dependency-injection": "<5.4", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0", + "symfony/config": "^6.2", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", @@ -4757,7 +4766,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.1.7" + "source": "https://github.com/symfony/routing/tree/v6.2.0" }, "funding": [ { @@ -4773,20 +4782,20 @@ "type": "tidelift" } ], - "time": "2022-10-18T13:12:43+00:00" + "time": "2022-11-09T13:28:29+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239" + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239", - "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/aac98028c69df04ee77eb69b96b86ee51fbf4b75", + "reference": "aac98028c69df04ee77eb69b96b86ee51fbf4b75", "shasum": "" }, "require": { @@ -4802,7 +4811,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -4842,7 +4851,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.2.0" }, "funding": [ { @@ -4858,20 +4867,20 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:18:58+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/string", - "version": "v6.1.7", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5" + "reference": "863219fd713fa41cbcd285a79723f94672faff4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/823f143370880efcbdfa2dbca946b3358c4707e5", - "reference": "823f143370880efcbdfa2dbca946b3358c4707e5", + "url": "https://api.github.com/repos/symfony/string/zipball/863219fd713fa41cbcd285a79723f94672faff4d", + "reference": "863219fd713fa41cbcd285a79723f94672faff4d", "shasum": "" }, "require": { @@ -4887,6 +4896,7 @@ "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", "symfony/translation-contracts": "^2.0|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, @@ -4927,7 +4937,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.1.7" + "source": "https://github.com/symfony/string/tree/v6.2.2" }, "funding": [ { @@ -4943,20 +4953,20 @@ "type": "tidelift" } ], - "time": "2022-10-10T09:34:31+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "symfony/translation", - "version": "v6.1.6", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e6cd330e5a072518f88d65148f3f165541807494" + "reference": "3294288c335b6267eab14964bf2c46015663d93f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e6cd330e5a072518f88d65148f3f165541807494", - "reference": "e6cd330e5a072518f88d65148f3f165541807494", + "url": "https://api.github.com/repos/symfony/translation/zipball/3294288c335b6267eab14964bf2c46015663d93f", + "reference": "3294288c335b6267eab14964bf2c46015663d93f", "shasum": "" }, "require": { @@ -4976,6 +4986,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { + "nikic/php-parser": "^4.13", "psr/log": "^1|^2|^3", "symfony/config": "^5.4|^6.0", "symfony/console": "^5.4|^6.0", @@ -4990,6 +5001,7 @@ "symfony/yaml": "^5.4|^6.0" }, "suggest": { + "nikic/php-parser": "To use PhpAstExtractor", "psr/log-implementation": "To use logging capability in translator", "symfony/config": "", "symfony/yaml": "" @@ -5023,7 +5035,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.1.6" + "source": "https://github.com/symfony/translation/tree/v6.2.2" }, "funding": [ { @@ -5039,20 +5051,20 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:04:03+00:00" + "time": "2022-12-13T18:04:17+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.1.1", + "version": "v3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc" + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/606be0f48e05116baef052f7f3abdb345c8e02cc", - "reference": "606be0f48e05116baef052f7f3abdb345c8e02cc", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/68cce71402305a015f8c1589bfada1280dc64fe7", + "reference": "68cce71402305a015f8c1589bfada1280dc64fe7", "shasum": "" }, "require": { @@ -5064,7 +5076,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.1-dev" + "dev-main": "3.3-dev" }, "thanks": { "name": "symfony/contracts", @@ -5104,7 +5116,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.1.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.2.0" }, "funding": [ { @@ -5120,20 +5132,20 @@ "type": "tidelift" } ], - "time": "2022-06-27T17:24:16+00:00" + "time": "2022-11-25T10:21:52+00:00" }, { "name": "symfony/uid", - "version": "v6.1.5", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "e03519f7b1ce1d3c0b74f751892bb41d549a2d98" + "reference": "4f9f537e57261519808a7ce1d941490736522bbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/e03519f7b1ce1d3c0b74f751892bb41d549a2d98", - "reference": "e03519f7b1ce1d3c0b74f751892bb41d549a2d98", + "url": "https://api.github.com/repos/symfony/uid/zipball/4f9f537e57261519808a7ce1d941490736522bbc", + "reference": "4f9f537e57261519808a7ce1d941490736522bbc", "shasum": "" }, "require": { @@ -5178,7 +5190,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.1.5" + "source": "https://github.com/symfony/uid/tree/v6.2.0" }, "funding": [ { @@ -5194,20 +5206,20 @@ "type": "tidelift" } ], - "time": "2022-09-09T09:34:27+00:00" + "time": "2022-10-09T08:55:40+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.1.6", + "version": "v6.2.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f" + "reference": "6168f544827e897f708a684f75072a8c33a5e309" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0f0adde127f24548e23cbde83bcaeadc491c551f", - "reference": "0f0adde127f24548e23cbde83bcaeadc491c551f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6168f544827e897f708a684f75072a8c33a5e309", + "reference": "6168f544827e897f708a684f75072a8c33a5e309", "shasum": "" }, "require": { @@ -5266,7 +5278,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.1.6" + "source": "https://github.com/symfony/var-dumper/tree/v6.2.2" }, "funding": [ { @@ -5282,7 +5294,7 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:04:03+00:00" + "time": "2022-12-14T16:11:27+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5627,20 +5639,20 @@ }, { "name": "fakerphp/faker", - "version": "v1.20.0", + "version": "v1.21.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b" + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/37f751c67a5372d4e26353bd9384bc03744ec77b", - "reference": "37f751c67a5372d4e26353bd9384bc03744ec77b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/92efad6a967f0b79c499705c69b662f738cc9e4d", + "reference": "92efad6a967f0b79c499705c69b662f738cc9e4d", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", + "php": "^7.4 || ^8.0", "psr/container": "^1.0 || ^2.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -5651,7 +5663,8 @@ "bamarni/composer-bin-plugin": "^1.4.1", "doctrine/persistence": "^1.3 || ^2.0", "ext-intl": "*", - "symfony/phpunit-bridge": "^4.4 || ^5.2" + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" }, "suggest": { "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", @@ -5663,7 +5676,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.20-dev" + "dev-main": "v1.21-dev" } }, "autoload": { @@ -5688,22 +5701,22 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.20.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.21.0" }, - "time": "2022-07-20T13:12:54+00:00" + "time": "2022-12-13T13:54:32+00:00" }, { "name": "filp/whoops", - "version": "2.14.5", + "version": "2.14.6", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" + "reference": "f7948baaa0330277c729714910336383286305da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", + "url": "https://api.github.com/repos/filp/whoops/zipball/f7948baaa0330277c729714910336383286305da", + "reference": "f7948baaa0330277c729714910336383286305da", "shasum": "" }, "require": { @@ -5753,7 +5766,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.5" + "source": "https://github.com/filp/whoops/tree/2.14.6" }, "funding": [ { @@ -5761,7 +5774,7 @@ "type": "github" } ], - "time": "2022-01-07T12:00:00+00:00" + "time": "2022-11-02T16:23:29+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -5816,16 +5829,16 @@ }, { "name": "laravel/pint", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "1d276e4c803397a26cc337df908f55c2a4e90d86" + "reference": "6a2c0927b4f6ad4eadb5a67fe3835fdad108949d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/1d276e4c803397a26cc337df908f55c2a4e90d86", - "reference": "1d276e4c803397a26cc337df908f55c2a4e90d86", + "url": "https://api.github.com/repos/laravel/pint/zipball/6a2c0927b4f6ad4eadb5a67fe3835fdad108949d", + "reference": "6a2c0927b4f6ad4eadb5a67fe3835fdad108949d", "shasum": "" }, "require": { @@ -5836,11 +5849,11 @@ "php": "^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.11.0", - "illuminate/view": "^9.27", - "laravel-zero/framework": "^9.1.3", - "mockery/mockery": "^1.5.0", - "nunomaduro/larastan": "^2.2", + "friendsofphp/php-cs-fixer": "~3.13.1", + "illuminate/view": "^9.32.0", + "laravel-zero/framework": "^9.2.0", + "mockery/mockery": "^1.5.1", + "nunomaduro/larastan": "^2.2.0", "nunomaduro/termwind": "^1.14.0", "pestphp/pest": "^1.22.1" }, @@ -5878,20 +5891,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2022-09-13T15:07:15+00:00" + "time": "2022-12-20T17:16:15+00:00" }, { "name": "laravel/sail", - "version": "v1.16.2", + "version": "v1.16.6", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "7d1ed5f856ec8b9708712e3fc0708fcabe114659" + "reference": "2e8be54590bde421eb04e461a1421302a5b22cca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/7d1ed5f856ec8b9708712e3fc0708fcabe114659", - "reference": "7d1ed5f856ec8b9708712e3fc0708fcabe114659", + "url": "https://api.github.com/repos/laravel/sail/zipball/2e8be54590bde421eb04e461a1421302a5b22cca", + "reference": "2e8be54590bde421eb04e461a1421302a5b22cca", "shasum": "" }, "require": { @@ -5938,7 +5951,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2022-09-28T13:13:22+00:00" + "time": "2022-12-19T15:41:32+00:00" }, { "name": "mockery/mockery", @@ -6272,16 +6285,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.18", + "version": "9.2.22", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a" + "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/12fddc491826940cf9b7e88ad9664cf51f0f6d0a", - "reference": "12fddc491826940cf9b7e88ad9664cf51f0f6d0a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e4bf60d2220b4baaa0572986b5d69870226b06df", + "reference": "e4bf60d2220b4baaa0572986b5d69870226b06df", "shasum": "" }, "require": { @@ -6337,7 +6350,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.18" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.22" }, "funding": [ { @@ -6345,7 +6358,7 @@ "type": "github" } ], - "time": "2022-10-27T13:35:33+00:00" + "time": "2022-12-18T16:40:55+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6590,16 +6603,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.26", + "version": "9.5.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2" + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/851867efcbb6a1b992ec515c71cdcf20d895e9d2", - "reference": "851867efcbb6a1b992ec515c71cdcf20d895e9d2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a2bc7ffdca99f92d959b3f2270529334030bba38", + "reference": "a2bc7ffdca99f92d959b3f2270529334030bba38", "shasum": "" }, "require": { @@ -6672,7 +6685,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.26" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.27" }, "funding": [ { @@ -6688,7 +6701,7 @@ "type": "tidelift" } ], - "time": "2022-10-28T06:00:21+00:00" + "time": "2022-12-09T07:31:23+00:00" }, { "name": "sebastian/cli-parser", @@ -7718,16 +7731,16 @@ }, { "name": "spatie/flare-client-php", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca" + "reference": "ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/b1b974348750925b717fa8c8b97a0db0d1aa40ca", - "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8", + "reference": "ebb9ae0509b75e02f128b39537eb9a3ef5ce18e8", "shasum": "" }, "require": { @@ -7775,7 +7788,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.3.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.3.1" }, "funding": [ { @@ -7783,7 +7796,7 @@ "type": "github" } ], - "time": "2022-08-08T10:10:20+00:00" + "time": "2022-11-16T08:30:20+00:00" }, { "name": "spatie/ignition", @@ -7862,16 +7875,16 @@ }, { "name": "spatie/laravel-ignition", - "version": "1.6.1", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ignition.git", - "reference": "2b79cf6ed40946b64ac6713d7d2da8a9d87f612b" + "reference": "d6e1e1ad93abe280abf41c33f8ea7647dfc0c233" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/2b79cf6ed40946b64ac6713d7d2da8a9d87f612b", - "reference": "2b79cf6ed40946b64ac6713d7d2da8a9d87f612b", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/d6e1e1ad93abe280abf41c33f8ea7647dfc0c233", + "reference": "d6e1e1ad93abe280abf41c33f8ea7647dfc0c233", "shasum": "" }, "require": { @@ -7948,7 +7961,7 @@ "type": "github" } ], - "time": "2022-10-26T17:39:54+00:00" + "time": "2022-12-08T15:31:38+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/panel.php b/config/panel.php index 88d19832..ca7a1017 100644 --- a/config/panel.php +++ b/config/panel.php @@ -1,6 +1,6 @@ '耗子Linux面板', - 'version' => '20221212', + 'version' => '20221222', 'plugin_dir' => '/www/panel/plugins', ]; \ No newline at end of file diff --git a/public/panel/modules/file.js b/public/panel/modules/file.js index 7fbb0de9..5dd1dd3e 100644 --- a/public/panel/modules/file.js +++ b/public/panel/modules/file.js @@ -1,30 +1,35 @@ -layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模块也可以依赖其它模块,如:layui.define('layer', callback); - var $ = layui.jquery, - layer = layui.layer, - laypage = layui.laypage; +/** + * Name: Layui文件管理插件(LayuiAdmin定制版) + * Author: 李春林 + * Author: 耗子 + * Date: 2022-12-22 + */ +layui.define(['jquery', 'layer', 'laypage', 'admin'], function (exports) { //提示:模块也可以依赖其它模块,如:layui.define('layer', callback); + var $ = layui.jquery, layer = layui.layer, laypage = layui.laypage, admin = layui.admin; //外部接口 var fm = { - config:{'test':'test','thumb':{'nopic':'',width:100,height:100},icon_url:'ico/',btn_upload:true,btn_create:true} - ,cache: {} //数据缓存 - ,index: layui.fm ? (layui.fm.index + 10000) : 0 + config: { + 'test': 'test', + 'thumb': {'nopic': '', width: 100, height: 100}, + icon_url: 'ico/', + btn_upload: true, + btn_create: true + }, cache: {} //数据缓存 + , index: layui.fm ? (layui.fm.index + 10000) : 0 //设置全局项 - ,set: function(options){ + , set: function (options) { var that = this; that.config = $.extend({}, that.config, options); return that; } //事件监听 - ,on: function(events, callback){ + , on: function (events, callback) { return layui.onevent.call(this, 'file', events, callback); - } - ,dirRoot:[{'path':'','name': '根目录'}] - ,v:'1.0.1.2019.12.26' + }, dirRoot: [{'path': '/www/wwwroot', 'name': '网站目录'}], v: '20221222' } //操作当前实例 - , thisFm = function() { - var that = this, - options = that.config, - id = options.id || options.index; + , thisFm = function () { + var that = this, options = that.config, id = options.id || options.index; // console.log(id) if (id) { @@ -32,20 +37,19 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 thisFm.config[id] = options; //记录当前实例配置项 } return { - config: options, - reload: function(options) { + config: options, reload: function (options) { that.reload.call(that, options); } } } //获取当前实例配置项 - ,getThisFmConfig = function(id){ + , getThisFmConfig = function (id) { var config = thisFm.config[id]; - if(!config) hint.error('The ID option was not found in the fm instance'); + if (!config) hint.error('The ID option was not found in the fm instance'); return config || null; } //构造器 - ,Class = function(options){ + , Class = function (options) { var that = this; that.config = $.extend({}, that.config, fm.config, options); //记录所有实例 @@ -55,9 +59,8 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 that.render(); }; //渲染 - Class.prototype.render = function(){ - var that = this - ,options = that.config; + Class.prototype.render = function () { + var that = this, options = that.config; options.elem = $(options.elem); options.where = options.where || {}; @@ -65,21 +68,16 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 //请求参数的自定义格式 options.request = $.extend({ - pageName: 'page' - ,limitName: 'limit' + pageName: 'page', limitName: 'limit' }, options.request) //响应数据的自定义格式 options.response = $.extend({ - statusName: 'code' - ,statusCode: 0 - ,msgName: 'msg' - ,dataName: 'data' - ,countName: 'count' + statusName: 'code', statusCode: 0, msgName: 'msg', dataName: 'data', countName: 'count' }, options.response); //如果 page 传入 laypage 对象 - if(typeof options.page === 'object'){ + if (typeof options.page === 'object') { options.limit = options.page.limit || options.limit; options.limits = options.page.limits || options.limits; that.page = options.page.curr = options.page.curr || 1; @@ -87,37 +85,23 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 delete options.page.jump; } - if(!options.elem[0]) return that; + if (!options.elem[0]) return that; //渲染主体 var _btn = '' - if(options.btn_create){ - _btn +=''; + if (options.btn_create) { + _btn += ''; } - if(options.btn_upload){ - _btn +=''; + if (options.btn_upload) { + _btn += ''; } - var _html = '
' + - '
' + - '
' + - _btn+ - '' + - '
' + - '
' + - '根目录' + - '
' + - '

' + - '
' + - '
    ' + - '
' + - '
' + - '
'; + var _html = '
' + '
' + '
' + _btn + '' + '
' + '
' + '根目录' + '
' + '

' + '
' + '
    ' + '
' + '
' + '
'; options.elem.html(_html); options.index = that.index; that.key = options.id || options.index; //各级容器 - that.layPage = options.elem.find('.layui_page_'+options.id); + that.layPage = options.elem.find('.layui_page_' + options.id); that.layBody = options.elem.find('.fm_body'); that.layPathBar = options.elem.find('.path_bar'); that.layToolBar = options.elem.find('.tool_bar'); @@ -129,12 +113,8 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 Class.prototype.page = 1; //获得数据 - Class.prototype.pullData = function(curr) { - var that = this, - options = that.config, - request = options.request, - response = options.response, - _status = false; + Class.prototype.pullData = function (curr) { + var that = this, options = that.config, request = options.request, response = options.response, _status = false; that.startTime = new Date().getTime(); //渲染开始时间 if (options.url) { //Ajax请求 @@ -150,7 +130,7 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 that.loading(); - $.ajax({ + admin.req({ type: options.method || 'get', url: options.url, contentType: options.contentType, @@ -158,7 +138,7 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 async: false, dataType: 'json', headers: options.headers || {}, - success: function(res) { + success: function (res) { //如果有数据解析的回调,则获得其返回的数据 if (typeof options.parseData === 'function') { res = options.parseData(res) || res; @@ -166,12 +146,9 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 //检查数据格式是否符合规范 if (res[response.statusName] != response.statusCode) { - that.errorView( - res[response.msgName] || - ('返回的数据不符合规范,正确的成功状态码应为:"' + response.statusName + '": ' + response.statusCode) - ); + that.errorView(res[response.msgName] || ('返回的数据不符合规范,正确的成功状态码应为:"' + response.statusName + '": ' + response.statusCode)); } else { - // console.log(res, curr, res[response.countName]); + console.log(res); that.renderData(res, curr, res[response.countName]); options.time = (new Date().getTime() - that.startTime) + ' ms'; //耗时(接口请求+视图渲染) @@ -179,7 +156,7 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 typeof options.done === 'function' && options.done(res, curr, res[response.countName]); _status = true; }, - error: function(e, m) { + error: function (e, m) { that.errorView('数据接口请求异常:' + m); } @@ -188,61 +165,54 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 return _status; }; //数据渲染 - Class.prototype.renderData = function(res, curr, count){ - var that = this - ,options = that.config - ,data = res[options.response.dataName] || [] + Class.prototype.renderData = function (res, curr, count) { + var that = this, options = that.config, data = res[options.response.dataName] || [] //渲染数据 var _content = '' - layui.each(data,function(i,v){ - let _img,_type; + layui.each(data, function (i, v) { + let _img, _type; _type = v.type; switch (v.type) { - case 'directory': - _img = '
'; + case 'dir': + _img = '
'; _type = 'DIR'; break; default: if (v.type == 'png' || v.type == 'gif' || v.type == 'jpg' || v.type == 'image') { - _img = ''; + _img = ''; } else { - _img = '
'; + _img = '
'; } break; } - _content+='
  • ' + - '
    '+ - _img + - '

    ' + v.name + '

    ' + - '
    ' + - '
  • '; + _content += '
  • ' + '
    ' + _img + '

    ' + v.name + '

    ' + '
    ' + '
  • '; }); options.elem.find('.file').html(_content); fm.cache[options.id] = data; //记录数据 //显示隐藏分页栏 // console.log(that.layPage) that.layPage[(count == 0 || (data.length === 0 && curr == 1)) ? 'addClass' : 'removeClass']('layui-hide'); - if(data.length === 0){ + if (data.length === 0) { return that.errorView('空目录'); } else { //that.layFixed.removeClass('layui-hide'); } //同步分页状态 - if(options.page){ + if (options.page) { // console.log(options,'layui_page_' + options.id) options.page = $.extend({ - elem: 'layui_page_' + options.id - ,count: count - ,limit: options.limit - ,limits: options.limits || [10,20,30,40,50,60,70,80,90] - ,groups: 3 - ,layout: ['prev', 'page', 'next', 'skip', 'count', 'limit'] - ,prev: '' - ,next: '' - ,jump: function(obj, first){ - if(!first){ + elem: 'layui_page_' + options.id, + count: count, + limit: options.limit, + limits: options.limits || [10, 20, 30, 40, 50, 60, 70, 80, 90], + groups: 3, + layout: ['prev', 'page', 'next', 'skip', 'count', 'limit'], + prev: '', + next: '', + jump: function (obj, first) { + if (!first) { //分页本身并非需要做以下更新,下面参数的同步,主要是因为其它处理统一用到了它们 //而并非用的是 options.page 中的参数(以确保分页未开启的情况仍能正常使用) that.page = obj.curr; //更新页码 @@ -257,135 +227,124 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 } }; //更新路径工具条 - Class.prototype.updatePathBar = function(){ + Class.prototype.updatePathBar = function () { // console.log('updatePathBar',fm.dirRoot); - var that = this - ,options = that.config; + var that = this, options = that.config; //请求数据 - let dir_cur = fm.dirRoot[fm.dirRoot.length -1]; - options.where = {'path':dir_cur['path']} + let dir_cur = fm.dirRoot[fm.dirRoot.length - 1]; + options.where = {'path': dir_cur['path']} let _rs = that.pullData(1); // console.log(_rs) - if(false == _rs) return; + if (false == _rs) return; that.layPathBar.html(''); - fm.dirRoot.map(function(item,index,arr){ - let icon = index==0 ?'layui-icon-more-vertical':'layui-icon-right'; - let html = ''+ - '' + item.name + '' + fm.dirRoot.map(function (item, index, arr) { + let icon = index == 0 ? 'layui-icon-more-vertical' : 'layui-icon-right'; + let html = '' + '' + item.name + '' that.layPathBar.append(html); }) } //事件处理 - Class.prototype.events = function(){ - var that = this - ,options = that.config - ,_BODY = $('body') - ,dict = {} - ,filter = options.elem.attr('lay-filter'); + Class.prototype.events = function () { + var that = this, options = that.config, _BODY = $('body'), dict = {}, filter = options.elem.attr('lay-filter'); //文件事件 - that.layBody.on('click', 'li', function(){ //单击行 + that.layBody.on('click', 'li', function () { //单击行 setPicEvent.call(this, 'pic'); }); //文件夹事件 - that.layBody.on('click', 'li[data-type=DIR]', function(){ //单击行 + that.layBody.on('click', 'li[data-type=DIR]', function () { //单击行 var othis = $(this); - var data = fm.cache[options.id]; + var data = fm.cache[options.id]; var index = othis.data('index'); data = data[index] || {}; //导航图标 - fm.dirRoot.push({'path':data.path,'name': data.name}); + fm.dirRoot.push({'path': data.path, 'name': data.name}); that.updatePathBar(); }); //返回上一级目录 - that.layToolBar.on('click', '#back', function(){ + that.layToolBar.on('click', '#back', function () { var othis = $(this); - if(fm.dirRoot.length == 1) return layer.msg('已经是根目录'); + if (fm.dirRoot.length == 1) return layer.msg('已经是根目录'); - fm.dirRoot.length >1 && fm.dirRoot.pop() + fm.dirRoot.length > 1 && fm.dirRoot.pop() that.updatePathBar(); // console.log('back'); }); //上传文件 - that.layToolBar.on('click', '#uploadfile', function(){ + that.layToolBar.on('click', '#uploadfile', function () { var othis = $(this); let eventType = 'uploadfile'; - layui.event.call(this, - 'file', eventType + '('+ filter +')' - ,{obj:othis,path:fm.dirRoot[fm.dirRoot.length -1]['path']} - ); + layui.event.call(this, 'file', eventType + '(' + filter + ')', { + obj: othis, + path: fm.dirRoot[fm.dirRoot.length - 1]['path'] + }); // console.log('uploadfile'); }); //新建文件夹 - that.layToolBar.on('click', '#new_dir', function(){ + that.layToolBar.on('click', '#new_dir', function () { var othis = $(this); let eventType = 'new_dir'; - layer.prompt({ title: '请输入新文件夹名字', formType: 0 }, function(name, index) { + layer.prompt({title: '请输入新文件夹名字', formType: 0}, function (name, index) { layer.close(index); //新建文件夹 - layui.event.call(this, - 'file', eventType + '('+ filter +')' - ,{obj:othis,folder:name,path:fm.dirRoot[fm.dirRoot.length -1]['path']} - ); + layui.event.call(this, 'file', eventType + '(' + filter + ')', { + obj: othis, + folder: name, + path: fm.dirRoot[fm.dirRoot.length - 1]['path'] + }); }); }); //创建点击文件事件监听 - var setPicEvent = function(eventType) { + var setPicEvent = function (eventType) { var othis = $(this); - var data = fm.cache[options.id]; + var data = fm.cache[options.id]; var index = othis.data('index'); - if (othis.data('type')=='DIR') return; //不触发事件 + if (othis.data('type') == 'DIR') return; //不触发事件 data = data[index] || {}; - layui.event.call(this, - 'file', eventType + '('+ filter +')' - ,{obj:othis,data:data} - ); + layui.event.call(this, 'file', eventType + '(' + filter + ')', {obj: othis, data: data}); }; }; //请求loading - Class.prototype.loading = function(hide){ - var that = this - ,options = that.config; - if(options.loading){ - if(hide){ + Class.prototype.loading = function (hide) { + var that = this, options = that.config; + if (options.loading) { + if (hide) { that.layInit && that.layInit.remove(); delete that.layInit; that.layBox.find(ELEM_INIT).remove(); } else { - that.layInit = $(['
    ' - ,'' - ,'
    '].join('')); + that.layInit = $(['
    ', '', '
    '].join('')); that.layBox.append(that.layInit); } } }; //异常提示 - Class.prototype.errorView = function(html){ + Class.prototype.errorView = function (html) { var that = this layer.msg(html); }; //重载 - Class.prototype.reload = function(options){ + Class.prototype.reload = function (options) { var that = this; options = options || {}; delete that.haveInit; - if(options.data && options.data.constructor === Array) delete that.config.data; + if (options.data && options.data.constructor === Array) delete that.config.data; that.config = $.extend(true, {}, that.config, options); that.render(); }; //重载 - fm.reload = function(id, options){ + fm.reload = function (id, options) { var config = getThisFmConfig(id); //获取当前实例配置项 - if(!config) return; + if (!config) return; var that = thisFm.that[id]; that.reload(options); @@ -393,7 +352,7 @@ layui.define(['jquery', 'layer', 'laypage'], function(exports) { //提示:模 return thisFm.call(that); }; //核心入口 - fm.render = function(options){ + fm.render = function (options) { var inst = new Class(options); return thisFm.call(inst); }; diff --git a/public/panel/style/ico/ai.png b/public/panel/style/ico/ai.png new file mode 100644 index 00000000..b83eb8ad Binary files /dev/null and b/public/panel/style/ico/ai.png differ diff --git a/public/panel/style/ico/apk.png b/public/panel/style/ico/apk.png new file mode 100644 index 00000000..ce6598b9 Binary files /dev/null and b/public/panel/style/ico/apk.png differ diff --git a/public/panel/style/ico/bt.png b/public/panel/style/ico/bt.png new file mode 100644 index 00000000..7bb02d61 Binary files /dev/null and b/public/panel/style/ico/bt.png differ diff --git a/public/panel/style/ico/cad.png b/public/panel/style/ico/cad.png new file mode 100644 index 00000000..f85483c9 Binary files /dev/null and b/public/panel/style/ico/cad.png differ diff --git a/public/panel/style/ico/code.png b/public/panel/style/ico/code.png new file mode 100644 index 00000000..d3ab1aab Binary files /dev/null and b/public/panel/style/ico/code.png differ diff --git a/public/panel/style/ico/dir.png b/public/panel/style/ico/dir.png new file mode 100644 index 00000000..94d78795 Binary files /dev/null and b/public/panel/style/ico/dir.png differ diff --git a/public/panel/style/ico/doc.png b/public/panel/style/ico/doc.png new file mode 100644 index 00000000..4d6a6303 Binary files /dev/null and b/public/panel/style/ico/doc.png differ diff --git a/public/panel/style/ico/eps.png b/public/panel/style/ico/eps.png new file mode 100644 index 00000000..3c726744 Binary files /dev/null and b/public/panel/style/ico/eps.png differ diff --git a/public/panel/style/ico/exe.png b/public/panel/style/ico/exe.png new file mode 100644 index 00000000..3cfefa5f Binary files /dev/null and b/public/panel/style/ico/exe.png differ diff --git a/public/panel/style/ico/fla.png b/public/panel/style/ico/fla.png new file mode 100644 index 00000000..c59132b1 Binary files /dev/null and b/public/panel/style/ico/fla.png differ diff --git a/public/panel/style/ico/fonts.png b/public/panel/style/ico/fonts.png new file mode 100644 index 00000000..9637fd06 Binary files /dev/null and b/public/panel/style/ico/fonts.png differ diff --git a/public/panel/style/ico/ipa.png b/public/panel/style/ico/ipa.png new file mode 100644 index 00000000..97906a87 Binary files /dev/null and b/public/panel/style/ico/ipa.png differ diff --git a/public/panel/style/ico/keynote.png b/public/panel/style/ico/keynote.png new file mode 100644 index 00000000..d2d74300 Binary files /dev/null and b/public/panel/style/ico/keynote.png differ diff --git a/public/panel/style/ico/links.png b/public/panel/style/ico/links.png new file mode 100644 index 00000000..e674c448 Binary files /dev/null and b/public/panel/style/ico/links.png differ diff --git a/public/panel/style/ico/misc.png b/public/panel/style/ico/misc.png new file mode 100644 index 00000000..86f8d4a1 Binary files /dev/null and b/public/panel/style/ico/misc.png differ diff --git a/public/panel/style/ico/mm.png b/public/panel/style/ico/mm.png new file mode 100644 index 00000000..5e86ed7e Binary files /dev/null and b/public/panel/style/ico/mm.png differ diff --git a/public/panel/style/ico/mmap.png b/public/panel/style/ico/mmap.png new file mode 100644 index 00000000..ffeb9152 Binary files /dev/null and b/public/panel/style/ico/mmap.png differ diff --git a/public/panel/style/ico/mp3.png b/public/panel/style/ico/mp3.png new file mode 100644 index 00000000..c946e36d Binary files /dev/null and b/public/panel/style/ico/mp3.png differ diff --git a/public/panel/style/ico/mp4.png b/public/panel/style/ico/mp4.png new file mode 100644 index 00000000..f4c5985d Binary files /dev/null and b/public/panel/style/ico/mp4.png differ diff --git a/public/panel/style/ico/null.jpg b/public/panel/style/ico/null.jpg new file mode 100644 index 00000000..347ff002 Binary files /dev/null and b/public/panel/style/ico/null.jpg differ diff --git a/public/panel/style/ico/number.png b/public/panel/style/ico/number.png new file mode 100644 index 00000000..bc7b8461 Binary files /dev/null and b/public/panel/style/ico/number.png differ diff --git a/public/panel/style/ico/pages.png b/public/panel/style/ico/pages.png new file mode 100644 index 00000000..5a8311b1 Binary files /dev/null and b/public/panel/style/ico/pages.png differ diff --git a/public/panel/style/ico/pdf.png b/public/panel/style/ico/pdf.png new file mode 100644 index 00000000..c61c3b42 Binary files /dev/null and b/public/panel/style/ico/pdf.png differ diff --git a/public/panel/style/ico/ppt.png b/public/panel/style/ico/ppt.png new file mode 100644 index 00000000..880e1100 Binary files /dev/null and b/public/panel/style/ico/ppt.png differ diff --git a/public/panel/style/ico/ps.png b/public/panel/style/ico/ps.png new file mode 100644 index 00000000..e5b8c2b0 Binary files /dev/null and b/public/panel/style/ico/ps.png differ diff --git a/public/panel/style/ico/rar.png b/public/panel/style/ico/rar.png new file mode 100644 index 00000000..8d5e449b Binary files /dev/null and b/public/panel/style/ico/rar.png differ diff --git a/public/panel/style/ico/txt.png b/public/panel/style/ico/txt.png new file mode 100644 index 00000000..6ba8a57b Binary files /dev/null and b/public/panel/style/ico/txt.png differ diff --git a/public/panel/style/ico/visio.png b/public/panel/style/ico/visio.png new file mode 100644 index 00000000..69de994a Binary files /dev/null and b/public/panel/style/ico/visio.png differ diff --git a/public/panel/style/ico/web.png b/public/panel/style/ico/web.png new file mode 100644 index 00000000..de53090c Binary files /dev/null and b/public/panel/style/ico/web.png differ diff --git a/public/panel/style/ico/xls.png b/public/panel/style/ico/xls.png new file mode 100644 index 00000000..47d8aed4 Binary files /dev/null and b/public/panel/style/ico/xls.png differ diff --git a/public/panel/style/ico/xmind.png b/public/panel/style/ico/xmind.png new file mode 100644 index 00000000..c3d2ea70 Binary files /dev/null and b/public/panel/style/ico/xmind.png differ diff --git a/public/panel/style/ico/zip.png b/public/panel/style/ico/zip.png new file mode 100644 index 00000000..8d5e449b Binary files /dev/null and b/public/panel/style/ico/zip.png differ diff --git a/resources/views/cron.blade.php b/resources/views/cron.blade.php index d2f5ca45..3a2125cf 100644 --- a/resources/views/cron.blade.php +++ b/resources/views/cron.blade.php @@ -95,7 +95,7 @@ , {field: 'updated_at', title: '上次运行时间'} , { field: 'edit', - width: 170, + width: 180, title: '操作', templet: '#cron-table-edit', fixed: 'right', diff --git a/resources/views/file.blade.php b/resources/views/file.blade.php index 5804966d..dba044bd 100644 --- a/resources/views/file.blade.php +++ b/resources/views/file.blade.php @@ -1,2 +1,48 @@ + 文件管理 -

    文件管理正在开发中!

    \ No newline at end of file +
    +
    +
    该功能尚未完成开发,请等待!(推荐使用sftp临时代替)
    +
    +
    +
    +
    +
    +
    +
    + diff --git a/resources/views/website/list.blade.php b/resources/views/website/list.blade.php index 49224c89..dbb3a41f 100644 --- a/resources/views/website/list.blade.php +++ b/resources/views/website/list.blade.php @@ -85,12 +85,9 @@ Date: 2022-11-28 , {field: 'php', title: 'PHP', width: 60} , {field: 'ssl', title: 'SSL', width: 110, templet: '#website-ssl'} , {field: 'note', title: '备注', edit: 'textarea'} - , {fixed: 'right', title: '操作', unresize: true, toolbar: '#website-control', width: 160} + , {fixed: 'right', title: '操作', unresize: true, toolbar: '#website-control', width: 180} ]] - /** - * TODO: 分页 - */ - //, page: true + , page: true }); // 头工具栏事件 diff --git a/routes/api.php b/routes/api.php index 6cb6f210..987a40b8 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,6 +1,7 @@ group(function () { Route::get('getInstalledDbAndPhp', [InfosController::class, 'getInstalledDbAndPhp']); }); - // 网站 + // 网站管理 Route::middleware('auth:sanctum')->prefix('website')->group(function () { - // 获取网站列表 + // 获取默认设置 Route::get('getDefaultSettings', [WebsitesController::class, 'getDefaultSettings']); + // 保存默认设置 Route::post('saveDefaultSettings', [WebsitesController::class, 'saveDefaultSettings']); + // 获取网站列表 Route::get('getList', [WebsitesController::class, 'getList']); + // 添加网站 Route::post('add', [WebsitesController::class, 'add']); + // 删除网站 Route::post('delete', [WebsitesController::class, 'delete']); + // 获取网站设置 Route::get('getSiteSettings', [WebsitesController::class, 'getSiteSettings']); + // 保存网站设置 Route::post('saveSiteSettings', [WebsitesController::class, 'saveSiteSettings']); + // 清空网站日志 Route::post('clearSiteLog', [WebsitesController::class, 'clearSiteLog']); + // 更新网站备注 Route::post('updateSiteNote', [WebsitesController::class, 'updateSiteNote']); + // 设置网站状态 Route::post('setSiteStatus', [WebsitesController::class, 'setSiteStatus']); // 获取备份列表 Route::get('getBackupList', [WebsitesController::class, 'getBackupList']); + // 创建备份 Route::post('createBackup', [WebsitesController::class, 'createBackup']); + // 上传备份 Route::post('uploadBackup', [WebsitesController::class, 'uploadBackup']); + // 恢复备份 Route::post('restoreBackup', [WebsitesController::class, 'restoreBackup']); + // 删除备份 Route::post('deleteBackup', [WebsitesController::class, 'deleteBackup']); // 重置网站配置 Route::post('resetSiteConfig', [WebsitesController::class, 'resetSiteConfig']); // 签发SSL证书 Route::post('issueSsl', [WebsitesController::class, 'issueSsl']); }); - // 监控 + // 资源监控 Route::middleware('auth:sanctum')->prefix('monitor')->group(function () { // 获取监控数据 Route::get('getMonitorData', [MonitorsController::class, 'getMonitorData']); @@ -100,7 +113,7 @@ Route::prefix('panel')->group(function () { // 清空监控数据 Route::post('clearMonitorData', [MonitorsController::class, 'clearMonitorData']); }); - // 安全 + // 系统安全 Route::middleware('auth:sanctum')->prefix('safe')->group(function () { // 获取防火墙状态 Route::get('getFirewallStatus', [SafesController::class, 'getFirewallStatus']); @@ -125,26 +138,40 @@ Route::prefix('panel')->group(function () { // 删除防火墙规则 Route::post('deleteFirewallRule', [SafesController::class, 'deleteFirewallRule']); }); - // 插件 - Route::middleware('auth:sanctum')->prefix('plugin')->group(function () { - // 获取插件列表 - Route::get('getList', [PluginsController::class, 'getList']); - Route::post('install', [PluginsController::class, 'install']); - Route::post('uninstall', [PluginsController::class, 'uninstall']); - Route::post('update', [PluginsController::class, 'update']); - Route::post('setShowHome', [PluginsController::class, 'setShowHome']); + // 文件管理 + Route::middleware('auth:sanctum')->prefix('file')->group(function () { + // 获取文件(夹)列表 + Route::get('getList', [FilesController::class, 'getList']); }); // 计划任务 Route::middleware('auth:sanctum')->prefix('cron')->group(function () { // 获取计划任务列表 Route::get('getList', [CronsController::class, 'getList']); + // 添加计划任务 Route::post('add', [CronsController::class, 'add']); + // 编辑计划任务 Route::post('edit', [CronsController::class, 'edit']); + // 删除计划任务 Route::post('delete', [CronsController::class, 'delete']); + // 设置计划任务状态 Route::post('setStatus', [CronsController::class, 'setStatus']); + // 获取计划任务日志 Route::get('getLog', [CronsController::class, 'getLog']); }); - // 设置 + // 插件中心 + Route::middleware('auth:sanctum')->prefix('plugin')->group(function () { + // 获取插件列表 + Route::get('getList', [PluginsController::class, 'getList']); + // 安装插件 + Route::post('install', [PluginsController::class, 'install']); + // 卸载插件 + Route::post('uninstall', [PluginsController::class, 'uninstall']); + // 更新插件 + Route::post('update', [PluginsController::class, 'update']); + // 设置插件首页显示 + Route::post('setShowHome', [PluginsController::class, 'setShowHome']); + }); + // 面板设置 Route::middleware('auth:sanctum')->prefix('setting')->group(function () { // 获取设置 Route::get('get', [SettingsController::class, 'get']); @@ -152,4 +179,3 @@ Route::prefix('panel')->group(function () { Route::post('save', [SettingsController::class, 'save']); }); }); -