转换到 Laravel

This commit is contained in:
iVampireSP.com 2022-11-06 19:28:22 +08:00
parent f700106e60
commit dc963e943f
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
171 changed files with 4346 additions and 7769 deletions

View File

@ -3,9 +3,9 @@ root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
@ -13,3 +13,6 @@ trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4

View File

@ -1,39 +1,62 @@
APP_NAME=Lumen
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lae
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
MONGO_DB_HOST=127.0.0.1
MONGO_DB_PORT=27017
MONGO_DB_DATABASE=
MONGO_DB_USERNAME=
MONGO_DB_PASSWORD=
MONGO_DB_AUTHENTICATION_DATABASE=admin
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
BROADCAST_DRIVER=redis
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
PUSHER_APP_KEY=app-key
PUSHER_APP_ID=app-id
PUSHER_APP_SECRET=app-secret
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
VITE_PUSHER_HOST="${PUSHER_HOST}"
VITE_PUSHER_PORT="${PUSHER_PORT}"
VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"
VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
LARAVELS_LISTEN_IP=127.0.0.0
ALIPAY_APP_ID=

11
.gitattributes vendored Normal file
View File

@ -0,0 +1,11 @@
* text=auto
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore

18
.gitignore vendored
View File

@ -1,6 +1,18 @@
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
.env
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
.env
.phpunit.result.cache
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode

View File

@ -1,6 +0,0 @@
php:
preset: laravel
disabled:
- unused_use
js: true
css: true

View File

@ -1,24 +1,66 @@
# Lumen PHP Framework
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
[![Build Status](https://travis-ci.org/laravel/lumen-framework.svg)](https://travis-ci.org/laravel/lumen-framework)
[![Total Downloads](https://img.shields.io/packagist/dt/laravel/lumen-framework)](https://packagist.org/packages/laravel/lumen-framework)
[![Latest Stable Version](https://img.shields.io/packagist/v/laravel/lumen-framework)](https://packagist.org/packages/laravel/lumen-framework)
[![License](https://img.shields.io/packagist/l/laravel/lumen)](https://packagist.org/packages/laravel/lumen-framework)
<p align="center">
<a href="https://travis-ci.org/laravel/framework"><img src="https://travis-ci.org/laravel/framework.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
Laravel Lumen is a stunningly fast PHP micro-framework for building web applications with expressive, elegant syntax. We believe development must be an enjoyable, creative experience to be truly fulfilling. Lumen attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as routing, database abstraction, queueing, and caching.
## About Laravel
## Official Documentation
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
Documentation for the framework can be found on the [Lumen website](https://lumen.laravel.com/docs).
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Cubet Techno Labs](https://cubettech.com)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[Many](https://www.many.co.uk)**
- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**
- **[DevSquad](https://devsquad.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[OP.GG](https://op.gg)**
- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)**
- **[Lendio](https://lendio.com)**
## Contributing
Thank you for considering contributing to Lumen! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Lumen, please send an e-mail to Taylor Otwell at taylor@laravel.com. All security vulnerabilities will be promptly addressed.
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Lumen framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).

View File

@ -2,9 +2,9 @@
namespace App\Console\Commands;
use App\Models\AccessToken;
use App\Models\Host;
use App\Models\User;
use App\Models\AccessToken;
use Illuminate\Console\Command;
class BanUser extends Command

View File

@ -3,7 +3,7 @@
namespace App\Console\Commands;
use App\Http\Controllers\Remote\ModuleController;
use App\Models\Module\Module;
use App\Models\Module;
use Illuminate\Console\Command;
class CalcModule extends Command

View File

@ -1,136 +0,0 @@
<?php
namespace App\Console\Commands\Cluster;
use DB;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
class Init extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'cluster:init';
/**
* The console command description.
*
* @var string
*/
protected $description = '初始化此节点。当公网 IP 发生变化时,需要重新初始化。';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
$this->warn('检查服务可用性');
// 检查是否可以连接到数据库
try {
DB::connection()->getPdo();
$this->info('数据库连接正常');
} catch (\Exception $e) {
$this->error($e->getMessage());
}
// 检测是否可以连接到 Redis
try {
$redis = app('redis');
$redis->ping();
$this->info('Redis 连接正常');
} catch (\Exception $e) {
$this->error($e->getMessage());
}
if (config('app.instance_address')) {
$addr = $this->info('当前实例地址: ' . config('app.instance_address'));
} else {
$this->info('正在获取公网 IP');
// get public ip
$addr = file_get_contents('https://ifconfig.me/ip');
$this->warn('公网 IP: ' . $addr);
}
$port = config('laravels.listen_port');
$type = config('app.instance_type');
$this->info('正在准备节点');
$instance_id = config('app.instance_id');
$inst_data = [
'instance_id' => $instance_id,
'ip' => $addr,
'port' => $port,
'type' => $type,
];
dd(cluster_run_wait('register', $inst_data));
// 检测其他 莱云 计算节点
// $nodes = Cache::get('nodes', collect([]));
// 检测节点是否在集合里
// $node = $nodes->where('instance_id', $instance_id)->first();
// if ($node == null) {
// $this->warn('节点未注册');
// $this->info('正在注册节点');
// // add to collect
// $nodes->push([
// 'instance_id' => $instance_id,
// 'ip' => $addr,
// 'port' => $port,
// 'type' => $type,
// ]);
// $this->warn('节点注册成功');
// } else {
// $this->warn('节点已注册');
// // 如果 IP 不同,则更新 IP
// if ($node['ip'] != $addr) {
// $this->info('正在更新节点 IP');
// $node['ip'] = $addr;
// $this->info('节点 IP 更新成功');
// }
// $node['port'] = $port;
// }
// // save cache
// Cache::forever('nodes', $nodes);
// 检测模块是否正常
// Module::chunk(100, function ($modules) {
// foreach ($modules as $module) {
// $this->info('检测模块 ' . $module->name);
// if($module->check()) {
// $this->warn('模块 ' . $module->name . ' 正常');
// } else {
// $this->error('模块 ' . $module->name . ' 异常');
// }
// }
// });
}
}

View File

@ -1,107 +0,0 @@
<?php
namespace App\Console\Commands\Cluster;
use Illuminate\Console\Command;
use Illuminate\Redis\Connections\PhpRedisConnection;
class Send extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'cluster:send';
/**
* The console command description.
*
* @var string
*/
protected $description = '发送节点心跳';
protected PhpRedisConnection $redis;
protected String $instance_id;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->redis = app('redis')->connection('cluster_ready');
$this->instance_id = config('app.instance_id');
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
$this->info('将上报节点信息到集群中。');
// 非堵塞
// $this->redis->subscribe(['cluster:sync'], function ($message, $channel) {
// $this->info('收到同步请求');
// });
// echo '开始循环发送心跳';
while (true) {
// get cpu usage
// $cpu = round($this->getCpuUsage(), 2);
// echo "CPU: {$cpu}%\n";
$this->publish();
sleep(1);
}
}
public function getCpuUsage()
{
$load = sys_getloadavg();
return $load[0];
}
public function subscribe()
{
// 非堵塞模式
$this->redis->subscribe(['cluster_ready'], function ($message, $channel) {
echo "Received {$message} from {$channel}\n";
});
}
public function publish()
{
$this->redis->publish('cluster_ready', json_encode([
'instance_id' => $this->instance_id,
'task_id' => cluster_task_id(),
'type' => 'register',
'data' => [
'cpu' => $this->getCpuUsage(),
],
]));
// $this->redis->publish('cluster_ready', json_encode([
// 'instance_id' => $this->instance_id,
// 'task_id' => cluster_task_id(),
// 'type' => 'cpu_usage',
// 'data' => [
// 'cpu' => $this->getCpuUsage(),
// ],
// ]));
}
}

View File

@ -1,42 +0,0 @@
<?php
namespace App\Console\Commands\Cluster;
use Illuminate\Console\Command;
class Sync extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'cluster:sync';
/**
* The console command description.
*
* @var string
*/
protected $description = '同步节点存储的数据';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}

View File

@ -1,76 +0,0 @@
<?php
namespace App\Console\Commands\Cluster;
use Illuminate\Console\Command;
use Illuminate\Redis\RedisManager;
class Work extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'cluster:work';
/**
* The console command description.
*
* @var string
*/
protected $description = '开始节点协调工作';
protected RedisManager $redis;
protected String $instance_id;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
$this->redis = app('redis');
$this->instance_id = config('app.instance_id');
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('节点协调工作开始');
$this->redis->subscribe(['cluster_ready'], function ($message, $channel) {
$message = json_decode($message, true);
var_dump($message);
});
}
public function subscribe()
{
// 非堵塞模式
$this->redis->subscribe(['cluster_ready'], function ($message, $channel) {
echo "Received {$message} from {$channel}\n";
});
}
public function publish()
{
$this->redis->publish('cluster_ready', json_encode([
'instance_id' => $this->instance_id,
'cpu' => 1
]));
}
}

View File

@ -3,11 +3,11 @@
namespace App\Console\Commands;
use App\Models\Host;
use App\Models\User;
use App\Models\Transaction;
use App\Models\User;
use App\Models\WorkOrder\Reply;
use Illuminate\Console\Command;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
class Count extends Command

View File

@ -2,10 +2,10 @@
namespace App\Console\Commands;
use App\Models\Balance;
use App\Models\Host;
use App\Models\User;
use App\Models\Transaction;
use App\Models\User\Balance;
use App\Models\User;
use Illuminate\Console\Command;
class GetUser extends Command

View File

@ -2,8 +2,8 @@
namespace App\Console\Commands;
use App\Models\User;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Console\Command;
class ReduceBalance extends Command

View File

@ -2,12 +2,11 @@
namespace App\Console\Commands;
use App\Models\User;
use App\Models\Transaction;
use App\Models\User\Balance;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Exceptions\ChargeException;
use App\Models\Balance;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Console\Command;
class UserAddBalance extends Command
{

View File

@ -2,53 +2,17 @@
namespace App\Console;
use App\Console\Commands\BanUser;
use App\Console\Commands\CalcModule;
use App\Console\Commands\Cluster;
use App\Console\Commands\Count;
use App\Console\Commands\GetUser;
use App\Console\Commands\ReduceBalance;
use App\Console\Commands\Status;
use App\Console\Commands\SuspendUserAllHosts;
use App\Console\Commands\UnbanUser;
use App\Console\Commands\UserAddBalance;
use App\Jobs\AutoCloseWorkOrder;
use App\Jobs\CalcModule as JobsCalcModule;
use App\Jobs\CheckAndChargeBalance;
use App\Jobs\HostCost;
use App\Jobs\ClearTasks;
use App\Jobs\DeleteHost;
use App\Jobs\Remote;
use App\Jobs\SendThisMonthModuleEarnings;
use App\Jobs\Remote\FetchModule;
use App\Jobs\Remote\PushWorkOrder;
use App\Jobs\CheckAndChargeBalance;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
BanUser::class,
UnbanUser::class,
SuspendUserAllHosts::class,
CalcModule::class,
UserAddBalance::class,
GetUser::class,
ReduceBalance::class,
Count::class,
Status::class,
Cluster\Init::class,
Cluster\Send::class,
Cluster\Work::class,
Cluster\Sync::class,
Commands\System\Down::class,
Commands\System\Up::class,
];
/**
* Define the application's command schedule.
*
@ -57,24 +21,31 @@ class Kernel extends ConsoleKernel
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('sanctum:prune-expired --hours=24')->daily();
// dispatch HostCost job
$schedule->job(new HostCost())->everyFiveMinutes();
// $schedule->job(new UserSave())->everyTenMinutes();
$schedule->job(new Remote\FetchModule())->withoutOverlapping()->everyMinute();
$schedule->job(new FetchModule())->withoutOverlapping()->everyMinute();
// $schedule->job(new Remote\PushHost())->everyMinute()->onOneServer();
$schedule->job(new Remote\PushWorkOrder())->everyMinute()->onOneServer();
$schedule->job(new PushWorkOrder())->everyMinute()->onOneServer();
$schedule->job(new ClearTasks())->weekly();
$schedule->job(new DeleteHost())->hourly();
$schedule->job(new CheckAndChargeBalance())->everyFiveMinutes()->onOneServer()->withoutOverlapping();
}
$schedule->job(new AutoCloseWorkOrder())->everyFiveMinutes();
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
$schedule->job(new JobsCalcModule())->everyFiveMinutes();
// 每天晚上 20 点,发送模块收益
$schedule->job(new SendThisMonthModuleEarnings())->dailyAt('20:00');
require base_path('routes/console.php');
}
}

View File

@ -4,7 +4,6 @@
use Illuminate\Broadcasting\Channel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class ServerEvent extends Event implements ShouldBroadcast
{

View File

@ -2,10 +2,9 @@
namespace App\Events;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Auth;
class UserEvent extends Event implements ShouldBroadcastNow

View File

@ -2,64 +2,49 @@
namespace App\Exceptions;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Validation\ValidationException;
use Laravel\Lumen\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
* A list of exception types with their corresponding custom log levels.
*
* @var array
* @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>
*/
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
protected $levels = [
//
];
/**
* Report or log an exception.
* A list of the exception types that are not reported.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Throwable $exception
* @return void
*
* @throws \Exception
* @var array<int, class-string<\Throwable>>
*/
public function report(Throwable $exception)
{
parent::report($exception);
}
protected $dontReport = [
//
];
/**
* Render an exception into an HTTP response.
* A list of the inputs that are never flashed to the session on validation exceptions.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse
*
* @throws \Throwable
* @var array<int, string>
*/
public function render($request, Throwable $exception)
protected $dontFlash = [
'current_password',
'password',
'password_confirmation',
];
/**
* Register the exception handling callbacks for the application.
*
* @return void
*/
public function register()
{
$rendered = parent::render($request, $exception);
return response()->json(
[
'error' => [
'code' => $rendered->getStatusCode(),
'message' => $exception->getMessage(),
]
],
$rendered->getStatusCode()
);
$this->reportable(function (Throwable $e) {
//
});
}
}

View File

@ -1,48 +0,0 @@
<?php
use Illuminate\Support\Carbon;
function now($timezone = null)
{
return Carbon::now($timezone);
}
function cluster_task_id()
{
return uniqid(config('app.instance_id') . '_');
}
function cluster_run_wait($command, $data = [])
{
$redis = app('redis')->connection('cluster_ready');
$task_id = cluster_task_id();
$redis->publish('cluster_ready', json_encode([
'task_id' => $task_id,
'type' => $command,
'data' => $data,
]));
// 等待结果,最多等待 10 秒
$result = $redis->blpop("cluster:task:{$task_id}", 10);
if ($result) {
return json_decode($result[1], true);
} else {
throw new \Exception('任务执行超时');
}
}
// function nodes()
// {
// return Cache::remember('nodes', 60, function () {
// $collection = collect(['taylor', 'abigail', null])->map(function ($name) {
// return strtoupper($name);
// })->reject(function ($name) {
// return empty($name);
// });
// });
// }

View File

@ -1,78 +0,0 @@
<?php
namespace App\Http\Controllers\Admin\Admin;
use App\Http\Controllers\Controller;
use App\Models\Admin\Admin;
use Illuminate\Http\Request;
class AdminController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Admin $admin)
{
$admin = $admin->simplePaginate(10);
return $this->success($admin);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
// password required
$this->validate($request, [
'password' => 'required',
]);
$admin = Admin::create($request->all());
return $this->success($admin);
}
/**
* Display the specified resource.
*
* @param \App\Models\Admin\Admin $Admin
* @return \Illuminate\Http\Response
*/
public function show(Admin $admin)
{
return $this->success($admin);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Admin\Admin $Admin
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Admin $admin)
{
//
$admin->update($request->all());
return $this->updated($admin);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Admin\Admin $Admin
* @return \Illuminate\Http\Response
*/
public function destroy(Admin $admin)
{
// soft delete Admin
$admin->delete();
return $this->deleted($admin);
}
}

View File

@ -1,110 +0,0 @@
<?php
namespace App\Http\Controllers\Admin\Host;
use App\Http\Controllers\Controller;
use App\Models\Host;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class HostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Request $request)
{
$hosts = new Host();
// if route has user
if ($request->route('user')) {
$hosts = $hosts->where('user_id', $request->route('user'));
}
$hosts = $hosts->simplePaginate(10);
return $this->success($hosts);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
*
* @return JsonResponse|Response
*/
public function store(Request $request, Host $host)
{
$this->validate($request, [
'name' => 'required|max:255',
'module_id' => 'required|string|exists:modules,id',
'price' => 'required|numeric',
]);
// if route has user
if ($request->route('user')) {
$user_id = $request->route('user');
} else {
$this->validate($request, [
'user_id' => 'required|integer|exists:users,id',
]);
$user_id = $request->user_id;
}
$data = [
'name' => $request->name,
'module_id' => $request->module_id,
'user_id' => $user_id,
'price' => $request->price,
'configuration' => $request->configuration ?? [],
'status' => $request->status ?? 'pending',
];
$host = $host->create($data);
return $this->created($host);
}
/**
* Display the specified resource.
*
* @param Host $host
*
* @return JsonResponse
*/
public function show(User $user, Host $host)
{
//
// $host->load('providerModule');
return $this->success($host);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param Host $host
*
* @return Response
*/
public function update(Request $request, Host $host)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param Host $host
*
* @return Response
*/
public function destroy(Host $host)
{
//
}
}

View File

@ -1,84 +0,0 @@
<?php
namespace App\Http\Controllers\Admin\User;
use App\Http\Controllers\Controller;
use App\Models\User\Drop;
use Illuminate\Http\Request;
class DropController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Drop $drop)
{
$drop = $drop->simplePaginate(10);
return $this->success($drop);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
$this->validate($request, [
'amount' => 'integer|required|min:1|max:1000',
]);
$data = [
'payment' => 'admin',
'amount' => intval($request->amount),
'status' => 1,
'user_id' => $request->route('user'),
'type' => 'add',
];
$drop = Drop::create($data);
return $this->success($drop);
}
/**
* Display the specified resource.
*
* @param \App\Models\User\Drop $drop
* @return \Illuminate\Http\Response
*/
public function show(Drop $drop)
{
//
$this->authorize('show', $drop);
return $drop;
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\User\Drop $drop
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Drop $drop)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\User\Drop $drop
* @return \Illuminate\Http\Response
*/
public function destroy(Drop $drop)
{
//
}
}

View File

@ -1,73 +0,0 @@
<?php
namespace App\Http\Controllers\Admin\User;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(User $user)
{
$users = $user->simplePaginate(10);
return $this->success($users);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$user = User::create($request->all());
return $this->success($user);
}
/**
* Display the specified resource.
*
* @param \App\Models\User\User $user
* @return \Illuminate\Http\Response
*/
public function show(User $user)
{
// dd($user);
return $this->success($user);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\User\User $user
* @return \Illuminate\Http\Response
*/
public function update(Request $request, User $user)
{
//
$user->update($request->all());
return $this->updated($user);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\User\User $user
* @return \Illuminate\Http\Response
*/
public function destroy(User $user)
{
// soft delete user
$user->delete();
return $this->deleted($user);
}
}

View File

@ -1,104 +0,0 @@
<?php
namespace App\Http\Controllers\Admin\WorkOrder;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Models\WorkOrder\WorkOrder;
use App\Http\Controllers\Controller;
use Illuminate\Support\Arr;
class WorkOrderController extends Controller
{
/**
* Display a listing of the resource.
*
* @return JsonResponse
*/
public function index(WorkOrder $work_order)
{
//
$work_order = $work_order->simplePaginate(10);
return $this->success($work_order);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return JsonResponse
*/
public function store(Request $request)
{
//
$this->validate($request, [
'title' => 'required|max:255',
'host_id' => 'required|integer|exists:hosts,id',
'content' => 'required|max:255',
]);
$data = [
'user_id' => $request->route('user'),
'title' => $request->title,
'host_id' => $request->host_id,
'content' => $request->content,
];
$work_order = WorkOrder::create($data);
return $this->created($work_order);
}
/**
* Display the specified resource.
*
* @param User $user
* @param WorkOrder $work_order
*
* @return JsonResponse
*/
public function show(User $user, Workorder $work_order)
{
//
$work_order->load('replies');
return $this->success($work_order);
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param User $user
* @param WorkOrder $work_order
*
* @return JsonResponse
*/
public function update(Request $request, User $user, WorkOrder $work_order)
{
$data = Arr::only($request->all(), [
'title',
'content',
]);
$work_order->update($data);
return $this->updated($work_order);
}
/**
* Remove the specified resource from storage.
*
* @param User $user
* @param WorkOrder $work_order
*
* @return JsonResponse
*/
public function destroy(User $user, WorkOrder $work_order)
{
//
$work_order->delete();
return $this->deleted($work_order);
}
}

View File

@ -1,18 +1,24 @@
<?php
namespace App\Http\Controllers\User;
namespace App\Http\Controllers\Api;
use Exception;
use function app;
use function env;
use function now;
use function auth;
use function view;
use function route;
use function config;
use App\Models\Balance;
use function storage_path;
use App\Models\Transaction;
use App\Models\User\Balance;
use Illuminate\Http\Request;
use App\Exceptions\ChargeException;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Yansongda\LaravelPay\Facades\Pay;
use Illuminate\Support\Facades\Storage;
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
use Alipay\EasySDK\Kernel\Config as AlipayConfig;
use Alipay\EasySDK\Kernel\Factory as AlipayFactory;
class BalanceController extends Controller
{
@ -42,11 +48,21 @@ public function store(Request $request)
'payment' => 'alipay',
];
$pay = Pay::alipay()->web([
'out_trade_no' => 'lae-' . time(),
'total_amount' => $request->amount,
'subject' => '在莱云上充值 ' . $request->amount . ' 元',
]);
return $pay;
// if local
if (env('APP_ENV') == 'local') {
$data['payment'] = null;
$data['paid_at'] = now();
}
// if (env('APP_ENV') == 'local') {
// $data['payment'] = null;
// $data['paid_at'] = now();
// }
$balance = $balance->create($data);
@ -83,18 +99,12 @@ public function show(Request $request, Balance $balance)
}
try {
AlipayFactory::setOptions($this->alipayOptions());
$result = AlipayFactory::payment()->page()->pay("支付", $balance->order_id, $balance->amount, route('balances.return'));
$responseChecker = new ResponseChecker();
// dd($result);
if ($responseChecker->success($result)) {
$html = $result->body;
return view('pay', compact('html'));
}
return;
// if ($responseChecker->success($result)) {
// $html = $result->body;
// return view('pay', compact('html'));
// }
} catch (Exception $e) {
Log::error($e);
echo "调用失败," . $e->getMessage() . PHP_EOL;;
@ -154,33 +164,33 @@ public function notify(Request $request)
public function checkAndCharge(Balance $balance)
{
AlipayFactory::setOptions($this->alipayOptions());
// AlipayFactory::setOptions($this->alipayOptions());
$trade = AlipayFactory::payment()->common()->query($balance->order_id);
// $trade = AlipayFactory::payment()->common()->query($balance->order_id);
if ($trade->code == "10000" && $trade->tradeStatus == "TRADE_SUCCESS") {
$balance->paid_at = now();
$balance->save();
// if ($trade->code == "10000" && $trade->tradeStatus == "TRADE_SUCCESS") {
// $balance->paid_at = now();
// $balance->save();
$transaction = new Transaction();
// $transaction = new Transaction();
try {
$transaction->addAmount($balance->user_id, 'alipay', $trade->totalAmount);
} catch (ChargeException $e) {
AlipayFactory::payment()->common()->refund($balance->order_id, $trade->totalAmount);
return $this->error($e->getMessage());
}
// try {
// $transaction->addAmount($balance->user_id, 'alipay', $trade->totalAmount);
// } catch (ChargeException $e) {
// AlipayFactory::payment()->common()->refund($balance->order_id, $trade->totalAmount);
// return $this->error($e->getMessage());
// }
return true;
} else {
return false;
}
// return true;
// } else {
// return false;
// }
}
// // 转换为 drops
// public function transfer($amount = 1)
// {
// $balance = auth('api')->user();
// $balance = auth()->user();
// $balance->decrement('amount', $request->amount);
// return $this->success($balance);
// }
@ -226,32 +236,32 @@ public function drops()
}
private function alipayOptions()
{
$options = new AlipayConfig();
$options->protocol = 'https';
// private function alipayOptions()
// {
// $options = new AlipayConfig();
// $options->protocol = 'https';
// if local
if (app()->environment() == 'local') {
$options->gatewayHost = 'openapi.alipaydev.com';
} else {
$options->gatewayHost = 'openapi.alipay.com';
}
// // if local
// if (app()->environment() == 'local') {
// $options->gatewayHost = 'openapi.alipaydev.com';
// } else {
// $options->gatewayHost = 'openapi.alipay.com';
// }
$options->signType = 'RSA2';
// $options->signType = 'RSA2';
$options->appId = config('payment.alipay.app_id');
// $options->appId = config('payment.alipay.app_id');
// 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
$options->merchantPrivateKey = trim(Storage::get('alipayAppPriv.key'));
// // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
// $options->merchantPrivateKey = trim(Storage::get('alipayAppPriv.key'));
$options->alipayCertPath = storage_path('app/alipayCertPublicKey_RSA2.crt');
$options->alipayRootCertPath = storage_path('app/alipayRootCert.crt');
$options->merchantCertPath = storage_path('app/appCertPublicKey.crt');
// $options->alipayCertPath = storage_path('app/alipayCertPublicKey_RSA2.crt');
// $options->alipayRootCertPath = storage_path('app/alipayRootCert.crt');
// $options->merchantCertPath = storage_path('app/appCertPublicKey.crt');
$options->notifyUrl = route('balances.notify');
// $options->notifyUrl = route('balances.notify');
return $options;
}
// return $options;
// }
}

View File

@ -1,12 +1,15 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Closure;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use function config;
// use Exception;
// use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
class ForumController extends Controller
{

View File

@ -1,32 +1,31 @@
<?php
namespace App\Http\Controllers\User;
namespace App\Http\Controllers\Api;
use App\Models\Host;
use Illuminate\Http\Request;
// use App\Models\Module\Module;
use App\Http\Controllers\Controller;
use App\Models\Host;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use function auth;
use function dispatch;
use function now;
class HostController extends Controller
{
public function index()
public function index(): JsonResponse
{
//
$hosts = (new Host())->getUserHosts(auth()->id());
$hosts = Host::where('user_id', auth()->id())->with('module', function ($query) {
$query->select(['id', 'name']);
})->get();
return $this->success($hosts);
}
public function update(Request $request, Host $host)
public function update(Request $request, Host $host): JsonResponse
{
$user = $request->user();
if ($host->user_id == $user->id) {
// if ($user->balance < 1) {
// return $this->error('余额不足');
// }
$host->update([
'status' => 'running'
]);
@ -35,8 +34,6 @@ public function update(Request $request, Host $host)
} else {
return $this->error('无权操作');
}
return $this->deleted($host);
}
public function destroy(Host $host)
@ -61,7 +58,7 @@ public function destroy(Host $host)
return $this->deleted($host);
}
public function usages()
public function usages(): JsonResponse
{
$month = now()->month;

View File

@ -1,11 +1,14 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
class IndexController extends Controller
{
//
public function __invoke()
public function __invoke(): JsonResponse
{
return $this->success([
'message' => 'Welcome to LoliArt LaeCloud API Server',

View File

@ -0,0 +1,25 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Module;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ModuleController extends Controller
{
public function index(): JsonResponse
{
$modules = Module::all();
return $this->success($modules);
}
public function call(Request $request, Module $module): JsonResponse
{
return (new \App\Http\Controllers\Remote\ModuleController())->call($request, $module);
}
}

View File

@ -1,7 +1,8 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

View File

@ -1,10 +1,9 @@
<?php
namespace App\Http\Controllers\User;
namespace App\Http\Controllers\Api;
use App\Models\User\Task;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Task;
class TaskController extends Controller
{

View File

@ -1,10 +1,11 @@
<?php
namespace App\Http\Controllers;
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Transaction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use function config;
class UserController extends Controller
{

View File

@ -1,11 +1,12 @@
<?php
namespace App\Http\Controllers\User\WorkOrder;
namespace App\Http\Controllers\Api\WorkOrder;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\WorkOrder\Reply;
use App\Models\WorkOrder\WorkOrder;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use function auth;
class ReplyController extends Controller
{
@ -29,7 +30,8 @@ public function index(WorkOrder $workOrder)
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Response
*/
public function store(Request $request, WorkOrder $workOrder)
{

View File

@ -1,10 +1,11 @@
<?php
namespace App\Http\Controllers\User\WorkOrder;
namespace App\Http\Controllers\Api\WorkOrder;
use Illuminate\Http\Request;
use App\Models\WorkOrder\WorkOrder;
use App\Http\Controllers\Controller;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Http\Request;
use function auth;
class WorkOrderController extends Controller
{
@ -35,8 +36,8 @@ public function store(Request $request)
}
$workOrder = WorkOrder::create([
'title' => $request->title,
'content' => $request->content,
'title' => $request_data['title'],
'content' => $request_data['content'],
'module_id' => $request_data['module_id'] ?? null,
'host_id' => $request_data['host_id'] ?? null,
'status' => 'pending',

View File

@ -0,0 +1,162 @@
<?php
namespace App\Http\Controllers;
// use App\Helpers\ApiResponse;
use App\Models\AccessToken;
use App\Models\User;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
class AuthController extends Controller
{
// use ApiResponse;
public function index(Request $request)
{
// if logged in
if ($request->callback) {
if (Auth::check()) {
// create token
$token = $request->user()->createToken('Auto login at ' . now());
return redirect($request->callback . '?token=' . $token->plainTextToken);
} else {
session(['callback' => $request->callback]);
return redirect()->route('login');
}
}
if (Auth::check()) {
$user = Auth::user();
if ($user->banned_at !== null) {
return redirect()->route('banned');
}
}
return view('index');
}
public function redirect(Request $request)
{
$request->session()->put('state', $state = Str::random(40));
$query = http_build_query([
'client_id' => config('oauth.client_id'),
'redirect_uri' => config('oauth.callback_uri'),
'response_type' => 'code',
'scope' => '',
'state' => $state,
'meta' => 'test_meta',
]);
// dd($query);
return redirect()->to(config('oauth.oauth_auth_url') . '?' . $query);
}
public function callback(Request $request)
{
$state = $request->session()->pull('state');
if (!strlen($state) > 0 && $state === $request->state) {
return redirect(route('login'));
}
$http = new Client();
try {
$authorize = $http->post(config('oauth.oauth_token_url'), [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => config('oauth.client_id'),
'client_secret' => config('oauth.client_secret'),
'redirect_uri' => config('oauth.callback_uri'),
'code' => $request->code,
],
])->getBody();
} catch (ClientException) {
return redirect(route('login'));
}
$authorize = json_decode($authorize);
$oauth_user = $http->get(config('oauth.oauth_user_url'), [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $authorize->access_token,
],
])->getBody();
$oauth_user = json_decode($oauth_user);
if (is_null($oauth_user->verified_at)) {
return redirect()->route('not_verified');
}
$user_sql = User::where('email', $oauth_user->email);
$user = $user_sql->first();
if (is_null($user)) {
$name = $oauth_user->name;
$email = $oauth_user->email;
$email_verified_at = $oauth_user->email_verified_at;
$user = User::create([
'name' => $name,
'email' => $email,
'password' => null,
'email_verified_at' => $email_verified_at,
'oauth_id' => $oauth_user->id,
'provider' => 'LoliArt',
'provider_id' => $oauth_user->id,
'real_name' => $oauth_user->real_name,
'balance' => 0
]);
$request->session()->put('auth.password_confirmed_at', time());
} else {
if ($user->name != $oauth_user->name) {
User::where('email', $oauth_user->email)->update([
'name' => $oauth_user->name
]);
}
// $api_token = $user->api_token;
}
Auth::loginUsingId($user->id, true);
return redirect()->route('index', ['callback' => session('callback')]);
}
public function newToken(Request $request)
{
$request->validate([
'token_name' => 'required|string|max:255',
]);
$token = $request->user()->createToken($request->token_name);
return back()->with('token', $token->plainTextToken);
}
public function deleteAll(Request $request)
{
$request->user()->tokens()->delete();
return back()->with('success', '所有 Token 删除成功。');
}
public function logout()
{
Auth::guard('web')->logout();
session()->regenerateToken();
return redirect()->route('index');
}
}

View File

@ -3,9 +3,12 @@
namespace App\Http\Controllers;
use App\Helpers\ApiResponse;
use Laravel\Lumen\Routing\Controller as BaseController;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use ApiResponse;
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, ApiResponse;
}

View File

@ -2,11 +2,11 @@
namespace App\Http\Controllers\Remote;
use App\Events\UserEvent;
use App\Http\Controllers\Controller;
use App\Models\Host;
use App\Models\User;
use App\Events\UserEvent;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class BroadcastController extends Controller
{

View File

@ -2,13 +2,13 @@
namespace App\Http\Controllers\Remote\Host;
use App\Http\Controllers\Controller;
use App\Models\Host;
use App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
// use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use App\Exceptions\User\BalanceNotEnoughException;
class HostController extends Controller
{

View File

@ -2,9 +2,9 @@
namespace App\Http\Controllers\Remote\Host;
use App\Models\User\Task;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
@ -48,8 +48,9 @@ public function store(Request $request)
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param Task $task
* @param \Illuminate\Http\Request $request
* @param \App\Models\Task $task
*
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Task $task)

View File

@ -2,11 +2,11 @@
namespace App\Http\Controllers\Remote;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Models\Module\Module;
use App\Http\Controllers\Controller;
use App\Models\Module;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
class ModuleController extends Controller
{
@ -29,23 +29,10 @@ public function index()
public function call(Request $request, Module $module)
{
// $this->validate($request, [
// 'func' => 'required|string'
// ]);
// $func = $request->func;
// // 不能让 func 的首个字符为 /
// if (Str::startsWith($func, '/')) {
// $func = substr($func, 1);
// }
$path = request()->path();
// 删除 modules/{module} 的部分
$path = substr($path, strlen('/api/modules/' . $module->id));
// 过滤除了 "/" 以外的特殊字符
$path = preg_replace('/[^a-zA-Z0-9\/]/', '', $path);
@ -53,7 +40,7 @@ public function call(Request $request, Module $module)
// 如果 method 为 post, 检查用户余额
// if ($method == 'post') {
// $user = auth('api')->user();
// $user = auth()->user();
// if ($user->balance < 1) {
// return $this->error('账户余额不足,请保证账户余额至少有 1 元。');
@ -71,7 +58,7 @@ public function call(Request $request, Module $module)
}
public function exportCall(Request $request, Module $module)
public function exportCall(Request $request, Module $module): \Illuminate\Http\Response|\Illuminate\Http\JsonResponse|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory
{
$path = request()->path();
@ -90,7 +77,7 @@ public function exportCall(Request $request, Module $module)
}
public function calcModule(Module $module)
public function calcModule(Module $module): array
{
$default = [
@ -98,15 +85,11 @@ public function calcModule(Module $module)
'drops' => 0,
];
$data = [
return [
'transactions' => [
'this_month' => Cache::get('this_month_balance_and_drops_' . $module->id, $default),
'last_month' => Cache::get('last_month_balance_and_drops_' . $module->id, $default),
]
];
return $data;
}
}

View File

@ -2,12 +2,12 @@
namespace App\Http\Controllers\Remote;
use App\Models\Host;
use App\Models\User;
use App\Models\Transaction;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Exceptions\User\BalanceNotEnoughException;
use App\Http\Controllers\Controller;
use App\Models\Host;
use App\Models\Transaction;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{

View File

@ -2,10 +2,9 @@
namespace App\Http\Controllers\Remote\WorkOrder;
use Illuminate\Http\Request;
use App\Models\WorkOrder\Reply;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use App\Models\WorkOrder\Reply;
use Illuminate\Http\Request;
class ReplyController extends Controller
{

View File

@ -2,10 +2,10 @@
namespace App\Http\Controllers\Remote\WorkOrder;
use Illuminate\Http\Request;
use App\Models\WorkOrder\WorkOrder;
use App\Http\Controllers\Controller;
use App\Http\Requests\Remote\WorkOrderRequest;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Http\Request;
class WorkOrderController extends Controller
{

View File

@ -1,17 +0,0 @@
<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\Module\Module;
class ModuleController extends Controller
{
//
public function __invoke() {
$modules = (new Module())->cached_modules();
return $this->success($modules);
}
}

69
app/Http/Kernel.php Normal file
View File

@ -0,0 +1,69 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\ForceJsonResponse::class,
\App\Http\Middleware\AllowCors::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array<string, class-string|string>
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}

View File

@ -37,13 +37,5 @@ public function handle($request, Closure $next)
}
return $response;
// // Pre-Middleware Action
// $response = $next($request);
// // Post-Middleware Action
// return $response;
}
}

View File

@ -2,51 +2,36 @@
namespace App\Http\Middleware;
use Closure;
use App\Helpers\ApiResponse;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate
class Authenticate extends Middleware
{
use ApiResponse;
/**
* The authentication guard factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
* @return string|null
*/
public function handle($request, Closure $next, $guard = null)
{
$auth = $this->auth->guard($guard);
if ($auth->guest()) {
return $this->unauthorized('Unauthorized.');
}
// protected function redirectTo($request)
// {
// if (! $request->expectsJson()) {
// return route('login');
// }
// }
$user = $this->auth->guard($guard)->user();
if ($user->banned_at) {
return $this->forbidden('您已被封禁,原因是: ' . $user->banned_reason ?? '一次或多次触犯了我们的规则。');
}
return $next($request);
}
// public function handle($request, Closure $next, $guard = null)
// {
// $auth = $this->auth->guard($guard);
// if ($auth->guest()) {
// return $this->unauthorized('Unauthorized.');
// }
// $user = $this->auth->guard($guard)->user();
// if ($user->banned_at) {
// return $this->forbidden('您已被封禁,原因是: ' . $user->banned_reason ?? '一次或多次触犯了我们的规则。');
// }
// return $next($request);
// }
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceJsonResponse
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}

View File

@ -1,35 +0,0 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Log;
class LogAllRequest
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
Log::debug('request', [
'method' => $request->getMethod(),
'path' => $request->path(),
'data' => $request->all(),
]);
// Pre-Middleware Action
$response = $next($request);
// Post-Middleware Action
// Log::debug('response', $response->content);
return $response;
}
}

View File

@ -1,31 +0,0 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Cache;
class Maintenance
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// if cache has system down
if (Cache::has('system_down')) {
return response()->json([
'message' => '我们正在进行维护,请稍等 2 小时后再来。',
], 503);
}
// continue
return $next($request);
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
class PreventRequestsDuringMaintenance extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @param string|null ...$guards
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array<int, string>
*/
protected $except = [
'current_password',
'password',
'password_confirmation',
];
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustHosts as Middleware;
class TrustHosts extends Middleware
{
/**
* Get the host patterns that should be trusted.
*
* @return array<int, string|null>
*/
public function hosts()
{
return [
$this->allSubdomainsOfApplicationUrl(),
];
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array<int, string>|string|null
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Routing\Middleware\ValidateSignature as Middleware;
class ValidateSignature extends Middleware
{
/**
* The names of the query string parameters that should be ignored.
*
* @var array<int, string>
*/
protected $except = [
// 'fbclid',
// 'utm_campaign',
// 'utm_content',
// 'utm_medium',
// 'utm_source',
// 'utm_term',
];
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array<int, string>
*/
protected $except = [
//
];
}

View File

@ -2,8 +2,8 @@
namespace App\Http\Requests\Remote\Server;
use Illuminate\Foundation\Http\FormRequest;
use App\Models\Server\Status;
use Anik\Form\FormRequest;
class StatusRequest extends FormRequest
{

View File

@ -2,8 +2,8 @@
namespace App\Http\Requests\Remote;
use Illuminate\Foundation\Http\FormRequest;
use App\Models\WorkOrder\WorkOrder;
use Anik\Form\FormRequest;
class WorkOrderRequest extends FormRequest
{

View File

@ -2,10 +2,10 @@
namespace App\Http\Requests\User\WorkOrder;
use Illuminate\Foundation\Http\FormRequest;
use App\Models\WorkOrder\WorkOrder;
use Anik\Form\FormRequest;
class WorkOrderRequest extends FormRequest
class WorkOrderReques extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
@ -25,7 +25,7 @@ public function authorize(): bool
}
return WorkOrder::where('user_id', auth('api')->id())->where('id', $work_order_id)->exists();
return WorkOrder::where('user_id', auth()->id())->where('id', $work_order_id)->exists();
return false;
}

View File

@ -2,10 +2,9 @@
namespace App\Jobs;
use App\Models\Module;
use App\Models\Transaction;
use App\Models\Module\Module;
use Illuminate\Support\Facades\Cache;
use App\Http\Controllers\Remote\ModuleController;
class CalcModule extends Job
{

View File

@ -2,8 +2,8 @@
namespace App\Jobs;
use App\Http\Controllers\User\BalanceController;
use App\Models\User\Balance;
use App\Http\Controllers\Api\BalanceController;
use App\Models\Balance;
class CheckAndChargeBalance extends Job
{

View File

@ -2,14 +2,14 @@
namespace App\Jobs;
use App\Models\User\Task;
use App\Models\Task;
use Illuminate\Bus\Queueable;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
class ClearTasks implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;

View File

@ -4,9 +4,9 @@
use App\Models\Host;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
// use Illuminate\Contracts\Queue\ShouldBeUnique;

View File

@ -3,15 +3,15 @@
namespace App\Jobs\Remote;
use App\Events\ServerEvent;
use App\Models\Module\Module;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use App\Models\Module;
use GuzzleHttp\Exception\ConnectException;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class FetchModule implements ShouldQueue
{

View File

@ -2,14 +2,14 @@
namespace App\Jobs\Remote;
use App\Models\Host as HostModel;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
use App\Models\Host as HostModel;
class Host implements ShouldQueue
{

View File

@ -4,10 +4,10 @@
use App\Models\Host;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
// use Illuminate\Contracts\Queue\ShouldBeUnique;

View File

@ -3,12 +3,12 @@
namespace App\Jobs\Remote;
use App\Models\WorkOrder\Reply;
use Illuminate\Bus\Queueable;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
// use Illuminate\Contracts\Queue\ShouldBeUnique;

View File

@ -2,16 +2,16 @@
namespace App\Jobs\Remote\WorkOrder;
use Log;
use App\Events\UserEvent;
use App\Models\WorkOrder\Reply as WorkOrderReply;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
use Log;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\WorkOrder\Reply as WorkOrderReply;
class Reply implements ShouldQueue
{

View File

@ -3,13 +3,14 @@
namespace App\Jobs\Remote\WorkOrder;
use App\Events\UserEvent;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Http;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
class WorkOrder implements ShouldQueue
{

View File

@ -2,7 +2,7 @@
namespace App\Jobs;
use App\Models\Module\Module;
use App\Models\Module;
use App\Notifications\ModuleEarnings;
use Illuminate\Support\Facades\Cache;

View File

@ -1,14 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class AccessToken extends Model
{
//
public function user() {
return $this->belongsTo(User::class);
}
}

View File

@ -1,43 +0,0 @@
<?php
namespace App\Models\Admin;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Admin extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password'
];
// protect password
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Crypt::encrypt($value);
}
// before create admin, generate api_token
public static function boot()
{
parent::boot();
self::creating(function ($admin) {
// if not set api_token
if (!$admin->api_token) {
$admin->api_token = Str::random(60);
}
});
}
}

View File

@ -1,14 +1,16 @@
<?php
namespace App\Models\User;
namespace App\Models;
use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo as BelongsToAlias;
use function auth;
class Balance extends Model
{
use HasFactory;
use HasFactory, Cachable;
protected $fillable = [
'order_id',
@ -20,12 +22,12 @@ class Balance extends Model
];
// route key
public function getRouteKeyName()
public function getRouteKeyName(): string
{
return 'order_id';
}
public function user()
public function user(): BelongsToAlias
{
return $this->belongsTo(User::class);
}

View File

@ -3,18 +3,20 @@
namespace App\Models;
use App\Events\UserEvent;
use App\Models\Transaction;
use App\Models\Module\Module;
// use Illuminate\Database\Eloquent\SoftDeletes;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\User\BalanceNotEnoughException;
use App\Models\WorkOrder\WorkOrder;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo as BelongsToAlias;
use Illuminate\Database\Eloquent\Relations\HasMany as HasManyAlias;
use Illuminate\Support\Facades\Cache;
// use Illuminate\Database\Eloquent\SoftDeletes;
class Host extends Model
{
use HasFactory;
use HasFactory, Cachable;
protected $table = 'hosts';
@ -38,38 +40,30 @@ class Host extends Model
// get user hosts
public function getUserHosts($user_id = null)
{
return Cache::remember('user_hosts_' . $user_id ?? auth()->id(), 3600, function () use ($user_id) {
return $this->where('user_id', $user_id)->with('module', function ($query) {
$query->select(['id', 'name']);
})->get();
});
return $this->where('user_id', $user_id)->with('module', function ($query) {
$query->select(['id', 'name']);
})->get();
}
// user
public function user()
public function user(): BelongsToAlias
{
return $this->belongsTo(User::class);
}
// module
public function module()
public function module(): BelongsToAlias
{
return $this->belongsTo(Module::class);
}
// workOrders
public function workOrders()
public function workOrders(): HasManyAlias
{
return $this->hasMany(WorkOrder::class);
}
// module 远程一对一
// public function module() {
// return $this->hasOneThrough(Module::class, ProviderModule::class);
// }
// scope
public function scopeActive($query)
{
@ -87,7 +81,7 @@ public function scopeThisUser($query, $module = null)
// cost
public function cost($price = null, $auto = true)
public function cost($price = null, $auto = true): bool
{
$this->load('user');

View File

@ -1,23 +1,15 @@
<?php
namespace App\Models\Module;
namespace App\Models;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Log;
use Illuminate\Auth\Authenticatable;
use Illuminate\Support\Facades\Http;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
use GuzzleHttp\Exception\ConnectException;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class Module extends Model implements AuthenticatableContract, AuthorizableContract
class Module extends Authenticatable
{
use Authenticatable, Authorizable, HasFactory;
protected $table = 'modules';
// primary key
@ -64,7 +56,7 @@ public function remote($func, $requests)
// post, get, patch, delete 等请求
public function remoteRequest($method, $path, $requests)
{
$user = auth('api')->user();
$user = auth()->user();
$http = Http::remote($this->api_token, $this->url)
->accept('application/json');
@ -157,13 +149,13 @@ public function check($module_id = null)
}
// get cached modules
public static function cached_modules()
{
return Cache::remember('modules', 600, function () {
return Module::all();
});
}
// // get cached modules
// public static function cached_modules()
// {
// return Cache::remember('modules', 600, function () {
// return Module::all();
// });
// }
protected static function boot()
{

View File

@ -1,18 +1,20 @@
<?php
namespace App\Models\User;
namespace App\Models;
use App\Models\Host;
use Ramsey\Uuid\Uuid;
use App\Events\UserEvent;
use App\Exceptions\CommonException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Ramsey\Uuid\Uuid;
use function auth;
use function broadcast;
class Task extends Model
{
use HasFactory;
use HasFactory, Cachable;
protected $fillable = [
'host_id',
@ -102,7 +104,7 @@ protected static function boot()
// updated and delete
static::updated(function ($model) {
Cache::forget('user_tasks_' . $model->user_id);
// Cache::forget('user_tasks_' . $model->user_id);
$model->load('host');
broadcast(new UserEvent($model->user_id, 'tasks.updated', $model));
@ -110,7 +112,7 @@ protected static function boot()
static::deleted(function ($model) {
Cache::forget('user_tasks_' . $model->user_id);
// Cache::forget('user_tasks_' . $model->user_id);
broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model));
});

View File

@ -3,11 +3,11 @@
namespace App\Models;
use App\Exceptions\ChargeException;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Cache;
use Jenssegers\Mongodb\Eloquent\Model;
use App\Exceptions\User\BalanceNotEnoughException;
use Illuminate\Contracts\Cache\LockTimeoutException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Jenssegers\Mongodb\Eloquent\Model;
class Transaction extends Model
{

View File

@ -2,41 +2,40 @@
namespace App\Models;
use App\Models\Transaction;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Exceptions\CommonException;
use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
use App\Exceptions\User\BalanceNotEnoughException;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Contracts\Cache\LockTimeoutException;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Cache;
use Laravel\Sanctum\HasApiTokens;
class User extends Model implements AuthenticatableContract, AuthorizableContract
class User extends Authenticatable
{
use Authenticatable, Authorizable, HasFactory;
use HasApiTokens, HasFactory, Notifiable, Cachable;
/**
* The attributes that are mass assignable.
*
* @var string[]
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
'balance'
];
/**
* The attributes excluded from the model's JSON form.
* The attributes that should be hidden for serialization.
*
* @var string[]
* @var array<int, string>
*/
protected $hidden = [
'password', 'remember_token',
'password',
'remember_token',
];
protected $casts = [

View File

@ -1,96 +0,0 @@
<?php
namespace App\Models\User;
use App\Models\User;
use App\Helpers\Lock;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Drop extends Model
{
use HasFactory, Lock;
protected $cache_key, $cache;
protected $fillable = [
'payment', 'amount', 'user_id', 'type'
];
// casts
protected $casts = [
'amount' => 'double',
'total' => 'double',
'rate' => 'integer',
'status' => 'boolean',
];
// user
public function user()
{
return $this->belongsTo(User::class);
}
// before create
public static function boot()
{
parent::boot();
self::creating(function ($drops) {
// if not admin auth guard
if (!auth()->guard('admin')->check()) {
$drops->user_id = auth()->id();
}
$rate = config('drops.rate') ;
$drops->total = $drops->amount * $rate;
$this->cache_key = 'user_' . $drops->user_id;
// if cache has user
// if (Cache::has($this->cache_key)) {
// // if user is not instances of Model
// $user = Cache::get($this->cache_key);
// if ($user instanceof User) {
// $this->await($this->cache_key, function () use ($user) {
// $user->save();
// });
// }
// // delete cache
// Cache::forget($this->cache_key);
// }
});
// created
self::created(function ($drops) {
$drop = new self();
$drop->await('user_' . $drops->user_id, function () use ($drops) {
$cache = Cache::tags(['users']);
$drops->load('user');
$cache_key = 'user_' . $drops->user_id;
// if cache has user
if ($cache->has($cache_key)) {
$user = $cache->get($cache_key);
if (!($user instanceof User)) {
$user = $drops->user;
}
$user->drops += $drops->total;
$cache->put($cache_key, $user, 600);
$user->save();
} else {
$drops->user->drops += $drops->total;
$drops->user->save();
}
});
});
}
}

View File

@ -1,11 +0,0 @@
<?php
namespace App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Message extends Model
{
use HasFactory;
}

View File

@ -2,15 +2,16 @@
namespace App\Models\WorkOrder;
use App\Models\User;
use App\Events\UserEvent;
use App\Exceptions\CommonException;
use Illuminate\Database\Eloquent\Model;
use App\Models\User;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Reply extends Model
{
use HasFactory;
use HasFactory, Cachable;
protected $table = 'work_order_replies';
@ -53,7 +54,7 @@ protected static function boot()
throw_if($model->workOrder->status == 'pending' || $model->workOrder->status == 'error', CommonException::class, '工单状态不正确');
// change work order status
if (auth('api')->check()) {
if (auth()->check()) {
$model->user_id = auth()->id();
$model->workOrder->status = 'user_replied';
}

View File

@ -2,16 +2,17 @@
namespace App\Models\WorkOrder;
use App\Models\Host;
use App\Models\User;
use App\Models\Module\Module;
use App\Exceptions\CommonException;
use Illuminate\Database\Eloquent\Model;
use App\Models\Host;
use App\Models\Module;
use App\Models\User;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class WorkOrder extends Model
{
use HasFactory;
use HasFactory, Cachable;
protected $table = 'work_orders';
@ -25,23 +26,24 @@ class WorkOrder extends Model
];
// user
public function user() {
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(User::class);
}
// replies
public function replies()
public function replies(): \Illuminate\Database\Eloquent\Relations\HasMany
{
return $this->hasMany(Reply::class);
}
// host
public function host()
public function host(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Host::class);
}
public function module()
public function module(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Module::class);
}
@ -71,8 +73,8 @@ protected static function boot()
}
// if logged
if (auth('api')->check()) {
$model->user_id = auth('api')->id();
if (auth()->check()) {
$model->user_id = auth()->id();
if ($model->host_id) {
if (!$model->user_id === $model->host->user_id) {
@ -97,37 +99,9 @@ protected static function boot()
}
});
// 更新时获取差异部分
static::updating(function ($model) {
// $original = $model->getOriginal();
// // dd($original);
// $diff = array_diff_assoc($model->attributes, $original);
// // 如果更新了host_id则抛出异常
// if (isset($diff['host_id'])) {
// throw new CommonException('host_id cannot be updated');
// }
});
// updated
static::updated(function ($model) {
dispatch(new \App\Jobs\Remote\WorkOrder\WorkOrder($model, 'put'));
// $original = $model->getOriginal();
// $diff = array_diff_assoc($model->attributes, $original);
// // dd($diff);
// if (isset($diff['status'])) {
// $model->load(['host']);
// $model->host->load('module');
// $module = $model->host->module;
// if ($module === null) {
// $model->status = 'open';
// } else {
// $model->status = 'pending';
// }
// $model->save();
// }
});
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace App\Notifications;
use App\Models\Module\Module;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Log;
class ModuleEarnings extends Notification
{
use Queueable;
protected Module $module;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct(Module $module)
{
$this->module = $module;
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toGroup($notifiable)
{
if (!isset($notifiable['transactions'])) {
return;
}
$module = $this->module;
$view = 'notifications.module.earnings';
// make wecom_key visible
$wecom_key = $module->wecom_key ?? config('settings.wecom.robot_hook.billing');
$resp = Http::post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' . $wecom_key, [
'msgtype' => 'markdown',
'markdown' => [
'content' => view($view, [
'module' => $module,
'data' => $notifiable,
])->render(),
],
]);
if ($resp->failed()) {
Log::error('发送模块盈利到企业微信时失败', [
'module' => $module->id,
'data' => $notifiable,
'resp' => $resp->json(),
]);
}
}
}

View File

@ -1,69 +0,0 @@
<?php
namespace App\Notifications;
use App\Models\User\Balance;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use App\Broadcasting\WeComRobotChannel;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class UserBalanceNotification extends Notification implements ShouldQueue
{
use Queueable;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return [WeComRobotChannel::class];
}
public function toGroup($notifiable)
{
if ($notifiable instanceof Balance) {
if ($notifiable->paid_at !== null) {
$view = 'notifications.user.balance';
$notifiable->load('user');
$user = $notifiable->user;
$wecom_key = config('settings.wecom.robot_hook.billing');
$data = [
'balance' => $notifiable,
'user' => $user,
];
$resp = Http::post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' . $wecom_key, [
'msgtype' => 'markdown',
'markdown' => [
'content' => view($view, $data)->render(),
],
]);
if (!$resp->successful()) {
Log::error('企业微信机器人发送失败', $data);
}
}
}
}
}

View File

@ -1,102 +0,0 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http;
use App\Broadcasting\WeComRobotChannel;
use App\Models\WorkOrder\Reply;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
class WorkOrderNotification extends Notification implements ShouldQueue
{
use Queueable;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return [];
}
public function toGroup($notifiable)
{
$workOrder = $notifiable;
$reply = [];
if ($notifiable instanceof WorkOrder) {
$view = 'notifications.work_order.created';
$workOrder->load(['module', 'user']);
$module = $workOrder->module;
} elseif ($notifiable instanceof Reply) {
$view = 'notifications.work_order.reply';
$workOrder->load(['workOrder', 'user']);
$workOrder->workOrder->load('module');
$reply = $workOrder;
$workOrder = $workOrder->workOrder;
$module = $workOrder->module;
} else {
return;
}
// 取消隐藏字段
$module->makeVisible(['wecom_key']);
if ($module->wecom_key == null) {
$wecom_key = config('settings.wecom.robot_hook.default');
} else {
$wecom_key = $module->wecom_key;
}
// 隐藏字段
$module->makeHidden(['wecom_key']);
$resp = Http::post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' . $wecom_key, [
'msgtype' => 'markdown',
'markdown' => [
'content' => view($view, [
'workOrder' => $workOrder,
'user' => $workOrder->user,
'reply' => $reply,
'module' => $module,
])->render(),
],
]);
if (!$resp->successful()) {
Log::error('企业微信机器人发送失败', [
'resp' => $resp->json(),
'workOrder' => $workOrder,
'reply' => $reply,
'module' => $module,
]);
}
}
}

View File

@ -1,68 +0,0 @@
<?php
namespace App\Observers;
use App\Models\User\Balance;
use App\Notifications\UserBalanceNotification;
class BalanceObserve
{
/**
* Handle the Balance "created" event.
*
* @param \App\Models\User\Balance $balance
* @return void
*/
public function created(Balance $balance)
{
//
return (new UserBalanceNotification())
->toGroup($balance);
}
/**
* Handle the Balance "updated" event.
*
* @param \App\Models\User\Balance $balance
* @return void
*/
public function updated(Balance $balance)
{
//
return (new UserBalanceNotification())
->toGroup($balance);
}
/**
* Handle the Balance "deleted" event.
*
* @param \App\Models\User\Balance $balance
* @return void
*/
public function deleted(Balance $balance)
{
//
}
/**
* Handle the Balance "restored" event.
*
* @param \App\Models\User\Balance $balance
* @return void
*/
public function restored(Balance $balance)
{
//
}
/**
* Handle the Balance "force deleted" event.
*
* @param \App\Models\User\Balance $balance
* @return void
*/
public function forceDeleted(Balance $balance)
{
//
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace App\Observers\WorkOrder;
use App\Models\WorkOrder\Reply;
use App\Notifications\WorkOrderNotification;
class ReplyObserver
{
/**
* Handle the Reply "created" event.
*
* @param \App\Models\WorkOrder\Reply $reply
* @return void
*/
public function created(Reply $reply)
{
//
return (new WorkOrderNotification())
->toGroup($reply);
}
/**
* Handle the Reply "updated" event.
*
* @param \App\Models\WorkOrder\Reply $reply
* @return void
*/
public function updated(Reply $reply)
{
//
}
/**
* Handle the Reply "deleted" event.
*
* @param \App\Models\WorkOrder\Reply $reply
* @return void
*/
public function deleted(Reply $reply)
{
//
}
/**
* Handle the Reply "restored" event.
*
* @param \App\Models\WorkOrder\Reply $reply
* @return void
*/
public function restored(Reply $reply)
{
//
}
/**
* Handle the Reply "force deleted" event.
*
* @param \App\Models\WorkOrder\Reply $reply
* @return void
*/
public function forceDeleted(Reply $reply)
{
//
}
}

View File

@ -1,71 +0,0 @@
<?php
namespace App\Observers\WorkOrder;
use App\Models\WorkOrder\WorkOrder;
use App\Notifications\WorkOrderNotification;
use Illuminate\Support\Facades\Log;
class WorkOrderObserver
{
/**
* Handle the WorkOrder "created" event.
*
* @param \App\Models\WorkOrder\WorkOrder $workOrder
* @return void
*/
public function created(WorkOrder $workOrder)
{
//
return (new WorkOrderNotification())
->toGroup($workOrder);
}
/**
* Handle the WorkOrder "updated" event.
*
* @param \App\Models\WorkOrder\WorkOrder $workOrder
* @return void
*/
public function updated(WorkOrder $workOrder)
{
Log::debug('workOrder updated', ['workOrder' => $workOrder]);
//
return (new WorkOrderNotification())
->toGroup($workOrder);
}
/**
* Handle the WorkOrder "deleted" event.
*
* @param \App\Models\WorkOrder\WorkOrder $workOrder
* @return void
*/
public function deleted(WorkOrder $workOrder)
{
//
}
/**
* Handle the WorkOrder "restored" event.
*
* @param \App\Models\WorkOrder\WorkOrder $workOrder
* @return void
*/
public function restored(WorkOrder $workOrder)
{
//
}
/**
* Handle the WorkOrder "force deleted" event.
*
* @param \App\Models\WorkOrder\WorkOrder $workOrder
* @return void
*/
public function forceDeleted(WorkOrder $workOrder)
{
//
}
}

View File

@ -3,10 +3,8 @@
namespace App\Providers;
use Illuminate\Support\Facades\Http;
// use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
@ -17,26 +15,17 @@ class AppServiceProvider extends ServiceProvider
public function register()
{
//
require_once app()->basePath('app') . '/Helpers.php';
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->generateInstanceId();
// $this->app->make(\Illuminate\Notifications\ChannelManager::class)->extend('your-channel', function () {
// return $this->app->make(App\Channels\YourChannel::class);
// });
//
// header('server: Cluster Ready!');
// header('x-powered-by: LaeCloud');
// header('x-for-you: Code is Poetry.');
Http::macro('remote', function ($api_token, $url) {
// 关闭证书验证
return Http::withoutVerifying()->withHeaders([
@ -46,62 +35,5 @@ public function boot()
'version' => 2,
])->baseUrl($url);
});
// $wechat_pay_config = [
// 'mch_id' => config('payment.wepay.mch_id'),
// // 商户证书
// 'private_key' => __DIR__ . '/certs/apiclient_key.pem',
// 'certificate' => __DIR__ . '/certs/apiclient_cert.pem',
// // v3 API 秘钥
// 'secret_key' =>
// config('payment.wepay.v3_secret_key'),
// // v2 API 秘钥
// 'v2_secret_key' => config('payment.wepay.v2_secret_key'),
// // 平台证书:微信支付 APIv3 平台证书,需要使用工具下载
// // 下载工具https://github.com/wechatpay-apiv3/CertificateDownloader
// 'platform_certs' => [
// // '/path/to/wechatpay/cert.pem',
// ],
// /**
// * 接口请求相关配置,超时时间等,具体可用参数请参考:
// * https://github.com/symfony/symfony/blob/5.3/src/Symfony/Contracts/HttpClient/HttpClientInterface.php
// */
// 'http' => [
// 'throw' => true, // 状态码非 200、300 时是否抛出异常,默认为开启
// 'timeout' => 5.0,
// ],
// ];
// $app = new WePay($wechat_pay_config);
// // mount app to global
// app()->instance('wepay', $app);
}
public function generateInstanceId()
{
if (config('app.instance_id') == null) {
$instance_id = uniqid();
// 获取 .env 目录
$env_path = dirname(__DIR__) . '/../.env';
// 追加到 .env 文件
file_put_contents($env_path, PHP_EOL . "INSTANCE_ID={$instance_id}", FILE_APPEND);
// 重新加载配置
config(['app.instance_id' => $instance_id]);
// $env = file_get_contents(app()->environmentFilePath());
// $env = preg_replace('/INSTANCE_ID=(.*)/', 'INSTANCE_ID=' . $instance_id, $env);
// file_put_contents(app()->environmentFilePath(), $env);
}
}
}

View File

@ -2,81 +2,29 @@
namespace App\Providers;
use App\Models\AccessToken;
use App\Models\Module\Module;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
// use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* Register any application services.
* The model to policy mappings for the application.
*
* @return void
* @var array<class-string, class-string>
*/
public function register()
{
//
}
protected $policies = [
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
* Boot the authentication services for the application.
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
// Here you may define how you wish users to be authenticated for your Lumen
// application. The callback which receives the incoming request instance
// should return either a User instance or null. You're free to obtain
// the User instance via an API token or any other method necessary.
$this->registerPolicies();
// api guard and remote
$this->app['auth']->viaRequest('api', function ($request) {
// if ($request->input('api_token')) {
// return AccessToken::where('token', $request->input('api_token'))->with('user')->first()->user ?? null;
// }
// bearerToken
$bearerToken = $request->bearerToken();
if ($bearerToken) {
return Cache::remember('api_token_' . $bearerToken, 60, function () use ($bearerToken) {
return AccessToken::where('token', $bearerToken)->with('user')->first()->user ?? null;
});
} else {
return null;
}
// if ($request->input('api_token')) {
// return User::where('api_token', $request->input('api_token'))->first();
// }
});
$this->app['auth']->viaRequest('remote', function ($request) {
// if ($request->input('api_token')) {
// return Module::where('api_token', $request->input('api_token'))->first();
// }
// bearerToken
$bearerToken = $request->bearerToken();
if ($bearerToken) {
return Cache::remember('remote_api_token_' . $bearerToken, 60, function () use ($bearerToken) {
return Module::where('token', $bearerToken)->first() ?? null;
});
} else {
return null;
}
// if ($request->input('api_token')) {
// return User::where('api_token', $request->input('api_token'))->first();
// }
});
//
}
}

View File

@ -2,12 +2,20 @@
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}

View File

@ -2,21 +2,33 @@
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
* The event to listener mappings for the application.
*
* @var array
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
// \App\Events\WorkOrderProcessed::class => [
// \App\Listeners\SendWorkOrderNotification::class,
// ],
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
//
}
/**
* Determine if events and listeners should be automatically discovered.
*
@ -26,12 +38,4 @@ public function shouldDiscoverEvents()
{
return false;
}
public function boot() {
parent::boot();
\App\Models\WorkOrder\WorkOrder::observe(\App\Observers\WorkOrder\WorkOrderObserver::class);
\App\Models\WorkOrder\Reply::observe(\App\Observers\WorkOrder\ReplyObserver::class);
\App\Models\User\Balance::observe(\App\Observers\BalanceObserve::class);
}
}

View File

@ -1,37 +0,0 @@
<?php
namespace App\Providers;
use mmghv\LumenRouteBinding\RouteBindingServiceProvider as BaseServiceProvider;
class RouteBindingServiceProvider extends BaseServiceProvider
{
/**
* Boot the service provider
*/
public function boot()
{
// The binder instance
$binder = $this->binder;
$binder->implicitBind('App\Models');
$binder->implicitBind('App\Models\Module');
$binder->implicitBind('App\Models\Admin');
$binder->implicitBind('App\Models\Server');
$binder->implicitBind('App\Models\User');
$binder->implicitBind('App\Models\WorkOrder');
// Here we define our bindings
// $binder->bind('user', 'App\Models\User');
// $binder->bind(
// 'module',
// 'App\Models\Module\Module'
// );
// $binder->bind(
// 'workOrder',
// 'App\Models\WorkOrder\WorkOrder'
// );
// $binder->bind('reply', 'App\Models\WorkOrder\Reply');
// $binder->bind('task', 'App\Models\');
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
// public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware(['api', 'auth:sanctum'])
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}

38
artisan
View File

@ -1,21 +1,23 @@
#!/usr/bin/env php
<?php
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Create The Application
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| First we need to get an application instance. This creates an instance
| of the application / container and bootstraps the application so it
| is ready to receive HTTP / Console requests from the environment.
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any of our classes manually. It's great to relax.
|
*/
$app = require __DIR__.'/bootstrap/app.php';
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
@ -28,8 +30,24 @@ $app = require __DIR__.'/bootstrap/app.php';
|
*/
$kernel = $app->make(
'Illuminate\Contracts\Console\Kernel'
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
exit($kernel->handle(new ArgvInput, new ConsoleOutput));
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);

View File

@ -1,26 +0,0 @@
#!/usr/bin/env bash
WORK_DIR=$1
if [ ! -n "${WORK_DIR}" ] ;then
WORK_DIR="."
fi
echo "Restarting LaravelS..."
./bin/laravels restart -d -i
echo "Starting fswatch..."
LOCKING=0
fswatch -e ".*" -i "\\.php$" -r ${WORK_DIR} | while read file
do
if [[ ! ${file} =~ .php$ ]] ;then
continue
fi
if [ ${LOCKING} -eq 1 ] ;then
echo "Reloading, skipped."
continue
fi
echo "File ${file} has been modified."
LOCKING=1
./bin/laravels reload
LOCKING=0
done
exit 0

Some files were not shown because too many files have changed in this diff Show More