This commit is contained in:
wushumin
2026-05-11 15:28:27 +08:00
commit 9aac78b8da
289 changed files with 67193 additions and 0 deletions

26
server-api/config/app.php Normal file
View File

@@ -0,0 +1,26 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use support\Request;
return [
'debug' => true,
'error_reporting' => E_ALL,
'default_timezone' => 'Asia/Shanghai',
'request_class' => Request::class,
'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public',
'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime',
'controller_suffix' => 'Controller',
'controller_reuse' => false,
];

View File

@@ -0,0 +1,21 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'files' => [
base_path() . '/app/functions.php',
base_path() . '/support/Request.php',
base_path() . '/support/Response.php',
]
];

View File

@@ -0,0 +1,19 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
app\bootstrap\Dotenv::class,
support\bootstrap\Session::class,
Webman\ThinkOrm\ThinkOrm::class,
];

View File

@@ -0,0 +1,15 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return new Webman\Container;

View File

@@ -0,0 +1,15 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [];

View File

@@ -0,0 +1,17 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'' => support\exception\Handler::class,
];

32
server-api/config/log.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'default' => [
'handlers' => [
[
'class' => Monolog\Handler\RotatingFileHandler::class,
'constructor' => [
runtime_path() . '/logs/webman.log',
7, //$maxFiles
Monolog\Logger::DEBUG,
],
'formatter' => [
'class' => Monolog\Formatter\LineFormatter::class,
'constructor' => [null, 'Y-m-d H:i:s', true],
],
]
],
],
];

View File

@@ -0,0 +1,21 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'' => [
app\middleware\CorsMiddleware::class,
app\middleware\AppAuthMiddleware::class,
app\middleware\AdminAuthMiddleware::class,
],
];

View File

@@ -0,0 +1,4 @@
<?php
return [
'enable' => true,
];

View File

@@ -0,0 +1,7 @@
<?php
use Webman\RedisQueue\Command\MakeConsumerCommand;
return [
MakeConsumerCommand::class
];

View File

@@ -0,0 +1,32 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'default' => [
'handlers' => [
[
'class' => Monolog\Handler\RotatingFileHandler::class,
'constructor' => [
runtime_path() . '/logs/redis-queue/queue.log',
7, //$maxFiles
Monolog\Logger::DEBUG,
],
'formatter' => [
'class' => Monolog\Formatter\LineFormatter::class,
'constructor' => [null, 'Y-m-d H:i:s', true],
],
]
],
]
];

View File

@@ -0,0 +1,11 @@
<?php
return [
'consumer' => [
'handler' => Webman\RedisQueue\Process\Consumer::class,
'count' => 8, // 可以设置多进程同时消费
'constructor' => [
// 消费者类目录
'consumer_dir' => app_path() . '/queue/redis'
]
]
];

View File

@@ -0,0 +1,25 @@
<?php
return [
'default' => [
'host' => sprintf(
'redis://%s:%s',
$_ENV['REDIS_HOST'] ?? '127.0.0.1',
$_ENV['REDIS_PORT'] ?? '6379'
),
'options' => [
'auth' => $_ENV['REDIS_PASSWORD'] ?? null,
'db' => (int)($_ENV['REDIS_DB'] ?? 0),
'prefix' => $_ENV['REDIS_PREFIX'] ?? '',
'max_attempts' => 5,
'retry_seconds' => 5,
],
// Connection pool, supports only Swoole or Swow drivers.
'pool' => [
'max_connections' => 5,
'min_connections' => 1,
'wait_timeout' => 3,
'idle_timeout' => 60,
'heartbeat_interval' => 50,
]
],
];

View File

@@ -0,0 +1,62 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use support\Log;
use support\Request;
use app\process\Http;
global $argv;
return [
'webman' => [
'handler' => Http::class,
'listen' => 'http://0.0.0.0:8787',
'count' => cpu_count() * 4,
'user' => '',
'group' => '',
'reusePort' => false,
'eventLoop' => '',
'context' => [],
'constructor' => [
'requestClass' => Request::class,
'logger' => Log::channel('default'),
'appPath' => app_path(),
'publicPath' => public_path()
]
],
// File update detection and automatic reload
'monitor' => [
'handler' => app\process\Monitor::class,
'reloadable' => false,
'constructor' => [
// Monitor these directories
'monitorDir' => array_merge([
app_path(),
config_path(),
base_path() . '/process',
base_path() . '/support',
base_path() . '/resource',
base_path() . '/.env',
], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')),
// Files with these suffixes will be monitored
'monitorExtensions' => [
'php', 'html', 'htm', 'env'
],
'options' => [
'enable_file_monitor' => !in_array('-d', $argv) && DIRECTORY_SEPARATOR === '/',
'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
]
]
]
];

275
server-api/config/route.php Normal file
View File

@@ -0,0 +1,275 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use Webman\Route;
use app\controller\app\HomeController;
use app\controller\app\CatalogController;
use app\controller\app\AppraisalController;
use app\controller\app\OrdersController;
use app\controller\app\ReportsController;
use app\controller\app\VerifyController;
use app\controller\app\MaterialTagsController as AppMaterialTagsController;
use app\controller\app\MessagesController as AppMessagesController;
use app\controller\app\SupplementController as AppSupplementController;
use app\controller\app\TicketsController as AppTicketsController;
use app\controller\app\ShippingController as AppShippingController;
use app\controller\app\AddressesController as AppAddressesController;
use app\controller\app\HelpCenterController as AppHelpCenterController;
use app\controller\app\SettingsController as AppSettingsController;
use app\controller\app\AuthController as AppAuthController;
use app\controller\app\MineController as AppMineController;
use app\controller\admin\DashboardController as AdminDashboardController;
use app\controller\admin\OrdersController as AdminOrdersController;
use app\controller\admin\CatalogController as AdminCatalogController;
use app\controller\admin\ReportsController as AdminReportsController;
use app\controller\admin\AppraisalTasksController as AdminAppraisalTasksController;
use app\controller\admin\MessagesController as AdminMessagesController;
use app\controller\admin\TicketsController as AdminTicketsController;
use app\controller\admin\UsersController as AdminUsersController;
use app\controller\admin\WarehousesController as AdminWarehousesController;
use app\controller\admin\MaterialsController as AdminMaterialsController;
use app\controller\admin\AccessController as AdminAccessController;
use app\controller\admin\ContentsController as AdminContentsController;
use app\controller\admin\SystemConfigsController as AdminSystemConfigsController;
use app\controller\admin\AuthController as AdminAuthController;
use app\controller\admin\CustomersController as AdminCustomersController;
use app\controller\open\OrdersController as OpenOrdersController;
Route::get('/', [app\controller\IndexController::class, 'json']);
Route::options('/api/app/appraisal/draft/create', function () {
return response('', 204);
});
Route::options('/api/app/appraisal/draft/save', function () {
return response('', 204);
});
Route::options('/api/app/appraisal/file/upload', function () {
return response('', 204);
});
Route::options('/api/app/appraisal/file/delete', function () {
return response('', 204);
});
Route::options('/api/app/appraisal/preview', function () {
return response('', 204);
});
Route::options('/api/app/appraisal/submit', function () {
return response('', 204);
});
Route::options('/api/app/message/read', function () {
return response('', 204);
});
Route::options('/api/app/messages/read-all', function () {
return response('', 204);
});
Route::options('/api/app/order/supplement/file/upload', function () {
return response('', 204);
});
Route::options('/api/app/order/supplement/file/delete', function () {
return response('', 204);
});
Route::options('/api/app/order/supplement/submit', function () {
return response('', 204);
});
Route::options('/api/app/ticket/create', function () {
return response('', 204);
});
Route::options('/api/app/ticket/reply', function () {
return response('', 204);
});
Route::options('/api/app/ticket/file/upload', function () {
return response('', 204);
});
Route::options('/api/app/ticket/file/delete', function () {
return response('', 204);
});
Route::options('/api/app/order/shipping/save', function () {
return response('', 204);
});
Route::options('/api/app/order/return-address/save', function () {
return response('', 204);
});
Route::options('/api/app/address/save', function () {
return response('', 204);
});
Route::options('/api/app/address/default', function () {
return response('', 204);
});
Route::options('/api/app/address/delete', function () {
return response('', 204);
});
Route::options('/api/app/settings/save', function () {
return response('', 204);
});
Route::options('/api/app/{path:.+}', function () {
return response('', 204);
});
Route::options('/api/app/auth/{path:.+}', function () {
return response('', 204);
});
Route::options('/api/admin/{path:.+}', function () {
return response('', 204);
});
Route::options('/api/open/v1/{path:.+}', function () {
return response('', 204);
});
Route::get('/api/app/home/index', [HomeController::class, 'index']);
Route::get('/api/app/content/page-visuals', [HomeController::class, 'pageVisuals']);
Route::get('/api/app/catalog/categories', [CatalogController::class, 'categories']);
Route::get('/api/app/catalog/brands', [CatalogController::class, 'brands']);
Route::post('/api/app/appraisal/draft/create', [AppraisalController::class, 'createDraft']);
Route::get('/api/app/appraisal/draft', [AppraisalController::class, 'draftDetail']);
Route::post('/api/app/appraisal/draft/save', [AppraisalController::class, 'saveDraft']);
Route::post('/api/app/appraisal/file/upload', [AppraisalController::class, 'uploadFile']);
Route::post('/api/app/appraisal/file/delete', [AppraisalController::class, 'deleteFile']);
Route::get('/api/app/appraisal/upload-template', [AppraisalController::class, 'uploadTemplate']);
Route::post('/api/app/appraisal/preview', [AppraisalController::class, 'preview']);
Route::post('/api/app/appraisal/submit', [AppraisalController::class, 'submit']);
Route::get('/api/app/orders', [OrdersController::class, 'index']);
Route::get('/api/app/order/detail', [OrdersController::class, 'detail']);
Route::post('/api/app/order/return-address/save', [OrdersController::class, 'saveReturnAddress']);
Route::get('/api/app/reports', [ReportsController::class, 'index']);
Route::get('/api/app/report/detail', [ReportsController::class, 'detail']);
Route::get('/api/app/verify', [VerifyController::class, 'show']);
Route::get('/api/app/material-tag', [AppMaterialTagsController::class, 'show']);
Route::post('/api/app/material-tag/verify', [AppMaterialTagsController::class, 'verify']);
Route::get('/api/app/help-center', [AppHelpCenterController::class, 'index']);
Route::get('/api/app/help-article/detail', [AppHelpCenterController::class, 'detail']);
Route::post('/api/app/auth/send-code', [AppAuthController::class, 'sendCode']);
Route::post('/api/app/auth/login/code', [AppAuthController::class, 'loginByCode']);
Route::post('/api/app/auth/login/password', [AppAuthController::class, 'loginByPassword']);
Route::get('/api/app/auth/me', [AppAuthController::class, 'me']);
Route::post('/api/app/auth/password/save', [AppAuthController::class, 'savePassword']);
Route::post('/api/app/auth/logout', [AppAuthController::class, 'logout']);
Route::get('/api/app/mine/overview', [AppMineController::class, 'overview']);
Route::get('/api/app/settings', [AppSettingsController::class, 'detail']);
Route::post('/api/app/settings/save', [AppSettingsController::class, 'save']);
Route::get('/api/app/messages/summary', [AppMessagesController::class, 'summary']);
Route::get('/api/app/messages/meta', [AppMessagesController::class, 'meta']);
Route::get('/api/app/messages', [AppMessagesController::class, 'index']);
Route::post('/api/app/message/read', [AppMessagesController::class, 'read']);
Route::post('/api/app/messages/read-all', [AppMessagesController::class, 'readAll']);
Route::get('/api/app/order/supplement', [AppSupplementController::class, 'detail']);
Route::post('/api/app/order/supplement/file/upload', [AppSupplementController::class, 'uploadFile']);
Route::post('/api/app/order/supplement/file/delete', [AppSupplementController::class, 'deleteFile']);
Route::post('/api/app/order/supplement/submit', [AppSupplementController::class, 'submit']);
Route::get('/api/app/tickets/overview', [AppTicketsController::class, 'overview']);
Route::get('/api/app/ticket/meta', [AppTicketsController::class, 'meta']);
Route::get('/api/app/tickets', [AppTicketsController::class, 'index']);
Route::get('/api/app/ticket/detail', [AppTicketsController::class, 'detail']);
Route::post('/api/app/ticket/create', [AppTicketsController::class, 'create']);
Route::post('/api/app/ticket/reply', [AppTicketsController::class, 'reply']);
Route::post('/api/app/ticket/file/upload', [AppTicketsController::class, 'uploadFile']);
Route::post('/api/app/ticket/file/delete', [AppTicketsController::class, 'deleteFile']);
Route::get('/api/app/order/shipping', [AppShippingController::class, 'detail']);
Route::post('/api/app/order/shipping/save', [AppShippingController::class, 'save']);
Route::get('/api/app/addresses', [AppAddressesController::class, 'index']);
Route::get('/api/app/address/detail', [AppAddressesController::class, 'detail']);
Route::post('/api/app/address/save', [AppAddressesController::class, 'save']);
Route::post('/api/app/address/default', [AppAddressesController::class, 'setDefault']);
Route::post('/api/app/address/delete', [AppAddressesController::class, 'delete']);
Route::post('/api/open/v1/orders', [OpenOrdersController::class, 'create']);
Route::get('/api/open/v1/orders', [OpenOrdersController::class, 'detail']);
Route::get('/api/open/v1/orders/{external_order_no}', [OpenOrdersController::class, 'detail']);
Route::get('/api/admin/ping', function () {
return api_success(['pong' => true]);
});
Route::post('/api/admin/auth/login', [AdminAuthController::class, 'login']);
Route::get('/api/admin/auth/me', [AdminAuthController::class, 'me']);
Route::post('/api/admin/auth/logout', [AdminAuthController::class, 'logout']);
Route::get('/api/admin/dashboard', [AdminDashboardController::class, 'index']);
Route::get('/api/admin/orders', [AdminOrdersController::class, 'index']);
Route::get('/api/admin/order/detail', [AdminOrdersController::class, 'detail']);
Route::get('/api/admin/order/warehouse/options', [AdminOrdersController::class, 'warehouseOptions']);
Route::post('/api/admin/order/warehouse/reassign', [AdminOrdersController::class, 'reassignWarehouse']);
Route::post('/api/admin/order/logistics/receive', [AdminOrdersController::class, 'receiveLogistics']);
Route::post('/api/admin/order/return-logistics/save', [AdminOrdersController::class, 'saveReturnLogistics']);
Route::post('/api/admin/order/return-logistics/receive', [AdminOrdersController::class, 'receiveReturnLogistics']);
Route::get('/api/admin/catalog/overview', [AdminCatalogController::class, 'overview']);
Route::get('/api/admin/catalog/categories', [AdminCatalogController::class, 'categories']);
Route::get('/api/admin/catalog/brands', [AdminCatalogController::class, 'brands']);
Route::get('/api/admin/catalog/upload-templates', [AdminCatalogController::class, 'uploadTemplates']);
Route::get('/api/admin/catalog/appraisal-templates', [AdminCatalogController::class, 'appraisalTemplates']);
Route::post('/api/admin/catalog/upload-template/sample-image/upload', [AdminCatalogController::class, 'uploadTemplateSampleImage']);
Route::post('/api/admin/catalog/upload-template/sample-image/delete', [AdminCatalogController::class, 'deleteUploadTemplateSampleImage']);
Route::post('/api/admin/catalog/category/save', [AdminCatalogController::class, 'saveCategory']);
Route::post('/api/admin/catalog/brand/save', [AdminCatalogController::class, 'saveBrand']);
Route::post('/api/admin/catalog/upload-templates/save', [AdminCatalogController::class, 'saveUploadTemplates']);
Route::post('/api/admin/catalog/appraisal-templates/save', [AdminCatalogController::class, 'saveAppraisalTemplates']);
Route::get('/api/admin/reports', [AdminReportsController::class, 'index']);
Route::get('/api/admin/report/detail', [AdminReportsController::class, 'detail']);
Route::post('/api/admin/report/inspection/save', [AdminReportsController::class, 'saveInspection']);
Route::post('/api/admin/report/publish', [AdminReportsController::class, 'publish']);
Route::get('/api/admin/appraisal-tasks', [AdminAppraisalTasksController::class, 'index']);
Route::get('/api/admin/appraisal-task/detail', [AdminAppraisalTasksController::class, 'detail']);
Route::get('/api/admin/appraisal-task/assignable-admins', [AdminAppraisalTasksController::class, 'assignableAdmins']);
Route::post('/api/admin/appraisal-task/assign', [AdminAppraisalTasksController::class, 'assign']);
Route::post('/api/admin/appraisal-task/save-result', [AdminAppraisalTasksController::class, 'saveResult']);
Route::post('/api/admin/appraisal-task/material-tag/bind', [AdminAppraisalTasksController::class, 'bindMaterialTag']);
Route::post('/api/admin/appraisal-task/request-supplement', [AdminAppraisalTasksController::class, 'requestSupplement']);
Route::post('/api/admin/appraisal-task/evidence/upload', [AdminAppraisalTasksController::class, 'uploadEvidenceFile']);
Route::post('/api/admin/appraisal-task/evidence/delete', [AdminAppraisalTasksController::class, 'deleteEvidenceFile']);
Route::get('/api/admin/messages/overview', [AdminMessagesController::class, 'overview']);
Route::get('/api/admin/messages/templates', [AdminMessagesController::class, 'templates']);
Route::get('/api/admin/messages/logs', [AdminMessagesController::class, 'logs']);
Route::post('/api/admin/messages/template/save', [AdminMessagesController::class, 'saveTemplate']);
Route::get('/api/admin/tickets/overview', [AdminTicketsController::class, 'overview']);
Route::get('/api/admin/tickets', [AdminTicketsController::class, 'index']);
Route::get('/api/admin/ticket/detail', [AdminTicketsController::class, 'detail']);
Route::post('/api/admin/ticket/save', [AdminTicketsController::class, 'save']);
Route::post('/api/admin/ticket/reply', [AdminTicketsController::class, 'reply']);
Route::post('/api/admin/ticket/file/upload', [AdminTicketsController::class, 'uploadFile']);
Route::post('/api/admin/ticket/file/delete', [AdminTicketsController::class, 'deleteFile']);
Route::get('/api/admin/users/overview', [AdminUsersController::class, 'overview']);
Route::get('/api/admin/users', [AdminUsersController::class, 'index']);
Route::get('/api/admin/user/detail', [AdminUsersController::class, 'detail']);
Route::post('/api/admin/user/save', [AdminUsersController::class, 'save']);
Route::get('/api/admin/customers', [AdminCustomersController::class, 'index']);
Route::get('/api/admin/customer/detail', [AdminCustomersController::class, 'detail']);
Route::post('/api/admin/customer/save', [AdminCustomersController::class, 'save']);
Route::post('/api/admin/customer/app/create', [AdminCustomersController::class, 'createApp']);
Route::post('/api/admin/customer/app/status', [AdminCustomersController::class, 'updateAppStatus']);
Route::post('/api/admin/customer/app/reset-secret', [AdminCustomersController::class, 'resetAppSecret']);
Route::get('/api/admin/customer/orders', [AdminCustomersController::class, 'orders']);
Route::get('/api/admin/customer/order/progress', [AdminCustomersController::class, 'orderProgress']);
Route::get('/api/admin/customer/events', [AdminCustomersController::class, 'events']);
Route::get('/api/admin/customer/deliveries', [AdminCustomersController::class, 'deliveries']);
Route::post('/api/admin/customer/event/resend', [AdminCustomersController::class, 'resendEvent']);
Route::get('/api/admin/warehouses/overview', [AdminWarehousesController::class, 'overview']);
Route::get('/api/admin/warehouses', [AdminWarehousesController::class, 'index']);
Route::post('/api/admin/warehouse/save', [AdminWarehousesController::class, 'save']);
Route::get('/api/admin/material/batches', [AdminMaterialsController::class, 'batches']);
Route::get('/api/admin/material/batch/detail', [AdminMaterialsController::class, 'detail']);
Route::post('/api/admin/material/batch/create', [AdminMaterialsController::class, 'create']);
Route::get('/api/admin/material/batch/download', [AdminMaterialsController::class, 'download']);
Route::get('/api/admin/access/overview', [AdminAccessController::class, 'overview']);
Route::get('/api/admin/access/admins', [AdminAccessController::class, 'admins']);
Route::get('/api/admin/access/roles', [AdminAccessController::class, 'roles']);
Route::get('/api/admin/access/permissions', [AdminAccessController::class, 'permissions']);
Route::post('/api/admin/access/admin/save', [AdminAccessController::class, 'saveAdmin']);
Route::post('/api/admin/access/role/save', [AdminAccessController::class, 'saveRole']);
Route::get('/api/admin/content/bootstrap', [AdminContentsController::class, 'bootstrap']);
Route::get('/api/admin/content/home', [AdminContentsController::class, 'home']);
Route::post('/api/admin/content/image/upload', [AdminContentsController::class, 'uploadImage']);
Route::post('/api/admin/content/home/save', [AdminContentsController::class, 'saveHome']);
Route::get('/api/admin/content/policy', [AdminContentsController::class, 'policy']);
Route::post('/api/admin/content/policy/save', [AdminContentsController::class, 'savePolicy']);
Route::get('/api/admin/content/meta', [AdminContentsController::class, 'meta']);
Route::post('/api/admin/content/meta/save', [AdminContentsController::class, 'saveMeta']);
Route::get('/api/admin/content/help/articles', [AdminContentsController::class, 'helpArticles']);
Route::post('/api/admin/content/help/article/save', [AdminContentsController::class, 'saveHelpArticle']);
Route::post('/api/admin/content/help/article/delete', [AdminContentsController::class, 'deleteHelpArticle']);
Route::get('/api/admin/system-configs', [AdminSystemConfigsController::class, 'index']);
Route::post('/api/admin/system-configs/upload-file', [AdminSystemConfigsController::class, 'uploadFile']);
Route::post('/api/admin/system-configs/save', [AdminSystemConfigsController::class, 'save']);

View File

@@ -0,0 +1,23 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
return [
'event_loop' => '',
'stop_timeout' => 2,
'pid_file' => runtime_path() . '/webman.pid',
'status_file' => runtime_path() . '/webman.status',
'stdout_file' => runtime_path() . '/logs/stdout.log',
'log_file' => runtime_path() . '/logs/workerman.log',
'max_package_size' => 10 * 1024 * 1024
];

View File

@@ -0,0 +1,65 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
'type' => 'file', // or redis or redis_cluster
'handler' => FileSessionHandler::class,
'config' => [
'file' => [
'save_path' => runtime_path() . '/sessions',
],
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'auth' => '',
'timeout' => 2,
'database' => '',
'prefix' => 'redis_session_',
],
'redis_cluster' => [
'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
'timeout' => 2,
'auth' => '',
'prefix' => 'redis_session_',
]
],
'session_name' => 'PHPSID',
'auto_update_timestamp' => false,
'lifetime' => 7*24*60*60,
'cookie_lifetime' => 365*24*60*60,
'cookie_path' => '/',
'domain' => '',
'http_only' => true,
'secure' => false,
'same_site' => '',
'gc_probability' => [1, 1000],
];

View File

@@ -0,0 +1,23 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
/**
* Static file settings
*/
return [
'enable' => true,
'middleware' => [ // Static file Middleware
//app\middleware\StaticFile::class,
],
];

View File

@@ -0,0 +1,42 @@
<?php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => $_ENV['DB_HOST'] ?? '127.0.0.1',
// 数据库名
'database' => $_ENV['DB_DATABASE'] ?? 'test',
// 数据库用户名
'username' => $_ENV['DB_USERNAME'] ?? 'root',
// 数据库密码
'password' => $_ENV['DB_PASSWORD'] ?? '',
// 数据库连接端口
'hostport' => $_ENV['DB_PORT'] ?? '3306',
// 数据库连接参数
'params' => [
// 连接超时3秒
\PDO::ATTR_TIMEOUT => 3,
],
// 数据库编码默认采用utf8
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4',
// 数据库表前缀
'prefix' => $_ENV['DB_PREFIX'] ?? '',
// 断线重连
'break_reconnect' => true,
// 连接池配置
'pool' => [
'max_connections' => 5, // 最大连接数
'min_connections' => 1, // 最小连接数
'wait_timeout' => 3, // 从连接池获取连接等待超时时间
'idle_timeout' => 60, // 连接最大空闲时间,超过该时间会被回收
'heartbeat_interval' => 50, // 心跳检测间隔需要小于60秒
],
],
],
// 自定义分页类
'paginator' => '',
];

View File

@@ -0,0 +1,25 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
/**
* Multilingual configuration
*/
return [
// Default language
'locale' => 'zh_CN',
// Fallback language
'fallback_locale' => ['zh_CN', 'en'],
// Folder where language files are stored
'path' => base_path() . '/resource/translations',
];

View File

@@ -0,0 +1,22 @@
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use support\view\Raw;
use support\view\Twig;
use support\view\Blade;
use support\view\ThinkPHP;
return [
'handler' => Raw::class
];